ngwr 10.2.1 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +39 -19
  2. package/action-sheet/styles/_index.scss +4 -1
  3. package/anchor/styles/_index.scss +6 -5
  4. package/back-top/styles/_index.scss +6 -1
  5. package/blur-text/styles/_index.scss +13 -0
  6. package/button/styles/_index.scss +11 -6
  7. package/calendar/styles/_index.scss +11 -2
  8. package/carousel/styles/_index.scss +13 -2
  9. package/cascader/styles/_index.scss +5 -3
  10. package/circular-text/styles/_index.scss +2 -0
  11. package/collapse/styles/_index.scss +1 -1
  12. package/color-picker/styles/_index.scss +6 -1
  13. package/command-palette/styles/_index.scss +2 -1
  14. package/compare/styles/_index.scss +1 -2
  15. package/context-menu/styles/_index.scss +8 -2
  16. package/descriptions/styles/_index.scss +2 -2
  17. package/dialog/styles/_index.scss +7 -0
  18. package/drawer/styles/_index.scss +20 -1
  19. package/dropdown/styles/_index.scss +19 -5
  20. package/empty/styles/_index.scss +10 -0
  21. package/falling-text/styles/_index.scss +2 -1
  22. package/fesm2022/ngwr-action-sheet.mjs +13 -3
  23. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  24. package/fesm2022/ngwr-affix.mjs +40 -13
  25. package/fesm2022/ngwr-affix.mjs.map +1 -1
  26. package/fesm2022/ngwr-anchor.mjs +18 -6
  27. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  28. package/fesm2022/ngwr-aurora.mjs +2 -2
  29. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  30. package/fesm2022/ngwr-avatar.mjs +31 -7
  31. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  32. package/fesm2022/ngwr-back-top.mjs +6 -2
  33. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  34. package/fesm2022/ngwr-badge.mjs +1 -1
  35. package/fesm2022/ngwr-badge.mjs.map +1 -1
  36. package/fesm2022/ngwr-bar-chart.mjs +30 -9
  37. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  38. package/fesm2022/ngwr-blur-text.mjs +2 -2
  39. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  40. package/fesm2022/ngwr-border-glow.mjs +2 -2
  41. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  42. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  43. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  44. package/fesm2022/ngwr-burger.mjs +9 -4
  45. package/fesm2022/ngwr-burger.mjs.map +1 -1
  46. package/fesm2022/ngwr-button-testing.mjs +96 -0
  47. package/fesm2022/ngwr-button-testing.mjs.map +1 -0
  48. package/fesm2022/ngwr-button.mjs +31 -14
  49. package/fesm2022/ngwr-button.mjs.map +1 -1
  50. package/fesm2022/ngwr-calendar-heatmap.mjs +40 -8
  51. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  52. package/fesm2022/ngwr-calendar.mjs +20 -1
  53. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  54. package/fesm2022/ngwr-card.mjs +2 -2
  55. package/fesm2022/ngwr-card.mjs.map +1 -1
  56. package/fesm2022/ngwr-carousel-testing.mjs +377 -0
  57. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -0
  58. package/fesm2022/ngwr-carousel.mjs +67 -13
  59. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  60. package/fesm2022/ngwr-cascader-testing.mjs +534 -0
  61. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -0
  62. package/fesm2022/ngwr-cascader.mjs +2 -2
  63. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  64. package/fesm2022/ngwr-checkbox-testing.mjs +90 -0
  65. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -0
  66. package/fesm2022/ngwr-checkbox.mjs +9 -3
  67. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  68. package/fesm2022/ngwr-circular-text.mjs +2 -2
  69. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  70. package/fesm2022/ngwr-click-spark.mjs +2 -2
  71. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  72. package/fesm2022/ngwr-collapse-testing.mjs +368 -0
  73. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -0
  74. package/fesm2022/ngwr-color-picker.mjs +134 -14
  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 +58 -8
  79. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  80. package/fesm2022/ngwr-compare.mjs +103 -13
  81. package/fesm2022/ngwr-compare.mjs.map +1 -1
  82. package/fesm2022/ngwr-config.mjs +106 -0
  83. package/fesm2022/ngwr-config.mjs.map +1 -0
  84. package/fesm2022/ngwr-context-menu-testing.mjs +631 -0
  85. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -0
  86. package/fesm2022/ngwr-context-menu.mjs +94 -8
  87. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  88. package/fesm2022/ngwr-cookie.mjs +5 -1
  89. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  90. package/fesm2022/ngwr-counter.mjs +11 -3
  91. package/fesm2022/ngwr-counter.mjs.map +1 -1
  92. package/fesm2022/ngwr-date-adapter-luxon.mjs +52 -4
  93. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +1 -1
  94. package/fesm2022/ngwr-date-adapter.mjs +54 -8
  95. package/fesm2022/ngwr-date-adapter.mjs.map +1 -1
  96. package/fesm2022/ngwr-date-picker-testing.mjs +766 -0
  97. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -0
  98. package/fesm2022/ngwr-date-picker.mjs +73 -3
  99. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  100. package/fesm2022/ngwr-decrypt-text.mjs +27 -9
  101. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  102. package/fesm2022/ngwr-dialog-testing.mjs +89 -0
  103. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -0
  104. package/fesm2022/ngwr-directives.mjs +36 -12
  105. package/fesm2022/ngwr-directives.mjs.map +1 -1
  106. package/fesm2022/ngwr-donut-chart.mjs +22 -5
  107. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  108. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  109. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  110. package/fesm2022/ngwr-drawer-testing.mjs +250 -0
  111. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -0
  112. package/fesm2022/ngwr-dropdown-testing.mjs +291 -0
  113. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -0
  114. package/fesm2022/ngwr-dropdown.mjs +10 -2
  115. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  116. package/fesm2022/ngwr-empty.mjs +24 -7
  117. package/fesm2022/ngwr-empty.mjs.map +1 -1
  118. package/fesm2022/ngwr-event-calendar.mjs +57 -10
  119. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  120. package/fesm2022/ngwr-falling-text.mjs +2 -2
  121. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  122. package/fesm2022/ngwr-file-upload-testing.mjs +332 -0
  123. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -0
  124. package/fesm2022/ngwr-form-testing.mjs +451 -0
  125. package/fesm2022/ngwr-form-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-form.mjs +19 -3
  127. package/fesm2022/ngwr-form.mjs.map +1 -1
  128. package/fesm2022/ngwr-fuzzy-text.mjs +9 -2
  129. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  130. package/fesm2022/ngwr-gauge.mjs +19 -5
  131. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  132. package/fesm2022/ngwr-glitch-text.mjs +2 -2
  133. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  134. package/fesm2022/ngwr-gradient-text.mjs +2 -2
  135. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  136. package/fesm2022/ngwr-i18n-en.mjs +50 -0
  137. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  138. package/fesm2022/ngwr-i18n-ru.mjs +48 -0
  139. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  140. package/fesm2022/ngwr-image-cropper.mjs +23 -0
  141. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  142. package/fesm2022/ngwr-input-number-testing.mjs +306 -0
  143. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -0
  144. package/fesm2022/ngwr-input-number.mjs +35 -3
  145. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  146. package/fesm2022/ngwr-input-otp-testing.mjs +419 -0
  147. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -0
  148. package/fesm2022/ngwr-input-otp.mjs +36 -5
  149. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  150. package/fesm2022/ngwr-input-testing.mjs +102 -0
  151. package/fesm2022/ngwr-input-testing.mjs.map +1 -0
  152. package/fesm2022/ngwr-input.mjs +47 -10
  153. package/fesm2022/ngwr-input.mjs.map +1 -1
  154. package/fesm2022/ngwr-knob.mjs +44 -8
  155. package/fesm2022/ngwr-knob.mjs.map +1 -1
  156. package/fesm2022/ngwr-layout.mjs +21 -5
  157. package/fesm2022/ngwr-layout.mjs.map +1 -1
  158. package/fesm2022/ngwr-lightbox.mjs +33 -6
  159. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  160. package/fesm2022/ngwr-line-chart.mjs +17 -4
  161. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  162. package/fesm2022/ngwr-list.mjs +2 -2
  163. package/fesm2022/ngwr-list.mjs.map +1 -1
  164. package/fesm2022/ngwr-loading-bar.mjs +2 -2
  165. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  166. package/fesm2022/ngwr-markdown-testing.mjs +516 -0
  167. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -0
  168. package/fesm2022/ngwr-markdown.mjs +1492 -0
  169. package/fesm2022/ngwr-markdown.mjs.map +1 -0
  170. package/fesm2022/ngwr-marquee.mjs +17 -6
  171. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  172. package/fesm2022/ngwr-mention-testing.mjs +513 -0
  173. package/fesm2022/ngwr-mention-testing.mjs.map +1 -0
  174. package/fesm2022/ngwr-mention.mjs +10 -1
  175. package/fesm2022/ngwr-mention.mjs.map +1 -1
  176. package/fesm2022/ngwr-meta.mjs +22 -7
  177. package/fesm2022/ngwr-meta.mjs.map +1 -1
  178. package/fesm2022/ngwr-meter-group.mjs +19 -5
  179. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  180. package/fesm2022/ngwr-overlay.mjs +41 -1
  181. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  182. package/fesm2022/ngwr-pagination-testing.mjs +389 -0
  183. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -0
  184. package/fesm2022/ngwr-pagination.mjs +14 -2
  185. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  186. package/fesm2022/ngwr-popconfirm-testing.mjs +309 -0
  187. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -0
  188. package/fesm2022/ngwr-popconfirm.mjs +95 -17
  189. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  190. package/fesm2022/ngwr-popover-testing.mjs +316 -0
  191. package/fesm2022/ngwr-popover-testing.mjs.map +1 -0
  192. package/fesm2022/ngwr-popover.mjs +21 -3
  193. package/fesm2022/ngwr-popover.mjs.map +1 -1
  194. package/fesm2022/ngwr-pull-to-refresh.mjs +17 -2
  195. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  196. package/fesm2022/ngwr-qr.mjs +13 -3
  197. package/fesm2022/ngwr-qr.mjs.map +1 -1
  198. package/fesm2022/ngwr-radio-testing.mjs +392 -0
  199. package/fesm2022/ngwr-radio-testing.mjs.map +1 -0
  200. package/fesm2022/ngwr-radio.mjs +10 -3
  201. package/fesm2022/ngwr-radio.mjs.map +1 -1
  202. package/fesm2022/ngwr-rating-testing.mjs +384 -0
  203. package/fesm2022/ngwr-rating-testing.mjs.map +1 -0
  204. package/fesm2022/ngwr-rating.mjs +37 -2
  205. package/fesm2022/ngwr-rating.mjs.map +1 -1
  206. package/fesm2022/ngwr-segmented-testing.mjs +512 -0
  207. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -0
  208. package/fesm2022/ngwr-select-testing.mjs +268 -0
  209. package/fesm2022/ngwr-select-testing.mjs.map +1 -0
  210. package/fesm2022/ngwr-select.mjs +87 -16
  211. package/fesm2022/ngwr-select.mjs.map +1 -1
  212. package/fesm2022/ngwr-shiny-text.mjs +2 -2
  213. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-sidebar.mjs +65 -12
  215. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  216. package/fesm2022/ngwr-slider-testing.mjs +478 -0
  217. package/fesm2022/ngwr-slider-testing.mjs.map +1 -0
  218. package/fesm2022/ngwr-slider.mjs +57 -13
  219. package/fesm2022/ngwr-slider.mjs.map +1 -1
  220. package/fesm2022/ngwr-sparkline.mjs +26 -6
  221. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  222. package/fesm2022/ngwr-speed-dial.mjs +37 -4
  223. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  224. package/fesm2022/ngwr-spinner.mjs +12 -3
  225. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  226. package/fesm2022/ngwr-splash-cursor.mjs +2 -2
  227. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  228. package/fesm2022/ngwr-split-text.mjs +2 -2
  229. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  230. package/fesm2022/ngwr-splitter.mjs +70 -9
  231. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  232. package/fesm2022/ngwr-spotlight-card.mjs +2 -2
  233. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  234. package/fesm2022/ngwr-star-border.mjs +2 -2
  235. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  236. package/fesm2022/ngwr-statistic.mjs +24 -7
  237. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  238. package/fesm2022/ngwr-stepper-testing.mjs +477 -0
  239. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -0
  240. package/fesm2022/ngwr-switch-testing.mjs +77 -0
  241. package/fesm2022/ngwr-switch-testing.mjs.map +1 -0
  242. package/fesm2022/ngwr-switch.mjs +9 -3
  243. package/fesm2022/ngwr-switch.mjs.map +1 -1
  244. package/fesm2022/ngwr-table-testing.mjs +580 -0
  245. package/fesm2022/ngwr-table-testing.mjs.map +1 -0
  246. package/fesm2022/ngwr-table.mjs +87 -14
  247. package/fesm2022/ngwr-table.mjs.map +1 -1
  248. package/fesm2022/ngwr-tabs-testing.mjs +617 -0
  249. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -0
  250. package/fesm2022/ngwr-tabs.mjs +38 -6
  251. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  252. package/fesm2022/ngwr-textarea-testing.mjs +238 -0
  253. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -0
  254. package/fesm2022/ngwr-textarea.mjs +32 -4
  255. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  256. package/fesm2022/ngwr-tilt-card.mjs +2 -2
  257. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  258. package/fesm2022/ngwr-toast-testing.mjs +101 -0
  259. package/fesm2022/ngwr-toast-testing.mjs.map +1 -0
  260. package/fesm2022/ngwr-toast.mjs +2 -2
  261. package/fesm2022/ngwr-toast.mjs.map +1 -1
  262. package/fesm2022/ngwr-tour.mjs +61 -9
  263. package/fesm2022/ngwr-tour.mjs.map +1 -1
  264. package/fesm2022/ngwr-transfer-testing.mjs +538 -0
  265. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -0
  266. package/fesm2022/ngwr-transfer.mjs +45 -14
  267. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  268. package/fesm2022/ngwr-tree-testing.mjs +734 -0
  269. package/fesm2022/ngwr-tree-testing.mjs.map +1 -0
  270. package/fesm2022/ngwr-tree.mjs +73 -7
  271. package/fesm2022/ngwr-tree.mjs.map +1 -1
  272. package/fesm2022/ngwr-typewriter.mjs +5 -3
  273. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  274. package/fesm2022/ngwr-version.mjs +1 -1
  275. package/fesm2022/ngwr-version.mjs.map +1 -1
  276. package/fesm2022/ngwr-virtual-scroll.mjs +31 -5
  277. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  278. package/fesm2022/ngwr-waves.mjs +3 -3
  279. package/fesm2022/ngwr-waves.mjs.map +1 -1
  280. package/fesm2022/ngwr-window.mjs +8 -0
  281. package/fesm2022/ngwr-window.mjs.map +1 -1
  282. package/file-upload/styles/_index.scss +7 -2
  283. package/gauge/styles/_index.scss +1 -1
  284. package/glitch-text/styles/_index.scss +4 -0
  285. package/i18n/en.json +48 -0
  286. package/i18n/ru.json +48 -0
  287. package/image-cropper/styles/_index.scss +13 -1
  288. package/input/styles/_index.scss +2 -2
  289. package/input-number/styles/_index.scss +7 -2
  290. package/knob/styles/_index.scss +8 -1
  291. package/layout/styles/_index.scss +3 -3
  292. package/lightbox/styles/_index.scss +10 -2
  293. package/line-chart/styles/_index.scss +6 -0
  294. package/llms-full.txt +151 -4
  295. package/llms.txt +57 -8
  296. package/loading-bar/styles/_index.scss +1 -2
  297. package/markdown/styles/_index.scss +296 -0
  298. package/marquee/styles/_index.scss +12 -0
  299. package/mcp/api.js +512 -0
  300. package/mcp/catalog.js +157 -0
  301. package/mcp/server.js +273 -0
  302. package/mcp/tools.js +366 -0
  303. package/meter-group/styles/_index.scss +1 -1
  304. package/package.json +186 -35
  305. package/pagination/styles/_index.scss +6 -6
  306. package/popover/styles/_index.scss +37 -5
  307. package/rating/styles/_index.scss +10 -0
  308. package/result/styles/_index.scss +3 -1
  309. package/schematics/use/symbol-map.json +2 -0
  310. package/segmented/styles/_index.scss +12 -1
  311. package/select/styles/_index.scss +32 -10
  312. package/sidebar/styles/_index.scss +30 -5
  313. package/slider/styles/_index.scss +15 -0
  314. package/speed-dial/styles/_index.scss +20 -0
  315. package/split-text/styles/_index.scss +13 -0
  316. package/star-border/styles/_index.scss +2 -0
  317. package/stepper/styles/_index.scss +19 -3
  318. package/styles/_grid.scss +4 -4
  319. package/styles.scss +1 -0
  320. package/switch/styles/_index.scss +5 -3
  321. package/table/styles/_index.scss +25 -12
  322. package/tabs/styles/_index.scss +11 -1
  323. package/textarea/styles/_index.scss +5 -0
  324. package/theme/styles/_colors.scss +44 -15
  325. package/theme/styles/_dark.scss +35 -15
  326. package/theme/styles/_mixins.scss +3 -0
  327. package/timeline/styles/_index.scss +2 -2
  328. package/toast/styles/_index.scss +17 -8
  329. package/toolbar/styles/_index.scss +3 -3
  330. package/tour/styles/_index.scss +7 -1
  331. package/tree/styles/_index.scss +9 -5
  332. package/types/ngwr-action-sheet.d.ts +9 -1
  333. package/types/ngwr-affix.d.ts +7 -1
  334. package/types/ngwr-anchor.d.ts +8 -1
  335. package/types/ngwr-avatar.d.ts +13 -3
  336. package/types/ngwr-bar-chart.d.ts +16 -0
  337. package/types/ngwr-burger.d.ts +6 -2
  338. package/types/ngwr-button-testing.d.ts +85 -0
  339. package/types/ngwr-button.d.ts +26 -10
  340. package/types/ngwr-calendar-heatmap.d.ts +16 -2
  341. package/types/ngwr-calendar.d.ts +10 -0
  342. package/types/ngwr-carousel-testing.d.ts +257 -0
  343. package/types/ngwr-carousel.d.ts +20 -4
  344. package/types/ngwr-cascader-testing.d.ts +392 -0
  345. package/types/ngwr-checkbox-testing.d.ts +77 -0
  346. package/types/ngwr-checkbox.d.ts +7 -2
  347. package/types/ngwr-collapse-testing.d.ts +290 -0
  348. package/types/ngwr-color-picker.d.ts +20 -11
  349. package/types/ngwr-command-palette-testing.d.ts +437 -0
  350. package/types/ngwr-command-palette.d.ts +25 -2
  351. package/types/ngwr-compare.d.ts +50 -2
  352. package/types/ngwr-config.d.ts +176 -0
  353. package/types/ngwr-context-menu-testing.d.ts +401 -0
  354. package/types/ngwr-context-menu.d.ts +65 -17
  355. package/types/ngwr-counter.d.ts +6 -1
  356. package/types/ngwr-date-adapter-luxon.d.ts +26 -0
  357. package/types/ngwr-date-picker-testing.d.ts +518 -0
  358. package/types/ngwr-date-picker.d.ts +4 -0
  359. package/types/ngwr-dialog-testing.d.ts +79 -0
  360. package/types/ngwr-directives.d.ts +10 -1
  361. package/types/ngwr-donut-chart.d.ts +8 -1
  362. package/types/ngwr-drawer-testing.d.ts +196 -0
  363. package/types/ngwr-dropdown-testing.d.ts +202 -0
  364. package/types/ngwr-dropdown.d.ts +7 -1
  365. package/types/ngwr-empty.d.ts +19 -4
  366. package/types/ngwr-event-calendar.d.ts +26 -1
  367. package/types/ngwr-file-upload-testing.d.ts +194 -0
  368. package/types/ngwr-form-testing.d.ts +379 -0
  369. package/types/ngwr-form.d.ts +17 -0
  370. package/types/ngwr-gauge.d.ts +13 -1
  371. package/types/ngwr-image-cropper.d.ts +10 -0
  372. package/types/ngwr-input-number-testing.d.ts +226 -0
  373. package/types/ngwr-input-number.d.ts +29 -1
  374. package/types/ngwr-input-otp-testing.d.ts +299 -0
  375. package/types/ngwr-input-otp.d.ts +23 -2
  376. package/types/ngwr-input-testing.d.ts +84 -0
  377. package/types/ngwr-input.d.ts +20 -6
  378. package/types/ngwr-knob.d.ts +18 -0
  379. package/types/ngwr-layout.d.ts +1 -0
  380. package/types/ngwr-lightbox.d.ts +17 -3
  381. package/types/ngwr-line-chart.d.ts +9 -2
  382. package/types/ngwr-markdown-testing.d.ts +462 -0
  383. package/types/ngwr-markdown.d.ts +534 -0
  384. package/types/ngwr-marquee.d.ts +12 -2
  385. package/types/ngwr-mention-testing.d.ts +359 -0
  386. package/types/ngwr-meta.d.ts +4 -2
  387. package/types/ngwr-meter-group.d.ts +11 -1
  388. package/types/ngwr-overlay.d.ts +33 -2
  389. package/types/ngwr-pagination-testing.d.ts +291 -0
  390. package/types/ngwr-pagination.d.ts +1 -0
  391. package/types/ngwr-popconfirm-testing.d.ts +235 -0
  392. package/types/ngwr-popconfirm.d.ts +31 -21
  393. package/types/ngwr-popover-testing.d.ts +221 -0
  394. package/types/ngwr-popover.d.ts +9 -0
  395. package/types/ngwr-pull-to-refresh.d.ts +7 -0
  396. package/types/ngwr-qr.d.ts +9 -1
  397. package/types/ngwr-radio-testing.d.ts +296 -0
  398. package/types/ngwr-radio.d.ts +8 -2
  399. package/types/ngwr-rating-testing.d.ts +291 -0
  400. package/types/ngwr-rating.d.ts +23 -0
  401. package/types/ngwr-segmented-testing.d.ts +401 -0
  402. package/types/ngwr-select-testing.d.ts +175 -0
  403. package/types/ngwr-select.d.ts +45 -4
  404. package/types/ngwr-sidebar.d.ts +17 -2
  405. package/types/ngwr-slider-testing.d.ts +329 -0
  406. package/types/ngwr-slider.d.ts +35 -1
  407. package/types/ngwr-sparkline.d.ts +12 -2
  408. package/types/ngwr-speed-dial.d.ts +17 -18
  409. package/types/ngwr-spinner.d.ts +8 -1
  410. package/types/ngwr-splitter.d.ts +24 -1
  411. package/types/ngwr-statistic.d.ts +12 -2
  412. package/types/ngwr-stepper-testing.d.ts +346 -0
  413. package/types/ngwr-switch-testing.d.ts +66 -0
  414. package/types/ngwr-switch.d.ts +7 -2
  415. package/types/ngwr-table-testing.d.ts +423 -0
  416. package/types/ngwr-table.d.ts +42 -0
  417. package/types/ngwr-tabs-testing.d.ts +470 -0
  418. package/types/ngwr-tabs.d.ts +9 -0
  419. package/types/ngwr-textarea-testing.d.ts +184 -0
  420. package/types/ngwr-textarea.d.ts +7 -2
  421. package/types/ngwr-toast-testing.d.ts +80 -0
  422. package/types/ngwr-tour.d.ts +27 -0
  423. package/types/ngwr-transfer-testing.d.ts +444 -0
  424. package/types/ngwr-transfer.d.ts +16 -1
  425. package/types/ngwr-tree-testing.d.ts +501 -0
  426. package/types/ngwr-tree.d.ts +33 -0
  427. package/types/ngwr-version.d.ts +1 -1
  428. package/types/ngwr-virtual-scroll.d.ts +13 -1
  429. package/typewriter/styles/_index.scss +1 -1
  430. package/typography/styles/_index.scss +1 -1
  431. package/window/styles/_index.scss +32 -9
