@ionic/core 8.8.19 → 8.8.20-dev.11787158518.168a2fea

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 (799) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/p--m5cCjbK.js +4 -0
  99. package/components/p-1jI5oW-W.js +4 -0
  100. package/components/{p-6J0vc7Z8.js → p-63OhffQv.js} +1 -1
  101. package/components/p-8FN7p701.js +4 -0
  102. package/components/p-B4uHHhPK.js +4 -0
  103. package/components/p-BMPN55of.js +4 -0
  104. package/components/p-BNJOu1Q2.js +4 -0
  105. package/components/p-BOvLNVKq.js +4 -0
  106. package/components/p-BSQPZ79H.js +4 -0
  107. package/components/p-BeamQXHF.js +4 -0
  108. package/components/p-BhamHSw3.js +4 -0
  109. package/components/p-Bjig0DJK.js +4 -0
  110. package/components/p-BjluhQMI.js +4 -0
  111. package/components/p-BlsIikdZ.js +4 -0
  112. package/components/p-BqPNzJf6.js +4 -0
  113. package/components/p-BrD9Xv62.js +4 -0
  114. package/components/p-BvJqoZ5R.js +4 -0
  115. package/components/p-Bz6z3Asd.js +4 -0
  116. package/components/p-C5KYjZWD.js +4 -0
  117. package/components/p-C6HnVvHO.js +4 -0
  118. package/components/p-C7jvh5Wy.js +4 -0
  119. package/components/p-C9BGR5fy.js +4 -0
  120. package/components/p-CB-y1CdP.js +4 -0
  121. package/components/p-CEW4RXZO.js +4 -0
  122. package/components/p-CHH3loEE.js +4 -0
  123. package/components/p-CJKUWjmg.js +4 -0
  124. package/components/{p-qMmFisyx.js → p-CMLAwl_N.js} +1 -1
  125. package/components/{p-C7II1iDj.js → p-C_phlPMC.js} +1 -1
  126. package/components/p-CbhUdtjf.js +4 -0
  127. package/components/p-CejmQs3h.js +4 -0
  128. package/components/p-CtZqa4HM.js +4 -0
  129. package/components/p-D7-vHX0A.js +4 -0
  130. package/components/p-D9qIVSWm.js +4 -0
  131. package/components/p-DD5fQ4EQ.js +4 -0
  132. package/components/p-DE-3iMNW.js +4 -0
  133. package/components/p-DFvZn99E.js +4 -0
  134. package/components/p-DHFt2rdc.js +4 -0
  135. package/components/p-DM-PrAoh.js +4 -0
  136. package/components/p-DSzSbVP2.js +4 -0
  137. package/components/{p--JUspHvy.js → p-DV85C0e0.js} +1 -1
  138. package/components/p-DWCzVL3Y.js +4 -0
  139. package/components/p-D_RCyzwu.js +4 -0
  140. package/components/p-D_tD8r3L.js +4 -0
  141. package/components/p-DaA_8eqt.js +4 -0
  142. package/components/p-DjCtLZbF.js +4 -0
  143. package/components/p-Dmd2xqCe.js +4 -0
  144. package/components/p-Dojwmvde.js +4 -0
  145. package/components/{p-BkKAANMJ.js → p-DwpKZ6rl.js} +1 -1
  146. package/components/p-DzRT60Tw.js +4 -0
  147. package/components/p-G0TxqHfe.js +4 -0
  148. package/components/p-G6JR-cr_.js +4 -0
  149. package/components/p-GG5GhznE.js +4 -0
  150. package/components/p-TXPDHL13.js +4 -0
  151. package/components/p-UIBJkZf8.js +4 -0
  152. package/components/p-_IKFD3ID.js +4 -0
  153. package/components/p-byZM6qHV.js +4 -0
  154. package/components/p-dKq2jIum.js +4 -0
  155. package/components/p-fruGqVHh.js +4 -0
  156. package/components/p-iYhH60Tc.js +4 -0
  157. package/components/p-ia3IDdJS.js +4 -0
  158. package/components/{p-DqLB8yFQ.js → p-ryyf_ItD.js} +1 -1
  159. package/dist/cjs/{animation-Ch16T-Nb.js → animation-C0mOHzej.js} +4 -4
  160. package/dist/cjs/{app-globals-Dd89e0MR.js → app-globals-BREG4twP.js} +1 -1
  161. package/dist/cjs/{button-active-AWp_ygDP.js → button-active-CVMevT9a.js} +3 -3
  162. package/dist/cjs/config-CjUbvdPW.js +36 -0
  163. package/dist/cjs/{dir-DD0jPVH3.js → dir-zwDPRE5K.js} +2 -3
  164. package/dist/cjs/{format-BUFWn4Bn.js → format-pp0Du3K-.js} +40 -30
  165. package/dist/cjs/{framework-delegate-CEzl4MEA.js → framework-delegate-Dfo5XsGv.js} +5 -7
  166. package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-BDUH7687.js} +15 -8
  167. package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
  168. package/dist/cjs/{hardware-back-button-CXmUnTJC.js → hardware-back-button-fqpYh-kd.js} +4 -4
  169. package/dist/cjs/{helpers-DdZyl6WL.js → helpers-YPQybDph.js} +4 -4
  170. package/dist/cjs/index-B7zJsYWS.js +429 -0
  171. package/dist/cjs/{index-CukZnH1U.js → index-BLdJCcJY.js} +5 -5
  172. package/dist/cjs/{index-MWAIyVLl.js → index-DDg31ZF5.js} +3 -3
  173. package/dist/cjs/{index-DOiZqxWZ.js → index-DXsPSne6.js} +6 -7
  174. package/dist/cjs/{index-BJ2-LydH.js → index-DwlRtFZe.js} +9 -3
  175. package/dist/cjs/{index-BfaXsATC.js → index-uvry__L4.js} +31 -14
  176. package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
  177. package/dist/cjs/{index-CD92bI7B.js → index-zVCah4Uz.js} +2 -2
  178. package/dist/cjs/index.cjs.js +19 -19
  179. package/dist/cjs/{input-shims-CPKgrIe3.js → input-shims-Cbu1fcye.js} +10 -12
  180. package/dist/cjs/input.utils-BZdMWVrt.js +35 -0
  181. package/dist/cjs/ion-accordion_2.cjs.entry.js +369 -341
  182. package/dist/cjs/ion-action-sheet.cjs.entry.js +188 -77
  183. package/dist/cjs/ion-alert.cjs.entry.js +274 -112
  184. package/dist/cjs/ion-app_8.cjs.entry.js +307 -190
  185. package/dist/cjs/ion-avatar_3.cjs.entry.js +10 -4
  186. package/dist/cjs/ion-back-button.cjs.entry.js +48 -24
  187. package/dist/cjs/ion-backdrop.cjs.entry.js +18 -14
  188. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +200 -122
  189. package/dist/cjs/ion-button_2.cjs.entry.js +139 -67
  190. package/dist/cjs/ion-card_5.cjs.entry.js +83 -31
  191. package/dist/cjs/ion-checkbox.cjs.entry.js +153 -102
  192. package/dist/cjs/ion-chip.cjs.entry.js +17 -11
  193. package/dist/cjs/ion-col_3.cjs.entry.js +134 -10
  194. package/dist/cjs/ion-datetime-button.cjs.entry.js +254 -242
  195. package/dist/cjs/ion-datetime.cjs.entry.js +2770 -0
  196. package/dist/cjs/ion-fab_3.cjs.entry.js +140 -82
  197. package/dist/cjs/ion-img.cjs.entry.js +35 -13
  198. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +101 -73
  199. package/dist/cjs/ion-input-otp.cjs.entry.js +435 -372
  200. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +36 -22
  201. package/dist/cjs/ion-input.cjs.entry.js +343 -212
  202. package/dist/cjs/ion-item-option_3.cjs.entry.js +95 -55
  203. package/dist/cjs/ion-item_8.cjs.entry.js +192 -93
  204. package/dist/cjs/ion-loading.cjs.entry.js +147 -61
  205. package/dist/cjs/ion-menu_3.cjs.entry.js +169 -107
  206. package/dist/cjs/ion-modal.cjs.entry.js +456 -262
  207. package/dist/cjs/ion-nav_2.cjs.entry.js +102 -159
  208. package/dist/cjs/ion-picker-column-option.cjs.entry.js +38 -34
  209. package/dist/cjs/ion-picker-column.cjs.entry.js +418 -406
  210. package/dist/cjs/ion-picker.cjs.entry.js +402 -393
  211. package/dist/cjs/ion-popover.cjs.entry.js +320 -206
  212. package/dist/cjs/ion-progress-bar.cjs.entry.js +32 -26
  213. package/dist/cjs/ion-radio_2.cjs.entry.js +208 -135
  214. package/dist/cjs/ion-range.cjs.entry.js +304 -239
  215. package/dist/cjs/ion-refresher_2.cjs.entry.js +166 -94
  216. package/dist/cjs/ion-reorder_2.cjs.entry.js +54 -24
  217. package/dist/cjs/ion-ripple-effect.cjs.entry.js +14 -14
  218. package/dist/cjs/ion-route_4.cjs.entry.js +176 -72
  219. package/dist/cjs/ion-searchbar.cjs.entry.js +291 -200
  220. package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
  221. package/dist/cjs/ion-segment-view.cjs.entry.js +28 -17
  222. package/dist/cjs/ion-segment_2.cjs.entry.js +169 -126
  223. package/dist/cjs/ion-select-modal.cjs.entry.js +105 -49
  224. package/dist/cjs/ion-select_3.cjs.entry.js +787 -260
  225. package/dist/cjs/ion-spinner.cjs.entry.js +24 -10
  226. package/dist/cjs/ion-split-pane.cjs.entry.js +29 -16
  227. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +101 -42
  228. package/dist/cjs/ion-tab_2.cjs.entry.js +54 -28
  229. package/dist/cjs/ion-text.cjs.entry.js +11 -5
  230. package/dist/cjs/ion-textarea.cjs.entry.js +296 -189
  231. package/dist/cjs/ion-toast.cjs.entry.js +237 -118
  232. package/dist/cjs/ion-toggle.cjs.entry.js +175 -122
  233. package/dist/cjs/{ionic-global-BerQGEpE.js → ionic-global-k6hOWWpn.js} +13 -8
  234. package/dist/cjs/ionic.cjs.js +4 -4
  235. package/dist/cjs/{ios.transition-CTiTDh3m.js → ios.transition-zTmJz8T-.js} +14 -18
  236. package/dist/cjs/{item-multiple-inputs-jOJZE_I0.js → item-multiple-inputs-BdYSbfKN.js} +1 -1
  237. package/dist/cjs/{keyboard-hHzlEQpk.js → keyboard-Cix5TVkD.js} +2 -2
  238. package/dist/cjs/{keyboard-UuAS4D_9.js → keyboard-cHxZlTyz.js} +2 -2
  239. package/dist/cjs/{keyboard-controller-GXBiBRKS.js → keyboard-controller-PtZoN2GS.js} +6 -6
  240. package/dist/cjs/loader.cjs.js +4 -4
  241. package/dist/cjs/{md.transition-BpiTAaqF.js → md.transition-nb_4pUXu.js} +8 -9
  242. package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
  243. package/dist/cjs/{overlays-CQ_c1fko.js → overlays-KaNVDNqC.js} +48 -33
  244. package/dist/cjs/select-option-render-pULCGldr.js +123 -0
  245. package/dist/cjs/slot-mutation-controller-DPHmqXdV.js +397 -0
  246. package/dist/cjs/{status-tap-7FzRlXNr.js → status-tap-o9IIymsP.js} +4 -4
  247. package/dist/cjs/{swipe-back-DwTZiAc9.js → swipe-back-B7X9VOlH.js} +5 -5
  248. package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
  249. package/dist/collection/collection-manifest.json +6 -10
  250. package/dist/collection/components/accordion/accordion.js +315 -312
  251. package/dist/collection/components/accordion-group/accordion-group.js +48 -25
  252. package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
  253. package/dist/collection/components/action-sheet/action-sheet.js +173 -64
  254. package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
  255. package/dist/collection/components/action-sheet/test/basic/fixture.js +3 -0
  256. package/dist/collection/components/alert/alert.ios.css +279 -10
  257. package/dist/collection/components/alert/alert.js +257 -97
  258. package/dist/collection/components/alert/alert.md.css +268 -20
  259. package/dist/collection/components/app/app.js +3 -0
  260. package/dist/collection/components/back-button/back-button.js +42 -19
  261. package/dist/collection/components/backdrop/backdrop.js +16 -14
  262. package/dist/collection/components/badge/badge.js +6 -0
  263. package/dist/collection/components/breadcrumb/breadcrumb.js +91 -30
  264. package/dist/collection/components/breadcrumbs/breadcrumbs.js +103 -88
  265. package/dist/collection/components/button/button.js +132 -61
  266. package/dist/collection/components/buttons/buttons.js +13 -15
  267. package/dist/collection/components/card/card.js +54 -21
  268. package/dist/collection/components/card-header/card-header.js +12 -8
  269. package/dist/collection/components/card-subtitle/card-subtitle.js +6 -0
  270. package/dist/collection/components/card-title/card-title.js +6 -0
  271. package/dist/collection/components/checkbox/checkbox.js +147 -97
  272. package/dist/collection/components/chip/chip.js +14 -10
  273. package/dist/collection/components/col/col.js +127 -3
  274. package/dist/collection/components/content/content.js +93 -64
  275. package/dist/collection/components/datetime/datetime.ios.css +42 -2
  276. package/dist/collection/components/datetime/datetime.js +1042 -807
  277. package/dist/collection/components/datetime/datetime.md.css +42 -1
  278. package/dist/collection/components/datetime/utils/data.js +13 -14
  279. package/dist/collection/components/datetime/utils/format.js +21 -11
  280. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  281. package/dist/collection/components/datetime/utils/parse.js +10 -10
  282. package/dist/collection/components/datetime/utils/state.js +8 -2
  283. package/dist/collection/components/datetime/utils/validate.js +4 -5
  284. package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
  285. package/dist/collection/components/datetime-button/datetime-button.js +247 -237
  286. package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
  287. package/dist/collection/components/fab/fab.js +20 -13
  288. package/dist/collection/components/fab-button/fab-button.js +104 -55
  289. package/dist/collection/components/fab-list/fab-list.js +10 -11
  290. package/dist/collection/components/footer/footer.js +50 -44
  291. package/dist/collection/components/grid/grid.js +4 -6
  292. package/dist/collection/components/header/header.js +35 -25
  293. package/dist/collection/components/img/img.js +34 -10
  294. package/dist/collection/components/infinite-scroll/infinite-scroll.js +73 -66
  295. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +20 -3
  296. package/dist/collection/components/input/input.ios.css +57 -26
  297. package/dist/collection/components/input/input.js +336 -206
  298. package/dist/collection/components/input/input.md.css +79 -43
  299. package/dist/collection/components/input-otp/input-otp.js +430 -368
  300. package/dist/collection/components/input-password-toggle/input-password-toggle.js +32 -19
  301. package/dist/collection/components/item/item.js +99 -53
  302. package/dist/collection/components/item-divider/item-divider.js +17 -12
  303. package/dist/collection/components/item-group/item-group.js +1 -1
  304. package/dist/collection/components/item-option/item-option.js +50 -22
  305. package/dist/collection/components/item-options/item-options.js +11 -8
  306. package/dist/collection/components/item-sliding/item-sliding.js +27 -21
  307. package/dist/collection/components/label/label.js +26 -6
  308. package/dist/collection/components/list/list.js +11 -8
  309. package/dist/collection/components/list-header/list-header.js +12 -2
  310. package/dist/collection/components/loading/loading.js +135 -51
  311. package/dist/collection/components/menu/menu.js +103 -61
  312. package/dist/collection/components/menu-button/menu-button.js +30 -21
  313. package/dist/collection/components/menu-toggle/menu-toggle.js +22 -15
  314. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  315. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  316. package/dist/collection/components/modal/gestures/sheet.js +22 -10
  317. package/dist/collection/components/modal/gestures/swipe-to-close.js +15 -3
  318. package/dist/collection/components/modal/modal.js +398 -228
  319. package/dist/collection/components/modal/safe-area-utils.js +6 -7
  320. package/dist/collection/components/modal/test/fixtures.js +3 -0
  321. package/dist/collection/components/nav/nav.js +69 -247
  322. package/dist/collection/components/nav/view-controller.js +7 -1
  323. package/dist/collection/components/nav-link/nav-link.js +21 -10
  324. package/dist/collection/components/note/note.js +8 -2
  325. package/dist/collection/components/picker/picker.js +398 -390
  326. package/dist/collection/components/picker-column/picker-column.css +3 -0
  327. package/dist/collection/components/picker-column/picker-column.js +414 -404
  328. package/dist/collection/components/picker-column-option/picker-column-option.js +33 -31
  329. package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
  330. package/dist/collection/components/popover/animations/ios.enter.js +1 -2
  331. package/dist/collection/components/popover/animations/md.enter.js +1 -2
  332. package/dist/collection/components/popover/popover.ios.css +15 -0
  333. package/dist/collection/components/popover/popover.js +302 -185
  334. package/dist/collection/components/popover/popover.md.css +15 -0
  335. package/dist/collection/components/popover/test/fixture.js +1 -0
  336. package/dist/collection/components/popover/utils.js +4 -6
  337. package/dist/collection/components/progress-bar/progress-bar.js +27 -23
  338. package/dist/collection/components/radio/radio.js +102 -66
  339. package/dist/collection/components/radio-group/radio-group.js +101 -66
  340. package/dist/collection/components/radio-group/test/fixtures.js +2 -0
  341. package/dist/collection/components/range/range.js +298 -234
  342. package/dist/collection/components/refresher/refresher.js +110 -78
  343. package/dist/collection/components/refresher-content/refresher-content.js +41 -4
  344. package/dist/collection/components/reorder/reorder.js +2 -1
  345. package/dist/collection/components/reorder-group/reorder-group.js +44 -15
  346. package/dist/collection/components/ripple-effect/ripple-effect.js +12 -13
  347. package/dist/collection/components/route/route.js +39 -10
  348. package/dist/collection/components/route-redirect/route-redirect.js +31 -0
  349. package/dist/collection/components/router/router.js +37 -33
  350. package/dist/collection/components/router/utils/dom.js +25 -7
  351. package/dist/collection/components/router/utils/matching.js +7 -9
  352. package/dist/collection/components/router/utils/parser.js +1 -1
  353. package/dist/collection/components/router/utils/path.js +0 -1
  354. package/dist/collection/components/router-link/router-link.js +37 -12
  355. package/dist/collection/components/router-outlet/router-outlet.js +82 -21
  356. package/dist/collection/components/row/row.js +1 -1
  357. package/dist/collection/components/searchbar/searchbar.js +289 -199
  358. package/dist/collection/components/segment/segment.js +120 -85
  359. package/dist/collection/components/segment-button/segment-button.js +43 -37
  360. package/dist/collection/components/segment-content/segment-content.js +1 -1
  361. package/dist/collection/components/segment-view/segment-view.js +26 -16
  362. package/dist/collection/components/select/select.ios.css +96 -69
  363. package/dist/collection/components/select/select.js +629 -213
  364. package/dist/collection/components/select/select.md.css +118 -85
  365. package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
  366. package/dist/collection/components/select-modal/select-modal.js +92 -38
  367. package/dist/collection/components/select-modal/select-modal.md.css +164 -0
  368. package/dist/collection/components/select-modal/test/fixtures.js +8 -1
  369. package/dist/collection/components/select-option/select-option.js +110 -9
  370. package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
  371. package/dist/collection/components/select-popover/select-popover.js +103 -36
  372. package/dist/collection/components/select-popover/select-popover.md.css +164 -0
  373. package/dist/collection/components/select-popover/test/fixtures.js +8 -1
  374. package/dist/collection/components/skeleton-text/skeleton-text.js +12 -8
  375. package/dist/collection/components/spinner/spinner.js +21 -9
  376. package/dist/collection/components/split-pane/split-pane.js +27 -15
  377. package/dist/collection/components/tab/tab.js +17 -6
  378. package/dist/collection/components/tab-bar/tab-bar.js +32 -14
  379. package/dist/collection/components/tab-button/tab-button.js +62 -23
  380. package/dist/collection/components/tabs/tabs.js +33 -20
  381. package/dist/collection/components/text/text.js +8 -2
  382. package/dist/collection/components/textarea/textarea.ios.css +94 -62
  383. package/dist/collection/components/textarea/textarea.js +287 -181
  384. package/dist/collection/components/textarea/textarea.md.css +103 -77
  385. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  386. package/dist/collection/components/title/title.js +18 -2
  387. package/dist/collection/components/toast/toast.js +223 -106
  388. package/dist/collection/components/toggle/toggle.js +167 -115
  389. package/dist/collection/components/toolbar/toolbar.js +15 -7
  390. package/dist/collection/global/config.js +4 -6
  391. package/dist/collection/global/ionic-global.js +8 -2
  392. package/dist/collection/index.js +1 -1
  393. package/dist/collection/utils/animation/animation.js +3 -3
  394. package/dist/collection/utils/config.js +5 -4
  395. package/dist/collection/utils/focus-controller/index.js +1 -1
  396. package/dist/collection/utils/focus-trap.js +3 -3
  397. package/dist/collection/utils/forms/index.js +1 -0
  398. package/dist/collection/utils/forms/start-container-controller.js +132 -0
  399. package/dist/collection/utils/framework-delegate.js +4 -6
  400. package/dist/collection/utils/gesture/gesture-controller.js +15 -8
  401. package/dist/collection/utils/gesture/index.js +10 -2
  402. package/dist/collection/utils/hardware-back-button.js +3 -3
  403. package/dist/collection/utils/helpers.js +2 -2
  404. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  405. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  406. package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
  407. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  408. package/dist/collection/utils/logging/index.js +23 -4
  409. package/dist/collection/utils/menu-controller/index.js +1 -2
  410. package/dist/collection/utils/native/haptic.js +2 -3
  411. package/dist/collection/utils/native/keyboard.js +2 -2
  412. package/dist/collection/utils/native/status-bar.js +1 -1
  413. package/dist/collection/utils/overlay-control-label.js +45 -0
  414. package/dist/collection/utils/overlays.js +38 -23
  415. package/dist/collection/utils/platform.js +4 -5
  416. package/dist/collection/utils/rtl/dir.js +2 -3
  417. package/dist/collection/utils/sanitization/index.js +276 -20
  418. package/dist/collection/utils/select-option-render.js +118 -0
  419. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  420. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
  421. package/dist/collection/utils/test/playwright/drag-element.js +2 -3
  422. package/dist/collection/utils/test/playwright/generator.js +3 -4
  423. package/dist/collection/utils/test/playwright/page/event-spy.js +11 -12
  424. package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
  425. package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
  426. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  427. package/dist/collection/utils/test/press-keys.js +10 -17
  428. package/dist/collection/utils/theme.js +6 -1
  429. package/dist/collection/utils/transition/ios.transition.js +9 -13
  430. package/dist/collection/utils/transition/md.transition.js +3 -4
  431. package/dist/docs.json +557 -1257
  432. package/dist/esm/{animation-DLJpuoEz.js → animation-CGFdmGk9.js} +4 -4
  433. package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-CYmMeGdU.js} +1 -1
  434. package/dist/esm/{button-active-CXXy0FIE.js → button-active-BDOsVAiZ.js} +3 -3
  435. package/dist/esm/config-DWCzVL3Y.js +32 -0
  436. package/dist/esm/{dir-o8OKV5aD.js → dir-Dojwmvde.js} +2 -3
  437. package/dist/esm/{format-CAmvpAez.js → format-Dcwga61t.js} +41 -31
  438. package/dist/esm/{framework-delegate-B9yvYzqV.js → framework-delegate-BHTU2Ip9.js} +5 -7
  439. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-TXPDHL13.js} +15 -8
  440. package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
  441. package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-gLJHMX_F.js} +4 -4
  442. package/dist/esm/{helpers-DkCLSLI9.js → helpers-CAGf8Wgp.js} +4 -4
  443. package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
  444. package/dist/esm/index-CKM1DdGm.js +424 -0
  445. package/dist/esm/{index-tcQvqkiX.js → index-ChhhtsGZ.js} +32 -15
  446. package/dist/esm/{index-DwNKJodj.js → index-Clc-28O1.js} +3 -3
  447. package/dist/esm/{index-DdeElWma.js → index-CqneaaGd.js} +6 -7
  448. package/dist/esm/{index-Bck1OwMs.js → index-DcPaH5uL.js} +9 -3
  449. package/dist/esm/{index-B_8X7INq.js → index-T0JxBI8V.js} +2 -2
  450. package/dist/esm/{index-Dsz7OTeL.js → index-WlteAIqz.js} +5 -5
  451. package/dist/esm/index.js +17 -16
  452. package/dist/esm/{input-shims-d-hDv86G.js → input-shims-B8sfni1e.js} +10 -12
  453. package/dist/esm/input.utils-B1ValN_N.js +33 -0
  454. package/dist/esm/ion-accordion_2.entry.js +369 -341
  455. package/dist/esm/ion-action-sheet.entry.js +188 -77
  456. package/dist/esm/ion-alert.entry.js +273 -111
  457. package/dist/esm/ion-app_8.entry.js +307 -190
  458. package/dist/esm/ion-avatar_3.entry.js +10 -4
  459. package/dist/esm/ion-back-button.entry.js +48 -24
  460. package/dist/esm/ion-backdrop.entry.js +18 -14
  461. package/dist/esm/ion-breadcrumb_2.entry.js +200 -122
  462. package/dist/esm/ion-button_2.entry.js +139 -67
  463. package/dist/esm/ion-card_5.entry.js +83 -31
  464. package/dist/esm/ion-checkbox.entry.js +153 -102
  465. package/dist/esm/ion-chip.entry.js +17 -11
  466. package/dist/esm/ion-col_3.entry.js +134 -10
  467. package/dist/esm/ion-datetime-button.entry.js +254 -242
  468. package/dist/esm/ion-datetime.entry.js +2768 -0
  469. package/dist/esm/ion-fab_3.entry.js +140 -82
  470. package/dist/esm/ion-img.entry.js +35 -13
  471. package/dist/esm/ion-infinite-scroll_2.entry.js +100 -72
  472. package/dist/esm/ion-input-otp.entry.js +435 -372
  473. package/dist/esm/ion-input-password-toggle.entry.js +36 -22
  474. package/dist/esm/ion-input.entry.js +341 -210
  475. package/dist/esm/ion-item-option_3.entry.js +95 -55
  476. package/dist/esm/ion-item_8.entry.js +192 -93
  477. package/dist/esm/ion-loading.entry.js +146 -60
  478. package/dist/esm/ion-menu_3.entry.js +169 -107
  479. package/dist/esm/ion-modal.entry.js +456 -262
  480. package/dist/esm/ion-nav_2.entry.js +102 -159
  481. package/dist/esm/ion-picker-column-option.entry.js +38 -34
  482. package/dist/esm/ion-picker-column.entry.js +418 -406
  483. package/dist/esm/ion-picker.entry.js +402 -393
  484. package/dist/esm/ion-popover.entry.js +320 -206
  485. package/dist/esm/ion-progress-bar.entry.js +32 -26
  486. package/dist/esm/ion-radio_2.entry.js +208 -135
  487. package/dist/esm/ion-range.entry.js +304 -239
  488. package/dist/esm/ion-refresher_2.entry.js +164 -92
  489. package/dist/esm/ion-reorder_2.entry.js +54 -24
  490. package/dist/esm/ion-ripple-effect.entry.js +14 -14
  491. package/dist/esm/ion-route_4.entry.js +176 -72
  492. package/dist/esm/ion-searchbar.entry.js +291 -200
  493. package/dist/esm/ion-segment-content.entry.js +2 -2
  494. package/dist/esm/ion-segment-view.entry.js +28 -17
  495. package/dist/esm/ion-segment_2.entry.js +169 -126
  496. package/dist/esm/ion-select-modal.entry.js +105 -49
  497. package/dist/esm/ion-select_3.entry.js +787 -260
  498. package/dist/esm/ion-spinner.entry.js +24 -10
  499. package/dist/esm/ion-split-pane.entry.js +29 -16
  500. package/dist/esm/ion-tab-bar_2.entry.js +101 -42
  501. package/dist/esm/ion-tab_2.entry.js +54 -28
  502. package/dist/esm/ion-text.entry.js +11 -5
  503. package/dist/esm/ion-textarea.entry.js +295 -188
  504. package/dist/esm/ion-toast.entry.js +236 -117
  505. package/dist/esm/ion-toggle.entry.js +175 -122
  506. package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-BVB7BrLT.js} +13 -8
  507. package/dist/esm/ionic.js +5 -5
  508. package/dist/esm/{ios.transition-CxNhMt4a.js → ios.transition-DXRCmcbC.js} +14 -18
  509. package/dist/esm/{item-multiple-inputs-DlNuqNJm.js → item-multiple-inputs-rU8VaNNg.js} +1 -1
  510. package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
  511. package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
  512. package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
  513. package/dist/esm/loader.js +5 -5
  514. package/dist/esm/{md.transition-IE4mC3kp.js → md.transition-BMngO4i_.js} +8 -9
  515. package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
  516. package/dist/esm/{overlays-COCl_nm9.js → overlays-CPmIs9Ls.js} +48 -33
  517. package/dist/esm/select-option-render-C4m76VGH.js +121 -0
  518. package/dist/esm/slot-mutation-controller-DiE_C9un.js +393 -0
  519. package/dist/esm/{status-tap-HhO5eQI9.js → status-tap-CHB7KwIb.js} +4 -4
  520. package/dist/esm/{swipe-back-DK6afpuO.js → swipe-back-C9HW1bug.js} +5 -5
  521. package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
  522. package/dist/html.html-data.json +52 -80
  523. package/dist/ionic/index.esm.js +1 -1
  524. package/dist/ionic/ionic.esm.js +1 -1
  525. package/dist/ionic/p-06ec7136.entry.js +4 -0
  526. package/dist/ionic/p-09fe4fa3.entry.js +4 -0
  527. package/dist/ionic/p-10d45a07.entry.js +4 -0
  528. package/dist/ionic/p-208c8a07.entry.js +4 -0
  529. package/dist/ionic/p-212474fa.entry.js +4 -0
  530. package/dist/ionic/p-2eef1396.entry.js +4 -0
  531. package/dist/ionic/p-347e005d.entry.js +4 -0
  532. package/dist/ionic/p-3a0b3f1d.entry.js +4 -0
  533. package/dist/ionic/p-3b071259.entry.js +4 -0
  534. package/dist/ionic/{p-c6e49f3f.entry.js → p-40424a88.entry.js} +1 -1
  535. package/dist/ionic/p-4204184c.entry.js +4 -0
  536. package/dist/ionic/p-47464391.entry.js +4 -0
  537. package/dist/ionic/p-4eOQC00Z.js +4 -0
  538. package/dist/ionic/p-4f9c9126.entry.js +4 -0
  539. package/dist/ionic/p-5JsKPLJD.js +4 -0
  540. package/dist/ionic/p-5bc485c6.entry.js +4 -0
  541. package/dist/ionic/p-603a61e6.entry.js +4 -0
  542. package/dist/ionic/p-60576951.entry.js +4 -0
  543. package/dist/ionic/p-67a81d33.entry.js +4 -0
  544. package/dist/ionic/p-6affb775.entry.js +4 -0
  545. package/dist/ionic/p-6f120c25.entry.js +4 -0
  546. package/dist/ionic/p-71c82b60.entry.js +4 -0
  547. package/dist/ionic/p-79325ffe.entry.js +4 -0
  548. package/dist/ionic/{p-DZaO33Mw.js → p-7CBuOvEo.js} +1 -1
  549. package/dist/ionic/p-7e4d51fa.entry.js +4 -0
  550. package/dist/ionic/p-7f5d4664.entry.js +4 -0
  551. package/dist/ionic/p-80ee82fc.entry.js +4 -0
  552. package/dist/ionic/p-84af7dbc.entry.js +4 -0
  553. package/dist/ionic/p-89ca830a.entry.js +4 -0
  554. package/dist/ionic/p-93b8ec8f.entry.js +4 -0
  555. package/dist/ionic/p-946f65c2.entry.js +4 -0
  556. package/dist/ionic/p-9c4b39fb.entry.js +4 -0
  557. package/dist/ionic/p-B1NEZUzQ.js +4 -0
  558. package/dist/ionic/p-B1ck5iy-.js +4 -0
  559. package/dist/ionic/{p-Cd4H8ft-.js → p-B4FrqdW0.js} +1 -1
  560. package/dist/ionic/p-BB0LlG4y.js +4 -0
  561. package/dist/ionic/p-BMPN55of.js +4 -0
  562. package/dist/ionic/p-BSQPZ79H.js +4 -0
  563. package/dist/ionic/p-BYEAtHr-.js +4 -0
  564. package/dist/ionic/p-BhamHSw3.js +4 -0
  565. package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
  566. package/dist/ionic/p-C-94tAim.js +4 -0
  567. package/dist/ionic/{p-DipZFfzN.js → p-C-eHZMYE.js} +1 -1
  568. package/dist/ionic/p-CBR_W98Z.js +4 -0
  569. package/dist/ionic/{p-ClM02LPk.js → p-CBWAXjA5.js} +1 -1
  570. package/dist/ionic/p-CMRtMbJc.js +4 -0
  571. package/dist/ionic/p-CPcPmkGv.js +4 -0
  572. package/dist/ionic/p-CaRuIadB.js +4 -0
  573. package/dist/ionic/p-Cdjxf_yg.js +4 -0
  574. package/dist/ionic/p-ChhhtsGZ.js +5 -0
  575. package/dist/ionic/p-CzS1qWve.js +4 -0
  576. package/dist/ionic/p-D5t_-oMk.js +4 -0
  577. package/dist/ionic/p-D94_RztK.js +4 -0
  578. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  579. package/dist/ionic/p-DjjfauRM.js +4 -0
  580. package/dist/ionic/p-DkUB-ROc.js +4 -0
  581. package/dist/ionic/p-Dn0mqQ_R.js +4 -0
  582. package/dist/ionic/p-Dojwmvde.js +4 -0
  583. package/dist/ionic/p-DplOqGUv.js +4 -0
  584. package/dist/ionic/p-Dst_XmZh.js +4 -0
  585. package/dist/ionic/p-T71k3C35.js +4 -0
  586. package/dist/ionic/p-TXPDHL13.js +4 -0
  587. package/dist/ionic/p-UIBJkZf8.js +4 -0
  588. package/dist/ionic/p-a438b193.entry.js +4 -0
  589. package/dist/ionic/p-babaaaa7.entry.js +4 -0
  590. package/dist/ionic/p-be08d500.entry.js +4 -0
  591. package/dist/ionic/p-be9a4f51.entry.js +4 -0
  592. package/dist/ionic/p-byZM6qHV.js +4 -0
  593. package/dist/ionic/p-c00d3092.entry.js +4 -0
  594. package/dist/ionic/p-c36dc8f5.entry.js +4 -0
  595. package/dist/ionic/p-c72a7e17.entry.js +4 -0
  596. package/dist/ionic/p-c8edd88c.entry.js +4 -0
  597. package/dist/ionic/p-ce0e380b.entry.js +4 -0
  598. package/dist/ionic/p-ce32912b.entry.js +4 -0
  599. package/dist/ionic/p-d07cf130.entry.js +4 -0
  600. package/dist/ionic/p-d27edeb3.entry.js +4 -0
  601. package/dist/ionic/p-d5d2c506.entry.js +4 -0
  602. package/dist/ionic/p-d5e31ca9.entry.js +4 -0
  603. package/dist/ionic/p-de91444f.entry.js +4 -0
  604. package/dist/ionic/p-ded69ceb.entry.js +4 -0
  605. package/dist/ionic/p-df72866d.entry.js +4 -0
  606. package/dist/ionic/p-e47e3151.entry.js +4 -0
  607. package/dist/ionic/p-e621e5e8.entry.js +4 -0
  608. package/dist/ionic/p-eea9cf93.entry.js +4 -0
  609. package/dist/ionic/p-f402f5a4.entry.js +4 -0
  610. package/dist/ionic/p-fe1bfbcf.entry.js +4 -0
  611. package/{components/p-9GFIh9p1.js → dist/ionic/p-ffb90460.entry.js} +1 -1
  612. package/dist/types/components/img/img.d.ts +2 -0
  613. package/dist/types/components/input/input.d.ts +12 -6
  614. package/dist/types/components/modal/modal-interface.d.ts +9 -0
  615. package/dist/types/components/modal/modal.d.ts +11 -4
  616. package/dist/types/components/nav/nav-interface.d.ts +0 -1
  617. package/dist/types/components/nav/nav.d.ts +2 -22
  618. package/dist/types/components/route/route.d.ts +1 -1
  619. package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
  620. package/dist/types/components/searchbar/searchbar.d.ts +1 -1
  621. package/dist/types/components/select/select-interface.d.ts +31 -0
  622. package/dist/types/components/select/select.d.ts +30 -6
  623. package/dist/types/components/select-option/select-option.d.ts +42 -1
  624. package/dist/types/components/textarea/textarea.d.ts +12 -5
  625. package/dist/types/components.d.ts +74 -311
  626. package/dist/types/index.d.ts +1 -1
  627. package/dist/types/interface.d.ts +0 -1
  628. package/dist/types/utils/config.d.ts +1 -8
  629. package/dist/types/utils/forms/index.d.ts +1 -0
  630. package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
  631. package/dist/types/utils/logging/index.d.ts +2 -1
  632. package/dist/types/utils/overlay-control-label.d.ts +32 -0
  633. package/dist/types/utils/overlays.d.ts +11 -9
  634. package/dist/types/utils/sanitization/index.d.ts +58 -2
  635. package/dist/types/utils/select-option-render.d.ts +53 -0
  636. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  637. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  638. package/hydrate/index.js +10660 -7305
  639. package/hydrate/index.mjs +10660 -7305
  640. package/package.json +55 -12
  641. package/components/ion-picker-legacy-column.d.ts +0 -11
  642. package/components/ion-picker-legacy-column.js +0 -4
  643. package/components/ion-picker-legacy.d.ts +0 -11
  644. package/components/ion-picker-legacy.js +0 -4
  645. package/components/p-0LM2oPMC.js +0 -4
  646. package/components/p-B21528L5.js +0 -4
  647. package/components/p-B2nSfLHH.js +0 -4
  648. package/components/p-B3qf4bEn.js +0 -4
  649. package/components/p-B9jFTlwE.js +0 -4
  650. package/components/p-BDd9Zrb9.js +0 -4
  651. package/components/p-BLmJ0zRm.js +0 -4
  652. package/components/p-BMYNBJgf.js +0 -4
  653. package/components/p-BRYd8D-I.js +0 -4
  654. package/components/p-BSEgsdFI.js +0 -4
  655. package/components/p-BTEOs1at.js +0 -4
  656. package/components/p-BTJrYwxN.js +0 -4
  657. package/components/p-BV-zKay-.js +0 -4
  658. package/components/p-BYRVyMu9.js +0 -4
  659. package/components/p-Bmq8qlkW.js +0 -4
  660. package/components/p-BuxQcfHK.js +0 -4
  661. package/components/p-Bz0dSlXZ.js +0 -4
  662. package/components/p-CHqRYvYm.js +0 -4
  663. package/components/p-CSZf8_j0.js +0 -4
  664. package/components/p-CTdRooFV.js +0 -4
  665. package/components/p-Cf2jSDS8.js +0 -4
  666. package/components/p-Cfx4M1Bn.js +0 -4
  667. package/components/p-CgkrslTX.js +0 -4
  668. package/components/p-CiCzYG2V.js +0 -4
  669. package/components/p-Ck0lEczL.js +0 -4
  670. package/components/p-CmR5uXej.js +0 -4
  671. package/components/p-CniZht3v.js +0 -4
  672. package/components/p-CsaojgEs.js +0 -4
  673. package/components/p-CtWGkNnJ.js +0 -4
  674. package/components/p-D13Eaw-8.js +0 -4
  675. package/components/p-D4FYu-4R.js +0 -4
  676. package/components/p-D6Ynv7Xh.js +0 -4
  677. package/components/p-DARjq3GM.js +0 -4
  678. package/components/p-DEZ2myA3.js +0 -4
  679. package/components/p-DOFCbuQR.js +0 -4
  680. package/components/p-DVe41iHI.js +0 -4
  681. package/components/p-DX5m9g56.js +0 -4
  682. package/components/p-DboHi2CL.js +0 -4
  683. package/components/p-DiVJyqlX.js +0 -4
  684. package/components/p-DmzFY5IC.js +0 -4
  685. package/components/p-DqZAXv2t.js +0 -4
  686. package/components/p-Dv8w0kqz.js +0 -4
  687. package/components/p-Dw7GNDKq.js +0 -4
  688. package/components/p-Dww01PNs.js +0 -4
  689. package/components/p-Gy276IJk.js +0 -4
  690. package/components/p-ZzLXTvyt.js +0 -4
  691. package/components/p-cyNmxje6.js +0 -4
  692. package/components/p-j5IxBIan.js +0 -4
  693. package/components/p-k_E4tX5Z.js +0 -4
  694. package/components/p-lVAbdiAu.js +0 -4
  695. package/components/p-o8OKV5aD.js +0 -4
  696. package/components/p-rCa2eL0j.js +0 -4
  697. package/dist/cjs/config-D6C-KlA9.js +0 -201
  698. package/dist/cjs/input.utils-DQaUGGed.js +0 -150
  699. package/dist/cjs/ion-datetime_3.cjs.entry.js +0 -3167
  700. package/dist/cjs/notch-controller-aiy8aQb-.js +0 -155
  701. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  702. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  703. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  704. package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
  705. package/dist/collection/components/picker-legacy/picker.js +0 -890
  706. package/dist/collection/components/picker-legacy/picker.md.css +0 -287
  707. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
  708. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  709. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
  710. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  711. package/dist/esm/config-DQCONYYp.js +0 -195
  712. package/dist/esm/input.utils-Cd23Gdd1.js +0 -147
  713. package/dist/esm/ion-datetime_3.entry.js +0 -3163
  714. package/dist/esm/notch-controller-Doqis1td.js +0 -153
  715. package/dist/ionic/p-01f81ea5.entry.js +0 -4
  716. package/dist/ionic/p-0283ea73.entry.js +0 -4
  717. package/dist/ionic/p-02ecae65.entry.js +0 -4
  718. package/dist/ionic/p-0672f677.entry.js +0 -4
  719. package/dist/ionic/p-0c06fe60.entry.js +0 -4
  720. package/dist/ionic/p-0fa9c382.entry.js +0 -4
  721. package/dist/ionic/p-1af4d74c.entry.js +0 -4
  722. package/dist/ionic/p-1d7ef0d2.entry.js +0 -4
  723. package/dist/ionic/p-26f05d3a.entry.js +0 -4
  724. package/dist/ionic/p-27d30585.entry.js +0 -4
  725. package/dist/ionic/p-2bb2cb18.entry.js +0 -4
  726. package/dist/ionic/p-31e7bd05.entry.js +0 -4
  727. package/dist/ionic/p-32f53010.entry.js +0 -4
  728. package/dist/ionic/p-35eb8b5c.entry.js +0 -4
  729. package/dist/ionic/p-37e720da.entry.js +0 -4
  730. package/dist/ionic/p-3efa137b.entry.js +0 -4
  731. package/dist/ionic/p-432bd72c.entry.js +0 -4
  732. package/dist/ionic/p-47214c72.entry.js +0 -4
  733. package/dist/ionic/p-4e172429.entry.js +0 -4
  734. package/dist/ionic/p-5c3da84e.entry.js +0 -4
  735. package/dist/ionic/p-5d1da0a2.entry.js +0 -4
  736. package/dist/ionic/p-5d8082fe.entry.js +0 -4
  737. package/dist/ionic/p-613d3c43.entry.js +0 -4
  738. package/dist/ionic/p-616e4d4f.entry.js +0 -4
  739. package/dist/ionic/p-65d611b2.entry.js +0 -4
  740. package/dist/ionic/p-67806e3f.entry.js +0 -4
  741. package/dist/ionic/p-68cbb2fc.entry.js +0 -4
  742. package/dist/ionic/p-737ae9eb.entry.js +0 -4
  743. package/dist/ionic/p-7b0d6248.entry.js +0 -4
  744. package/dist/ionic/p-7e71e470.entry.js +0 -4
  745. package/dist/ionic/p-84d5ce05.entry.js +0 -4
  746. package/dist/ionic/p-85d49987.entry.js +0 -4
  747. package/dist/ionic/p-8945088b.entry.js +0 -4
  748. package/dist/ionic/p-8b155568.entry.js +0 -4
  749. package/dist/ionic/p-90267c4b.entry.js +0 -4
  750. package/dist/ionic/p-92ad8a67.entry.js +0 -4
  751. package/dist/ionic/p-9a97d4e0.entry.js +0 -4
  752. package/dist/ionic/p-9e4b0894.entry.js +0 -4
  753. package/dist/ionic/p-9eeaBrnk.js +0 -4
  754. package/dist/ionic/p-B2kaj8sx.js +0 -4
  755. package/dist/ionic/p-B4y7nxsg.js +0 -4
  756. package/dist/ionic/p-B8t9Ro6f.js +0 -4
  757. package/dist/ionic/p-BEOxsxBw.js +0 -4
  758. package/dist/ionic/p-BJ2NxSHp.js +0 -4
  759. package/dist/ionic/p-BLiL8g0v.js +0 -4
  760. package/dist/ionic/p-BTEOs1at.js +0 -4
  761. package/dist/ionic/p-BUFIpxKM.js +0 -4
  762. package/dist/ionic/p-BYRVyMu9.js +0 -4
  763. package/dist/ionic/p-C0eMdTCW.js +0 -4
  764. package/dist/ionic/p-CKvCXMs9.js +0 -4
  765. package/dist/ionic/p-CPTv7G9B.js +0 -4
  766. package/dist/ionic/p-CtWGkNnJ.js +0 -4
  767. package/dist/ionic/p-CxMyXUtt.js +0 -4
  768. package/dist/ionic/p-D13Eaw-8.js +0 -4
  769. package/dist/ionic/p-DCoy2elM.js +0 -4
  770. package/dist/ionic/p-DiVJyqlX.js +0 -4
  771. package/dist/ionic/p-DqN5EA2O.js +0 -4
  772. package/dist/ionic/p-Dr9fTCb1.js +0 -4
  773. package/dist/ionic/p-DzWaWHGc.js +0 -4
  774. package/dist/ionic/p-EkpneKVM.js +0 -4
  775. package/dist/ionic/p-Nqf6uvGh.js +0 -4
  776. package/dist/ionic/p-SNAkTDfm.js +0 -4
  777. package/dist/ionic/p-ab00b0d8.entry.js +0 -4
  778. package/dist/ionic/p-c2175309.entry.js +0 -4
  779. package/dist/ionic/p-c4b69d9b.entry.js +0 -4
  780. package/dist/ionic/p-c4d8641b.entry.js +0 -4
  781. package/dist/ionic/p-ce637936.entry.js +0 -4
  782. package/dist/ionic/p-da85e958.entry.js +0 -4
  783. package/dist/ionic/p-dfa8d673.entry.js +0 -4
  784. package/dist/ionic/p-e139357c.entry.js +0 -4
  785. package/dist/ionic/p-e7b7a7b1.entry.js +0 -4
  786. package/dist/ionic/p-f37ca594.entry.js +0 -4
  787. package/dist/ionic/p-f8dd336e.entry.js +0 -4
  788. package/dist/ionic/p-f9de757b.entry.js +0 -4
  789. package/dist/ionic/p-fe11cf51.entry.js +0 -4
  790. package/dist/ionic/p-mjKAFv89.js +0 -4
  791. package/dist/ionic/p-o8OKV5aD.js +0 -4
  792. package/dist/ionic/p-tcQvqkiX.js +0 -5
  793. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  794. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  795. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  796. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  797. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  798. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  799. /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
