ngwr 11.2.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/README.md +85 -26
  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/collapse/styles/_index.scss +2 -2
  10. package/color-picker/styles/_index.scss +3 -3
  11. package/compare/styles/_index.scss +18 -2
  12. package/context-menu/styles/_index.scss +21 -2
  13. package/date-picker/styles/_index.scss +5 -5
  14. package/descriptions/styles/_index.scss +1 -1
  15. package/drag-drop/styles/_index.scss +28 -1
  16. package/drawer/styles/_index.scss +37 -0
  17. package/dropdown/styles/_index.scss +2 -2
  18. package/event-calendar/styles/_index.scss +67 -10
  19. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  20. package/fesm2022/ngwr-affix.mjs +3 -3
  21. package/fesm2022/ngwr-alert.mjs +3 -3
  22. package/fesm2022/ngwr-anchor.mjs +3 -3
  23. package/fesm2022/ngwr-aurora.mjs +3 -3
  24. package/fesm2022/ngwr-avatar.mjs +3 -3
  25. package/fesm2022/ngwr-back-top.mjs +3 -3
  26. package/fesm2022/ngwr-badge.mjs +6 -6
  27. package/fesm2022/ngwr-bar-chart-testing.mjs +20 -2
  28. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  29. package/fesm2022/ngwr-bar-chart.mjs +3 -3
  30. package/fesm2022/ngwr-blur-text.mjs +3 -3
  31. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  32. package/fesm2022/ngwr-border-glow.mjs +4 -4
  33. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  34. package/fesm2022/ngwr-breadcrumbs.mjs +29 -17
  35. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  36. package/fesm2022/ngwr-burger.mjs +3 -3
  37. package/fesm2022/ngwr-button.mjs +6 -6
  38. package/fesm2022/ngwr-calendar-heatmap.mjs +17 -5
  39. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  40. package/fesm2022/ngwr-calendar-testing.mjs +1 -1
  41. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  42. package/fesm2022/ngwr-calendar.mjs +187 -9
  43. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  44. package/fesm2022/ngwr-card.mjs +10 -10
  45. package/fesm2022/ngwr-card.mjs.map +1 -1
  46. package/fesm2022/ngwr-carousel.mjs +124 -24
  47. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  48. package/fesm2022/ngwr-cascader.mjs +48 -5
  49. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  50. package/fesm2022/ngwr-checkbox.mjs +6 -6
  51. package/fesm2022/ngwr-circular-text.mjs +4 -4
  52. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  53. package/fesm2022/ngwr-click-spark.mjs +27 -7
  54. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  55. package/fesm2022/ngwr-clipboard.mjs +3 -3
  56. package/fesm2022/ngwr-collapse.mjs +9 -9
  57. package/fesm2022/ngwr-color-picker-testing.mjs +26 -6
  58. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  59. package/fesm2022/ngwr-color-picker.mjs +98 -8
  60. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  61. package/fesm2022/ngwr-command-palette.mjs +14 -5
  62. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  63. package/fesm2022/ngwr-compare.mjs +3 -3
  64. package/fesm2022/ngwr-confetti.mjs +31 -6
  65. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  66. package/fesm2022/ngwr-config.mjs +9 -0
  67. package/fesm2022/ngwr-config.mjs.map +1 -1
  68. package/fesm2022/ngwr-context-menu-testing.mjs +30 -11
  69. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-context-menu.mjs +333 -43
  71. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  72. package/fesm2022/ngwr-cookie.mjs +3 -3
  73. package/fesm2022/ngwr-counter.mjs +25 -9
  74. package/fesm2022/ngwr-counter.mjs.map +1 -1
  75. package/fesm2022/{ngwr-date-adapter-fns.mjs → ngwr-date-adapters-fns.mjs} +37 -10
  76. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -0
  77. package/fesm2022/{ngwr-date-adapter-luxon.mjs → ngwr-date-adapters-luxon.mjs} +5 -5
  78. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -0
  79. package/fesm2022/ngwr-date-picker-testing.mjs +11 -6
  80. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  81. package/fesm2022/ngwr-date-picker.mjs +119 -37
  82. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  83. package/fesm2022/{ngwr-date-adapter.mjs → ngwr-date.mjs} +36 -10
  84. package/fesm2022/ngwr-date.mjs.map +1 -0
  85. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  86. package/fesm2022/ngwr-density.mjs +6 -6
  87. package/fesm2022/ngwr-descriptions.mjs +6 -6
  88. package/fesm2022/ngwr-dialog.mjs +73 -18
  89. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  90. package/fesm2022/ngwr-directives.mjs +12 -12
  91. package/fesm2022/ngwr-divider.mjs +52 -5
  92. package/fesm2022/ngwr-divider.mjs.map +1 -1
  93. package/fesm2022/ngwr-donut-chart-testing.mjs +8 -4
  94. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  95. package/fesm2022/ngwr-donut-chart.mjs +7 -7
  96. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  97. package/fesm2022/ngwr-drag-drop.mjs +160 -11
  98. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  99. package/fesm2022/ngwr-drawer.mjs +121 -58
  100. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  101. package/fesm2022/ngwr-dropdown.mjs +26 -10
  102. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  103. package/fesm2022/ngwr-empty.mjs +3 -3
  104. package/fesm2022/ngwr-event-calendar.mjs +28 -15
  105. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  106. package/fesm2022/ngwr-falling-text-testing.mjs +5 -3
  107. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  108. package/fesm2022/ngwr-falling-text.mjs +75 -46
  109. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  110. package/fesm2022/ngwr-file-upload.mjs +3 -3
  111. package/fesm2022/ngwr-form.mjs +32 -15
  112. package/fesm2022/ngwr-form.mjs.map +1 -1
  113. package/fesm2022/ngwr-fuzzy-text.mjs +21 -11
  114. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  115. package/fesm2022/ngwr-gauge.mjs +3 -3
  116. package/fesm2022/ngwr-glitch-text-testing.mjs +51 -17
  117. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  118. package/fesm2022/ngwr-glitch-text.mjs +7 -7
  119. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  120. package/fesm2022/ngwr-gradient-text-testing.mjs +46 -11
  121. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  122. package/fesm2022/ngwr-gradient-text.mjs +4 -4
  123. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  124. package/fesm2022/ngwr-hotkey.mjs +24 -9
  125. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  126. package/fesm2022/ngwr-i18n-en.mjs +73 -1
  127. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  128. package/fesm2022/ngwr-i18n-ru.mjs +55 -1
  129. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  130. package/fesm2022/ngwr-i18n.mjs +26 -15
  131. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  132. package/fesm2022/ngwr-icon.mjs +6 -6
  133. package/fesm2022/ngwr-image-cropper-testing.mjs +53 -9
  134. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  135. package/fesm2022/ngwr-image-cropper.mjs +150 -12
  136. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  137. package/fesm2022/ngwr-input-number-testing.mjs +15 -10
  138. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  139. package/fesm2022/ngwr-input-number.mjs +17 -10
  140. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  141. package/fesm2022/ngwr-input-otp-testing.mjs +12 -6
  142. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  143. package/fesm2022/ngwr-input-otp.mjs +24 -5
  144. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  145. package/fesm2022/ngwr-input.mjs +15 -15
  146. package/fesm2022/ngwr-keyboard.mjs +3 -3
  147. package/fesm2022/ngwr-knob.mjs +3 -3
  148. package/fesm2022/ngwr-layout.mjs +15 -15
  149. package/fesm2022/ngwr-lightbox.mjs +4 -4
  150. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  151. package/fesm2022/ngwr-line-chart.mjs +73 -26
  152. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  153. package/fesm2022/ngwr-list.mjs +7 -7
  154. package/fesm2022/ngwr-list.mjs.map +1 -1
  155. package/fesm2022/ngwr-loading-bar.mjs +7 -7
  156. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  157. package/fesm2022/ngwr-markdown.mjs +66 -8
  158. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  159. package/fesm2022/ngwr-marquee.mjs +4 -4
  160. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  161. package/fesm2022/ngwr-media.mjs +3 -3
  162. package/fesm2022/ngwr-mention.mjs +108 -13
  163. package/fesm2022/ngwr-mention.mjs.map +1 -1
  164. package/fesm2022/ngwr-meta.mjs +6 -6
  165. package/fesm2022/ngwr-meter-group-testing.mjs +26 -6
  166. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  167. package/fesm2022/ngwr-meter-group.mjs +3 -3
  168. package/fesm2022/ngwr-overlay.mjs +6 -6
  169. package/fesm2022/ngwr-page-header.mjs +3 -3
  170. package/fesm2022/ngwr-pagination-testing.mjs +6 -6
  171. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  172. package/fesm2022/ngwr-pagination.mjs +83 -16
  173. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  174. package/fesm2022/ngwr-pipes.mjs +39 -26
  175. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  176. package/fesm2022/ngwr-platform.mjs +9 -9
  177. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  178. package/fesm2022/ngwr-popover-testing.mjs +7 -2
  179. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  180. package/fesm2022/ngwr-popover.mjs +155 -33
  181. package/fesm2022/ngwr-popover.mjs.map +1 -1
  182. package/fesm2022/ngwr-progress.mjs +3 -3
  183. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  184. package/fesm2022/ngwr-qr.mjs +42 -5
  185. package/fesm2022/ngwr-qr.mjs.map +1 -1
  186. package/fesm2022/ngwr-radio.mjs +6 -6
  187. package/fesm2022/ngwr-rating.mjs +3 -3
  188. package/fesm2022/ngwr-result.mjs +21 -30
  189. package/fesm2022/ngwr-result.mjs.map +1 -1
  190. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  191. package/fesm2022/ngwr-scroll.mjs +3 -3
  192. package/fesm2022/ngwr-segmented-testing.mjs +85 -1
  193. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  194. package/fesm2022/ngwr-segmented.mjs +123 -10
  195. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  196. package/fesm2022/ngwr-select.mjs +159 -34
  197. package/fesm2022/ngwr-select.mjs.map +1 -1
  198. package/fesm2022/ngwr-shiny-text.mjs +11 -9
  199. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  200. package/fesm2022/ngwr-sidebar.mjs +31 -16
  201. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  202. package/fesm2022/ngwr-skeleton.mjs +3 -3
  203. package/fesm2022/ngwr-slider.mjs +100 -9
  204. package/fesm2022/ngwr-slider.mjs.map +1 -1
  205. package/fesm2022/ngwr-sparkline.mjs +3 -3
  206. package/fesm2022/ngwr-speed-dial-testing.mjs +15 -13
  207. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  208. package/fesm2022/ngwr-speed-dial.mjs +27 -12
  209. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  210. package/fesm2022/ngwr-spinner.mjs +3 -3
  211. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  212. package/fesm2022/ngwr-split-text.mjs +17 -5
  213. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  214. package/fesm2022/ngwr-splitter.mjs +3 -3
  215. package/fesm2022/ngwr-spotlight-card.mjs +7 -7
  216. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  217. package/fesm2022/ngwr-squircle.mjs +6 -6
  218. package/fesm2022/ngwr-star-border.mjs +4 -4
  219. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  220. package/fesm2022/ngwr-statistic.mjs +9 -9
  221. package/fesm2022/ngwr-stepper-testing.mjs +8 -8
  222. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  223. package/fesm2022/ngwr-stepper.mjs +33 -8
  224. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  225. package/fesm2022/ngwr-storage.mjs +17 -5
  226. package/fesm2022/ngwr-storage.mjs.map +1 -1
  227. package/fesm2022/ngwr-switch.mjs +3 -3
  228. package/fesm2022/ngwr-table.mjs +99 -39
  229. package/fesm2022/ngwr-table.mjs.map +1 -1
  230. package/fesm2022/ngwr-tabs-testing.mjs +11 -10
  231. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  232. package/fesm2022/ngwr-tabs.mjs +36 -10
  233. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  234. package/fesm2022/ngwr-textarea.mjs +3 -3
  235. package/fesm2022/ngwr-theme.mjs +181 -4
  236. package/fesm2022/ngwr-theme.mjs.map +1 -1
  237. package/fesm2022/ngwr-tilt-card.mjs +7 -7
  238. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  239. package/fesm2022/ngwr-timeline.mjs +6 -6
  240. package/fesm2022/ngwr-toast.mjs +9 -9
  241. package/fesm2022/ngwr-toolbar.mjs +3 -3
  242. package/fesm2022/ngwr-tour.mjs +34 -10
  243. package/fesm2022/ngwr-tour.mjs.map +1 -1
  244. package/fesm2022/ngwr-transfer.mjs +3 -3
  245. package/fesm2022/ngwr-tree.mjs +28 -10
  246. package/fesm2022/ngwr-tree.mjs.map +1 -1
  247. package/fesm2022/ngwr-typewriter-testing.mjs +15 -1
  248. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  249. package/fesm2022/ngwr-typewriter.mjs +13 -5
  250. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  251. package/fesm2022/ngwr-typography.mjs +3 -3
  252. package/fesm2022/ngwr-utils.mjs +5 -2
  253. package/fesm2022/ngwr-utils.mjs.map +1 -1
  254. package/fesm2022/ngwr-version.mjs +1 -1
  255. package/fesm2022/ngwr-version.mjs.map +1 -1
  256. package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
  257. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  258. package/fesm2022/ngwr-waves.mjs +4 -4
  259. package/fesm2022/ngwr-waves.mjs.map +1 -1
  260. package/fesm2022/ngwr-window.mjs +94 -24
  261. package/fesm2022/ngwr-window.mjs.map +1 -1
  262. package/file-upload/styles/_index.scss +2 -2
  263. package/glitch-text/styles/_index.scss +27 -12
  264. package/i18n/en.json +56 -6
  265. package/i18n/ru.json +56 -6
  266. package/image-cropper/styles/_index.scss +19 -0
  267. package/input/styles/_index.scss +2 -2
  268. package/input-number/styles/_index.scss +2 -2
  269. package/input-otp/styles/_index.scss +9 -2
  270. package/knob/styles/_index.scss +1 -1
  271. package/lightbox/styles/_index.scss +16 -2
  272. package/line-chart/styles/_index.scss +28 -14
  273. package/list/styles/_index.scss +1 -1
  274. package/llms-full.txt +19 -24
  275. package/llms.txt +46 -8
  276. package/markdown/styles/_index.scss +3 -3
  277. package/mcp/api.js +6 -4
  278. package/mcp/catalog.js +40 -3
  279. package/mcp/providers.js +16 -3
  280. package/mcp/tools.js +21 -1
  281. package/meter-group/styles/_index.scss +1 -1
  282. package/overlay/styles/_index.scss +33 -1
  283. package/package.json +17 -12
  284. package/pagination/styles/_index.scss +23 -1
  285. package/popover/styles/_index.scss +16 -7
  286. package/progress/styles/_index.scss +1 -1
  287. package/radio/styles/_index.scss +2 -2
  288. package/rating/styles/_index.scss +1 -1
  289. package/schematics/collection.json +1 -1
  290. package/schematics/migrations/v12/index.js +65 -0
  291. package/schematics/migrations/v7/index.js +12 -1
  292. package/schematics/migrations/v8/index.js +10 -1
  293. package/schematics/migrations.json +5 -0
  294. package/schematics/ng-add/index.js +8 -3
  295. package/schematics/provider/index.js +80 -13
  296. package/schematics/use/index.js +9 -129
  297. package/schematics/use/rule.js +206 -0
  298. package/schematics/use/symbol-map.json +4 -4
  299. package/segmented/styles/_index.scss +14 -3
  300. package/select/styles/_index.scss +14 -2
  301. package/sidebar/styles/_index.scss +12 -10
  302. package/skills/ngwr/SKILL.md +7 -5
  303. package/skills/ngwr/references/catalog.md +9 -9
  304. package/skills/ngwr/references/setup.md +10 -5
  305. package/slider/styles/_index.scss +1 -1
  306. package/speed-dial/styles/_index.scss +1 -1
  307. package/stepper/styles/_index.scss +12 -3
  308. package/switch/styles/_index.scss +2 -2
  309. package/table/styles/_index.scss +61 -12
  310. package/tabs/styles/_index.scss +1 -1
  311. package/textarea/styles/_index.scss +1 -1
  312. package/theme/styles/_colors.scss +142 -56
  313. package/theme/styles/_dark.scss +46 -3
  314. package/theme/styles/_focus.scss +28 -5
  315. package/theme/styles/_mixins.scss +1 -1
  316. package/theme/styles/_variables.scss +67 -0
  317. package/transfer/styles/_index.scss +26 -3
  318. package/tree/styles/_index.scss +29 -6
  319. package/types/ngwr-bar-chart-testing.d.ts +9 -1
  320. package/types/ngwr-blur-text.d.ts +8 -4
  321. package/types/ngwr-breadcrumbs.d.ts +17 -10
  322. package/types/ngwr-calendar-testing.d.ts +1 -1
  323. package/types/ngwr-calendar.d.ts +66 -0
  324. package/types/ngwr-carousel.d.ts +85 -6
  325. package/types/ngwr-cascader.d.ts +17 -0
  326. package/types/ngwr-click-spark.d.ts +4 -0
  327. package/types/ngwr-color-picker-testing.d.ts +8 -0
  328. package/types/ngwr-color-picker.d.ts +21 -1
  329. package/types/ngwr-confetti.d.ts +8 -0
  330. package/types/ngwr-config.d.ts +10 -1
  331. package/types/ngwr-context-menu-testing.d.ts +24 -11
  332. package/types/ngwr-context-menu.d.ts +56 -0
  333. package/types/ngwr-counter.d.ts +1 -0
  334. package/types/{ngwr-date-adapter-fns.d.ts → ngwr-date-adapters-fns.d.ts} +33 -6
  335. package/types/{ngwr-date-adapter-luxon.d.ts → ngwr-date-adapters-luxon.d.ts} +1 -1
  336. package/types/ngwr-date-picker-testing.d.ts +11 -6
  337. package/types/ngwr-date-picker.d.ts +8 -4
  338. package/types/{ngwr-date-adapter.d.ts → ngwr-date.d.ts} +24 -5
  339. package/types/ngwr-dialog.d.ts +38 -1
  340. package/types/ngwr-divider.d.ts +25 -0
  341. package/types/ngwr-donut-chart-testing.d.ts +7 -3
  342. package/types/ngwr-donut-chart.d.ts +3 -3
  343. package/types/ngwr-drag-drop.d.ts +56 -2
  344. package/types/ngwr-drawer.d.ts +56 -5
  345. package/types/ngwr-event-calendar.d.ts +8 -2
  346. package/types/ngwr-falling-text-testing.d.ts +5 -3
  347. package/types/ngwr-falling-text.d.ts +1 -1
  348. package/types/ngwr-form.d.ts +12 -2
  349. package/types/ngwr-glitch-text-testing.d.ts +37 -8
  350. package/types/ngwr-gradient-text-testing.d.ts +16 -3
  351. package/types/ngwr-i18n.d.ts +13 -4
  352. package/types/ngwr-image-cropper-testing.d.ts +49 -10
  353. package/types/ngwr-image-cropper.d.ts +70 -5
  354. package/types/ngwr-input-number-testing.d.ts +15 -10
  355. package/types/ngwr-input-number.d.ts +11 -4
  356. package/types/ngwr-input-otp-testing.d.ts +12 -6
  357. package/types/ngwr-input-otp.d.ts +15 -1
  358. package/types/ngwr-line-chart.d.ts +20 -3
  359. package/types/ngwr-markdown.d.ts +11 -0
  360. package/types/ngwr-mention.d.ts +32 -0
  361. package/types/ngwr-meter-group-testing.d.ts +12 -2
  362. package/types/ngwr-overlay.d.ts +1 -0
  363. package/types/ngwr-pagination-testing.d.ts +4 -4
  364. package/types/ngwr-pagination.d.ts +11 -0
  365. package/types/ngwr-pipes.d.ts +1 -1
  366. package/types/ngwr-popover-testing.d.ts +7 -2
  367. package/types/ngwr-popover.d.ts +1 -0
  368. package/types/ngwr-result.d.ts +6 -0
  369. package/types/ngwr-segmented-testing.d.ts +53 -0
  370. package/types/ngwr-segmented.d.ts +107 -5
  371. package/types/ngwr-select.d.ts +68 -6
  372. package/types/ngwr-shiny-text.d.ts +4 -2
  373. package/types/ngwr-sidebar.d.ts +14 -5
  374. package/types/ngwr-slider.d.ts +69 -1
  375. package/types/ngwr-speed-dial-testing.d.ts +15 -11
  376. package/types/ngwr-speed-dial.d.ts +22 -3
  377. package/types/ngwr-split-text.d.ts +9 -0
  378. package/types/ngwr-stepper-testing.d.ts +5 -5
  379. package/types/ngwr-stepper.d.ts +8 -0
  380. package/types/ngwr-storage.d.ts +1 -0
  381. package/types/ngwr-table.d.ts +104 -11
  382. package/types/ngwr-tabs-testing.d.ts +11 -10
  383. package/types/ngwr-tabs.d.ts +2 -0
  384. package/types/ngwr-theme.d.ts +82 -1
  385. package/types/ngwr-tour.d.ts +22 -4
  386. package/types/ngwr-tree.d.ts +5 -4
  387. package/types/ngwr-typewriter-testing.d.ts +10 -0
  388. package/types/ngwr-utils.d.ts +5 -2
  389. package/types/ngwr-version.d.ts +1 -1
  390. package/types/ngwr-window.d.ts +39 -11
  391. package/typography/styles/_index.scss +1 -1
  392. package/window/styles/_index.scss +72 -26
  393. package/fesm2022/ngwr-date-adapter-fns.mjs.map +0 -1
  394. package/fesm2022/ngwr-date-adapter-luxon.mjs.map +0 -1
  395. package/fesm2022/ngwr-date-adapter.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-date-picker-testing.mjs","sources":["../../../projects/lib/date-picker/testing/wr-date-picker-day-harness.ts","../../../projects/lib/date-picker/testing/wr-time-panel-harness.ts","../../../projects/lib/date-picker/testing/wr-date-picker-harness-base.ts","../../../projects/lib/date-picker/testing/wr-date-picker-harness.ts","../../../projects/lib/date-picker/testing/wr-date-range-picker-harness.ts","../../../projects/lib/date-picker/testing/ngwr-date-picker-testing.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\n/**\n * The day cell of a date-picker's calendar, under the name it shipped as.\n *\n * There is one implementation, and it lives with the component that owns the\n * element: a picker's popup IS a `<wr-calendar>`, and `.wr-calendar__day` is its\n * cell. `ngwr/calendar/testing` is therefore the home, and this alias keeps\n * `WrDatePickerDayHarness` working for every spec that already imports it — the two\n * names are the same class, so a harness from either query is usable with either.\n */\nexport { WrCalendarDayHarness as WrDatePickerDayHarness } from 'ngwr/calendar/testing';\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerTimeFields } from './interfaces';\n\n/** Column order inside the stepper, which is also the order the boxes render in. */\nconst UNITS = ['hours', 'minutes', 'seconds'] as const;\n\n/** One unit of a time stepper. */\ntype Unit = (typeof UNITS)[number];\n\nfunction missingColumn(unit: Unit, method: string): string {\n return `${method}(): this stepper has no ${unit} column — seconds only render with [showSeconds]=\"true\".`;\n}\n\n/**\n * The `<wr-time-picker>` stepper inside a date-picker popup.\n *\n * Deliberately NOT exported from the entry point: the component is `@internal`\n * (`<wr-date-picker mode=\"time\">` is how a consumer gets one), so the picker\n * harnesses re-publish what it can do — `getTime()`, `setTime()`, `stepTime()`,\n * `toggleMeridiem()` — rather than handing out this class. It exists so the\n * range picker, which renders one stepper PER END, can address them\n * independently instead of by CSS nth-of-type gymnastics.\n *\n * Units are addressed by position, not by the boxes' `aria-label`: every string\n * in this panel is still hard-coded English (the box labels, the steppers'\n * \"Increment hours\", the AM/PM text), so keying on them would make this harness\n * the thing that breaks when they are moved into the i18n catalog. Column order\n * is the layout contract.\n *\n * @internal\n */\nexport class WrTimePanelHarness extends ComponentHarness {\n static hostSelector = '.wr-time-picker';\n\n /** The stepper's value as `HH:MM`, plus `:SS` and ` AM`/` PM` when those columns exist. */\n async getTimeText(): Promise<string> {\n const parts = [await this.getValue('hours'), await this.getValue('minutes')];\n const seconds = await this.getOptionalValue('seconds');\n if (seconds !== null) parts.push(seconds);\n\n const meridiem = await this.getMeridiem();\n return meridiem ? `${parts.join(':')} ${meridiem}` : parts.join(':');\n }\n\n /** `'AM'` / `'PM'`, or `null` when the stepper is in 24-hour mode. */\n async getMeridiem(): Promise<string | null> {\n const label = await this.locatorForOptional('.wr-time-picker__label')();\n return label ? label.text() : null;\n }\n\n /**\n * Type into the boxes named by `fields`, leaving the rest alone.\n *\n * Each box is cleared and retyped rather than assigned: the panel reads an\n * emptied box as someone mid-retype and deliberately commits nothing for it, so\n * a harness that only cleared would look like a no-op.\n */\n async setFields(fields: WrDatePickerTimeFields): Promise<void> {\n for (const unit of UNITS) {\n const value = fields[unit];\n if (value === undefined) continue;\n\n const box = await this.box(unit, 'setTime');\n await box.clear();\n await box.sendKeys(String(value));\n }\n }\n\n /** Click a unit's ▲ / ▼ button once. Minutes and seconds move by the picker's `step`. */\n async step(unit: Unit, direction: 1 | -1): Promise<void> {\n // The AM/PM column contributes a ▲ and a ▼ of its own, and it is always\n // last — so it cannot be excluded by index alone: with seconds off, the\n // third ▲ in the panel IS the meridiem toggle.\n const suffix = direction === 1 ? 'up' : 'down';\n const buttons = await this.locatorForAll(\n `.wr-time-picker__col:not(.wr-time-picker__col--ampm) .wr-time-picker__step--${suffix}`\n )();\n\n const button = buttons[UNITS.indexOf(unit)];\n if (!button) throw new Error(missingColumn(unit, 'stepTime'));\n\n await button.click();\n }\n\n /** Flip AM ↔ PM. Throws on a 24-hour stepper, which has no such control. */\n async toggleMeridiem(): Promise<void> {\n const button = await this.locatorForOptional('.wr-time-picker__col--ampm .wr-time-picker__step--up')();\n if (!button) {\n throw new Error(\n 'toggleMeridiem(): this stepper has no AM / PM control — it is in 24-hour mode. Pass ' +\n 'timeFormat=\"12h\" (or a locale that resolves to 12-hour time) to get one.'\n );\n }\n\n await button.click();\n }\n\n /** A unit's rendered (zero-padded) value. */\n private async getValue(unit: Unit): Promise<string> {\n return (await this.box(unit, 'getTime')).getProperty<string>('value');\n }\n\n /** Same, but `null` when the column is not rendered at all. */\n private async getOptionalValue(unit: Unit): Promise<string | null> {\n const boxes = await this.boxes();\n const box = boxes[UNITS.indexOf(unit)];\n return box ? box.getProperty<string>('value') : null;\n }\n\n private async box(unit: Unit, method: string): Promise<TestElement> {\n const boxes = await this.boxes();\n const box = boxes[UNITS.indexOf(unit)];\n if (!box) throw new Error(missingColumn(unit, method));\n return box;\n }\n\n /** The typable boxes, in column order — the AM/PM column is a `<span>`, not one of these. */\n private async boxes(): Promise<TestElement[]> {\n return this.locatorForAll('.wr-time-picker__input')();\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, type HarnessLoader, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerDayHarnessFilters } from './interfaces';\nimport { WrDatePickerDayHarness } from './wr-date-picker-day-harness';\nimport { WrTimePanelHarness } from './wr-time-panel-harness';\n\n/** The first element whose trimmed text is exactly `text`. */\nasync function byText(elements: TestElement[], text: string): Promise<TestElement | null> {\n for (const element of elements) {\n if ((await element.text()) === text) return element;\n }\n return null;\n}\n\n/**\n * Everything `<wr-date-picker>` and `<wr-date-range-picker>` do identically: the\n * trigger button, the popup it owns, and the `<wr-calendar>` inside it. Both\n * components render the SAME trigger element (`.wr-date-picker__trigger` — the\n * range picker reuses the class rather than minting its own) and both publish\n * their popup's id through the trigger's `aria-controls`, so the scoping story is\n * shared too.\n *\n * Not exported from the entry point — a consumer works with one of the two\n * concrete harnesses.\n *\n * @internal\n */\nexport abstract class WrDatePickerHarnessBase extends ComponentHarness {\n /** Concrete class name, so errors read like the harness the caller reached for. */\n protected abstract readonly harnessName: string;\n\n /**\n * Whether the popup is up.\n *\n * Read from the trigger's `aria-expanded` rather than from a host class: unlike\n * `wr-select`, neither picker carries an `--open` modifier, and the ARIA state\n * is the thing a consumer's users actually get told.\n */\n async isOpen(): Promise<boolean> {\n return (await (await this.trigger()).getAttribute('aria-expanded')) === 'true';\n }\n\n /** Open the popup from the trigger. An already-open picker is left alone. */\n async open(): Promise<void> {\n if (await this.isOpen()) return;\n\n await (await this.trigger()).click();\n if (await this.isOpen()) return;\n\n throw new Error(\n `${this.harnessName}.open(): the trigger did not open a popup. A disabled picker refuses to open, and so ` +\n 'does a readonly <wr-date-range-picker> — a readonly <wr-date-picker>, deliberately, still opens.'\n );\n }\n\n /**\n * Close the popup by clicking the trigger again. A closed picker is left alone.\n *\n * Deliberately not Escape: the CDK dispatches a keydown to the TOP-MOST overlay,\n * so with two pickers open this would close whichever opened last rather than\n * this one. The trigger only ever toggles its own popup.\n */\n async close(): Promise<void> {\n if (!(await this.isOpen())) return;\n\n await (await this.trigger()).click();\n }\n\n /** The popup's role — `'dialog'`, which is what the trigger's `aria-haspopup` promises. */\n async getPanelRole(): Promise<string | null> {\n return (await this.panel()).getAttribute('role');\n }\n\n /**\n * The popup's accessible name. Defaults to a catalog string chosen by `mode`\n * (\"Choose date\", \"Choose time\", …) and is overridden by `[panelAriaLabel]`.\n */\n async getPanelAriaLabel(): Promise<string | null> {\n return (await this.panel()).getAttribute('aria-label');\n }\n\n /**\n * Which of the calendar's three views is showing. The header label zooms out\n * (day → month → year); picking a month or a year zooms back in.\n */\n async getView(): Promise<'day' | 'month' | 'year'> {\n if (await this.inPanel('[role=\"grid\"]')) return 'day';\n if (await this.inPanel('.wr-calendar__months')) return 'month';\n if (await this.inPanel('.wr-calendar__years')) return 'year';\n\n throw new Error(this.noCalendar('getView'));\n }\n\n /**\n * The calendar's header: `'January 2025'` in the day view, `'2025'` in the month\n * view, `'2016 – 2027'` in the year view.\n */\n async getPanelHeader(): Promise<string> {\n const label = await this.inPanel('.wr-calendar__label');\n if (!label) throw new Error(this.noCalendar('getPanelHeader'));\n\n return label.text();\n }\n\n /** The weekday strip, in display order — `role=\"columnheader\"` cells of the grid's first row. */\n async getWeekdayLabels(): Promise<string[]> {\n const cells = await this.allInPanel('[role=\"columnheader\"]');\n if (cells.length === 0) {\n throw new Error(\n `${this.harnessName}.getWeekdayLabels(): no weekday strip. Only the day view has one, and mode=\"time\" ` +\n 'has no calendar at all.'\n );\n }\n\n return Promise.all(cells.map(cell => cell.text()));\n }\n\n /**\n * Step the calendar forwards. What one step MEANS follows the active view, as\n * the button's own `aria-label` says: a month in the day view, a year in the\n * month view, twelve years in the year view.\n */\n async next(): Promise<void> {\n await this.navigate('next');\n }\n\n /** Step the calendar backwards — see {@link next} for what one step covers. */\n async previous(): Promise<void> {\n await this.navigate('prev');\n }\n\n /**\n * Zoom out one level by clicking the header, the way a user does: day → month,\n * month → year. Throws at the year view, where the header is inert.\n */\n async zoomOut(): Promise<void> {\n const label = await this.inPanel('.wr-calendar__label');\n if (!label) throw new Error(this.noCalendar('zoomOut'));\n\n if (await label.getProperty<boolean>('disabled')) {\n throw new Error(\n `${this.harnessName}.zoomOut(): the header is inert — the calendar is already showing the year view ` +\n '(or the whole picker is disabled), and there is nothing further to zoom out to.'\n );\n }\n\n await label.click();\n }\n\n /** Pick a month in the month view, by 0-based index or by the label the calendar renders. */\n async selectMonth(month: number | string): Promise<void> {\n const chips = await this.allInPanel('.wr-calendar__months .wr-calendar__chip');\n if (chips.length === 0) {\n throw new Error(\n `${this.harnessName}.selectMonth(): the calendar is not showing its month view — call zoomOut() first.`\n );\n }\n\n const chip = typeof month === 'number' ? chips[month] : await byText(chips, month);\n if (!chip) {\n throw new Error(\n `${this.harnessName}.selectMonth(${JSON.stringify(month)}): no such month. Pass a 0-based index, or the ` +\n 'label the calendar renders — a short month name in the active locale.'\n );\n }\n\n await chip.click();\n }\n\n /** Pick a year in the year view. Only the twelve on show can be picked. */\n async selectYear(year: number): Promise<void> {\n const chips = await this.allInPanel('.wr-calendar__years .wr-calendar__chip');\n if (chips.length === 0) {\n throw new Error(\n `${this.harnessName}.selectYear(): the calendar is not showing its year view — call zoomOut() until ` +\n 'getView() answers \"year\".'\n );\n }\n\n const chip = await byText(chips, String(year));\n if (!chip) {\n const shown = await Promise.all(chips.map(candidate => candidate.text()));\n throw new Error(\n `${this.harnessName}.selectYear(${year}): the year view is showing ${shown[0]}-${shown[shown.length - 1]} ` +\n '— call previous() / next() to move the twelve-year window first.'\n );\n }\n\n await chip.click();\n }\n\n /**\n * The day cells of the calendar in this picker's popup, in DOM order — 42 of\n * them, since the grid is always six weeks and pads into the neighbouring\n * months.\n */\n async getDays(filters: WrDatePickerDayHarnessFilters = {}): Promise<WrDatePickerDayHarness[]> {\n await this.requireGrid('getDays');\n\n return (await this.panelLoader()).getAllHarnesses(WrDatePickerDayHarness.with(filters));\n }\n\n /**\n * One day of the month on show. The padding days of the neighbouring months are\n * skipped, so `getDay(1)` is the 1st of THIS month and never the 1st of the next.\n */\n async getDay(dayOfMonth: number): Promise<WrDatePickerDayHarness> {\n const cells = await this.getDays({ text: String(dayOfMonth) });\n for (const cell of cells) {\n if (!(await cell.isOutOfMonth())) return cell;\n }\n\n throw new Error(\n `${this.harnessName}.getDay(${dayOfMonth}): the month on show (${await this.getPanelHeader()}) has no such ` +\n 'day. Cells belonging to the neighbouring months are deliberately not matched — call previous() / next() ' +\n 'to change month.'\n );\n }\n\n /** Click a day of the month on show. */\n async selectDay(dayOfMonth: number): Promise<void> {\n const cell = await this.getDay(dayOfMonth);\n if (await cell.isDisabled()) {\n throw new Error(\n `${this.harnessName}.selectDay(${dayOfMonth}): that day is disabled — min / max or dateFilter rules it ` +\n 'out, and a disabled cell swallows the click rather than picking anything.'\n );\n }\n\n await cell.click();\n }\n\n /** The trigger button. Both components render it with the same class. */\n protected async trigger(): Promise<TestElement> {\n return this.locatorFor('.wr-date-picker__trigger')();\n }\n\n /**\n * The id of THIS picker's popup.\n *\n * The trigger publishes it as `aria-controls` only while the popup is up, which\n * makes one lookup answer both questions — is it open, and which of the panes\n * in the shared overlay container is ours.\n */\n protected async panelId(): Promise<string> {\n const id = await (await this.trigger()).getAttribute('aria-controls');\n if (!id) {\n throw new Error(\n `${this.harnessName}: the popup is closed — call open() first. The trigger only publishes aria-controls ` +\n 'while its popup is up.'\n );\n }\n\n return id;\n }\n\n /** A loader scoped to THIS picker's popup, so a second open picker cannot answer for it. */\n protected async panelLoader(): Promise<HarnessLoader> {\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${await this.panelId()}`);\n }\n\n /** One element inside THIS picker's popup, or `null`. */\n protected async inPanel(selector: string): Promise<TestElement | null> {\n return this.documentRootLocatorFactory().locatorForOptional(`#${await this.panelId()} ${selector}`)();\n }\n\n /** Every matching element inside THIS picker's popup, in DOM order. */\n protected async allInPanel(selector: string): Promise<TestElement[]> {\n return this.documentRootLocatorFactory().locatorForAll(`#${await this.panelId()} ${selector}`)();\n }\n\n /**\n * The time steppers in this popup, in DOM order — none in `date` mode, one for\n * `time` / `datetime`, and two (start then end) for a datetime range.\n */\n protected async timePanels(): Promise<WrTimePanelHarness[]> {\n return (await this.panelLoader()).getAllHarnesses(WrTimePanelHarness);\n }\n\n private async navigate(direction: 'prev' | 'next'): Promise<void> {\n const button = await this.inPanel(`.wr-calendar__nav--${direction}`);\n if (!button) throw new Error(this.noCalendar(direction === 'next' ? 'next' : 'previous'));\n\n await button.click();\n }\n\n /** Fail early on the day-cell methods rather than answering with an empty list. */\n private async requireGrid(method: string): Promise<void> {\n if (await this.inPanel('[role=\"grid\"]')) return;\n\n throw new Error(\n `${this.harnessName}.${method}(): this popup has no day grid. mode=\"time\" renders a time stepper only, and a ` +\n 'calendar zoomed out to its month / year view offers chips instead of day cells — selectMonth() / ' +\n 'selectYear() come back to the days.'\n );\n }\n\n private async panel(): Promise<TestElement> {\n return this.documentRootLocatorFactory().locatorFor(`#${await this.panelId()}`)();\n }\n\n private noCalendar(method: string): string {\n return `${this.harnessName}.${method}(): this popup has no calendar — mode=\"time\" renders a time stepper only.`;\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { HarnessPredicate, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerHarnessFilters, WrDatePickerTimeFields } from './interfaces';\nimport { WrDatePickerHarnessBase } from './wr-date-picker-harness-base';\nimport type { WrTimePanelHarness } from './wr-time-panel-harness';\n\n/**\n * Test harness for `<wr-date-picker>` — the `date`, `time` and `datetime` modes\n * of the one component.\n *\n * The popup is NOT inside the picker: it is a pane in the overlay container, a\n * sibling of the whole app. Everything inside it is therefore reached through the\n * document root, scoped by the id the trigger publishes as `aria-controls` —\n * which is what keeps two pickers on one page from reading each other's calendar.\n *\n * The value lives in a text field, so there are two ways in and the harness\n * offers both: {@link setValueText} types a date, {@link selectDay} picks one out\n * of the grid. There is deliberately no clear BUTTON on this component — an\n * emptied field is what clears the value, and that is what {@link clear} does.\n *\n * @example\n * ```ts\n * const picker = await loader.getHarness(WrDatePickerHarness);\n *\n * await picker.open();\n * expect(await picker.getPanelHeader()).toBe('January 2025');\n * await picker.selectDay(14);\n *\n * expect(await picker.getValueText()).toBe('14.01.2025');\n * expect(await (await picker.getDay(14)).isSelected()).toBe(true);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrDatePickerHarness extends WrDatePickerHarnessBase {\n static hostSelector = 'wr-date-picker';\n\n /** Build a predicate that narrows the query. */\n static with(options: WrDatePickerHarnessFilters = {}): HarnessPredicate<WrDatePickerHarness> {\n return new HarnessPredicate(WrDatePickerHarness, options)\n .addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getValueText(), text))\n .addOption('placeholder', options.placeholder, (harness, placeholder) =>\n HarnessPredicate.stringMatches(harness.getPlaceholder(), placeholder)\n )\n .addOption('mode', options.mode, async (harness, mode) => (await harness.getMode()) === mode)\n .addOption('disabled', options.disabled, async (harness, disabled) => (await harness.isDisabled()) === disabled)\n .addOption('open', options.open, async (harness, open) => (await harness.isOpen()) === open);\n }\n\n protected readonly harnessName = 'WrDatePickerHarness';\n\n /** Which mode the picker is in, read from the `wr-date-picker--*` modifier. */\n async getMode(): Promise<'date' | 'time' | 'datetime'> {\n const host = await this.host();\n if (await host.hasClass('wr-date-picker--time')) return 'time';\n if (await host.hasClass('wr-date-picker--datetime')) return 'datetime';\n return 'date';\n }\n\n /**\n * What the field is showing: the value in the picker's `format`, or `''` when it\n * is empty and the placeholder is up.\n */\n async getValueText(): Promise<string> {\n return (await this.field()).getProperty<string>('value');\n }\n\n /** The field's placeholder. */\n async getPlaceholder(): Promise<string> {\n return (await this.field()).getProperty<string>('placeholder');\n }\n\n /**\n * Type a date into the field, replacing whatever is there.\n *\n * The field is cleared first, so the value passes through `null` on the way —\n * exactly as it does for a user who selects all and types over it. The picker\n * parses on every keystroke and commits only when the text parses in full, so a\n * partial or out-of-bounds entry leaves the model on its last good value.\n */\n async setValueText(text: string): Promise<void> {\n const field = await this.field();\n await field.clear();\n // `sendKeys()` with an empty string throws — clearing was the whole request.\n if (text) await field.sendKeys(text);\n }\n\n /**\n * Empty the field, which clears the value.\n *\n * There is no clear button to click: unlike `wr-select`, this component ships no\n * `×` affordance, and an empty field is the documented way to get back to `null`.\n */\n async clear(): Promise<void> {\n await (await this.field()).clear();\n }\n\n /** Whether the picker refuses interaction. */\n async isDisabled(): Promise<boolean> {\n return (await this.host()).hasClass('wr-date-picker--disabled');\n }\n\n /**\n * Whether the field refuses typing. A read-only picker still OPENS its popup —\n * documented behaviour, and the one place it parts company with the range picker.\n */\n async isReadonly(): Promise<boolean> {\n return (await this.field()).getProperty<boolean>('readOnly');\n }\n\n /** Move focus to the field. */\n async focus(): Promise<void> {\n return (await this.field()).focus();\n }\n\n /**\n * Blur the field, which is what reformats a value to canonical and emits `touch`\n * so a bound `[formField]` can mark itself touched.\n */\n async blur(): Promise<void> {\n return (await this.field()).blur();\n }\n\n /** Whether the field currently has focus. */\n async isFocused(): Promise<boolean> {\n return (await this.field()).isFocused();\n }\n\n /**\n * The open time stepper's value as `HH:MM`, plus `:SS` when `showSeconds` is on\n * and ` AM`/` PM` in 12-hour mode.\n */\n async getTime(): Promise<string> {\n return (await this.timePanel()).getTimeText();\n }\n\n /** Type into the open time stepper's boxes. Omitted fields are left alone. */\n async setTime(fields: WrDatePickerTimeFields): Promise<void> {\n await (await this.timePanel()).setFields(fields);\n }\n\n /** Click one of the stepper's ▲ / ▼ buttons. Minutes and seconds move by `step`. */\n async stepTime(unit: 'hours' | 'minutes' | 'seconds', direction: 1 | -1): Promise<void> {\n await (await this.timePanel()).step(unit, direction);\n }\n\n /** Flip the stepper between AM and PM. Throws in 24-hour mode, which has no such control. */\n async toggleMeridiem(): Promise<void> {\n await (await this.timePanel()).toggleMeridiem();\n }\n\n private async field(): Promise<TestElement> {\n return this.locatorFor('input[wrInput]')();\n }\n\n /** The one stepper in the popup — `panelId()` has already refused a closed picker. */\n private async timePanel(): Promise<WrTimePanelHarness> {\n const [panel] = await this.timePanels();\n if (!panel) {\n throw new Error(\n `${this.harnessName}: this popup has no time stepper — mode=\"date\" renders a calendar only. Use mode=\"time\" ` +\n 'or mode=\"datetime\".'\n );\n }\n\n return panel;\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { HarnessPredicate, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerTimeFields, WrDateRangePickerHarnessFilters } from './interfaces';\nimport { WrDatePickerHarnessBase } from './wr-date-picker-harness-base';\nimport type { WrTimePanelHarness } from './wr-time-panel-harness';\n\n/** Which end of the range a call applies to. */\ntype End = 'start' | 'end';\n\n/**\n * Test harness for `<wr-date-range-picker>` — two text fields over one range\n * calendar.\n *\n * A separate harness rather than a mode of {@link WrDatePickerHarness}, because\n * the DOM a spec has to reach is genuinely different: two fields with a separator\n * between them, and in `datetime` mode two time steppers instead of one. Every\n * call that could mean either field takes an explicit `'start'` / `'end'` — the\n * component's own bugs were nearly all \"which end did that belong to\", and a\n * harness that guessed would reproduce them.\n *\n * The popup, the calendar and the scoping work exactly as they do for the single\n * picker: a pane in the overlay container, addressed by the id the trigger\n * publishes as `aria-controls`.\n *\n * @example\n * ```ts\n * const period = await loader.getHarness(WrDateRangePickerHarness);\n *\n * await period.open();\n * await period.selectDay(14);\n * await period.selectDay(20);\n *\n * expect([await period.getStartText(), await period.getEndText()]).toEqual(['14.01.2025', '20.01.2025']);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrDateRangePickerHarness extends WrDatePickerHarnessBase {\n static hostSelector = 'wr-date-range-picker';\n\n /** Build a predicate that narrows the query. */\n static with(options: WrDateRangePickerHarnessFilters = {}): HarnessPredicate<WrDateRangePickerHarness> {\n return new HarnessPredicate(WrDateRangePickerHarness, options)\n .addOption('startText', options.startText, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getStartText(), text)\n )\n .addOption('endText', options.endText, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getEndText(), text)\n )\n .addOption('mode', options.mode, async (harness, mode) => (await harness.getMode()) === mode)\n .addOption('disabled', options.disabled, async (harness, disabled) => (await harness.isDisabled()) === disabled)\n .addOption('open', options.open, async (harness, open) => (await harness.isOpen()) === open);\n }\n\n protected readonly harnessName = 'WrDateRangePickerHarness';\n\n /** Which mode the picker is in, read from the `wr-date-range-picker--*` modifier. */\n async getMode(): Promise<'date' | 'datetime'> {\n return (await (await this.host()).hasClass('wr-date-range-picker--datetime')) ? 'datetime' : 'date';\n }\n\n /** What the start field is showing — `''` while that end is unpicked. */\n async getStartText(): Promise<string> {\n return (await this.field('start')).getProperty<string>('value');\n }\n\n /** What the end field is showing — `''` while that end is unpicked. */\n async getEndText(): Promise<string> {\n return (await this.field('end')).getProperty<string>('value');\n }\n\n /** The glyph rendered between the two fields (`[separator]`, `'–'` by default). */\n async getSeparator(): Promise<string> {\n return (await this.locatorFor('.wr-date-range-picker__separator')()).text();\n }\n\n /** The placeholder of one field. */\n async getPlaceholder(end: End): Promise<string> {\n return (await this.field(end)).getProperty<string>('placeholder');\n }\n\n /**\n * Type a date into the start field, replacing whatever is there.\n *\n * Ends typed out of order are NOT swapped here — the component settles the\n * ordering when the interaction is over, so call {@link blur} (or close the\n * popup) to see a normalised range.\n */\n async setStartText(text: string): Promise<void> {\n await this.type('start', text);\n }\n\n /** Type a date into the end field — see {@link setStartText} on ordering. */\n async setEndText(text: string): Promise<void> {\n await this.type('end', text);\n }\n\n /** Empty both fields, which clears the range. Neither end has a clear button. */\n async clear(): Promise<void> {\n await (await this.field('start')).clear();\n await (await this.field('end')).clear();\n }\n\n /** Whether the picker refuses interaction. */\n async isDisabled(): Promise<boolean> {\n return (await this.host()).hasClass('wr-date-range-picker--disabled');\n }\n\n /**\n * Whether the fields refuse typing. Stricter than `<wr-date-picker>`: a\n * read-only range picker also refuses to open, since two fields over one\n * calendar leaves no reading of \"untypeable\" that still lets the grid rewrite\n * both ends.\n */\n async isReadonly(): Promise<boolean> {\n return (await this.field('start')).getProperty<boolean>('readOnly');\n }\n\n /** Move focus to one field. */\n async focus(end: End): Promise<void> {\n return (await this.field(end)).focus();\n }\n\n /**\n * Blur one field. This is the moment an out-of-order range is put back in\n * order, and — when focus leaves the control rather than hopping to the other\n * end — the moment `touch` is emitted.\n */\n async blur(end: End): Promise<void> {\n return (await this.field(end)).blur();\n }\n\n /** Whether one field currently has focus. */\n async isFocused(end: End): Promise<boolean> {\n return (await this.field(end)).isFocused();\n }\n\n /**\n * One end's time stepper as `HH:MM`, plus `:SS` when `showSeconds` is on and\n * ` AM`/` PM` in 12-hour mode. `datetime` mode only.\n */\n async getTime(end: End): Promise<string> {\n return (await this.timePanel(end)).getTimeText();\n }\n\n /** Type into one end's time stepper. Omitted fields are left alone. */\n async setTime(end: End, fields: WrDatePickerTimeFields): Promise<void> {\n await (await this.timePanel(end)).setFields(fields);\n }\n\n /** Click one of an end's ▲ / ▼ buttons. Minutes and seconds move by `step`. */\n async stepTime(end: End, unit: 'hours' | 'minutes' | 'seconds', direction: 1 | -1): Promise<void> {\n await (await this.timePanel(end)).step(unit, direction);\n }\n\n /** Flip one end between AM and PM. Throws in 24-hour mode, which has no such control. */\n async toggleMeridiem(end: End): Promise<void> {\n await (await this.timePanel(end)).toggleMeridiem();\n }\n\n private async type(end: End, text: string): Promise<void> {\n const field = await this.field(end);\n await field.clear();\n // `sendKeys()` with an empty string throws — clearing was the whole request.\n if (text) await field.sendKeys(text);\n }\n\n /** The two fields are addressed by position, which is the order they render in. */\n private async field(end: End): Promise<TestElement> {\n const fields = await this.locatorForAll('.wr-date-range-picker__input')();\n const field = fields[end === 'start' ? 0 : 1];\n if (!field) {\n throw new Error(`${this.harnessName}: no \"${end}\" field — the picker rendered ${fields.length} of them.`);\n }\n\n return field;\n }\n\n /**\n * One end's stepper. Both are mounted together in `datetime` mode, start first —\n * the group labels are localized, so position is the addressable thing.\n */\n private async timePanel(end: End): Promise<WrTimePanelHarness> {\n const panels = await this.timePanels();\n if (panels.length === 0) {\n throw new Error(\n `${this.harnessName}: this popup has no time steppers — mode=\"date\" renders a calendar only. Use ` +\n 'mode=\"datetime\".'\n );\n }\n\n const panel = panels[end === 'start' ? 0 : 1];\n if (!panel) {\n throw new Error(`${this.harnessName}: no \"${end}\" time stepper — the popup rendered ${panels.length}.`);\n }\n\n return panel;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["WrDatePickerDayHarness"],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-date-picker-testing.mjs","sources":["../../../projects/lib/date-picker/testing/wr-date-picker-day-harness.ts","../../../projects/lib/date-picker/testing/wr-time-panel-harness.ts","../../../projects/lib/date-picker/testing/wr-date-picker-harness-base.ts","../../../projects/lib/date-picker/testing/wr-date-picker-harness.ts","../../../projects/lib/date-picker/testing/wr-date-range-picker-harness.ts","../../../projects/lib/date-picker/testing/ngwr-date-picker-testing.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\n/**\n * The day cell of a date-picker's calendar, under the name it shipped as.\n *\n * There is one implementation, and it lives with the component that owns the\n * element: a picker's popup IS a `<wr-calendar>`, and `.wr-calendar__day` is its\n * cell. `ngwr/calendar/testing` is therefore the home, and this alias keeps\n * `WrDatePickerDayHarness` working for every spec that already imports it — the two\n * names are the same class, so a harness from either query is usable with either.\n */\nexport { WrCalendarDayHarness as WrDatePickerDayHarness } from 'ngwr/calendar/testing';\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerTimeFields } from './interfaces';\n\n/** Column order inside the stepper, which is also the order the boxes render in. */\nconst UNITS = ['hours', 'minutes', 'seconds'] as const;\n\n/** One unit of a time stepper. */\ntype Unit = (typeof UNITS)[number];\n\nfunction missingColumn(unit: Unit, method: string): string {\n return `${method}(): this stepper has no ${unit} column — seconds only render with [showSeconds]=\"true\".`;\n}\n\n/**\n * The `<wr-time-picker>` stepper inside a date-picker popup.\n *\n * Deliberately NOT exported from the entry point: the component is `@internal`\n * (`<wr-date-picker mode=\"time\">` is how a consumer gets one), so the picker\n * harnesses re-publish what it can do — `getTime()`, `setTime()`, `stepTime()`,\n * `toggleMeridiem()` — rather than handing out this class. It exists so the\n * range picker, which renders one stepper PER END, can address them\n * independently instead of by CSS nth-of-type gymnastics.\n *\n * Units are addressed by position, not by the boxes' `aria-label`: every string\n * in this panel now resolves through the i18n catalog (`datePicker.hours`,\n * `datePicker.incrementHours`, `datePicker.am` …), so keying on them would make\n * this harness answer in whatever locale the app under test is configured for.\n * Column order is the layout contract.\n *\n * @internal\n */\nexport class WrTimePanelHarness extends ComponentHarness {\n static hostSelector = '.wr-time-picker';\n\n /** The stepper's value as `HH:MM`, plus `:SS` and a space-joined {@link getMeridiem} when those columns exist. */\n async getTimeText(): Promise<string> {\n const parts = [await this.getValue('hours'), await this.getValue('minutes')];\n const seconds = await this.getOptionalValue('seconds');\n if (seconds !== null) parts.push(seconds);\n\n const meridiem = await this.getMeridiem();\n return meridiem ? `${parts.join(':')} ${meridiem}` : parts.join(':');\n }\n\n /**\n * The meridiem column's rendered text, or `null` when the stepper is in\n * 24-hour mode. `'AM'` / `'PM'` on the built-in fallbacks — it reads whatever\n * `datePicker.am` / `datePicker.pm` resolve to, so a configured catalog\n * changes the answer.\n */\n async getMeridiem(): Promise<string | null> {\n const label = await this.locatorForOptional('.wr-time-picker__label')();\n return label ? label.text() : null;\n }\n\n /**\n * Type into the boxes named by `fields`, leaving the rest alone.\n *\n * Each box is cleared and retyped rather than assigned: the panel reads an\n * emptied box as someone mid-retype and deliberately commits nothing for it, so\n * a harness that only cleared would look like a no-op.\n */\n async setFields(fields: WrDatePickerTimeFields): Promise<void> {\n for (const unit of UNITS) {\n const value = fields[unit];\n if (value === undefined) continue;\n\n const box = await this.box(unit, 'setTime');\n await box.clear();\n await box.sendKeys(String(value));\n }\n }\n\n /** Click a unit's ▲ / ▼ button once. Minutes and seconds move by the picker's `step`. */\n async step(unit: Unit, direction: 1 | -1): Promise<void> {\n // The AM/PM column contributes a ▲ and a ▼ of its own, and it is always\n // last — so it cannot be excluded by index alone: with seconds off, the\n // third ▲ in the panel IS the meridiem toggle.\n const suffix = direction === 1 ? 'up' : 'down';\n const buttons = await this.locatorForAll(\n `.wr-time-picker__col:not(.wr-time-picker__col--ampm) .wr-time-picker__step--${suffix}`\n )();\n\n const button = buttons[UNITS.indexOf(unit)];\n if (!button) throw new Error(missingColumn(unit, 'stepTime'));\n\n await button.click();\n }\n\n /** Flip AM ↔ PM. Throws on a 24-hour stepper, which has no such control. */\n async toggleMeridiem(): Promise<void> {\n const button = await this.locatorForOptional('.wr-time-picker__col--ampm .wr-time-picker__step--up')();\n if (!button) {\n throw new Error(\n 'toggleMeridiem(): this stepper has no AM / PM control — it is in 24-hour mode. Pass ' +\n 'timeFormat=\"12h\" (or a locale that resolves to 12-hour time) to get one.'\n );\n }\n\n await button.click();\n }\n\n /** A unit's rendered (zero-padded) value. */\n private async getValue(unit: Unit): Promise<string> {\n return (await this.box(unit, 'getTime')).getProperty<string>('value');\n }\n\n /** Same, but `null` when the column is not rendered at all. */\n private async getOptionalValue(unit: Unit): Promise<string | null> {\n const boxes = await this.boxes();\n const box = boxes[UNITS.indexOf(unit)];\n return box ? box.getProperty<string>('value') : null;\n }\n\n private async box(unit: Unit, method: string): Promise<TestElement> {\n const boxes = await this.boxes();\n const box = boxes[UNITS.indexOf(unit)];\n if (!box) throw new Error(missingColumn(unit, method));\n return box;\n }\n\n /** The typable boxes, in column order — the AM/PM column is a `<span>`, not one of these. */\n private async boxes(): Promise<TestElement[]> {\n return this.locatorForAll('.wr-time-picker__input')();\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ComponentHarness, type HarnessLoader, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerDayHarnessFilters } from './interfaces';\nimport { WrDatePickerDayHarness } from './wr-date-picker-day-harness';\nimport { WrTimePanelHarness } from './wr-time-panel-harness';\n\n/** The first element whose trimmed text is exactly `text`. */\nasync function byText(elements: TestElement[], text: string): Promise<TestElement | null> {\n for (const element of elements) {\n if ((await element.text()) === text) return element;\n }\n return null;\n}\n\n/**\n * Everything `<wr-date-picker>` and `<wr-date-range-picker>` do identically: the\n * trigger button, the popup it owns, and the `<wr-calendar>` inside it. Both\n * components render the SAME trigger element (`.wr-date-picker__trigger` — the\n * range picker reuses the class rather than minting its own) and both publish\n * their popup's id through the trigger's `aria-controls`, so the scoping story is\n * shared too.\n *\n * Not exported from the entry point — a consumer works with one of the two\n * concrete harnesses.\n *\n * @internal\n */\nexport abstract class WrDatePickerHarnessBase extends ComponentHarness {\n /** Concrete class name, so errors read like the harness the caller reached for. */\n protected abstract readonly harnessName: string;\n\n /**\n * Whether the popup is up.\n *\n * Read from the trigger's `aria-expanded` rather than from a host class: unlike\n * `wr-select`, neither picker carries an `--open` modifier, and the ARIA state\n * is the thing a consumer's users actually get told.\n */\n async isOpen(): Promise<boolean> {\n return (await (await this.trigger()).getAttribute('aria-expanded')) === 'true';\n }\n\n /** Open the popup from the trigger. An already-open picker is left alone. */\n async open(): Promise<void> {\n if (await this.isOpen()) return;\n\n await (await this.trigger()).click();\n if (await this.isOpen()) return;\n\n throw new Error(\n `${this.harnessName}.open(): the trigger did not open a popup. A disabled picker refuses to open, and so ` +\n 'does a readonly <wr-date-range-picker> — a readonly <wr-date-picker>, deliberately, still opens.'\n );\n }\n\n /**\n * Close the popup by clicking the trigger again. A closed picker is left alone.\n *\n * Deliberately not Escape: the CDK dispatches a keydown to the TOP-MOST overlay,\n * so with two pickers open this would close whichever opened last rather than\n * this one. The trigger only ever toggles its own popup.\n */\n async close(): Promise<void> {\n if (!(await this.isOpen())) return;\n\n await (await this.trigger()).click();\n }\n\n /** The popup's role — `'dialog'`, which is what the trigger's `aria-haspopup` promises. */\n async getPanelRole(): Promise<string | null> {\n return (await this.panel()).getAttribute('role');\n }\n\n /**\n * The popup's accessible name. Defaults to a catalog string chosen by `mode`\n * (\"Choose date\", \"Choose time\", …) and is overridden by `[panelAriaLabel]`.\n */\n async getPanelAriaLabel(): Promise<string | null> {\n return (await this.panel()).getAttribute('aria-label');\n }\n\n /**\n * Which of the calendar's three views is showing. The header label zooms out\n * (day → month → year); picking a month or a year zooms back in.\n */\n async getView(): Promise<'day' | 'month' | 'year'> {\n if (await this.inPanel('[role=\"grid\"]')) return 'day';\n if (await this.inPanel('.wr-calendar__months')) return 'month';\n if (await this.inPanel('.wr-calendar__years')) return 'year';\n\n throw new Error(this.noCalendar('getView'));\n }\n\n /**\n * The calendar's header: `'January 2025'` in the day view, `'2025'` in the month\n * view, `'2016 – 2027'` in the year view.\n */\n async getPanelHeader(): Promise<string> {\n const label = await this.inPanel('.wr-calendar__label');\n if (!label) throw new Error(this.noCalendar('getPanelHeader'));\n\n return label.text();\n }\n\n /** The weekday strip, in display order — `role=\"columnheader\"` cells of the grid's first row. */\n async getWeekdayLabels(): Promise<string[]> {\n const cells = await this.allInPanel('[role=\"columnheader\"]');\n if (cells.length === 0) {\n throw new Error(\n `${this.harnessName}.getWeekdayLabels(): no weekday strip. Only the day view has one, and mode=\"time\" ` +\n 'has no calendar at all.'\n );\n }\n\n return Promise.all(cells.map(cell => cell.text()));\n }\n\n /**\n * Step the calendar forwards. What one step MEANS follows the active view, as\n * the button's own `aria-label` says: a month in the day view, a year in the\n * month view, twelve years in the year view.\n */\n async next(): Promise<void> {\n await this.navigate('next');\n }\n\n /** Step the calendar backwards — see {@link next} for what one step covers. */\n async previous(): Promise<void> {\n await this.navigate('prev');\n }\n\n /**\n * Zoom out one level by clicking the header, the way a user does: day → month,\n * month → year. Throws at the year view, where the header is inert.\n */\n async zoomOut(): Promise<void> {\n const label = await this.inPanel('.wr-calendar__label');\n if (!label) throw new Error(this.noCalendar('zoomOut'));\n\n if (await label.getProperty<boolean>('disabled')) {\n throw new Error(\n `${this.harnessName}.zoomOut(): the header is inert — the calendar is already showing the year view ` +\n '(or the whole picker is disabled), and there is nothing further to zoom out to.'\n );\n }\n\n await label.click();\n }\n\n /** Pick a month in the month view, by 0-based index or by the label the calendar renders. */\n async selectMonth(month: number | string): Promise<void> {\n const chips = await this.allInPanel('.wr-calendar__months .wr-calendar__chip');\n if (chips.length === 0) {\n throw new Error(\n `${this.harnessName}.selectMonth(): the calendar is not showing its month view — call zoomOut() first.`\n );\n }\n\n const chip = typeof month === 'number' ? chips[month] : await byText(chips, month);\n if (!chip) {\n throw new Error(\n `${this.harnessName}.selectMonth(${JSON.stringify(month)}): no such month. Pass a 0-based index, or the ` +\n 'label the calendar renders — a short month name in the active locale.'\n );\n }\n\n await chip.click();\n }\n\n /** Pick a year in the year view. Only the twelve on show can be picked. */\n async selectYear(year: number): Promise<void> {\n const chips = await this.allInPanel('.wr-calendar__years .wr-calendar__chip');\n if (chips.length === 0) {\n throw new Error(\n `${this.harnessName}.selectYear(): the calendar is not showing its year view — call zoomOut() until ` +\n 'getView() answers \"year\".'\n );\n }\n\n const chip = await byText(chips, String(year));\n if (!chip) {\n const shown = await Promise.all(chips.map(candidate => candidate.text()));\n throw new Error(\n `${this.harnessName}.selectYear(${year}): the year view is showing ${shown[0]}-${shown[shown.length - 1]} ` +\n '— call previous() / next() to move the twelve-year window first.'\n );\n }\n\n await chip.click();\n }\n\n /**\n * The day cells of the calendar in this picker's popup, in DOM order — 42 of\n * them, since the grid is always six weeks and pads into the neighbouring\n * months.\n */\n async getDays(filters: WrDatePickerDayHarnessFilters = {}): Promise<WrDatePickerDayHarness[]> {\n await this.requireGrid('getDays');\n\n return (await this.panelLoader()).getAllHarnesses(WrDatePickerDayHarness.with(filters));\n }\n\n /**\n * One day of the month on show. The padding days of the neighbouring months are\n * skipped, so `getDay(1)` is the 1st of THIS month and never the 1st of the next.\n */\n async getDay(dayOfMonth: number): Promise<WrDatePickerDayHarness> {\n const cells = await this.getDays({ text: String(dayOfMonth) });\n for (const cell of cells) {\n if (!(await cell.isOutOfMonth())) return cell;\n }\n\n throw new Error(\n `${this.harnessName}.getDay(${dayOfMonth}): the month on show (${await this.getPanelHeader()}) has no such ` +\n 'day. Cells belonging to the neighbouring months are deliberately not matched — call previous() / next() ' +\n 'to change month.'\n );\n }\n\n /** Click a day of the month on show. */\n async selectDay(dayOfMonth: number): Promise<void> {\n const cell = await this.getDay(dayOfMonth);\n if (await cell.isDisabled()) {\n throw new Error(\n `${this.harnessName}.selectDay(${dayOfMonth}): that day is disabled — min / max or dateFilter rules it ` +\n 'out, and a disabled cell swallows the click rather than picking anything.'\n );\n }\n\n await cell.click();\n }\n\n /** The trigger button. Both components render it with the same class. */\n protected async trigger(): Promise<TestElement> {\n return this.locatorFor('.wr-date-picker__trigger')();\n }\n\n /**\n * The id of THIS picker's popup.\n *\n * The trigger publishes it as `aria-controls` only while the popup is up, which\n * makes one lookup answer both questions — is it open, and which of the panes\n * in the shared overlay container is ours.\n */\n protected async panelId(): Promise<string> {\n const id = await (await this.trigger()).getAttribute('aria-controls');\n if (!id) {\n throw new Error(\n `${this.harnessName}: the popup is closed — call open() first. The trigger only publishes aria-controls ` +\n 'while its popup is up.'\n );\n }\n\n return id;\n }\n\n /** A loader scoped to THIS picker's popup, so a second open picker cannot answer for it. */\n protected async panelLoader(): Promise<HarnessLoader> {\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${await this.panelId()}`);\n }\n\n /** One element inside THIS picker's popup, or `null`. */\n protected async inPanel(selector: string): Promise<TestElement | null> {\n return this.documentRootLocatorFactory().locatorForOptional(`#${await this.panelId()} ${selector}`)();\n }\n\n /** Every matching element inside THIS picker's popup, in DOM order. */\n protected async allInPanel(selector: string): Promise<TestElement[]> {\n return this.documentRootLocatorFactory().locatorForAll(`#${await this.panelId()} ${selector}`)();\n }\n\n /**\n * The time steppers in this popup, in DOM order — none in `date` mode, one for\n * `time` / `datetime`, and two (start then end) for a datetime range.\n */\n protected async timePanels(): Promise<WrTimePanelHarness[]> {\n return (await this.panelLoader()).getAllHarnesses(WrTimePanelHarness);\n }\n\n private async navigate(direction: 'prev' | 'next'): Promise<void> {\n const button = await this.inPanel(`.wr-calendar__nav--${direction}`);\n if (!button) throw new Error(this.noCalendar(direction === 'next' ? 'next' : 'previous'));\n\n await button.click();\n }\n\n /** Fail early on the day-cell methods rather than answering with an empty list. */\n private async requireGrid(method: string): Promise<void> {\n if (await this.inPanel('[role=\"grid\"]')) return;\n\n throw new Error(\n `${this.harnessName}.${method}(): this popup has no day grid. mode=\"time\" renders a time stepper only, and a ` +\n 'calendar zoomed out to its month / year view offers chips instead of day cells — selectMonth() / ' +\n 'selectYear() come back to the days.'\n );\n }\n\n private async panel(): Promise<TestElement> {\n return this.documentRootLocatorFactory().locatorFor(`#${await this.panelId()}`)();\n }\n\n private noCalendar(method: string): string {\n return `${this.harnessName}.${method}(): this popup has no calendar — mode=\"time\" renders a time stepper only.`;\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { HarnessPredicate, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerHarnessFilters, WrDatePickerTimeFields } from './interfaces';\nimport { WrDatePickerHarnessBase } from './wr-date-picker-harness-base';\nimport type { WrTimePanelHarness } from './wr-time-panel-harness';\n\n/**\n * Test harness for `<wr-date-picker>` — the `date`, `time` and `datetime` modes\n * of the one component.\n *\n * The popup is NOT inside the picker: it is a pane in the overlay container, a\n * sibling of the whole app. Everything inside it is therefore reached through the\n * document root, scoped by the id the trigger publishes as `aria-controls` —\n * which is what keeps two pickers on one page from reading each other's calendar.\n *\n * The value lives in a text field, so there are two ways in and the harness\n * offers both: {@link setValueText} types a date, {@link selectDay} picks one out\n * of the grid. There is deliberately no clear BUTTON on this component — an\n * emptied field is what clears the value, and that is what {@link clear} does.\n *\n * @example\n * ```ts\n * const picker = await loader.getHarness(WrDatePickerHarness);\n *\n * await picker.open();\n * expect(await picker.getPanelHeader()).toBe('January 2025');\n * await picker.selectDay(14);\n *\n * expect(await picker.getValueText()).toBe('14.01.2025');\n * expect(await (await picker.getDay(14)).isSelected()).toBe(true);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrDatePickerHarness extends WrDatePickerHarnessBase {\n static hostSelector = 'wr-date-picker';\n\n /** Build a predicate that narrows the query. */\n static with(options: WrDatePickerHarnessFilters = {}): HarnessPredicate<WrDatePickerHarness> {\n return new HarnessPredicate(WrDatePickerHarness, options)\n .addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getValueText(), text))\n .addOption('placeholder', options.placeholder, (harness, placeholder) =>\n HarnessPredicate.stringMatches(harness.getPlaceholder(), placeholder)\n )\n .addOption('mode', options.mode, async (harness, mode) => (await harness.getMode()) === mode)\n .addOption('disabled', options.disabled, async (harness, disabled) => (await harness.isDisabled()) === disabled)\n .addOption('open', options.open, async (harness, open) => (await harness.isOpen()) === open);\n }\n\n protected readonly harnessName = 'WrDatePickerHarness';\n\n /** Which mode the picker is in, read from the `wr-date-picker--*` modifier. */\n async getMode(): Promise<'date' | 'time' | 'datetime'> {\n const host = await this.host();\n if (await host.hasClass('wr-date-picker--time')) return 'time';\n if (await host.hasClass('wr-date-picker--datetime')) return 'datetime';\n return 'date';\n }\n\n /**\n * What the field is showing: the value in the picker's `format`, or `''` when it\n * is empty and the placeholder is up.\n */\n async getValueText(): Promise<string> {\n return (await this.field()).getProperty<string>('value');\n }\n\n /** The field's placeholder. */\n async getPlaceholder(): Promise<string> {\n return (await this.field()).getProperty<string>('placeholder');\n }\n\n /**\n * Type a date into the field, replacing whatever is there.\n *\n * The field is cleared first, so the value passes through `null` on the way —\n * exactly as it does for a user who selects all and types over it. The picker\n * parses on every keystroke and commits only when the text parses in full, so a\n * partial or out-of-bounds entry leaves the model on its last good value.\n */\n async setValueText(text: string): Promise<void> {\n const field = await this.field();\n await field.clear();\n // `sendKeys()` with an empty string throws — clearing was the whole request.\n if (text) await field.sendKeys(text);\n }\n\n /**\n * Empty the field, which clears the value.\n *\n * There is no clear button to click: unlike `wr-select`, this component ships no\n * `×` affordance, and an empty field is the documented way to get back to `null`.\n */\n async clear(): Promise<void> {\n await (await this.field()).clear();\n }\n\n /** Whether the picker refuses interaction. */\n async isDisabled(): Promise<boolean> {\n return (await this.host()).hasClass('wr-date-picker--disabled');\n }\n\n /**\n * Whether the field refuses typing. A read-only picker still OPENS its popup —\n * documented behaviour, and the one place it parts company with the range picker.\n */\n async isReadonly(): Promise<boolean> {\n return (await this.field()).getProperty<boolean>('readOnly');\n }\n\n /** Move focus to the field. */\n async focus(): Promise<void> {\n return (await this.field()).focus();\n }\n\n /**\n * Blur the field, which is what reformats a value to canonical and emits `touch`\n * so a bound `[formField]` can mark itself touched.\n */\n async blur(): Promise<void> {\n return (await this.field()).blur();\n }\n\n /** Whether the field currently has focus. */\n async isFocused(): Promise<boolean> {\n return (await this.field()).isFocused();\n }\n\n /**\n * The open time stepper's value as `HH:MM`, plus `:SS` when `showSeconds` is on\n * and ` AM`/` PM` in 12-hour mode.\n */\n async getTime(): Promise<string> {\n return (await this.timePanel()).getTimeText();\n }\n\n /** Type into the open time stepper's boxes. Omitted fields are left alone. */\n async setTime(fields: WrDatePickerTimeFields): Promise<void> {\n await (await this.timePanel()).setFields(fields);\n }\n\n /** Click one of the stepper's ▲ / ▼ buttons. Minutes and seconds move by `step`. */\n async stepTime(unit: 'hours' | 'minutes' | 'seconds', direction: 1 | -1): Promise<void> {\n await (await this.timePanel()).step(unit, direction);\n }\n\n /** Flip the stepper between AM and PM. Throws in 24-hour mode, which has no such control. */\n async toggleMeridiem(): Promise<void> {\n await (await this.timePanel()).toggleMeridiem();\n }\n\n private async field(): Promise<TestElement> {\n return this.locatorFor('input[wrInput]')();\n }\n\n /** The one stepper in the popup — `panelId()` has already refused a closed picker. */\n private async timePanel(): Promise<WrTimePanelHarness> {\n const [panel] = await this.timePanels();\n if (!panel) {\n throw new Error(\n `${this.harnessName}: this popup has no time stepper — mode=\"date\" renders a calendar only. Use mode=\"time\" ` +\n 'or mode=\"datetime\".'\n );\n }\n\n return panel;\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { HarnessPredicate, type TestElement } from '@angular/cdk/testing';\n\nimport type { WrDatePickerTimeFields, WrDateRangePickerHarnessFilters } from './interfaces';\nimport { WrDatePickerHarnessBase } from './wr-date-picker-harness-base';\nimport type { WrTimePanelHarness } from './wr-time-panel-harness';\n\n/** Which end of the range a call applies to. */\ntype End = 'start' | 'end';\n\n/**\n * Test harness for `<wr-date-range-picker>` — two text fields over one range\n * calendar.\n *\n * A separate harness rather than a mode of {@link WrDatePickerHarness}, because\n * the DOM a spec has to reach is genuinely different: two fields with a separator\n * between them, and in `datetime` mode two time steppers instead of one. Every\n * call that could mean either field takes an explicit `'start'` / `'end'` — the\n * component's own bugs were nearly all \"which end did that belong to\", and a\n * harness that guessed would reproduce them.\n *\n * The popup, the calendar and the scoping work exactly as they do for the single\n * picker: a pane in the overlay container, addressed by the id the trigger\n * publishes as `aria-controls`.\n *\n * @example\n * ```ts\n * const period = await loader.getHarness(WrDateRangePickerHarness);\n *\n * await period.open();\n * await period.selectDay(14);\n * await period.selectDay(20);\n *\n * expect([await period.getStartText(), await period.getEndText()]).toEqual(['14.01.2025', '20.01.2025']);\n * ```\n *\n * @see https://ngwr.dev/guides/testing\n */\nexport class WrDateRangePickerHarness extends WrDatePickerHarnessBase {\n static hostSelector = 'wr-date-range-picker';\n\n /** Build a predicate that narrows the query. */\n static with(options: WrDateRangePickerHarnessFilters = {}): HarnessPredicate<WrDateRangePickerHarness> {\n return new HarnessPredicate(WrDateRangePickerHarness, options)\n .addOption('startText', options.startText, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getStartText(), text)\n )\n .addOption('endText', options.endText, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getEndText(), text)\n )\n .addOption('mode', options.mode, async (harness, mode) => (await harness.getMode()) === mode)\n .addOption('disabled', options.disabled, async (harness, disabled) => (await harness.isDisabled()) === disabled)\n .addOption('open', options.open, async (harness, open) => (await harness.isOpen()) === open);\n }\n\n protected readonly harnessName = 'WrDateRangePickerHarness';\n\n /** Which mode the picker is in, read from the `wr-date-range-picker--*` modifier. */\n async getMode(): Promise<'date' | 'datetime'> {\n return (await (await this.host()).hasClass('wr-date-range-picker--datetime')) ? 'datetime' : 'date';\n }\n\n /** What the start field is showing — `''` while that end is unpicked. */\n async getStartText(): Promise<string> {\n return (await this.field('start')).getProperty<string>('value');\n }\n\n /** What the end field is showing — `''` while that end is unpicked. */\n async getEndText(): Promise<string> {\n return (await this.field('end')).getProperty<string>('value');\n }\n\n /** The glyph rendered between the two fields (`[separator]`, `'–'` by default). */\n async getSeparator(): Promise<string> {\n return (await this.locatorFor('.wr-date-range-picker__separator')()).text();\n }\n\n /** The placeholder of one field. */\n async getPlaceholder(end: End): Promise<string> {\n return (await this.field(end)).getProperty<string>('placeholder');\n }\n\n /**\n * Type a date into the start field, replacing whatever is there.\n *\n * Ends typed out of order are NOT swapped here — the component settles the\n * ordering when the interaction is over, so call {@link blur} (or close the\n * popup) to see a normalised range.\n */\n async setStartText(text: string): Promise<void> {\n await this.type('start', text);\n }\n\n /** Type a date into the end field — see {@link setStartText} on ordering. */\n async setEndText(text: string): Promise<void> {\n await this.type('end', text);\n }\n\n /** Empty both fields, which clears the range. Neither end has a clear button. */\n async clear(): Promise<void> {\n await (await this.field('start')).clear();\n await (await this.field('end')).clear();\n }\n\n /** Whether the picker refuses interaction. */\n async isDisabled(): Promise<boolean> {\n return (await this.host()).hasClass('wr-date-range-picker--disabled');\n }\n\n /**\n * Whether the fields refuse typing. Stricter than `<wr-date-picker>`: a\n * read-only range picker also refuses to open, since two fields over one\n * calendar leaves no reading of \"untypeable\" that still lets the grid rewrite\n * both ends.\n */\n async isReadonly(): Promise<boolean> {\n return (await this.field('start')).getProperty<boolean>('readOnly');\n }\n\n /** Move focus to one field. */\n async focus(end: End): Promise<void> {\n return (await this.field(end)).focus();\n }\n\n /**\n * Blur one field. This is the moment an out-of-order range is put back in\n * order, and — when focus leaves the control rather than hopping to the other\n * end — the moment `touch` is emitted.\n */\n async blur(end: End): Promise<void> {\n return (await this.field(end)).blur();\n }\n\n /** Whether one field currently has focus. */\n async isFocused(end: End): Promise<boolean> {\n return (await this.field(end)).isFocused();\n }\n\n /**\n * One end's time stepper as `HH:MM`, plus `:SS` when `showSeconds` is on and\n * ` AM`/` PM` in 12-hour mode. `datetime` mode only.\n */\n async getTime(end: End): Promise<string> {\n return (await this.timePanel(end)).getTimeText();\n }\n\n /** Type into one end's time stepper. Omitted fields are left alone. */\n async setTime(end: End, fields: WrDatePickerTimeFields): Promise<void> {\n await (await this.timePanel(end)).setFields(fields);\n }\n\n /** Click one of an end's ▲ / ▼ buttons. Minutes and seconds move by `step`. */\n async stepTime(end: End, unit: 'hours' | 'minutes' | 'seconds', direction: 1 | -1): Promise<void> {\n await (await this.timePanel(end)).step(unit, direction);\n }\n\n /** Flip one end between AM and PM. Throws in 24-hour mode, which has no such control. */\n async toggleMeridiem(end: End): Promise<void> {\n await (await this.timePanel(end)).toggleMeridiem();\n }\n\n private async type(end: End, text: string): Promise<void> {\n const field = await this.field(end);\n await field.clear();\n // `sendKeys()` with an empty string throws — clearing was the whole request.\n if (text) await field.sendKeys(text);\n }\n\n /** The two fields are addressed by position, which is the order they render in. */\n private async field(end: End): Promise<TestElement> {\n const fields = await this.locatorForAll('.wr-date-range-picker__input')();\n const field = fields[end === 'start' ? 0 : 1];\n if (!field) {\n throw new Error(`${this.harnessName}: no \"${end}\" field — the picker rendered ${fields.length} of them.`);\n }\n\n return field;\n }\n\n /**\n * One end's stepper. Both are mounted together in `datetime` mode, start first —\n * the group labels are localized, so position is the addressable thing.\n */\n private async timePanel(end: End): Promise<WrTimePanelHarness> {\n const panels = await this.timePanels();\n if (panels.length === 0) {\n throw new Error(\n `${this.harnessName}: this popup has no time steppers — mode=\"date\" renders a calendar only. Use ` +\n 'mode=\"datetime\".'\n );\n }\n\n const panel = panels[end === 'start' ? 0 : 1];\n if (!panel) {\n throw new Error(`${this.harnessName}: no \"${end}\" time stepper — the popup rendered ${panels.length}.`);\n }\n\n return panel;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["WrDatePickerDayHarness"],"mappings":"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"}