@@ -0,0 +1,401 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+ import { WrSegmentedSize } from 'ngwr/segmented';
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-segmented>` a harness query matches. */
12
+ interface WrSegmentedHarnessFilters extends BaseHarnessFilters {
13
+ /**
14
+ * Match the control's accessible name — a string is an exact match, a RegExp is
15
+ * tested. The component ships no label input, so this is whatever the consumer
16
+ * wired with `aria-label` / `aria-labelledby`, and it is the only thing that
17
+ * tells two segmented controls on one page apart.
18
+ */
19
+ readonly label?: string | RegExp;
20
+ /** Match only the rendered size — `'md'` matches a control carrying no size modifier. */
21
+ readonly size?: WrSegmentedSize;
22
+ /** Match only controls disabled as a whole (`true`) or the rest (`false`). */
23
+ readonly disabled?: boolean;
24
+ }
25
+ /** Narrows which segment of a `<wr-segmented>` a harness query matches. */
26
+ interface WrSegmentedOptionHarnessFilters extends BaseHarnessFilters {
27
+ /**
28
+ * Match the segment's accessible name — its visible label, or the `aria-label`
29
+ * standing in for an icon-only one. A string is an exact match, a RegExp is
30
+ * tested; a segment with no name at all matches neither.
31
+ *
32
+ * There is deliberately no `value` filter: the option's `value` never reaches the
33
+ * DOM — see `WrSegmentedHarness`.
34
+ */
35
+ readonly label?: string | RegExp;
36
+ /** Match only the pressed segment (`true`) or only the others (`false`). */
37
+ readonly selected?: boolean;
38
+ /** Match only enabled (`false`) or only disabled (`true`) segments. */
39
+ readonly disabled?: boolean;
40
+ }
41
+
42
+ /**
43
+ * @license
44
+ *
45
+ * Use of this source code is governed by an MIT-style license that can be
46
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
47
+ */
48
+
49
+ /**
50
+ * Test harness for one segment of a `<wr-segmented>` — an option, not a control.
51
+ *
52
+ * A segment is a real `<button type="button">` carrying `aria-pressed`, so it is a
53
+ * TOGGLE BUTTON to a screen reader: it announces its own pressed state and its own
54
+ * name, and it is its own tab stop. That is why this exists as a harness of its own,
55
+ * and why the questions below are worth asking per segment rather than in bulk on
56
+ * `WrSegmentedHarness` — which is where the SELECTION lives.
57
+ *
58
+ * Three name-shaped methods, because a segment has three different names and only
59
+ * one of them is what a person hears:
60
+ *
61
+ * - {@link getText} — the visible label, `null` for an icon-only segment.
62
+ * - {@link getAccessibleName} — what is announced, `null` when nothing names it.
63
+ * - {@link getLabel} — the same, but it refuses to answer `null`, so a spec
64
+ * addressing segments by label fails where the mistake is rather than three
65
+ * lines later.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const segmented = await loader.getHarness(WrSegmentedHarness);
70
+ * const [, week] = await segmented.getOptions();
71
+ *
72
+ * await week.select();
73
+ * expect(await week.isSelected()).toBe(true);
74
+ * ```
75
+ *
76
+ * @see https://ngwr.dev/guides/testing
77
+ */
78
+ declare class WrSegmentedOptionHarness extends ComponentHarness {
79
+ /** The segment is a plain `<button>` — the BEM class is what identifies it. */
80
+ static hostSelector: string;
81
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
82
+ static with(options?: WrSegmentedOptionHarnessFilters): HarnessPredicate<WrSegmentedOptionHarness>;
83
+ private readonly labelText;
84
+ private readonly icon;
85
+ /**
86
+ * The visible label, or `null` for an icon-only segment.
87
+ *
88
+ * `null` rather than `''`: the label element is only rendered when the option
89
+ * carries a `label`, and "no text at all" and "an empty label" are different
90
+ * mistakes to be looking at.
91
+ */
92
+ getText(): Promise<string | null>;
93
+ /**
94
+ * The name a screen reader announces for this segment, or `null` when nothing
95
+ * names it.
96
+ *
97
+ * The component's own fallback chain, read back off the page: a labelled segment
98
+ * is named by its text and carries no `aria-label`; an icon-only one is named by
99
+ * `aria-label`, which the template fills from the option's `ariaLabel` or — as a
100
+ * last resort — from its stringified `value`.
101
+ *
102
+ * `null` is a finding, not a detail: an icon-only segment whose option supplied
103
+ * neither an `ariaLabel` nor a stringifiable value is announced as a bare unnamed
104
+ * button.
105
+ */
106
+ getAccessibleName(): Promise<string | null>;
107
+ /**
108
+ * The segment's accessible name, for addressing it — and a targeted failure when
109
+ * it has none.
110
+ *
111
+ * {@link getAccessibleName} is the same answer without the refusal; use that one
112
+ * when `null` is what a spec is checking for.
113
+ */
114
+ getLabel(): Promise<string>;
115
+ /**
116
+ * Whether this segment is the control's current answer.
117
+ *
118
+ * From `aria-pressed`, in preference to the `wr-segmented__option--selected`
119
+ * class: both are public and they move together, but the class only recolours the
120
+ * label while the attribute is the entire state a screen reader is given.
121
+ */
122
+ isSelected(): Promise<boolean>;
123
+ /**
124
+ * Whether the segment refuses selection — for either reason.
125
+ *
126
+ * The native `disabled` PROPERTY, which is what actually blocks activation. The
127
+ * option's own `disabled` and the whole control's land on it identically, and from
128
+ * outside they are the same thing: this segment cannot be picked. Ask
129
+ * `WrSegmentedHarness.isDisabled()` for which of the two it was.
130
+ */
131
+ isDisabled(): Promise<boolean>;
132
+ /** Whether the segment renders an icon beside (or instead of) its label. */
133
+ hasIcon(): Promise<boolean>;
134
+ /**
135
+ * The name of the segment's icon, or `null` when it renders none.
136
+ *
137
+ * From `data-icon`, which `<wr-icon>` reflects. The glyph itself is markup the
138
+ * icon registry writes into the element, and an UNREGISTERED name leaves that
139
+ * empty — so the attribute is the only place the wiring survives, and it is the
140
+ * one that tells "no icon asked for" from "icon asked for, never registered".
141
+ */
142
+ getIconName(): Promise<string | null>;
143
+ /**
144
+ * Pick this segment.
145
+ *
146
+ * A click, and deliberately not a keypress: activating a `<button>` from the
147
+ * keyboard is the BROWSER's default action for Enter / Space — the component
148
+ * implements no key handling of its own — and jsdom implements none of it either,
149
+ * so there is nothing here for a key to drive. A no-arg CDK click needs no
150
+ * layout, which is the other half of why this is the drivable path.
151
+ *
152
+ * Nothing happens when the segment is already selected (a segmented control has no
153
+ * untoggle), and nothing happens when it is disabled — but not for the reason the
154
+ * `pointer-events: none` on a whole disabled control suggests, which is CSS a unit
155
+ * test never applies. The CDK's own `click()` reads the native `disabled` PROPERTY
156
+ * and dispatches the mouse sequence WITHOUT the final `click` event, so on a
157
+ * disabled segment the component's handler is never reached at all (measured: zero
158
+ * click events). Either way the value does not move and this resolves quietly, so
159
+ * assert the result rather than assume it, or reach for
160
+ * `WrSegmentedHarness.select()`, which says which of the two it was.
161
+ */
162
+ select(): Promise<void>;
163
+ /** Move keyboard focus to the segment. Each segment is its own tab stop. */
164
+ focus(): Promise<void>;
165
+ /** Take focus off the segment. */
166
+ blur(): Promise<void>;
167
+ isFocused(): Promise<boolean>;
168
+ }
169
+
170
+ /**
171
+ * @license
172
+ *
173
+ * Use of this source code is governed by an MIT-style license that can be
174
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
175
+ */
176
+
177
+ /**
178
+ * Test harness for `<wr-segmented>` — the root of a two-class family with
179
+ * {@link WrSegmentedOptionHarness}.
180
+ *
181
+ * **What the control actually is**, because it decides everything below: not a
182
+ * `radiogroup`, not a `tablist` and not native radios. The host is a plain
183
+ * `role="group"` and each segment is a `<button aria-pressed>` — a row of toggle
184
+ * buttons over one value. Three consequences a spec has to know about:
185
+ *
186
+ * - The selection is `aria-pressed`, on exactly one segment. There is no
187
+ * `aria-checked`, no `aria-selected`, and no "2 of 3" position announced.
188
+ * - **There is no roving tab stop.** The component authors no `tabindex` and no
189
+ * arrow-key handler, so every enabled segment is its OWN tab stop —
190
+ * {@link getTabStopLabels} returns a list where a radiogroup or a tablist would
191
+ * have one entry. Focus and selection are therefore independent here:
192
+ * {@link getFocusedLabel} implies nothing about {@link getSelectedIndex}, and
193
+ * arrowing along the strip moves neither.
194
+ * - Activation is the browser's own default action on a button, which jsdom does not
195
+ * implement, so {@link select} clicks — see {@link WrSegmentedOptionHarness.select}.
196
+ *
197
+ * **There is deliberately no `getValue()` and no selection by value.** `options` is
198
+ * a bound array of `{ value, label, … }` and the value is a generic `T` the component
199
+ * writes nowhere — not on the host, not on a segment. The single exception is an
200
+ * accident rather than an addressing scheme: an icon-only option with no `ariaLabel`
201
+ * has its value stringified into the segment's `aria-label`, which for an object
202
+ * value reads `[object Object]`. So address segments by their label
203
+ * ({@link select}) or by position ({@link selectAt}), and assert the picked value on
204
+ * the host's own model — the only place it exists, and the assertion that would have
205
+ * caught the bug anyway.
206
+ *
207
+ * The sliding thumb is decoration (`aria-hidden`), and the four methods that mention
208
+ * it read what the component PUBLISHES for the stylesheet — two custom properties and
209
+ * two modifier classes — never painted geometry, which a DOM without layout does not
210
+ * have. {@link getThumbIndex} in particular is not the selection; it is the trap that
211
+ * method documents.
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * const range = await loader.getHarness(WrSegmentedHarness.with({ label: 'Range' }));
216
+ *
217
+ * expect(await range.getOptionLabels()).toEqual(['Day', 'Week', 'Month']);
218
+ * await range.select({ label: 'Week' });
219
+ * expect(await range.getSelectedIndex()).toBe(1);
220
+ * ```
221
+ *
222
+ * @see https://ngwr.dev/guides/testing
223
+ */
224
+ declare class WrSegmentedHarness extends ComponentHarness {
225
+ static hostSelector: string;
226
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
227
+ static with(options?: WrSegmentedHarnessFilters): HarnessPredicate<WrSegmentedHarness>;
228
+ /**
229
+ * The role the host announces — `group`.
230
+ *
231
+ * Worth pinning precisely because it is the weaker of the shapes this component
232
+ * could have had: a `group` of toggle buttons tells a screen reader that the
233
+ * segments belong together, and nothing more. Were this to become a `radiogroup` or
234
+ * a `tablist`, the keyboard contract would change with it (one tab stop, arrow keys
235
+ * moving the selection), and every spec written against {@link getTabStopLabels}
236
+ * would need to change too.
237
+ */
238
+ getRole(): Promise<string | null>;
239
+ /**
240
+ * The control's accessible name, resolved the way a screen reader resolves it: the
241
+ * text of every element `aria-labelledby` points at, and `aria-label` only when
242
+ * that named nothing. `null` when the consumer wired neither.
243
+ *
244
+ * The order is not interchangeable — `aria-labelledby` WINS in the accessible-name
245
+ * computation — so a control carrying both is announced by the heading it points at,
246
+ * and reporting the `aria-label` would describe a name nobody hears.
247
+ *
248
+ * The component ships no label input on purpose (the question is the consumer's own
249
+ * heading), so this is the only way to check that wiring held, and a `null` on a
250
+ * group of three unrelated-sounding buttons is a real finding.
251
+ */
252
+ getAccessibleName(): Promise<string | null>;
253
+ /** This control's own segments, in DOM order. A sibling control's are not here. */
254
+ getOptions(filters?: WrSegmentedOptionHarnessFilters): Promise<WrSegmentedOptionHarness[]>;
255
+ /**
256
+ * The accessible name of every segment, in DOM order — the visible labels, with an
257
+ * icon-only segment answering with the `aria-label` that stands in for its text.
258
+ *
259
+ * Throws when a segment has no name at all, rather than leaving a hole in the list:
260
+ * see {@link WrSegmentedOptionHarness.getLabel}.
261
+ */
262
+ getOptionLabels(): Promise<string[]>;
263
+ /** The pressed segment, or `null` when nothing is selected. */
264
+ getSelectedOption(): Promise<WrSegmentedOptionHarness | null>;
265
+ /**
266
+ * The accessible name of the pressed segment, or `null` when nothing is selected.
267
+ *
268
+ * `null` is also the answer for a bound value that matches no option — the control
269
+ * holds it, no segment is pressed, and the page shows an unanswered control. See
270
+ * {@link getThumbIndex}, which does NOT answer `null` in that state.
271
+ */
272
+ getSelectedLabel(): Promise<string | null>;
273
+ /**
274
+ * The position of the pressed segment, or `-1` when nothing is selected.
275
+ *
276
+ * Derived from `aria-pressed`, which is the selection. The other index on the page —
277
+ * the thumb's — is not; it clamps at 0 (see {@link getThumbIndex}).
278
+ */
279
+ getSelectedIndex(): Promise<number>;
280
+ /**
281
+ * Pick the first segment matching the filters — this is how the control's value
282
+ * changes.
283
+ *
284
+ * Throws when nothing matches, naming the segments that do exist, and throws again
285
+ * when the segment is still unpressed afterwards. That second failure has exactly
286
+ * two causes and reports both, because a click that quietly did nothing surfaces as
287
+ * an unrelated assertion three lines later.
288
+ */
289
+ select(filters: WrSegmentedOptionHarnessFilters): Promise<void>;
290
+ /**
291
+ * Pick the segment at a position, counting from zero — the addressing route for an
292
+ * icon-only strip, or for one whose labels a spec would rather not hard-code.
293
+ *
294
+ * Throws on an index outside the control, saying how many segments there are: an
295
+ * off-by-one that resolved to nothing would otherwise read as "the click did not
296
+ * take".
297
+ */
298
+ selectAt(index: number): Promise<void>;
299
+ /**
300
+ * Whether the control was disabled AS A WHOLE, from the `wr-segmented--disabled`
301
+ * modifier.
302
+ *
303
+ * Deliberately not "every segment is disabled": a control whose options each carry
304
+ * their own `disabled` looks identical to a user, and the modifier is the only thing
305
+ * on the page that tells the two apart. What actually blocks a click is the native
306
+ * `disabled` each button gets either way — ask a segment
307
+ * ({@link WrSegmentedOptionHarness.isDisabled}) for that.
308
+ */
309
+ isDisabled(): Promise<boolean>;
310
+ /**
311
+ * The rendered control size.
312
+ *
313
+ * `md` is the component's own default and earns NO modifier class, so a bare host
314
+ * IS `md` — the absence is the answer rather than a missing one. Read from the
315
+ * class instead of the input, which is also why this reports what was rendered:
316
+ * unlike the form controls, `<wr-segmented>` does not resolve its size through
317
+ * `provideWrConfig()`, so an app-wide default set there does not reach it and this
318
+ * will say so.
319
+ */
320
+ getSize(): Promise<WrSegmentedSize>;
321
+ /**
322
+ * The accessible name of every segment a Tab press can reach, in tab order.
323
+ *
324
+ * A LIST, not one label, and that is the shape worth pinning: the component authors
325
+ * no roving `tabindex`, so each enabled segment is its own tab stop and reaching the
326
+ * third one takes three Tabs. An all-disabled control is skipped over entirely and
327
+ * answers `[]`.
328
+ *
329
+ * Unnamed segments are reported as `(unnamed)` rather than throwing — a tab order is
330
+ * still a fact worth reading on a page that has that bug in it.
331
+ */
332
+ getTabStopLabels(): Promise<string[]>;
333
+ /**
334
+ * The accessible name of the segment that currently holds focus, or `null` when
335
+ * focus is elsewhere.
336
+ *
337
+ * Independent of the selection here — see the note on the class. Reported as
338
+ * `(unnamed)` for a segment with no name, for the reason
339
+ * {@link getTabStopLabels} gives.
340
+ */
341
+ getFocusedLabel(): Promise<string | null>;
342
+ /**
343
+ * The index the component publishes for the thumb, from the
344
+ * `--wr-segmented-thumb-index` custom property it sets inline.
345
+ *
346
+ * **Not the selection, and this is the difference that bites.** The property is
347
+ * `Math.max(0, selectedIndex)`, so a control holding a value that matches no option
348
+ * publishes `0` — the thumb parks under the FIRST segment and is hidden by
349
+ * {@link isThumbVisible} instead of being moved out of the way. A harness that read
350
+ * this to answer "which segment is selected" would report segment one for a control
351
+ * with no selection at all. {@link getSelectedIndex} is the selection.
352
+ *
353
+ * It is also not where the thumb IS: the stylesheet turns this into a `translateX`,
354
+ * and no measurement of that survives a DOM without layout. This is the input to
355
+ * that, which is the part a unit test can honestly check.
356
+ */
357
+ getThumbIndex(): Promise<number>;
358
+ /**
359
+ * The segment count the component publishes for the thumb, from
360
+ * `--wr-segmented-thumb-count` — the divisor the stylesheet computes the thumb's
361
+ * width with.
362
+ *
363
+ * Should always equal the number of segments, and the reason to ask is that nothing
364
+ * else notices when it does not: a count that fell out of step with the options
365
+ * leaves the thumb the wrong width and sliding to the wrong place, while every ARIA
366
+ * state on the page stays correct. It is clamped to a minimum of `1`, so an empty
367
+ * control reports `1` rather than dividing by zero.
368
+ */
369
+ getThumbCount(): Promise<number>;
370
+ /**
371
+ * Whether the thumb is being shown at all.
372
+ *
373
+ * Read from the ABSENCE of the `wr-segmented--unselected` modifier, which is the
374
+ * hook the stylesheet zeroes the thumb's opacity through. The computed opacity is
375
+ * not the answer here — a unit test applies no stylesheet — so the public modifier
376
+ * is the contract, and it is what tells "parked under segment one" from "hidden
377
+ * because nothing is selected".
378
+ */
379
+ isThumbVisible(): Promise<boolean>;
380
+ /**
381
+ * Whether the thumb will animate its next move, from the `wr-segmented--mounted`
382
+ * modifier that gates the transition.
383
+ *
384
+ * Not "the thumb is animating now": nothing about a running animation is visible to
385
+ * a unit test. What this pins is the deliberate asymmetry — the class is added in
386
+ * `afterNextRender`, so the FIRST snap to the initial value is instant and every
387
+ * user-driven move after it slides. Deferred work like that only lands once the
388
+ * fixture is stable, which every harness read already waits for.
389
+ */
390
+ isThumbTransitionEnabled(): Promise<boolean>;
391
+ /** Click a segment and turn a click that did nothing into a failure that says why. */
392
+ private pick;
393
+ /** Segment names for an error message, which must not throw on its way out. */
394
+ private describeOptions;
395
+ private describe;
396
+ /** One of the thumb's inline custom properties, as a number. */
397
+ private thumbVar;
398
+ }
399
+
400
+ export { WrSegmentedHarness, WrSegmentedOptionHarness };
401
+ export type { WrSegmentedHarnessFilters, WrSegmentedOptionHarnessFilters };
@@ -0,0 +1,175 @@
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
+ /** Narrows which `<wr-select>` a harness query matches. */
11
+ interface WrSelectHarnessFilters extends BaseHarnessFilters {
12
+ /**
13
+ * Match the trigger's visible text — the selected label, the chip labels
14
+ * joined by `', '`, or the placeholder when nothing is selected. A string is
15
+ * an exact match, a RegExp is tested.
16
+ */
17
+ readonly text?: string | RegExp;
18
+ /** Match only enabled (`false`) or only disabled (`true`) selects. */
19
+ readonly disabled?: boolean;
20
+ /** Match only open (`true`) or only closed (`false`) selects. */
21
+ readonly open?: boolean;
22
+ }
23
+ /** Narrows which option inside a select's panel a harness query matches. */
24
+ interface WrOptionHarnessFilters extends BaseHarnessFilters {
25
+ /** Match the option's label — a string is an exact match, a RegExp is tested. */
26
+ readonly text?: string | RegExp;
27
+ /** Match only selected (`true`) or only unselected (`false`) options. */
28
+ readonly selected?: boolean;
29
+ /** Match only enabled (`false`) or only disabled (`true`) options. */
30
+ readonly disabled?: boolean;
31
+ }
32
+
33
+ /**
34
+ * @license
35
+ *
36
+ * Use of this source code is governed by an MIT-style license that can be
37
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
38
+ */
39
+
40
+ /**
41
+ * Test harness for one option inside a `<wr-select>` panel.
42
+ *
43
+ * The selector is the CLASS, not the `wr-option` element: a select rendering a
44
+ * virtualized list emits plain `<div role="option" class="wr-option">` rows
45
+ * instead of components, and a spec should not have to care which one it got.
46
+ *
47
+ * @see https://ngwr.dev/guides/testing
48
+ */
49
+ declare class WrOptionHarness extends ComponentHarness {
50
+ /** The projected component and the virtualized row both carry this class. */
51
+ static hostSelector: string;
52
+ /** Build a predicate that narrows the query. */
53
+ static with(options?: WrOptionHarnessFilters): HarnessPredicate<WrOptionHarness>;
54
+ /** The option's label, trimmed. */
55
+ getText(): Promise<string>;
56
+ /** Whether the option is currently selected. */
57
+ isSelected(): Promise<boolean>;
58
+ /** Whether the option refuses selection. */
59
+ isDisabled(): Promise<boolean>;
60
+ /** Whether the option is the keyboard cursor target. */
61
+ isActive(): Promise<boolean>;
62
+ /**
63
+ * Whether a search query has filtered this option out.
64
+ *
65
+ * Filtered options stay in the DOM — registration order has to survive a
66
+ * query — and collapse via CSS, so a spec that counts options while a search
67
+ * is active gets them back unless it asks. `getOptions()` on the select
68
+ * harness already drops them.
69
+ */
70
+ isHidden(): Promise<boolean>;
71
+ /** Click the option. */
72
+ click(): Promise<void>;
73
+ }
74
+
75
+ /**
76
+ * @license
77
+ *
78
+ * Use of this source code is governed by an MIT-style license that can be
79
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
80
+ */
81
+
82
+ /**
83
+ * Test harness for `<wr-select>` — single, multi, tag and search modes.
84
+ *
85
+ * The panel is NOT inside the select: it is a template portal in the overlay
86
+ * container, a sibling of the whole app. So the options are reached through the
87
+ * document root, scoped by the `aria-controls` id the trigger already publishes
88
+ * — which is what keeps two selects on one page from reading each other's
89
+ * options.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const select = await loader.getHarness(WrSelectHarness);
94
+ *
95
+ * await select.open();
96
+ * await select.selectOption({ text: 'Medium' });
97
+ *
98
+ * expect(await select.getValueText()).toBe('Medium');
99
+ * ```
100
+ *
101
+ * @see https://ngwr.dev/guides/testing
102
+ */
103
+ declare class WrSelectHarness extends ComponentHarness {
104
+ static hostSelector: string;
105
+ /** Build a predicate that narrows the query. */
106
+ static with(options?: WrSelectHarnessFilters): HarnessPredicate<WrSelectHarness>;
107
+ /** Whether the panel is showing. */
108
+ isOpen(): Promise<boolean>;
109
+ /** Whether the select refuses interaction. */
110
+ isDisabled(): Promise<boolean>;
111
+ /** Whether the select takes more than one value (multi or tag mode). */
112
+ isMultiple(): Promise<boolean>;
113
+ /**
114
+ * What the trigger currently shows as the selection: the chip labels joined by
115
+ * `', '` in multi and tag modes, the label in single mode, the input's text in
116
+ * search mode, and `''` when nothing is selected (the placeholder is showing).
117
+ */
118
+ getValueText(): Promise<string>;
119
+ /** The placeholder, or `null` when a selection is hiding it. */
120
+ getPlaceholder(): Promise<string | null>;
121
+ /** The visible chip labels, in order. The `+N more` overflow chip is not one. */
122
+ getChipLabels(): Promise<string[]>;
123
+ /**
124
+ * Open the panel.
125
+ *
126
+ * Throws rather than resolving quietly when the panel does not appear, because
127
+ * the two reasons it would not are both worth failing on: a tag-mode select
128
+ * has no panel at all, and a searchable one with `minChars` opens on the query
129
+ * rather than on focus.
130
+ */
131
+ open(): Promise<void>;
132
+ /** Close the panel. A closed select is left alone. */
133
+ close(): Promise<void>;
134
+ /**
135
+ * The options currently offered, in DOM order.
136
+ *
137
+ * Filtered-out options are dropped: a client-side search leaves them in the
138
+ * DOM (registration order has to survive a query) and collapses them with CSS,
139
+ * so counting raw elements would answer with the unfiltered list.
140
+ */
141
+ getOptions(filters?: WrOptionHarnessFilters): Promise<WrOptionHarness[]>;
142
+ /** The labels of the options currently offered, in DOM order. */
143
+ getOptionLabels(): Promise<string[]>;
144
+ /** Open the panel if needed, then click the first option matching the filters. */
145
+ selectOption(filters: WrOptionHarnessFilters): Promise<void>;
146
+ /** Type into a search or tag select's input, replacing whatever is there. */
147
+ typeSearch(query: string): Promise<void>;
148
+ /** Click the clear (×) control. It only exists on a `clearable` select with a selection. */
149
+ clear(): Promise<void>;
150
+ /** Remove one chip by its label. */
151
+ removeChip(label: string): Promise<void>;
152
+ /** The "no results" message, or `null` when the panel is showing options. */
153
+ getNoResultsText(): Promise<string | null>;
154
+ /** Whether the panel is showing its async loading row. */
155
+ isLoading(): Promise<boolean>;
156
+ /** Move keyboard focus to the select. */
157
+ focus(): Promise<void>;
158
+ /** The text input of a search or tag select, or `null` for the button trigger. */
159
+ private searchInput;
160
+ /** One element inside THIS select's panel, or `null`. */
161
+ private inPanel;
162
+ /**
163
+ * A loader scoped to THIS select's panel.
164
+ *
165
+ * Scoped by the `aria-controls` id rather than by `.wr-select-panel`: the
166
+ * overlay container is shared, so a bare class query would happily return the
167
+ * options of a different select that happens to be open.
168
+ */
169
+ private panelLoader;
170
+ /** The id the trigger publishes as `aria-controls`, which the panel carries. */
171
+ private panelId;
172
+ }
173
+
174
+ export { WrOptionHarness, WrSelectHarness };
175
+ export type { WrOptionHarnessFilters, WrSelectHarnessFilters };
@@ -57,6 +57,14 @@ interface WrSelectOptionRegistration {
57
57
  * read it at call time once Angular has settled the projected content.
58
58
  */
59
59
  readonly getLabel: () => string;
60
+ /**
61
+ * The option's own element, when it has one. The keyboard cursor walks the
62
+ * registry, and registration order is CREATION order — projected children are
63
+ * created before the panel renders its own `[options]` rows — so without this
64
+ * the cursor moved in a different order from the one on screen. Optional: a
65
+ * registration that cannot supply an element simply keeps its place.
66
+ */
67
+ readonly host?: HTMLElement;
60
68
  }