@@ -54,779 +54,143 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./ut
54
54
  * @part datetime-selected-date - The element that contains the selected date.
55
55
  */
56
56
  export class Datetime {
57
- constructor() {
58
- this.inputId = `ion-dt-${datetimeIds++}`;
59
- /**
60
- * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
61
- * synthetic "not intersecting" entry IntersectionObserver fires on
62
- * `observe()` when the host mounts offscreen.
63
- *
64
- * Don't reset this in `disconnectedCallback`. Overlays disconnect and
65
- * reconnect the host without re-creating the observers, so a reset there
66
- * makes `hiddenCallback` miss the dismissal.
67
- */
68
- this.hasBeenIntersecting = false;
69
- this.prevPresentation = null;
70
- this.showMonthAndYear = false;
71
- this.activeParts = [];
72
- this.workingParts = {
73
- month: 5,
74
- day: 28,
75
- year: 2021,
76
- hour: 13,
77
- minute: 52,
78
- ampm: 'pm',
79
- isAdjacentDay: false,
80
- };
81
- this.isTimePopoverOpen = false;
82
- /**
83
- * The color to use from your application's color palette.
84
- * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
85
- * For more information on colors, refer to [theming](/docs/theming/basics).
86
- */
87
- this.color = 'primary';
88
- /**
89
- * The name of the control, which is submitted with the form data.
90
- */
91
- this.name = this.inputId;
92
- /**
93
- * If `true`, the user cannot interact with the datetime.
94
- */
95
- this.disabled = false;
96
- /**
97
- * If `true`, the datetime appears normal but the selected date cannot be changed.
98
- */
99
- this.readonly = false;
100
- /**
101
- * If `true`, the datetime calendar displays a six-week (42-day) layout,
102
- * including days from the previous and next months to fill the grid.
103
- * These adjacent days are selectable unless disabled.
104
- */
105
- this.showAdjacentDays = false;
106
- /**
107
- * Which values you want to select. `"date"` will show
108
- * a calendar picker to select the month, day, and year. `"time"`
109
- * will show a time picker to select the hour, minute, and (optionally)
110
- * AM/PM. `"date-time"` will show the date picker first and time picker second.
111
- * `"time-date"` will show the time picker first and date picker second.
112
- */
113
- this.presentation = 'date-time';
114
- /**
115
- * The text to display on the picker's cancel button.
116
- */
117
- this.cancelText = 'Cancel';
118
- /**
119
- * The text to display on the picker's "Done" button.
120
- */
121
- this.doneText = 'Done';
122
- /**
123
- * The text to display on the picker's "Clear" button.
124
- */
125
- this.clearText = 'Clear';
126
- /**
127
- * The locale to use for `ion-datetime`. This
128
- * impacts month and day name formatting.
129
- * The `"default"` value refers to the default
130
- * locale set by your device.
131
- */
132
- this.locale = 'default';
133
- /**
134
- * The first day of the week to use for `ion-datetime`. The
135
- * default value is `0` and represents Sunday.
136
- */
137
- this.firstDayOfWeek = 0;
138
- /**
139
- * If `true`, multiple dates can be selected at once. Only
140
- * applies to `presentation="date"` and `preferWheel="false"`.
141
- */
142
- this.multiple = false;
143
- /**
144
- * If `true`, a header will be shown above the calendar
145
- * picker. This will include both the slotted title, and
146
- * the selected date.
147
- */
148
- this.showDefaultTitle = false;
149
- /**
150
- * If `true`, the default "Cancel" and "OK" buttons
151
- * will be rendered at the bottom of the `ion-datetime`
152
- * component. Developers can also use the `button` slot
153
- * if they want to customize these buttons. If custom
154
- * buttons are set in the `button` slot then the
155
- * default buttons will not be rendered.
156
- */
157
- this.showDefaultButtons = false;
158
- /**
159
- * If `true`, a "Clear" button will be rendered alongside
160
- * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
161
- * component. Developers can also use the `button` slot
162
- * if they want to customize these buttons. If custom
163
- * buttons are set in the `button` slot then the
164
- * default buttons will not be rendered.
165
- */
166
- this.showClearButton = false;
167
- /**
168
- * If `true`, the default "Time" label will be rendered
169
- * for the time selector of the `ion-datetime` component.
170
- * Developers can also use the `time-label` slot
171
- * if they want to customize this label. If a custom
172
- * label is set in the `time-label` slot then the
173
- * default label will not be rendered.
174
- */
175
- this.showDefaultTimeLabel = true;
176
- /**
177
- * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
178
- * If `fixed`, the `ion-datetime` will have a fixed width.
179
- */
180
- this.size = 'fixed';
181
- /**
182
- * If `true`, a wheel picker will be rendered instead of a calendar grid
183
- * where possible. If `false`, a calendar grid will be rendered instead of
184
- * a wheel picker where possible.
185
- *
186
- * A wheel picker can be rendered instead of a grid when `presentation` is
187
- * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
188
- *
189
- * A wheel picker will always be rendered regardless of
190
- * the `preferWheel` value when `presentation` is one of the following values:
191
- * `"time"`, `"month"`, `"month-year"`, or `"year"`.
192
- */
193
- this.preferWheel = false;
194
- this.warnIfIncorrectValueUsage = () => {
195
- const { multiple, value } = this;
196
- if (!multiple && Array.isArray(value)) {
197
- /**
198
- * We do some processing on the `value` array so
199
- * that it looks more like an array when logged to
200
- * the console.
201
- * Example given ['a', 'b']
202
- * Default toString() behavior: a,b
203
- * Custom behavior: ['a', 'b']
204
- */
205
- printIonWarning(`[ion-datetime] - An array of values was passed, but multiple is "false". This is incorrect usage and may result in unexpected behaviors. To dismiss this warning, pass a string to the "value" property when multiple="false".
206
-
207
- Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
208
- `, this.el);
209
- }
210
- };
211
- this.setValue = (value) => {
212
- this.value = value;
213
- this.ionChange.emit({ value });
214
- };
215
- /**
216
- * Returns the DatetimePart interface
217
- * to use when rendering an initial set of
218
- * data. This should be used when rendering an
219
- * interface in an environment where the `value`
220
- * may not be set. This function works
221
- * by returning the first selected date and then
222
- * falling back to defaultParts if no active date
223
- * is selected.
224
- */
225
- this.getActivePartsWithFallback = () => {
226
- var _a;
227
- const { defaultParts } = this;
228
- return (_a = this.getActivePart()) !== null && _a !== void 0 ? _a : defaultParts;
229
- };
230
- this.getActivePart = () => {
231
- const { activeParts } = this;
232
- return Array.isArray(activeParts) ? activeParts[0] : activeParts;
233
- };
234
- this.closeParentOverlay = (role) => {
235
- const popoverOrModal = this.el.closest('ion-modal, ion-popover');
236
- if (popoverOrModal) {
237
- popoverOrModal.dismiss(undefined, role);
238
- }
239
- };
240
- this.setWorkingParts = (parts) => {
241
- this.workingParts = Object.assign({}, parts);
242
- };
243
- this.setActiveParts = (parts, removeDate = false) => {
244
- /** if the datetime component is in readonly mode,
245
- * allow browsing of the calendar without changing
246
- * the set value
247
- */
248
- if (this.readonly) {
249
- return;
250
- }
251
- const { multiple, minParts, maxParts, activeParts } = this;
252
- /**
253
- * When setting the active parts, it is possible
254
- * to set invalid data. For example,
255
- * when updating January 31 to February,
256
- * February 31 does not exist. As a result
257
- * we need to validate the active parts and
258
- * ensure that we are only setting valid dates.
259
- * Additionally, we need to update the working parts
260
- * too in the event that the validated parts are different.
261
- */
262
- const validatedParts = validateParts(parts, minParts, maxParts);
263
- this.setWorkingParts(validatedParts);
264
- if (multiple) {
265
- const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
266
- if (removeDate) {
267
- this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
268
- }
269
- else {
270
- this.activeParts = [...activePartsArray, validatedParts];
271
- }
272
- }
273
- else {
274
- this.activeParts = Object.assign({}, validatedParts);
275
- }
276
- const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
277
- if (hasSlottedButtons || this.showDefaultButtons) {
278
- return;
279
- }
280
- this.confirm();
281
- };
282
- this.initializeKeyboardListeners = () => {
283
- const calendarBodyRef = this.calendarBodyRef;
284
- if (!calendarBodyRef) {
285
- return;
286
- }
287
- const root = this.el.shadowRoot;
288
- /**
289
- * Get a reference to the month
290
- * element we are currently viewing.
291
- */
292
- const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
293
- /**
294
- * When focusing the calendar body, we want to pass focus
295
- * to the working day, but other days should
296
- * only be accessible using the arrow keys. Pressing
297
- * Tab should jump between bodies of selectable content.
298
- */
299
- const checkCalendarBodyFocus = (ev) => {
300
- var _a;
301
- const record = ev[0];
302
- /**
303
- * If calendar body was already focused
304
- * when this fired or if the calendar body
305
- * if not currently focused, we should not re-focus
306
- * the inner day.
307
- */
308
- if (((_a = record.oldValue) === null || _a === void 0 ? void 0 : _a.includes('ion-focused')) || !calendarBodyRef.classList.contains('ion-focused')) {
309
- return;
310
- }
311
- this.focusWorkingDay(currentMonth);
312
- };
313
- const mo = new MutationObserver(checkCalendarBodyFocus);
314
- mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
315
- this.destroyKeyboardMO = () => {
316
- mo === null || mo === void 0 ? void 0 : mo.disconnect();
317
- };
318
- /**
319
- * We must use keydown not keyup as we want
320
- * to prevent scrolling when using the arrow keys.
321
- */
322
- calendarBodyRef.addEventListener('keydown', (ev) => {
323
- const activeElement = root.activeElement;
324
- if (!activeElement || !activeElement.classList.contains('calendar-day')) {
325
- return;
326
- }
327
- const parts = getPartsFromCalendarDay(activeElement);
328
- let partsToFocus;
329
- switch (ev.key) {
330
- case 'ArrowDown':
331
- ev.preventDefault();
332
- partsToFocus = getNextWeek(parts);
333
- break;
334
- case 'ArrowUp':
335
- ev.preventDefault();
336
- partsToFocus = getPreviousWeek(parts);
337
- break;
338
- case 'ArrowRight':
339
- ev.preventDefault();
340
- partsToFocus = getNextDay(parts);
341
- break;
342
- case 'ArrowLeft':
343
- ev.preventDefault();
344
- partsToFocus = getPreviousDay(parts);
345
- break;
346
- case 'Home':
347
- ev.preventDefault();
348
- partsToFocus = getStartOfWeek(parts);
349
- break;
350
- case 'End':
351
- ev.preventDefault();
352
- partsToFocus = getEndOfWeek(parts);
353
- break;
354
- case 'PageUp':
355
- ev.preventDefault();
356
- partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
357
- break;
358
- case 'PageDown':
359
- ev.preventDefault();
360
- partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
361
- break;
362
- /**
363
- * Do not preventDefault here
364
- * as we do not want to override other
365
- * browser defaults such as pressing Enter/Space
366
- * to select a day.
367
- */
368
- default:
369
- return;
370
- }
371
- /**
372
- * If the day we want to move focus to is
373
- * disabled, do not do anything.
374
- */
375
- if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
376
- return;
377
- }
378
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), partsToFocus));
379
- /**
380
- * Give view a chance to re-render
381
- * then move focus to the new working day
382
- */
383
- requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
384
- });
385
- };
386
- this.focusWorkingDay = (currentMonth) => {
387
- /**
388
- * Get the number of offset days so
389
- * we know how much to offset our next selector by
390
- * to grab the correct calendar-day element.
391
- */
392
- const { day, month, year } = this.workingParts;
393
- const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
394
- const offset = firstOfMonth >= this.firstDayOfWeek
395
- ? firstOfMonth - this.firstDayOfWeek
396
- : 7 - (this.firstDayOfWeek - firstOfMonth);
397
- if (day === null) {
398
- return;
399
- }
400
- /**
401
- * Get the calendar day element
402
- * and focus it.
403
- */
404
- const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
405
- if (dayEl) {
406
- dayEl.focus();
407
- }
408
- };
409
- this.processMinParts = () => {
410
- const { min, defaultParts } = this;
411
- if (min === undefined) {
412
- this.minParts = undefined;
413
- return;
414
- }
415
- this.minParts = parseMinParts(min, defaultParts);
416
- };
417
- this.processMaxParts = () => {
418
- const { max, defaultParts } = this;
419
- if (max === undefined) {
420
- this.maxParts = undefined;
421
- return;
422
- }
423
- this.maxParts = parseMaxParts(max, defaultParts);
424
- };
425
- this.initializeCalendarListener = () => {
426
- const calendarBodyRef = this.calendarBodyRef;
427
- if (!calendarBodyRef) {
428
- return;
429
- }
430
- /**
431
- * For performance reasons, we only render 3
432
- * months at a time: The current month, the previous
433
- * month, and the next month. We have a scroll listener
434
- * on the calendar body to append/prepend new months.
435
- *
436
- * We can do this because Stencil is smart enough to not
437
- * re-create the .calendar-month containers, but rather
438
- * update the content within those containers.
439
- *
440
- * As an added bonus, WebKit has some troubles with
441
- * scroll-snap-stop: always, so not rendering all of
442
- * the months in a row allows us to mostly sidestep
443
- * that issue.
444
- */
445
- const months = calendarBodyRef.querySelectorAll('.calendar-month');
446
- const startMonth = months[0];
447
- const workingMonth = months[1];
448
- const endMonth = months[2];
449
- const mode = getIonMode(this);
450
- const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
451
- /**
452
- * Before setting up the scroll listener,
453
- * scroll the middle month into view.
454
- * scrollIntoView() will scroll entire page
455
- * if element is not in viewport. Use scrollLeft instead.
456
- */
457
- writeTask(() => {
458
- calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
459
- const getChangedMonth = (parts) => {
460
- const box = calendarBodyRef.getBoundingClientRect();
461
- /**
462
- * If the current scroll position is all the way to the left
463
- * then we have scrolled to the previous month.
464
- * Otherwise, assume that we have scrolled to the next
465
- * month. We have a tolerance of 2px to account for
466
- * sub pixel rendering.
467
- *
468
- * Check below the next line ensures that we did not
469
- * swipe and abort (i.e. we swiped but we are still on the current month).
470
- */
471
- const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
472
- const month = condition ? startMonth : endMonth;
473
- /**
474
- * The edge of the month must be lined up with
475
- * the edge of the calendar body in order for
476
- * the component to update. Otherwise, it
477
- * may be the case that the user has paused their
478
- * swipe or the browser has not finished snapping yet.
479
- * Rather than check if the x values are equal,
480
- * we give it a tolerance of 2px to account for
481
- * sub pixel rendering.
482
- */
483
- const monthBox = month.getBoundingClientRect();
484
- if (Math.abs(monthBox.x - box.x) > 2)
485
- return;
486
- /**
487
- * If we're force-rendering a month, assume we've
488
- * scrolled to that and return it.
489
- *
490
- * If forceRenderDate is ever used in a context where the
491
- * forced month is not immediately auto-scrolled to, this
492
- * should be updated to also check whether `month` has the
493
- * same month and year as the forced date.
494
- */
495
- const { forceRenderDate } = this;
496
- if (forceRenderDate !== undefined) {
497
- return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
498
- }
499
- /**
500
- * From here, we can determine if the start
501
- * month or the end month was scrolled into view.
502
- * If no month was changed, then we can return from
503
- * the scroll callback early.
504
- */
505
- if (month === startMonth) {
506
- return getPreviousMonth(parts);
507
- }
508
- else if (month === endMonth) {
509
- return getNextMonth(parts);
510
- }
511
- else {
512
- return;
513
- }
514
- };
515
- const updateActiveMonth = () => {
516
- if (needsiOSRubberBandFix) {
517
- calendarBodyRef.style.removeProperty('pointer-events');
518
- appliediOSRubberBandFix = false;
519
- }
520
- /**
521
- * If the month did not change
522
- * then we can return early.
523
- */
524
- const newDate = getChangedMonth(this.workingParts);
525
- if (!newDate)
526
- return;
527
- const { month, day, year } = newDate;
528
- if (isMonthDisabled({ month, year, day: null }, {
529
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
530
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
531
- })) {
532
- return;
533
- }
534
- /**
535
- * Prevent scrolling for other browsers
536
- * to give the DOM time to update and the container
537
- * time to properly snap.
538
- */
539
- calendarBodyRef.style.setProperty('overflow', 'hidden');
540
- /**
541
- * Use a writeTask here to ensure
542
- * that the state is updated and the
543
- * correct month is scrolled into view
544
- * in the same frame. This is not
545
- * typically a problem on newer devices
546
- * but older/slower device may have a flicker
547
- * if we did not do this.
548
- */
549
- writeTask(() => {
550
- var _a;
551
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month, day: day, year }));
552
- calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
553
- calendarBodyRef.style.removeProperty('overflow');
554
- if (this.resolveForceDateScrolling) {
555
- this.resolveForceDateScrolling();
556
- }
557
- const activeEl = this.el.shadowRoot.activeElement;
558
- if (activeEl && activeEl.classList.contains('calendar-day')) {
559
- (_a = activeEl.closest('.calendar-body')) === null || _a === void 0 ? void 0 : _a.focus();
560
- }
561
- });
562
- };
563
- /**
564
- * When the container finishes scrolling we
565
- * need to update the DOM with the selected month.
566
- */
567
- let scrollTimeout;
568
- /**
569
- * We do not want to attempt to set pointer-events
570
- * multiple times within a single swipe gesture as
571
- * that adds unnecessary work to the main thread.
572
- */
573
- let appliediOSRubberBandFix = false;
574
- const scrollCallback = () => {
575
- if (scrollTimeout) {
576
- clearTimeout(scrollTimeout);
577
- }
578
- /**
579
- * On iOS it is possible to quickly rubber band
580
- * the scroll area before the scroll timeout has fired.
581
- * This results in users reaching the end of the scrollable
582
- * container before the DOM has updated.
583
- * By setting `pointer-events: none` we can ensure that
584
- * subsequent swipes do not happen while the container
585
- * is snapping.
586
- */
587
- if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
588
- calendarBodyRef.style.setProperty('pointer-events', 'none');
589
- appliediOSRubberBandFix = true;
590
- }
591
- // Wait ~3 frames
592
- scrollTimeout = setTimeout(updateActiveMonth, 50);
593
- };
594
- calendarBodyRef.addEventListener('scroll', scrollCallback);
595
- this.destroyCalendarListener = () => {
596
- calendarBodyRef.removeEventListener('scroll', scrollCallback);
597
- };
598
- });
599
- };
600
- /**
601
- * Clean up all listeners except for the overlay
602
- * listener. This is so that we can re-create the listeners
603
- * if the datetime has been hidden/presented by a modal or popover.
604
- */
605
- this.destroyInteractionListeners = () => {
606
- const { destroyCalendarListener, destroyKeyboardMO } = this;
607
- if (destroyCalendarListener !== undefined) {
608
- destroyCalendarListener();
609
- }
610
- if (destroyKeyboardMO !== undefined) {
611
- destroyKeyboardMO();
612
- }
613
- };
614
- /**
615
- * TODO(FW-6931): Remove this fallback upon solving the root cause
616
- * Fallback to ensure the datetime becomes ready even if
617
- * IntersectionObserver never reports it as intersecting.
618
- *
619
- * This is primarily used in environments where the observer
620
- * might not fire as expected, such as when running under
621
- * synthetic tests that stub IntersectionObserver.
622
- */
623
- this.ensureReadyIfVisible = () => {
624
- if (this.el.classList.contains('datetime-ready')) {
625
- return;
626
- }
627
- const rect = this.el.getBoundingClientRect();
628
- if (rect.width === 0 || rect.height === 0) {
629
- return;
630
- }
631
- this.markReady();
632
- };
633
- this.markReady = () => {
634
- if (this.el.classList.contains('datetime-ready')) {
635
- return;
636
- }
637
- this.initializeListeners();
638
- /**
639
- * TODO FW-2793: Datetime needs a frame to ensure that it
640
- * can properly scroll contents into view. As a result
641
- * we hide the scrollable content until after that frame
642
- * so users do not see the content quickly shifting. The downside
643
- * is that the content will pop into view a frame after. Maybe there
644
- * is a better way to handle this?
645
- */
646
- writeTask(() => {
647
- this.el.classList.add('datetime-ready');
648
- });
649
- };
650
- this.loadTimeoutCleanup = () => {
651
- if (this.loadTimeout) {
652
- clearTimeout(this.loadTimeout);
653
- this.loadTimeout = undefined;
654
- }
655
- };
656
- this.processValue = (value) => {
657
- const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
658
- const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
659
- const { minParts, maxParts, workingParts, el } = this;
660
- this.warnIfIncorrectValueUsage();
661
- /**
662
- * Return early if the value wasn't parsed correctly, such as
663
- * if an improperly formatted date string was provided.
664
- */
665
- if (!valueToProcess) {
666
- return;
667
- }
668
- /**
669
- * Datetime should only warn of out of bounds values
670
- * if set by the user. If the `value` is undefined,
671
- * we will default to today's date which may be out
672
- * of bounds. In this case, the warning makes it look
673
- * like the developer did something wrong which is
674
- * not true.
675
- */
676
- if (hasValue) {
677
- warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
678
- }
679
- /**
680
- * If there are multiple values, clamp to the last one.
681
- * This is because the last value is the one that the user
682
- * has most recently interacted with.
683
- */
684
- const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
685
- const targetValue = clampDate(singleValue, minParts, maxParts);
686
- const { month, day, year, hour, minute } = targetValue;
687
- const ampm = parseAmPm(hour);
688
- /**
689
- * Since `activeParts` indicates a value that been explicitly selected
690
- * either by the user or the app, only update `activeParts` if the
691
- * `value` property is set.
692
- */
693
- if (hasValue) {
694
- if (Array.isArray(valueToProcess)) {
695
- this.activeParts = [...valueToProcess];
696
- }
697
- else {
698
- this.activeParts = {
699
- month,
700
- day,
701
- year,
702
- hour,
703
- minute,
704
- ampm,
705
- };
706
- }
707
- }
708
- else {
709
- /**
710
- * Reset the active parts if the value is not set.
711
- * This will clear the selected calendar day when
712
- * performing a clear action or using the reset() method.
713
- */
714
- this.activeParts = [];
715
- }
716
- const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
717
- const bodyIsVisible = el.classList.contains('datetime-ready');
718
- const { isGridStyle, showMonthAndYear } = this;
719
- if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
720
- /**
721
- * Only animate if:
722
- * 1. We're using grid style (wheel style pickers should just jump to new value)
723
- * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
724
- * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
725
- * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
726
- */
727
- this.animateToDate(targetValue);
728
- }
729
- else {
730
- this.setWorkingParts({
731
- month,
732
- day,
733
- year,
734
- hour,
735
- minute,
736
- ampm,
737
- });
738
- }
739
- };
740
- this.animateToDate = async (targetValue) => {
741
- const { workingParts } = this;
742
- /**
743
- * Tell other render functions that we need to force the
744
- * target month to appear in place of the actual next/prev month.
745
- * Because this is a State variable, a rerender will be triggered
746
- * automatically, updating the rendered months.
747
- */
748
- this.forceRenderDate = targetValue;
749
- /**
750
- * Flag that we've started scrolling to the forced date.
751
- * The resolve function will be called by the datetime's
752
- * scroll listener when it's done updating everything.
753
- * This is a replacement for making prev/nextMonth async,
754
- * since the logic we're waiting on is in a listener.
755
- */
756
- const forceDateScrollingPromise = new Promise((resolve) => {
757
- this.resolveForceDateScrolling = resolve;
758
- });
759
- /**
760
- * Animate smoothly to the forced month. This will also update
761
- * workingParts and correct the surrounding months for us.
762
- */
763
- const targetMonthIsBefore = isBefore(targetValue, workingParts);
764
- targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
765
- await forceDateScrollingPromise;
766
- this.resolveForceDateScrolling = undefined;
767
- this.forceRenderDate = undefined;
768
- };
769
- this.onFocus = () => {
770
- this.ionFocus.emit();
771
- };
772
- this.onBlur = () => {
773
- this.ionBlur.emit();
774
- };
775
- this.hasValue = () => {
776
- return this.value != null;
777
- };
778
- this.nextMonth = () => {
779
- const calendarBodyRef = this.calendarBodyRef;
780
- if (!calendarBodyRef) {
781
- return;
782
- }
783
- const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
784
- if (!nextMonth) {
785
- return;
786
- }
787
- const left = nextMonth.offsetWidth * 2;
788
- const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
789
- calendarBodyRef.scrollTo({
790
- top: 0,
791
- left: left * (isRTL(this.el) ? -1 : 1),
792
- behavior: scrollMode,
793
- });
794
- };
795
- this.prevMonth = () => {
796
- const calendarBodyRef = this.calendarBodyRef;
797
- if (!calendarBodyRef) {
798
- return;
799
- }
800
- const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
801
- if (!prevMonth) {
802
- return;
803
- }
804
- const left = prevMonth.offsetWidth * 2;
805
- const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
806
- calendarBodyRef.scrollTo({
807
- top: 0,
808
- left: left * (isRTL(this.el) ? 1 : -1),
809
- behavior: scrollMode,
810
- });
811
- };
812
- this.toggleMonthAndYearView = () => {
813
- this.showMonthAndYear = !this.showMonthAndYear;
814
- };
815
- }
57
+ inputId = `ion-dt-${datetimeIds++}`;
58
+ calendarBodyRef;
59
+ popoverRef;
60
+ intersectionTrackerRef;
61
+ clearFocusVisible;
62
+ parsedMinuteValues;
63
+ parsedHourValues;
64
+ parsedMonthValues;
65
+ parsedYearValues;
66
+ parsedDayValues;
67
+ destroyCalendarListener;
68
+ destroyKeyboardMO;
69
+ // TODO(FW-2832): types (DatetimeParts causes some errors that need untangling)
70
+ minParts;
71
+ maxParts;
72
+ todayParts;
73
+ defaultParts;
74
+ loadTimeout;
75
+ /**
76
+ * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
77
+ * synthetic "not intersecting" entry IntersectionObserver fires on
78
+ * `observe()` when the host mounts offscreen.
79
+ *
80
+ * Don't reset this in `disconnectedCallback`. Overlays disconnect and
81
+ * reconnect the host without re-creating the observers, so a reset there
82
+ * makes `hiddenCallback` miss the dismissal.
83
+ */
84
+ hasBeenIntersecting = false;
85
+ prevPresentation = null;
86
+ resolveForceDateScrolling;
87
+ showMonthAndYear = false;
88
+ activeParts = [];
89
+ workingParts = {
90
+ month: 5,
91
+ day: 28,
92
+ year: 2021,
93
+ hour: 13,
94
+ minute: 52,
95
+ ampm: 'pm',
96
+ isAdjacentDay: false,
97
+ };
98
+ el;
99
+ isTimePopoverOpen = false;
100
+ /**
101
+ * When defined, will force the datetime to render the month
102
+ * containing the specified date. Currently, this should only
103
+ * be used to enable immediately auto-scrolling to the new month,
104
+ * and should then be reset to undefined once the transition is
105
+ * finished and the forced month is now in view.
106
+ *
107
+ * Applies to grid-style datetimes only.
108
+ */
109
+ forceRenderDate;
110
+ /**
111
+ * The color to use from your application's color palette.
112
+ * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
113
+ * For more information on colors, refer to [theming](/docs/theming/basics).
114
+ */
115
+ color;
116
+ /**
117
+ * The name of the control, which is submitted with the form data.
118
+ */
119
+ name = this.inputId;
120
+ /**
121
+ * If `true`, the user cannot interact with the datetime.
122
+ */
123
+ disabled = false;
124
+ /**
125
+ * Formatting options for dates and times.
126
+ * Should include a 'date' and/or 'time' object, each of which is of type [Intl.DateTimeFormatOptions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#options).
127
+ *
128
+ */
129
+ formatOptions;
816
130
  formatOptionsChanged() {
817
131
  const { el, formatOptions, presentation } = this;
818
132
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
819
133
  warnIfTimeZoneProvided(el, formatOptions);
820
134
  }
