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,165 @@
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
+ /**
11
+ * Which way the bright stripe travels. Mirrors the component's `direction` input, which
12
+ * declares the union inline and exports no name for it.
13
+ */
14
+ type WrShinyTextSweepDirection = 'left' | 'right';
15
+ /** Narrows which `<wr-shiny-text>` a harness query matches. */
16
+ interface WrShinyTextHarnessFilters extends BaseHarnessFilters {
17
+ /** Match the rendered text — a string is an exact match, a RegExp is tested. */
18
+ readonly text?: string | RegExp;
19
+ /**
20
+ * Match only the stopped (`true`) or only the running (`false`) instances. Named for the
21
+ * DOM contract rather than for the input: `[disabled]` writes `wr-shiny-text--paused`.
22
+ */
23
+ readonly paused?: boolean;
24
+ /** Match the sweep direction — `'left'` is the absence of the reverse modifier. */
25
+ readonly direction?: WrShinyTextSweepDirection;
26
+ }
27
+
28
+ /**
29
+ * @license
30
+ *
31
+ * Use of this source code is governed by an MIT-style license that can be
32
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
33
+ */
34
+
35
+ /**
36
+ * Test harness for `<wr-shiny-text>`.
37
+ *
38
+ * **The duration is the assertion that matters.** The pause between sweeps is not
39
+ * `animation-delay` and not a second animation — it is folded INTO `animation-duration`,
40
+ * because the keyframe finishes at 50% and holds there. So `[speed]="2"` with
41
+ * `[delay]="3"` has to read 5 seconds, and anyone reimplementing the pause the obvious
42
+ * way passes every other check here and fails {@link getCycleDurationSeconds}.
43
+ *
44
+ * **The stripe is five stops and only one of them is the shine.** The base colour fills
45
+ * 0%, 35%, 65% and 100%; the highlight sits alone at 50%. {@link getBaseColor} and
46
+ * {@link getShineColor} are offered as a pair because swapping the two inputs is
47
+ * otherwise undetectable — the gradient stays well-formed, the angle is unchanged, and
48
+ * the text simply stops shimmering.
49
+ *
50
+ * **Both gradient reads come off the inline `style` attribute**, not through computed
51
+ * style. Unset colours fall through to the literal `var(--wr-shiny-text-base)` /
52
+ * `var(--wr-shiny-text-shine)` tokens, which is exactly what makes the dark-theme
53
+ * override work — and a computed read resolves those tokens in a real browser while
54
+ * handing them back verbatim in a unit test. Reading what the component wrote gives the
55
+ * same answer in both places.
56
+ *
57
+ * The colours still pass through the CSSOM on their way back out, and it has its own
58
+ * spelling: a hex literal is re-serialised, so `[color]="'#444'"` reads
59
+ * `rgb(68, 68, 68)`. Functional notations and `var()` tokens survive untouched. Assert
60
+ * the form the CSSOM returns, not the one the template passed in.
61
+ *
62
+ * There is no inner element to query: the template is the bare interpolation, so the text
63
+ * is a node on the host. A locator copied from the gradient-text harness finds nothing.
64
+ *
65
+ * **What the harness deliberately does not offer**, and why. There is no `isAnimating()`
66
+ * / `getBackgroundPosition()`: the sweep is a stylesheet keyframe over
67
+ * `background-position`, and a unit test neither loads the sheet nor runs the animation.
68
+ * There is no `getAnimationName()` / `getIterationCount()` / `getPlayState()`: every
69
+ * animation property except the duration lives in the stylesheet, so those reads answer
70
+ * the same empty string for a working component and a deleted one. {@link isPaused} and
71
+ * {@link pausesOnHover} claim the CLASSES and not the pauses — `:hover` is a selector and
72
+ * `animation-play-state` is a stylesheet rule, so what they honestly pin is that the
73
+ * input arrived. There is no `respectsReducedMotion()`: the handling is a `@media` block
74
+ * with no TypeScript counterpart. And there is nothing reporting the painted text colour,
75
+ * because `-webkit-text-fill-color: transparent` is a stylesheet declaration and a read
76
+ * would report the inherited colour as if the text were solid.
77
+ *
78
+ * The `[wrShimmer]` directive shipped from the same entry point has no harness: it adds
79
+ * one static class and nothing else, so a harness could only restate its own selector.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * const shiny = await loader.getHarness(WrShinyTextHarness);
84
+ *
85
+ * expect(await shiny.getCycleDurationSeconds()).toBe(5);
86
+ * expect(await shiny.getShineColor()).toBe('var(--wr-shiny-text-shine)');
87
+ * ```
88
+ *
89
+ * @see https://ngwr.dev/guides/testing
90
+ */
91
+ declare class WrShinyTextHarness extends ComponentHarness {
92
+ static hostSelector: string;
93
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
94
+ static with(options?: WrShinyTextHarnessFilters): HarnessPredicate<WrShinyTextHarness>;
95
+ /** The rendered text, trimmed. It is a text node on the host — there is no inner span. */
96
+ getText(): Promise<string>;
97
+ /**
98
+ * The whole stripe gradient the component computed, as written.
99
+ *
100
+ * Unresolved on purpose. With no `[color]` / `[shineColor]` given this string contains
101
+ * the theme's own custom-property tokens rather than colours, and that is the working
102
+ * state, not a gap — resolving them would need the stylesheet, and the resolved answer
103
+ * would differ between a unit test and a browser.
104
+ */
105
+ getGradient(): Promise<string>;
106
+ /**
107
+ * The gradient's angle in degrees, from `[spread]`.
108
+ *
109
+ * The only observable effect that input has, `numAttr` coercion included. Note the name
110
+ * is inherited vocabulary and describes the ANGLE, not the width of the bright stripe:
111
+ * the stop positions are hard-coded, so no input narrows the shine.
112
+ */
113
+ getSpreadDegrees(): Promise<number>;
114
+ /**
115
+ * The colour outside the bright stripe — the 0% stop.
116
+ *
117
+ * The same colour fills 35%, 65% and 100%; only the 50% stop differs. Assert it next to
118
+ * {@link getShineColor}: a `[color]` that lands in the shine slot instead leaves a
119
+ * perfectly valid gradient that no longer shimmers.
120
+ */
121
+ getBaseColor(): Promise<string>;
122
+ /** The highlight colour — the lone 50% stop the stripe is made of. */
123
+ getShineColor(): Promise<string>;
124
+ /**
125
+ * One full cycle in seconds — the sweep AND the pause after it.
126
+ *
127
+ * `[delay]` is not `animation-delay` and not a second animation: the keyframe reaches
128
+ * its end at 50% and holds, so the wait is bought by making the animation twice as long.
129
+ * That is why this reads `speed + delay` and why the method is named for the cycle
130
+ * rather than for the sweep.
131
+ *
132
+ * Read from the inline declaration rather than from computed style, so a missing binding
133
+ * is reported as missing instead of being answered from the stylesheet.
134
+ */
135
+ getCycleDurationSeconds(): Promise<number>;
136
+ /**
137
+ * Whether the animation is stopped (`disabled`).
138
+ *
139
+ * Three names for one thing, which is why this method exists rather than a spec reading
140
+ * the class: the input is `disabled`, its JSDoc says "pause", and the DOM contract is
141
+ * `wr-shiny-text--paused`. Only the last of those is public API.
142
+ */
143
+ isPaused(): Promise<boolean>;
144
+ /** Whether the opt-in reached the class the `:hover` rule needs. */
145
+ pausesOnHover(): Promise<boolean>;
146
+ /**
147
+ * Whether the stripe bounces instead of restarting (`yoyo`).
148
+ *
149
+ * Defaults to `false` here — the opposite of the same-named input on `wr-gradient-text`,
150
+ * which is worth pinning in a spec that uses both. Together with {@link getDirection}
151
+ * this is the whole four-way matrix the stylesheet derives `animation-direction` from.
152
+ */
153
+ isYoyo(): Promise<boolean>;
154
+ /** Which way the stripe travels — `'left'` is the absence of the reverse modifier. */
155
+ getDirection(): Promise<WrShinyTextSweepDirection>;
156
+ /** The five stops of the stripe, positions attached, in gradient order. */
157
+ private gradientStops;
158
+ /** The gradient's arguments — the angle first, then the stops. */
159
+ private gradientArguments;
160
+ /** One of the host's two inline declarations, or a failure that says which one is missing. */
161
+ private require;
162
+ }
163
+
164
+ export { WrShinyTextHarness };
165
+ export type { WrShinyTextHarnessFilters, WrShinyTextSweepDirection };
@@ -52,8 +52,10 @@ declare class WrShinyText {
52
52
  * Gradient sweep over text. Applies a `background-clip: text` gradient
53
53
  * with a moving highlight — gives any text a subtle shimmer.
54
54
  *
55
- * The directive only adds the `wr-shimmer` host class. Pair with the
56
- * styles in `ngwr/animations` (which include the `wr-shimmer` keyframes).
55
+ * The directive only adds the `wr-shimmer` host class. Pair with the styles
56
+ * in `ngwr/shiny-text` (`@use 'ngwr/shiny-text'`), which carry the
57
+ * `.wr-shimmer` rule and its keyframes; the umbrella `@use 'ngwr'` forwards
58
+ * the same sheet.
57
59
  *
58
60
  * @example
59
61
  * ```html
@@ -75,17 +75,26 @@ declare class WrSidebar {
75
75
  private readonly uid;
76
76
  private readonly router;
77
77
  private readonly currentUrl;
78
- /** Last URL we auto-expanded — prevents re-opening a group the user collapsed. */
78
+ /**
79
+ * Last URL we resolved to a group — prevents re-opening one the user collapsed.
80
+ * A URL no entry claims is deliberately NOT recorded: see the effect below.
81
+ */
79
82
  private lastAutoUrl;
80
83
  constructor();
81
84
  protected isOpen(title: string): boolean;
82
85
  /**
83
86
  * Stable id for the group body, referenced by the toggle's `aria-controls`.
84
- * Scoped to this sidebar and stripped of anything that is not id-safe: a title
85
- * like `Data & charts` used to produce `wr-sidebar-group-data-&-charts`, which
86
- * no selector can address.
87
+ *
88
+ * Keyed by POSITION, not by the title. Slugging the title kept the id readable
89
+ * but was not injective: it lowercases and collapses every non-`[a-z0-9]` run,
90
+ * so `Data & charts` and `Data / charts` produced the same string, and a title
91
+ * with no ASCII alphanumerics at all — `Компоненты`, `数据` — produced the empty
92
+ * one. A whole Russian or Chinese sidebar therefore emitted N identical ids and
93
+ * every toggle's `aria-controls` resolved to the FIRST group's body. The toggle
94
+ * and its body read `$index` from the same `@for` iteration, so the two always
95
+ * name each other — reordering `entries` renumbers both together.
87
96
  */
88
- protected groupBodyId(title: string): string;
97
+ protected groupBodyId(index: number): string;
89
98
  protected toggleGroup(title: string): void;
90
99
  protected asItem(entry: WrSidebarEntry): WrSidebarItem;
91
100
  protected asGroup(entry: WrSidebarEntry): WrSidebarGroup;
@@ -69,6 +69,63 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
69
69
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, any>;
70
70
  /** Render the current value below the track. @default true */
71
71
  readonly showLabel: _angular_core.InputSignalWithTransform<boolean, any>;
72
+ /**
73
+ * Accessible name of the thumb — the single one, or the LOWER one in range
74
+ * mode. Falls back to `slider.label` / `slider.lower`.
75
+ */
76
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
77
+ /** Accessible name of the upper thumb in range mode. Falls back to `slider.upper`. */
78
+ readonly upperLabel: _angular_core.InputSignal<string | null>;
79
+ /**
80
+ * A thumb projects no text, so these ARE the accessible names — and they were
81
+ * hard-coded English with no key behind them, so every slider on a page
82
+ * announced the same untranslated "Value" whatever it controlled.
83
+ *
84
+ * Range mode reads `ariaLabel` as the LOWER end rather than as the whole
85
+ * control: a name given once must land on something, and naming both thumbs
86
+ * the same thing would read two different values under one name.
87
+ */
88
+ private readonly singleLabel;
89
+ private readonly lowerLabel;
90
+ protected readonly resolvedUpperLabel: _angular_core.Signal<string>;
91
+ protected readonly resolvedLowLabel: _angular_core.Signal<string>;
92
+ private readonly field;
93
+ /**
94
+ * Id the surrounding `<wr-form-field>`'s `<label for>` points at, put on the
95
+ * single thumb — the LOWER one in range mode, the same end `ariaLabel` names.
96
+ *
97
+ * The field renders its label before it can see what was projected into it, so
98
+ * the id travels the other way and the control adopts it, exactly as
99
+ * `[wrInput]` does. Without this the `for` named an element that was nowhere
100
+ * in the document: clicking the label did nothing, and the field's own text
101
+ * reached the thumb through no path at all.
102
+ *
103
+ * It lands on the THUMB rather than on the host because only a labelable
104
+ * element can be a label's target, and `<wr-slider>` is not one — a `for`
105
+ * pointing at the host would resolve and still name nothing. The thumb is a
106
+ * real `<button>`, so it is.
107
+ *
108
+ * What this does NOT change is the thumb's name: an `aria-label` outranks a
109
+ * `<label>` in the accname order, and the thumb keeps its own because the
110
+ * field cannot promise it has one to give — `<wr-form-field>` renders a label
111
+ * only when `label` is set, and a slider that traded a generic name for no
112
+ * name would be the worse bug. Set `[ariaLabel]` to the field's label where
113
+ * the two should read alike.
114
+ */
115
+ protected readonly thumbId: _angular_core.Signal<string | null>;
116
+ /**
117
+ * The field's error message, wired to the thumb the same way `wrInput` wires it
118
+ * to its native element.
119
+ *
120
+ * Without this the messages `<wr-form-field>` renders are visible and nothing
121
+ * else: a screen reader on the thumb never learns the field is invalid, nor
122
+ * what the message says. `aria-invalid` is keyed on the message EXISTING rather
123
+ * than on `errorKeys()`, because the field only publishes an id once it is
124
+ * showing something — announcing "invalid" while pointing at nothing is worse
125
+ * than staying quiet.
126
+ */
127
+ protected readonly describedBy: _angular_core.Signal<string | null>;
128
+ protected readonly ariaInvalid: _angular_core.Signal<"true" | null>;
72
129
  /**
73
130
  * Current value. Bound by `[formField]`, or two-way via `[(value)]`. Shape
74
131
  * follows `range`: a plain `number`, or `[low, high]` in range mode.
@@ -77,7 +134,22 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
77
134
  /** Emitted on blur so a bound field can mark itself touched. */
78
135
  readonly touch: _angular_core.OutputEmitterRef<void>;
79
136
  protected readonly low: _angular_core.WritableSignal<number>;
137
+ /**
138
+ * The high thumb's cell. Its literal default stands in for `maxValue()`,
139
+ * which cannot be read at field-initialisation time — see `highSeeded` and
140
+ * the constructor effect.
141
+ */
80
142
  protected readonly high: _angular_core.WritableSignal<number>;
143
+ /**
144
+ * Whether `high` has ever been told a real value by the model.
145
+ *
146
+ * `<wr-slider range [min]="200" [max]="300" />` binds no value, so the model
147
+ * holds its own scalar default and the tuple branch below never runs: `high`
148
+ * kept the literal 100, which is not inside every `[min, max]`. The thumb
149
+ * rendered off the track and the first interaction committed `[low, 100]` —
150
+ * a value the slider itself calls out of range.
151
+ */
152
+ private highSeeded;
81
153
  protected readonly track: _angular_core.Signal<ElementRef<HTMLElement>>;
82
154
  /**
83
155
  * Ambient reading direction. Optional so a bare `TestBed` — or any consumer
@@ -101,6 +173,17 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
101
173
  protected onPointerDown(event: PointerEvent, thumb: 'low' | 'high'): void;
102
174
  protected onTrackPointerDown(event: PointerEvent): void;
103
175
  protected onKey(event: KeyboardEvent, thumb: 'low' | 'high'): void;
176
+ /**
177
+ * A bound field learns it may show its validation copy from `touch`, and
178
+ * pointer-up plus a value-changing keypress cannot be the only sources: a
179
+ * slider tabbed into and out of without an arrow press left the field
180
+ * untouched forever — which is exactly the case `touched` exists for, and
181
+ * what this output has always documented itself as doing. `wr-knob` and
182
+ * `wr-rating` bind `(blur)` on the one element they own; this component has
183
+ * two thumbs, so it listens for the bubbling `focusout` on its host instead
184
+ * — and ignores the one that only moves focus from one thumb to the other.
185
+ */
186
+ protected onFocusOut(event: FocusEvent): void;
104
187
  private isRtl;
105
188
  /**
106
189
  * The value under a pointer, measured along the track's INLINE axis.
@@ -127,7 +210,7 @@ declare class WrSlider implements FormValueControl<WrSliderValue> {
127
210
  private percentOf;
128
211
  private emitChange;
129
212
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrSlider, never>;
130
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSlider, "wr-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
213
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrSlider, "wr-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "upperLabel": { "alias": "upperLabel"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
131
214
  }
132
215
 
133
216
  export { WrSlider };
@@ -0,0 +1,69 @@
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-sparkline>` a harness query matches. */
11
+ interface WrSparklineHarnessFilters extends BaseHarnessFilters {
12
+ /** Match the sparkline's accessible name — `null` for the decorative ones. */
13
+ readonly ariaLabel?: string | RegExp;
14
+ }
15
+
16
+ /**
17
+ * @license
18
+ *
19
+ * Use of this source code is governed by an MIT-style license that can be
20
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
21
+ */
22
+
23
+ /**
24
+ * Test harness for `<wr-sparkline>`.
25
+ *
26
+ * **The interesting assertion here is the ARIA one.** A sparkline is a trend line
27
+ * with no axes and no labels, so it is either given an `ariaLabel` — in which case it
28
+ * announces itself as an image — or it is decoration, and must be `aria-hidden` so a
29
+ * screen reader does not stop on a nameless graphic. The component switches between
30
+ * those two states on one input, and {@link isDecorative} is how a spec pins which
31
+ * one it is in.
32
+ *
33
+ * The line itself is an SVG path, and a path's `d` is not something a spec should
34
+ * assert: it is a rendering detail that changes with the viewBox, the stroke width
35
+ * and the smoothing. What IS worth asserting is whether the parts are there —
36
+ * {@link hasLine}, {@link hasArea}, {@link hasTip} — since each is an input the
37
+ * consumer set, and an empty dataset draws none of them.
38
+ *
39
+ * @see https://ngwr.dev/guides/testing
40
+ */
41
+ declare class WrSparklineHarness extends ComponentHarness {
42
+ static hostSelector: string;
43
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
44
+ static with(options?: WrSparklineHarnessFilters): HarnessPredicate<WrSparklineHarness>;
45
+ private readonly svg;
46
+ /** The name the chart announces, or `null` when it is decoration. */
47
+ getAccessibleName(): Promise<string | null>;
48
+ /** The role the chart claims — `img` when it is named, `null` when it is not. */
49
+ getRole(): Promise<string | null>;
50
+ /**
51
+ * Whether the chart is hidden from assistive tech.
52
+ *
53
+ * The other half of {@link getAccessibleName}, and the pairing worth asserting
54
+ * together: a named sparkline must NOT be hidden, and an unnamed one must be, or a
55
+ * screen reader announces a graphic with nothing to say about it.
56
+ */
57
+ isDecorative(): Promise<boolean>;
58
+ /** Whether a trend line was drawn — `false` for an empty or single-point dataset. */
59
+ hasLine(): Promise<boolean>;
60
+ /** Whether the area under the line is filled (`showArea`). */
61
+ hasArea(): Promise<boolean>;
62
+ /** Whether the last point is marked with a dot (`showTip`). */
63
+ hasTip(): Promise<boolean>;
64
+ /** The stroke colour as the component passed it through — a CSS value, not a resolved one. */
65
+ getColor(): Promise<string | null>;
66
+ }
67
+
68
+ export { WrSparklineHarness };
69
+ export type { WrSparklineHarnessFilters };
@@ -0,0 +1,199 @@
1
+ import { BaseHarnessFilters, ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
+ import { WrSpeedDialDirection } from 'ngwr/speed-dial';
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-speed-dial>` a harness query matches. */
12
+ interface WrSpeedDialHarnessFilters extends BaseHarnessFilters {
13
+ /** Match the trigger's accessible name — a string is an exact match, a RegExp is tested. */
14
+ readonly triggerLabel?: string | RegExp;
15
+ /** Match the direction the actions fan out. */
16
+ readonly direction?: WrSpeedDialDirection;
17
+ /** Match only open (`true`) or only closed (`false`) dials. */
18
+ readonly open?: boolean;
19
+ /** Match only enabled (`false`) or only disabled (`true`) dials. */
20
+ readonly disabled?: boolean;
21
+ }
22
+ /** Narrows which action inside a speed dial a harness query matches. */
23
+ interface WrSpeedDialActionHarnessFilters extends BaseHarnessFilters {
24
+ /** Match the action's accessible name — a string is an exact match, a RegExp is tested. */
25
+ readonly label?: string | RegExp;
26
+ /** Match only enabled (`false`) or only disabled (`true`) actions. */
27
+ readonly disabled?: boolean;
28
+ }
29
+
30
+ /**
31
+ * @license
32
+ *
33
+ * Use of this source code is governed by an MIT-style license that can be
34
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
35
+ */
36
+
37
+ /**
38
+ * Test harness for one action inside a {@link WrSpeedDialHarness}.
39
+ *
40
+ * The label is read from `aria-label` rather than from the button's text, and that
41
+ * is the whole point of the control: an action renders an ICON, or — with no icon —
42
+ * the first glyph of its label. Its visible text is therefore `"S"` for "Share", or
43
+ * nothing at all. {@link getInitial} answers what is drawn; {@link getLabel} answers
44
+ * what it is.
45
+ *
46
+ * @see https://ngwr.dev/guides/testing
47
+ */
48
+ declare class WrSpeedDialActionHarness extends ComponentHarness {
49
+ /** The action button. */
50
+ static hostSelector: string;
51
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
52
+ static with(options?: WrSpeedDialActionHarnessFilters): HarnessPredicate<WrSpeedDialActionHarness>;
53
+ /** The action's accessible name — what a screen reader reads, and what `title` shows. */
54
+ getLabel(): Promise<string | null>;
55
+ /** Whether the action draws an icon rather than a letter. */
56
+ hasIcon(): Promise<boolean>;
57
+ /** The icon's registered name, from `wr-icon`'s reflected `data-icon`, or `null`. */
58
+ getIconName(): Promise<string | null>;
59
+ /**
60
+ * The single glyph drawn in place of a missing icon, or `null` when there is one.
61
+ *
62
+ * A GLYPH, not a character: the component splits the label by code point, so an
63
+ * emoji label draws the whole emoji rather than the broken half of a surrogate pair.
64
+ */
65
+ getInitial(): Promise<string | null>;
66
+ /**
67
+ * Whether the action refuses interaction.
68
+ *
69
+ * Every action follows the DIAL's `disabled` — there is no per-action flag — so
70
+ * this is really "is the dial disabled", asked at the action. Worth having anyway:
71
+ * it is what the DOM and the CDK consult before delivering a click.
72
+ */
73
+ isDisabled(): Promise<boolean>;
74
+ /** Pick this action — emitting `pick` and closing the dial. */
75
+ click(): Promise<void>;
76
+ /** Move keyboard focus to the action. */
77
+ focus(): Promise<void>;
78
+ /** Whether the action currently holds focus. */
79
+ isFocused(): Promise<boolean>;
80
+ }
81
+
82
+ /**
83
+ * @license
84
+ *
85
+ * Use of this source code is governed by an MIT-style license that can be
86
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
87
+ */
88
+
89
+ /**
90
+ * Test harness for `<wr-speed-dial>` — the floating trigger and the actions that fan
91
+ * out of it.
92
+ *
93
+ * **The actions never leave the DOM.** They are hidden with `visibility`, which is
94
+ * what actually takes them out of the tab order and the accessibility tree —
95
+ * `opacity: 0` alone would leave them focusable — and CSS is exactly what a unit
96
+ * test does not have. So a closed dial's buttons are queryable, clickable and
97
+ * readable from a spec while being unreachable in a browser. {@link getActions} and
98
+ * {@link pick} therefore REFUSE while the dial is closed rather than answering with
99
+ * elements nobody can see; open it first, which is what a user has to do too.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * const dial = await loader.getHarness(WrSpeedDialHarness);
104
+ *
105
+ * await dial.open();
106
+ * expect(await dial.getActionLabels()).toEqual(['Share', 'Copy link']);
107
+ *
108
+ * await dial.pick({ label: 'Share' });
109
+ * expect(await dial.isOpen()).toBe(false);
110
+ * ```
111
+ *
112
+ * @see https://ngwr.dev/guides/testing
113
+ */
114
+ declare class WrSpeedDialHarness extends ComponentHarness {
115
+ static hostSelector: string;
116
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
117
+ static with(options?: WrSpeedDialHarnessFilters): HarnessPredicate<WrSpeedDialHarness>;
118
+ private readonly trigger;
119
+ private readonly menu;
120
+ /** Whether the dial is fanned out, from the trigger's `aria-expanded`. */
121
+ isOpen(): Promise<boolean>;
122
+ /** The direction the actions travel, from the host modifier. */
123
+ getDirection(): Promise<WrSpeedDialDirection>;
124
+ /**
125
+ * The trigger's accessible name.
126
+ *
127
+ * The trigger is icon-only, so this is its ONLY name — there is no text to fall
128
+ * back on, and a dial that loses it is announced as an unnamed button.
129
+ */
130
+ getTriggerLabel(): Promise<string | null>;
131
+ /** The trigger icon's registered name, from `wr-icon`'s reflected `data-icon`. */
132
+ getTriggerIcon(): Promise<string | null>;
133
+ /** Whether the dial refuses interaction, from the trigger's own `disabled` property. */
134
+ isDisabled(): Promise<boolean>;
135
+ /** Whether the host is padded for the device's safe area (`safeArea`). */
136
+ hasSafeArea(): Promise<boolean>;
137
+ /**
138
+ * The role the action list announces — `list`.
139
+ *
140
+ * Worth asking despite being a plain `<ul>`: the list is styled `list-style: none`,
141
+ * which drops the implicit list semantics in Safari, so the role is written out. It
142
+ * is deliberately NOT `menu` — that role promises arrows, Home/End and a single tab
143
+ * stop, none of which this component has.
144
+ */
145
+ getMenuRole(): Promise<string | null>;
146
+ /**
147
+ * Whether the trigger's `aria-controls` names THIS dial's action list, and nothing
148
+ * else on the page.
149
+ *
150
+ * Both halves matter. The id is resolved inside the host first, so a trigger
151
+ * pointing at a SIBLING dial's list — which resolves perfectly well from the
152
+ * document — fails here. Then it is counted across the document, because two lists
153
+ * answering to one id hand every reference to whichever comes first.
154
+ */
155
+ isMenuBound(): Promise<boolean>;
156
+ /**
157
+ * The actions, in DOM order.
158
+ *
159
+ * Throws while the dial is closed. The buttons are still in the DOM then — they
160
+ * have to be, for the fan-out to animate — and jsdom applies no `visibility`, so
161
+ * they would come back looking perfectly reachable when a real user cannot tab to
162
+ * one. A spec that read them closed would pass on a dial that never opens.
163
+ */
164
+ getActions(filters?: WrSpeedDialActionHarnessFilters): Promise<WrSpeedDialActionHarness[]>;
165
+ /** The accessible names of the actions, in DOM order. Throws while closed. */
166
+ getActionLabels(): Promise<(string | null)[]>;
167
+ /** How many actions the dial holds — readable while closed, since it is not a reach. */
168
+ getActionCount(): Promise<number>;
169
+ /** Open the dial. An already-open one is left alone; a disabled one throws. */
170
+ open(): Promise<void>;
171
+ /** Close the dial. An already-closed one is left alone. */
172
+ close(): Promise<void>;
173
+ /** Click the trigger once, whichever way that takes it. */
174
+ toggle(): Promise<void>;
175
+ /**
176
+ * Pick the first action matching the filters — emitting `pick` and closing the dial.
177
+ *
178
+ * Opens first if it has to, the way `WrDropdownHarness.clickItem` does: a spec that
179
+ * says "pick Share" means the whole gesture. Throws when nothing matches, naming
180
+ * what the dial does offer.
181
+ */
182
+ pick(filters: WrSpeedDialActionHarnessFilters): Promise<void>;
183
+ /**
184
+ * Press Escape — closing the dial and putting focus back on the trigger.
185
+ *
186
+ * Sent to the host, which is where the component listens. The focus return is the
187
+ * half worth asserting: the actions are ordinary tab stops, so without it a keyboard
188
+ * user has to walk through every action to leave.
189
+ */
190
+ sendEscape(): Promise<void>;
191
+ /** Move keyboard focus to the trigger. */
192
+ focusTrigger(): Promise<void>;
193
+ /** Whether the trigger currently holds focus. */
194
+ isTriggerFocused(): Promise<boolean>;
195
+ private requireOpen;
196
+ }
197
+
198
+ export { WrSpeedDialActionHarness, WrSpeedDialHarness };
199
+ export type { WrSpeedDialActionHarnessFilters, WrSpeedDialHarnessFilters };
@@ -11,6 +11,24 @@ interface WrSpeedDialAction {
11
11
  /** Direction the action buttons fan out. */
12
12
  type WrSpeedDialDirection = 'up' | 'down' | 'left' | 'right';
13
13
 
14
+ /**
15
+ * Floating action button that expands into a fan of secondary actions on click.
16
+ * Place inside a positioned container or near `position: fixed` — the component
17
+ * itself doesn't pin to the viewport.
18
+ *
19
+ * @example
20
+ * ```html
21
+ * <wr-speed-dial
22
+ * [actions]="[
23
+ * { id: 'new', label: 'New', icon: 'add' },
24
+ * { id: 'edit', label: 'Edit', icon: 'cog' }
25
+ * ]"
26
+ * (pick)="onPick($event)"
27
+ * />
28
+ * ```
29
+ *
30
+ * @see https://ngwr.dev/reference/components/speed-dial
31
+ */
14
32
  declare class WrSpeedDial {
15
33
  readonly actions: _angular_core.InputSignal<readonly WrSpeedDialAction[]>;
16
34
  /**
@@ -38,14 +56,15 @@ declare class WrSpeedDial {
38
56
  /** Id the trigger's `aria-controls` points at. */
39
57
  protected readonly menuId: string;
40
58
  protected readonly triggerEl: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
59
+ private readonly host;
41
60
  constructor();
42
61
  protected readonly classes: _angular_core.Signal<string>;
43
62
  protected onTrigger(): void;
44
63
  protected onPick(action: WrSpeedDialAction): void;
45
64
  /**
46
- * `role="menu"` promises a way out, and the actions are ordinary buttons in the tab
47
- * order — without this a keyboard user who opened the dial had to tab through every
48
- * action to leave it.
65
+ * Escape closes the dial and hands the caret back. The actions are ordinary buttons
66
+ * in the tab order, so without this a keyboard user who opened the dial had to tab
67
+ * through every action to leave it.
49
68
  */
50
69
  protected onKeydown(event: KeyboardEvent): void;
51
70
  /**