61
69
  /**
62
70
  * Contract a `<wr-option>` uses to talk to its parent `<wr-select>`.
@@ -193,10 +201,24 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
193
201
  * @default false
194
202
  */
195
203
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
196
- /** Pill-shaped corners on the trigger. @default false */
197
- readonly rounded: _angular_core.InputSignalWithTransform<boolean, any>;
198
- /** Control size — shares the `--wr-control-*` contract. @default 'md' */
199
- readonly size: _angular_core.InputSignal<WrSelectSize>;
204
+ /**
205
+ * Pill-shaped corners on the trigger. Unset falls back to the `select.rounded`
206
+ * app default from `provideWrConfig()`; `[rounded]="false"` turns a configured
207
+ * `true` back off. @default false
208
+ */
209
+ readonly rounded: _angular_core.InputSignalWithTransform<boolean | null, BooleanInput>;
210
+ /**
211
+ * Control size — shares the `--wr-control-*` contract. Unset falls back to the
212
+ * `select.size` app default from `provideWrConfig()`. @default 'md'
213
+ */
214
+ readonly size: _angular_core.InputSignal<WrSelectSize | null>;
215
+ /** `rounded`, then the app config, then `false`. @internal */
216
+ protected readonly resolvedRounded: _angular_core.Signal<boolean>;
217
+ /**
218
+ * `size`, then the app config, then `md`. Read by the trigger's host classes AND
219
+ * by the overlay panel, which builds its size modifier separately.
220
+ */
221
+ protected readonly resolvedSize: _angular_core.Signal<"sm" | "md" | "lg">;
200
222
  /**
201
223
  * Present the option panel as a full-width bottom-sheet on small
202
224
  * viewports instead of an anchored dropdown. `undefined` follows the
@@ -406,6 +428,17 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
406
428
  protected readonly listboxId: string;
407
429
  /** Registered options (insertion order). Internal — distinct from the public `[options]` input. */