135
+ /**
136
+ * If `true`, the datetime appears normal but the selected date cannot be changed.
137
+ */
138
+ readonly = false;
139
+ /**
140
+ * Returns if an individual date (calendar day) is enabled or disabled.
141
+ *
142
+ * If `true`, the day will be enabled/interactive.
143
+ * If `false`, the day will be disabled/non-interactive.
144
+ *
145
+ * The function accepts an ISO 8601 date string of a given day.
146
+ * By default, all days are enabled. Developers can use this function
147
+ * to write custom logic to disable certain days.
148
+ *
149
+ * The function is called for each rendered calendar day, for the previous, current and next month.
150
+ * Custom implementations should be optimized for performance to avoid jank.
151
+ */
152
+ isDateEnabled;
153
+ /**
154
+ * If `true`, the datetime calendar displays a six-week (42-day) layout,
155
+ * including days from the previous and next months to fill the grid.
156
+ * These adjacent days are selectable unless disabled.
157
+ */
158
+ showAdjacentDays = false;
821
159
  disabledChanged() {
822
160
  this.emitStyle();
823
161
  }
162
+ /**
163
+ * The minimum datetime allowed. Value must be a date string
164
+ * following the
165
+ * [ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),
166
+ * such as `1996-12-19`. The format does not have to be specific to an exact
167
+ * datetime. For example, the minimum could just be the year, such as `1994`.
168
+ * Defaults to the beginning of the year, 100 years ago from today.
169
+ */
170
+ min;
824
171
  minChanged() {
825
172
  this.processMinParts();
826
173
  }
