ngwr 14.7.0 → 14.9.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 (482) hide show
  1. package/README.md +66 -332
  2. package/alert/styles/_index.scss +10 -0
  3. package/avatar/styles/_index.scss +18 -7
  4. package/badge/styles/_index.scss +7 -0
  5. package/badge/styles/_tag.scss +7 -1
  6. package/bar-chart/styles/_index.scss +1 -0
  7. package/button/styles/_index.scss +6 -0
  8. package/calendar-heatmap/styles/_index.scss +1 -0
  9. package/cascader/styles/_rules.scss +87 -15
  10. package/checkbox/styles/_index.scss +4 -0
  11. package/command-palette/styles/_index.scss +1 -1
  12. package/date-picker/styles/_index.scss +30 -0
  13. package/density/styles/_index.scss +4 -2
  14. package/divider/styles/_index.scss +2 -0
  15. package/donut-chart/styles/_index.scss +10 -0
  16. package/dropdown/styles/_index.scss +67 -5
  17. package/editor/styles/_index.scss +441 -0
  18. package/event-calendar/styles/_index.scss +209 -35
  19. package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -1
  20. package/fesm2022/ngwr-action-sheet.mjs +3 -3
  21. package/fesm2022/ngwr-action-sheet.mjs.map +1 -1
  22. package/fesm2022/ngwr-affix.mjs +3 -3
  23. package/fesm2022/ngwr-affix.mjs.map +1 -1
  24. package/fesm2022/ngwr-alert.mjs +3 -3
  25. package/fesm2022/ngwr-alert.mjs.map +1 -1
  26. package/fesm2022/ngwr-anchor.mjs +3 -3
  27. package/fesm2022/ngwr-anchor.mjs.map +1 -1
  28. package/fesm2022/ngwr-aurora.mjs +3 -3
  29. package/fesm2022/ngwr-aurora.mjs.map +1 -1
  30. package/fesm2022/ngwr-avatar.mjs +3 -3
  31. package/fesm2022/ngwr-avatar.mjs.map +1 -1
  32. package/fesm2022/ngwr-back-top.mjs +3 -3
  33. package/fesm2022/ngwr-back-top.mjs.map +1 -1
  34. package/fesm2022/ngwr-badge.mjs +28 -13
  35. package/fesm2022/ngwr-badge.mjs.map +1 -1
  36. package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -1
  37. package/fesm2022/ngwr-bar-chart.mjs +31 -6
  38. package/fesm2022/ngwr-bar-chart.mjs.map +1 -1
  39. package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -1
  40. package/fesm2022/ngwr-blur-text.mjs +3 -3
  41. package/fesm2022/ngwr-blur-text.mjs.map +1 -1
  42. package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -1
  43. package/fesm2022/ngwr-border-glow.mjs +3 -3
  44. package/fesm2022/ngwr-border-glow.mjs.map +1 -1
  45. package/fesm2022/ngwr-breadcrumbs.mjs +6 -6
  46. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  47. package/fesm2022/ngwr-burger.mjs +3 -3
  48. package/fesm2022/ngwr-burger.mjs.map +1 -1
  49. package/fesm2022/ngwr-button-testing.mjs.map +1 -1
  50. package/fesm2022/ngwr-button.mjs +6 -6
  51. package/fesm2022/ngwr-button.mjs.map +1 -1
  52. package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -1
  53. package/fesm2022/ngwr-calendar-heatmap.mjs +61 -6
  54. package/fesm2022/ngwr-calendar-heatmap.mjs.map +1 -1
  55. package/fesm2022/ngwr-calendar-testing.mjs.map +1 -1
  56. package/fesm2022/ngwr-calendar.mjs +3 -3
  57. package/fesm2022/ngwr-calendar.mjs.map +1 -1
  58. package/fesm2022/ngwr-card.mjs +9 -9
  59. package/fesm2022/ngwr-card.mjs.map +1 -1
  60. package/fesm2022/ngwr-carousel-testing.mjs.map +1 -1
  61. package/fesm2022/ngwr-carousel.mjs +6 -6
  62. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  63. package/fesm2022/ngwr-cascader-testing.mjs.map +1 -1
  64. package/fesm2022/ngwr-cascader.mjs +4 -4
  65. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  66. package/fesm2022/ngwr-checkbox-testing.mjs.map +1 -1
  67. package/fesm2022/ngwr-checkbox.mjs +18 -8
  68. package/fesm2022/ngwr-checkbox.mjs.map +1 -1
  69. package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -1
  70. package/fesm2022/ngwr-circular-text.mjs +3 -3
  71. package/fesm2022/ngwr-circular-text.mjs.map +1 -1
  72. package/fesm2022/ngwr-click-spark.mjs +3 -3
  73. package/fesm2022/ngwr-click-spark.mjs.map +1 -1
  74. package/fesm2022/ngwr-clipboard.mjs +3 -3
  75. package/fesm2022/ngwr-clipboard.mjs.map +1 -1
  76. package/fesm2022/ngwr-collapse-testing.mjs.map +1 -1
  77. package/fesm2022/ngwr-collapse.mjs +9 -9
  78. package/fesm2022/ngwr-collapse.mjs.map +1 -1
  79. package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -1
  80. package/fesm2022/ngwr-color-picker.mjs +6 -6
  81. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  82. package/fesm2022/ngwr-command-palette-testing.mjs.map +1 -1
  83. package/fesm2022/ngwr-command-palette.mjs +3 -3
  84. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  85. package/fesm2022/ngwr-compare.mjs +3 -3
  86. package/fesm2022/ngwr-compare.mjs.map +1 -1
  87. package/fesm2022/ngwr-confetti.mjs +3 -3
  88. package/fesm2022/ngwr-confetti.mjs.map +1 -1
  89. package/fesm2022/ngwr-config.mjs.map +1 -1
  90. package/fesm2022/ngwr-context-menu-testing.mjs.map +1 -1
  91. package/fesm2022/ngwr-context-menu.mjs +12 -12
  92. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  93. package/fesm2022/ngwr-cookie.mjs +3 -3
  94. package/fesm2022/ngwr-cookie.mjs.map +1 -1
  95. package/fesm2022/ngwr-counter.mjs +6 -6
  96. package/fesm2022/ngwr-counter.mjs.map +1 -1
  97. package/fesm2022/ngwr-date-adapters-fns.mjs +3 -3
  98. package/fesm2022/ngwr-date-adapters-fns.mjs.map +1 -1
  99. package/fesm2022/ngwr-date-adapters-luxon.mjs +3 -3
  100. package/fesm2022/ngwr-date-adapters-luxon.mjs.map +1 -1
  101. package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
  102. package/fesm2022/ngwr-date-picker.mjs +721 -62
  103. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  104. package/fesm2022/ngwr-date.mjs +3 -3
  105. package/fesm2022/ngwr-date.mjs.map +1 -1
  106. package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -1
  107. package/fesm2022/ngwr-decrypt-text.mjs +3 -3
  108. package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
  109. package/fesm2022/ngwr-density.mjs +6 -6
  110. package/fesm2022/ngwr-density.mjs.map +1 -1
  111. package/fesm2022/ngwr-descriptions.mjs +6 -6
  112. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  113. package/fesm2022/ngwr-dialog-testing.mjs.map +1 -1
  114. package/fesm2022/ngwr-dialog.mjs +15 -15
  115. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  116. package/fesm2022/ngwr-directives.mjs +12 -12
  117. package/fesm2022/ngwr-directives.mjs.map +1 -1
  118. package/fesm2022/ngwr-divider.mjs +3 -3
  119. package/fesm2022/ngwr-divider.mjs.map +1 -1
  120. package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -1
  121. package/fesm2022/ngwr-donut-chart.mjs +48 -6
  122. package/fesm2022/ngwr-donut-chart.mjs.map +1 -1
  123. package/fesm2022/ngwr-drag-drop.mjs +6 -6
  124. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  125. package/fesm2022/ngwr-drawer-testing.mjs.map +1 -1
  126. package/fesm2022/ngwr-drawer.mjs +18 -18
  127. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  128. package/fesm2022/ngwr-dropdown-testing.mjs.map +1 -1
  129. package/fesm2022/ngwr-dropdown.mjs +174 -25
  130. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  131. package/fesm2022/ngwr-editor-testing.mjs +568 -0
  132. package/fesm2022/ngwr-editor-testing.mjs.map +1 -0
  133. package/fesm2022/ngwr-editor.mjs +2601 -0
  134. package/fesm2022/ngwr-editor.mjs.map +1 -0
  135. package/fesm2022/ngwr-empty.mjs +3 -3
  136. package/fesm2022/ngwr-empty.mjs.map +1 -1
  137. package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -1
  138. package/fesm2022/ngwr-event-calendar.mjs +14 -7
  139. package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
  140. package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -1
  141. package/fesm2022/ngwr-falling-text.mjs +3 -3
  142. package/fesm2022/ngwr-falling-text.mjs.map +1 -1
  143. package/fesm2022/ngwr-file-upload-testing.mjs.map +1 -1
  144. package/fesm2022/ngwr-file-upload.mjs +3 -3
  145. package/fesm2022/ngwr-file-upload.mjs.map +1 -1
  146. package/fesm2022/ngwr-form-testing.mjs.map +1 -1
  147. package/fesm2022/ngwr-form.mjs +61 -10
  148. package/fesm2022/ngwr-form.mjs.map +1 -1
  149. package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -1
  150. package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
  151. package/fesm2022/ngwr-fuzzy-text.mjs.map +1 -1
  152. package/fesm2022/ngwr-gauge-testing.mjs.map +1 -1
  153. package/fesm2022/ngwr-gauge.mjs +35 -6
  154. package/fesm2022/ngwr-gauge.mjs.map +1 -1
  155. package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -1
  156. package/fesm2022/ngwr-glitch-text.mjs +3 -3
  157. package/fesm2022/ngwr-glitch-text.mjs.map +1 -1
  158. package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -1
  159. package/fesm2022/ngwr-gradient-text.mjs +3 -3
  160. package/fesm2022/ngwr-gradient-text.mjs.map +1 -1
  161. package/fesm2022/ngwr-graph-testing.mjs.map +1 -1
  162. package/fesm2022/ngwr-graph.mjs +6 -6
  163. package/fesm2022/ngwr-graph.mjs.map +1 -1
  164. package/fesm2022/ngwr-hotkey.mjs +6 -6
  165. package/fesm2022/ngwr-hotkey.mjs.map +1 -1
  166. package/fesm2022/ngwr-i18n-ar.mjs +31 -0
  167. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  168. package/fesm2022/ngwr-i18n-cs.mjs +31 -0
  169. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  170. package/fesm2022/ngwr-i18n-de.mjs +31 -0
  171. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  172. package/fesm2022/ngwr-i18n-en.mjs +39 -0
  173. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  174. package/fesm2022/ngwr-i18n-es.mjs +31 -0
  175. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  176. package/fesm2022/ngwr-i18n-fr.mjs +31 -0
  177. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  178. package/fesm2022/ngwr-i18n-he.mjs +31 -0
  179. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  180. package/fesm2022/ngwr-i18n-hi.mjs +31 -0
  181. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  182. package/fesm2022/ngwr-i18n-id.mjs +31 -0
  183. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  184. package/fesm2022/ngwr-i18n-it.mjs +31 -0
  185. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  186. package/fesm2022/ngwr-i18n-ja.mjs +31 -0
  187. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  188. package/fesm2022/ngwr-i18n-ko.mjs +31 -0
  189. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  190. package/fesm2022/ngwr-i18n-nl.mjs +31 -0
  191. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  192. package/fesm2022/ngwr-i18n-pl.mjs +31 -0
  193. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  194. package/fesm2022/ngwr-i18n-pt.mjs +31 -0
  195. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  196. package/fesm2022/ngwr-i18n-ru.mjs +31 -0
  197. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  198. package/fesm2022/ngwr-i18n-sv.mjs +31 -0
  199. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  200. package/fesm2022/ngwr-i18n-tr.mjs +31 -0
  201. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  202. package/fesm2022/ngwr-i18n-uk.mjs +31 -0
  203. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  204. package/fesm2022/ngwr-i18n-vi.mjs +31 -0
  205. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  206. package/fesm2022/ngwr-i18n-zh-TW.mjs +31 -0
  207. package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
  208. package/fesm2022/ngwr-i18n-zh.mjs +31 -0
  209. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  210. package/fesm2022/ngwr-i18n.mjs +9 -9
  211. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  212. package/fesm2022/ngwr-icon-adapters-feather.mjs.map +1 -1
  213. package/fesm2022/ngwr-icon-adapters-lucide.mjs.map +1 -1
  214. package/fesm2022/ngwr-icon.mjs +6 -6
  215. package/fesm2022/ngwr-icon.mjs.map +1 -1
  216. package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -1
  217. package/fesm2022/ngwr-image-cropper.mjs +3 -3
  218. package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
  219. package/fesm2022/ngwr-input-number-testing.mjs.map +1 -1
  220. package/fesm2022/ngwr-input-number.mjs +15 -3
  221. package/fesm2022/ngwr-input-number.mjs.map +1 -1
  222. package/fesm2022/ngwr-input-otp-testing.mjs.map +1 -1
  223. package/fesm2022/ngwr-input-otp.mjs +3 -3
  224. package/fesm2022/ngwr-input-otp.mjs.map +1 -1
  225. package/fesm2022/ngwr-input-testing.mjs.map +1 -1
  226. package/fesm2022/ngwr-input.mjs +15 -15
  227. package/fesm2022/ngwr-input.mjs.map +1 -1
  228. package/fesm2022/ngwr-keyboard.mjs +3 -3
  229. package/fesm2022/ngwr-keyboard.mjs.map +1 -1
  230. package/fesm2022/ngwr-knob-testing.mjs.map +1 -1
  231. package/fesm2022/ngwr-knob.mjs +3 -3
  232. package/fesm2022/ngwr-knob.mjs.map +1 -1
  233. package/fesm2022/ngwr-layout.mjs +15 -15
  234. package/fesm2022/ngwr-layout.mjs.map +1 -1
  235. package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -1
  236. package/fesm2022/ngwr-lightbox.mjs +3 -3
  237. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  238. package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -1
  239. package/fesm2022/ngwr-line-chart.mjs +18 -7
  240. package/fesm2022/ngwr-line-chart.mjs.map +1 -1
  241. package/fesm2022/ngwr-list.mjs +6 -6
  242. package/fesm2022/ngwr-list.mjs.map +1 -1
  243. package/fesm2022/ngwr-loading-bar-router.mjs.map +1 -1
  244. package/fesm2022/ngwr-loading-bar.mjs +6 -6
  245. package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
  246. package/fesm2022/ngwr-markdown-testing.mjs.map +1 -1
  247. package/fesm2022/ngwr-markdown.mjs +798 -17
  248. package/fesm2022/ngwr-markdown.mjs.map +1 -1
  249. package/fesm2022/ngwr-marquee-testing.mjs.map +1 -1
  250. package/fesm2022/ngwr-marquee.mjs +3 -3
  251. package/fesm2022/ngwr-marquee.mjs.map +1 -1
  252. package/fesm2022/ngwr-media.mjs +3 -3
  253. package/fesm2022/ngwr-media.mjs.map +1 -1
  254. package/fesm2022/ngwr-mention-testing.mjs.map +1 -1
  255. package/fesm2022/ngwr-mention.mjs +6 -6
  256. package/fesm2022/ngwr-mention.mjs.map +1 -1
  257. package/fesm2022/ngwr-meta.mjs +6 -6
  258. package/fesm2022/ngwr-meta.mjs.map +1 -1
  259. package/fesm2022/ngwr-meter-group-testing.mjs +7 -3
  260. package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -1
  261. package/fesm2022/ngwr-meter-group.mjs +26 -6
  262. package/fesm2022/ngwr-meter-group.mjs.map +1 -1
  263. package/fesm2022/ngwr-overlay.mjs +6 -6
  264. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  265. package/fesm2022/ngwr-page-header.mjs +13 -5
  266. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  267. package/fesm2022/ngwr-pagination-testing.mjs.map +1 -1
  268. package/fesm2022/ngwr-pagination.mjs +3 -3
  269. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  270. package/fesm2022/ngwr-pipes.mjs +21 -21
  271. package/fesm2022/ngwr-pipes.mjs.map +1 -1
  272. package/fesm2022/ngwr-platform.mjs +9 -9
  273. package/fesm2022/ngwr-platform.mjs.map +1 -1
  274. package/fesm2022/ngwr-popconfirm-testing.mjs.map +1 -1
  275. package/fesm2022/ngwr-popconfirm.mjs +6 -6
  276. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  277. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  278. package/fesm2022/ngwr-popover.mjs +578 -16
  279. package/fesm2022/ngwr-popover.mjs.map +1 -1
  280. package/fesm2022/ngwr-progress.mjs +3 -3
  281. package/fesm2022/ngwr-progress.mjs.map +1 -1
  282. package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
  283. package/fesm2022/ngwr-pull-to-refresh.mjs.map +1 -1
  284. package/fesm2022/ngwr-qr.mjs +3 -3
  285. package/fesm2022/ngwr-qr.mjs.map +1 -1
  286. package/fesm2022/ngwr-radio-testing.mjs.map +1 -1
  287. package/fesm2022/ngwr-radio.mjs +6 -6
  288. package/fesm2022/ngwr-radio.mjs.map +1 -1
  289. package/fesm2022/ngwr-rating-testing.mjs.map +1 -1
  290. package/fesm2022/ngwr-rating.mjs +3 -3
  291. package/fesm2022/ngwr-rating.mjs.map +1 -1
  292. package/fesm2022/ngwr-result.mjs +12 -12
  293. package/fesm2022/ngwr-result.mjs.map +1 -1
  294. package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -1
  295. package/fesm2022/ngwr-rotating-text.mjs +3 -3
  296. package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
  297. package/fesm2022/ngwr-schema-form.mjs +3 -3
  298. package/fesm2022/ngwr-schema-form.mjs.map +1 -1
  299. package/fesm2022/ngwr-scroll.mjs +3 -3
  300. package/fesm2022/ngwr-scroll.mjs.map +1 -1
  301. package/fesm2022/ngwr-segmented-testing.mjs.map +1 -1
  302. package/fesm2022/ngwr-segmented.mjs +3 -3
  303. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  304. package/fesm2022/ngwr-select-testing.mjs.map +1 -1
  305. package/fesm2022/ngwr-select.mjs +12 -12
  306. package/fesm2022/ngwr-select.mjs.map +1 -1
  307. package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -1
  308. package/fesm2022/ngwr-shiny-text.mjs +6 -6
  309. package/fesm2022/ngwr-shiny-text.mjs.map +1 -1
  310. package/fesm2022/ngwr-sidebar.mjs +10 -3
  311. package/fesm2022/ngwr-sidebar.mjs.map +1 -1
  312. package/fesm2022/ngwr-skeleton.mjs +3 -3
  313. package/fesm2022/ngwr-skeleton.mjs.map +1 -1
  314. package/fesm2022/ngwr-slider-testing.mjs.map +1 -1
  315. package/fesm2022/ngwr-slider.mjs +3 -3
  316. package/fesm2022/ngwr-slider.mjs.map +1 -1
  317. package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -1
  318. package/fesm2022/ngwr-sparkline.mjs +84 -10
  319. package/fesm2022/ngwr-sparkline.mjs.map +1 -1
  320. package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -1
  321. package/fesm2022/ngwr-speed-dial.mjs +3 -3
  322. package/fesm2022/ngwr-speed-dial.mjs.map +1 -1
  323. package/fesm2022/ngwr-spinner.mjs +3 -3
  324. package/fesm2022/ngwr-spinner.mjs.map +1 -1
  325. package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -1
  326. package/fesm2022/ngwr-splash-cursor.mjs +3 -3
  327. package/fesm2022/ngwr-splash-cursor.mjs.map +1 -1
  328. package/fesm2022/ngwr-split-text-testing.mjs.map +1 -1
  329. package/fesm2022/ngwr-split-text.mjs +3 -3
  330. package/fesm2022/ngwr-split-text.mjs.map +1 -1
  331. package/fesm2022/ngwr-splitter-testing.mjs.map +1 -1
  332. package/fesm2022/ngwr-splitter.mjs +3 -3
  333. package/fesm2022/ngwr-splitter.mjs.map +1 -1
  334. package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -1
  335. package/fesm2022/ngwr-spotlight-card.mjs +6 -6
  336. package/fesm2022/ngwr-spotlight-card.mjs.map +1 -1
  337. package/fesm2022/ngwr-squircle.mjs +6 -6
  338. package/fesm2022/ngwr-squircle.mjs.map +1 -1
  339. package/fesm2022/ngwr-star-border-testing.mjs.map +1 -1
  340. package/fesm2022/ngwr-star-border.mjs +3 -3
  341. package/fesm2022/ngwr-star-border.mjs.map +1 -1
  342. package/fesm2022/ngwr-statistic.mjs +9 -9
  343. package/fesm2022/ngwr-statistic.mjs.map +1 -1
  344. package/fesm2022/ngwr-stepper-testing.mjs.map +1 -1
  345. package/fesm2022/ngwr-stepper.mjs +6 -6
  346. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  347. package/fesm2022/ngwr-storage.mjs +3 -3
  348. package/fesm2022/ngwr-storage.mjs.map +1 -1
  349. package/fesm2022/ngwr-switch-testing.mjs.map +1 -1
  350. package/fesm2022/ngwr-switch.mjs +3 -3
  351. package/fesm2022/ngwr-switch.mjs.map +1 -1
  352. package/fesm2022/ngwr-table-testing.mjs.map +1 -1
  353. package/fesm2022/ngwr-table.mjs +18 -18
  354. package/fesm2022/ngwr-table.mjs.map +1 -1
  355. package/fesm2022/ngwr-tabs-router.mjs +3 -3
  356. package/fesm2022/ngwr-tabs-router.mjs.map +1 -1
  357. package/fesm2022/ngwr-tabs-testing.mjs.map +1 -1
  358. package/fesm2022/ngwr-tabs.mjs +6 -6
  359. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  360. package/fesm2022/ngwr-textarea-testing.mjs.map +1 -1
  361. package/fesm2022/ngwr-textarea.mjs +3 -3
  362. package/fesm2022/ngwr-textarea.mjs.map +1 -1
  363. package/fesm2022/ngwr-theme.mjs +3 -3
  364. package/fesm2022/ngwr-theme.mjs.map +1 -1
  365. package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -1
  366. package/fesm2022/ngwr-tilt-card.mjs +6 -6
  367. package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
  368. package/fesm2022/ngwr-timeline.mjs +6 -6
  369. package/fesm2022/ngwr-timeline.mjs.map +1 -1
  370. package/fesm2022/ngwr-toast-testing.mjs.map +1 -1
  371. package/fesm2022/ngwr-toast.mjs +9 -9
  372. package/fesm2022/ngwr-toast.mjs.map +1 -1
  373. package/fesm2022/ngwr-toolbar.mjs +10 -3
  374. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  375. package/fesm2022/ngwr-tour-testing.mjs.map +1 -1
  376. package/fesm2022/ngwr-tour.mjs +6 -6
  377. package/fesm2022/ngwr-tour.mjs.map +1 -1
  378. package/fesm2022/ngwr-transfer-testing.mjs.map +1 -1
  379. package/fesm2022/ngwr-transfer.mjs +3 -3
  380. package/fesm2022/ngwr-transfer.mjs.map +1 -1
  381. package/fesm2022/ngwr-tree-testing.mjs.map +1 -1
  382. package/fesm2022/ngwr-tree.mjs +3 -3
  383. package/fesm2022/ngwr-tree.mjs.map +1 -1
  384. package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -1
  385. package/fesm2022/ngwr-typewriter.mjs +3 -3
  386. package/fesm2022/ngwr-typewriter.mjs.map +1 -1
  387. package/fesm2022/ngwr-typography.mjs +7 -3
  388. package/fesm2022/ngwr-typography.mjs.map +1 -1
  389. package/fesm2022/ngwr-utils.mjs.map +1 -1
  390. package/fesm2022/ngwr-validators.mjs.map +1 -1
  391. package/fesm2022/ngwr-version.mjs +1 -1
  392. package/fesm2022/ngwr-version.mjs.map +1 -1
  393. package/fesm2022/ngwr-virtual-scroll.mjs +3 -3
  394. package/fesm2022/ngwr-virtual-scroll.mjs.map +1 -1
  395. package/fesm2022/ngwr-waves-testing.mjs.map +1 -1
  396. package/fesm2022/ngwr-waves.mjs +3 -3
  397. package/fesm2022/ngwr-waves.mjs.map +1 -1
  398. package/fesm2022/ngwr-window-testing.mjs.map +1 -1
  399. package/fesm2022/ngwr-window.mjs +12 -12
  400. package/fesm2022/ngwr-window.mjs.map +1 -1
  401. package/form/styles/_index.scss +16 -1
  402. package/gauge/styles/_index.scss +1 -0
  403. package/i18n/ar.json +32 -1
  404. package/i18n/cs.json +32 -1
  405. package/i18n/de.json +32 -1
  406. package/i18n/en.json +32 -1
  407. package/i18n/es.json +32 -1
  408. package/i18n/fr.json +32 -1
  409. package/i18n/he.json +32 -1
  410. package/i18n/hi.json +32 -1
  411. package/i18n/id.json +32 -1
  412. package/i18n/it.json +32 -1
  413. package/i18n/ja.json +32 -1
  414. package/i18n/ko.json +32 -1
  415. package/i18n/nl.json +32 -1
  416. package/i18n/pl.json +32 -1
  417. package/i18n/pt.json +32 -1
  418. package/i18n/ru.json +32 -1
  419. package/i18n/sv.json +32 -1
  420. package/i18n/tr.json +32 -1
  421. package/i18n/uk.json +32 -1
  422. package/i18n/vi.json +32 -1
  423. package/i18n/zh-TW.json +32 -1
  424. package/i18n/zh.json +32 -1
  425. package/input/styles/_index.scss +24 -1
  426. package/input-number/styles/_index.scss +69 -0
  427. package/input-otp/styles/_index.scss +5 -5
  428. package/line-chart/styles/_index.scss +30 -2
  429. package/llms-full.txt +14 -4
  430. package/llms.txt +188 -132
  431. package/mcp/providers.js +2 -2
  432. package/mcp/server.js +1 -1
  433. package/meter-group/styles/_index.scss +1 -0
  434. package/overlay/styles/_arrow.scss +30 -2
  435. package/package.json +43 -2
  436. package/page-header/styles/_index.scss +37 -1
  437. package/pagination/styles/_index.scss +9 -5
  438. package/popover/styles/_index.scss +73 -5
  439. package/progress/styles/_index.scss +4 -0
  440. package/radio/styles/_index.scss +4 -1
  441. package/schematics/use/symbol-map.json +1 -0
  442. package/select/styles/_index.scss +51 -12
  443. package/sidebar/styles/_index.scss +44 -2
  444. package/skeleton/styles/_index.scss +3 -0
  445. package/skills/ngwr/SKILL.md +5 -5
  446. package/skills/ngwr/references/catalog.md +2 -0
  447. package/skills/ngwr/references/setup.md +3 -3
  448. package/sparkline/styles/_index.scss +19 -0
  449. package/styles.scss +1 -0
  450. package/table/styles/_index.scss +7 -0
  451. package/textarea/styles/_index.scss +12 -3
  452. package/theme/styles/_colors.scss +39 -13
  453. package/theme/styles/_contrast.scss +9 -7
  454. package/toast/styles/_index.scss +4 -0
  455. package/toolbar/styles/_index.scss +35 -1
  456. package/tree/styles/_index.scss +46 -7
  457. package/types/ngwr-badge.d.ts +22 -7
  458. package/types/ngwr-bar-chart.d.ts +19 -1
  459. package/types/ngwr-calendar-heatmap.d.ts +29 -1
  460. package/types/ngwr-checkbox.d.ts +2 -0
  461. package/types/ngwr-config.d.ts +12 -0
  462. package/types/ngwr-date-picker.d.ts +308 -43
  463. package/types/ngwr-donut-chart.d.ts +24 -1
  464. package/types/ngwr-dropdown.d.ts +22 -2
  465. package/types/ngwr-editor-testing.d.ts +378 -0
  466. package/types/ngwr-editor.d.ts +449 -0
  467. package/types/ngwr-event-calendar.d.ts +8 -0
  468. package/types/ngwr-form.d.ts +35 -5
  469. package/types/ngwr-gauge.d.ts +20 -1
  470. package/types/ngwr-input-number.d.ts +7 -0
  471. package/types/ngwr-line-chart.d.ts +9 -1
  472. package/types/ngwr-markdown.d.ts +61 -2
  473. package/types/ngwr-meter-group-testing.d.ts +3 -2
  474. package/types/ngwr-meter-group.d.ts +14 -1
  475. package/types/ngwr-page-header.d.ts +10 -2
  476. package/types/ngwr-popover.d.ts +154 -3
  477. package/types/ngwr-sidebar.d.ts +7 -0
  478. package/types/ngwr-sparkline.d.ts +43 -1
  479. package/types/ngwr-toolbar.d.ts +7 -0
  480. package/types/ngwr-typography.d.ts +4 -0
  481. package/types/ngwr-version.d.ts +1 -1
  482. package/typography/styles/_index.scss +16 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-date-picker.mjs","sources":["../../../projects/lib/date-picker/internal/time-panel.ts","../../../projects/lib/date-picker/internal/time-panel.html","../../../projects/lib/date-picker/internal/date-time-panel.ts","../../../projects/lib/date-picker/internal/date-time-panel.html","../../../projects/lib/date-picker/date-picker.ts","../../../projects/lib/date-picker/date-picker.html","../../../projects/lib/date-picker/internal/date-range-panel.ts","../../../projects/lib/date-picker/internal/date-range-panel.html","../../../projects/lib/date-picker/internal/range-end-input.ts","../../../projects/lib/date-picker/date-range-picker.ts","../../../projects/lib/date-picker/date-range-picker.html","../../../projects/lib/date-picker/ngwr-date-picker.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\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { WrDateAdapter, WR_DATE_LOCALE } from 'ngwr/date';\nimport { readI18nText } from 'ngwr/i18n';\nimport { clamp } from 'ngwr/utils';\n\n/**\n * Two digits, in the locale's own numbering system.\n *\n * The field beside this panel prints `٠٢:٣٠` through `Intl`, and the panel used to print\n * `02:30` beside it — the same clock in two numbering systems, one popup apart. The pair\n * below is a copy of the arithmetic `WrNativeDateAdapter` does for its own parser and\n * deliberately stays a copy: sharing it would mean adding a numeral helper to `ngwr/date`'s\n * public API, which is a wide promise to make for twenty lines of `Intl`.\n */\nfunction padLocale(n: number, locale: string): string {\n try {\n return new Intl.NumberFormat(locale, { minimumIntegerDigits: 2, useGrouping: false }).format(n);\n } catch {\n return String(n).padStart(2, '0');\n }\n}\n\n/**\n * The character the locale puts between an hour and a minute.\n *\n * Finnish writes `14.30`, so a hard-coded colon put two different separators on one\n * screen — the field printed `14.30` through `Intl` and the panel under it `14 : 30`.\n * `formatToParts` is the only place that answer lives; a colon is the fallback for a\n * locale whose separator is whitespace or missing.\n */\nfunction timeSeparatorFor(locale: string): string {\n try {\n const parts = new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }).formatToParts(\n new Date(2024, 0, 15, 13, 45)\n );\n const afterHour = parts[parts.findIndex(part => part.type === 'hour') + 1];\n const text = afterHour?.type === 'literal' ? afterHour.value.replace(/[\\u200e\\u200f\\u061c]/g, '').trim() : '';\n if (text) return text;\n } catch {\n // No `Intl` for this locale — the colon stays.\n }\n return ':';\n}\n\n/** The ten digits `locale` writes, index 0 to 9 — empty when the system is algorithmic. */\nfunction numeralsFor(locale: string): readonly string[] {\n try {\n const formatter = new Intl.NumberFormat(locale, { useGrouping: false });\n const digits: string[] = [];\n for (let i = 0; i < 10; i++) {\n const digit = formatter.format(i);\n if ([...digit].length !== 1 || digits.includes(digit)) return [];\n digits.push(digit);\n }\n return digits;\n } catch {\n return [];\n }\n}\n\n/**\n * Read a typed number in either the locale's digits or ASCII ones.\n *\n * Both halves are needed and for different reasons: an Arabic keyboard sends `٠٢`, which\n * `Number()` reads as `NaN` and the handler then dropped on the floor, and a Latin\n * keyboard sends `02` into a field that displays `٠٢`.\n */\nfunction readNumber(raw: string, numerals: readonly string[]): number {\n let out = '';\n for (const ch of raw.trim()) {\n if (ch >= '0' && ch <= '9') {\n out += ch;\n continue;\n }\n const index = numerals.indexOf(ch);\n if (index < 0) return Number.NaN;\n out += String(index);\n }\n return out ? Number(out) : Number.NaN;\n}\n\n/** Wraps a value into `[0, modulus)` so steppers cycle nicely. */\nfunction wrap(v: number, modulus: number): number {\n return ((v % modulus) + modulus) % modulus;\n}\n\n/** Detect whether a locale uses 12-hour time by default. */\nfunction isLocaleHour12(locale: string): boolean {\n try {\n return new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hour12 === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Internal time stepper panel rendered by `<wr-date-picker mode=\"time\">`\n * (standalone) and `mode=\"datetime\"` (composed with the calendar). Not part\n * of the public API — use `<wr-date-picker mode=\"time\">` instead.\n *\n * @internal\n */\n@Component({\n selector: 'wr-time-picker',\n templateUrl: './time-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n})\nexport class WrTimePanel implements FormValueControl<Date | null> {\n /** 12 / 24-hour mode. @default 'auto' (derived from the locale) */\n readonly format = input<'auto' | '12h' | '24h'>('auto');\n\n /** Render a third column for seconds. @default false */\n readonly showSeconds = input(false, { transform: coerceBooleanProperty });\n\n /** Step applied to minutes / seconds steppers. @default 1 */\n readonly step = input(1, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 1)) });\n\n /** Disable interaction. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Read-only — values cannot be changed. @default false */\n readonly readonly = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Move focus onto the hours field once the panel is on screen. Off by\n * default — see `WrCalendar.autoFocus` for why. @default false\n */\n readonly autoFocus = input(false, { transform: coerceBooleanProperty });\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly locale = inject(WR_DATE_LOCALE);\n private readonly numerals = numeralsFor(this.locale);\n\n /** Hour / minute separator, read off the locale rather than written into the template. */\n protected readonly separator = timeSeparatorFor(this.locale);\n\n /**\n * Form value — the selected time as a `Date` (its date portion is preserved).\n * A signal-forms native control: `[formField]` binds this directly, and\n * `[(ngModel)]` / `[(value)]` bind it through Angular's bridge.\n */\n readonly value = model<Date | null>(null);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n /** Source of truth — stores h/m/s in 24-hour form. */\n protected readonly hours = signal(0);\n protected readonly minutes = signal(0);\n protected readonly seconds = signal(0);\n\n /** Date portion preserved across updates (today's date if none was supplied). */\n private readonly basis = signal<Date>(this.adapter.today());\n\n protected readonly effectiveDisabled = computed(() => this.disabled());\n\n constructor() {\n // The hours field, not the increment button: a stepper is a shortcut, the\n // number is the control. Deferred because the inputs are not in the DOM\n // until the panel's first change-detection pass.\n afterNextRender(() => {\n if (!this.autoFocus()) return;\n this.host.nativeElement.querySelector<HTMLInputElement>('.wr-time-picker__input')?.focus();\n });\n\n // Mirror an external `value` write into the internal h/m/s state (the old\n // `writeValue` body). Guarded against the echo of our own `emit()` so a live\n // edit is never clobbered by re-deriving it.\n effect(() => {\n const value = this.value();\n untracked(() => {\n if (value === this.lastEmitted) return;\n if (value && this.adapter.isValid(value)) {\n this.basis.set(this.adapter.clone(value));\n this.hours.set(this.adapter.getHours(value));\n this.minutes.set(this.adapter.getMinutes(value));\n this.seconds.set(this.adapter.getSeconds(value));\n } else {\n this.basis.set(this.adapter.today());\n this.hours.set(0);\n this.minutes.set(0);\n this.seconds.set(0);\n }\n });\n });\n }\n\n protected readonly interactive = computed(() => !this.effectiveDisabled() && !this.readonly());\n\n /** Resolved format — turns 'auto' into '12h' or '24h' based on the locale. */\n protected readonly is12h = computed(() => {\n const f = this.format();\n if (f === '12h') return true;\n if (f === '24h') return false;\n return isLocaleHour12(this.locale);\n });\n\n /** Hours value shown in the input (1-12 in 12h mode, 0-23 otherwise). */\n protected readonly displayHours = computed(() => {\n if (!this.is12h()) return this.hours();\n const h = this.hours() % 12;\n return h === 0 ? 12 : h;\n });\n\n protected readonly isPm = computed(() => this.hours() >= 12);\n\n /**\n * Every name this panel speaks, out of the catalog. There is no override input\n * because there is no public host to put one on — the panel is `@internal`, and\n * the picker around it already localizes its trigger and popup names, so the\n * hard-coded English here put two languages inside one popup.\n */\n protected readonly hoursLabel = readI18nText('datePicker.hours', 'Hours');\n protected readonly minutesLabel = readI18nText('datePicker.minutes', 'Minutes');\n protected readonly secondsLabel = readI18nText('datePicker.seconds', 'Seconds');\n protected readonly incrementHoursLabel = readI18nText('datePicker.incrementHours', 'Increment hours');\n protected readonly decrementHoursLabel = readI18nText('datePicker.decrementHours', 'Decrement hours');\n protected readonly incrementMinutesLabel = readI18nText('datePicker.incrementMinutes', 'Increment minutes');\n protected readonly decrementMinutesLabel = readI18nText('datePicker.decrementMinutes', 'Decrement minutes');\n protected readonly incrementSecondsLabel = readI18nText('datePicker.incrementSeconds', 'Increment seconds');\n protected readonly decrementSecondsLabel = readI18nText('datePicker.decrementSeconds', 'Decrement seconds');\n protected readonly toggleAmPmLabel = readI18nText('datePicker.toggleAmPm', 'Toggle AM / PM');\n\n private readonly amLabel = readI18nText('datePicker.am', 'AM');\n private readonly pmLabel = readI18nText('datePicker.pm', 'PM');\n\n protected readonly amPmLabel = computed(() => (this.isPm() ? this.pmLabel() : this.amLabel()));\n\n protected readonly hoursDisplay = computed(() => padLocale(this.displayHours(), this.locale));\n protected readonly minutesDisplay = computed(() => padLocale(this.minutes(), this.locale));\n protected readonly secondsDisplay = computed(() => padLocale(this.seconds(), this.locale));\n\n protected readonly classes = computed(() => {\n const parts = ['wr-time-picker'];\n if (this.is12h()) parts.push('wr-time-picker--12h');\n if (this.showSeconds()) parts.push('wr-time-picker--with-seconds');\n if (this.effectiveDisabled()) parts.push('wr-time-picker--disabled');\n return parts.join(' ');\n });\n\n /** Last value we pushed via `emit()`, so the sync effect can skip the echo. */\n private lastEmitted: Date | null = null;\n\n // Typed-input handlers\n\n protected onHoursInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n // An emptied box is someone mid-retype, not a request for zero: `Number('')`\n // is 0, so committing here rewrote the field they had just cleared.\n if (!raw.trim()) return;\n const n = readNumber(raw, this.numerals);\n if (Number.isNaN(n)) return;\n if (this.is12h()) {\n const h12 = clamp(Math.trunc(n), 1, 12) % 12;\n this.hours.set(this.isPm() ? h12 + 12 : h12);\n } else {\n this.hours.set(clamp(Math.trunc(n), 0, 23));\n }\n this.emit();\n }\n\n protected onMinutesInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n // An emptied box is someone mid-retype, not a request for zero: `Number('')`\n // is 0, so committing here rewrote the field they had just cleared.\n if (!raw.trim()) return;\n const n = readNumber(raw, this.numerals);\n if (Number.isNaN(n)) return;\n this.minutes.set(clamp(Math.trunc(n), 0, 59));\n this.emit();\n }\n\n protected onSecondsInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n // An emptied box is someone mid-retype, not a request for zero: `Number('')`\n // is 0, so committing here rewrote the field they had just cleared.\n if (!raw.trim()) return;\n const n = readNumber(raw, this.numerals);\n if (Number.isNaN(n)) return;\n this.seconds.set(clamp(Math.trunc(n), 0, 59));\n this.emit();\n }\n\n protected onBlur(): void {\n this.touch.emit();\n }\n\n // Stepper handlers (▲ / ▼ buttons)\n\n protected stepHours(direction: 1 | -1): void {\n if (!this.interactive()) return;\n this.hours.set(wrap(this.hours() + direction, 24));\n this.emit();\n }\n\n protected stepMinutes(direction: 1 | -1): void {\n if (!this.interactive()) return;\n this.minutes.set(wrap(this.minutes() + direction * this.step(), 60));\n this.emit();\n }\n\n protected stepSeconds(direction: 1 | -1): void {\n if (!this.interactive()) return;\n this.seconds.set(wrap(this.seconds() + direction * this.step(), 60));\n this.emit();\n }\n\n protected toggleAmPm(): void {\n if (!this.interactive()) return;\n // ±12 hours flips AM ↔ PM; wrap handles overflow.\n this.hours.set(wrap(this.hours() + 12, 24));\n this.emit();\n }\n\n // Emission\n\n private emit(): void {\n const next = this.adapter.setTime(this.basis(), this.hours(), this.minutes(), this.seconds());\n this.lastEmitted = next;\n this.value.set(next);\n }\n}\n","<div class=\"wr-time-picker__col\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"incrementHoursLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepHours(1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <input\n class=\"wr-time-picker__input\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.aria-label]=\"hoursLabel()\"\n [value]=\"hoursDisplay()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onHoursInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"decrementHoursLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepHours(-1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n</div>\n\n<span class=\"wr-time-picker__sep\" aria-hidden=\"true\">{{ separator }}</span>\n\n<div class=\"wr-time-picker__col\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"incrementMinutesLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepMinutes(1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <input\n class=\"wr-time-picker__input\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.aria-label]=\"minutesLabel()\"\n [value]=\"minutesDisplay()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onMinutesInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"decrementMinutesLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepMinutes(-1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n</div>\n\n@if (showSeconds()) {\n <span class=\"wr-time-picker__sep\" aria-hidden=\"true\">{{ separator }}</span>\n\n <div class=\"wr-time-picker__col\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"incrementSecondsLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepSeconds(1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <input\n class=\"wr-time-picker__input\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.aria-label]=\"secondsLabel()\"\n [value]=\"secondsDisplay()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onSecondsInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"decrementSecondsLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepSeconds(-1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\n}\n\n@if (is12h()) {\n <div class=\"wr-time-picker__col wr-time-picker__col--ampm\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"toggleAmPmLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"toggleAmPm()\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <span class=\"wr-time-picker__label\" aria-live=\"polite\">{{ amPmLabel() }}</span>\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"toggleAmPmLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"toggleAmPm()\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\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 { Component, ViewEncapsulation, computed, inject, input, output } from '@angular/core';\n\nimport { WrCalendar } from 'ngwr/calendar';\nimport { WrDateAdapter } from 'ngwr/date';\n\nimport { WrTimePanel } from './time-panel';\n\n/**\n * Internal panel that stacks a `<wr-calendar>` and a `<wr-time-picker>`,\n * combining their selections into a single `Date`. Owned by\n * `<wr-date-picker mode=\"datetime\">` — not part of the public API.\n *\n * @internal\n */\n@Component({\n selector: 'wr-date-time-panel',\n templateUrl: './date-time-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-date-time-panel' },\n imports: [WrCalendar, WrTimePanel],\n})\nexport class WrDateTimePanel {\n readonly value = input<Date | null>(null);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n readonly showSeconds = input(false);\n readonly step = input(1);\n\n /**\n * Forwarded to the calendar only: a datetime panel opened from the keyboard\n * lands on the day grid, never on the hours field. Picking the date first is\n * the order the panel is laid out in, and the time fields are one Tab away.\n */\n readonly autoFocus = input(false);\n\n readonly changed = output<Date>();\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n\n /** Date portion used by the calendar — falls back to today when value is null. */\n protected readonly calendarValue = computed(() => this.value() ?? this.adapter.today());\n\n /** Value passed to the time picker — falls back to today (00:00) when null. */\n protected readonly timeValue = computed(() => this.value() ?? this.adapter.today());\n\n protected onCalendarSelect(date: Date | null): void {\n if (!date) return;\n const base = this.value() ?? this.adapter.today();\n const combined = this.adapter.setTime(\n this.adapter.createDate(this.adapter.getYear(date), this.adapter.getMonth(date), this.adapter.getDate(date)),\n this.adapter.getHours(base),\n this.adapter.getMinutes(base),\n this.adapter.getSeconds(base)\n );\n this.changed.emit(combined);\n }\n\n protected onTimeChange(time: Date | null): void {\n if (!time) return;\n const base = this.value() ?? this.adapter.today();\n const combined = this.adapter.setTime(\n this.adapter.createDate(this.adapter.getYear(base), this.adapter.getMonth(base), this.adapter.getDate(base)),\n this.adapter.getHours(time),\n this.adapter.getMinutes(time),\n this.adapter.getSeconds(time)\n );\n this.changed.emit(combined);\n }\n}\n","<wr-calendar\n [date]=\"calendarValue()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [dateFilter]=\"dateFilter()\"\n [autoFocus]=\"autoFocus()\"\n (dateChange)=\"onCalendarSelect($event)\"\n/>\n\n<div class=\"wr-date-time-panel__time\">\n <wr-time-picker\n [value]=\"timeValue()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [step]=\"step()\"\n (valueChange)=\"onTimeChange($event)\"\n />\n</div>\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 { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n type ComponentRef,\n DestroyRef,\n ElementRef,\n Injector,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { WrCalendar } from 'ngwr/calendar';\nimport { WrDateAdapter, type WrDateFormat } from 'ngwr/date';\nimport { readI18nText, useI18nText } from 'ngwr/i18n';\nimport { WrInput, WrInputGroup, WrInputSuffix } from 'ngwr/input';\nimport { WR_OVERLAY, WrOutsideClick, wrFollowDirection } from 'ngwr/overlay';\n\nimport { WrDateTimePanel } from './internal/date-time-panel';\nimport { WrTimePanel } from './internal/time-panel';\n\nlet panelUid = 0;\n\n/**\n * Unified date / time / date-time picker. Same `<input>` + popover skeleton\n * for every mode — the overlay content swaps based on `[mode]`:\n *\n * - `'date'` (default) — popover renders a calendar. Picking a date closes\n * the overlay.\n * - `'time'` — popover renders an `HH:MM[:SS]` stepper with optional AM/PM.\n * Stays open while editing; close with outside-click or Escape.\n * - `'datetime'` — popover stacks calendar + time stepper. Picking a date\n * does NOT close (the user typically wants to set the time next).\n *\n * A signal-forms native control: it implements `FormValueControl<Date | null>`,\n * so `[formField]` binds straight to its `value` model — no\n * `ControlValueAccessor` in between. `[(value)]` works standalone, and classic\n * `[(ngModel)]` / reactive forms keep working through Angular's bridge. Value\n * type is `Date | null` for every mode.\n *\n * Parses the input on every keystroke (silently — only emits when valid) and\n * re-formats canonical on blur. Format is driven by {@link WrDateAdapter}: it\n * accepts both named keys (`'shortDate'`, `'mediumDateTime'`, …) and raw\n * token strings (`'dd.MM.yyyy'`, `'HH:mm'`). When `format` is left at the\n * default (`null`), the picker derives the right named key from `mode`:\n * `'date'` gives `'shortDate'`, `'time'` gives `'time'`, `'datetime'` gives\n * `'shortDateTime'`.\n *\n * @example\n * ```html\n * <!-- signal forms -->\n * <wr-date-picker [formField]=\"form.picked\" format=\"dd.MM.yyyy\" [min]=\"minDate\" />\n *\n * <!-- standalone two-way binding, date only -->\n * <wr-date-picker [(value)]=\"picked\" format=\"dd.MM.yyyy\" [min]=\"minDate\" />\n *\n * <!-- Time only -->\n * <wr-date-picker mode=\"time\" [(value)]=\"picked\" timeFormat=\"24h\" />\n *\n * <!-- Date + time -->\n * <wr-date-picker mode=\"datetime\" [(value)]=\"when\" [showSeconds]=\"true\" [step]=\"5\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/date-picker\n */\n@Component({\n selector: 'wr-date-picker',\n templateUrl: './date-picker.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrInput, WrInputGroup, WrInputSuffix],\n})\nexport class WrDatePicker implements FormValueControl<Date | null> {\n /** Picker behavior — see class doc. @default 'date' */\n readonly mode = input<'date' | 'time' | 'datetime'>('date');\n\n /**\n * Format used for both display and parsing. When `null` (default), the\n * format is derived from `mode` (`shortDate` / `time` / `shortDateTime`).\n * Pass a named key or raw token string to override.\n */\n readonly format = input<WrDateFormat | (string & {}) | null>(null);\n\n /** Placeholder shown when the input is empty. */\n readonly placeholder = input<string>('');\n\n // Typed `Date | undefined` (not `Date | null`) to satisfy the reserved\n // `FormUiControl` min/max slots, which are keyed to the control's value type\n // and want `Date | undefined`. Both null and undefined stay falsy, so the\n // internal bounds checks below are unaffected.\n /** Min selectable date (forwarded to the calendar). Ignored in `time` mode. */\n readonly min = input<Date | undefined>(undefined);\n\n /** Max selectable date (forwarded to the calendar). Ignored in `time` mode. */\n readonly max = input<Date | undefined>(undefined);\n\n /** Predicate to disable specific dates (forwarded to the calendar). Ignored in `time` mode. */\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n\n /** Time-panel 12 / 24-hour format. Applies in `time` + `datetime` modes. @default 'auto' */\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n\n /** Render the seconds column. Applies in `time` + `datetime` modes. @default false */\n readonly showSeconds = input(false, { transform: coerceBooleanProperty });\n\n /** Minute / second step for the time panel. @default 1 */\n readonly step = input(1, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 1)) });\n\n /**\n * Disable interaction. Bound automatically from the field's disabled state\n * when used with `[formField]`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Read-only — input not typeable, but the trigger icon still opens the overlay. @default false */\n readonly readonly = input(false, { transform: coerceBooleanProperty });\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n /**\n * Ambient reading direction, for the open panel alone — nothing in this\n * component reads it directly. Optional so a bare `TestBed` needs no\n * provider; `Directionality` is root-provided anyway, and a missing one\n * simply reads as `ltr`.\n */\n private readonly dir = inject(Directionality, { optional: true });\n protected readonly inputEl = viewChild.required<ElementRef<HTMLInputElement>>('input');\n protected readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n /** The picked Date. Bound by `[formField]`, or two-way via `[(value)]`. */\n readonly value = model<Date | null>(null);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n /** Text currently in the input (may be partial / invalid mid-type). */\n protected readonly text = signal<string>('');\n\n /** Whether the popover is currently open. */\n protected readonly overlayOpen = signal(false);\n\n /**\n * Where focus came from, captured as an explicit argument at open time —\n * never read off `document.activeElement`, which by then may already be the\n * pane. Every close path that took focus INTO the panel hands it back here.\n */\n private openedFrom: HTMLElement | null = null;\n\n /** Whether the panel this open cycle should take focus. */\n private autoFocusPanel = false;\n\n /** Resolved format — falls back to a mode-appropriate default. */\n protected readonly resolvedFormat = computed<string>(() => {\n const explicit = this.format();\n if (explicit) return explicit;\n const m = this.mode();\n if (m === 'datetime') return 'shortDateTime';\n // `time`, not `shortTime` — the latter is not a member of WrDateFormat, so\n // adapters fell through to treating it as a raw token pattern. date-fns then\n // threw on the unescaped letters; the native adapter degraded silently.\n if (m === 'time') return 'time';\n return 'shortDate';\n });\n\n protected readonly isTime = computed(() => this.mode() === 'time');\n protected readonly isDateTime = computed(() => this.mode() === 'datetime');\n\n // Signals, not plain strings: these used to be read once at injection time,\n // which is before any loader-backed catalog exists — so the trigger announced\n // \"Open calendar\" while `fieldLabel` below, off the SAME key, announced the\n // Russian one. A runtime `i18n.use()` moved the field's name and not the\n // trigger's, which made the split permanent rather than a startup race.\n private readonly labelDate = readI18nText('datePicker.open', 'Open calendar');\n private readonly labelTime = readI18nText('datePicker.openTime', 'Open time picker');\n private readonly labelDateTime = readI18nText('datePicker.openDateTime', 'Open date and time picker');\n\n private readonly panelLabelDate = readI18nText('datePicker.panel', 'Choose date');\n private readonly panelLabelTime = readI18nText('datePicker.panelTime', 'Choose time');\n private readonly panelLabelDateTime = readI18nText('datePicker.panelDateTime', 'Choose date and time');\n\n /**\n * Accessible name of the text field. Falls back to the placeholder, then to\n * the same catalog string the calendar button uses — the field is a\n * `role=\"combobox\"`, and with an empty placeholder it had no name at all.\n */\n readonly ariaLabel = input<string | null>(null);\n\n private readonly fieldLabel = useI18nText(this.ariaLabel, 'datePicker.open', 'Open calendar');\n protected readonly resolvedAriaLabel = computed(() => {\n // Not `??`: an empty placeholder must fall through to the catalog string.\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const placeholder = this.placeholder();\n return placeholder ? placeholder : this.fieldLabel();\n });\n\n protected readonly triggerLabel = computed(() => {\n const m = this.mode();\n if (m === 'time') return this.labelTime();\n if (m === 'datetime') return this.labelDateTime();\n return this.labelDate();\n });\n\n /**\n * Accessible name of the popup. The trigger advertises\n * `aria-haspopup=\"dialog\"`, so the panel is a `role=\"dialog\"` — and an unnamed\n * dialog announces as a bare \"dialog\". Defaults to the catalog's\n * `datePicker.panel*` string for the current `mode`.\n */\n readonly panelAriaLabel = input<string | null>(null);\n\n /** Popup id — what the trigger's `aria-controls` points at while open. */\n protected readonly panelId = `wr-date-picker-panel-${++panelUid}`;\n\n protected readonly resolvedPanelLabel = computed(() => {\n const explicit = this.panelAriaLabel();\n if (explicit) return explicit;\n const m = this.mode();\n if (m === 'time') return this.panelLabelTime();\n if (m === 'datetime') return this.panelLabelDateTime();\n return this.panelLabelDate();\n });\n\n protected readonly classes = computed(() => {\n const parts = ['wr-date-picker', `wr-date-picker--${this.mode()}`];\n if (this.disabled()) parts.push('wr-date-picker--disabled');\n return parts.join(' ');\n });\n\n private overlayRef: OverlayRef | null = null;\n\n /** Live calendar ref while the date popover is open — lets the panel track\n * the typed value in real time (not just on reopen). */\n private readonly dateRef = signal<ComponentRef<WrCalendar> | null>(null);\n private readonly timeRef = signal<ComponentRef<WrTimePanel> | null>(null);\n private readonly dateTimeRef = signal<ComponentRef<WrDateTimePanel> | null>(null);\n\n /** The last value an open panel handed us, so the live push never echoes it back. */\n private lastFromPanel: Date | null = null;\n\n /** Last value we pushed into the model ourselves — lets the sync effect\n * skip the echo of our own edits (so a live keystroke's raw text is never\n * reformatted mid-type). */\n private lastValue: Date | null = null;\n\n /** The format the sync effect last rendered with. Paired with `lastValue`\n * because the echo guard has to answer \"is the display still current\", and a\n * `[format]` / `[mode]` change makes it stale with the value untouched. */\n private lastFormat: string | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.dispose());\n\n // Mirror external writes to `value` (from `[formField]`, `[(value)]`, or a\n // classic-forms bridge) into the display text — this is the old\n // `writeValue` body. The echo of our own edits is skipped, and a\n // null/undefined write is tolerated (it clears the text, exactly as the old\n // `writeValue(Date | null)` did).\n //\n // The FORMAT is read outside `untracked()` on purpose. It used to be read\n // inside, so the effect depended on `value()` alone and a `[format]` or\n // `[mode]` change left the old rendering on screen — while `onInput` /\n // `onBlur` had already switched to parsing against the NEW format, so an\n // edit to the stale text failed to parse and was silently discarded on\n // blur. Folding the format into the echo guard keeps the mid-type\n // protection (a keystroke changes the value, never the format) and still\n // re-renders when the format itself moves.\n effect(() => {\n const v = this.value();\n const fmt = this.resolvedFormat();\n untracked(() => {\n const echo = this.sameDate(v, this.lastValue) && fmt === this.lastFormat;\n this.lastValue = v;\n this.lastFormat = fmt;\n if (echo) return;\n this.text.set(v && this.adapter.isValid(v) ? this.adapter.format(v, fmt) : '');\n });\n });\n\n // A panel that is up when `disabled` arrives has to go. `readonly` is\n // deliberately NOT here — this component's contract is that the calendar\n // stays browsable while read-only, and only the write is refused (see\n // `commitValue`). `disabled` is the other flag and means the opposite:\n // `toggleOverlay` and `openOnInput` both refuse to open under it, so a\n // popup left standing is a way in that the component says it does not have.\n effect(() => {\n if (!this.disabled()) return;\n untracked(() => {\n if (this.overlayRef) this.closeOverlay();\n });\n });\n\n // While the calendar popover is open, push every valid typed value into it\n // so the displayed month follows the input live (the calendar snaps its\n // own viewDate to the bound `date`).\n effect(() => {\n const ref = this.dateRef();\n if (ref) ref.setInput('date', this.value());\n });\n\n // …and the constraints with it. Pushing these only at attach time meant a\n // `[min]` (or `[max]`, or the filter) that changed while the popover was open\n // kept the stale constraint until the next reopen — `wr-date-range-picker`\n // carries the same effect under a comment saying exactly that.\n effect(() => {\n const ref = this.dateRef();\n if (!ref) return;\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n });\n\n effect(() => {\n const ref = this.timeRef();\n if (!ref) return;\n ref.setInput('format', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n });\n\n // The datetime panel had no live sync at all: a date typed into the field\n // while it was open never reached it, so the next stepper click emitted the\n // panel's own stale value and silently undid the typing.\n effect(() => {\n const ref = this.dateTimeRef();\n if (!ref) return;\n const value = this.value();\n if (value !== this.lastFromPanel) ref.setInput('value', value);\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('timeFormat', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n });\n }\n\n // Template handlers\n\n protected onInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n this.text.set(raw);\n if (!raw) {\n this.commitValue(null);\n return;\n }\n const parsed = this.adapter.parse(raw, this.resolvedFormat());\n if (parsed && this.adapter.isValid(parsed) && !this.isOutOfBounds(parsed)) {\n this.commitValue(this.withKeptDate(parsed));\n }\n }\n\n /**\n * In `time` mode the typed string carries no date, so the adapter fills one in — and\n * the date already in the model is the better answer than whatever default it picks.\n * The time PANEL has always worked this way (it keeps a `basis` date across edits);\n * the text field silently moved the value to another day.\n */\n private withKeptDate(parsed: Date): Date {\n if (this.mode() !== 'time') return parsed;\n const current = this.value();\n if (!current || !this.adapter.isValid(current)) return parsed;\n return this.adapter.setTime(\n current,\n this.adapter.getHours(parsed),\n this.adapter.getMinutes(parsed),\n this.adapter.getSeconds(parsed)\n );\n }\n\n protected onBlur(): void {\n this.touch.emit();\n // Reformat to canonical on blur (cleans up `1/5/25` → `1/5/2025`).\n const v = this.value();\n if (v && this.adapter.isValid(v)) {\n this.text.set(this.adapter.format(v, this.resolvedFormat()));\n } else if (!this.text()) {\n this.commitValue(null);\n }\n }\n\n /** Called by the input's click — opens the overlay if it isn't open already. */\n protected openOnInput(): void {\n if (this.disabled() || this.overlayRef) return;\n // Deliberately WITHOUT focus: this click placed a caret in the text field,\n // and yanking focus into the grid would throw away what the user just did.\n // `Alt+ArrowDown` / `ArrowDown` are the keyboard way in — see onFieldKey.\n this.openOverlay(this.inputEl().nativeElement, false);\n }\n\n protected toggleOverlay(): void {\n if (this.disabled()) return;\n if (this.overlayRef) {\n // Focus is already on the trigger — nothing to restore.\n this.closeOverlay();\n } else {\n this.openOverlay(this.triggerEl()?.nativeElement ?? null, true);\n }\n }\n\n /**\n * The keyboard route into the panel, per the APG date-picker pattern.\n *\n * `Alt+ArrowDown` opens and takes focus; a bare arrow moves focus in when the\n * panel is ALREADY open, which is how someone who opened it by clicking the\n * field gets to the grid. Every other key — characters, Backspace, the\n * horizontal arrows, Home / End — is left to the field untouched, so typing a\n * date keeps working exactly as before.\n */\n protected onFieldKey(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n const vertical = event.key === 'ArrowDown' || event.key === 'ArrowUp';\n if (!vertical) return;\n\n if (event.altKey && event.key === 'ArrowDown' && !this.overlayRef) {\n event.preventDefault();\n this.openOverlay(this.inputEl().nativeElement, true);\n return;\n }\n\n if (this.overlayRef) {\n event.preventDefault();\n this.focusPanel();\n }\n }\n\n /**\n * Move focus into an already-mounted panel. A plain query is right HERE and\n * wrong at mount time: the panel has settled, so there is no deferral to get\n * wrong — and it keeps `autoFocus` as the single piece of panel API.\n */\n private focusPanel(): void {\n const pane = this.overlayRef?.overlayElement;\n const target =\n pane?.querySelector<HTMLElement>('.wr-calendar__day--focused:not([disabled])') ??\n pane?.querySelector<HTMLElement>('.wr-time-picker__input');\n target?.focus();\n }\n\n /** Hand focus back to whatever opened the panel, if it is still on the page. */\n private restoreFocus(): void {\n const target = this.openedFrom?.isConnected ? this.openedFrom : this.inputEl().nativeElement;\n target?.focus();\n }\n\n // Overlay\n\n private openOverlay(openedFrom: HTMLElement | null = null, autoFocus = false): void {\n if (this.overlayRef) return;\n this.openedFrom = openedFrom;\n this.autoFocusPanel = autoFocus;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n panelClass: 'wr-date-picker-overlay',\n });\n\n // Two of the four fallbacks anchor on `end`, and the CDK resolves start /\n // end against the direction it captured when this ref was created. The\n // `wr-calendar` inside the pane reads `Directionality` live, so a flip\n // while the panel was open split the grid's key handling from the box it\n // was drawn in — the same split the docs site's own switch shows off.\n wrFollowDirection(this.overlayRef, this.dir, this.injector);\n\n // The trigger promises `aria-haspopup=\"dialog\"`; the pane is the element it\n // points at, so the role, the name and the id all belong here. Non-modal on\n // purpose — focus is not trapped, and the panel closes on outside click or\n // Escape.\n const pane = this.overlayRef.overlayElement;\n pane.id = this.panelId;\n pane.setAttribute('role', 'dialog');\n pane.setAttribute('aria-modal', 'false');\n pane.setAttribute('aria-label', this.resolvedPanelLabel());\n\n this.overlayOpen.set(true);\n\n // Dispatch by mode — pick the panel + wire its emissions.\n const m = this.mode();\n if (m === 'time') this.attachTime();\n else if (m === 'datetime') this.attachDateTime();\n else this.attachDate();\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.closeOverlay();\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n // Focus is `closeOverlay()`'s business and nobody else's. Escape\n // reaches this overlay from anywhere in the document (the CDK\n // dispatches it to the topmost one), and `openOnInput` deliberately\n // leaves the caret in the field — so the user can Tab on with the\n // panel still open. Forcing the field back into focus here overrode\n // the guarded restore and dragged the caret backwards out of whatever\n // they had moved on to. Same rule as `wr-date-range-picker`.\n this.closeOverlay();\n }\n });\n }\n\n private attachDate(): void {\n if (!this.overlayRef) return;\n const ref = this.overlayRef.attach(new ComponentPortal(WrCalendar));\n ref.setInput('date', this.value());\n this.dateRef.set(ref);\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('autoFocus', this.autoFocusPanel);\n ref.instance.date.subscribe(next => {\n if (!next) return;\n this.commit(next);\n this.closeOverlay();\n });\n }\n\n private attachTime(): void {\n if (!this.overlayRef) return;\n const ref = this.overlayRef.attach(new ComponentPortal(WrTimePanel));\n ref.setInput('format', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n ref.setInput('autoFocus', this.autoFocusPanel);\n ref.setInput('value', this.value() ?? this.adapter.today());\n this.timeRef.set(ref);\n ref.instance.value.subscribe((next: Date | null) => {\n if (!next) return;\n this.lastFromPanel = next;\n this.commit(next);\n });\n }\n\n private attachDateTime(): void {\n if (!this.overlayRef) return;\n const ref = this.overlayRef.attach(new ComponentPortal(WrDateTimePanel));\n ref.setInput('value', this.value());\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('timeFormat', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n ref.setInput('autoFocus', this.autoFocusPanel);\n this.dateTimeRef.set(ref);\n ref.instance.changed.subscribe(next => {\n this.lastFromPanel = next;\n this.commit(next);\n ref.setInput('value', next);\n });\n }\n\n private commit(next: Date): void {\n this.text.set(this.adapter.format(next, this.resolvedFormat()));\n this.commitValue(next);\n }\n\n /** Push a value to the model while remembering it, so the sync effect treats\n * the resulting change as an echo and leaves the display text alone. */\n private commitValue(next: Date | null): void {\n // The calendar is browsable while `readonly` — the field is untypeable, not\n // inert, which is a contract this component's spec pins deliberately. That\n // makes the popup a SECOND way into the model, and it was unguarded: a\n // `readonly()` schema rule left a day click writing exactly as if the rule\n // were absent. Guarding at the single write point rather than at the three\n // ways in keeps the calendar readable and still refuses the edit.\n //\n // `disabled` belongs here for the same reason and was missing: the ways IN\n // all check it, and a panel already up checks nothing again. A picker\n // disabled mid-session — `[disabled]=\"saving()\"`, a schema rule — took a\n // day click and moved its value, which is the one thing a disabled control\n // must never do.\n if (this.readonly() || this.disabled()) return;\n this.lastValue = next;\n this.value.set(next);\n }\n\n /**\n * Focus goes back to the opener only when it was still INSIDE the panel —\n * dropped there, it would land on `<body>` and the next Tab would restart\n * from the top of the page. When focus had already moved elsewhere (a click\n * on another control, which is itself what closed us) it is left alone:\n * stealing it back would fight the user for the caret.\n */\n private closeOverlay(): void {\n const pane = this.overlayRef?.overlayElement;\n const inside = !!pane && pane.contains(document.activeElement);\n\n this.dispose();\n\n if (inside) this.restoreFocus();\n }\n\n private dispose(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.dateRef.set(null);\n this.timeRef.set(null);\n this.dateTimeRef.set(null);\n this.overlayOpen.set(false);\n this.autoFocusPanel = false;\n }\n\n // Helpers\n\n private isOutOfBounds(date: Date): boolean {\n if (this.mode() === 'time') return false;\n const min = this.min();\n if (min && this.adapter.compareDate(date, min) < 0) return true;\n const max = this.max();\n if (max && this.adapter.compareDate(date, max) > 0) return true;\n // Covers `dateFilter` as well as the bounds — the calendar disables filtered\n // days, so accepting them from the keyboard made the two entry paths\n // disagree. Same check, same reason, as `wr-date-range-picker`.\n const filter = this.dateFilter();\n if (filter && !filter(date)) return true;\n return false;\n }\n\n private sameDate(a: Date | null, b: Date | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.getTime() === b.getTime();\n }\n}\n","<wr-input-group>\n <!--\n A plain textbox, per the APG date-picker-dialog pattern: `aria-haspopup` and\n `aria-expanded` are not permitted on `textbox` and belong to the trigger\n button below, which is the thing that opens the dialog.\n -->\n <input\n #input\n wrInput\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [value]=\"text()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (click)=\"openOnInput()\"\n (keydown)=\"onFieldKey($event)\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n #trigger\n type=\"button\"\n wrInputSuffix\n class=\"wr-date-picker__trigger\"\n [attr.aria-label]=\"triggerLabel()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"overlayOpen()\"\n [attr.aria-controls]=\"overlayOpen() ? panelId : null\"\n [disabled]=\"disabled()\"\n (click)=\"toggleOverlay()\"\n >\n @if (isTime()) {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.75\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"7\" y1=\"7\" x2=\"7\" y2=\"3.75\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n <line x1=\"7\" y1=\"7\" x2=\"9.5\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n } @else {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"10\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"1.5\" y1=\"5.5\" x2=\"12.5\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"4\" y1=\"1\" x2=\"4\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n @if (isDateTime()) {\n <circle cx=\"7\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" />\n }\n </svg>\n }\n </button>\n</wr-input-group>\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 { Component, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\n\nimport { WrCalendar, type WrCalendarRange } from 'ngwr/calendar';\nimport { WrDateAdapter } from 'ngwr/date';\nimport { readI18nText } from 'ngwr/i18n';\n\nimport type { WrDateRange } from '../interfaces';\n\nimport { WrTimePanel } from './time-panel';\n\n/**\n * Internal panel behind `<wr-date-range-picker>`: a range-mode\n * `<wr-calendar>`, plus one `<wr-time-picker>` per end when `withTime` is on.\n * Not part of the public API.\n *\n * The calendar owns range picking (including the start/end swap and the hover\n * preview); this panel only re-attaches the times so a datetime range keeps the\n * hours the user set while the dates move around.\n *\n * The steppers bind `WrTimePanel`'s own `value` model, NOT `[ngModel]`. The\n * classic-forms bridge defers its first write, and under zoneless change\n * detection that write lost the race with the panel's own echo guard: a range\n * bound to 16:00–17:00 opened showing 00:00 on both ends, and the first click\n * on a stepper committed midnight-plus-one over the real value.\n *\n * @internal\n */\n@Component({\n selector: 'wr-date-range-panel',\n templateUrl: './date-range-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-date-range-panel' },\n imports: [WrCalendar, WrTimePanel],\n})\nexport class WrDateRangePanel {\n readonly value = input<WrDateRange>([null, null]);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n readonly withTime = input(false);\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n readonly showSeconds = input(false);\n readonly step = input(1);\n\n /**\n * Forwarded to the calendar only: a range panel opened from the keyboard\n * lands on the day grid, never on a time field. Dates come first here — the\n * steppers are for the range you have already drawn.\n */\n readonly autoFocus = input(false);\n\n /** A range change from the CALENDAR — the picker is free to sort it. */\n readonly changed = output<WrDateRange>();\n\n /**\n * A range change from one of the TIME steppers, which must NOT be sorted while\n * it is happening. The steppers are bound to positions, so sorting mid-edit\n * moves the user's change to the other end: raising a same-day start past the\n * end left the start stuck and pushed the END up instead, once per click, on\n * the button the user was not pressing. Ordering is settled when the popup\n * closes — the same rule the text inputs already follow for typing.\n */\n readonly timeChanged = output<WrDateRange>();\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n\n protected readonly startTimeLabel = readI18nText('datePicker.startTime', 'Start time');\n protected readonly endTimeLabel = readI18nText('datePicker.endTime', 'End time');\n\n /**\n * A time set before its end has a date. The stepper is always live, so the\n * hours are parked here until a date arrives to carry them — otherwise the\n * edit would be silently dropped and the pick would land on midnight.\n */\n private readonly pendingStartTime = signal<Date | null>(null);\n private readonly pendingEndTime = signal<Date | null>(null);\n\n /** The calendar's own range model shape — same tuple, narrower name. */\n protected readonly calendarRange = computed<WrCalendarRange>(() => this.value());\n\n /**\n * Midnight today. The steppers need a concrete date to render, but the\n * fallback must NOT be the current wall clock: picking a date carries no time\n * across until a stepper is touched, so a `14:37` default would display a time\n * the commit never actually stores.\n */\n private readonly dayStart = computed(() => {\n const t = this.adapter.today();\n return this.adapter.createDate(this.adapter.getYear(t), this.adapter.getMonth(t), this.adapter.getDate(t));\n });\n\n /** Time steppers need a concrete date; fall back to a parked time, then midnight. */\n protected readonly startTime = computed(() => this.value()[0] ?? this.pendingStartTime() ?? this.dayStart());\n protected readonly endTime = computed(() => this.value()[1] ?? this.pendingEndTime() ?? this.dayStart());\n\n protected onRangeChange(range: WrCalendarRange): void {\n const [start, end] = range;\n const [prevStart, prevEnd] = this.value();\n\n // `WrCalendar.pickRange` restarts the range whenever it has no start, so a\n // range that was end-only (typed into the end input alone) would lose that\n // end on the next click. Read the click as filling in the missing start\n // instead; the picker orders the pair afterwards.\n const keptEnd = !prevStart && prevEnd && start && !end ? prevEnd : end;\n\n // The calendar only moves dates, so carry each end's existing time across —\n // or the time parked by a stepper that ran before this date existed.\n this.changed.emit([\n this.withTimeOf(start, prevStart ?? this.pendingStartTime()),\n this.withTimeOf(keptEnd, prevEnd ?? this.pendingEndTime()),\n ]);\n }\n\n protected onStartTimeChange(time: Date | null): void {\n if (!time) return;\n const [start, end] = this.value();\n if (!start) {\n this.pendingStartTime.set(time);\n return;\n }\n this.timeChanged.emit([this.withTimeOf(start, time), end]);\n }\n\n protected onEndTimeChange(time: Date | null): void {\n if (!time) return;\n const [start, end] = this.value();\n if (!end) {\n this.pendingEndTime.set(time);\n return;\n }\n this.timeChanged.emit([start, this.withTimeOf(end, time)]);\n }\n\n /** `date`'s calendar day carrying `time`'s clock. Null date stays null. */\n private withTimeOf(date: Date | null, time: Date | null): Date | null {\n if (!date) return null;\n if (!this.withTime() || !time) return date;\n return this.adapter.setTime(\n this.adapter.createDate(this.adapter.getYear(date), this.adapter.getMonth(date), this.adapter.getDate(date)),\n this.adapter.getHours(time),\n this.adapter.getMinutes(time),\n this.adapter.getSeconds(time)\n );\n }\n}\n","<wr-calendar\n mode=\"range\"\n [range]=\"calendarRange()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [dateFilter]=\"dateFilter()\"\n [autoFocus]=\"autoFocus()\"\n (rangeChange)=\"onRangeChange($event)\"\n/>\n\n@if (withTime()) {\n <div class=\"wr-date-range-panel__times\">\n <!-- A time picker is several inputs, not one control, so each end is a\n labelled group rather than a <label>. -->\n <div class=\"wr-date-range-panel__time\" role=\"group\" [attr.aria-label]=\"startTimeLabel()\">\n <span class=\"wr-date-range-panel__time-label\" aria-hidden=\"true\">{{ startTimeLabel() }}</span>\n <wr-time-picker\n [value]=\"startTime()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [step]=\"step()\"\n (valueChange)=\"onStartTimeChange($event)\"\n />\n </div>\n <div class=\"wr-date-range-panel__time\" role=\"group\" [attr.aria-label]=\"endTimeLabel()\">\n <span class=\"wr-date-range-panel__time-label\" aria-hidden=\"true\">{{ endTimeLabel() }}</span>\n <wr-time-picker\n [value]=\"endTime()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [step]=\"step()\"\n (valueChange)=\"onEndTimeChange($event)\"\n />\n </div>\n </div>\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 { Directive } from '@angular/core';\n\nimport { WR_FORM_FIELD } from 'ngwr/form';\n\n/**\n * Hides the surrounding `<wr-form-field>` from the range's END input. Not part\n * of the public API.\n *\n * `wrInput` adopts the field's `controlId` whenever the element carries no `id`\n * of its own, and `<wr-date-range-picker>` renders two of them: both took the\n * same id, so the document held it twice and the field's `<label for>` resolved\n * to whichever input came first. One label names one value — the same call\n * `wr-slider` makes for its two thumbs — so the START input keeps the id and\n * the end input takes none.\n *\n * All or nothing, deliberately: `WrFormFieldContext.controlId` is a\n * `Signal<string>` with no way to say \"no id\" (an empty one is no more valid\n * than a duplicate), so shadowing the token is the only lever, and it drops the\n * field's `aria-describedby` / `aria-invalid` from this input too. The message\n * stays announced from the start input, exactly as the slider's upper thumb\n * leaves it on the lower one.\n *\n * @internal\n */\n@Directive({\n selector: 'input[wrDateRangeEnd]',\n providers: [{ provide: WR_FORM_FIELD, useValue: null }],\n})\nexport class WrDateRangeEndInput {}\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 { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n type ComponentRef,\n DestroyRef,\n ElementRef,\n Injector,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { WrDateAdapter, type WrDateFormat } from 'ngwr/date';\nimport { readI18nText } from 'ngwr/i18n';\nimport { WrInput, WrInputGroup, WrInputSuffix } from 'ngwr/input';\nimport { WR_OVERLAY, WrOutsideClick, wrFollowDirection } from 'ngwr/overlay';\n\nimport type { WrDateRange } from './interfaces';\nimport { WrDateRangePanel } from './internal/date-range-panel';\nimport { WrDateRangeEndInput } from './internal/range-end-input';\n\n/** Which end of the range an edit applies to. */\ntype RangeEnd = 0 | 1;\n\n/** Per-instance popup ids, so `aria-controls` can point at one panel. */\nlet rangePanelUid = 0;\n\n/**\n * Date-range picker — two text inputs sharing one range calendar.\n *\n * Separate from `<wr-date-picker>` because the value is a different type: a\n * range is `[start, end]`, and folding that into the single picker's\n * `Date | null` would break `[formField]` inference for every existing usage.\n * Everything else matches — same input skeleton, same overlay, same\n * {@link WrDateAdapter} formats.\n *\n * - `'date'` (default) — popover renders a range calendar. Picking the second\n * date closes the overlay.\n * - `'datetime'` — popover adds a time stepper per end. Picking dates does NOT\n * close, since the user typically sets the times next.\n *\n * A signal-forms native control: it implements\n * `FormValueControl<WrDateRange | null>`, so `[formField]` binds straight to\n * its `value` model. `[(value)]` works standalone, and classic `[(ngModel)]` /\n * reactive forms keep working through Angular's bridge.\n *\n * Either end may be `null` while the range is half-picked. Out-of-order ends\n * are swapped on commit, matching the calendar's own behaviour.\n *\n * @example\n * ```html\n * <!-- signal forms -->\n * <wr-date-range-picker [formField]=\"form.period\" format=\"dd.MM.yyyy\" />\n *\n * <!-- standalone two-way binding -->\n * <wr-date-range-picker [(value)]=\"period\" [minDate]=\"minDate\" />\n *\n * <!-- date + time on both ends -->\n * <wr-date-range-picker mode=\"datetime\" [(value)]=\"window\" timeFormat=\"24h\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/date-picker\n */\n@Component({\n selector: 'wr-date-range-picker',\n templateUrl: './date-range-picker.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrDateRangeEndInput, WrInput, WrInputGroup, WrInputSuffix],\n})\nexport class WrDateRangePicker implements FormValueControl<WrDateRange | null> {\n /** Picker behavior — see class doc. @default 'date' */\n readonly mode = input<'date' | 'datetime'>('date');\n\n /**\n * Format used for both display and parsing, on both ends. When `null`\n * (default), it is derived from `mode` (`shortDate` / `shortDateTime`). Pass\n * a named key or raw token string to override.\n */\n readonly format = input<WrDateFormat | (string & {}) | null>(null);\n\n /** Placeholder for the start input. */\n readonly startPlaceholder = input<string>('');\n\n /** Placeholder for the end input. */\n readonly endPlaceholder = input<string>('');\n\n /** Glyph rendered between the two inputs. @default '–' */\n readonly separator = input<string>('–');\n\n // Named `minDate` / `maxDate`, not `min` / `max`: `FormUiControl` reserves\n // those slots for the control's own value type, which here is a range — a\n // `min` typed as a range makes no sense. Matches `WrValidators.minDate`.\n /** Min selectable date, applied to both ends. */\n readonly minDate = input<Date | null>(null);\n\n /** Max selectable date, applied to both ends. */\n readonly maxDate = input<Date | null>(null);\n\n /** Predicate to disable specific dates (forwarded to the calendar). */\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n\n /** Time-panel 12 / 24-hour format. Applies in `datetime` mode. @default 'auto' */\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n\n /** Render the seconds column. Applies in `datetime` mode. @default false */\n readonly showSeconds = input(false, { transform: coerceBooleanProperty });\n\n /** Minute / second step for the time panels. @default 1 */\n readonly step = input(1, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 1)) });\n\n /**\n * Disable interaction. Bound automatically from the field's disabled state\n * when used with `[formField]`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Read-only — neither the inputs nor the calendar can change the value.\n *\n * Deliberately stricter than `wr-date-picker`, which still opens its popup\n * while read-only: with two fields feeding one calendar there is no reading\n * of \"untypeable\" that leaves the grid free to rewrite both ends. The doc\n * used to promise the trigger still opened; the code has always refused, and\n * refusing is the behaviour worth keeping.\n *\n * @default false\n */\n readonly readonly = input(false, { transform: coerceBooleanProperty });\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n /**\n * Ambient reading direction, for the open panel alone — nothing in this\n * component reads it directly. Optional so a bare `TestBed` needs no\n * provider; `Directionality` is root-provided anyway, and a missing one\n * simply reads as `ltr`.\n */\n private readonly dir = inject(Directionality, { optional: true });\n protected readonly startEl = viewChild.required<ElementRef<HTMLInputElement>>('startInput');\n protected readonly endEl = viewChild.required<ElementRef<HTMLInputElement>>('endInput');\n protected readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n /** The picked range. Bound by `[formField]`, or two-way via `[(value)]`. */\n readonly value = model<WrDateRange | null>(null);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n /** Text currently in each input (may be partial / invalid mid-type). */\n protected readonly startText = signal<string>('');\n protected readonly endText = signal<string>('');\n\n /** Whether the popover is currently open. */\n protected readonly overlayOpen = signal(false);\n\n /**\n * Which element opened the popup — captured as an argument, never read off\n * `document.activeElement`, which by then may already be the pane. With TWO\n * text inputs this is the whole point: \"restore focus to the field\" is\n * ambiguous here, and the old code resolved it by always picking the START\n * input, so closing from the end input threw the caret across the control.\n */\n private openedFrom: HTMLElement | null = null;\n\n /** Whether the panel this open cycle should take focus. */\n private autoFocusPanel = false;\n\n /** Resolved format — falls back to a mode-appropriate default. */\n protected readonly resolvedFormat = computed<string>(() =>\n this.format() ? String(this.format()) : this.mode() === 'datetime' ? 'shortDateTime' : 'shortDate'\n );\n\n protected readonly isDateTime = computed(() => this.mode() === 'datetime');\n\n protected readonly triggerLabel = readI18nText('datePicker.openRange', 'Open range calendar');\n protected readonly startLabel = readI18nText('datePicker.rangeStart', 'Range start');\n protected readonly endLabel = readI18nText('datePicker.rangeEnd', 'Range end');\n\n private readonly panelLabelRange = readI18nText('datePicker.panelRange', 'Choose date range');\n private readonly panelLabelRangeDateTime = readI18nText(\n 'datePicker.panelRangeDateTime',\n 'Choose date and time range'\n );\n\n /**\n * Accessible name of the popup. The trigger advertises\n * `aria-haspopup=\"dialog\"`, so the pane is a `role=\"dialog\"` — and an unnamed\n * dialog announces as a bare \"dialog\". Defaults to the catalog's\n * `datePicker.panelRange*` string for the current `mode`.\n */\n readonly panelAriaLabel = input<string | null>(null);\n\n /** Popup id — what the trigger's `aria-controls` points at while open. */\n protected readonly panelId = `wr-date-range-picker-panel-${++rangePanelUid}`;\n\n protected readonly resolvedPanelLabel = computed(() => {\n const explicit = this.panelAriaLabel();\n if (explicit) return explicit;\n return this.isDateTime() ? this.panelLabelRangeDateTime() : this.panelLabelRange();\n });\n\n protected readonly classes = computed(() => {\n const parts = ['wr-date-range-picker', `wr-date-range-picker--${this.mode()}`];\n if (this.disabled()) parts.push('wr-date-range-picker--disabled');\n return parts.join(' ');\n });\n\n private overlayRef: OverlayRef | null = null;\n\n /** Live panel ref while the popover is open — lets typed edits move the\n * displayed month in real time (not just on reopen). */\n private readonly panelRef = signal<ComponentRef<WrDateRangePanel> | null>(null);\n\n /** Last range we pushed into the model ourselves, so the sync effect can skip\n * the echo of our own edits and never reformat text mid-type. */\n private lastValue: WrDateRange | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.dispose());\n\n // Mirror external writes to `value` into the two display texts.\n effect(() => {\n const v = this.value();\n untracked(() => {\n if (this.sameRange(v, this.lastValue)) return;\n this.lastValue = v;\n this.startText.set(this.display(v?.[0] ?? null));\n this.endText.set(this.display(v?.[1] ?? null));\n });\n });\n\n // A panel that is up when `readonly` turns on has to go, and `disabled` is\n // the same case. The three entrance guards refuse to OPEN the calendar, and\n // the component's whole position on `readonly` — stricter than the single\n // picker's, which keeps its calendar browsable — is that the calendar is\n // not a second way in. Leaving it standing and only refusing the write\n // trades a wrong value for a dead panel: every click does nothing and\n // nothing says why.\n effect(() => {\n if (!this.readonly() && !this.disabled()) return;\n untracked(() => {\n if (this.overlayRef) this.closeOverlay();\n });\n });\n\n // Keep the open panel in step with the model.\n effect(() => {\n const ref = this.panelRef();\n if (ref) ref.setInput('value', this.value() ?? [null, null]);\n });\n\n // …and with every other input. Pushing these only at attach time meant a\n // `[minDate]` (or filter, or time format) that changed while the popover was\n // open silently kept the stale constraint until the next reopen.\n effect(() => {\n const ref = this.panelRef();\n if (!ref) return;\n ref.setInput('min', this.minDate());\n ref.setInput('max', this.maxDate());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('withTime', this.isDateTime());\n ref.setInput('timeFormat', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n });\n }\n\n // Template handlers\n\n protected onStartInput(event: Event): void {\n this.onRangeInput(event, 0);\n }\n\n protected onEndInput(event: Event): void {\n this.onRangeInput(event, 1);\n }\n\n protected onBlur(event: FocusEvent): void {\n // Moving between the two ends is still one interaction — only report the\n // control as touched once focus actually leaves it, or tabbing from start to\n // end would mark a bound field touched mid-entry.\n const next = event.relatedTarget as Node | null;\n const leaving = !next || !this.host.nativeElement.contains(next);\n if (leaving) this.touch.emit();\n\n // Typing leaves the ends in whatever order they were entered; settle it\n // here, once the user has stopped — and moving from one end to the other is\n // NOT stopping. Sorting on that hop took the start date the user had just\n // typed and moved it into the field they were tabbing into, leaving the old\n // end date under their cursor. Same rule the time steppers follow.\n const [start, end] = this.commitRange(this.current(), { normalise: leaving });\n // Reformat to canonical on blur (cleans up `1/5/25` → `1/5/2025`).\n this.startText.set(this.display(start));\n this.endText.set(this.display(end));\n }\n\n /** Called by an input's click — opens the overlay if it isn't open already. */\n protected openOnInput(end: RangeEnd): void {\n if (this.disabled() || this.readonly() || this.overlayRef) return;\n // Deliberately WITHOUT focus: this click placed a caret in one of the text\n // fields, and pulling focus into the grid would throw that away.\n // `Alt+ArrowDown` / `ArrowDown` are the keyboard way in — see onFieldKey.\n this.openOverlay(this.fieldEl(end), false);\n }\n\n protected toggleOverlay(): void {\n // `readonly` blocks the calendar too — otherwise the inputs refuse typing\n // while the popover happily edits the same value.\n if (this.disabled() || this.readonly()) return;\n if (this.overlayRef) {\n // Focus is already on the trigger — nothing to restore.\n this.closeOverlay();\n } else {\n this.openOverlay(this.triggerEl()?.nativeElement ?? null, true);\n }\n }\n\n /**\n * The keyboard route into the popup, per the APG date-picker pattern, and the\n * only one either field has. `Alt+ArrowDown` opens and takes focus; a bare\n * vertical arrow walks focus in when the popup is ALREADY open, which is how\n * someone who opened it by clicking a field reaches the grid. Every other key\n * belongs to the field, so typing a date keeps working with the popup open.\n */\n protected onFieldKey(event: KeyboardEvent, end: RangeEnd): void {\n if (this.disabled() || this.readonly()) return;\n\n const vertical = event.key === 'ArrowDown' || event.key === 'ArrowUp';\n if (!vertical) return;\n\n if (event.altKey && event.key === 'ArrowDown' && !this.overlayRef) {\n event.preventDefault();\n this.openOverlay(this.fieldEl(end), true);\n return;\n }\n\n if (this.overlayRef) {\n event.preventDefault();\n this.focusPanel();\n }\n }\n\n /** The input element for an end — the two are otherwise addressed by index. */\n private fieldEl(end: RangeEnd): HTMLInputElement {\n return end === 0 ? this.startEl().nativeElement : this.endEl().nativeElement;\n }\n\n /**\n * Move focus into an already-mounted panel. A plain query is right HERE and\n * wrong at mount time: the panel has settled, so there is no deferral to get\n * wrong — and it keeps `autoFocus` as the single piece of panel API.\n */\n private focusPanel(): void {\n const pane = this.overlayRef?.overlayElement;\n const target =\n pane?.querySelector<HTMLElement>('.wr-calendar__day--focused:not([disabled])') ??\n pane?.querySelector<HTMLElement>('.wr-time-picker__input');\n target?.focus();\n }\n\n /** Hand focus back to whatever opened the popup, if it is still on the page. */\n private restoreFocus(): void {\n const opener = this.openedFrom?.isConnected ? this.openedFrom : null;\n opener?.focus();\n\n // Connected is not the question — whether the focus LANDED is. The calendar\n // trigger goes `disabled` the moment `readonly` turns on, and a disabled\n // button is still in the document and still refuses focus, so a panel\n // closed by that flip used to land on `<body>` and the next Tab restarted\n // at the top of the page. The start field keeps its tab stop while\n // read-only, which is the whole point of read-only, so it is where the\n // caret belongs.\n if (this.host.nativeElement.ownerDocument.activeElement !== opener) {\n this.startEl().nativeElement.focus();\n }\n }\n\n // Input parsing\n\n private onRangeInput(event: Event, end: RangeEnd): void {\n const raw = (event.target as HTMLInputElement).value;\n (end === 0 ? this.startText : this.endText).set(raw);\n\n const [start, finish] = this.current();\n if (!raw) {\n this.commitRange(end === 0 ? [null, finish] : [start, null], { normalise: false });\n return;\n }\n const parsed = this.adapter.parse(raw, this.resolvedFormat());\n if (!parsed || !this.adapter.isValid(parsed) || this.isOutOfBounds(parsed)) return;\n // Never reorder mid-keystroke: a half-typed date can parse to an\n // out-of-order value, and swapping there would yank the text the user is\n // still typing over to the other input. Ordering is settled on blur.\n this.commitRange(end === 0 ? [parsed, finish] : [start, parsed], { normalise: false });\n }\n\n // Overlay\n\n private openOverlay(openedFrom: HTMLElement | null = null, autoFocus = false): void {\n if (this.overlayRef) return;\n this.openedFrom = openedFrom;\n this.autoFocusPanel = autoFocus;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n panelClass: 'wr-date-picker-overlay',\n });\n\n // Same four fallbacks as `wr-date-picker`, two of them anchored on `end`,\n // and the two calendars inside the panel read `Directionality` live — so an\n // open range panel had to follow a flip or render its months against a\n // direction the rest of the page had left behind.\n wrFollowDirection(this.overlayRef, this.dir, this.injector);\n\n this.overlayOpen.set(true);\n\n // The trigger promises `aria-haspopup=\"dialog\"`; the pane is the element it\n // points at, so the role, the name and the id all belong here. Non-modal on\n // purpose — the two text fields stay reachable while the calendar is up,\n // which is the whole interaction model.\n const pane = this.overlayRef.overlayElement;\n pane.id = this.panelId;\n pane.setAttribute('role', 'dialog');\n pane.setAttribute('aria-modal', 'false');\n pane.setAttribute('aria-label', this.resolvedPanelLabel());\n\n const ref = this.overlayRef.attach(new ComponentPortal(WrDateRangePanel));\n ref.setInput('value', this.value() ?? [null, null]);\n ref.setInput('autoFocus', this.autoFocusPanel);\n this.panelRef.set(ref);\n\n // A stepper edit belongs to the end it was made on. Sorting it here is what\n // made the start stepper stop responding once it passed the end.\n ref.instance.timeChanged.subscribe(next => this.commitRange(next, { normalise: false }));\n\n ref.instance.changed.subscribe(next => {\n const committed = this.commitRange(next, { normalise: true });\n // A complete date-only range is the end of the interaction; a datetime\n // range still needs its hours, so the panel stays put.\n if (!this.isDateTime() && committed[0] && committed[1]) this.closeOverlay();\n });\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.closeOverlay();\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeOverlay();\n }\n });\n }\n\n /**\n * Close the popover, handing focus back to whichever field or button opened\n * it — but ONLY when focus was still inside the pane. Dropped there it would\n * land on `<body>` and the next Tab would restart from the top of the page;\n * moved on by the user, it must be left where they put it.\n *\n * There is deliberately no \"always restore\" escape hatch. Escape reaches this\n * overlay from anywhere in the document (the CDK dispatches it to the topmost\n * one), so forcing a restore would drag the caret backwards out of the field\n * the user was actually typing in — into the one that happened to open the\n * popup, possibly several Tab stops away.\n */\n private closeOverlay(): void {\n const pane = this.overlayRef?.overlayElement;\n const inside = !!pane && pane.contains(this.host.nativeElement.ownerDocument.activeElement);\n\n this.dispose();\n\n // The interaction is over, so settle the ordering an in-progress time edit\n // was allowed to leave inverted. Blur does the same for the text inputs;\n // without this, closing by clicking outside never passes through one.\n this.commitRange(this.current(), { normalise: true });\n\n if (inside) this.restoreFocus();\n }\n\n private dispose(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.panelRef.set(null);\n this.overlayOpen.set(false);\n this.autoFocusPanel = false;\n }\n\n // Commit\n\n /**\n * Push to the model and refresh the text of whichever ends changed. Returns\n * what was actually committed.\n *\n * `normalise` swaps out-of-order ends. The calendar and blur ask for it; a\n * keystroke does not, because reordering while the user is still typing would\n * move their in-progress text into the other input.\n */\n private commitRange(next: WrDateRange, options: { normalise: boolean }): WrDateRange {\n const normalised = options.normalise ? this.normalise(next) : next;\n // Only write when a date actually moved, and never while `readonly`.\n //\n // `normalise()` allocates a fresh tuple on every call and `model()` compares\n // by reference, so an unconditional write would emit on every blur — enough\n // to mark a bound `[formField]` dirty just by tabbing through the two inputs.\n //\n // The `readonly` half is the one the three entrance guards cannot cover:\n // `openOnInput`, `toggleOverlay` and `onFieldKey` all refuse to OPEN the\n // calendar, and none of them is consulted again by a panel that is already\n // up. A `readonly()` schema rule turning on mid-session — a save starting,\n // another field flipping the row — left the popup standing and a day click\n // wrote the range anyway. The single picker guards its write point for\n // exactly this reason and says so at `commitValue`; this is the same guard\n // at the same place.\n if (!this.readonly() && !this.sameRange(normalised, this.value())) {\n this.lastValue = normalised;\n this.value.set(normalised);\n }\n // Only rewrite the text of an end whose date moved out from under it —\n // otherwise a half-typed date would be reformatted on every keystroke.\n if (!this.sameDate(normalised[0], this.parseText(this.startText()))) {\n this.startText.set(this.display(normalised[0]));\n }\n if (!this.sameDate(normalised[1], this.parseText(this.endText()))) {\n this.endText.set(this.display(normalised[1]));\n }\n return normalised;\n }\n\n // Helpers\n\n private current(): WrDateRange {\n return this.value() ?? [null, null];\n }\n\n private display(date: Date | null): string {\n return date && this.adapter.isValid(date) ? this.adapter.format(date, this.resolvedFormat()) : '';\n }\n\n private parseText(raw: string): Date | null {\n if (!raw) return null;\n const parsed = this.adapter.parse(raw, this.resolvedFormat());\n return parsed && this.adapter.isValid(parsed) ? parsed : null;\n }\n\n /** Keep `[start, end]` in chronological order once both ends exist. */\n private normalise(range: WrDateRange): WrDateRange {\n const [start, end] = range;\n if (start && end && this.compareEnds(start, end) > 0) return [end, start];\n return [start, end];\n }\n\n /**\n * Chronological comparison at the precision the mode needs. The adapter's\n * `compareDate` is day-precision by contract, which would leave an inverted\n * same-day `datetime` range (18:00 → 09:00) unswapped.\n */\n private compareEnds(a: Date, b: Date): number {\n const byDay = this.adapter.compareDate(a, b);\n if (byDay !== 0 || !this.isDateTime()) return byDay;\n const clock = (d: Date): number =>\n this.adapter.getHours(d) * 3600 + this.adapter.getMinutes(d) * 60 + this.adapter.getSeconds(d);\n return clock(a) - clock(b);\n }\n\n /**\n * Whether a typed date must be rejected. Covers `dateFilter` as well as the\n * bounds — the calendar disables filtered days, so accepting them from the\n * keyboard would make the two entry paths disagree.\n */\n private isOutOfBounds(date: Date): boolean {\n const min = this.minDate();\n if (min && this.adapter.compareDate(date, min) < 0) return true;\n const max = this.maxDate();\n if (max && this.adapter.compareDate(date, max) > 0) return true;\n const filter = this.dateFilter();\n if (filter && !filter(date)) return true;\n return false;\n }\n\n private sameDate(a: Date | null, b: Date | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.getTime() === b.getTime();\n }\n\n /**\n * `null` and `[null, null]` are the same VALUE — an empty range — and treating\n * them as different is what let the FIRST blur on an untouched picker write\n * `[null, null]` over the `null` it was bound to. No date had moved, but\n * `model()` emitted: a bound `[formField]` went dirty from nothing but tabbing\n * through, and a consumer's `@if (period())` flipped from empty to truthy with\n * neither end picked. The write guard in `commitRange` is only as good as this\n * comparison.\n */\n private sameRange(a: WrDateRange | null, b: WrDateRange | null): boolean {\n if (a === b) return true;\n const [aStart, aEnd] = a ?? [null, null];\n const [bStart, bEnd] = b ?? [null, null];\n return this.sameDate(aStart, bStart) && this.sameDate(aEnd, bEnd);\n }\n}\n","<wr-input-group>\n <input\n #startInput\n wrInput\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n class=\"wr-date-range-picker__input\"\n [attr.aria-label]=\"startLabel()\"\n [value]=\"startText()\"\n [placeholder]=\"startPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (click)=\"openOnInput(0)\"\n (keydown)=\"onFieldKey($event, 0)\"\n (input)=\"onStartInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <span class=\"wr-date-range-picker__separator\" aria-hidden=\"true\">{{ separator() }}</span>\n <!--\n `wrDateRangeEnd` hides the surrounding `<wr-form-field>` from this input, so\n only the start one adopts its `controlId` — see the directive for why the\n second half of a range carries no id at all.\n -->\n <input\n #endInput\n wrInput\n wrDateRangeEnd\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n class=\"wr-date-range-picker__input\"\n [attr.aria-label]=\"endLabel()\"\n [value]=\"endText()\"\n [placeholder]=\"endPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (click)=\"openOnInput(1)\"\n (keydown)=\"onFieldKey($event, 1)\"\n (input)=\"onEndInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <!--\n `readonly` refuses to open the popup, so the trigger is disabled with it —\n otherwise it stays a focusable button advertising `aria-haspopup=\"dialog\"`\n for a dialog it will never show.\n -->\n <button\n #trigger\n type=\"button\"\n wrInputSuffix\n class=\"wr-date-picker__trigger\"\n [attr.aria-label]=\"triggerLabel()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"overlayOpen()\"\n [attr.aria-controls]=\"overlayOpen() ? panelId : null\"\n [disabled]=\"disabled() || readonly()\"\n (click)=\"toggleOverlay()\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"10\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"1.5\" y1=\"5.5\" x2=\"12.5\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"4\" y1=\"1\" x2=\"4\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n @if (isDateTime()) {\n <circle cx=\"7\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" />\n }\n </svg>\n </button>\n</wr-input-group>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-date-picker.mjs","sources":["../../../projects/lib/date-picker/internal/time-panel.ts","../../../projects/lib/date-picker/internal/time-panel.html","../../../projects/lib/date-picker/internal/date-time-panel.ts","../../../projects/lib/date-picker/internal/date-time-panel.html","../../../projects/lib/date-picker/internal/input-refusal.ts","../../../projects/lib/date-picker/date-picker.ts","../../../projects/lib/date-picker/date-picker.html","../../../projects/lib/date-picker/internal/date-range-panel.ts","../../../projects/lib/date-picker/internal/date-range-panel.html","../../../projects/lib/date-picker/internal/range-end-input.ts","../../../projects/lib/date-picker/date-range-picker.ts","../../../projects/lib/date-picker/date-range-picker.html","../../../projects/lib/date-picker/ngwr-date-picker.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\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ElementRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { WrDateAdapter, WR_DATE_LOCALE } from 'ngwr/date';\nimport { readI18nText } from 'ngwr/i18n';\nimport { clamp } from 'ngwr/utils';\n\n/**\n * Two digits, in the locale's own numbering system.\n *\n * The field beside this panel prints `٠٢:٣٠` through `Intl`, and the panel used to print\n * `02:30` beside it — the same clock in two numbering systems, one popup apart. The pair\n * below is a copy of the arithmetic `WrNativeDateAdapter` does for its own parser and\n * deliberately stays a copy: sharing it would mean adding a numeral helper to `ngwr/date`'s\n * public API, which is a wide promise to make for twenty lines of `Intl`.\n */\nfunction padLocale(n: number, locale: string): string {\n try {\n return new Intl.NumberFormat(locale, { minimumIntegerDigits: 2, useGrouping: false }).format(n);\n } catch {\n return String(n).padStart(2, '0');\n }\n}\n\n/**\n * The character the locale puts between an hour and a minute.\n *\n * Finnish writes `14.30`, so a hard-coded colon put two different separators on one\n * screen — the field printed `14.30` through `Intl` and the panel under it `14 : 30`.\n * `formatToParts` is the only place that answer lives; a colon is the fallback for a\n * locale whose separator is whitespace or missing.\n */\nfunction timeSeparatorFor(locale: string): string {\n try {\n const parts = new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }).formatToParts(\n new Date(2024, 0, 15, 13, 45)\n );\n const afterHour = parts[parts.findIndex(part => part.type === 'hour') + 1];\n const text = afterHour?.type === 'literal' ? afterHour.value.replace(/[\\u200e\\u200f\\u061c]/g, '').trim() : '';\n if (text) return text;\n } catch {\n // No `Intl` for this locale — the colon stays.\n }\n return ':';\n}\n\n/** The ten digits `locale` writes, index 0 to 9 — empty when the system is algorithmic. */\nfunction numeralsFor(locale: string): readonly string[] {\n try {\n const formatter = new Intl.NumberFormat(locale, { useGrouping: false });\n const digits: string[] = [];\n for (let i = 0; i < 10; i++) {\n const digit = formatter.format(i);\n if ([...digit].length !== 1 || digits.includes(digit)) return [];\n digits.push(digit);\n }\n return digits;\n } catch {\n return [];\n }\n}\n\n/**\n * Read a typed number in either the locale's digits or ASCII ones.\n *\n * Both halves are needed and for different reasons: an Arabic keyboard sends `٠٢`, which\n * `Number()` reads as `NaN` and the handler then dropped on the floor, and a Latin\n * keyboard sends `02` into a field that displays `٠٢`.\n */\nfunction readNumber(raw: string, numerals: readonly string[]): number {\n let out = '';\n for (const ch of raw.trim()) {\n if (ch >= '0' && ch <= '9') {\n out += ch;\n continue;\n }\n const index = numerals.indexOf(ch);\n if (index < 0) return Number.NaN;\n out += String(index);\n }\n return out ? Number(out) : Number.NaN;\n}\n\n/** Wraps a value into `[0, modulus)` so steppers cycle nicely. */\nfunction wrap(v: number, modulus: number): number {\n return ((v % modulus) + modulus) % modulus;\n}\n\n/** Detect whether a locale uses 12-hour time by default. */\nfunction isLocaleHour12(locale: string): boolean {\n try {\n return new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hour12 === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Internal time stepper panel rendered by `<wr-date-picker mode=\"time\">`\n * (standalone) and `mode=\"datetime\"` (composed with the calendar). Not part\n * of the public API — use `<wr-date-picker mode=\"time\">` instead.\n *\n * @internal\n */\n@Component({\n selector: 'wr-time-picker',\n templateUrl: './time-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n})\nexport class WrTimePanel implements FormValueControl<Date | null> {\n /** 12 / 24-hour mode. @default 'auto' (derived from the locale) */\n readonly format = input<'auto' | '12h' | '24h'>('auto');\n\n /** Render a third column for seconds. @default false */\n readonly showSeconds = input(false, { transform: coerceBooleanProperty });\n\n /** Step applied to minutes / seconds steppers. @default 1 */\n readonly step = input(1, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 1)) });\n\n /** Disable interaction. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Read-only — values cannot be changed. @default false */\n readonly readonly = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Move focus onto the hours field once the panel is on screen. Off by\n * default — see `WrCalendar.autoFocus` for why. @default false\n */\n readonly autoFocus = input(false, { transform: coerceBooleanProperty });\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly locale = inject(WR_DATE_LOCALE);\n private readonly numerals = numeralsFor(this.locale);\n\n /** Hour / minute separator, read off the locale rather than written into the template. */\n protected readonly separator = timeSeparatorFor(this.locale);\n\n /**\n * Form value — the selected time as a `Date` (its date portion is preserved).\n * A signal-forms native control: `[formField]` binds this directly, and\n * `[(ngModel)]` / `[(value)]` bind it through Angular's bridge.\n */\n readonly value = model<Date | null>(null);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n /** Source of truth — stores h/m/s in 24-hour form. */\n protected readonly hours = signal(0);\n protected readonly minutes = signal(0);\n protected readonly seconds = signal(0);\n\n /** Date portion preserved across updates (today's date if none was supplied). */\n private readonly basis = signal<Date>(this.adapter.today());\n\n protected readonly effectiveDisabled = computed(() => this.disabled());\n\n constructor() {\n // The hours field, not the increment button: a stepper is a shortcut, the\n // number is the control. Deferred because the inputs are not in the DOM\n // until the panel's first change-detection pass.\n afterNextRender(() => {\n if (!this.autoFocus()) return;\n this.host.nativeElement.querySelector<HTMLInputElement>('.wr-time-picker__input')?.focus();\n });\n\n // Mirror an external `value` write into the internal h/m/s state (the old\n // `writeValue` body). Guarded against the echo of our own `emit()` so a live\n // edit is never clobbered by re-deriving it.\n effect(() => {\n const value = this.value();\n untracked(() => {\n if (value === this.lastEmitted) return;\n if (value && this.adapter.isValid(value)) {\n this.basis.set(this.adapter.clone(value));\n this.hours.set(this.adapter.getHours(value));\n this.minutes.set(this.adapter.getMinutes(value));\n this.seconds.set(this.adapter.getSeconds(value));\n } else {\n this.basis.set(this.adapter.today());\n this.hours.set(0);\n this.minutes.set(0);\n this.seconds.set(0);\n }\n });\n });\n }\n\n protected readonly interactive = computed(() => !this.effectiveDisabled() && !this.readonly());\n\n /** Resolved format — turns 'auto' into '12h' or '24h' based on the locale. */\n protected readonly is12h = computed(() => {\n const f = this.format();\n if (f === '12h') return true;\n if (f === '24h') return false;\n return isLocaleHour12(this.locale);\n });\n\n /** Hours value shown in the input (1-12 in 12h mode, 0-23 otherwise). */\n protected readonly displayHours = computed(() => {\n if (!this.is12h()) return this.hours();\n const h = this.hours() % 12;\n return h === 0 ? 12 : h;\n });\n\n protected readonly isPm = computed(() => this.hours() >= 12);\n\n /**\n * Every name this panel speaks, out of the catalog. There is no override input\n * because there is no public host to put one on — the panel is `@internal`, and\n * the picker around it already localizes its trigger and popup names, so the\n * hard-coded English here put two languages inside one popup.\n */\n protected readonly hoursLabel = readI18nText('datePicker.hours', 'Hours');\n protected readonly minutesLabel = readI18nText('datePicker.minutes', 'Minutes');\n protected readonly secondsLabel = readI18nText('datePicker.seconds', 'Seconds');\n protected readonly incrementHoursLabel = readI18nText('datePicker.incrementHours', 'Increment hours');\n protected readonly decrementHoursLabel = readI18nText('datePicker.decrementHours', 'Decrement hours');\n protected readonly incrementMinutesLabel = readI18nText('datePicker.incrementMinutes', 'Increment minutes');\n protected readonly decrementMinutesLabel = readI18nText('datePicker.decrementMinutes', 'Decrement minutes');\n protected readonly incrementSecondsLabel = readI18nText('datePicker.incrementSeconds', 'Increment seconds');\n protected readonly decrementSecondsLabel = readI18nText('datePicker.decrementSeconds', 'Decrement seconds');\n protected readonly toggleAmPmLabel = readI18nText('datePicker.toggleAmPm', 'Toggle AM / PM');\n\n private readonly amLabel = readI18nText('datePicker.am', 'AM');\n private readonly pmLabel = readI18nText('datePicker.pm', 'PM');\n\n protected readonly amPmLabel = computed(() => (this.isPm() ? this.pmLabel() : this.amLabel()));\n\n protected readonly hoursDisplay = computed(() => padLocale(this.displayHours(), this.locale));\n protected readonly minutesDisplay = computed(() => padLocale(this.minutes(), this.locale));\n protected readonly secondsDisplay = computed(() => padLocale(this.seconds(), this.locale));\n\n protected readonly classes = computed(() => {\n const parts = ['wr-time-picker'];\n if (this.is12h()) parts.push('wr-time-picker--12h');\n if (this.showSeconds()) parts.push('wr-time-picker--with-seconds');\n if (this.effectiveDisabled()) parts.push('wr-time-picker--disabled');\n return parts.join(' ');\n });\n\n /** Last value we pushed via `emit()`, so the sync effect can skip the echo. */\n private lastEmitted: Date | null = null;\n\n // Typed-input handlers\n\n protected onHoursInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n // An emptied box is someone mid-retype, not a request for zero: `Number('')`\n // is 0, so committing here rewrote the field they had just cleared.\n if (!raw.trim()) return;\n const n = readNumber(raw, this.numerals);\n if (Number.isNaN(n)) return;\n if (this.is12h()) {\n const h12 = clamp(Math.trunc(n), 1, 12) % 12;\n this.hours.set(this.isPm() ? h12 + 12 : h12);\n } else {\n this.hours.set(clamp(Math.trunc(n), 0, 23));\n }\n this.emit();\n }\n\n protected onMinutesInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n // An emptied box is someone mid-retype, not a request for zero: `Number('')`\n // is 0, so committing here rewrote the field they had just cleared.\n if (!raw.trim()) return;\n const n = readNumber(raw, this.numerals);\n if (Number.isNaN(n)) return;\n this.minutes.set(clamp(Math.trunc(n), 0, 59));\n this.emit();\n }\n\n protected onSecondsInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n // An emptied box is someone mid-retype, not a request for zero: `Number('')`\n // is 0, so committing here rewrote the field they had just cleared.\n if (!raw.trim()) return;\n const n = readNumber(raw, this.numerals);\n if (Number.isNaN(n)) return;\n this.seconds.set(clamp(Math.trunc(n), 0, 59));\n this.emit();\n }\n\n protected onBlur(): void {\n this.touch.emit();\n }\n\n // Stepper handlers (▲ / ▼ buttons)\n\n protected stepHours(direction: 1 | -1): void {\n if (!this.interactive()) return;\n this.hours.set(wrap(this.hours() + direction, 24));\n this.emit();\n }\n\n protected stepMinutes(direction: 1 | -1): void {\n if (!this.interactive()) return;\n this.minutes.set(wrap(this.minutes() + direction * this.step(), 60));\n this.emit();\n }\n\n protected stepSeconds(direction: 1 | -1): void {\n if (!this.interactive()) return;\n this.seconds.set(wrap(this.seconds() + direction * this.step(), 60));\n this.emit();\n }\n\n protected toggleAmPm(): void {\n if (!this.interactive()) return;\n // ±12 hours flips AM ↔ PM; wrap handles overflow.\n this.hours.set(wrap(this.hours() + 12, 24));\n this.emit();\n }\n\n // Emission\n\n private emit(): void {\n const next = this.adapter.setTime(this.basis(), this.hours(), this.minutes(), this.seconds());\n this.lastEmitted = next;\n this.value.set(next);\n }\n}\n","<div class=\"wr-time-picker__col\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"incrementHoursLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepHours(1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <input\n class=\"wr-time-picker__input\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.aria-label]=\"hoursLabel()\"\n [value]=\"hoursDisplay()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onHoursInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"decrementHoursLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepHours(-1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n</div>\n\n<span class=\"wr-time-picker__sep\" aria-hidden=\"true\">{{ separator }}</span>\n\n<div class=\"wr-time-picker__col\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"incrementMinutesLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepMinutes(1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <input\n class=\"wr-time-picker__input\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.aria-label]=\"minutesLabel()\"\n [value]=\"minutesDisplay()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onMinutesInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"decrementMinutesLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepMinutes(-1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n</div>\n\n@if (showSeconds()) {\n <span class=\"wr-time-picker__sep\" aria-hidden=\"true\">{{ separator }}</span>\n\n <div class=\"wr-time-picker__col\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"incrementSecondsLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepSeconds(1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <input\n class=\"wr-time-picker__input\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.aria-label]=\"secondsLabel()\"\n [value]=\"secondsDisplay()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onSecondsInput($event)\"\n (blur)=\"onBlur()\"\n />\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"decrementSecondsLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"stepSeconds(-1)\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\n}\n\n@if (is12h()) {\n <div class=\"wr-time-picker__col wr-time-picker__col--ampm\">\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--up\"\n [attr.aria-label]=\"toggleAmPmLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"toggleAmPm()\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </button>\n <span class=\"wr-time-picker__label\" aria-live=\"polite\">{{ amPmLabel() }}</span>\n <button\n type=\"button\"\n class=\"wr-time-picker__step wr-time-picker__step--down\"\n [attr.aria-label]=\"toggleAmPmLabel()\"\n [disabled]=\"!interactive()\"\n (click)=\"toggleAmPm()\"\n >\n <svg\n class=\"wr-time-picker__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\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 { Component, ViewEncapsulation, computed, inject, input, output } from '@angular/core';\n\nimport { WrCalendar } from 'ngwr/calendar';\nimport { WrDateAdapter } from 'ngwr/date';\n\nimport { WrTimePanel } from './time-panel';\n\n/**\n * Internal panel that stacks a `<wr-calendar>` and a `<wr-time-picker>`,\n * combining their selections into a single `Date`. Owned by\n * `<wr-date-picker mode=\"datetime\">` — not part of the public API.\n *\n * @internal\n */\n@Component({\n selector: 'wr-date-time-panel',\n templateUrl: './date-time-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-date-time-panel' },\n imports: [WrCalendar, WrTimePanel],\n})\nexport class WrDateTimePanel {\n readonly value = input<Date | null>(null);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n readonly showSeconds = input(false);\n readonly step = input(1);\n\n /**\n * Forwarded to the calendar only: a datetime panel opened from the keyboard\n * lands on the day grid, never on the hours field. Picking the date first is\n * the order the panel is laid out in, and the time fields are one Tab away.\n */\n readonly autoFocus = input(false);\n\n readonly changed = output<Date>();\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n\n /** Date portion used by the calendar — falls back to today when value is null. */\n protected readonly calendarValue = computed(() => this.value() ?? this.adapter.today());\n\n /** Value passed to the time picker — falls back to today (00:00) when null. */\n protected readonly timeValue = computed(() => this.value() ?? this.adapter.today());\n\n protected onCalendarSelect(date: Date | null): void {\n if (!date) return;\n const base = this.value() ?? this.adapter.today();\n const combined = this.adapter.setTime(\n this.adapter.createDate(this.adapter.getYear(date), this.adapter.getMonth(date), this.adapter.getDate(date)),\n this.adapter.getHours(base),\n this.adapter.getMinutes(base),\n this.adapter.getSeconds(base)\n );\n this.changed.emit(combined);\n }\n\n protected onTimeChange(time: Date | null): void {\n if (!time) return;\n const base = this.value() ?? this.adapter.today();\n const combined = this.adapter.setTime(\n this.adapter.createDate(this.adapter.getYear(base), this.adapter.getMonth(base), this.adapter.getDate(base)),\n this.adapter.getHours(time),\n this.adapter.getMinutes(time),\n this.adapter.getSeconds(time)\n );\n this.changed.emit(combined);\n }\n}\n","<wr-calendar\n [date]=\"calendarValue()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [dateFilter]=\"dateFilter()\"\n [autoFocus]=\"autoFocus()\"\n (dateChange)=\"onCalendarSelect($event)\"\n/>\n\n<div class=\"wr-date-time-panel__time\">\n <wr-time-picker\n [value]=\"timeValue()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [step]=\"step()\"\n (valueChange)=\"onTimeChange($event)\"\n />\n</div>\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 {\n Injectable,\n type ModelSignal,\n type Provider,\n type Signal,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { transformedValue } from '@angular/forms/signals';\n\nimport { WrDateAdapter } from 'ngwr/date';\nimport { WR_FORM_FIELD, type WrFormFieldContext } from 'ngwr/form';\nimport { useI18nFormatter } from 'ngwr/i18n';\n\nimport type { WrDateInputError } from '../interfaces';\n\n/** Per-picker live-region ids — see {@link WrDateInputField.statusId}. */\nlet statusUid = 0;\n\n/** The constraints a typed date is held to — the same three the calendar disables days by. */\nexport interface WrDateInputBounds {\n readonly min: Date | null | undefined;\n readonly max: Date | null | undefined;\n readonly filter: ((date: Date) => boolean) | null;\n}\n\n/** Builds each kind of {@link WrDateInputError}, with its sentence already resolved. */\nexport interface WrDateInputRefusals {\n /** The text does not read as a date in `format`. */\n unreadable(format: string): WrDateInputError;\n /** Why `date` would be refused by `bounds`, or `null` when it would not be. */\n outOfBounds(date: Date, bounds: WrDateInputBounds): WrDateInputError | null;\n}\n\n/**\n * The refusals both pickers raise, from one place — the calendar, the single\n * picker and the range picker have to agree on what \"refused\" means, and the\n * message has to be the one `<wr-form-field>` would show for the same key.\n *\n * Must be called from an injection context.\n *\n * @internal\n */\nexport function useDateInputRefusals(): WrDateInputRefusals {\n const adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n // The same keys and the same English as `WR_FORM_ERROR_FALLBACKS`: the message a\n // picker announces on its own and the one a surrounding field renders are one\n // sentence, whichever of the two ends up saying it.\n const formatText = useI18nFormatter('validation.dateFormat', 'Expected format: {{example}}');\n const minText = useI18nFormatter('validation.minDate', 'Choose a later date.');\n const maxText = useI18nFormatter('validation.maxDate', 'Choose an earlier date.');\n const filterText = useI18nFormatter('validation.dateFilter', 'This date is not available.');\n\n return {\n unreadable(format) {\n // The 31st of December, at 18:45: a day past 12 cannot be mistaken for a month,\n // so the example shows the ORDER of the fields as well as their separators —\n // which is the whole question for someone typing `07.09.1994` into a field\n // that reads `9/7/1994`. The year is the current one so it never looks stale.\n const reference = adapter.setTime(adapter.createDate(adapter.getYear(adapter.today()), 11, 31), 18, 45, 0);\n const example = adapter.format(reference, format);\n return { kind: 'dateFormat', example, message: formatText({ example }) };\n },\n outOfBounds(date, { min, max, filter }) {\n if (min && adapter.compareDate(date, min) < 0) return { kind: 'minDate', date, min, message: minText() };\n if (max && adapter.compareDate(date, max) > 0) return { kind: 'maxDate', date, max, message: maxText() };\n if (filter && !filter(date)) return { kind: 'dateFilter', date, message: filterText() };\n return null;\n },\n };\n}\n\n/**\n * Hands the picker's refusals to the form it is bound to, so a refused entry makes\n * the FORM invalid rather than only the field's border.\n *\n * Angular's `transformedValue` is the public way a custom control reports parse\n * errors: bound with `[formField]` they join the field's errors, and bound with\n * `[formControl]`, `formControlName` or `[(ngModel)]` they become a validator on\n * the control. It is used here for that channel ONLY. The picker keeps its own text\n * model — the echo guard, and the range picker's per-end ordering, are older and\n * pinned — so `parse` never returns a `value`, which Angular documents as leaving the\n * model untouched.\n *\n * The returned function reports the picker's WHOLE current list, every time. The form\n * hears it from the keystroke — the picker's own wait for Enter or blur is about what\n * it shows, and a form whose validity lagged the text in its field could submit the old\n * value under text nobody meant.\n *\n * Angular's copy does not simply hold what was reported. It is a `linkedSignal` over the\n * model, so ANY model write clears it, and a form reset clears it without a model write\n * at all:\n *\n * - a write of the picker's own is followed by a report of its own, synchronously — the\n * range picker committing one end while the other still holds refused text is the\n * case that needs it;\n * - a write from outside replaces the text a refusal was about, and the picker reports\n * its emptied list;\n * - what is left is a reset (`FormControl.reset()`, a Signal Forms field's `reset()`):\n * the raw signal moved while the model did not. Angular has thrown the error away, and\n * `onReset` is where the picker throws away the text it was about.\n *\n * Unbound, nothing resets it and it costs a signal and an effect.\n *\n * Must be called from an injection context.\n *\n * @internal\n */\nexport function useFormParseErrors<T>(\n value: ModelSignal<T>,\n onReset: () => void\n): (errors: readonly WrDateInputError[]) => void {\n const channel = transformedValue<T, readonly WrDateInputError[]>(value, {\n parse: errors => ({ error: errors.length ? errors : undefined }),\n format: () => [],\n });\n\n /** What the raw signal held after the last report, and the model it was reported against. */\n let held: readonly WrDateInputError[] = untracked(channel);\n let against: T = untracked(value);\n\n const report = (errors: readonly WrDateInputError[]): void => {\n channel.set(errors);\n held = untracked(channel);\n against = untracked(value);\n };\n\n effect(() => {\n const now = channel();\n untracked(() => {\n if (now === held) return;\n held = now;\n if (Object.is(value(), against)) onReset();\n against = value();\n });\n });\n\n return report;\n}\n\n/**\n * What a picker's own text input sees as its `<wr-form-field>`: the real field, with\n * the refusal on show added to it. Provided per picker, and handed to the input\n * through `viewProviders`.\n *\n * `wrInput` writes `aria-invalid` and `aria-describedby` from the field it injects, and\n * a second binding on either attribute leaves it holding whichever wrote last — so\n * the picker cannot bind them beside `wrInput` while a field is there. It stands\n * between the two instead. The input then reads ONE state: invalid when the field\n * has an error OR the picker is showing a refusal, and described by the field's\n * message together with the picker's own reason while the field is not yet saying it.\n *\n * \"Not yet\" is ordinary rather than rare. A refusal reaches a bound form as a parse\n * error, and `<wr-form-field>` shows an error only once its control is touched or\n * dirty; a reactive `FormControl` learns of it through `updateValueAndValidity` with\n * `emitEvent: false`, which the field does not hear until the control's next event.\n * Until the field says it, the picker does — so the refusal is never silent,\n * whichever of the two ends up announcing it.\n *\n * With no field around the picker, there is nothing to stand between and `context` is\n * `null`: the input's `wrInput` then writes neither attribute, and the picker binds\n * them itself.\n *\n * @internal\n */\n@Injectable()\nexport class WrDateInputField {\n /** The surrounding `<wr-form-field>` — skipping the picker's own node, whose view it is providing for. */\n readonly outer = inject(WR_FORM_FIELD, { optional: true, skipSelf: true });\n\n /** Id of the picker's live region, which doubles as the reason `aria-describedby` points at. */\n readonly statusId = `wr-date-picker-status-${++statusUid}`;\n\n private readonly source = signal<Signal<WrDateInputError | null> | null>(null);\n\n /** The refusal on show for the input the field describes — the only input, or a range's start. */\n readonly described = computed(() => this.source()?.() ?? null);\n\n /**\n * Hand over the signal holding that refusal. Called from the picker's constructor:\n * this service is built before the component it serves, so it cannot read the\n * component's state at its own construction.\n */\n describe(source: Signal<WrDateInputError | null>): void {\n this.source.set(source);\n }\n\n /** Whether the field is already rendering a message for this kind of error. */\n saysAlready(error: WrDateInputError): boolean {\n return this.outer?.errorKeys().includes(error.kind) ?? false;\n }\n\n readonly context: WrFormFieldContext | null = this.outer ? this.wrap(this.outer) : null;\n\n private wrap(outer: WrFormFieldContext): WrFormFieldContext {\n return {\n controlId: outer.controlId,\n adoptControlId: id => outer.adoptControlId(id),\n labelId: outer.labelId,\n hintId: outer.hintId,\n errorKeys: computed(() => {\n const keys = outer.errorKeys();\n const own = this.described();\n return own && !keys.includes(own.kind) ? [...keys, own.kind] : keys;\n }),\n describedBy: computed(() => {\n const own = this.described();\n const ids = [outer.describedBy(), own && !this.saysAlready(own) ? this.statusId : null].filter(Boolean);\n return ids.length ? ids.join(' ') : null;\n }),\n };\n }\n}\n\n/**\n * The view half of {@link WrDateInputField}: what the picker's own template sees as\n * its field. A VIEW provider, so it reaches the text inputs the picker renders and\n * never content projected into it; the host half is `WrDateInputField` itself, in\n * the component's `providers`.\n *\n * @internal\n */\nexport const WR_DATE_INPUT_FIELD_VIEW_PROVIDER: Provider = {\n provide: WR_FORM_FIELD,\n useFactory: () => inject(WrDateInputField).context,\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 { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n type ComponentRef,\n DestroyRef,\n ElementRef,\n Injector,\n type Signal,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { WrCalendar } from 'ngwr/calendar';\nimport { WrDateAdapter, type WrDateFormat } from 'ngwr/date';\nimport { readI18nText, useI18nText } from 'ngwr/i18n';\nimport { WrInput, WrInputGroup, WrInputSuffix } from 'ngwr/input';\nimport { WR_OVERLAY, WrOutsideClick, wrFollowDirection } from 'ngwr/overlay';\n\nimport type { WrDateInputError } from './interfaces';\nimport { WrDateTimePanel } from './internal/date-time-panel';\nimport {\n WR_DATE_INPUT_FIELD_VIEW_PROVIDER,\n WrDateInputField,\n useDateInputRefusals,\n useFormParseErrors,\n} from './internal/input-refusal';\nimport { WrTimePanel } from './internal/time-panel';\n\nlet panelUid = 0;\n\n/** How long a live region stays blank before a repeated refusal is written back. */\nconst SILENCE_MS = 100;\n\n/**\n * Unified date / time / date-time picker. Same `<input>` + popover skeleton\n * for every mode — the overlay content swaps based on `[mode]`:\n *\n * - `'date'` (default) — popover renders a calendar. Picking a date closes\n * the overlay.\n * - `'time'` — popover renders an `HH:MM[:SS]` stepper with optional AM/PM.\n * Stays open while editing; close with outside-click or Escape.\n * - `'datetime'` — popover stacks calendar + time stepper. Picking a date\n * does NOT close (the user typically wants to set the time next).\n *\n * A signal-forms native control: it implements `FormValueControl<Date | null>`,\n * so `[formField]` binds straight to its `value` model — no\n * `ControlValueAccessor` in between. `[(value)]` works standalone, and classic\n * `[(ngModel)]` / reactive forms keep working through Angular's bridge. Value\n * type is `Date | null` for every mode.\n *\n * Parses the input on every keystroke and emits only a date it can read and the\n * calendar would accept. Anything else is REFUSED, never guessed: the bound value\n * stays where it was, and the text stays in the field so it can be corrected.\n * Enter and leaving the field turn a refusal visible — see {@link inputError}.\n * A committed date is re-formatted canonical on blur and on Enter. Format is\n * driven by {@link WrDateAdapter}: it\n * accepts both named keys (`'shortDate'`, `'mediumDateTime'`, …) and raw\n * token strings (`'dd.MM.yyyy'`, `'HH:mm'`). When `format` is left at the\n * default (`null`), the picker derives the right named key from `mode`:\n * `'date'` gives `'shortDate'`, `'time'` gives `'time'`, `'datetime'` gives\n * `'shortDateTime'`.\n *\n * @example\n * ```html\n * <!-- signal forms -->\n * <wr-date-picker [formField]=\"form.picked\" format=\"dd.MM.yyyy\" [min]=\"minDate\" />\n *\n * <!-- standalone two-way binding, date only -->\n * <wr-date-picker [(value)]=\"picked\" format=\"dd.MM.yyyy\" [min]=\"minDate\" />\n *\n * <!-- Time only -->\n * <wr-date-picker mode=\"time\" [(value)]=\"picked\" timeFormat=\"24h\" />\n *\n * <!-- Date + time -->\n * <wr-date-picker mode=\"datetime\" [(value)]=\"when\" [showSeconds]=\"true\" [step]=\"5\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/date-picker\n */\n@Component({\n selector: 'wr-date-picker',\n templateUrl: './date-picker.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrInput, WrInputGroup, WrInputSuffix],\n providers: [WrDateInputField],\n viewProviders: [WR_DATE_INPUT_FIELD_VIEW_PROVIDER],\n})\nexport class WrDatePicker implements FormValueControl<Date | null> {\n /** Picker behavior — see class doc. @default 'date' */\n readonly mode = input<'date' | 'time' | 'datetime'>('date');\n\n /**\n * Format used for both display and parsing. When `null` (default), the\n * format is derived from `mode` (`shortDate` / `time` / `shortDateTime`).\n * Pass a named key or raw token string to override.\n */\n readonly format = input<WrDateFormat | (string & {}) | null>(null);\n\n /** Placeholder shown when the input is empty. */\n readonly placeholder = input<string>('');\n\n // Typed `Date | undefined` (not `Date | null`) to satisfy the reserved\n // `FormUiControl` min/max slots, which are keyed to the control's value type\n // and want `Date | undefined`. Both null and undefined stay falsy, so the\n // internal bounds checks below are unaffected.\n /** Min selectable date (forwarded to the calendar). Ignored in `time` mode. */\n readonly min = input<Date | undefined>(undefined);\n\n /** Max selectable date (forwarded to the calendar). Ignored in `time` mode. */\n readonly max = input<Date | undefined>(undefined);\n\n /** Predicate to disable specific dates (forwarded to the calendar). Ignored in `time` mode. */\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n\n /** Time-panel 12 / 24-hour format. Applies in `time` + `datetime` modes. @default 'auto' */\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n\n /** Render the seconds column. Applies in `time` + `datetime` modes. @default false */\n readonly showSeconds = input(false, { transform: coerceBooleanProperty });\n\n /** Minute / second step for the time panel. @default 1 */\n readonly step = input(1, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 1)) });\n\n /**\n * Disable interaction. Bound automatically from the field's disabled state\n * when used with `[formField]`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Read-only — input not typeable, but the trigger icon still opens the overlay. @default false */\n readonly readonly = input(false, { transform: coerceBooleanProperty });\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n /**\n * Ambient reading direction, for the open panel alone — nothing in this\n * component reads it directly. Optional so a bare `TestBed` needs no\n * provider; `Directionality` is root-provided anyway, and a missing one\n * simply reads as `ltr`.\n */\n private readonly dir = inject(Directionality, { optional: true });\n protected readonly inputEl = viewChild.required<ElementRef<HTMLInputElement>>('input');\n protected readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n /** The picked Date. Bound by `[formField]`, or two-way via `[(value)]`. */\n readonly value = model<Date | null>(null);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n /** Text currently in the input (may be partial / invalid mid-type). */\n protected readonly text = signal<string>('');\n\n /** Whether the popover is currently open. */\n protected readonly overlayOpen = signal(false);\n\n /**\n * Where focus came from, captured as an explicit argument at open time —\n * never read off `document.activeElement`, which by then may already be the\n * pane. Every close path that took focus INTO the panel hands it back here.\n */\n private openedFrom: HTMLElement | null = null;\n\n /** Whether the panel this open cycle should take focus. */\n private autoFocusPanel = false;\n\n /** Resolved format — falls back to a mode-appropriate default. */\n protected readonly resolvedFormat = computed<string>(() => {\n const explicit = this.format();\n if (explicit) return explicit;\n const m = this.mode();\n if (m === 'datetime') return 'shortDateTime';\n // `time`, not `shortTime` — the latter is not a member of WrDateFormat, so\n // adapters fell through to treating it as a raw token pattern. date-fns then\n // threw on the unescaped letters; the native adapter degraded silently.\n if (m === 'time') return 'time';\n return 'shortDate';\n });\n\n protected readonly isTime = computed(() => this.mode() === 'time');\n protected readonly isDateTime = computed(() => this.mode() === 'datetime');\n\n // Signals, not plain strings: these used to be read once at injection time,\n // which is before any loader-backed catalog exists — so the trigger announced\n // \"Open calendar\" while `fieldLabel` below, off the SAME key, announced the\n // Russian one. A runtime `i18n.use()` moved the field's name and not the\n // trigger's, which made the split permanent rather than a startup race.\n private readonly labelDate = readI18nText('datePicker.open', 'Open calendar');\n private readonly labelTime = readI18nText('datePicker.openTime', 'Open time picker');\n private readonly labelDateTime = readI18nText('datePicker.openDateTime', 'Open date and time picker');\n\n private readonly panelLabelDate = readI18nText('datePicker.panel', 'Choose date');\n private readonly panelLabelTime = readI18nText('datePicker.panelTime', 'Choose time');\n private readonly panelLabelDateTime = readI18nText('datePicker.panelDateTime', 'Choose date and time');\n\n /**\n * Accessible name of the text field. Falls back to the placeholder, then to\n * the same catalog string the calendar button uses — the field is a\n * `role=\"combobox\"`, and with an empty placeholder it had no name at all.\n */\n readonly ariaLabel = input<string | null>(null);\n\n private readonly fieldLabel = useI18nText(this.ariaLabel, 'datePicker.open', 'Open calendar');\n protected readonly resolvedAriaLabel = computed(() => {\n // Not `??`: an empty placeholder must fall through to the catalog string.\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const placeholder = this.placeholder();\n return placeholder ? placeholder : this.fieldLabel();\n });\n\n protected readonly triggerLabel = computed(() => {\n const m = this.mode();\n if (m === 'time') return this.labelTime();\n if (m === 'datetime') return this.labelDateTime();\n return this.labelDate();\n });\n\n /**\n * Accessible name of the popup. The trigger advertises\n * `aria-haspopup=\"dialog\"`, so the panel is a `role=\"dialog\"` — and an unnamed\n * dialog announces as a bare \"dialog\". Defaults to the catalog's\n * `datePicker.panel*` string for the current `mode`.\n */\n readonly panelAriaLabel = input<string | null>(null);\n\n /** Popup id — what the trigger's `aria-controls` points at while open. */\n protected readonly panelId = `wr-date-picker-panel-${++panelUid}`;\n\n protected readonly resolvedPanelLabel = computed(() => {\n const explicit = this.panelAriaLabel();\n if (explicit) return explicit;\n const m = this.mode();\n if (m === 'time') return this.panelLabelTime();\n if (m === 'datetime') return this.panelLabelDateTime();\n return this.panelLabelDate();\n });\n\n private readonly refusals = useDateInputRefusals();\n private readonly reportToForm = useFormParseErrors(this.value, () => this.onFormReset());\n private readonly inputField = inject(WrDateInputField);\n\n /**\n * Why the text in the field was not committed — `null` while the text is the value.\n * Raised on the keystroke that makes the text unusable, and reported to a bound form\n * from that keystroke on.\n */\n private readonly refusal = signal<WrDateInputError | null>(null);\n\n /**\n * Whether the refusal is on show. A refusal is raised on the keystroke but shown\n * only once the user has finished — on Enter, or on leaving the field — because\n * every date is unreadable for most of the time it takes to type one, and a field\n * that turned red on the first digit would be telling the user off for typing.\n * Once shown it follows the text live, so a correction clears it immediately.\n *\n * Leaving counts wherever focus goes, including by way of the open panel: moving\n * into the panel waits, since a pick there replaces the text, but focus that leaves\n * the panel for anything other than the field — or a panel that closes without a\n * pick and without handing focus back to the field — has left too.\n */\n private readonly revealed = signal(false);\n\n /**\n * Why the text in the field is not the bound value, once the picker is showing it —\n * `null` while the text is the value, and `null` while the user is still typing.\n *\n * A refusal is raised on the keystroke that makes the text unreadable (`dateFormat`),\n * out of `min` / `max` (`minDate` / `maxDate`) or rejected by `dateFilter`, and goes\n * on show on Enter or when the user leaves the field — the same moment the border\n * turns and the reason is announced, so a message rendered from this signal never\n * disagrees with them. Once on show it follows the text, and it clears the moment the\n * text becomes a date the picker commits, is emptied, or is replaced by a pick from\n * the panel, a value written from outside, or a form reset. The value itself is never\n * touched by a refusal.\n *\n * A bound form does NOT wait: `[formField]`, `[formControl]`, `formControlName` and\n * `[(ngModel)]` see the refusal as a parse error from the keystroke, so the form is\n * invalid the whole time the field holds text it could not use, and\n * `<wr-form-field>` shows `message` by its own rule — once the control is touched or\n * dirty. Read this through a template reference when the picker is bound with\n * `[(value)]` alone and the reason should be on screen.\n *\n * @example\n * ```html\n * <wr-date-picker #due [(value)]=\"due\" format=\"dd.MM.yyyy\" />\n * @if (due.inputError(); as error) {\n * <small>{{ error.message }}</small>\n * }\n * ```\n */\n readonly inputError: Signal<WrDateInputError | null> = computed(() => (this.revealed() ? this.refusal() : null));\n\n /**\n * Blanked briefly so Enter on an unchanged refusal is announced again. A live region\n * does not repeat text it already holds, and blanking it for one render is not\n * enough: both changes land in the same task, and the accessibility tree sees\n * only the end state. The gap is a timer for that reason — the CDK's\n * `LiveAnnouncer` clears its region the same way.\n */\n private readonly silenced = signal(false);\n private silenceTimer: ReturnType<typeof setTimeout> | undefined;\n\n protected readonly statusId = this.inputField.statusId;\n\n /**\n * What the picker's own live region says: the refusal on show, unless a surrounding\n * `<wr-form-field>` is already rendering a message for it — that message is a\n * `role=\"alert\"`, and a second voice would repeat it.\n */\n protected readonly announcement = computed(() => {\n const shown = this.inputError();\n if (!shown || this.silenced() || this.inputField.saysAlready(shown)) return '';\n return shown.message;\n });\n\n /**\n * `aria-invalid` and `aria-describedby` for the text input, bound only with NO\n * field around the picker. Inside one, `wrInput` writes both from the field — see\n * `WrDateInputField` for why the picker feeds them through it rather than binding\n * a second writer beside it.\n */\n protected readonly ownAriaInvalid = computed<'true' | null>(() =>\n !this.inputField.outer && this.inputError() ? 'true' : null\n );\n protected readonly ownDescribedBy = computed(() =>\n !this.inputField.outer && this.announcement() ? this.statusId : null\n );\n\n protected readonly classes = computed(() => {\n const parts = ['wr-date-picker', `wr-date-picker--${this.mode()}`];\n if (this.disabled()) parts.push('wr-date-picker--disabled');\n if (this.inputError()) parts.push('wr-date-picker--invalid');\n return parts.join(' ');\n });\n\n private overlayRef: OverlayRef | null = null;\n\n /** Live calendar ref while the date popover is open — lets the panel track\n * the typed value in real time (not just on reopen). */\n private readonly dateRef = signal<ComponentRef<WrCalendar> | null>(null);\n private readonly timeRef = signal<ComponentRef<WrTimePanel> | null>(null);\n private readonly dateTimeRef = signal<ComponentRef<WrDateTimePanel> | null>(null);\n\n /** The last value an open panel handed us, so the live push never echoes it back. */\n private lastFromPanel: Date | null = null;\n\n /** Last value we pushed into the model ourselves — lets the sync effect\n * skip the echo of our own edits (so a live keystroke's raw text is never\n * reformatted mid-type). */\n private lastValue: Date | null = null;\n\n /** The format the sync effect last rendered with. Paired with `lastValue`\n * because the echo guard has to answer \"is the display still current\", and a\n * `[format]` / `[mode]` change makes it stale with the value untouched. */\n private lastFormat: string | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.dispose();\n clearTimeout(this.silenceTimer);\n });\n\n // Mirror external writes to `value` (from `[formField]`, `[(value)]`, or a\n // classic-forms bridge) into the display text — this is the old\n // `writeValue` body. The echo of our own edits is skipped, and a\n // null/undefined write is tolerated (it clears the text, exactly as the old\n // `writeValue(Date | null)` did).\n //\n // The FORMAT is read outside `untracked()` on purpose. It used to be read\n // inside, so the effect depended on `value()` alone and a `[format]` or\n // `[mode]` change left the old rendering on screen — while `onInput` /\n // `onBlur` had already switched to parsing against the NEW format, so an\n // edit to the stale text failed to parse and was silently discarded on\n // blur. Folding the format into the echo guard keeps the mid-type\n // protection (a keystroke changes the value, never the format) and still\n // re-renders when the format itself moves.\n effect(() => {\n const v = this.value();\n const fmt = this.resolvedFormat();\n untracked(() => {\n // Our own commits hand `value` the very object `commitValue` remembered, so a\n // DIFFERENT object holding the same date came from outside — a reset to a fresh\n // copy of the day, say. That is no reason to re-render text the user is\n // typing, but it does replace text the picker refused.\n const outside = v !== this.lastValue;\n const echo = this.sameDate(v, this.lastValue) && fmt === this.lastFormat;\n this.lastValue = v;\n this.lastFormat = fmt;\n if (echo && !(outside && this.refusal())) return;\n this.text.set(v && this.adapter.isValid(v) ? this.adapter.format(v, fmt) : '');\n // The text the refusal was about is gone — replaced by a value written from\n // outside, or re-rendered in a new format.\n this.refuse(null);\n });\n });\n\n // A panel that is up when `disabled` arrives has to go. `readonly` is\n // deliberately NOT here — this component's contract is that the calendar\n // stays browsable while read-only, and only the write is refused (see\n // `commitValue`). `disabled` is the other flag and means the opposite:\n // `toggleOverlay` and `openOnInput` both refuse to open under it, so a\n // popup left standing is a way in that the component says it does not have.\n effect(() => {\n if (!this.disabled()) return;\n untracked(() => {\n if (this.overlayRef) this.closeOverlay();\n });\n });\n\n // The input's field (see `WrDateInputField`) marks it invalid for the refusal on show.\n this.inputField.describe(this.inputError);\n\n // While the calendar popover is open, push every valid typed value into it\n // so the displayed month follows the input live (the calendar snaps its\n // own viewDate to the bound `date`).\n effect(() => {\n const ref = this.dateRef();\n if (ref) ref.setInput('date', this.value());\n });\n\n // …and the constraints with it. Pushing these only at attach time meant a\n // `[min]` (or `[max]`, or the filter) that changed while the popover was open\n // kept the stale constraint until the next reopen — `wr-date-range-picker`\n // carries the same effect under a comment saying exactly that.\n effect(() => {\n const ref = this.dateRef();\n if (!ref) return;\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n });\n\n effect(() => {\n const ref = this.timeRef();\n if (!ref) return;\n ref.setInput('format', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n });\n\n // The datetime panel had no live sync at all: a date typed into the field\n // while it was open never reached it, so the next stepper click emitted the\n // panel's own stale value and silently undid the typing.\n effect(() => {\n const ref = this.dateTimeRef();\n if (!ref) return;\n const value = this.value();\n if (value !== this.lastFromPanel) ref.setInput('value', value);\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('timeFormat', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n });\n }\n\n // Template handlers\n\n protected onInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n this.text.set(raw);\n if (!raw) {\n this.commitValue(null);\n this.refuse(null);\n return;\n }\n const parsed = this.adapter.parse(raw, this.resolvedFormat());\n if (!parsed || !this.adapter.isValid(parsed)) {\n this.refuse(this.refusals.unreadable(this.resolvedFormat()));\n return;\n }\n const outOfBounds = this.outOfBounds(parsed);\n if (outOfBounds) {\n this.refuse(outOfBounds);\n return;\n }\n this.commitValue(this.withKeptDate(parsed));\n this.refuse(null);\n }\n\n /**\n * In `time` mode the typed string carries no date, so the adapter fills one in — and\n * the date already in the model is the better answer than whatever default it picks.\n * The time PANEL has always worked this way (it keeps a `basis` date across edits);\n * the text field silently moved the value to another day.\n */\n private withKeptDate(parsed: Date): Date {\n if (this.mode() !== 'time') return parsed;\n const current = this.value();\n if (!current || !this.adapter.isValid(current)) return parsed;\n return this.adapter.setTime(\n current,\n this.adapter.getHours(parsed),\n this.adapter.getMinutes(parsed),\n this.adapter.getSeconds(parsed)\n );\n }\n\n protected onBlur(event: FocusEvent): void {\n this.touch.emit();\n\n // A refused entry STAYS. Blur used to overwrite it with the last committed date,\n // which is how a refusal became invisible: `07.09.1994` typed into a field bounded\n // to 2026 simply turned back into the old date the moment the user moved on, with\n // nothing to say it had been refused or why. The text is what they have to\n // correct, and the value underneath was never changed. Focus moving INTO the open\n // panel is not leaving — a day click there is about to replace the text anyway;\n // `onPaneFocusOut` and `closeOverlay` decide when that visit ends.\n if (this.refusal()) {\n const next = event.relatedTarget as Node | null;\n if (!next || !this.overlayRef?.overlayElement.contains(next)) this.reveal();\n return;\n }\n\n // Reformat to canonical on blur (cleans up `1/5/25` → `1/5/2025`).\n this.settleText();\n }\n\n /**\n * Enter is \"this is the date\". A date the picker committed is re-formatted\n * canonical and the panel closes; text it refused turns invalid on the spot —\n * border, `aria-invalid`, the reason announced — and emits `touch`, which is what\n * makes a surrounding `<wr-form-field>` show its message. The panel closes in both\n * cases: it opens directly below the field, which is exactly where that message\n * renders.\n *\n * Never `preventDefault`: Enter inside a `<form>` still submits it, and a form\n * bound to this picker is invalid while the refusal stands.\n */\n private onEnter(): void {\n // Read before closing: a close can put the refusal on show itself.\n const wasShown = this.revealed();\n if (this.overlayRef) this.closeOverlay();\n const refusal = this.refusal();\n if (!refusal) {\n this.settleText();\n return;\n }\n this.touch.emit();\n if (wasShown) {\n // Already on show, so the live region already holds this sentence — and a live\n // region does not repeat text it already has. Blank it briefly so a second\n // Enter is answered rather than met with silence.\n this.silenced.set(true);\n clearTimeout(this.silenceTimer);\n this.silenceTimer = setTimeout(() => this.silenced.set(false), SILENCE_MS);\n }\n this.revealed.set(true);\n }\n\n /** Show the committed value canonically, or commit an emptied field as `null`. */\n private settleText(): void {\n const v = this.value();\n if (v && this.adapter.isValid(v)) {\n this.text.set(this.adapter.format(v, this.resolvedFormat()));\n } else if (!this.text()) {\n this.commitValue(null);\n }\n }\n\n /**\n * Record why the current text was not committed, or that it was. Clearing a\n * refusal also takes it off show, so the next one waits for Enter or blur again.\n */\n private refuse(next: WrDateInputError | null): void {\n this.refusal.set(next);\n if (!next) this.revealed.set(false);\n this.reportToForm(next ? [next] : []);\n }\n\n /** Put a standing refusal on show — the user has left the field. */\n private reveal(): void {\n if (this.refusal()) this.revealed.set(true);\n }\n\n /**\n * The bound form was reset while the model stayed where it was — Angular has thrown\n * the parse error away, so the text it was about goes too, and the field shows the\n * value again. (A reset that MOVES the model reaches the text through the sync\n * effect instead, like any other outside write.)\n */\n private onFormReset(): void {\n if (!this.refusal()) return;\n const v = this.value();\n this.text.set(v && this.adapter.isValid(v) ? this.adapter.format(v, this.resolvedFormat()) : '');\n this.refuse(null);\n }\n\n /**\n * Focus leaving the open panel. Moving within it, or back to the text field, is\n * still the same visit; anywhere else — the page, the trigger, the next control — is\n * leaving, so a refusal that waited while focus went into the panel shows now.\n */\n private readonly onPaneFocusOut = (event: FocusEvent): void => {\n const next = event.relatedTarget as Node | null;\n if (next && (this.overlayRef?.overlayElement.contains(next) || next === this.inputEl().nativeElement)) return;\n this.reveal();\n };\n\n /** Called by the input's click — opens the overlay if it isn't open already. */\n protected openOnInput(): void {\n if (this.disabled() || this.overlayRef) return;\n // Deliberately WITHOUT focus: this click placed a caret in the text field,\n // and yanking focus into the grid would throw away what the user just did.\n // `Alt+ArrowDown` / `ArrowDown` are the keyboard way in — see onFieldKey.\n this.openOverlay(this.inputEl().nativeElement, false);\n }\n\n protected toggleOverlay(): void {\n if (this.disabled()) return;\n if (this.overlayRef) {\n // Focus is already on the trigger — nothing to restore.\n this.closeOverlay();\n } else {\n this.openOverlay(this.triggerEl()?.nativeElement ?? null, true);\n }\n }\n\n /**\n * The keyboard route into the panel, per the APG date-picker pattern.\n *\n * `Alt+ArrowDown` opens and takes focus; a bare arrow moves focus in when the\n * panel is ALREADY open, which is how someone who opened it by clicking the\n * field gets to the grid. Every other key — characters, Backspace, the\n * horizontal arrows, Home / End — is left to the field untouched, so typing a\n * date keeps working exactly as before.\n */\n protected onFieldKey(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n if (event.key === 'Enter') {\n this.onEnter();\n return;\n }\n\n const vertical = event.key === 'ArrowDown' || event.key === 'ArrowUp';\n if (!vertical) return;\n\n if (event.altKey && event.key === 'ArrowDown' && !this.overlayRef) {\n event.preventDefault();\n this.openOverlay(this.inputEl().nativeElement, true);\n return;\n }\n\n if (this.overlayRef) {\n event.preventDefault();\n this.focusPanel();\n }\n }\n\n /**\n * Move focus into an already-mounted panel. A plain query is right HERE and\n * wrong at mount time: the panel has settled, so there is no deferral to get\n * wrong — and it keeps `autoFocus` as the single piece of panel API.\n */\n private focusPanel(): void {\n const pane = this.overlayRef?.overlayElement;\n const target =\n pane?.querySelector<HTMLElement>('.wr-calendar__day--focused:not([disabled])') ??\n pane?.querySelector<HTMLElement>('.wr-time-picker__input');\n target?.focus();\n }\n\n /** Hand focus back to whatever opened the panel, if it is still on the page. */\n private restoreFocus(): void {\n const target = this.openedFrom?.isConnected ? this.openedFrom : this.inputEl().nativeElement;\n target?.focus();\n }\n\n // Overlay\n\n private openOverlay(openedFrom: HTMLElement | null = null, autoFocus = false): void {\n if (this.overlayRef) return;\n this.openedFrom = openedFrom;\n this.autoFocusPanel = autoFocus;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n panelClass: 'wr-date-picker-overlay',\n });\n\n // Two of the four fallbacks anchor on `end`, and the CDK resolves start /\n // end against the direction it captured when this ref was created. The\n // `wr-calendar` inside the pane reads `Directionality` live, so a flip\n // while the panel was open split the grid's key handling from the box it\n // was drawn in — the same split the docs site's own switch shows off.\n wrFollowDirection(this.overlayRef, this.dir, this.injector);\n\n // The trigger promises `aria-haspopup=\"dialog\"`; the pane is the element it\n // points at, so the role, the name and the id all belong here. Non-modal on\n // purpose — focus is not trapped, and the panel closes on outside click or\n // Escape.\n const pane = this.overlayRef.overlayElement;\n pane.id = this.panelId;\n pane.setAttribute('role', 'dialog');\n pane.setAttribute('aria-modal', 'false');\n pane.setAttribute('aria-label', this.resolvedPanelLabel());\n pane.addEventListener('focusout', this.onPaneFocusOut);\n\n this.overlayOpen.set(true);\n\n // Dispatch by mode — pick the panel + wire its emissions.\n const m = this.mode();\n if (m === 'time') this.attachTime();\n else if (m === 'datetime') this.attachDateTime();\n else this.attachDate();\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.closeOverlay();\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n // Focus is `closeOverlay()`'s business and nobody else's. Escape\n // reaches this overlay from anywhere in the document (the CDK\n // dispatches it to the topmost one), and `openOnInput` deliberately\n // leaves the caret in the field — so the user can Tab on with the\n // panel still open. Forcing the field back into focus here overrode\n // the guarded restore and dragged the caret backwards out of whatever\n // they had moved on to. Same rule as `wr-date-range-picker`.\n this.closeOverlay();\n }\n });\n }\n\n private attachDate(): void {\n if (!this.overlayRef) return;\n const ref = this.overlayRef.attach(new ComponentPortal(WrCalendar));\n ref.setInput('date', this.value());\n this.dateRef.set(ref);\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('autoFocus', this.autoFocusPanel);\n ref.instance.date.subscribe(next => {\n if (!next) return;\n this.commit(next);\n this.closeOverlay();\n });\n }\n\n private attachTime(): void {\n if (!this.overlayRef) return;\n const ref = this.overlayRef.attach(new ComponentPortal(WrTimePanel));\n ref.setInput('format', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n ref.setInput('autoFocus', this.autoFocusPanel);\n ref.setInput('value', this.value() ?? this.adapter.today());\n this.timeRef.set(ref);\n ref.instance.value.subscribe((next: Date | null) => {\n if (!next) return;\n this.lastFromPanel = next;\n this.commit(next);\n });\n }\n\n private attachDateTime(): void {\n if (!this.overlayRef) return;\n const ref = this.overlayRef.attach(new ComponentPortal(WrDateTimePanel));\n ref.setInput('value', this.value());\n ref.setInput('min', this.min());\n ref.setInput('max', this.max());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('timeFormat', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n ref.setInput('autoFocus', this.autoFocusPanel);\n this.dateTimeRef.set(ref);\n ref.instance.changed.subscribe(next => {\n this.lastFromPanel = next;\n this.commit(next);\n ref.setInput('value', next);\n });\n }\n\n private commit(next: Date): void {\n this.text.set(this.adapter.format(next, this.resolvedFormat()));\n this.commitValue(next);\n this.refuse(null);\n }\n\n /** Push a value to the model while remembering it, so the sync effect treats\n * the resulting change as an echo and leaves the display text alone. */\n private commitValue(next: Date | null): void {\n // The calendar is browsable while `readonly` — the field is untypeable, not\n // inert, which is a contract this component's spec pins deliberately. That\n // makes the popup a SECOND way into the model, and it was unguarded: a\n // `readonly()` schema rule left a day click writing exactly as if the rule\n // were absent. Guarding at the single write point rather than at the three\n // ways in keeps the calendar readable and still refuses the edit.\n //\n // `disabled` belongs here for the same reason and was missing: the ways IN\n // all check it, and a panel already up checks nothing again. A picker\n // disabled mid-session — `[disabled]=\"saving()\"`, a schema rule — took a\n // day click and moved its value, which is the one thing a disabled control\n // must never do.\n if (this.readonly() || this.disabled()) return;\n this.lastValue = next;\n this.value.set(next);\n }\n\n /**\n * Focus goes back to the opener only when it was still INSIDE the panel —\n * dropped there, it would land on `<body>` and the next Tab would restart\n * from the top of the page. When focus had already moved elsewhere (a click\n * on another control, which is itself what closed us) it is left alone:\n * stealing it back would fight the user for the caret.\n */\n private closeOverlay(): void {\n const pane = this.overlayRef?.overlayElement;\n const inside = !!pane && pane.contains(document.activeElement);\n\n // Taking the pane out of the document moves focus without the user doing anything,\n // so it must not read as focus leaving the panel.\n pane?.removeEventListener('focusout', this.onPaneFocusOut);\n this.dispose();\n\n if (inside) this.restoreFocus();\n\n // A panel that closes is the end of the visit to it. Unless focus is back in the\n // field — Escape handing it there, or a close while the user never left it — the\n // user is somewhere else now, and a refusal that waited for the panel shows. A pick\n // has already cleared its refusal, so this only ever reaches text still refused.\n if (document.activeElement !== this.inputEl().nativeElement) this.reveal();\n }\n\n private dispose(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.dateRef.set(null);\n this.timeRef.set(null);\n this.dateTimeRef.set(null);\n this.overlayOpen.set(false);\n this.autoFocusPanel = false;\n }\n\n // Helpers\n\n private outOfBounds(date: Date): WrDateInputError | null {\n if (this.mode() === 'time') return null;\n // Covers `dateFilter` as well as the bounds — the calendar disables filtered\n // days, so accepting them from the keyboard made the two entry paths\n // disagree. Same check, same reason, as `wr-date-range-picker`.\n return this.refusals.outOfBounds(date, { min: this.min(), max: this.max(), filter: this.dateFilter() });\n }\n\n private sameDate(a: Date | null, b: Date | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.getTime() === b.getTime();\n }\n}\n","<wr-input-group>\n <!--\n A plain textbox, per the APG date-picker-dialog pattern: `aria-haspopup` and\n `aria-expanded` are not permitted on `textbox` and belong to the trigger\n button below, which is the thing that opens the dialog.\n -->\n <input\n #input\n wrInput\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [attr.aria-invalid]=\"ownAriaInvalid()\"\n [attr.aria-describedby]=\"ownDescribedBy()\"\n [value]=\"text()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (click)=\"openOnInput()\"\n (keydown)=\"onFieldKey($event)\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <button\n #trigger\n type=\"button\"\n wrInputSuffix\n class=\"wr-date-picker__trigger\"\n [attr.aria-label]=\"triggerLabel()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"overlayOpen()\"\n [attr.aria-controls]=\"overlayOpen() ? panelId : null\"\n [disabled]=\"disabled()\"\n (click)=\"toggleOverlay()\"\n >\n @if (isTime()) {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.75\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"7\" y1=\"7\" x2=\"7\" y2=\"3.75\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n <line x1=\"7\" y1=\"7\" x2=\"9.5\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n } @else {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"10\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"1.5\" y1=\"5.5\" x2=\"12.5\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"4\" y1=\"1\" x2=\"4\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n @if (isDateTime()) {\n <circle cx=\"7\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" />\n }\n </svg>\n }\n </button>\n</wr-input-group>\n<!--\n Why a typed entry was refused, for a screen reader: written when the refusal is\n shown (Enter, or leaving the field) and emptied when the text is corrected. Silent\n inside a <wr-form-field> bound to the same control, whose message says it instead.\n-->\n<span class=\"wr-date-picker__sr-only\" role=\"status\" [id]=\"statusId\">{{ announcement() }}</span>\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 { Component, ViewEncapsulation, computed, inject, input, output, signal } from '@angular/core';\n\nimport { WrCalendar, type WrCalendarRange } from 'ngwr/calendar';\nimport { WrDateAdapter } from 'ngwr/date';\nimport { readI18nText } from 'ngwr/i18n';\n\nimport type { WrDateRange } from '../interfaces';\n\nimport { WrTimePanel } from './time-panel';\n\n/**\n * Internal panel behind `<wr-date-range-picker>`: a range-mode\n * `<wr-calendar>`, plus one `<wr-time-picker>` per end when `withTime` is on.\n * Not part of the public API.\n *\n * The calendar owns range picking (including the start/end swap and the hover\n * preview); this panel only re-attaches the times so a datetime range keeps the\n * hours the user set while the dates move around.\n *\n * The steppers bind `WrTimePanel`'s own `value` model, NOT `[ngModel]`. The\n * classic-forms bridge defers its first write, and under zoneless change\n * detection that write lost the race with the panel's own echo guard: a range\n * bound to 16:00–17:00 opened showing 00:00 on both ends, and the first click\n * on a stepper committed midnight-plus-one over the real value.\n *\n * @internal\n */\n@Component({\n selector: 'wr-date-range-panel',\n templateUrl: './date-range-panel.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-date-range-panel' },\n imports: [WrCalendar, WrTimePanel],\n})\nexport class WrDateRangePanel {\n readonly value = input<WrDateRange>([null, null]);\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n readonly withTime = input(false);\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n readonly showSeconds = input(false);\n readonly step = input(1);\n\n /**\n * Forwarded to the calendar only: a range panel opened from the keyboard\n * lands on the day grid, never on a time field. Dates come first here — the\n * steppers are for the range you have already drawn.\n */\n readonly autoFocus = input(false);\n\n /** A range change from the CALENDAR — the picker is free to sort it. */\n readonly changed = output<WrDateRange>();\n\n /**\n * A range change from one of the TIME steppers, which must NOT be sorted while\n * it is happening. The steppers are bound to positions, so sorting mid-edit\n * moves the user's change to the other end: raising a same-day start past the\n * end left the start stuck and pushed the END up instead, once per click, on\n * the button the user was not pressing. Ordering is settled when the popup\n * closes — the same rule the text inputs already follow for typing.\n */\n readonly timeChanged = output<WrDateRange>();\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n\n protected readonly startTimeLabel = readI18nText('datePicker.startTime', 'Start time');\n protected readonly endTimeLabel = readI18nText('datePicker.endTime', 'End time');\n\n /**\n * A time set before its end has a date. The stepper is always live, so the\n * hours are parked here until a date arrives to carry them — otherwise the\n * edit would be silently dropped and the pick would land on midnight.\n */\n private readonly pendingStartTime = signal<Date | null>(null);\n private readonly pendingEndTime = signal<Date | null>(null);\n\n /** The calendar's own range model shape — same tuple, narrower name. */\n protected readonly calendarRange = computed<WrCalendarRange>(() => this.value());\n\n /**\n * Midnight today. The steppers need a concrete date to render, but the\n * fallback must NOT be the current wall clock: picking a date carries no time\n * across until a stepper is touched, so a `14:37` default would display a time\n * the commit never actually stores.\n */\n private readonly dayStart = computed(() => {\n const t = this.adapter.today();\n return this.adapter.createDate(this.adapter.getYear(t), this.adapter.getMonth(t), this.adapter.getDate(t));\n });\n\n /** Time steppers need a concrete date; fall back to a parked time, then midnight. */\n protected readonly startTime = computed(() => this.value()[0] ?? this.pendingStartTime() ?? this.dayStart());\n protected readonly endTime = computed(() => this.value()[1] ?? this.pendingEndTime() ?? this.dayStart());\n\n protected onRangeChange(range: WrCalendarRange): void {\n const [start, end] = range;\n const [prevStart, prevEnd] = this.value();\n\n // `WrCalendar.pickRange` restarts the range whenever it has no start, so a\n // range that was end-only (typed into the end input alone) would lose that\n // end on the next click. Read the click as filling in the missing start\n // instead; the picker orders the pair afterwards.\n const keptEnd = !prevStart && prevEnd && start && !end ? prevEnd : end;\n\n // The calendar only moves dates, so carry each end's existing time across —\n // or the time parked by a stepper that ran before this date existed.\n this.changed.emit([\n this.withTimeOf(start, prevStart ?? this.pendingStartTime()),\n this.withTimeOf(keptEnd, prevEnd ?? this.pendingEndTime()),\n ]);\n }\n\n protected onStartTimeChange(time: Date | null): void {\n if (!time) return;\n const [start, end] = this.value();\n if (!start) {\n this.pendingStartTime.set(time);\n return;\n }\n this.timeChanged.emit([this.withTimeOf(start, time), end]);\n }\n\n protected onEndTimeChange(time: Date | null): void {\n if (!time) return;\n const [start, end] = this.value();\n if (!end) {\n this.pendingEndTime.set(time);\n return;\n }\n this.timeChanged.emit([start, this.withTimeOf(end, time)]);\n }\n\n /** `date`'s calendar day carrying `time`'s clock. Null date stays null. */\n private withTimeOf(date: Date | null, time: Date | null): Date | null {\n if (!date) return null;\n if (!this.withTime() || !time) return date;\n return this.adapter.setTime(\n this.adapter.createDate(this.adapter.getYear(date), this.adapter.getMonth(date), this.adapter.getDate(date)),\n this.adapter.getHours(time),\n this.adapter.getMinutes(time),\n this.adapter.getSeconds(time)\n );\n }\n}\n","<wr-calendar\n mode=\"range\"\n [range]=\"calendarRange()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [dateFilter]=\"dateFilter()\"\n [autoFocus]=\"autoFocus()\"\n (rangeChange)=\"onRangeChange($event)\"\n/>\n\n@if (withTime()) {\n <div class=\"wr-date-range-panel__times\">\n <!-- A time picker is several inputs, not one control, so each end is a\n labelled group rather than a <label>. -->\n <div class=\"wr-date-range-panel__time\" role=\"group\" [attr.aria-label]=\"startTimeLabel()\">\n <span class=\"wr-date-range-panel__time-label\" aria-hidden=\"true\">{{ startTimeLabel() }}</span>\n <wr-time-picker\n [value]=\"startTime()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [step]=\"step()\"\n (valueChange)=\"onStartTimeChange($event)\"\n />\n </div>\n <div class=\"wr-date-range-panel__time\" role=\"group\" [attr.aria-label]=\"endTimeLabel()\">\n <span class=\"wr-date-range-panel__time-label\" aria-hidden=\"true\">{{ endTimeLabel() }}</span>\n <wr-time-picker\n [value]=\"endTime()\"\n [format]=\"timeFormat()\"\n [showSeconds]=\"showSeconds()\"\n [step]=\"step()\"\n (valueChange)=\"onEndTimeChange($event)\"\n />\n </div>\n </div>\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 { Directive } from '@angular/core';\n\nimport { WR_FORM_FIELD } from 'ngwr/form';\n\n/**\n * Hides the surrounding `<wr-form-field>` from the range's END input. Not part\n * of the public API.\n *\n * `wrInput` adopts the field's `controlId` whenever the element carries no `id`\n * of its own, and `<wr-date-range-picker>` renders two of them: both took the\n * same id, so the document held it twice and the field's `<label for>` resolved\n * to whichever input came first. One label names one value — the same call\n * `wr-slider` makes for its two thumbs — so the START input keeps the id and\n * the end input takes none.\n *\n * All or nothing, deliberately: `WrFormFieldContext.controlId` is a\n * `Signal<string>` with no way to say \"no id\" (an empty one is no more valid\n * than a duplicate), so shadowing the token is the only lever, and it drops the\n * field's `aria-describedby` / `aria-invalid` from this input too. The message\n * stays announced from the start input, exactly as the slider's upper thumb\n * leaves it on the lower one.\n *\n * @internal\n */\n@Directive({\n selector: 'input[wrDateRangeEnd]',\n providers: [{ provide: WR_FORM_FIELD, useValue: null }],\n})\nexport class WrDateRangeEndInput {}\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 { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n type ComponentRef,\n DestroyRef,\n ElementRef,\n Injector,\n type Signal,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport { WrDateAdapter, type WrDateFormat } from 'ngwr/date';\nimport { readI18nText } from 'ngwr/i18n';\nimport { WrInput, WrInputGroup, WrInputSuffix } from 'ngwr/input';\nimport { WR_OVERLAY, WrOutsideClick, wrFollowDirection } from 'ngwr/overlay';\n\nimport type { WrDateInputError, WrDateRange, WrDateRangeInputError } from './interfaces';\nimport { WrDateRangePanel } from './internal/date-range-panel';\nimport {\n WR_DATE_INPUT_FIELD_VIEW_PROVIDER,\n WrDateInputField,\n useDateInputRefusals,\n useFormParseErrors,\n} from './internal/input-refusal';\nimport { WrDateRangeEndInput } from './internal/range-end-input';\n\n/** Which end of the range an edit applies to. */\ntype RangeEnd = 0 | 1;\n\n/** Per-instance popup ids, so `aria-controls` can point at one panel. */\nlet rangePanelUid = 0;\n\n/** How long a live region stays blank before a repeated refusal is written back. */\nconst SILENCE_MS = 100;\n\n/** One refusal per end, start first — `null` where that end's text is its date. */\ntype EndRefusals = readonly [WrDateInputError | null, WrDateInputError | null];\n\n/**\n * Date-range picker — two text inputs sharing one range calendar.\n *\n * Separate from `<wr-date-picker>` because the value is a different type: a\n * range is `[start, end]`, and folding that into the single picker's\n * `Date | null` would break `[formField]` inference for every existing usage.\n * Everything else matches — same input skeleton, same overlay, same\n * {@link WrDateAdapter} formats.\n *\n * - `'date'` (default) — popover renders a range calendar. Picking the second\n * date closes the overlay.\n * - `'datetime'` — popover adds a time stepper per end. Picking dates does NOT\n * close, since the user typically sets the times next.\n *\n * A signal-forms native control: it implements\n * `FormValueControl<WrDateRange | null>`, so `[formField]` binds straight to\n * its `value` model. `[(value)]` works standalone, and classic `[(ngModel)]` /\n * reactive forms keep working through Angular's bridge.\n *\n * Either end may be `null` while the range is half-picked. Out-of-order ends\n * are swapped on commit, matching the calendar's own behaviour.\n *\n * Each end refuses text it cannot use exactly as `<wr-date-picker>` does — never\n * guessing, keeping the text, and showing the refusal on Enter or when focus\n * leaves that end. See {@link inputErrors}.\n *\n * @example\n * ```html\n * <!-- signal forms -->\n * <wr-date-range-picker [formField]=\"form.period\" format=\"dd.MM.yyyy\" />\n *\n * <!-- standalone two-way binding -->\n * <wr-date-range-picker [(value)]=\"period\" [minDate]=\"minDate\" />\n *\n * <!-- date + time on both ends -->\n * <wr-date-range-picker mode=\"datetime\" [(value)]=\"window\" timeFormat=\"24h\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/date-picker\n */\n@Component({\n selector: 'wr-date-range-picker',\n templateUrl: './date-range-picker.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrDateRangeEndInput, WrInput, WrInputGroup, WrInputSuffix],\n providers: [WrDateInputField],\n viewProviders: [WR_DATE_INPUT_FIELD_VIEW_PROVIDER],\n})\nexport class WrDateRangePicker implements FormValueControl<WrDateRange | null> {\n /** Picker behavior — see class doc. @default 'date' */\n readonly mode = input<'date' | 'datetime'>('date');\n\n /**\n * Format used for both display and parsing, on both ends. When `null`\n * (default), it is derived from `mode` (`shortDate` / `shortDateTime`). Pass\n * a named key or raw token string to override.\n */\n readonly format = input<WrDateFormat | (string & {}) | null>(null);\n\n /** Placeholder for the start input. */\n readonly startPlaceholder = input<string>('');\n\n /** Placeholder for the end input. */\n readonly endPlaceholder = input<string>('');\n\n /** Glyph rendered between the two inputs. @default '–' */\n readonly separator = input<string>('–');\n\n // Named `minDate` / `maxDate`, not `min` / `max`: `FormUiControl` reserves\n // those slots for the control's own value type, which here is a range — a\n // `min` typed as a range makes no sense. Matches `WrValidators.minDate`.\n /** Min selectable date, applied to both ends. */\n readonly minDate = input<Date | null>(null);\n\n /** Max selectable date, applied to both ends. */\n readonly maxDate = input<Date | null>(null);\n\n /** Predicate to disable specific dates (forwarded to the calendar). */\n readonly dateFilter = input<((date: Date) => boolean) | null>(null);\n\n /** Time-panel 12 / 24-hour format. Applies in `datetime` mode. @default 'auto' */\n readonly timeFormat = input<'auto' | '12h' | '24h'>('auto');\n\n /** Render the seconds column. Applies in `datetime` mode. @default false */\n readonly showSeconds = input(false, { transform: coerceBooleanProperty });\n\n /** Minute / second step for the time panels. @default 1 */\n readonly step = input(1, { transform: (v: unknown): number => Math.max(1, coerceNumberProperty(v, 1)) });\n\n /**\n * Disable interaction. Bound automatically from the field's disabled state\n * when used with `[formField]`.\n *\n * @default false\n */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Read-only — neither the inputs nor the calendar can change the value.\n *\n * Deliberately stricter than `wr-date-picker`, which still opens its popup\n * while read-only: with two fields feeding one calendar there is no reading\n * of \"untypeable\" that leaves the grid free to rewrite both ends. The doc\n * used to promise the trigger still opened; the code has always refused, and\n * refusing is the behaviour worth keeping.\n *\n * @default false\n */\n readonly readonly = input(false, { transform: coerceBooleanProperty });\n\n private readonly adapter = inject<WrDateAdapter<Date>>(WrDateAdapter);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly outsideClick = inject(WrOutsideClick);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n /**\n * Ambient reading direction, for the open panel alone — nothing in this\n * component reads it directly. Optional so a bare `TestBed` needs no\n * provider; `Directionality` is root-provided anyway, and a missing one\n * simply reads as `ltr`.\n */\n private readonly dir = inject(Directionality, { optional: true });\n protected readonly startEl = viewChild.required<ElementRef<HTMLInputElement>>('startInput');\n protected readonly endEl = viewChild.required<ElementRef<HTMLInputElement>>('endInput');\n protected readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n /** The picked range. Bound by `[formField]`, or two-way via `[(value)]`. */\n readonly value = model<WrDateRange | null>(null);\n\n /** Emitted on blur so a bound field can mark itself touched. */\n readonly touch = output<void>();\n\n /** Text currently in each input (may be partial / invalid mid-type). */\n protected readonly startText = signal<string>('');\n protected readonly endText = signal<string>('');\n\n /** Whether the popover is currently open. */\n protected readonly overlayOpen = signal(false);\n\n /**\n * Which element opened the popup — captured as an argument, never read off\n * `document.activeElement`, which by then may already be the pane. With TWO\n * text inputs this is the whole point: \"restore focus to the field\" is\n * ambiguous here, and the old code resolved it by always picking the START\n * input, so closing from the end input threw the caret across the control.\n */\n private openedFrom: HTMLElement | null = null;\n\n /** Whether the panel this open cycle should take focus. */\n private autoFocusPanel = false;\n\n /** Resolved format — falls back to a mode-appropriate default. */\n protected readonly resolvedFormat = computed<string>(() =>\n this.format() ? String(this.format()) : this.mode() === 'datetime' ? 'shortDateTime' : 'shortDate'\n );\n\n protected readonly isDateTime = computed(() => this.mode() === 'datetime');\n\n protected readonly triggerLabel = readI18nText('datePicker.openRange', 'Open range calendar');\n protected readonly startLabel = readI18nText('datePicker.rangeStart', 'Range start');\n protected readonly endLabel = readI18nText('datePicker.rangeEnd', 'Range end');\n\n private readonly panelLabelRange = readI18nText('datePicker.panelRange', 'Choose date range');\n private readonly panelLabelRangeDateTime = readI18nText(\n 'datePicker.panelRangeDateTime',\n 'Choose date and time range'\n );\n\n /**\n * Accessible name of the popup. The trigger advertises\n * `aria-haspopup=\"dialog\"`, so the pane is a `role=\"dialog\"` — and an unnamed\n * dialog announces as a bare \"dialog\". Defaults to the catalog's\n * `datePicker.panelRange*` string for the current `mode`.\n */\n readonly panelAriaLabel = input<string | null>(null);\n\n /** Popup id — what the trigger's `aria-controls` points at while open. */\n protected readonly panelId = `wr-date-range-picker-panel-${++rangePanelUid}`;\n\n protected readonly resolvedPanelLabel = computed(() => {\n const explicit = this.panelAriaLabel();\n if (explicit) return explicit;\n return this.isDateTime() ? this.panelLabelRangeDateTime() : this.panelLabelRange();\n });\n\n private readonly refusalBuilder = useDateInputRefusals();\n private readonly reportToForm = useFormParseErrors(this.value, () => this.onFormReset());\n private readonly inputField = inject(WrDateInputField);\n\n /** Why each end's text was not committed. */\n private readonly refusals = signal<EndRefusals>([null, null]);\n\n /**\n * Every refusal standing, on show or not, each marked with its end — what a bound form\n * hears, from the keystroke.\n */\n private readonly raised = computed<readonly WrDateRangeInputError[]>(() => {\n const [start, end] = this.refusals();\n const out: WrDateRangeInputError[] = [];\n if (start) out.push({ ...start, end: 'start' });\n if (end) out.push({ ...end, end: 'end' });\n return out;\n });\n\n /**\n * Which ends have their refusal on show — raised on the keystroke, shown on Enter\n * or when focus leaves that end, for the reason `wr-date-picker` gives at the same\n * name: a date is unreadable for most of the time it takes to type one. Leaving\n * includes leaving by way of the open panel, as it does there.\n */\n private readonly revealed = signal<readonly [boolean, boolean]>([false, false]);\n\n protected readonly shownErrors = computed<EndRefusals>(() => {\n const [start, end] = this.refusals();\n const [showStart, showEnd] = this.revealed();\n return [showStart ? start : null, showEnd ? end : null];\n });\n\n /**\n * Why the text in either field is not that end of the bound range, for the ends\n * whose refusal the picker is SHOWING — one entry per end, marked with the `end` it\n * came from, and empty while both fields hold their dates or the user is still\n * typing.\n *\n * An end's refusal is raised on the keystroke and goes on show on Enter or when\n * focus leaves that end — the moment its input turns invalid and the reason is\n * announced, so a message rendered from this never disagrees with them. It clears\n * the moment that end's text commits, is emptied, or is replaced by a pick from the\n * panel, a value written from outside, or a form reset.\n *\n * A bound form does NOT wait: it sees every refusal as a parse error from the\n * keystroke, so it is invalid the whole time either field holds text the picker\n * could not use — including while the OTHER end commits — and `<wr-form-field>`\n * shows `message` by its own rule. Read this through a template reference to put\n * the reason on screen for a picker bound with `[(value)]` alone.\n */\n readonly inputErrors: Signal<readonly WrDateRangeInputError[]> = computed(() => {\n const [showStart, showEnd] = this.revealed();\n return this.raised().filter(error => (error.end === 'start' ? showStart : showEnd));\n });\n\n /**\n * Blanked briefly so Enter on an unchanged refusal is announced again. A live region\n * does not repeat text it already holds, and blanking it for one render is not\n * enough: both changes land in the same task, and the accessibility tree sees\n * only the end state. The gap is a timer for that reason — the CDK's\n * `LiveAnnouncer` clears its region the same way.\n */\n private readonly silenced = signal(false);\n private silenceTimer: ReturnType<typeof setTimeout> | undefined;\n\n protected readonly statusId = this.inputField.statusId;\n\n /**\n * The live region's text: every refusal on show that a surrounding `<wr-form-field>`\n * is not already rendering a message for, each sentence once.\n */\n protected readonly announcement = computed(() => {\n if (this.silenced()) return '';\n const messages = this.shownErrors()\n .filter((error): error is WrDateInputError => !!error && !this.inputField.saysAlready(error))\n .map(error => error.message);\n return [...new Set(messages)].join(' ');\n });\n\n /**\n * `aria-invalid` / `aria-describedby` for each input, where the picker binds them.\n *\n * The START input reads a surrounding field through `wrInput`, so inside one the\n * picker feeds its refusal through `WrDateInputField` rather than binding a second\n * writer beside `wrInput`, and binds these only with no field around it. The END\n * input is hidden from the field on purpose (see `wrDateRangeEnd`), so its `wrInput`\n * never writes either attribute and the picker always owns them: an unreadable end\n * date marks the end field, not only the start.\n */\n protected readonly startAriaInvalid = computed<'true' | null>(() =>\n !this.inputField.outer && this.shownErrors()[0] ? 'true' : null\n );\n protected readonly endAriaInvalid = computed<'true' | null>(() => (this.shownErrors()[1] ? 'true' : null));\n protected readonly startDescribedBy = computed(() =>\n !this.inputField.outer && this.shownErrors()[0] && this.announcement() ? this.statusId : null\n );\n protected readonly endDescribedBy = computed(() =>\n this.shownErrors()[1] && this.announcement() ? this.statusId : null\n );\n\n protected readonly classes = computed(() => {\n const parts = ['wr-date-range-picker', `wr-date-range-picker--${this.mode()}`];\n if (this.disabled()) parts.push('wr-date-range-picker--disabled');\n if (this.shownErrors().some(Boolean)) parts.push('wr-date-range-picker--invalid');\n return parts.join(' ');\n });\n\n private overlayRef: OverlayRef | null = null;\n\n /** Live panel ref while the popover is open — lets typed edits move the\n * displayed month in real time (not just on reopen). */\n private readonly panelRef = signal<ComponentRef<WrDateRangePanel> | null>(null);\n\n /** Last range we pushed into the model ourselves, so the sync effect can skip\n * the echo of our own edits and never reformat text mid-type. */\n private lastValue: WrDateRange | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.dispose();\n clearTimeout(this.silenceTimer);\n });\n\n // The start input's field (see `WrDateInputField`) marks it invalid for the\n // start end's refusal on show; the end input carries its own.\n this.inputField.describe(computed(() => this.shownErrors()[0]));\n\n // Mirror external writes to `value` into the two display texts — and drop the\n // refusals, whose text that write has just replaced.\n effect(() => {\n const v = this.value();\n untracked(() => {\n // An equal range in a DIFFERENT tuple came from outside — `commitRange` hands the\n // model the very tuple it remembered. It leaves text being typed alone, but it\n // does replace text the picker refused.\n const outside = v !== this.lastValue;\n const [refusedStart, refusedEnd] = this.refusals();\n if (this.sameRange(v, this.lastValue) && !(outside && (refusedStart || refusedEnd))) return;\n this.lastValue = v;\n this.startText.set(this.display(v?.[0] ?? null));\n this.endText.set(this.display(v?.[1] ?? null));\n this.refuse(0, null);\n this.refuse(1, null);\n });\n });\n\n // A panel that is up when `readonly` turns on has to go, and `disabled` is\n // the same case. The three entrance guards refuse to OPEN the calendar, and\n // the component's whole position on `readonly` — stricter than the single\n // picker's, which keeps its calendar browsable — is that the calendar is\n // not a second way in. Leaving it standing and only refusing the write\n // trades a wrong value for a dead panel: every click does nothing and\n // nothing says why.\n effect(() => {\n if (!this.readonly() && !this.disabled()) return;\n untracked(() => {\n if (this.overlayRef) this.closeOverlay();\n });\n });\n\n // Keep the open panel in step with the model.\n effect(() => {\n const ref = this.panelRef();\n if (ref) ref.setInput('value', this.value() ?? [null, null]);\n });\n\n // …and with every other input. Pushing these only at attach time meant a\n // `[minDate]` (or filter, or time format) that changed while the popover was\n // open silently kept the stale constraint until the next reopen.\n effect(() => {\n const ref = this.panelRef();\n if (!ref) return;\n ref.setInput('min', this.minDate());\n ref.setInput('max', this.maxDate());\n ref.setInput('dateFilter', this.dateFilter());\n ref.setInput('withTime', this.isDateTime());\n ref.setInput('timeFormat', this.timeFormat());\n ref.setInput('showSeconds', this.showSeconds());\n ref.setInput('step', this.step());\n });\n }\n\n // Template handlers\n\n protected onStartInput(event: Event): void {\n this.onRangeInput(event, 0);\n }\n\n protected onEndInput(event: Event): void {\n this.onRangeInput(event, 1);\n }\n\n protected onBlur(event: FocusEvent): void {\n // Moving between the two ends is still one interaction — only report the\n // control as touched once focus actually leaves it, or tabbing from start to\n // end would mark a bound field touched mid-entry.\n const next = event.relatedTarget as Node | null;\n const leaving = !next || !this.host.nativeElement.contains(next);\n if (leaving) this.touch.emit();\n\n // Typing leaves the ends in whatever order they were entered; settle it\n // here, once the user has stopped — and moving from one end to the other is\n // NOT stopping. Sorting on that hop took the start date the user had just\n // typed and moved it into the field they were tabbing into, leaving the old\n // end date under their cursor. Same rule the time steppers follow.\n const [start, end] = this.commitRange(this.current(), { normalise: leaving });\n // Reformat to canonical on blur (cleans up `1/5/25` → `1/5/2025`) — except a\n // refused end, whose text is what the user has to correct. Overwriting it with\n // the old date is how a refusal used to vanish without a word.\n const [refusedStart, refusedEnd] = this.refusals();\n if (!refusedStart) this.startText.set(this.display(start));\n if (!refusedEnd) this.endText.set(this.display(end));\n\n // Show the refusal of the end focus just left — both, once it leaves the pair.\n // Focus moving INTO the open panel is not leaving: a pick there replaces the text.\n if (next && this.overlayRef?.overlayElement.contains(next)) return;\n const left: RangeEnd = event.target === this.endEl().nativeElement ? 1 : 0;\n this.reveal(leaving ? [true, true] : left === 0 ? [true, false] : [false, true]);\n }\n\n /**\n * Enter in either field is \"this is the range\". Committed ends are settled — sorted\n * and re-formatted canonical — and the panel closes; a refused end turns invalid on\n * the spot, and `touch` is emitted so a surrounding `<wr-form-field>` shows its\n * message, which the panel would otherwise cover. Never `preventDefault`: Enter in a\n * `<form>` still submits it, and a bound form is invalid while a refusal stands.\n */\n private onEnter(): void {\n // Read before closing: a close can put refusals on show itself.\n const [shownStart, shownEnd] = this.revealed();\n if (this.overlayRef) this.closeOverlay();\n const [start, end] = this.commitRange(this.current(), { normalise: true });\n const [refusedStart, refusedEnd] = this.refusals();\n if (!refusedStart) this.startText.set(this.display(start));\n if (!refusedEnd) this.endText.set(this.display(end));\n if (!refusedStart && !refusedEnd) return;\n\n this.touch.emit();\n if ((!refusedStart || shownStart) && (!refusedEnd || shownEnd)) {\n // Everything refused is already on show, so the live region already holds this\n // text and would not repeat it. Blank it briefly so Enter is answered.\n this.silenced.set(true);\n clearTimeout(this.silenceTimer);\n this.silenceTimer = setTimeout(() => this.silenced.set(false), SILENCE_MS);\n }\n this.reveal([true, true]);\n }\n\n /** Put the refusals of the given ends on show; an end with no refusal stays clear. */\n private reveal([start, end]: readonly [boolean, boolean]): void {\n const [refusedStart, refusedEnd] = this.refusals();\n const [shownStart, shownEnd] = this.revealed();\n this.revealed.set([shownStart || (start && !!refusedStart), shownEnd || (end && !!refusedEnd)]);\n }\n\n /**\n * Record why one end's text was not committed, or that it was. Clearing a refusal\n * takes it off show too, so the next one waits for Enter or blur again.\n */\n private refuse(end: RangeEnd, next: WrDateInputError | null): void {\n const current = this.refusals();\n if (current[end] === next) return;\n this.refusals.set(end === 0 ? [next, current[1]] : [current[0], next]);\n if (!next) {\n const [shownStart, shownEnd] = this.revealed();\n this.revealed.set(end === 0 ? [false, shownEnd] : [shownStart, false]);\n }\n this.reportToForm(this.raised());\n }\n\n /**\n * Put the refusals on show for wherever focus has gone: back into one field leaves\n * the OTHER end, and anywhere outside the pair leaves both.\n */\n private revealFor(focus: Element | null): void {\n if (focus === this.startEl().nativeElement) this.reveal([false, true]);\n else if (focus === this.endEl().nativeElement) this.reveal([true, false]);\n else this.reveal([true, true]);\n }\n\n /**\n * The bound form was reset while the model stayed where it was — Angular has thrown\n * the parse errors away, so the text they were about goes too, and both fields show\n * the range again. (A reset that MOVES the model reaches the text through the sync\n * effect, like any other outside write.)\n */\n private onFormReset(): void {\n const [refusedStart, refusedEnd] = this.refusals();\n if (!refusedStart && !refusedEnd) return;\n const [start, end] = this.current();\n this.startText.set(this.display(start));\n this.endText.set(this.display(end));\n this.refuse(0, null);\n this.refuse(1, null);\n }\n\n /**\n * Focus leaving the open panel. Moving within it is the same visit; anywhere else has\n * left whichever end focus is not going back to — see {@link revealFor}.\n */\n private readonly onPaneFocusOut = (event: FocusEvent): void => {\n const next = event.relatedTarget as Element | null;\n if (next && this.overlayRef?.overlayElement.contains(next)) return;\n this.revealFor(next);\n };\n\n /** Called by an input's click — opens the overlay if it isn't open already. */\n protected openOnInput(end: RangeEnd): void {\n if (this.disabled() || this.readonly() || this.overlayRef) return;\n // Deliberately WITHOUT focus: this click placed a caret in one of the text\n // fields, and pulling focus into the grid would throw that away.\n // `Alt+ArrowDown` / `ArrowDown` are the keyboard way in — see onFieldKey.\n this.openOverlay(this.fieldEl(end), false);\n }\n\n protected toggleOverlay(): void {\n // `readonly` blocks the calendar too — otherwise the inputs refuse typing\n // while the popover happily edits the same value.\n if (this.disabled() || this.readonly()) return;\n if (this.overlayRef) {\n // Focus is already on the trigger — nothing to restore.\n this.closeOverlay();\n } else {\n this.openOverlay(this.triggerEl()?.nativeElement ?? null, true);\n }\n }\n\n /**\n * The keyboard route into the popup, per the APG date-picker pattern, and the\n * only one either field has. `Alt+ArrowDown` opens and takes focus; a bare\n * vertical arrow walks focus in when the popup is ALREADY open, which is how\n * someone who opened it by clicking a field reaches the grid. Every other key\n * belongs to the field, so typing a date keeps working with the popup open.\n */\n protected onFieldKey(event: KeyboardEvent, end: RangeEnd): void {\n if (this.disabled() || this.readonly()) return;\n\n if (event.key === 'Enter') {\n this.onEnter();\n return;\n }\n\n const vertical = event.key === 'ArrowDown' || event.key === 'ArrowUp';\n if (!vertical) return;\n\n if (event.altKey && event.key === 'ArrowDown' && !this.overlayRef) {\n event.preventDefault();\n this.openOverlay(this.fieldEl(end), true);\n return;\n }\n\n if (this.overlayRef) {\n event.preventDefault();\n this.focusPanel();\n }\n }\n\n /** The input element for an end — the two are otherwise addressed by index. */\n private fieldEl(end: RangeEnd): HTMLInputElement {\n return end === 0 ? this.startEl().nativeElement : this.endEl().nativeElement;\n }\n\n /**\n * Move focus into an already-mounted panel. A plain query is right HERE and\n * wrong at mount time: the panel has settled, so there is no deferral to get\n * wrong — and it keeps `autoFocus` as the single piece of panel API.\n */\n private focusPanel(): void {\n const pane = this.overlayRef?.overlayElement;\n const target =\n pane?.querySelector<HTMLElement>('.wr-calendar__day--focused:not([disabled])') ??\n pane?.querySelector<HTMLElement>('.wr-time-picker__input');\n target?.focus();\n }\n\n /** Hand focus back to whatever opened the popup, if it is still on the page. */\n private restoreFocus(): void {\n const opener = this.openedFrom?.isConnected ? this.openedFrom : null;\n opener?.focus();\n\n // Connected is not the question — whether the focus LANDED is. The calendar\n // trigger goes `disabled` the moment `readonly` turns on, and a disabled\n // button is still in the document and still refuses focus, so a panel\n // closed by that flip used to land on `<body>` and the next Tab restarted\n // at the top of the page. The start field keeps its tab stop while\n // read-only, which is the whole point of read-only, so it is where the\n // caret belongs.\n if (this.host.nativeElement.ownerDocument.activeElement !== opener) {\n this.startEl().nativeElement.focus();\n }\n }\n\n // Input parsing\n\n private onRangeInput(event: Event, end: RangeEnd): void {\n const raw = (event.target as HTMLInputElement).value;\n (end === 0 ? this.startText : this.endText).set(raw);\n\n const [start, finish] = this.current();\n if (!raw) {\n this.commitRange(end === 0 ? [null, finish] : [start, null], { normalise: false });\n this.refuse(end, null);\n return;\n }\n const parsed = this.adapter.parse(raw, this.resolvedFormat());\n if (!parsed || !this.adapter.isValid(parsed)) {\n this.refuse(end, this.refusalBuilder.unreadable(this.resolvedFormat()));\n return;\n }\n const outOfBounds = this.outOfBounds(parsed);\n if (outOfBounds) {\n this.refuse(end, outOfBounds);\n return;\n }\n // Never reorder mid-keystroke: a half-typed date can parse to an\n // out-of-order value, and swapping there would yank the text the user is\n // still typing over to the other input. Ordering is settled on blur.\n this.commitRange(end === 0 ? [parsed, finish] : [start, parsed], { normalise: false });\n this.refuse(end, null);\n }\n\n // Overlay\n\n private openOverlay(openedFrom: HTMLElement | null = null, autoFocus = false): void {\n if (this.overlayRef) return;\n this.openedFrom = openedFrom;\n this.autoFocusPanel = autoFocus;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n panelClass: 'wr-date-picker-overlay',\n });\n\n // Same four fallbacks as `wr-date-picker`, two of them anchored on `end`,\n // and the two calendars inside the panel read `Directionality` live — so an\n // open range panel had to follow a flip or render its months against a\n // direction the rest of the page had left behind.\n wrFollowDirection(this.overlayRef, this.dir, this.injector);\n\n this.overlayOpen.set(true);\n\n // The trigger promises `aria-haspopup=\"dialog\"`; the pane is the element it\n // points at, so the role, the name and the id all belong here. Non-modal on\n // purpose — the two text fields stay reachable while the calendar is up,\n // which is the whole interaction model.\n const pane = this.overlayRef.overlayElement;\n pane.id = this.panelId;\n pane.setAttribute('role', 'dialog');\n pane.setAttribute('aria-modal', 'false');\n pane.setAttribute('aria-label', this.resolvedPanelLabel());\n pane.addEventListener('focusout', this.onPaneFocusOut);\n\n const ref = this.overlayRef.attach(new ComponentPortal(WrDateRangePanel));\n ref.setInput('value', this.value() ?? [null, null]);\n ref.setInput('autoFocus', this.autoFocusPanel);\n this.panelRef.set(ref);\n\n // A stepper edit belongs to the end it was made on. Sorting it here is what\n // made the start stepper stop responding once it passed the end.\n ref.instance.timeChanged.subscribe(next => this.commitRange(next, { normalise: false }));\n\n ref.instance.changed.subscribe(next => {\n const committed = this.commitRange(next, { normalise: true });\n // A complete date-only range is the end of the interaction; a datetime\n // range still needs its hours, so the panel stays put.\n if (!this.isDateTime() && committed[0] && committed[1]) this.closeOverlay();\n });\n\n this.outsideClick\n .outsidePointerEvents(this.overlayRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.closeOverlay();\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeOverlay();\n }\n });\n }\n\n /**\n * Close the popover, handing focus back to whichever field or button opened\n * it — but ONLY when focus was still inside the pane. Dropped there it would\n * land on `<body>` and the next Tab would restart from the top of the page;\n * moved on by the user, it must be left where they put it.\n *\n * There is deliberately no \"always restore\" escape hatch. Escape reaches this\n * overlay from anywhere in the document (the CDK dispatches it to the topmost\n * one), so forcing a restore would drag the caret backwards out of the field\n * the user was actually typing in — into the one that happened to open the\n * popup, possibly several Tab stops away.\n */\n private closeOverlay(): void {\n const pane = this.overlayRef?.overlayElement;\n const doc = this.host.nativeElement.ownerDocument;\n const inside = !!pane && pane.contains(doc.activeElement);\n\n // Taking the pane out of the document moves focus without the user doing anything,\n // so it must not read as focus leaving the panel.\n pane?.removeEventListener('focusout', this.onPaneFocusOut);\n this.dispose();\n\n // The interaction is over, so settle the ordering an in-progress time edit\n // was allowed to leave inverted. Blur does the same for the text inputs;\n // without this, closing by clicking outside never passes through one.\n this.commitRange(this.current(), { normalise: true });\n\n if (inside) this.restoreFocus();\n\n // A panel that closes ends the visit to it: wherever focus is now, the ends it is\n // not in have been left. A pick has already cleared the refusals it replaced.\n this.revealFor(doc.activeElement);\n }\n\n private dispose(): void {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.panelRef.set(null);\n this.overlayOpen.set(false);\n this.autoFocusPanel = false;\n }\n\n // Commit\n\n /**\n * Push to the model and refresh the text of whichever ends changed. Returns\n * what was actually committed.\n *\n * `normalise` swaps out-of-order ends. The calendar and blur ask for it; a\n * keystroke does not, because reordering while the user is still typing would\n * move their in-progress text into the other input.\n */\n private commitRange(next: WrDateRange, options: { normalise: boolean }): WrDateRange {\n const previous = this.current();\n const normalised = options.normalise ? this.normalise(next) : next;\n // Only write when a date actually moved, and never while `readonly`.\n //\n // `normalise()` allocates a fresh tuple on every call and `model()` compares\n // by reference, so an unconditional write would emit on every blur — enough\n // to mark a bound `[formField]` dirty just by tabbing through the two inputs.\n //\n // The `readonly` half is the one the three entrance guards cannot cover:\n // `openOnInput`, `toggleOverlay` and `onFieldKey` all refuse to OPEN the\n // calendar, and none of them is consulted again by a panel that is already\n // up. A `readonly()` schema rule turning on mid-session — a save starting,\n // another field flipping the row — left the popup standing and a day click\n // wrote the range anyway. The single picker guards its write point for\n // exactly this reason and says so at `commitValue`; this is the same guard\n // at the same place.\n if (!this.readonly() && !this.sameRange(normalised, this.value())) {\n this.lastValue = normalised;\n this.value.set(normalised);\n }\n // An end whose DATE moved — a pick in the panel, a swap — has had its text\n // replaced by that date, so a refusal about the old text no longer applies.\n // An end that did not move keeps refused text as it is: committing the OTHER\n // end is no reason to throw away what the user is still correcting here.\n const [movedStart, movedEnd] = [0, 1].map(i => !this.sameDate(this.current()[i], previous[i]));\n if (movedStart) this.refuse(0, null);\n if (movedEnd) this.refuse(1, null);\n const [refusedStart, refusedEnd] = this.refusals();\n // Say the refusals again, whether or not either moved. Angular clears a control's\n // parse errors whenever its model changes, so committing ONE end used to leave the\n // form valid while the other end still held refused text — and able to submit the\n // old end under it.\n this.reportToForm(this.raised());\n\n // Only rewrite the text of an end whose date moved out from under it —\n // otherwise a half-typed date would be reformatted on every keystroke.\n if (!refusedStart && !this.sameDate(normalised[0], this.parseText(this.startText()))) {\n this.startText.set(this.display(normalised[0]));\n }\n if (!refusedEnd && !this.sameDate(normalised[1], this.parseText(this.endText()))) {\n this.endText.set(this.display(normalised[1]));\n }\n return normalised;\n }\n\n // Helpers\n\n private current(): WrDateRange {\n return this.value() ?? [null, null];\n }\n\n private display(date: Date | null): string {\n return date && this.adapter.isValid(date) ? this.adapter.format(date, this.resolvedFormat()) : '';\n }\n\n private parseText(raw: string): Date | null {\n if (!raw) return null;\n const parsed = this.adapter.parse(raw, this.resolvedFormat());\n return parsed && this.adapter.isValid(parsed) ? parsed : null;\n }\n\n /** Keep `[start, end]` in chronological order once both ends exist. */\n private normalise(range: WrDateRange): WrDateRange {\n const [start, end] = range;\n if (start && end && this.compareEnds(start, end) > 0) return [end, start];\n return [start, end];\n }\n\n /**\n * Chronological comparison at the precision the mode needs. The adapter's\n * `compareDate` is day-precision by contract, which would leave an inverted\n * same-day `datetime` range (18:00 → 09:00) unswapped.\n */\n private compareEnds(a: Date, b: Date): number {\n const byDay = this.adapter.compareDate(a, b);\n if (byDay !== 0 || !this.isDateTime()) return byDay;\n const clock = (d: Date): number =>\n this.adapter.getHours(d) * 3600 + this.adapter.getMinutes(d) * 60 + this.adapter.getSeconds(d);\n return clock(a) - clock(b);\n }\n\n /**\n * Why a typed date must be rejected, or `null`. Covers `dateFilter` as well as\n * the bounds — the calendar disables filtered days, so accepting them from the\n * keyboard would make the two entry paths disagree.\n */\n private outOfBounds(date: Date): WrDateInputError | null {\n return this.refusalBuilder.outOfBounds(date, {\n min: this.minDate(),\n max: this.maxDate(),\n filter: this.dateFilter(),\n });\n }\n\n private sameDate(a: Date | null, b: Date | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.getTime() === b.getTime();\n }\n\n /**\n * `null` and `[null, null]` are the same VALUE — an empty range — and treating\n * them as different is what let the FIRST blur on an untouched picker write\n * `[null, null]` over the `null` it was bound to. No date had moved, but\n * `model()` emitted: a bound `[formField]` went dirty from nothing but tabbing\n * through, and a consumer's `@if (period())` flipped from empty to truthy with\n * neither end picked. The write guard in `commitRange` is only as good as this\n * comparison.\n */\n private sameRange(a: WrDateRange | null, b: WrDateRange | null): boolean {\n if (a === b) return true;\n const [aStart, aEnd] = a ?? [null, null];\n const [bStart, bEnd] = b ?? [null, null];\n return this.sameDate(aStart, bStart) && this.sameDate(aEnd, bEnd);\n }\n}\n","<wr-input-group>\n <input\n #startInput\n wrInput\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n class=\"wr-date-range-picker__input\"\n [attr.aria-label]=\"startLabel()\"\n [attr.aria-invalid]=\"startAriaInvalid()\"\n [attr.aria-describedby]=\"startDescribedBy()\"\n [value]=\"startText()\"\n [placeholder]=\"startPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (click)=\"openOnInput(0)\"\n (keydown)=\"onFieldKey($event, 0)\"\n (input)=\"onStartInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <span class=\"wr-date-range-picker__separator\" aria-hidden=\"true\">{{ separator() }}</span>\n <!--\n `wrDateRangeEnd` hides the surrounding `<wr-form-field>` from this input, so\n only the start one adopts its `controlId` — see the directive for why the\n second half of a range carries no id at all.\n -->\n <input\n #endInput\n wrInput\n wrDateRangeEnd\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n class=\"wr-date-range-picker__input\"\n [attr.aria-label]=\"endLabel()\"\n [attr.aria-invalid]=\"endAriaInvalid()\"\n [attr.aria-describedby]=\"endDescribedBy()\"\n [value]=\"endText()\"\n [placeholder]=\"endPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (click)=\"openOnInput(1)\"\n (keydown)=\"onFieldKey($event, 1)\"\n (input)=\"onEndInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <!--\n `readonly` refuses to open the popup, so the trigger is disabled with it —\n otherwise it stays a focusable button advertising `aria-haspopup=\"dialog\"`\n for a dialog it will never show.\n -->\n <button\n #trigger\n type=\"button\"\n wrInputSuffix\n class=\"wr-date-picker__trigger\"\n [attr.aria-label]=\"triggerLabel()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"overlayOpen()\"\n [attr.aria-controls]=\"overlayOpen() ? panelId : null\"\n [disabled]=\"disabled() || readonly()\"\n (click)=\"toggleOverlay()\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"11\" height=\"10\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"1.5\" y1=\"5.5\" x2=\"12.5\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <line x1=\"4\" y1=\"1\" x2=\"4\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n @if (isDateTime()) {\n <circle cx=\"7\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" />\n }\n </svg>\n </button>\n</wr-input-group>\n<!--\n Why a typed end was refused, for a screen reader — the same live region\n <wr-date-picker> carries, written when a refusal is shown and emptied when it is\n corrected. Silent inside a <wr-form-field> bound to the same control.\n-->\n<span class=\"wr-date-range-picker__sr-only\" role=\"status\" [id]=\"statusId\">{{ announcement() }}</span>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["SILENCE_MS"],"mappings":"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"}