408
430
  private readonly registry;
431
+ /**
432
+ * The registry in DOM order — the list the keyboard cursor walks.
433
+ *
434
+ * `registry` is CREATION order, and projected `<wr-option>` children are created
435
+ * before the panel renders its own `[options]` rows, so with both in play the
436
+ * cursor moved in an order the eye could not follow: opening highlighted the
437
+ * third row on screen and ArrowDown went to the last. Value lookups keep reading
438
+ * `registry` — they do not care about order — and a registration with no element
439
+ * keeps its place, since the sort is stable.
440
+ */
441
+ protected readonly orderedRegistry: _angular_core.Signal<readonly WrSelectOptionRegistration[]>;
409
442
  /** Keyboard cursor index into `options`. -1 = none. */
410
443
  protected readonly activeIndex: _angular_core.WritableSignal<number>;
411
444
  /** Id of the active option (for `aria-activedescendant`). */
@@ -478,6 +511,14 @@ declare class WrSelect implements FormValueControl<unknown>, WrSelectContext {
478
511
  * Hides the noResults state when the panel has at least one visible row.
479
512
  */
480
513
  protected readonly visibleCount: _angular_core.Signal<number>;
514
+ /**
515
+ * Whether the panel may be open at all. `minChars` is documented as the
516
+ * "minimum query length before the panel OPENS", and nothing gated the open —
517
+ * so a picker with `[minChars]="3"` popped a panel on focus and showed an empty
518
+ * bordered box for the first two keystrokes (with the "no results" row itself
519
+ * gated on the same threshold, there was nothing in it to explain the box).
520
+ */
521
+ protected readonly meetsMinChars: _angular_core.Signal<boolean>;
481
522
  /** Search mode: show "no results" when the panel has nothing to offer. */
482
523
  protected readonly hasNoResults: _angular_core.Signal<boolean>;
483
524
  /** Search mode: is this option hidden by the current query? @internal */