174
+ /**
175
+ * The maximum datetime allowed. Value must be a date string
176
+ * following the
177
+ * [ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),
178
+ * `1996-12-19`. The format does not have to be specific to an exact
179
+ * datetime. For example, the maximum could just be the year, such as `1994`.
180
+ * Defaults to the end of this year.
181
+ */
182
+ max;
827
183
  maxChanged() {
828
184
  this.processMaxParts();
829
185
  }
186
+ /**
187
+ * Which values you want to select. `"date"` will show
188
+ * a calendar picker to select the month, day, and year. `"time"`
189
+ * will show a time picker to select the hour, minute, and (optionally)
190
+ * AM/PM. `"date-time"` will show the date picker first and time picker second.
191
+ * `"time-date"` will show the time picker first and date picker second.
192
+ */
193
+ presentation = 'date-time';
830
194
  presentationChanged() {
831
195
  const { el, formatOptions, presentation } = this;
832
196
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
@@ -836,21 +200,116 @@ export class Datetime {
836
200
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
837
201
  return hasDatePresentation && !preferWheel;
838
202
  }
203
+ /**
204
+ * The text to display on the picker's cancel button.
205
+ */
206
+ cancelText = 'Cancel';
207
+ /**
208
+ * The text to display on the picker's "Done" button.
209
+ */
210
+ doneText = 'Done';
211
+ /**
212
+ * The text to display on the picker's "Clear" button.
213
+ */
214
+ clearText = 'Clear';
215
+ /**
216
+ * Values used to create the list of selectable years. By default
217
+ * the year values range between the `min` and `max` datetime inputs. However, to
218
+ * control exactly which years to display, the `yearValues` input can take a number, an array
219
+ * of numbers, or string of comma separated numbers. For example, to show upcoming and
220
+ * recent leap years, then this input's value would be `yearValues="2008,2012,2016,2020,2024"`.
221
+ */
222
+ yearValues;
839
223
  yearValuesChanged() {
840
224
  this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
841
225
  }
226
+ /**
227
+ * Values used to create the list of selectable months. By default
228
+ * the month values range from `1` to `12`. However, to control exactly which months to
229
+ * display, the `monthValues` input can take a number, an array of numbers, or a string of
230
+ * comma separated numbers. For example, if only summer months should be shown, then this
231
+ * input value would be `monthValues="6,7,8"`. Note that month numbers do *not* have a
232
+ * zero-based index, meaning January's value is `1`, and December's is `12`.
233
+ */
234
+ monthValues;
842
235
  monthValuesChanged() {
843
236
  this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
844
237
  }
238
+ /**
239
+ * Values used to create the list of selectable days. By default
240
+ * every day is shown for the given month. However, to control exactly which days of
241
+ * the month to display, the `dayValues` input can take a number, an array of numbers, or
242
+ * a string of comma separated numbers. Note that even if the array days have an invalid
243
+ * number for the selected month, like `31` in February, it will correctly not show
244
+ * days which are not valid for the selected month.
245
+ */
246
+ dayValues;
845
247
  dayValuesChanged() {
846
248
  this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
847
249
  }
250
+ /**
251
+ * Values used to create the list of selectable hours. By default
252
+ * the hour values range from `0` to `23` for 24-hour, or `1` to `12` for 12-hour. However,
253
+ * to control exactly which hours to display, the `hourValues` input can take a number, an
254
+ * array of numbers, or a string of comma separated numbers.
255
+ */
256
+ hourValues;
848
257
  hourValuesChanged() {
849
258
  this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
850
259
  }
260
+ /**
261
+ * Values used to create the list of selectable minutes. By default
262
+ * the minutes range from `0` to `59`. However, to control exactly which minutes to display,
263
+ * the `minuteValues` input can take a number, an array of numbers, or a string of comma
264
+ * separated numbers. For example, if the minute selections should only be every 15 minutes,
265
+ * then this input value would be `minuteValues="0,15,30,45"`.
266
+ */
267
+ minuteValues;
851
268
  minuteValuesChanged() {
852
269
  this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
853
270
  }
271
+ /**
272
+ * The locale to use for `ion-datetime`. This
273
+ * impacts month and day name formatting.
274
+ * The `"default"` value refers to the default
275
+ * locale set by your device.
276
+ */
277
+ locale = 'default';
278
+ /**
279
+ * The first day of the week to use for `ion-datetime`. The
280
+ * default value is `0` and represents Sunday.
281
+ */
282
+ firstDayOfWeek = 0;
283
+ /**
284
+ * A callback used to format the header text that shows how many
285
+ * dates are selected. Only used if there are 0 or more than 1
286
+ * selected (i.e. unused for exactly 1). By default, the header
287
+ * text is set to "numberOfDates days".
288
+ *
289
+ * See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
290
+ * if you need to access `this` from within the callback.
291
+ */
292
+ titleSelectedDatesFormatter;
293
+ /**
294
+ * If `true`, multiple dates can be selected at once. Only
295
+ * applies to `presentation="date"` and `preferWheel="false"`.
296
+ */
297
+ multiple = false;
298
+ /**
299
+ * Used to apply custom text and background colors to specific dates.
300
+ *
301
+ * Can be either an array of objects containing ISO strings and colors,
302
+ * or a callback that receives an ISO string and returns the colors.
303
+ *
304
+ * Only applies to the `date`, `date-time`, and `time-date` presentations,
305
+ * with `preferWheel="false"`.
306
+ */
307
+ highlightedDates;
308
+ /**
309
+ * The value of the datetime as a valid ISO 8601 datetime string.
310
+ * This should be an array of strings only when `multiple="true"`.
311
+ */
312
+ value;
854
313
  /**
855
314
  * Update the datetime value when the value changes
856
315
  */
@@ -862,6 +321,97 @@ export class Datetime {
862
321
  this.emitStyle();
863
322
  this.ionValueChange.emit({ value });
864
323
  }
324
+ /**
325
+ * If `true`, a header will be shown above the calendar
326
+ * picker. This will include both the slotted title, and
327
+ * the selected date.
328
+ */
329
+ showDefaultTitle = false;
330
+ /**
331
+ * If `true`, the default "Cancel" and "OK" buttons
332
+ * will be rendered at the bottom of the `ion-datetime`
333
+ * component. Developers can also use the `button` slot
334
+ * if they want to customize these buttons. If custom
335
+ * buttons are set in the `button` slot then the
336
+ * default buttons will not be rendered.
337
+ */
338
+ showDefaultButtons = false;
339
+ /**
340
+ * If `true`, a "Clear" button will be rendered alongside
341
+ * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
342
+ * component. Developers can also use the `button` slot
343
+ * if they want to customize these buttons. If custom
344
+ * buttons are set in the `button` slot then the
345
+ * default buttons will not be rendered.
346
+ */
347
+ showClearButton = false;
348
+ /**
349
+ * If `true`, the default "Time" label will be rendered
350
+ * for the time selector of the `ion-datetime` component.
351
+ * Developers can also use the `time-label` slot
352
+ * if they want to customize this label. If a custom
353
+ * label is set in the `time-label` slot then the
354
+ * default label will not be rendered.
355
+ */
356
+ showDefaultTimeLabel = true;
357
+ /**
358
+ * The hour cycle of the `ion-datetime`. If no value is set, this is
359
+ * specified by the current locale.
360
+ */
361
+ hourCycle;
362
+ /**
363
+ * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
364
+ * If `fixed`, the `ion-datetime` will have a fixed width.
365
+ */
366
+ size = 'fixed';
367
+ /**
368
+ * If `true`, a wheel picker will be rendered instead of a calendar grid
369
+ * where possible. If `false`, a calendar grid will be rendered instead of
370
+ * a wheel picker where possible.
371
+ *
372
+ * A wheel picker can be rendered instead of a grid when `presentation` is
373
+ * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
374
+ *
375
+ * A wheel picker will always be rendered regardless of
376
+ * the `preferWheel` value when `presentation` is one of the following values:
377
+ * `"time"`, `"month"`, `"month-year"`, or `"year"`.
378
+ */
379
+ preferWheel = false;
380
+ /**
381
+ * Emitted when the datetime selection was cancelled.
382
+ */
383
+ ionCancel;
384
+ /**
385
+ * Emitted when the value (selected date) has changed.
386
+ *
387
+ * This event will not emit when programmatically setting the `value` property.
388
+ */
389
+ ionChange;
390
+ /**
391
+ * Emitted when the value property has changed.
392
+ * This is used to ensure that ion-datetime-button can respond
393
+ * to any value property changes.
394
+ * @internal
395
+ */
396
+ ionValueChange;
397
+ /**
398
+ * Emitted when the datetime has focus.
399
+ */
400
+ ionFocus;
401
+ /**
402
+ * Emitted when the datetime loses focus.
403
+ */
404
+ ionBlur;
405
+ /**
406
+ * Emitted when the styles change.
407
+ * @internal
408
+ */
409
+ ionStyle;
410
+ /**
411
+ * Emitted when componentDidRender is fired.
412
+ * @internal
413
+ */
414
+ ionRender;
865
415
  /**
866
416
  * Confirms the selected datetime value, updates the
867
417
  * `value` property, and optionally closes the popover
@@ -931,10 +481,425 @@ export class Datetime {
931
481
  async getDefaultPart() {
932
482
  return this.defaultParts;
933
483
  }
484
+ warnIfIncorrectValueUsage = () => {
485
+ const { multiple, value } = this;
486
+ if (!multiple && Array.isArray(value)) {
487
+ /**
488
+ * We do some processing on the `value` array so
489
+ * that it looks more like an array when logged to
490
+ * the console.
491
+ * Example given ['a', 'b']
492
+ * Default toString() behavior: a,b
493
+ * Custom behavior: ['a', 'b']
494
+ */
495
+ printIonWarning(`[ion-datetime] - An array of values was passed, but multiple is "false". This is incorrect usage and may result in unexpected behaviors. To dismiss this warning, pass a string to the "value" property when multiple="false".
496
+
497
+ Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
498
+ `, this.el);
499
+ }
500
+ };
501
+ setValue = (value) => {
502
+ this.value = value;
503
+ this.ionChange.emit({ value });
504
+ };
505
+ /**
506
+ * Returns the DatetimePart interface
507
+ * to use when rendering an initial set of
508
+ * data. This should be used when rendering an
509
+ * interface in an environment where the `value`
510
+ * may not be set. This function works
511
+ * by returning the first selected date and then
512
+ * falling back to defaultParts if no active date
513
+ * is selected.
514
+ */
515
+ getActivePartsWithFallback = () => {
516
+ const { defaultParts } = this;
517
+ return this.getActivePart() ?? defaultParts;
518
+ };
519
+ getActivePart = () => {
520
+ const { activeParts } = this;
521
+ return Array.isArray(activeParts) ? activeParts[0] : activeParts;
522
+ };
523
+ closeParentOverlay = (role) => {
524
+ const popoverOrModal = this.el.closest('ion-modal, ion-popover');
525
+ if (popoverOrModal) {
526
+ popoverOrModal.dismiss(undefined, role);
527
+ }
528
+ };
529
+ setWorkingParts = (parts) => {
530
+ this.workingParts = {
531
+ ...parts,
532
+ };
533
+ };
534
+ setActiveParts = (parts, removeDate = false) => {
535
+ /** if the datetime component is in readonly mode,
536
+ * allow browsing of the calendar without changing
537
+ * the set value
538
+ */
539
+ if (this.readonly) {
540
+ return;
541
+ }
542
+ const { multiple, minParts, maxParts, activeParts } = this;
543
+ /**
544
+ * When setting the active parts, it is possible
545
+ * to set invalid data. For example,
546
+ * when updating January 31 to February,
547
+ * February 31 does not exist. As a result
548
+ * we need to validate the active parts and
549
+ * ensure that we are only setting valid dates.
550
+ * Additionally, we need to update the working parts
551
+ * too in the event that the validated parts are different.
552
+ */
553
+ const validatedParts = validateParts(parts, minParts, maxParts);
554
+ this.setWorkingParts(validatedParts);
555
+ if (multiple) {
556
+ const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
557
+ if (removeDate) {
558
+ this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
559
+ }
560
+ else {
561
+ this.activeParts = [...activePartsArray, validatedParts];
562
+ }
563
+ }
564
+ else {
565
+ this.activeParts = {
566
+ ...validatedParts,
567
+ };
568
+ }
569
+ const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
570
+ if (hasSlottedButtons || this.showDefaultButtons) {
571
+ return;
572
+ }
573
+ this.confirm();
574
+ };
934
575
  get isCalendarPicker() {
935
576
  const { presentation } = this;
936
577
  return presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
937
578
  }
