ngwr 11.1.0 → 12.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 (481) hide show
  1. package/README.md +7 -7
  2. package/burger/styles/_index.scss +1 -1
  3. package/button/styles/_index.scss +2 -2
  4. package/calendar/styles/_index.scss +32 -12
  5. package/calendar-heatmap/styles/_index.scss +20 -0
  6. package/carousel/styles/_index.scss +23 -1
  7. package/cascader/styles/_index.scss +15 -3
  8. package/checkbox/styles/_index.scss +2 -2
  9. package/circular-text/styles/_index.scss +11 -0
  10. package/collapse/styles/_index.scss +2 -2
  11. package/color-picker/styles/_index.scss +3 -3
  12. package/command-palette/styles/_index.scss +12 -0
  13. package/compare/styles/_index.scss +18 -2
  14. package/context-menu/styles/_index.scss +21 -2
  15. package/date-picker/styles/_index.scss +5 -5
  16. package/descriptions/styles/_index.scss +1 -1
  17. package/drag-drop/styles/_index.scss +28 -1
  18. package/drawer/styles/_index.scss +37 -0
  19. package/dropdown/styles/_index.scss +2 -2
  20. package/event-calendar/styles/_index.scss +67 -10
  21. package/fesm2022/ngwr-action-sheet-testing.mjs +313 -0
  22. package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -0
  23. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  24. package/fesm2022/ngwr-affix.mjs +3 -3
  25. package/fesm2022/ngwr-alert.mjs +3 -3
  26. package/fesm2022/ngwr-anchor.mjs +3 -3
  27. package/fesm2022/ngwr-aurora.mjs +3 -3
  28. package/fesm2022/ngwr-avatar.mjs +3 -3
  29. package/fesm2022/ngwr-back-top.mjs +3 -3
  30. package/fesm2022/ngwr-badge.mjs +6 -6
  31. package/fesm2022/ngwr-bar-chart-testing.mjs +107 -0
  32. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -0
  33. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  34. package/fesm2022/ngwr-blur-text-testing.mjs +203 -0
  35. package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -0
  36. package/fesm2022/ngwr-blur-text.mjs +18 -4
  37. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  38. package/fesm2022/ngwr-border-glow-testing.mjs +325 -0
  39. package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -0
  40. package/fesm2022/ngwr-border-glow.mjs +4 -4
  41. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  42. package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
  43. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  44. package/fesm2022/ngwr-burger.mjs +3 -3
  45. package/fesm2022/ngwr-button.mjs +6 -6
  46. package/fesm2022/ngwr-calendar-heatmap-testing.mjs +95 -0
  47. package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -0
  48. package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
  49. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  50. package/fesm2022/ngwr-calendar-testing.mjs +368 -0
  51. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -0
  52. package/fesm2022/ngwr-calendar.mjs +228 -10
  53. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  54. package/fesm2022/ngwr-card.mjs +10 -10
  55. package/fesm2022/ngwr-card.mjs.map +1 -1
  56. package/fesm2022/ngwr-carousel.mjs +124 -24
  57. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  58. package/fesm2022/ngwr-cascader.mjs +60 -5
  59. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  60. package/fesm2022/ngwr-checkbox.mjs +14 -6
  61. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  62. package/fesm2022/ngwr-circular-text-testing.mjs +230 -0
  63. package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -0
  64. package/fesm2022/ngwr-circular-text.mjs +4 -4
  65. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  66. package/fesm2022/ngwr-click-spark.mjs +27 -7
  67. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  68. package/fesm2022/ngwr-clipboard.mjs +3 -3
  69. package/fesm2022/ngwr-collapse.mjs +9 -9
  70. package/fesm2022/ngwr-color-picker-testing.mjs +452 -0
  71. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -0
  72. package/fesm2022/ngwr-color-picker.mjs +126 -10
  73. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  74. package/fesm2022/ngwr-command-palette.mjs +14 -5
  75. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  76. package/fesm2022/ngwr-compare.mjs +3 -3
  77. package/fesm2022/ngwr-confetti.mjs +31 -6
  78. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  79. package/fesm2022/ngwr-config.mjs +9 -0
  80. package/fesm2022/ngwr-config.mjs.map +1 -1
  81. package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
  82. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  83. package/fesm2022/ngwr-context-menu.mjs +358 -48
  84. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  85. package/fesm2022/ngwr-cookie.mjs +3 -3
  86. package/fesm2022/ngwr-counter.mjs +25 -9
  87. package/fesm2022/ngwr-counter.mjs.map +1 -1
  88. package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
  89. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
  90. package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
  91. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
  92. package/fesm2022/ngwr-date-picker-testing.mjs +21 -85
  93. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  94. package/fesm2022/ngwr-date-picker.mjs +119 -37
  95. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  96. package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
  97. package/fesm2022/ngwr-date.mjs.map +1 -0
  98. package/fesm2022/ngwr-decrypt-text-testing.mjs +261 -0
  99. package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -0
  100. package/fesm2022/ngwr-decrypt-text.mjs +9 -4
  101. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  102. package/fesm2022/ngwr-density.mjs +6 -6
  103. package/fesm2022/ngwr-descriptions.mjs +6 -6
  104. package/fesm2022/ngwr-dialog.mjs +73 -18
  105. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  106. package/fesm2022/ngwr-directives.mjs +12 -12
  107. package/fesm2022/ngwr-divider.mjs +52 -5
  108. package/fesm2022/ngwr-divider.mjs.map +1 -1
  109. package/fesm2022/ngwr-donut-chart-testing.mjs +97 -0
  110. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -0
  111. package/fesm2022/ngwr-donut-chart.mjs +7 -7
  112. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  113. package/fesm2022/ngwr-drag-drop.mjs +160 -11
  114. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  115. package/fesm2022/ngwr-drawer.mjs +156 -64
  116. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  117. package/fesm2022/ngwr-dropdown.mjs +58 -12
  118. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  119. package/fesm2022/ngwr-empty.mjs +3 -3
  120. package/fesm2022/ngwr-event-calendar-testing.mjs +446 -0
  121. package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -0
  122. package/fesm2022/ngwr-event-calendar.mjs +66 -28
  123. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  124. package/fesm2022/ngwr-falling-text-testing.mjs +220 -0
  125. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -0
  126. package/fesm2022/ngwr-falling-text.mjs +75 -46
  127. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  128. package/fesm2022/ngwr-file-upload.mjs +3 -3
  129. package/fesm2022/ngwr-form.mjs +32 -15
  130. package/fesm2022/ngwr-form.mjs.map +1 -1
  131. package/fesm2022/ngwr-fuzzy-text-testing.mjs +134 -0
  132. package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -0
  133. package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
  134. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  135. package/fesm2022/ngwr-gauge-testing.mjs +86 -0
  136. package/fesm2022/ngwr-gauge-testing.mjs.map +1 -0
  137. package/fesm2022/ngwr-gauge.mjs +3 -3
  138. package/fesm2022/ngwr-glitch-text-testing.mjs +215 -0
  139. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -0
  140. package/fesm2022/ngwr-glitch-text.mjs +7 -7
  141. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  142. package/fesm2022/ngwr-gradient-text-testing.mjs +258 -0
  143. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -0
  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 +24 -9
  147. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  148. package/fesm2022/ngwr-i18n-en.mjs +87 -1
  149. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  150. package/fesm2022/ngwr-i18n-ru.mjs +69 -1
  151. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  152. package/fesm2022/ngwr-i18n.mjs +26 -15
  153. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  154. package/fesm2022/ngwr-icon.mjs +6 -6
  155. package/fesm2022/ngwr-image-cropper-testing.mjs +200 -0
  156. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -0
  157. package/fesm2022/ngwr-image-cropper.mjs +156 -11
  158. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  159. package/fesm2022/ngwr-input-number-testing.mjs +15 -10
  160. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  161. package/fesm2022/ngwr-input-number.mjs +89 -15
  162. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  163. package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
  164. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  165. package/fesm2022/ngwr-input-otp.mjs +24 -5
  166. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  167. package/fesm2022/ngwr-input.mjs +15 -15
  168. package/fesm2022/ngwr-keyboard.mjs +3 -3
  169. package/fesm2022/ngwr-knob-testing.mjs +220 -0
  170. package/fesm2022/ngwr-knob-testing.mjs.map +1 -0
  171. package/fesm2022/ngwr-knob.mjs +3 -3
  172. package/fesm2022/ngwr-layout.mjs +15 -15
  173. package/fesm2022/ngwr-lightbox-testing.mjs +223 -0
  174. package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -0
  175. package/fesm2022/ngwr-lightbox.mjs +11 -4
  176. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  177. package/fesm2022/ngwr-line-chart-testing.mjs +119 -0
  178. package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -0
  179. package/fesm2022/ngwr-line-chart.mjs +73 -26
  180. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  181. package/fesm2022/ngwr-list.mjs +7 -7
  182. package/fesm2022/ngwr-list.mjs.map +1 -1
  183. package/fesm2022/ngwr-loading-bar.mjs +7 -7
  184. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  185. package/fesm2022/ngwr-markdown.mjs +66 -8
  186. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  187. package/fesm2022/ngwr-marquee-testing.mjs +336 -0
  188. package/fesm2022/ngwr-marquee-testing.mjs.map +1 -0
  189. package/fesm2022/ngwr-marquee.mjs +4 -4
  190. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  191. package/fesm2022/ngwr-media.mjs +3 -3
  192. package/fesm2022/ngwr-mention.mjs +108 -13
  193. package/fesm2022/ngwr-mention.mjs.map +1 -1
  194. package/fesm2022/ngwr-meta.mjs +6 -6
  195. package/fesm2022/ngwr-meter-group-testing.mjs +100 -0
  196. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -0
  197. package/fesm2022/ngwr-meter-group.mjs +3 -3
  198. package/fesm2022/ngwr-overlay.mjs +34 -7
  199. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  200. package/fesm2022/ngwr-page-header.mjs +3 -3
  201. package/fesm2022/ngwr-pagination-testing.mjs +6 -6
  202. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  203. package/fesm2022/ngwr-pagination.mjs +17 -13
  204. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  205. package/fesm2022/ngwr-pipes.mjs +39 -26
  206. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  207. package/fesm2022/ngwr-platform.mjs +9 -9
  208. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  209. package/fesm2022/ngwr-popover-testing.mjs +7 -2
  210. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  211. package/fesm2022/ngwr-popover.mjs +169 -33
  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 +3 -3
  215. package/fesm2022/ngwr-qr.mjs +42 -5
  216. package/fesm2022/ngwr-qr.mjs.map +1 -1
  217. package/fesm2022/ngwr-radio.mjs +6 -6
  218. package/fesm2022/ngwr-rating.mjs +3 -3
  219. package/fesm2022/ngwr-result.mjs +21 -30
  220. package/fesm2022/ngwr-result.mjs.map +1 -1
  221. package/fesm2022/ngwr-rotating-text-testing.mjs +220 -0
  222. package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -0
  223. package/fesm2022/ngwr-rotating-text.mjs +4 -4
  224. package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
  225. package/fesm2022/ngwr-scroll.mjs +3 -3
  226. package/fesm2022/ngwr-segmented-testing.mjs +14 -1
  227. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  228. package/fesm2022/ngwr-segmented.mjs +29 -6
  229. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  230. package/fesm2022/ngwr-select.mjs +227 -43
  231. package/fesm2022/ngwr-select.mjs.map +1 -1
  232. package/fesm2022/ngwr-shiny-text-testing.mjs +237 -0
  233. package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -0
  234. package/fesm2022/ngwr-shiny-text.mjs +11 -9
  235. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  236. package/fesm2022/ngwr-sidebar.mjs +31 -16
  237. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  238. package/fesm2022/ngwr-skeleton.mjs +3 -3
  239. package/fesm2022/ngwr-slider.mjs +143 -14
  240. package/fesm2022/ngwr-slider.mjs.map +1 -1
  241. package/fesm2022/ngwr-sparkline-testing.mjs +76 -0
  242. package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -0
  243. package/fesm2022/ngwr-sparkline.mjs +3 -3
  244. package/fesm2022/ngwr-speed-dial-testing.mjs +281 -0
  245. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -0
  246. package/fesm2022/ngwr-speed-dial.mjs +27 -12
  247. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  248. package/fesm2022/ngwr-spinner.mjs +3 -3
  249. package/fesm2022/ngwr-splash-cursor-testing.mjs +89 -0
  250. package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -0
  251. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  252. package/fesm2022/ngwr-split-text-testing.mjs +224 -0
  253. package/fesm2022/ngwr-split-text-testing.mjs.map +1 -0
  254. package/fesm2022/ngwr-split-text.mjs +31 -5
  255. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  256. package/fesm2022/ngwr-splitter-testing.mjs +245 -0
  257. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -0
  258. package/fesm2022/ngwr-splitter.mjs +3 -3
  259. package/fesm2022/ngwr-spotlight-card-testing.mjs +368 -0
  260. package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -0
  261. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  262. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  263. package/fesm2022/ngwr-squircle.mjs +6 -6
  264. package/fesm2022/ngwr-star-border-testing.mjs +172 -0
  265. package/fesm2022/ngwr-star-border-testing.mjs.map +1 -0
  266. package/fesm2022/ngwr-star-border.mjs +4 -4
  267. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  268. package/fesm2022/ngwr-statistic.mjs +9 -9
  269. package/fesm2022/ngwr-stepper-testing.mjs +8 -8
  270. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  271. package/fesm2022/ngwr-stepper.mjs +33 -8
  272. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  273. package/fesm2022/ngwr-storage.mjs +17 -5
  274. package/fesm2022/ngwr-storage.mjs.map +1 -1
  275. package/fesm2022/ngwr-switch.mjs +3 -3
  276. package/fesm2022/ngwr-table.mjs +110 -40
  277. package/fesm2022/ngwr-table.mjs.map +1 -1
  278. package/fesm2022/ngwr-tabs-testing.mjs +11 -10
  279. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  280. package/fesm2022/ngwr-tabs.mjs +51 -11
  281. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  282. package/fesm2022/ngwr-textarea.mjs +3 -3
  283. package/fesm2022/ngwr-theme.mjs +181 -4
  284. package/fesm2022/ngwr-theme.mjs.map +1 -1
  285. package/fesm2022/ngwr-tilt-card-testing.mjs +190 -0
  286. package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -0
  287. package/fesm2022/ngwr-tilt-card.mjs +26 -8
  288. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  289. package/fesm2022/ngwr-timeline.mjs +6 -6
  290. package/fesm2022/ngwr-toast.mjs +44 -15
  291. package/fesm2022/ngwr-toast.mjs.map +1 -1
  292. package/fesm2022/ngwr-toolbar.mjs +3 -3
  293. package/fesm2022/ngwr-tour-testing.mjs +173 -0
  294. package/fesm2022/ngwr-tour-testing.mjs.map +1 -0
  295. package/fesm2022/ngwr-tour.mjs +34 -10
  296. package/fesm2022/ngwr-tour.mjs.map +1 -1
  297. package/fesm2022/ngwr-transfer.mjs +3 -3
  298. package/fesm2022/ngwr-tree.mjs +36 -11
  299. package/fesm2022/ngwr-tree.mjs.map +1 -1
  300. package/fesm2022/ngwr-typewriter-testing.mjs +242 -0
  301. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -0
  302. package/fesm2022/ngwr-typewriter.mjs +13 -5
  303. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  304. package/fesm2022/ngwr-typography.mjs +3 -3
  305. package/fesm2022/ngwr-utils.mjs +5 -2
  306. package/fesm2022/ngwr-utils.mjs.map +1 -1
  307. package/fesm2022/ngwr-version.mjs +1 -1
  308. package/fesm2022/ngwr-version.mjs.map +1 -1
  309. package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
  310. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  311. package/fesm2022/ngwr-waves-testing.mjs +128 -0
  312. package/fesm2022/ngwr-waves-testing.mjs.map +1 -0
  313. package/fesm2022/ngwr-waves.mjs +4 -4
  314. package/fesm2022/ngwr-waves.mjs.map +1 -1
  315. package/fesm2022/ngwr-window-testing.mjs +361 -0
  316. package/fesm2022/ngwr-window-testing.mjs.map +1 -0
  317. package/fesm2022/ngwr-window.mjs +175 -31
  318. package/fesm2022/ngwr-window.mjs.map +1 -1
  319. package/file-upload/styles/_index.scss +2 -2
  320. package/glitch-text/styles/_index.scss +27 -12
  321. package/i18n/en.json +71 -7
  322. package/i18n/ru.json +71 -7
  323. package/image-cropper/styles/_index.scss +19 -0
  324. package/input/styles/_index.scss +2 -2
  325. package/input-number/styles/_index.scss +2 -2
  326. package/input-otp/styles/_index.scss +9 -2
  327. package/knob/styles/_index.scss +1 -1
  328. package/lightbox/styles/_index.scss +16 -2
  329. package/line-chart/styles/_index.scss +28 -14
  330. package/list/styles/_index.scss +1 -1
  331. package/llms-full.txt +161 -19
  332. package/llms.txt +45 -10
  333. package/markdown/styles/_index.scss +3 -3
  334. package/mcp/api.js +6 -4
  335. package/mcp/catalog.js +40 -3
  336. package/mcp/providers.js +42 -0
  337. package/mcp/tools.js +22 -30
  338. package/meter-group/styles/_index.scss +1 -1
  339. package/overlay/styles/_index.scss +33 -1
  340. package/package.json +161 -12
  341. package/pagination/styles/_index.scss +23 -1
  342. package/popover/styles/_index.scss +16 -7
  343. package/progress/styles/_index.scss +1 -1
  344. package/radio/styles/_index.scss +2 -2
  345. package/rating/styles/_index.scss +1 -1
  346. package/schematics/collection.json +1 -1
  347. package/schematics/migrations/v12/index.js +65 -0
  348. package/schematics/migrations/v7/index.js +12 -1
  349. package/schematics/migrations/v8/index.js +10 -1
  350. package/schematics/migrations.json +5 -0
  351. package/schematics/ng-add/index.js +8 -3
  352. package/schematics/provider/index.js +80 -13
  353. package/schematics/use/index.js +9 -129
  354. package/schematics/use/rule.js +206 -0
  355. package/schematics/use/symbol-map.json +4 -4
  356. package/segmented/styles/_index.scss +14 -3
  357. package/select/styles/_index.scss +14 -2
  358. package/sidebar/styles/_index.scss +12 -10
  359. package/skills/ngwr/SKILL.md +117 -0
  360. package/skills/ngwr/references/catalog.md +212 -0
  361. package/skills/ngwr/references/setup.md +78 -0
  362. package/slider/styles/_index.scss +1 -1
  363. package/speed-dial/styles/_index.scss +1 -1
  364. package/stepper/styles/_index.scss +12 -3
  365. package/switch/styles/_index.scss +2 -2
  366. package/table/styles/_index.scss +61 -12
  367. package/tabs/styles/_index.scss +1 -1
  368. package/textarea/styles/_index.scss +1 -1
  369. package/theme/styles/_colors.scss +142 -56
  370. package/theme/styles/_dark.scss +46 -3
  371. package/theme/styles/_focus.scss +28 -5
  372. package/theme/styles/_mixins.scss +1 -1
  373. package/theme/styles/_variables.scss +67 -0
  374. package/transfer/styles/_index.scss +26 -3
  375. package/tree/styles/_index.scss +29 -6
  376. package/types/ngwr-action-sheet-testing.d.ts +260 -0
  377. package/types/ngwr-bar-chart-testing.d.ts +85 -0
  378. package/types/ngwr-blur-text-testing.d.ts +180 -0
  379. package/types/ngwr-blur-text.d.ts +20 -4
  380. package/types/ngwr-border-glow-testing.d.ts +219 -0
  381. package/types/ngwr-breadcrumbs.d.ts +17 -10
  382. package/types/ngwr-calendar-heatmap-testing.d.ts +79 -0
  383. package/types/ngwr-calendar-testing.d.ts +277 -0
  384. package/types/ngwr-calendar.d.ts +76 -0
  385. package/types/ngwr-carousel.d.ts +85 -6
  386. package/types/ngwr-cascader.d.ts +17 -0
  387. package/types/ngwr-checkbox.d.ts +13 -0
  388. package/types/ngwr-circular-text-testing.d.ts +196 -0
  389. package/types/ngwr-click-spark.d.ts +4 -0
  390. package/types/ngwr-color-picker-testing.d.ts +299 -0
  391. package/types/ngwr-color-picker.d.ts +34 -2
  392. package/types/ngwr-confetti.d.ts +8 -0
  393. package/types/ngwr-config.d.ts +10 -1
  394. package/types/ngwr-context-menu-testing.d.ts +24 -11
  395. package/types/ngwr-context-menu.d.ts +71 -1
  396. package/types/ngwr-counter.d.ts +1 -0
  397. package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
  398. package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
  399. package/types/ngwr-date-picker-testing.d.ts +17 -72
  400. package/types/ngwr-date-picker.d.ts +8 -4
  401. package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
  402. package/types/ngwr-decrypt-text-testing.d.ts +222 -0
  403. package/types/ngwr-dialog.d.ts +38 -1
  404. package/types/ngwr-divider.d.ts +25 -0
  405. package/types/ngwr-donut-chart-testing.d.ts +83 -0
  406. package/types/ngwr-donut-chart.d.ts +3 -3
  407. package/types/ngwr-drag-drop.d.ts +56 -2
  408. package/types/ngwr-drawer.d.ts +68 -5
  409. package/types/ngwr-dropdown.d.ts +9 -0
  410. package/types/ngwr-event-calendar-testing.d.ts +301 -0
  411. package/types/ngwr-event-calendar.d.ts +17 -8
  412. package/types/ngwr-falling-text-testing.d.ts +188 -0
  413. package/types/ngwr-falling-text.d.ts +1 -1
  414. package/types/ngwr-form.d.ts +12 -2
  415. package/types/ngwr-fuzzy-text-testing.d.ts +130 -0
  416. package/types/ngwr-gauge-testing.d.ts +71 -0
  417. package/types/ngwr-glitch-text-testing.d.ts +201 -0
  418. package/types/ngwr-gradient-text-testing.d.ts +186 -0
  419. package/types/ngwr-i18n.d.ts +13 -4
  420. package/types/ngwr-image-cropper-testing.d.ts +173 -0
  421. package/types/ngwr-image-cropper.d.ts +71 -5
  422. package/types/ngwr-input-number-testing.d.ts +15 -10
  423. package/types/ngwr-input-number.d.ts +44 -5
  424. package/types/ngwr-input-otp-testing.d.ts +12 -6
  425. package/types/ngwr-input-otp.d.ts +15 -1
  426. package/types/ngwr-knob-testing.d.ts +150 -0
  427. package/types/ngwr-lightbox-testing.d.ts +154 -0
  428. package/types/ngwr-lightbox.d.ts +6 -0
  429. package/types/ngwr-line-chart-testing.d.ts +93 -0
  430. package/types/ngwr-line-chart.d.ts +20 -3
  431. package/types/ngwr-markdown.d.ts +11 -0
  432. package/types/ngwr-marquee-testing.d.ts +280 -0
  433. package/types/ngwr-mention.d.ts +32 -0
  434. package/types/ngwr-meter-group-testing.d.ts +77 -0
  435. package/types/ngwr-overlay.d.ts +20 -1
  436. package/types/ngwr-pagination-testing.d.ts +4 -4
  437. package/types/ngwr-pipes.d.ts +1 -1
  438. package/types/ngwr-popover-testing.d.ts +7 -2
  439. package/types/ngwr-popover.d.ts +1 -0
  440. package/types/ngwr-result.d.ts +6 -0
  441. package/types/ngwr-rotating-text-testing.d.ts +191 -0
  442. package/types/ngwr-segmented-testing.d.ts +9 -0
  443. package/types/ngwr-segmented.d.ts +21 -1
  444. package/types/ngwr-select.d.ts +100 -6
  445. package/types/ngwr-shiny-text-testing.d.ts +165 -0
  446. package/types/ngwr-shiny-text.d.ts +4 -2
  447. package/types/ngwr-sidebar.d.ts +14 -5
  448. package/types/ngwr-slider.d.ts +84 -1
  449. package/types/ngwr-sparkline-testing.d.ts +69 -0
  450. package/types/ngwr-speed-dial-testing.d.ts +199 -0
  451. package/types/ngwr-speed-dial.d.ts +22 -3
  452. package/types/ngwr-splash-cursor-testing.d.ts +95 -0
  453. package/types/ngwr-split-text-testing.d.ts +209 -0
  454. package/types/ngwr-split-text.d.ts +21 -0
  455. package/types/ngwr-splitter-testing.d.ts +174 -0
  456. package/types/ngwr-spotlight-card-testing.d.ts +303 -0
  457. package/types/ngwr-star-border-testing.d.ts +135 -0
  458. package/types/ngwr-stepper-testing.d.ts +5 -5
  459. package/types/ngwr-stepper.d.ts +8 -0
  460. package/types/ngwr-storage.d.ts +1 -0
  461. package/types/ngwr-table.d.ts +114 -12
  462. package/types/ngwr-tabs-testing.d.ts +11 -10
  463. package/types/ngwr-tabs.d.ts +2 -0
  464. package/types/ngwr-theme.d.ts +82 -1
  465. package/types/ngwr-tilt-card-testing.d.ts +158 -0
  466. package/types/ngwr-tilt-card.d.ts +2 -0
  467. package/types/ngwr-toast.d.ts +14 -5
  468. package/types/ngwr-tour-testing.d.ts +143 -0
  469. package/types/ngwr-tour.d.ts +22 -4
  470. package/types/ngwr-tree.d.ts +12 -4
  471. package/types/ngwr-typewriter-testing.d.ts +211 -0
  472. package/types/ngwr-utils.d.ts +5 -2
  473. package/types/ngwr-version.d.ts +1 -1
  474. package/types/ngwr-waves-testing.d.ts +121 -0
  475. package/types/ngwr-window-testing.d.ts +263 -0
  476. package/types/ngwr-window.d.ts +66 -21
  477. package/typography/styles/_index.scss +1 -1
  478. package/window/styles/_index.scss +116 -42
  479. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  480. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  481. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -0,0 +1,143 @@
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 tour popup a harness query matches. */
11
+ interface WrTourHarnessFilters extends BaseHarnessFilters {
12
+ /** Match the step's heading — a string is an exact match, a RegExp is tested. */
13
+ readonly title?: string | RegExp;
14
+ /** Match the step's body copy. */
15
+ readonly content?: string | RegExp;
16
+ }
17
+ /** Which step of how many, as the popup prints it. */
18
+ interface WrTourProgress {
19
+ /** One-based, the way the card counts. */
20
+ readonly current: number;
21
+ /** How many steps the tour was STARTED with — not how many it will show. */
22
+ readonly total: number;
23
+ }
24
+
25
+ /**
26
+ * @license
27
+ *
28
+ * Use of this source code is governed by an MIT-style license that can be
29
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
30
+ */
31
+
32
+ /**
33
+ * Test harness for the card `WrTour` shows beside the spotlit element.
34
+ *
35
+ * `WrTour` is a service with no element of its own, so there is nothing in your
36
+ * fixture to load: the popup is a portal in the NGWR overlay container, and this
37
+ * comes from `TestbedHarnessEnvironment.documentRootLoader()`. **One card exists at
38
+ * a time** — the service tears the whole step down before opening the next — so a
39
+ * harness held across {@link next} is pointed at a detached element, and a fresh one
40
+ * has to be fetched per step.
41
+ *
42
+ * **The card is rebuilt per step, and that is what makes `getHarnessOrNull` the way
43
+ * to ask whether a tour is running.** There is no "closed" state to read: the popup,
44
+ * the overlay and the spotlight all go away together.
45
+ *
46
+ * **What "last" means here is not `current === total`.** A step whose target is not
47
+ * on the page is skipped, so a tour of three steps can show two, and the service
48
+ * looks AHEAD for a reachable one to decide what the primary button says.
49
+ * {@link getProgress} reports the printed count, {@link getPrimaryLabel} what the
50
+ * button actually reads — asserting the second is what catches a card that says
51
+ * "Next" and then ends the tour.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture);
56
+ * tour.start(steps);
57
+ * await fixture.whenStable();
58
+ *
59
+ * const card = await rootLoader.getHarness(WrTourHarness);
60
+ * expect(await card.getTitle()).toBe('Search');
61
+ * await card.next();
62
+ * ```
63
+ *
64
+ * @see https://ngwr.dev/guides/testing
65
+ */
66
+ declare class WrTourHarness extends ComponentHarness {
67
+ static hostSelector: string;
68
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
69
+ static with(options?: WrTourHarnessFilters): HarnessPredicate<WrTourHarness>;
70
+ /**
71
+ * Whether this card is still on the page.
72
+ *
73
+ * For a harness you are already HOLDING: moving to another step disposes the
74
+ * overlay, so this flips to `false` where a fresh `getHarnessOrNull()` answers
75
+ * with the NEW card rather than with nothing.
76
+ */
77
+ isShowing(): Promise<boolean>;
78
+ /** The step's heading, or `null` for a step given no `title`. */
79
+ getTitle(): Promise<string | null>;
80
+ /** The step's body copy. */
81
+ getContent(): Promise<string>;
82
+ /** The progress line as printed, e.g. `Step 2 of 4`. */
83
+ getProgressText(): Promise<string>;
84
+ /**
85
+ * The two numbers out of the progress line, or `null` when it does not hold two.
86
+ *
87
+ * Parsed from the rendered string rather than asked of the service, because the
88
+ * service is not something a harness can reach — and the string is what the user
89
+ * actually gets. A catalog that spells the numbers as words, or reverses them,
90
+ * makes this `null` instead of a wrong answer; assert {@link getProgressText} in
91
+ * that case.
92
+ *
93
+ * `total` is how many steps the tour was STARTED with, not how many it will show:
94
+ * a step whose target is missing is skipped and still counted here, which is the
95
+ * component's own choice and worth knowing before writing an assertion on it.
96
+ */
97
+ getProgress(): Promise<WrTourProgress | null>;
98
+ /**
99
+ * The name the card announces — its title and the progress line, or just the
100
+ * progress line for an untitled step.
101
+ *
102
+ * The card is an `aria-modal` dialog, so it needs a name; the progress line is
103
+ * what an untitled step has instead of one.
104
+ */
105
+ getAccessibleName(): Promise<string | null>;
106
+ /** Whether the card announces itself as a modal dialog. */
107
+ isModal(): Promise<boolean>;
108
+ /**
109
+ * Whether the card offers a Back button — which is the same question as "is this
110
+ * the first step", since the button is only rendered past it.
111
+ */
112
+ hasBack(): Promise<boolean>;
113
+ /**
114
+ * What the primary button READS — the "next" label, or the "done" one on the last
115
+ * step the user will see.
116
+ *
117
+ * The assertion worth writing, and not derivable from the count: the service looks
118
+ * ahead for a step whose target is still on the page, so a tour whose last step is
119
+ * hidden ends one card early and this is the only place that shows.
120
+ */
121
+ getPrimaryLabel(): Promise<string>;
122
+ /** The Skip button's label. */
123
+ getSkipLabel(): Promise<string>;
124
+ /** The Back button's label. Throws on the first step, where there is none. */
125
+ getBackLabel(): Promise<string>;
126
+ /**
127
+ * Press the primary button — the next step, or the end of the tour.
128
+ *
129
+ * Composed through {@link WrButtonHarness} rather than clicking an element: these
130
+ * are `wr-btn`s, and that harness already knows how one reports being off.
131
+ */
132
+ next(): Promise<void>;
133
+ /** Press Back. Throws on the first step, where the button is not rendered. */
134
+ back(): Promise<void>;
135
+ /** Press Skip — ending the tour without finishing it. */
136
+ skipTour(): Promise<void>;
137
+ private primary;
138
+ private skip;
139
+ private backButton;
140
+ }
141
+
142
+ export { WrTourHarness };
143
+ export type { WrTourHarnessFilters, WrTourProgress };
@@ -74,6 +74,7 @@ declare class WrTour {
74
74
  /** The step being shown, or `null` when idle. */
75
75
  readonly step: _angular_core.Signal<WrTourStep | null>;
76
76
  private readonly noStepAfter;
77
+ private readonly noStepBefore;
77
78
  /**
78
79
  * Whether this is the last step the user will see. Not `index() === total() - 1`:
79
80
  * a trailing step whose target is missing is skipped, so comparing against the
@@ -81,6 +82,14 @@ declare class WrTour {
81
82
  * ending the tour when it was pressed.
82
83
  */
83
84
  readonly isLast: _angular_core.Signal<boolean>;
85
+ /**
86
+ * Whether this is the first step the user will see. Not `index() === 0`, for the
87
+ * mirror of the reason above: a LEADING step whose target is missing is skipped,
88
+ * so the tour opens on a later index and the raw one put a Back button on the
89
+ * first card — one that did nothing at all, because `prev()` walks off the start
90
+ * and returns without moving.
91
+ */
92
+ readonly isFirst: _angular_core.Signal<boolean>;
84
93
  constructor();
85
94
  /**
86
95
  * Begin a tour. Restarts if one is already running. A no-op under SSR — a
@@ -102,6 +111,8 @@ declare class WrTour {
102
111
  private goTo;
103
112
  /** Whether the tour has a step past `index` that can actually be shown. */
104
113
  private anyResolvableAfter;
114
+ /** Whether the tour has a step before `index` that can actually be shown. */
115
+ private anyResolvableBefore;
105
116
  private resolve;
106
117
  private openStep;
107
118
  private placeSpotlight;
@@ -129,6 +140,13 @@ interface WrTourController {
129
140
  * skipped and the raw count would call the final card "Next".
130
141
  */
131
142
  readonly isLast: () => boolean;
143
+ /**
144
+ * Whether this is the first step the user will actually see — the service looks
145
+ * BEHIND for a reachable one, for the mirror reason: a leading step whose target
146
+ * is missing gets skipped, so the tour opens on a later index and the raw one
147
+ * would put a Back button on the very first card.
148
+ */
149
+ readonly isFirst: () => boolean;
132
150
  next(): void;
133
151
  prev(): void;
134
152
  stop(): void;
@@ -141,10 +159,10 @@ interface WrTourController {
141
159
  */
142
160
  declare class WrTourPopup {
143
161
  protected readonly tour: WrTourController;
144
- protected readonly nextLabel: string;
145
- protected readonly backLabel: string;
146
- protected readonly doneLabel: string;
147
- protected readonly skipLabel: string;
162
+ protected readonly nextLabel: _angular_core.Signal<string>;
163
+ protected readonly backLabel: _angular_core.Signal<string>;
164
+ protected readonly doneLabel: _angular_core.Signal<string>;
165
+ protected readonly skipLabel: _angular_core.Signal<string>;
148
166
  /** `Step {{current}} of {{total}}` — also the dialog's accessible name. */
149
167
  protected readonly progress: (params?: ngwr_i18n.WrI18nParams) => string;
150
168
  protected readonly isLast: _angular_core.Signal<boolean>;
@@ -93,6 +93,13 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
93
93
  readonly openOn: _angular_core.InputSignal<"inline" | "overlay">;
94
94
  /** Placeholder shown on the trigger when no node is selected. */
95
95
  readonly placeholder: _angular_core.InputSignal<string>;
96
+ /**
97
+ * The same fall-through `wr-select` has had all along: an unset placeholder
98
+ * takes the catalog's `tree.placeholder`, so an overlay trigger with nothing
99
+ * selected reads "Select…" in the app's language instead of rendering an
100
+ * empty span. The key shipped in both catalogs and nothing read it.
101
+ */
102
+ protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
96
103
  /**
97
104
  * Accessible name of the overlay trigger. Falls back to the placeholder, then
98
105
  * to `select.label` — a `role="combobox"` with nothing selected and no
@@ -151,6 +158,7 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
151
158
  private readonly scrollStrategies;
152
159
  private readonly destroyRef;
153
160
  private readonly platformId;
161
+ private readonly injector;
154
162
  /**
155
163
  * Ambient reading direction. Optional so a bare `TestBed` — or a consumer who
156
164
  * never set a direction — needs no provider; `Directionality` is root-provided
@@ -172,10 +180,10 @@ declare class WrTree<TId = string> implements FormValueControl<unknown> {
172
180
  * `flat[i]` is undefined.
173
181
  */
174
182
  protected readonly cursorIndex: _angular_core.Signal<number>;
175
- /** Resolved ARIA labels — resolved once at construction, so a runtime locale switch needs a re-create. */
176
- protected readonly clearLabel: string;
177
- protected readonly expandLabel: string;
178
- protected readonly collapseLabel: string;
183
+ /** Resolved ARIA labels — signals, so they follow both a late catalog and a locale switch. */
184
+ protected readonly clearLabel: _angular_core.Signal<string>;
185
+ protected readonly expandLabel: _angular_core.Signal<string>;
186
+ protected readonly collapseLabel: _angular_core.Signal<string>;
179
187
  protected readonly chipRemoveLabel: (params?: ngwr_i18n.WrI18nParams) => string;
180
188
  /** Flattened list of currently visible nodes — what the template renders. */
181
189
  protected readonly flat: _angular_core.Signal<readonly FlatNode<TId>[]>;
@@ -0,0 +1,211 @@
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-typewriter>` a harness query matches. */
11
+ interface WrTypewriterHarnessFilters extends BaseHarnessFilters {
12
+ /**
13
+ * Match what the machine has typed SO FAR — a prefix while it is still going, the
14
+ * whole sentence once it settles, and the empty string before the first tick. A
15
+ * string is an exact match, a RegExp is tested.
16
+ *
17
+ * There is nothing steadier to match on: the component holds no copy of the phrase
18
+ * it is working towards, so a filter cannot address a typewriter by what it is
19
+ * going to say. Pin the clock first — `vi.useFakeTimers` and an explicit advance —
20
+ * or match a RegExp loose enough to survive whichever frame the query lands on.
21
+ */
22
+ readonly text?: string | RegExp;
23
+ /**
24
+ * Match typewriters showing a caret (`true`) or none at all (`false`).
25
+ *
26
+ * The cursor is REMOVED from the DOM rather than hidden, so this changes mid-run on
27
+ * anything with `hideCursorWhileTyping` — see `WrTypewriterHarness.hasCursor`. On a
28
+ * default typewriter it is stable, and it is the one way to tell two otherwise
29
+ * identical machines apart.
30
+ */
31
+ readonly hasCursor?: boolean;
32
+ }
33
+
34
+ /**
35
+ * @license
36
+ *
37
+ * Use of this source code is governed by an MIT-style license that can be
38
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
39
+ */
40
+
41
+ /**
42
+ * Test harness for `<wr-typewriter>`.
43
+ *
44
+ * **The typed string is the entire component, and it is a moving target.**
45
+ * {@link getText} reads the one text node the machine writes into, which mid-run holds
46
+ * a FRAGMENT — `'Hell'` on the way to `'Hello'` — and between sentences holds whatever
47
+ * is left of the previous one. That is not a limitation to work around; it is what the
48
+ * component renders, and pinning it tick by tick is what proves the machine types one
49
+ * character at a time, deletes one at a time, pauses, cycles, and stops when told not to
50
+ * loop. Install fake timers for `setTimeout` / `clearTimeout` only and advance the clock
51
+ * yourself before every read — awaiting a harness method flushes microtasks, never
52
+ * timers, so an unadvanced read answers with the previous frame.
53
+ *
54
+ * **What is typed is also what is announced, and no second copy exists.** There is
55
+ * deliberately no `getAccessibleText()` here: the component renders one plain text node
56
+ * and nothing else, so a screen reader landing mid-word hears the fragment. (Its sibling
57
+ * `wr-rotating-text` carries a visually-hidden copy of the whole phrase; this one does
58
+ * not, and inventing a method that implied otherwise would report an accessible layer
59
+ * that is not there.) The single a11y decision the component does make is the caret, and
60
+ * {@link isCursorDecorative} is how a spec holds it: without `aria-hidden` every phrase
61
+ * is announced as `Hello pipe`, and nothing else in the DOM would change.
62
+ *
63
+ * **The methods that are missing are missing on purpose.** There is no `isTyping()` or
64
+ * `getPhase()` — the phase is a private signal that never reaches the document, and its
65
+ * only proxy, the caret vanishing, exists solely when `hideCursorWhileTyping` is set, so
66
+ * the method would report "not typing" for the DEFAULT configuration while the machine
67
+ * types. No `isComplete()` / `isFinished()`: a machine stopped on its last sentence and
68
+ * one pausing between sentences render the identical string and the identical caret, so
69
+ * assert the `sentenceComplete` output instead. No `isCursorBlinking()` /
70
+ * `getCursorOpacity()`: the blink is a `@keyframes` rule from a stylesheet a unit test
71
+ * never loads, and a mid-animation opacity is a number that means nothing.
72
+ * No `isVisible()` / `waitForVisible()`: `startOnVisible` hangs off an
73
+ * `IntersectionObserver` jsdom does not implement, so any answer would be the spec's own
74
+ * stub echoing back. And no `getTypingSpeed()` / `getDeletingSpeed()` /
75
+ * `getPauseDuration()` / `getInitialDelay()`: none of them is ever written to the DOM, so
76
+ * reading them would mean reading the component instance rather than the rendered
77
+ * control. They are observable exactly once — as the cadence of {@link getText}.
78
+ *
79
+ * What DOES survive a test with no layout, besides the string: the caret's presence,
80
+ * glyph and `aria-hidden`, and the two values the host writes inline —
81
+ * {@link getColor} and {@link getCursorBlinkDuration}.
82
+ *
83
+ * ```ts
84
+ * // jsdom implements no IntersectionObserver, so `[startOnVisible]` throws on boot.
85
+ * vi.stubGlobal('IntersectionObserver', StubObserver);
86
+ * // Fake these two and no more: faking the microtask queue deadlocks `whenStable`,
87
+ * // which is where the machine boots and where every harness read stabilizes.
88
+ * vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] });
89
+ * ```
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const typewriter = await loader.getHarness(WrTypewriterHarness);
94
+ *
95
+ * vi.advanceTimersByTime(0); // the first tick is scheduled at `initialDelay`
96
+ * expect(await typewriter.getText()).toBe('H');
97
+ *
98
+ * vi.advanceTimersByTime(50);
99
+ * expect(await typewriter.getText()).toBe('He');
100
+ * expect(await typewriter.isCursorDecorative()).toBe(true);
101
+ * ```
102
+ *
103
+ * @see https://ngwr.dev/guides/testing
104
+ */
105
+ declare class WrTypewriterHarness extends ComponentHarness {
106
+ static hostSelector: string;
107
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
108
+ static with(options?: WrTypewriterHarnessFilters): HarnessPredicate<WrTypewriterHarness>;
109
+ private readonly content;
110
+ private readonly cursor;
111
+ /**
112
+ * One custom property off the host's `style` ATTRIBUTE.
113
+ *
114
+ * Not `getCssValue()`, which is `getComputedStyle`: with the entry point's own
115
+ * stylesheet loaded that resolves the sheet's declaration, so the method
116
+ * answers plausibly at exactly the moment the host binding — the thing under
117
+ * test — is what broke. The sibling reader below already says this; the
118
+ * blink duration was reading the computed value anyway.
119
+ */
120
+ private inlineVar;
121
+ /**
122
+ * What has been typed so far — a FRAGMENT while the machine is running.
123
+ *
124
+ * This is the whole state machine in one string, and every timing input is observable
125
+ * only through it: one character per `typingSpeed`, one fewer per `deletingSpeed`, the
126
+ * `pauseDuration` gap, the swap to the next entry in `[texts]`, and the stop that
127
+ * `[loop]="false"` puts on the last sentence. `reverseMode` shows up here too, and
128
+ * `[...await getText()].length` is what proves the reversal counted CODE POINTS: a
129
+ * `split('')` reversal turns one emoji into two lone surrogates, which is a pair of
130
+ * broken glyphs on screen and the same character count as a correct answer.
131
+ *
132
+ * Untrimmed, because the fragment is what it is: a phrase typed as far as `'Hello '`
133
+ * genuinely has a trailing space, and trimming would make that frame indistinguishable
134
+ * from the one before it.
135
+ *
136
+ * The empty string is a real state, not a failure — nothing has been typed until the
137
+ * first tick fires, and a deletion run passes back through it on its way to the next
138
+ * sentence.
139
+ */
140
+ getText(): Promise<string>;
141
+ /**
142
+ * Whether a caret is in the document at all.
143
+ *
144
+ * The component removes the element rather than hiding it, which makes this two
145
+ * questions at once. Statically it answers `showCursor`. While the machine runs it
146
+ * also answers `hideCursorWhileTyping` — and the caret going away is the ONLY evidence
147
+ * anywhere in the DOM that the component considers itself mid-phase, since the phase
148
+ * signal is private. Do not read that as `isTyping()`, though: with
149
+ * `hideCursorWhileTyping` off, which is the default, the caret stays put from the first
150
+ * character to the last.
151
+ */
152
+ hasCursor(): Promise<boolean>;
153
+ /**
154
+ * The caret glyph, or `null` when there is no caret.
155
+ *
156
+ * `null` rather than `''` on purpose: "no cursor element" and "a cursor element
157
+ * rendering nothing" are different failures, and an interpolated glyph that stopped
158
+ * arriving is exactly the second one. Untrimmed, since a caret can legitimately be a
159
+ * space-padded glyph and `TestElement.text()` would erase it.
160
+ */
161
+ getCursorCharacter(): Promise<string | null>;
162
+ /**
163
+ * Whether the caret is kept out of the accessibility tree.
164
+ *
165
+ * The component's one deliberate a11y decision, and a silent one to lose: drop the
166
+ * attribute and nothing on screen changes while every phrase starts being announced as
167
+ * `Hello pipe`.
168
+ *
169
+ * Throws when there is no caret. `false` would read as "the caret is announced", which
170
+ * is the opposite of what an absent caret means — and it is the answer a component that
171
+ * stopped rendering its cursor entirely would also give. Ask {@link hasCursor} first
172
+ * when the caret's presence is itself in question.
173
+ */
174
+ isCursorDecorative(): Promise<boolean>;
175
+ /**
176
+ * The caret's blink half-cycle in seconds, from the custom property the host writes.
177
+ *
178
+ * The blink itself is a CSS keyframe and unobservable, so this custom property is the
179
+ * only channel `[cursorBlinkDuration]` has into it — a binding that quietly stopped
180
+ * writing it would leave the blink stuck at the stylesheet's default with no other
181
+ * symptom anywhere.
182
+ *
183
+ * Throws rather than answering when the property is missing or unparseable, and says
184
+ * which it was. The stylesheet's own `0.5s` fallback is never applied in a test that
185
+ * loads no stylesheets, so an absent property reads as the empty string here — and
186
+ * `0.5` returned from a `parseFloat('')` would be indistinguishable from the component
187
+ * writing the default correctly.
188
+ */
189
+ getCursorBlinkDuration(): Promise<number>;
190
+ /**
191
+ * The colour the host paints the phrase in, exactly as it is written inline.
192
+ *
193
+ * `[textColors]` cycles per SENTENCE, so this is how a spec pins that the colour index
194
+ * follows the sentence index rather than drifting; and with no colours given the
195
+ * component writes the literal `inherit`, which is a value worth asserting rather than
196
+ * an absence.
197
+ *
198
+ * Read off the `style` ATTRIBUTE rather than through `getCssValue`, which would answer
199
+ * from a computed style. jsdom hands `inherit` straight back, so `getCssValue` would
200
+ * agree here and lie in a real browser, where the keyword resolves to whatever rgb
201
+ * triple the parent happens to carry.
202
+ *
203
+ * Throws when the host carries no `color` declaration: the component writes one on
204
+ * every render, so its absence means the binding is gone, and any string returned in
205
+ * its place would be a guess at what the page inherits.
206
+ */
207
+ getColor(): Promise<string>;
208
+ }
209
+
210
+ export { WrTypewriterHarness };
211
+ export type { WrTypewriterHarnessFilters };
@@ -381,8 +381,11 @@ declare function throttle<TArgs extends readonly unknown[]>(fn: (...args: TArgs)
381
381
  * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
382
382
  */
383
383
  /**
384
- * Canonical `KeyboardEvent.key` values used across ngwr components.
385
- * Use these constants instead of magic strings so refactors are searchable.
384
+ * Canonical `KeyboardEvent.key` values for your own `keydown` handlers.
385
+ *
386
+ * The spec spellings are easy to get wrong — arrows are `ArrowUp`, space is a
387
+ * literal `' '` — and a typo like `'Esacpe'` never matches and never errors.
388
+ * These give you autocomplete and the {@link WrKey} union to match against.
386
389
  */
387
390
  declare const KEYS: {
388
391
  readonly ENTER: "Enter";
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
16
16
  * Distinct from `Version` exported by `@angular/core`, which reports the
17
17
  * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.
18
18
  */
19
- declare const NGWR_VERSION = "11.1.0";
19
+ declare const NGWR_VERSION = "12.0.0";
20
20
 
21
21
  /**
22
22
  * @license
@@ -0,0 +1,121 @@
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-waves>` a harness query matches. */
11
+ interface WrWavesHarnessFilters extends BaseHarnessFilters {
12
+ /**
13
+ * Match only fields whose canvas has drawn (`true`) or only fields still showing the
14
+ * stand-in grid (`false`). A wave field has no name of its own, so this is the one
15
+ * state that tells two of them apart — see `WrWavesHarness.isPainted`, which explains
16
+ * why the answer is always `false` in a unit test.
17
+ */
18
+ readonly painted?: boolean;
19
+ }
20
+
21
+ /**
22
+ * @license
23
+ *
24
+ * Use of this source code is governed by an MIT-style license that can be
25
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
26
+ */
27
+
28
+ /**
29
+ * Test harness for `<wr-waves>` — a field of lines drifting on perlin noise.
30
+ *
31
+ * **The lines themselves are unreadable and always will be.** They are strokes on a 2D
32
+ * canvas, seeded from the host's measured box and redrawn every frame; a unit test has
33
+ * no box and no drawing context, so there is nothing to count and nothing to compare.
34
+ * What the component publishes to the DOM is small, deliberate and worth pinning: the
35
+ * handover flag {@link isPainted}, the pitch {@link getLineGapPx} that the CSS stand-in
36
+ * grid draws at before the canvas takes over, and the surface itself.
37
+ *
38
+ * Two style reads, taken two different ways, and the difference is the point.
39
+ * {@link getBackgroundColor} is computed, because nothing but the component declares
40
+ * that property and the resolved value is what gets painted. {@link getLineGapPx} is
41
+ * read from the inline declaration, because the stylesheet declares
42
+ * `--wr-waves-x-gap` too — as the stand-in's own 10px fallback — so a computed read
43
+ * would answer `10px` on a component that had stopped publishing anything, which is
44
+ * precisely the break the method exists to catch.
45
+ *
46
+ * There is no `getLineCount()`, `getPoints()` or `getCanvasSize()`: the grid is seeded
47
+ * from `getBoundingClientRect()`, which is 0×0 here, and the numbers that fall out of
48
+ * that describe nothing. No `getLineColor()` either — it is a canvas `strokeStyle`
49
+ * resolved from a themed custom property that only a stylesheet can supply. No
50
+ * `moveMouse()`: the pointer listeners are on `window` and are only installed once a
51
+ * context exists. And no `isReducedMotion()`, which is the sharpest of them — the
52
+ * reduced-motion path draws one static grid through the same code and sets the same
53
+ * flag, so the DOM is identical either way and any answer would be a guess.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * const waves = await loader.getHarness(WrWavesHarness);
58
+ *
59
+ * expect(await waves.hasCanvas()).toBe(true);
60
+ * expect(await waves.isDecorative()).toBe(true);
61
+ * expect(await waves.getLineGapPx()).toBe(10);
62
+ * ```
63
+ *
64
+ * @see https://ngwr.dev/guides/testing
65
+ */
66
+ declare class WrWavesHarness extends ComponentHarness {
67
+ static hostSelector: string;
68
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
69
+ static with(options?: WrWavesHarnessFilters): HarnessPredicate<WrWavesHarness>;
70
+ private readonly canvas;
71
+ /**
72
+ * Whether the canvas has drawn a frame and retired the CSS stand-in grid.
73
+ *
74
+ * **In a unit test this is always `false`, and asserting exactly that is the point.**
75
+ * jsdom hands back no 2D context, so the component must leave the stand-in up rather
76
+ * than declare itself painted over a blank box — the flag is set inside the draw for
77
+ * that reason, not at the end of the boot. A spec that waits for this to turn `true`
78
+ * waits forever.
79
+ */
80
+ isPainted(): Promise<boolean>;
81
+ /**
82
+ * The horizontal gap between lines, in pixels, as the component publishes it.
83
+ *
84
+ * `[xGap]` feeds the canvas maths, which is invisible here — but it is also published
85
+ * to the stand-in grid, and that is the half a spec can hold: a field whose stand-in
86
+ * draws at 10px and whose canvas then arrives at 40px changes pitch under the reader
87
+ * on hydration, a visible pop that nothing else can catch.
88
+ */
89
+ getLineGapPx(): Promise<number>;
90
+ /**
91
+ * The fill behind the lines, resolved.
92
+ *
93
+ * Comes back as the browser reports it rather than as it was authored — the default
94
+ * `'transparent'` reads as `'rgba(0, 0, 0, 0)'` and `'#5227ff'` as
95
+ * `'rgb(82, 39, 255)'` — which is true in jsdom and in a real browser alike, so an
96
+ * assertion written against it travels. Worth pinning because the alternative
97
+ * implementation is to fill the canvas instead, and a canvas fill is invisible to
98
+ * everything until it has painted: the background has to be a real declaration on the
99
+ * host so the field is the right colour from the prerendered HTML onwards.
100
+ */
101
+ getBackgroundColor(): Promise<string>;
102
+ /**
103
+ * Whether the field is hidden from assistive tech.
104
+ *
105
+ * A background canvas has nothing to announce, so losing this leaves a screen reader
106
+ * stopping on a nameless graphic in front of the section's actual content.
107
+ */
108
+ isDecorative(): Promise<boolean>;
109
+ /**
110
+ * Whether the drawing surface is in the markup.
111
+ *
112
+ * It is there in every state, including the ones where nothing is ever drawn on it —
113
+ * prerendered, no 2D context, reduced motion. That is the contract: the element goes
114
+ * up and the component stops, so the stand-in grid has something to sit behind and
115
+ * {@link isPainted} has something to answer about.
116
+ */
117
+ hasCanvas(): Promise<boolean>;
118
+ }
119
+
120
+ export { WrWavesHarness };
121
+ export type { WrWavesHarnessFilters };