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
@@ -66,7 +66,33 @@ declare class WrContextMenu {
66
66
  */
67
67
  protected readonly openMenuId: _angular_core.WritableSignal<string | null>;
68
68
  private overlayRef;
69
- private closingTimer;
69
+ /**
70
+ * The open menu's subscription to CDK's keyboard dispatcher, held so that
71
+ * `closeOverlay()` can drop it — see the unsubscribe there for why the pane's
72
+ * own disposal is 220 ms too late.
73
+ */
74
+ private rootKeys;
75
+ /**
76
+ * Where the keyboard was at the moment this menu took it, so a close can put
77
+ * it back there. Null when it was nowhere in particular (`<body>`) or already
78
+ * inside a menu pane, neither of which is a place to return to.
79
+ */
80
+ private restoreFocusTo;
81
+ /**
82
+ * Panes waiting out their exit animation, keyed by the timer that disposes
83
+ * them.
84
+ *
85
+ * A SET, because one handle cannot hold two closings. It used to be a single
86
+ * `closingTimer`, and the second close inside the 220ms window cleared the
87
+ * first one's timer instead of its own — so the previous pane's `dispose()`
88
+ * never ran. `onContextMenu` closes and immediately re-opens, so right-clicking
89
+ * one target faster than the animation orphaned a pane per click: an
90
+ * `opacity: 0` box with `pointer-events: auto` eating clicks, a never-destroyed
91
+ * embedded view, a capture-phase document scroll listener still moving it, and
92
+ * an undetached ref still registered with CDK's keyboard dispatcher — which
93
+ * swallowed Escape for the whole page.
94
+ */
95
+ private readonly closingPanes;
70
96
  private leaveTimer;
71
97
  private pressTimer;
72
98
  private pressX;
@@ -135,6 +161,24 @@ declare class WrContextMenu {
135
161
  close(): void;
136
162
  private openOverlay;
137
163
  private closeOverlay;
164
+ /**
165
+ * Put the keyboard back where it came from.
166
+ *
167
+ * The element that had it when the menu opened comes first: a context menu
168
+ * hangs on a REGION — a card, a table row — and Shift+F10 / the Menu key fires
169
+ * `contextmenu` at whatever control inside it the user was actually on, which
170
+ * is their place in the page.
171
+ *
172
+ * The trigger is the fallback, and it needs help to be one. `[wrContextMenu]`
173
+ * adds no `tabindex` and every shape the docs ship is a plain `<div>`, so
174
+ * `focus()` on it does nothing at all — the handback silently missed, leaving
175
+ * the caret in the disposing pane and then on `<body>`, which is the outcome
176
+ * the call is there to prevent. Lending it `tabindex="-1"` for the call and
177
+ * taking that back on blur keeps the consumer's DOM as they wrote it; a
178
+ * permanent `tabindex="0"` would make every right-clickable region a tab stop,
179
+ * which is their decision and not the library's.
180
+ */
181
+ private handBackFocus;
138
182
  private cancelLeaveTimer;
139
183
  private scheduleLeave;
140
184
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrContextMenu, never>;
@@ -177,9 +221,17 @@ declare class WrContextMenuItem {
177
221
  private readonly scrollStrategies;
178
222
  private readonly destroyRef;
179
223
  private submenuRef;
224
+ private submenuKeys;
180
225
  private openTimer;
181
226
  private closeTimer;
182
227
  protected submenuOpen: boolean;
228
+ /**
229
+ * Whether the pending open was asked for by the keyboard (→ / Enter / Space)
230
+ * rather than by hover — only then does the submenu take focus, the same rule
231
+ * `wr-dropdown` applies to its own open. Sweeping the cursor across a row must
232
+ * show its submenu without yanking the caret out of it.
233
+ */
234
+ private openedByKeyboard;
183
235
  /**
184
236
  * Id of the submenu's menu element while it is open, published on the item as
185
237
  * `aria-controls` — the same contract the root trigger keeps (see
@@ -243,6 +295,24 @@ declare class WrContextMenuItem {
243
295
  private cancelOpen;
244
296
  private cancelClose;
245
297
  private openSubmenu;
298
+ /**
299
+ * @internal Keys routed here while this submenu is the topmost overlay: the
300
+ * arrows walk the rows of the pane the caret is in, and Escape or the arrow
301
+ * pointing BACK the way the menu cascades steps out one level, returning the
302
+ * cursor to the row that owns the pane when the cursor was inside it.
303
+ *
304
+ * Escape closes this level only, not the whole chain — the APG's rule for a
305
+ * submenu. It reaches this handler rather than the root's because the
306
+ * dispatcher stops at the topmost overlay that listens, which is now this one.
307
+ *
308
+ * Which is also why the arrows are aimed at the pane holding the caret rather
309
+ * than at this one. The dispatcher routes by stacking order, not by focus, and
310
+ * a HOVER-opened submenu is topmost while focus is deliberately still on the
311
+ * root row the pointer swept off (see `openedByKeyboard`) — so ArrowDown used
312
+ * to jump into this pane's first row instead of moving down the menu the user
313
+ * is in. Same reason `wr-dropdown`'s menu handler checks ownership.
314
+ */
315
+ private onSubmenuKeydown;
246
316
  /** Bound handlers (= preserves identity for removeEventListener). */
247
317
  private readonly onSubmenuEnter;
248
318
  private readonly onSubmenuLeave;
@@ -163,6 +163,7 @@ declare class WrCountUp {
163
163
  private readonly host;
164
164
  private readonly locale;
165
165
  private readonly isBrowser;
166
+ private readonly platform;
166
167
  private readonly destroyRef;
167
168
  private rafId;
168
169
  private delayTimer;
@@ -1,12 +1,34 @@
1
- import { WrDateAdapter, WrDateFormat } from 'ngwr/date-adapter';
1
+ import { WrDateAdapter, WrDateFormat } from 'ngwr/date';
2
2
  import * as i0 from '@angular/core';
3
3
  import { EnvironmentProviders } from '@angular/core';
4
4
 
5
5
  /**
6
6
  * {@link WrDateAdapter} backed by `date-fns`. Same `Date` value type as the
7
- * native adapter, but defers all math, formatting, and parsing to date-fns
8
- * — pick this when you want more robust locale-aware patterns (`P`, `PP`,
9
- * `PPP`, `p`) without writing them by hand.
7
+ * native adapter, but defers all math, formatting, and parsing to date-fns —
8
+ * pick this when you want its long patterns (`P`, `PP`, `PPP`, `p`) without
9
+ * writing them by hand.
10
+ *
11
+ * **{@link WR_DATE_LOCALE} does not reach `format` or `parse`, and that is not
12
+ * an oversight.** date-fns resolves those patterns against a date-fns `Locale`
13
+ * OBJECT rather than a BCP 47 tag, and the objects are separate modules —
14
+ * mapping a tag onto one would mean importing all of them, which defeats the
15
+ * tree-shaking that is the reason this is an opt-in entry point. So the named
16
+ * formats render AND read in en-US whatever the tag says, while
17
+ * `getFirstDayOfWeek`, `getDayOfWeekNames` and `getMonthNames` go through `Intl`
18
+ * and do honour it: a calendar heads its columns `пн вт ср` beside a trigger
19
+ * reading `08/11/2025`. Reading is the sharper edge — `11/08/2025` typed by a
20
+ * user in a dd/MM locale parses as 8 November, valid and wrong.
21
+ *
22
+ * The lever is date-fns's own module default, and the adapter passing no locale
23
+ * is precisely what keeps it working. Set it once at bootstrap, or take
24
+ * `provideWrLuxonAdapter()`, which forwards the tag itself:
25
+ *
26
+ * ```ts
27
+ * import { setDefaultOptions } from 'date-fns';
28
+ * import { ru } from 'date-fns/locale';
29
+ *
30
+ * setDefaultOptions({ locale: ru });
31
+ * ```
10
32
  *
11
33
  * @example
12
34
  * ```ts
@@ -56,8 +78,13 @@ declare class WrDateFnsAdapter extends WrDateAdapter<Date> {
56
78
 
57
79
  /**
58
80
  * Register the {@link WrDateFnsAdapter} so date-pickers / calendars in this
59
- * app use `date-fns` for all math and formatting. Pass `locale` to override
60
- * the BCP 47 tag.
81
+ * app use `date-fns` for all math and formatting.
82
+ *
83
+ * `locale` sets {@link WR_DATE_LOCALE}, which this adapter reads for the first
84
+ * day of the week and nothing else — its `format` and `parse` do not pass a
85
+ * locale to date-fns. For localized month names and patterns, set date-fns's own
86
+ * module default with `setDefaultOptions`, or use the luxon adapter, which does
87
+ * thread the tag through everything.
61
88
  *
62
89
  * @example
63
90
  * ```ts
@@ -1,5 +1,5 @@
1
1
  import { DateTime } from 'luxon';
2
- import { WrDateAdapter, WrDateFormat } from 'ngwr/date-adapter';
2
+ import { WrDateAdapter, WrDateFormat } from 'ngwr/date';
3
3
  import * as i0 from '@angular/core';
4
4
  import { EnvironmentProviders } from '@angular/core';
5
5
 
@@ -1,4 +1,6 @@
1
- import { BaseHarnessFilters, ComponentHarness, HarnessPredicate, TestElement, HarnessLoader } from '@angular/cdk/testing';
1
+ import { WrCalendarDayHarness } from 'ngwr/calendar/testing';
2
+ export { WrCalendarDayHarness as WrDatePickerDayHarness } from 'ngwr/calendar/testing';
3
+ import { BaseHarnessFilters, ComponentHarness, TestElement, HarnessLoader, HarnessPredicate } from '@angular/cdk/testing';
2
4
 
3
5
  /**
4
6
  * @license
@@ -77,68 +79,6 @@ interface WrDatePickerTimeFields {
77
79
  readonly seconds?: number;
78
80
  }
79
81
 
80
- /**
81
- * @license
82
- *
83
- * Use of this source code is governed by an MIT-style license that can be
84
- * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
85
- */
86
-
87
- /**
88
- * Test harness for one day cell of the calendar inside a date-picker popup.
89
- *
90
- * Reached through `WrDatePickerHarness.getDay()` / `getDays()` (or the range
91
- * picker's), which scope it to ONE picker's panel — the cells are in the overlay
92
- * container, so a bare query would answer with whichever picker opened first.
93
- *
94
- * State is read the way a screen reader reads it (`role`, `aria-selected`,
95
- * `aria-disabled`) with the `.wr-calendar__day--*` modifiers filling in what
96
- * ARIA has no word for: today, the spill days of the neighbouring months, and
97
- * the interior of a picked range.
98
- *
99
- * @see https://ngwr.dev/guides/testing
100
- */
101
- declare class WrDatePickerDayHarness extends ComponentHarness {
102
- static hostSelector: string;
103
- /** Build a predicate that narrows the query. */
104
- static with(options?: WrDatePickerDayHarnessFilters): HarnessPredicate<WrDatePickerDayHarness>;
105
- /** The day number as rendered. */
106
- getText(): Promise<string>;
107
- /** The day number as a number, for mapping a list of cells to dates. */
108
- getDayOfMonth(): Promise<number>;
109
- /** `'gridcell'` — the cell is a button, and the grid semantics are what a spec should assert. */
110
- getRole(): Promise<string | null>;
111
- /** Whether this day is (one end of) the current selection. */
112
- isSelected(): Promise<boolean>;
113
- /**
114
- * Whether the day refuses selection — `min` / `max` or `dateFilter` ruled it
115
- * out, or the whole calendar is disabled.
116
- */
117
- isDisabled(): Promise<boolean>;
118
- /** Whether the cell is today's date. */
119
- isToday(): Promise<boolean>;
120
- /**
121
- * Whether the cell belongs to a neighbouring month. The grid is always 6x7, so
122
- * every month is padded with days that are selectable but not "in" the month —
123
- * which is why {@link WrDatePickerHarness.getDay} skips them.
124
- */
125
- isOutOfMonth(): Promise<boolean>;
126
- /** Whether the day lies strictly between the two ends of a picked range. */
127
- isInRange(): Promise<boolean>;
128
- /**
129
- * Whether this is the roving cell — the grid's single tab stop, and where the
130
- * arrow keys move from.
131
- *
132
- * At most ONE cell answers `true`, and it is not always one: the calendar's
133
- * roving date does not follow `next()` / `previous()`, so a grid navigated away
134
- * from that month has no active cell (and, deliberately or not, no tab stop)
135
- * until a cell is clicked or the arrows move it.
136
- */
137
- isActive(): Promise<boolean>;
138
- /** Click the cell. A disabled cell swallows the click — assert, do not assume. */
139
- click(): Promise<void>;
140
- }
141
-
142
82
  /**
143
83
  * @license
144
84
  *
@@ -161,18 +101,23 @@ type Unit = (typeof UNITS)[number];
161
101
  * independently instead of by CSS nth-of-type gymnastics.
162
102
  *
163
103
  * Units are addressed by position, not by the boxes' `aria-label`: every string
164
- * in this panel is still hard-coded English (the box labels, the steppers'
165
- * "Increment hours", the AM/PM text), so keying on them would make this harness
166
- * the thing that breaks when they are moved into the i18n catalog. Column order
167
- * is the layout contract.
104
+ * in this panel now resolves through the i18n catalog (`datePicker.hours`,
105
+ * `datePicker.incrementHours`, `datePicker.am` …), so keying on them would make
106
+ * this harness answer in whatever locale the app under test is configured for.
107
+ * Column order is the layout contract.
168
108
  *
169
109
  * @internal
170
110
  */
171
111
  declare class WrTimePanelHarness extends ComponentHarness {
172
112
  static hostSelector: string;
173
- /** The stepper's value as `HH:MM`, plus `:SS` and ` AM`/` PM` when those columns exist. */
113
+ /** The stepper's value as `HH:MM`, plus `:SS` and a space-joined {@link getMeridiem} when those columns exist. */
174
114
  getTimeText(): Promise<string>;
175
- /** `'AM'` / `'PM'`, or `null` when the stepper is in 24-hour mode. */
115
+ /**
116
+ * The meridiem column's rendered text, or `null` when the stepper is in
117
+ * 24-hour mode. `'AM'` / `'PM'` on the built-in fallbacks — it reads whatever
118
+ * `datePicker.am` / `datePicker.pm` resolve to, so a configured catalog
119
+ * changes the answer.
120
+ */
176
121
  getMeridiem(): Promise<string | null>;
177
122
  /**
178
123
  * Type into the boxes named by `fields`, leaving the rest alone.
@@ -277,12 +222,12 @@ declare abstract class WrDatePickerHarnessBase extends ComponentHarness {
277
222
  * them, since the grid is always six weeks and pads into the neighbouring
278
223
  * months.
279
224
  */
280
- getDays(filters?: WrDatePickerDayHarnessFilters): Promise<WrDatePickerDayHarness[]>;
225
+ getDays(filters?: WrDatePickerDayHarnessFilters): Promise<WrCalendarDayHarness[]>;
281
226
  /**
282
227
  * One day of the month on show. The padding days of the neighbouring months are
283
228
  * skipped, so `getDay(1)` is the 1st of THIS month and never the 1st of the next.
284
229
  */
285
- getDay(dayOfMonth: number): Promise<WrDatePickerDayHarness>;
230
+ getDay(dayOfMonth: number): Promise<WrCalendarDayHarness>;
286
231
  /** Click a day of the month on show. */
287
232
  selectDay(dayOfMonth: number): Promise<void>;
288
233
  /** The trigger button. Both components render it with the same class. */
@@ -514,5 +459,5 @@ declare class WrDateRangePickerHarness extends WrDatePickerHarnessBase {
514
459
  private timePanel;
515
460
  }
516
461
 
517
- export { WrDatePickerDayHarness, WrDatePickerHarness, WrDateRangePickerHarness };
462
+ export { WrDatePickerHarness, WrDateRangePickerHarness };
518
463
  export type { WrDatePickerDayHarnessFilters, WrDatePickerHarnessFilters, WrDatePickerTimeFields, WrDateRangePickerHarnessFilters };
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ElementRef } from '@angular/core';
3
3
  import { FormValueControl } from '@angular/forms/signals';
4
- import { WrDateFormat } from 'ngwr/date-adapter';
4
+ import { WrDateFormat } from 'ngwr/date';
5
5
 
6
6
  /**
7
7
  * Unified date / time / date-time picker. Same `<input>` + popover skeleton
@@ -143,6 +143,10 @@ declare class WrDatePicker implements FormValueControl<Date | null> {
143
143
  * skip the echo of our own edits (so a live keystroke's raw text is never
144
144
  * reformatted mid-type). */
145
145
  private lastValue;
146
+ /** The format the sync effect last rendered with. Paired with `lastValue`
147
+ * because the echo guard has to answer "is the display still current", and a
148
+ * `[format]` / `[mode]` change makes it stale with the value untouched. */
149
+ private lastFormat;
146
150
  constructor();
147
151
  protected onInput(event: Event): void;
148
152
  protected onBlur(): void;
@@ -320,9 +324,9 @@ declare class WrDateRangePicker implements FormValueControl<WrDateRange | null>
320
324
  /** Resolved format — falls back to a mode-appropriate default. */
321
325
  protected readonly resolvedFormat: _angular_core.Signal<string>;
322
326
  protected readonly isDateTime: _angular_core.Signal<boolean>;
323
- protected readonly triggerLabel: string;
324
- protected readonly startLabel: string;
325
- protected readonly endLabel: string;
327
+ protected readonly triggerLabel: _angular_core.Signal<string>;
328
+ protected readonly startLabel: _angular_core.Signal<string>;
329
+ protected readonly endLabel: _angular_core.Signal<string>;
326
330
  private readonly panelLabelRange;
327
331
  private readonly panelLabelRangeDateTime;
328
332
  /**
@@ -145,6 +145,18 @@ declare class WrNativeDateAdapter extends WrDateAdapter<Date> {
145
145
  format(date: Date, formatKeyOrString: WrDateFormat | (string & {})): string;
146
146
  parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): Date | null;
147
147
  getFirstDayOfWeek(): number;
148
+ /**
149
+ * One `Intl.DateTimeFormat` per named format, built once.
150
+ *
151
+ * Constructing one is the expensive part of `format()`, and this adapter is
152
+ * called per CELL: `wr-event-calendar` builds an `aria-label` for every time
153
+ * slot on every day, so a week view asked for hundreds of identical
154
+ * formatters. `locale` is injected once and never changes for the life of the
155
+ * adapter, so the cache needs no invalidation — that is the whole reason it
156
+ * can be this simple.
157
+ */
158
+ private readonly formatters;
159
+ private intl;
148
160
  getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[];
149
161
  getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[];
150
162
  private formatWithTokens;
@@ -185,12 +197,19 @@ declare function provideWrDateAdapter(options?: WrDateAdapterOptions): Environme
185
197
  */
186
198
 
187
199
  /**
188
- * BCP 47 locale tag used by {@link WrDateAdapter} implementations for
189
- * formatting, parsing, and locale-derived defaults (first day of week,
190
- * month / day names). Defaults to `navigator.language` in the browser and
191
- * `'en-US'` on the server.
200
+ * BCP 47 locale tag the {@link WrDateAdapter} implementations read. Defaults to
201
+ * `navigator.language` in the browser and `'en-US'` on the server; override via
202
+ * {@link provideWrDateAdapter}'s `locale` option.
192
203
  *
193
- * Override via {@link provideWrDateAdapter}'s `locale` option.
204
+ * **How far it reaches depends on the adapter, and the difference matters.**
205
+ * The luxon adapter threads it through everything — every `DateTime` is
206
+ * constructed with it, and `format` / `parse` call `setLocale`. The date-fns
207
+ * adapter reads it only for locale-DERIVED defaults (first day of week); its
208
+ * `format` and `parse` pass no locale to date-fns, so they stay on that
209
+ * library's module default. Setting this token and expecting French month names
210
+ * out of `WrDateFnsAdapter` gets English ones, and the parse side of that
211
+ * mismatch is silent rather than loud — see the adapter's own class docs for the
212
+ * lever (`setDefaultOptions`).
194
213
  */
195
214
  declare const WR_DATE_LOCALE: InjectionToken<string>;
196
215
 
@@ -0,0 +1,222 @@
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-decrypt-text>` a harness query matches. */
11
+ interface WrDecryptTextHarnessFilters extends BaseHarnessFilters {
12
+ /**
13
+ * Match the string the component ANNOUNCES — the readable copy, never the scramble.
14
+ * A string is an exact match, a RegExp is tested.
15
+ *
16
+ * This is the only stable thing to address one of these by: the visible layer is a
17
+ * fresh random draw on every tick, so a filter written against it would match a
18
+ * different element each time it ran, or none at all.
19
+ */
20
+ readonly text?: string | RegExp;
21
+ /**
22
+ * Match only settled (`true`) or only scrambled (`false`) instances — the way to pick
23
+ * out the one that has not been revealed yet on a page holding several.
24
+ *
25
+ * Read from the encrypted characters rather than from the glyphs, so it needs no
26
+ * `Math.random` stub. An instance that rendered no characters at all matches NEITHER
27
+ * value: "nothing is encrypted" is true of nothing, and a query is the last place that
28
+ * vacuity should quietly hand back a match.
29
+ */
30
+ readonly revealed?: boolean;
31
+ }
32
+
33
+ /**
34
+ * @license
35
+ *
36
+ * Use of this source code is governed by an MIT-style license that can be
37
+ * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE
38
+ */
39
+
40
+ /**
41
+ * Test harness for `<wr-decrypt-text>`.
42
+ *
43
+ * **Two layers, two questions, and they are meant to disagree.** The component renders
44
+ * the real string once in a visually-hidden span and the scramble in a parallel
45
+ * `aria-hidden` layer, so {@link getAccessibleText} is what a screen reader hears and
46
+ * {@link getRenderedText} is what a sighted reader sees. Mid-reveal the second is
47
+ * literal gibberish while the first must be untouched — that is the contract, and it is
48
+ * the half nobody looks at. A spec asserting only the visible glyphs would pass on a
49
+ * component that announced `XQ#PZ`.
50
+ *
51
+ * **Prefer the class over the glyphs.** {@link getRevealedIndices},
52
+ * {@link getEncryptedCount} and {@link isFullyRevealed} read
53
+ * `.wr-decrypt-text__char--encrypted`, which is deterministic with no stubbing at all —
54
+ * they are what tell `revealDirection` `'start'` from `'end'` from `'center'`, one index
55
+ * per tick. {@link getRenderedText} reads the glyphs themselves, which are a fresh
56
+ * `Math.random()` draw per tick, so stub it (`vi.spyOn(Math, 'random')
57
+ * .mockReturnValue(0)`) before asserting a string.
58
+ *
59
+ * **The clock is the spec's, not the harness's.** The reveal is a `setInterval` this
60
+ * class does not own, so there is no `advance(ms)` and no `waitUntilRevealed()`: one
61
+ * would flake on a loaded machine and the other would silently require fake timers to
62
+ * have been installed. Fake `setInterval` / `clearInterval` and nothing else — faking
63
+ * the microtask queue freezes the stabilization every `await harness.*()` runs through —
64
+ * then advance the clock yourself between reads.
65
+ *
66
+ * **There is no keyboard path, and this harness does not pretend there is one.**
67
+ * {@link hover}, {@link mouseAway} and {@link click} are the component's only triggers;
68
+ * with `animateOn="click"` the host takes a click handler while carrying no role, no
69
+ * `tabindex` and no keydown handler, so a `focus()` / `sendKeys(Enter)` affordance here
70
+ * would make a spec pass while a keyboard or switch user could not reveal the text at
71
+ * all. There is no `enterViewport()` either: `'view'` and `'inViewHover'` hang off an
72
+ * `IntersectionObserver` jsdom does not implement, so the spec stubs the global and
73
+ * fires it.
74
+ *
75
+ * **Also deliberately absent:** `isAnimating()` — the component has such a signal and it
76
+ * never reaches the DOM, and deriving it from "something is encrypted" would be wrong in
77
+ * exactly the interesting case, since `animateOn="click"` rests fully encrypted and
78
+ * perfectly still. `getSpeed()` / `getMaxIterations()` / `getRevealDirection()` /
79
+ * `getClickMode()` / `getAnimateOn()` — inputs that are never reflected anywhere, so
80
+ * reporting them would mean reading the component instance rather than the rendered
81
+ * control; they are observable as behaviour, which is what the methods above measure.
82
+ * `getScrambleAlphabet()` — the pool is internal and each frame shows one random draw
83
+ * from it, so any reconstruction is a guess that gets worse the shorter the string.
84
+ * `getCharColors()` / `isDimmed()` — the `--encrypted` rule is deliberately EMPTY, a
85
+ * styling hook for consumers, so there is nothing painted to read in any environment.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * const secret = await loader.getHarness(WrDecryptTextHarness.with({ text: 'Hello' }));
90
+ *
91
+ * await secret.hover();
92
+ * vi.advanceTimersByTime(50);
93
+ *
94
+ * expect(await secret.getRevealedIndices()).toEqual([0]); // sequential, from the start
95
+ * expect(await secret.getAccessibleText()).toBe('Hello'); // untouched throughout
96
+ * ```
97
+ *
98
+ * @see https://ngwr.dev/guides/testing
99
+ */
100
+ declare class WrDecryptTextHarness extends ComponentHarness {
101
+ static hostSelector: string;
102
+ /** Build a predicate that narrows the query — pass to `getHarness` / `getAllHarnesses`. */
103
+ static with(options?: WrDecryptTextHarnessFilters): HarnessPredicate<WrDecryptTextHarness>;
104
+ private readonly chars;
105
+ private readonly encrypted;
106
+ /**
107
+ * The real string, as the one readable copy holds it.
108
+ *
109
+ * The single highest-value assertion here: it must stay equal to the `text` input on
110
+ * every frame, while the visible layer is unreadable by design. Lose this span and the
111
+ * component announces nothing at all — every drawn character sits under `aria-hidden`,
112
+ * so no other part of the DOM would change.
113
+ *
114
+ * Untrimmed, so that it can be compared against {@link getRenderedText} without one
115
+ * side of the comparison quietly forgiving a lost leading space.
116
+ */
117
+ getAccessibleText(): Promise<string>;
118
+ /**
119
+ * What is on screen this frame — scramble glyphs and all, in document order.
120
+ *
121
+ * Plain before anything triggers it, gibberish mid-reveal, and the real string once it
122
+ * settles; comparing it against {@link getAccessibleText} is how a spec says which of
123
+ * those it is looking at. `useOriginalCharsOnly` is visible only here — every glyph
124
+ * has to be one the text really contains.
125
+ *
126
+ * Nondeterministic unless the spec stubs `Math.random`, because each unrevealed
127
+ * position is an independent draw from the pool. When the assertion does not actually
128
+ * need the glyphs, {@link getRevealedIndices} answers the same progress question off
129
+ * the class and needs no stub.
130
+ */
131
+ getRenderedText(): Promise<string>;
132
+ /**
133
+ * How many characters the animation walks.
134
+ *
135
+ * CODE POINTS, not UTF-16 units: `'a🚀b'` is 3 here, and the indices
136
+ * {@link getRevealedIndices} returns line up with `[...text]` rather than with plain
137
+ * `text[i]`. That distinction is not pedantry — counting units gave a sequential
138
+ * reveal extra ticks with no character to spend them on, and made "everything is
139
+ * revealed" disagree with what was on screen.
140
+ */
141
+ getCharCount(): Promise<number>;
142
+ /**
143
+ * The positions that have settled on their real character, ascending.
144
+ *
145
+ * The payload method, and the deterministic one: it reads the `--encrypted` modifier
146
+ * rather than the glyphs, so no `Math.random` stub is involved. It is the only thing
147
+ * that separates `revealDirection` `'start'` (`[0]`, `[0, 1]`, …) from `'end'`
148
+ * (`[4]`, `[3, 4]`, …) from `'center'` (`[2]`, `[1, 2]`, …), and one index per tick is
149
+ * what makes a sequential reveal sequential.
150
+ *
151
+ * Ascending by position, NOT in the order the reveal visited them — the DOM records
152
+ * which characters have landed, never the path taken to them. Assert the set after
153
+ * each tick to pin an order.
154
+ */
155
+ getRevealedIndices(): Promise<number[]>;
156
+ /**
157
+ * How many characters are still scrambled.
158
+ *
159
+ * The coarse progress read, and the cheapest way to say "scrambled on hover", "plain on
160
+ * leave", or "a reader who asked for less motion never saw a scramble at all". Class-
161
+ * based like {@link getRevealedIndices}, so it too is random-proof.
162
+ */
163
+ getEncryptedCount(): Promise<number>;
164
+ /**
165
+ * Whether every character has settled.
166
+ *
167
+ * Deliberately does NOT also compare {@link getRenderedText} against
168
+ * {@link getAccessibleText}: folding two conditions into one boolean hides which of
169
+ * them broke, and a spec that wants both should write both lines.
170
+ *
171
+ * Throws when nothing was rendered. "No character is encrypted" is true of no
172
+ * characters, which is the same answer a component that stopped rendering its text
173
+ * would give — and this is the method most likely to be the only assertion in a test.
174
+ */
175
+ isFullyRevealed(): Promise<boolean>;
176
+ /**
177
+ * Whether the scramble layer is out of the accessibility tree.
178
+ *
179
+ * The contract that keeps a screen reader from spelling out `XQ#PZ` beside the real
180
+ * string it already read. Worth a method rather than an assumption because the wrapper
181
+ * holding the characters carries NO class — it can only be addressed as the readable
182
+ * span's next sibling, which any template reshuffle breaks.
183
+ *
184
+ * Throws when that structural selector finds nothing, rather than returning `false`: a
185
+ * missing wrapper and an unhidden one are different failures, and the answer to
186
+ * "is the scramble hidden" when there is no scramble layer at all is not `false`.
187
+ */
188
+ isAnimatedLayerHidden(): Promise<boolean>;
189
+ /**
190
+ * Point at it — the trigger for `animateOn` `'hover'` and `'inViewHover'`.
191
+ *
192
+ * Drives the component the way a user does, and works in a test because the trigger is
193
+ * an event rather than a gesture: `TestElement.hover()` dispatches `pointerenter`,
194
+ * `mouseover` and `mouseenter`, and the component listens for the last of those. A
195
+ * hand-rolled pointer-only dispatch would not reach it.
196
+ *
197
+ * Does nothing in the other two modes, exactly as a real pointer does nothing there.
198
+ */
199
+ hover(): Promise<void>;
200
+ /**
201
+ * Move the pointer off — the other half of hover mode.
202
+ *
203
+ * Pins the promise that leaving mid-scramble restores the real text IMMEDIATELY rather
204
+ * than letting the reveal play out: the reader took the effect away, so the string has
205
+ * to come back at once.
206
+ */
207
+ mouseAway(): Promise<void>;
208
+ /**
209
+ * Click the host — the `animateOn="click"` trigger, and the only way to tell
210
+ * `clickMode` `'once'` from `'toggle'`.
211
+ *
212
+ * There is no keyboard equivalent, and that is a statement about the component rather
213
+ * than about this harness: in click mode the host carries a click handler with no role,
214
+ * no `tabindex` and no keydown handler, so a keyboard or switch user cannot reveal the
215
+ * text at all. A `sendKeys(Enter)` here would invent an affordance that does not exist
216
+ * and let a spec pass over the top of it.
217
+ */
218
+ click(): Promise<void>;
219
+ }
220
+
221
+ export { WrDecryptTextHarness };
222
+ export type { WrDecryptTextHarnessFilters };