579
+ initializeKeyboardListeners = () => {
580
+ const calendarBodyRef = this.calendarBodyRef;
581
+ if (!calendarBodyRef) {
582
+ return;
583
+ }
584
+ const root = this.el.shadowRoot;
585
+ /**
586
+ * Get a reference to the month
587
+ * element we are currently viewing.
588
+ */
589
+ const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
590
+ /**
591
+ * When focusing the calendar body, we want to pass focus
592
+ * to the working day, but other days should
593
+ * only be accessible using the arrow keys. Pressing
594
+ * Tab should jump between bodies of selectable content.
595
+ */
596
+ const checkCalendarBodyFocus = (ev) => {
597
+ const record = ev[0];
598
+ /**
599
+ * If calendar body was already focused
600
+ * when this fired or if the calendar body
601
+ * if not currently focused, we should not re-focus
602
+ * the inner day.
603
+ */
604
+ if (record.oldValue?.includes('ion-focused') || !calendarBodyRef.classList.contains('ion-focused')) {
605
+ return;
606
+ }
607
+ this.focusWorkingDay(currentMonth);
608
+ };
609
+ const mo = new MutationObserver(checkCalendarBodyFocus);
610
+ mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
611
+ this.destroyKeyboardMO = () => {
612
+ mo?.disconnect();
613
+ };
614
+ /**
615
+ * We must use keydown not keyup as we want
616
+ * to prevent scrolling when using the arrow keys.
617
+ */
618
+ calendarBodyRef.addEventListener('keydown', (ev) => {
619
+ const activeElement = root.activeElement;
620
+ if (!activeElement || !activeElement.classList.contains('calendar-day')) {
621
+ return;
622
+ }
623
+ const parts = getPartsFromCalendarDay(activeElement);
624
+ let partsToFocus;
625
+ switch (ev.key) {
626
+ case 'ArrowDown':
627
+ ev.preventDefault();
628
+ partsToFocus = getNextWeek(parts);
629
+ break;
630
+ case 'ArrowUp':
631
+ ev.preventDefault();
632
+ partsToFocus = getPreviousWeek(parts);
633
+ break;
634
+ case 'ArrowRight':
635
+ ev.preventDefault();
636
+ partsToFocus = getNextDay(parts);
637
+ break;
638
+ case 'ArrowLeft':
639
+ ev.preventDefault();
640
+ partsToFocus = getPreviousDay(parts);
641
+ break;
642
+ case 'Home':
643
+ ev.preventDefault();
644
+ partsToFocus = getStartOfWeek(parts);
645
+ break;
646
+ case 'End':
647
+ ev.preventDefault();
648
+ partsToFocus = getEndOfWeek(parts);
649
+ break;
650
+ case 'PageUp':
651
+ ev.preventDefault();
652
+ partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
653
+ break;
654
+ case 'PageDown':
655
+ ev.preventDefault();
656
+ partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
657
+ break;
658
+ /**
659
+ * Do not preventDefault here
660
+ * as we do not want to override other
661
+ * browser defaults such as pressing Enter/Space
662
+ * to select a day.
663
+ */
664
+ default:
665
+ return;
666
+ }
667
+ /**
668
+ * If the day we want to move focus to is
669
+ * disabled, do not do anything.
670
+ */
671
+ if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
672
+ return;
673
+ }
674
+ this.setWorkingParts({
675
+ ...this.workingParts,
676
+ ...partsToFocus,
677
+ });
678
+ /**
679
+ * Give view a chance to re-render
680
+ * then move focus to the new working day
681
+ */
682
+ requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
683
+ });
684
+ };
685
+ focusWorkingDay = (currentMonth) => {
686
+ /**
687
+ * Get the number of offset days so
688
+ * we know how much to offset our next selector by
689
+ * to grab the correct calendar-day element.
690
+ */
691
+ const { day, month, year } = this.workingParts;
692
+ const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
693
+ const offset = firstOfMonth >= this.firstDayOfWeek
694
+ ? firstOfMonth - this.firstDayOfWeek
695
+ : 7 - (this.firstDayOfWeek - firstOfMonth);
696
+ if (day === null) {
697
+ return;
698
+ }
699
+ /**
700
+ * Get the calendar day element
701
+ * and focus it.
702
+ */
703
+ const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
704
+ if (dayEl) {
705
+ dayEl.focus();
706
+ }
707
+ };
708
+ processMinParts = () => {
709
+ const { min, defaultParts } = this;
710
+ if (min === undefined) {
711
+ this.minParts = undefined;
712
+ return;
713
+ }
714
+ this.minParts = parseMinParts(min, defaultParts);
715
+ };
716
+ processMaxParts = () => {
717
+ const { max, defaultParts } = this;
718
+ if (max === undefined) {
719
+ this.maxParts = undefined;
720
+ return;
721
+ }
722
+ this.maxParts = parseMaxParts(max, defaultParts);
723
+ };
724
+ initializeCalendarListener = () => {
725
+ const calendarBodyRef = this.calendarBodyRef;
726
+ if (!calendarBodyRef) {
727
+ return;
728
+ }
729
+ /**
730
+ * For performance reasons, we only render 3
731
+ * months at a time: The current month, the previous
732
+ * month, and the next month. We have a scroll listener
733
+ * on the calendar body to append/prepend new months.
734
+ *
735
+ * We can do this because Stencil is smart enough to not
736
+ * re-create the .calendar-month containers, but rather
737
+ * update the content within those containers.
738
+ *
739
+ * As an added bonus, WebKit has some troubles with
740
+ * scroll-snap-stop: always, so not rendering all of
741
+ * the months in a row allows us to mostly sidestep
742
+ * that issue.
743
+ */
744
+ const months = calendarBodyRef.querySelectorAll('.calendar-month');
745
+ const startMonth = months[0];
746
+ const workingMonth = months[1];
747
+ const endMonth = months[2];
748
+ const mode = getIonMode(this);
749
+ const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
750
+ /**
751
+ * Before setting up the scroll listener,
752
+ * scroll the middle month into view.
753
+ * scrollIntoView() will scroll entire page
754
+ * if element is not in viewport. Use scrollLeft instead.
755
+ */
756
+ writeTask(() => {
757
+ calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
758
+ const getChangedMonth = (parts) => {
759
+ const box = calendarBodyRef.getBoundingClientRect();
760
+ /**
761
+ * If the current scroll position is all the way to the left
762
+ * then we have scrolled to the previous month.
763
+ * Otherwise, assume that we have scrolled to the next
764
+ * month. We have a tolerance of 2px to account for
765
+ * sub pixel rendering.
766
+ *
767
+ * Check below the next line ensures that we did not
768
+ * swipe and abort (i.e. we swiped but we are still on the current month).
769
+ */
770
+ const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
771
+ const month = condition ? startMonth : endMonth;
772
+ /**
773
+ * The edge of the month must be lined up with
774
+ * the edge of the calendar body in order for
775
+ * the component to update. Otherwise, it
776
+ * may be the case that the user has paused their
777
+ * swipe or the browser has not finished snapping yet.
778
+ * Rather than check if the x values are equal,
779
+ * we give it a tolerance of 2px to account for
780
+ * sub pixel rendering.
781
+ */
782
+ const monthBox = month.getBoundingClientRect();
783
+ if (Math.abs(monthBox.x - box.x) > 2)
784
+ return;
785
+ /**
786
+ * If we're force-rendering a month, assume we've
787
+ * scrolled to that and return it.
788
+ *
789
+ * If forceRenderDate is ever used in a context where the
790
+ * forced month is not immediately auto-scrolled to, this
791
+ * should be updated to also check whether `month` has the
792
+ * same month and year as the forced date.
793
+ */
794
+ const { forceRenderDate } = this;
795
+ if (forceRenderDate !== undefined) {
796
+ return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
797
+ }
798
+ /**
799
+ * From here, we can determine if the start
800
+ * month or the end month was scrolled into view.
801
+ * If no month was changed, then we can return from
802
+ * the scroll callback early.
803
+ */
804
+ if (month === startMonth) {
805
+ return getPreviousMonth(parts);
806
+ }
807
+ else if (month === endMonth) {
808
+ return getNextMonth(parts);
809
+ }
810
+ else {
811
+ return;
812
+ }
813
+ };
814
+ const updateActiveMonth = () => {
815
+ if (needsiOSRubberBandFix) {
816
+ calendarBodyRef.style.removeProperty('pointer-events');
817
+ appliediOSRubberBandFix = false;
818
+ }
819
+ /**
820
+ * If the month did not change
821
+ * then we can return early.
822
+ */
823
+ const newDate = getChangedMonth(this.workingParts);
824
+ if (!newDate)
825
+ return;
826
+ const { month, day, year } = newDate;
827
+ if (isMonthDisabled({ month, year, day: null }, {
828
+ minParts: { ...this.minParts, day: null },
829
+ maxParts: { ...this.maxParts, day: null },
830
+ })) {
831
+ return;
832
+ }
833
+ /**
834
+ * Prevent scrolling for other browsers
835
+ * to give the DOM time to update and the container
836
+ * time to properly snap.
837
+ */
838
+ calendarBodyRef.style.setProperty('overflow', 'hidden');
839
+ /**
840
+ * Use a writeTask here to ensure
841
+ * that the state is updated and the
842
+ * correct month is scrolled into view
843
+ * in the same frame. This is not
844
+ * typically a problem on newer devices
845
+ * but older/slower device may have a flicker
846
+ * if we did not do this.
847
+ */
848
+ writeTask(() => {
849
+ this.setWorkingParts({
850
+ ...this.workingParts,
851
+ month,
852
+ day: day,
853
+ year,
854
+ });
855
+ calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
856
+ calendarBodyRef.style.removeProperty('overflow');
857
+ if (this.resolveForceDateScrolling) {
858
+ this.resolveForceDateScrolling();
859
+ }
860
+ const activeEl = this.el.shadowRoot.activeElement;
861
+ if (activeEl && activeEl.classList.contains('calendar-day')) {
862
+ activeEl.closest('.calendar-body')?.focus();
863
+ }
864
+ });
865
+ };
866
+ /**
867
+ * When the container finishes scrolling we
868
+ * need to update the DOM with the selected month.
869
+ */
870
+ let scrollTimeout;
871
+ /**
872
+ * We do not want to attempt to set pointer-events
873
+ * multiple times within a single swipe gesture as
874
+ * that adds unnecessary work to the main thread.
875
+ */
876
+ let appliediOSRubberBandFix = false;
877
+ const scrollCallback = () => {
878
+ if (scrollTimeout) {
879
+ clearTimeout(scrollTimeout);
880
+ }
881
+ /**
882
+ * On iOS it is possible to quickly rubber band
883
+ * the scroll area before the scroll timeout has fired.
884
+ * This results in users reaching the end of the scrollable
885
+ * container before the DOM has updated.
886
+ * By setting `pointer-events: none` we can ensure that
887
+ * subsequent swipes do not happen while the container
888
+ * is snapping.
889
+ */
890
+ if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
891
+ calendarBodyRef.style.setProperty('pointer-events', 'none');
892
+ appliediOSRubberBandFix = true;
893
+ }
894
+ // Wait ~3 frames
895
+ scrollTimeout = setTimeout(updateActiveMonth, 50);
896
+ };
897
+ calendarBodyRef.addEventListener('scroll', scrollCallback);
898
+ this.destroyCalendarListener = () => {
899
+ calendarBodyRef.removeEventListener('scroll', scrollCallback);
900
+ };
901
+ });
902
+ };
938
903
  connectedCallback() {
939
904
  this.clearFocusVisible = startFocusVisible(this.el).destroy;
940
905
  this.loadTimeout = setTimeout(() => {
@@ -948,10 +913,66 @@ export class Datetime {
948
913
  }
949
914
  this.loadTimeoutCleanup();
950
915
  }
916
+ /**
917
+ * Clean up all listeners except for the overlay
918
+ * listener. This is so that we can re-create the listeners
919
+ * if the datetime has been hidden/presented by a modal or popover.
920
+ */
921
+ destroyInteractionListeners = () => {
922
+ const { destroyCalendarListener, destroyKeyboardMO } = this;
923
+ if (destroyCalendarListener !== undefined) {
924
+ destroyCalendarListener();
925
+ }
926
+ if (destroyKeyboardMO !== undefined) {
927
+ destroyKeyboardMO();
928
+ }
929
+ };
951
930
  initializeListeners() {
952
931
  this.initializeCalendarListener();
953
932
  this.initializeKeyboardListeners();
954
933
  }
934
+ /**
935
+ * TODO(FW-6931): Remove this fallback upon solving the root cause
936
+ * Fallback to ensure the datetime becomes ready even if
937
+ * IntersectionObserver never reports it as intersecting.
938
+ *
939
+ * This is primarily used in environments where the observer
940
+ * might not fire as expected, such as when running under
941
+ * synthetic tests that stub IntersectionObserver.
942
+ */
943
+ ensureReadyIfVisible = () => {
944
+ if (this.el.classList.contains('datetime-ready')) {
945
+ return;
946
+ }
947
+ const rect = this.el.getBoundingClientRect();
948
+ if (rect.width === 0 || rect.height === 0) {
949
+ return;
950
+ }
951
+ this.markReady();
952
+ };
953
+ markReady = () => {
954
+ if (this.el.classList.contains('datetime-ready')) {
955
+ return;
956
+ }
957
+ this.initializeListeners();
958
+ /**
959
+ * TODO FW-2793: Datetime needs a frame to ensure that it
960
+ * can properly scroll contents into view. As a result
961
+ * we hide the scrollable content until after that frame
962
+ * so users do not see the content quickly shifting. The downside
963
+ * is that the content will pop into view a frame after. Maybe there
964
+ * is a better way to handle this?
965
+ */
966
+ writeTask(() => {
967
+ this.el.classList.add('datetime-ready');
968
+ });
969
+ };
970
+ loadTimeoutCleanup = () => {
971
+ if (this.loadTimeout) {
972
+ clearTimeout(this.loadTimeout);
973
+ this.loadTimeout = undefined;
974
+ }
975
+ };
955
976
  componentDidLoad() {
956
977
  const { el, intersectionTrackerRef } = this;
957
978
  /**
@@ -976,7 +997,7 @@ export class Datetime {
976
997
  * could cause the datetime to start at a visibility of 0, erroneously
977
998
  * triggering the `hiddenIO` observer below.
978
999
  */
979
- raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(intersectionTrackerRef));
1000
+ raf(() => visibleIO?.observe(intersectionTrackerRef));
980
1001
  /**
981
1002
  * TODO(FW-6931): Remove this fallback upon solving the root cause
982
1003
  * Fallback: If IntersectionObserver never reports that the
@@ -1022,7 +1043,7 @@ export class Datetime {
1022
1043
  });
1023
1044
  };
1024
1045
  const hiddenIO = new IntersectionObserver(hiddenCallback, { threshold: 0, root: el });
1025
- raf(() => hiddenIO === null || hiddenIO === void 0 ? void 0 : hiddenIO.observe(intersectionTrackerRef));
1046
+ raf(() => hiddenIO?.observe(intersectionTrackerRef));
1026
1047
  /**
1027
1048
  * Datetime uses Ionic components that emit
1028
1049
  * ionFocus and ionBlur. These events are
@@ -1095,6 +1116,119 @@ export class Datetime {
1095
1116
  this.ionRender.emit();
1096
1117
  });
1097
1118
  }
1119
+ processValue = (value) => {
1120
+ const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
1121
+ const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
1122
+ const { minParts, maxParts, workingParts, el } = this;
1123
+ this.warnIfIncorrectValueUsage();
1124
+ /**
1125
+ * Return early if the value wasn't parsed correctly, such as
1126
+ * if an improperly formatted date string was provided.
1127
+ */
1128
+ if (!valueToProcess) {
1129
+ return;
1130
+ }
1131
+ /**
1132
+ * Datetime should only warn of out of bounds values
1133
+ * if set by the user. If the `value` is undefined,
1134
+ * we will default to today's date which may be out
1135
+ * of bounds. In this case, the warning makes it look
1136
+ * like the developer did something wrong which is
1137
+ * not true.
1138
+ */
1139
+ if (hasValue) {
1140
+ warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
1141
+ }
1142
+ /**
1143
+ * If there are multiple values, clamp to the last one.
1144
+ * This is because the last value is the one that the user
1145
+ * has most recently interacted with.
1146
+ */
1147
+ const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
1148
+ const targetValue = clampDate(singleValue, minParts, maxParts);
1149
+ const { month, day, year, hour, minute } = targetValue;
1150
+ const ampm = parseAmPm(hour);
1151
+ /**
1152
+ * Since `activeParts` indicates a value that been explicitly selected
1153
+ * either by the user or the app, only update `activeParts` if the
1154
+ * `value` property is set.
1155
+ */
1156
+ if (hasValue) {
1157
+ if (Array.isArray(valueToProcess)) {
1158
+ this.activeParts = [...valueToProcess];
1159
+ }
1160
+ else {
1161
+ this.activeParts = {
1162
+ month,
1163
+ day,
1164
+ year,
1165
+ hour,
1166
+ minute,
1167
+ ampm,
1168
+ };
1169
+ }
1170
+ }
1171
+ else {
1172
+ /**
1173
+ * Reset the active parts if the value is not set.
1174
+ * This will clear the selected calendar day when
1175
+ * performing a clear action or using the reset() method.
1176
+ */
1177
+ this.activeParts = [];
1178
+ }
1179
+ const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
1180
+ const bodyIsVisible = el.classList.contains('datetime-ready');
1181
+ const { isGridStyle, showMonthAndYear } = this;
1182
+ if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
1183
+ /**
1184
+ * Only animate if:
1185
+ * 1. We're using grid style (wheel style pickers should just jump to new value)
1186
+ * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
1187
+ * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
1188
+ * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
1189
+ */
1190
+ this.animateToDate(targetValue);
1191
+ }
1192
+ else {
1193
+ this.setWorkingParts({
1194
+ month,
1195
+ day,
1196
+ year,
1197
+ hour,
1198
+ minute,
1199
+ ampm,
1200
+ });
1201
+ }
1202
+ };
1203
+ animateToDate = async (targetValue) => {
1204
+ const { workingParts } = this;
1205
+ /**
1206
+ * Tell other render functions that we need to force the
1207
+ * target month to appear in place of the actual next/prev month.
1208
+ * Because this is a State variable, a rerender will be triggered
1209
+ * automatically, updating the rendered months.
1210
+ */
1211
+ this.forceRenderDate = targetValue;
1212
+ /**
1213
+ * Flag that we've started scrolling to the forced date.
1214
+ * The resolve function will be called by the datetime's
1215
+ * scroll listener when it's done updating everything.
1216
+ * This is a replacement for making prev/nextMonth async,
1217
+ * since the logic we're waiting on is in a listener.
1218
+ */
1219
+ const forceDateScrollingPromise = new Promise((resolve) => {
1220
+ this.resolveForceDateScrolling = resolve;
1221
+ });
1222
+ /**
1223
+ * Animate smoothly to the forced month. This will also update
1224
+ * workingParts and correct the surrounding months for us.
1225
+ */
1226
+ const targetMonthIsBefore = isBefore(targetValue, workingParts);
1227
+ targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
1228
+ await forceDateScrollingPromise;
1229
+ this.resolveForceDateScrolling = undefined;
1230
+ this.forceRenderDate = undefined;
1231
+ };
1098
1232
  componentWillLoad() {
1099
1233
  const { el, formatOptions, highlightedDates, multiple, presentation, preferWheel } = this;
1100
1234
  if (multiple) {
@@ -1145,6 +1279,52 @@ export class Datetime {
1145
1279
  'interactive-disabled': this.disabled,
1146
1280
  });
1147
1281
  }
1282
+ onFocus = () => {
1283
+ this.ionFocus.emit();
1284
+ };
1285
+ onBlur = () => {
1286
+ this.ionBlur.emit();
1287
+ };
1288
+ hasValue = () => {
1289
+ return this.value != null;
1290
+ };
1291
+ nextMonth = () => {
1292
+ const calendarBodyRef = this.calendarBodyRef;
1293
+ if (!calendarBodyRef) {
1294
+ return;
1295
+ }
1296
+ const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
1297
+ if (!nextMonth) {
1298
+ return;
1299
+ }
1300
+ const left = nextMonth.offsetWidth * 2;
1301
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
1302
+ calendarBodyRef.scrollTo({
1303
+ top: 0,
1304
+ left: left * (isRTL(this.el) ? -1 : 1),
1305
+ behavior: scrollMode,
1306
+ });
1307
+ };
1308
+ prevMonth = () => {
1309
+ const calendarBodyRef = this.calendarBodyRef;
1310
+ if (!calendarBodyRef) {
1311
+ return;
1312
+ }
1313
+ const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
1314
+ if (!prevMonth) {
1315
+ return;
1316
+ }
1317
+ const left = prevMonth.offsetWidth * 2;
1318
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
1319
+ calendarBodyRef.scrollTo({
1320
+ top: 0,
1321
+ left: left * (isRTL(this.el) ? 1 : -1),
1322
+ behavior: scrollMode,
1323
+ });
1324
+ };
1325
+ toggleMonthAndYearView = () => {
1326
+ this.showMonthAndYear = !this.showMonthAndYear;
1327
+ };
1148
1328
  /**
1149
1329
  * Universal render methods
1150
1330
  * These are pieces of datetime that
@@ -1243,7 +1423,10 @@ export class Datetime {
1243
1423
  catch (e) {
1244
1424
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1245
1425
  }
1246
- return Object.assign(Object.assign({}, itemObject), { disabled });
1426
+ return {
1427
+ ...itemObject,
1428
+ disabled,
1429
+ };
1247
1430
  });
1248
1431
  }
1249
1432
  /**
@@ -1256,10 +1439,16 @@ export class Datetime {
1256
1439
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a date", class: "date-column", color: this.color, disabled: disabled, value: todayString, onIonChange: (ev) => {
1257
1440
  const { value } = ev.detail;
1258
1441
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1259
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
1260
- this.setActiveParts(Object.assign(Object.assign({}, activePart), findPart));
1442
+ this.setWorkingParts({
1443
+ ...workingParts,
1444
+ ...findPart,
1445
+ });
1446
+ this.setActiveParts({
1447
+ ...activePart,
1448
+ ...findPart,
1449
+ });
1261
1450
  ev.stopPropagation();
1262
- } }, items.map((item) => (h("ion-picker-column-option", { part: item.value === todayString ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: item.value, disabled: item.disabled, value: item.value }, item.text)))));
1451
+ } }, items.map((item) => (h("ion-picker-column-option", { color: this.color, part: item.value === todayString ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: item.value, disabled: item.disabled, value: item.value }, item.text)))));
1263
1452
  }
1264
1453
  renderIndividualDatePickerColumns(forcePresentation) {
1265
1454
  const { workingParts, isDateEnabled } = this;
@@ -1292,7 +1481,10 @@ export class Datetime {
1292
1481
  catch (e) {
1293
1482
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1294
1483
  }
1295
- return Object.assign(Object.assign({}, dayObject), { disabled });
1484
+ return {
1485
+ ...dayObject,
1486
+ disabled,
1487
+ };
1296
1488
  });
1297
1489
  }
1298
1490
  const shouldRenderYears = forcePresentation !== 'month' && forcePresentation !== 'time';
@@ -1321,18 +1513,23 @@ export class Datetime {
1321
1513
  return renderArray;
1322
1514
  }
1323
1515
  renderDayPickerColumn(days) {
1324
- var _a;
1325
1516
  if (days.length === 0) {
1326
1517
  return [];
1327
1518
  }
1328
1519
  const { disabled, workingParts } = this;
1329
1520
  const activePart = this.getActivePartsWithFallback();
1330
- const pickerColumnValue = (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined;
1521
+ const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
1331
1522
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day", class: "day-column", color: this.color, disabled: disabled, value: pickerColumnValue, onIonChange: (ev) => {
1332
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1333
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1523
+ this.setWorkingParts({
1524
+ ...workingParts,
1525
+ day: ev.detail.value,
1526
+ });
1527
+ this.setActiveParts({
1528
+ ...activePart,
1529
+ day: ev.detail.value,
1530
+ });
1334
1531
  ev.stopPropagation();
1335
- } }, days.map((day) => (h("ion-picker-column-option", { part: day.value === pickerColumnValue ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: day.value, disabled: day.disabled, value: day.value }, day.text)))));
1532
+ } }, days.map((day) => (h("ion-picker-column-option", { color: this.color, part: day.value === pickerColumnValue ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: day.value, disabled: day.disabled, value: day.value }, day.text)))));
1336
1533
  }
1337
1534
  renderMonthPickerColumn(months) {
1338
1535
  if (months.length === 0) {
@@ -1341,13 +1538,19 @@ export class Datetime {
1341
1538
  const { disabled, workingParts } = this;
1342
1539
  const activePart = this.getActivePartsWithFallback();
1343
1540
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a month", class: "month-column", color: this.color, disabled: disabled, value: workingParts.month, onIonChange: (ev) => {
1344
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1541
+ this.setWorkingParts({
1542
+ ...workingParts,
1543
+ month: ev.detail.value,
1544
+ });
1345
1545
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1346
1546
  if (!this.multiple) {
1347
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1547
+ this.setActiveParts({
1548
+ ...activePart,
1549
+ month: ev.detail.value,
1550
+ });
1348
1551
  }
1349
1552
  ev.stopPropagation();
1350
- } }, months.map((month) => (h("ion-picker-column-option", { part: month.value === workingParts.month ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: month.value, disabled: month.disabled, value: month.value }, month.text)))));
1553
+ } }, months.map((month) => (h("ion-picker-column-option", { color: this.color, part: month.value === workingParts.month ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: month.value, disabled: month.disabled, value: month.value }, month.text)))));
1351
1554
  }
1352
1555
  renderYearPickerColumn(years) {
1353
1556
  if (years.length === 0) {
@@ -1356,13 +1559,19 @@ export class Datetime {
1356
1559
  const { disabled, workingParts } = this;
1357
1560
  const activePart = this.getActivePartsWithFallback();
1358
1561
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a year", class: "year-column", color: this.color, disabled: disabled, value: workingParts.year, onIonChange: (ev) => {
1359
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1562
+ this.setWorkingParts({
1563
+ ...workingParts,
1564
+ year: ev.detail.value,
1565
+ });
1360
1566
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1361
1567
  if (!this.multiple) {
1362
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1568
+ this.setActiveParts({
1569
+ ...activePart,
1570
+ year: ev.detail.value,
1571
+ });
1363
1572
  }
1364
1573
  ev.stopPropagation();
1365
- } }, years.map((year) => (h("ion-picker-column-option", { part: year.value === workingParts.year ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: year.value, disabled: year.disabled, value: year.value }, year.text)))));
1574
+ } }, years.map((year) => (h("ion-picker-column-option", { color: this.color, part: year.value === workingParts.year ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: year.value, disabled: year.disabled, value: year.value }, year.text)))));
1366
1575
  }
1367
1576
  renderTimePickerColumns(forcePresentation) {
1368
1577
  if (['date', 'month', 'month-year', 'year'].includes(forcePresentation)) {
@@ -1392,10 +1601,16 @@ export class Datetime {
1392
1601
  return [];
1393
1602
  const activePart = this.getActivePartsWithFallback();
1394
1603
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select an hour", color: this.color, disabled: disabled, value: activePart.hour, numericInput: true, onIonChange: (ev) => {
1395
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1396
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { hour: ev.detail.value }));
1604
+ this.setWorkingParts({
1605
+ ...workingParts,
1606
+ hour: ev.detail.value,
1607
+ });
1608
+ this.setActiveParts({
1609
+ ...this.getActivePartsWithFallback(),
1610
+ hour: ev.detail.value,
1611
+ });
1397
1612
  ev.stopPropagation();
1398
- } }, hoursData.map((hour) => (h("ion-picker-column-option", { part: hour.value === activePart.hour ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: hour.value, disabled: hour.disabled, value: hour.value }, hour.text)))));
1613
+ } }, hoursData.map((hour) => (h("ion-picker-column-option", { color: this.color, part: hour.value === activePart.hour ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: hour.value, disabled: hour.disabled, value: hour.value }, hour.text)))));
1399
1614
  }
1400
1615
  renderMinutePickerColumn(minutesData) {
1401
1616
  const { disabled, workingParts } = this;
@@ -1403,10 +1618,16 @@ export class Datetime {
1403
1618
  return [];
1404
1619
  const activePart = this.getActivePartsWithFallback();
1405
1620
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a minute", color: this.color, disabled: disabled, value: activePart.minute, numericInput: true, onIonChange: (ev) => {
1406
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1407
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { minute: ev.detail.value }));
1621
+ this.setWorkingParts({
1622
+ ...workingParts,
1623
+ minute: ev.detail.value,
1624
+ });
1625
+ this.setActiveParts({
1626
+ ...this.getActivePartsWithFallback(),
1627
+ minute: ev.detail.value,
1628
+ });
1408
1629
  ev.stopPropagation();
1409
- } }, minutesData.map((minute) => (h("ion-picker-column-option", { part: minute.value === activePart.minute ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: minute.value, disabled: minute.disabled, value: minute.value }, minute.text)))));
1630
+ } }, minutesData.map((minute) => (h("ion-picker-column-option", { color: this.color, part: minute.value === activePart.minute ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: minute.value, disabled: minute.disabled, value: minute.value }, minute.text)))));
1410
1631
  }
1411
1632
  renderDayPeriodPickerColumn(dayPeriodData) {
1412
1633
  const { disabled, workingParts } = this;
@@ -1417,10 +1638,18 @@ export class Datetime {
1417
1638
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1418
1639
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day period", style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, disabled: disabled, value: activePart.ampm, onIonChange: (ev) => {
1419
1640
  const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1420
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1421
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { ampm: ev.detail.value, hour }));
1641
+ this.setWorkingParts({
1642
+ ...workingParts,
1643
+ ampm: ev.detail.value,
1644
+ hour,
1645
+ });
1646
+ this.setActiveParts({
1647
+ ...this.getActivePartsWithFallback(),
1648
+ ampm: ev.detail.value,
1649
+ hour,
1650
+ });
1422
1651
  ev.stopPropagation();
1423
- } }, dayPeriodData.map((dayPeriod) => (h("ion-picker-column-option", { part: dayPeriod.value === activePart.ampm ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: dayPeriod.value, disabled: dayPeriod.disabled, value: dayPeriod.value }, dayPeriod.text)))));
1652
+ } }, dayPeriodData.map((dayPeriod) => (h("ion-picker-column-option", { color: this.color, part: dayPeriod.value === activePart.ampm ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: dayPeriod.value, disabled: dayPeriod.disabled, value: dayPeriod.value }, dayPeriod.text)))));
1424
1653
  }
1425
1654
  renderWheelView(forcePresentation) {
1426
1655
  const { locale } = this;
@@ -1464,8 +1693,8 @@ export class Datetime {
1464
1693
  // The day is not used when checking if a month is disabled.
1465
1694
  // Users should be able to access the min or max month, even if the
1466
1695
  // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1467
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1468
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1696
+ minParts: { ...this.minParts, day: null },
1697
+ maxParts: { ...this.maxParts, day: null },
1469
1698
  });
1470
1699
  // The working month should never have swipe disabled.
1471
1700
  // Otherwise the CSS scroll snap will not work and the user
@@ -1574,18 +1803,24 @@ export class Datetime {
1574
1803
  if (isAdjacentDay) {
1575
1804
  // The user selected a day outside the current month. Ignore this button, as the month will be re-rendered.
1576
1805
  this.el.blur();
1577
- this.activeParts = Object.assign(Object.assign({}, activePart), referenceParts);
1806
+ this.activeParts = { ...activePart, ...referenceParts };
1578
1807
  this.animateToDate(referenceParts);
1579
1808
  this.confirm();
1580
1809
  }
1581
1810
  else {
1582
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), referenceParts));
1811
+ this.setWorkingParts({
1812
+ ...this.workingParts,
1813
+ ...referenceParts,
1814
+ });
1583
1815
  // Multiple only needs date info so we can wipe out other fields like time.
1584
1816
  if (multiple) {
1585
1817
  this.setActiveParts(referenceParts, isActive);
1586
1818
  }
1587
1819
  else {
1588
- this.setActiveParts(Object.assign(Object.assign({}, activePart), referenceParts));
1820
+ this.setActiveParts({
1821
+ ...activePart,
1822
+ ...referenceParts,
1823
+ });
1589
1824
  }
1590
1825
  }
1591
1826
  }
@@ -1628,7 +1863,7 @@ export class Datetime {
1628
1863
  await popoverRef.onWillDismiss();
1629
1864
  this.isTimePopoverOpen = false;
1630
1865
  }
1631
- } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.time)),
1866
+ } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions?.time)),
1632
1867
  h("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
1633
1868
  /**
1634
1869
  * Intersection Observers do not consistently fire between Blink and Webkit
@@ -1651,7 +1886,6 @@ export class Datetime {
1651
1886
  ];
1652
1887
  }
1653
1888
  getHeaderSelectedDateText() {
1654
- var _a;
1655
1889
  const { activeParts, formatOptions, multiple, titleSelectedDatesFormatter } = this;
1656
1890
  const isArray = Array.isArray(activeParts);
1657
1891
  let headerText;
@@ -1668,7 +1902,7 @@ export class Datetime {
1668
1902
  }
1669
1903
  else {
1670
1904
  // for exactly 1 day selected (multiple set or not), show a formatted version of that
1671
- headerText = getLocalizedDateTime(this.locale, this.getActivePartsWithFallback(), (_a = formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.date) !== null && _a !== void 0 ? _a : { weekday: 'short', month: 'short', day: 'numeric' });
1905
+ headerText = getLocalizedDateTime(this.locale, this.getActivePartsWithFallback(), formatOptions?.date ?? { weekday: 'short', month: 'short', day: 'numeric' });
1672
1906
  }
1673
1907
  return headerText;
1674
1908
  }
@@ -1757,17 +1991,19 @@ export class Datetime {
1757
1991
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1758
1992
  const hasWheelVariant = hasDatePresentation && preferWheel;
1759
1993
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1760
- return (h(Host, { key: '48555ab73ae3f22b56d15e83ff5e29b854ccc2ef', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1761
- [mode]: true,
1762
- ['datetime-readonly']: readonly,
1763
- ['datetime-disabled']: disabled,
1764
- 'show-month-and-year': shouldShowMonthAndYear,
1765
- 'month-year-picker-open': monthYearPickerOpen,
1766
- [`datetime-presentation-${presentation}`]: true,
1767
- [`datetime-size-${size}`]: true,
1768
- [`datetime-prefer-wheel`]: hasWheelVariant,
1769
- [`datetime-grid`]: isGridStyle,
1770
- })) }, h("div", { key: 'd09134c540f93a8cc92cdf41ad5d3623632d144f', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1994
+ return (h(Host, { key: 'd8e6dfe5e3bffb1c38a3e37b63b3aec099f40d29', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1995
+ ...createColorClasses(color, {
1996
+ [mode]: true,
1997
+ ['datetime-readonly']: readonly,
1998
+ ['datetime-disabled']: disabled,
1999
+ 'show-month-and-year': shouldShowMonthAndYear,
2000
+ 'month-year-picker-open': monthYearPickerOpen,
2001
+ [`datetime-presentation-${presentation}`]: true,
2002
+ [`datetime-size-${size}`]: true,
2003
+ [`datetime-prefer-wheel`]: hasWheelVariant,
2004
+ [`datetime-grid`]: isGridStyle,
2005
+ }),
2006
+ } }, h("div", { key: '20889d3c68dd5109633c0e214411a63d6f3025bb', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1771
2007
  }
1772
2008
  static get is() { return "ion-datetime"; }
1773
2009
  static get encapsulation() { return "shadow"; }
@@ -1809,8 +2045,7 @@ export class Datetime {
1809
2045
  "getter": false,
1810
2046
  "setter": false,
1811
2047
  "reflect": false,
1812
- "attribute": "color",
1813
- "defaultValue": "'primary'"
2048
+ "attribute": "color"
1814
2049
  },
1815
2050
  "name": {
1816
2051
  "type": "string",