@ionic/core 8.8.18-dev.11786487682.1e6f798f → 8.8.18-dev.11786663039.1d61e2fe

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 (1229) 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-0tt0PTAe.js +4 -0
  99. package/components/p-3dKnMgX5.js +4 -0
  100. package/components/p-6e_5igwn.js +4 -0
  101. package/components/p-AqD_wmvU.js +4 -0
  102. package/components/p-B-FxiyeI.js +4 -0
  103. package/components/p-B4COLbAV.js +4 -0
  104. package/components/p-B9zzUBwR.js +4 -0
  105. package/components/p-BFU7kgcj.js +4 -0
  106. package/components/p-BMPN55of.js +4 -0
  107. package/components/p-BPbRjpb2.js +4 -0
  108. package/components/p-BSQPZ79H.js +4 -0
  109. package/components/p-BXQ7upSC.js +4 -0
  110. package/components/p-BhamHSw3.js +4 -0
  111. package/components/p-BmVRXR1y.js +4 -0
  112. package/components/p-BrXE0XUu.js +4 -0
  113. package/components/p-Bv7Rqz3Z.js +4 -0
  114. package/components/p-Bw7MMRH7.js +4 -0
  115. package/components/p-C-X5vb8f.js +4 -0
  116. package/components/p-C117Majq.js +4 -0
  117. package/components/{p-DWoO0801.js → p-C6JOi8wS.js} +1 -1
  118. package/components/p-CCVPk59A.js +4 -0
  119. package/components/p-CEW4RXZO.js +4 -0
  120. package/components/p-CIGNaXM1.js +4 -0
  121. package/components/p-CKMc290p.js +4 -0
  122. package/components/{p-B2SvA6NE.js → p-CO5nI-BZ.js} +1 -1
  123. package/components/p-COQ_7Wwc.js +4 -0
  124. package/components/p-CQbh6Be_.js +4 -0
  125. package/components/p-CQtcj8t7.js +4 -0
  126. package/components/p-Cap9bvqr.js +4 -0
  127. package/components/p-CdP7ze2J.js +4 -0
  128. package/components/p-CfyJ_Ogc.js +4 -0
  129. package/components/p-ChWC4-vA.js +4 -0
  130. package/components/p-CmKf4pgI.js +4 -0
  131. package/components/p-CqYSqB9_.js +4 -0
  132. package/{dist/ionic/p-Cm20lBQw.js → components/p-Cwsd9bue.js} +1 -1
  133. package/components/p-D0pL_HuH.js +4 -0
  134. package/components/p-D0xd6h3Q.js +4 -0
  135. package/components/p-D28LaDuR.js +4 -0
  136. package/components/p-D7-vHX0A.js +4 -0
  137. package/components/p-D9KqizZs.js +4 -0
  138. package/components/p-DIZE3CVV.js +4 -0
  139. package/components/p-DJztqcrH.js +4 -0
  140. package/{dist/ionic/p-im8OkZlj.js → components/p-DL8rd5jo.js} +1 -1
  141. package/components/p-DRcApg6F.js +4 -0
  142. package/components/p-DTTnwMiS.js +4 -0
  143. package/components/p-DWCzVL3Y.js +4 -0
  144. package/components/p-DYmrV1HT.js +4 -0
  145. package/components/{p-BZwQa9ey.js → p-Dcu-SAJG.js} +1 -1
  146. package/components/p-DnINLmwC.js +4 -0
  147. package/components/{p-CVqhQif1.js → p-DsNz6_gM.js} +1 -1
  148. package/components/p-DtiuiOTk.js +4 -0
  149. package/components/p-DunYzubP.js +4 -0
  150. package/components/p-DwcSJ9u1.js +4 -0
  151. package/components/p-LpMHEu3v.js +4 -0
  152. package/components/p-QCPSB1bo.js +4 -0
  153. package/components/p-RvtofbHn.js +4 -0
  154. package/components/p-TXPDHL13.js +4 -0
  155. package/components/p-WOFp6fXj.js +4 -0
  156. package/components/p-ZjP4CjeZ.js +4 -0
  157. package/components/p-byZM6qHV.js +4 -0
  158. package/components/{p-B_jBop0E.js → p-ltNYIRmI.js} +1 -1
  159. package/components/p-miSGCTAU.js +4 -0
  160. package/components/p-mpdX3emm.js +4 -0
  161. package/components/p-nvqVLrWC.js +4 -0
  162. package/components/p-qiWM96Sz.js +4 -0
  163. package/components/p-vlF0Bcfd.js +4 -0
  164. package/css/core.css +1 -1
  165. package/css/core.css.map +1 -1
  166. package/css/display.css +1 -1
  167. package/css/display.css.map +1 -1
  168. package/css/flex-utils.css +1 -1
  169. package/css/flex-utils.css.map +1 -1
  170. package/css/float-elements.css.map +1 -1
  171. package/css/global.bundle.css.map +1 -1
  172. package/css/ionic-swiper.css +1 -1
  173. package/css/ionic-swiper.css.map +1 -1
  174. package/css/ionic.bundle.css +1 -1
  175. package/css/ionic.bundle.css.map +1 -1
  176. package/css/normalize.css.map +1 -1
  177. package/css/padding.css.map +1 -1
  178. package/css/palettes/dark.always.css.map +1 -1
  179. package/css/palettes/dark.class.css.map +1 -1
  180. package/css/palettes/dark.system.css.map +1 -1
  181. package/css/palettes/high-contrast-dark.always.css.map +1 -1
  182. package/css/palettes/high-contrast-dark.class.css.map +1 -1
  183. package/css/palettes/high-contrast-dark.system.css.map +1 -1
  184. package/css/palettes/high-contrast.always.css.map +1 -1
  185. package/css/palettes/high-contrast.class.css.map +1 -1
  186. package/css/palettes/high-contrast.system.css.map +1 -1
  187. package/css/structure.css.map +1 -1
  188. package/css/text-alignment.css.map +1 -1
  189. package/css/text-transformation.css.map +1 -1
  190. package/css/typography.css.map +1 -1
  191. package/css/utils.bundle.css +1 -1
  192. package/css/utils.bundle.css.map +1 -1
  193. package/dist/cjs/{animation-B3xfVcDO.js → animation-D5WDBRvT.js} +6 -6
  194. package/dist/cjs/{app-globals-3ZoCVkn-.js → app-globals-C2s3Cbal.js} +1 -1
  195. package/dist/cjs/{button-active-3tZKuPbT.js → button-active-CXI2TseG.js} +3 -3
  196. package/dist/cjs/{capacitor-CQSg1uCo.js → capacitor-DmA66EwP.js} +3 -3
  197. package/dist/cjs/{config-DWdFbSNK.js → config-CjUbvdPW.js} +5 -4
  198. package/dist/cjs/{dir-Cn0z1rJH.js → dir-Brx7VkvP.js} +1 -1
  199. package/dist/{esm/focus-visible-vXpMhGrs.js → cjs/focus-visible-CCvKiLh3.js} +3 -23
  200. package/dist/cjs/{format-BCIkDef_.js → format-ZfKtcdit.js} +40 -30
  201. package/dist/cjs/{framework-delegate-DC5nq_NN.js → framework-delegate-Bdvk3JQO.js} +6 -10
  202. package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-BDUH7687.js} +15 -8
  203. package/dist/cjs/{haptic-eix26ESE.js → haptic-Ch-X4gRx.js} +3 -4
  204. package/dist/cjs/hardware-back-button-zr8zeYaH.js +121 -0
  205. package/dist/cjs/{helpers-DiOgV5hw.js → helpers-DURh1XdY.js} +6 -73
  206. package/dist/cjs/{index-DYRcC3bw.js → index-B7sCu6vN.js} +15 -16
  207. package/dist/cjs/{index-BxEZd5IE.js → index-BnhnwL1o.js} +2 -2
  208. package/dist/cjs/{index-bX3nz2vw.js → index-Btdix80K.js} +8 -9
  209. package/dist/cjs/{index-GZU9YrFc.js → index-CAThePqm.js} +8 -47
  210. package/dist/cjs/{index-Bj07IRTB.js → index-DhSx3VvD.js} +3 -3
  211. package/dist/cjs/index-DkNv4J_i.js +10 -0
  212. package/dist/cjs/{index-BaJ7_YbC.js → index-DsoHs7Ly.js} +5 -5
  213. package/dist/cjs/{index-CAvQ7Tka.js → index-P1nQxrpZ.js} +10 -4
  214. package/dist/cjs/{index-CxDnX7hd.js → index-wOmugbdg.js} +0 -2
  215. package/dist/cjs/index.cjs.js +17 -17
  216. package/dist/cjs/{input-shims-BSEBw22J.js → input-shims-CPbWb84M.js} +19 -22
  217. package/dist/cjs/{input.utils-D68wgI2Y.js → input.utils-CkASW3mE.js} +6 -7
  218. package/dist/cjs/ion-accordion_2.cjs.entry.js +378 -382
  219. package/dist/cjs/ion-action-sheet.cjs.entry.js +178 -86
  220. package/dist/cjs/ion-alert.cjs.entry.js +250 -125
  221. package/dist/cjs/ion-app_8.cjs.entry.js +460 -608
  222. package/dist/cjs/ion-avatar_3.cjs.entry.js +19 -125
  223. package/dist/cjs/ion-back-button.cjs.entry.js +64 -49
  224. package/dist/cjs/ion-backdrop.cjs.entry.js +23 -22
  225. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +211 -169
  226. package/dist/cjs/ion-button_2.cjs.entry.js +152 -117
  227. package/dist/cjs/ion-card_5.cjs.entry.js +109 -79
  228. package/dist/cjs/ion-checkbox.cjs.entry.js +163 -129
  229. package/dist/cjs/ion-chip.cjs.entry.js +21 -56
  230. package/dist/cjs/ion-col_3.cjs.entry.js +186 -61
  231. package/dist/cjs/ion-datetime-button.cjs.entry.js +255 -247
  232. package/dist/cjs/ion-datetime.cjs.entry.js +2767 -0
  233. package/dist/cjs/ion-fab_3.cjs.entry.js +154 -112
  234. package/dist/cjs/ion-img.cjs.entry.js +34 -16
  235. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +108 -156
  236. package/dist/cjs/ion-input-otp.cjs.entry.js +435 -437
  237. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +40 -64
  238. package/dist/cjs/ion-input.cjs.entry.js +330 -276
  239. package/dist/cjs/ion-item-option_3.cjs.entry.js +136 -511
  240. package/dist/cjs/ion-item_8.cjs.entry.js +217 -189
  241. package/dist/cjs/ion-loading.cjs.entry.js +151 -68
  242. package/dist/cjs/ion-menu_3.cjs.entry.js +181 -137
  243. package/dist/cjs/ion-modal.cjs.entry.js +534 -491
  244. package/dist/cjs/ion-nav_2.cjs.entry.js +103 -163
  245. package/dist/cjs/ion-picker-column-option.cjs.entry.js +39 -39
  246. package/dist/cjs/ion-picker-column.cjs.entry.js +421 -409
  247. package/dist/cjs/ion-picker.cjs.entry.js +405 -400
  248. package/dist/cjs/ion-popover.cjs.entry.js +323 -211
  249. package/dist/cjs/ion-progress-bar.cjs.entry.js +35 -47
  250. package/dist/cjs/ion-radio_2.cjs.entry.js +216 -161
  251. package/dist/cjs/ion-range.cjs.entry.js +307 -249
  252. package/dist/cjs/ion-refresher_2.cjs.entry.js +174 -121
  253. package/dist/cjs/ion-reorder_2.cjs.entry.js +59 -53
  254. package/dist/cjs/ion-ripple-effect.cjs.entry.js +18 -26
  255. package/dist/cjs/ion-route_4.cjs.entry.js +178 -75
  256. package/dist/cjs/ion-searchbar.cjs.entry.js +308 -331
  257. package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
  258. package/dist/cjs/ion-segment-view.cjs.entry.js +28 -27
  259. package/dist/cjs/ion-segment_2.cjs.entry.js +177 -141
  260. package/dist/cjs/ion-select-modal.cjs.entry.js +49 -69
  261. package/dist/cjs/ion-select_3.cjs.entry.js +481 -385
  262. package/dist/cjs/ion-spinner.cjs.entry.js +28 -36
  263. package/dist/cjs/ion-split-pane.cjs.entry.js +34 -25
  264. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +116 -179
  265. package/dist/cjs/ion-tab_2.cjs.entry.js +54 -29
  266. package/dist/cjs/ion-text.cjs.entry.js +13 -7
  267. package/dist/cjs/ion-textarea.cjs.entry.js +274 -269
  268. package/dist/cjs/ion-toast.cjs.entry.js +264 -169
  269. package/dist/cjs/ion-toggle.cjs.entry.js +184 -187
  270. package/dist/cjs/ionic-global-dMut1Czp.js +156 -0
  271. package/dist/cjs/ionic.cjs.js +4 -4
  272. package/dist/cjs/{ios.transition-DpFQfFfT.js → ios.transition-CeaFa0y2.js} +14 -20
  273. package/dist/cjs/{item-multiple-inputs-BG9f5_eV.js → item-multiple-inputs-HQO5Iy9I.js} +1 -1
  274. package/dist/cjs/{keyboard-faZBQysj.js → keyboard-Cix5TVkD.js} +4 -5
  275. package/dist/cjs/{keyboard-Bn0Ppim6.js → keyboard-cHxZlTyz.js} +3 -3
  276. package/dist/cjs/keyboard-controller-PtZoN2GS.js +167 -0
  277. package/dist/cjs/loader.cjs.js +4 -4
  278. package/dist/cjs/{md.transition-ChJcoZUH.js → md.transition-D4Q5jny7.js} +8 -10
  279. package/dist/cjs/{notch-controller-BO0UGB4F.js → notch-controller-fMfidI-7.js} +4 -4
  280. package/dist/cjs/{overlay-control-label-DnRLQR1t.js → overlay-control-label-D2sdL2O8.js} +11 -13
  281. package/dist/cjs/{overlays-CFGbPUmE.js → overlays-C2qrqpHm.js} +60 -336
  282. package/dist/cjs/{select-option-render-DqBHEjDn.js → select-option-render-Dh16lTnA.js} +3 -4
  283. package/dist/cjs/{status-tap-x2qDo5QR.js → status-tap-CgjQ-6jq.js} +3 -4
  284. package/dist/cjs/{swipe-back-CvZt_4YX.js → swipe-back-CmfRYdWQ.js} +5 -6
  285. package/dist/cjs/{theme-IlOsGAz7.js → theme-Bw0rpaNN.js} +7 -26
  286. package/dist/cjs/validity-BpS37YFM.js +19 -0
  287. package/dist/collection/collection-manifest.json +1 -13
  288. package/dist/collection/components/accordion/accordion.ios.css +58 -73
  289. package/dist/collection/components/accordion/accordion.js +327 -338
  290. package/dist/collection/components/accordion/accordion.md.css +59 -67
  291. package/dist/collection/components/accordion-group/accordion-group.ios.css +4 -16
  292. package/dist/collection/components/accordion-group/accordion-group.js +56 -69
  293. package/dist/collection/components/accordion-group/accordion-group.md.css +4 -22
  294. package/dist/collection/components/action-sheet/action-sheet.ios.css +54 -184
  295. package/dist/collection/components/action-sheet/action-sheet.js +166 -76
  296. package/dist/collection/components/action-sheet/action-sheet.md.css +55 -179
  297. package/dist/collection/components/action-sheet/test/basic/fixture.js +3 -0
  298. package/dist/collection/components/alert/alert.ios.css +54 -247
  299. package/dist/collection/components/alert/alert.js +236 -113
  300. package/dist/collection/components/alert/alert.md.css +56 -243
  301. package/dist/collection/components/app/app.js +86 -15
  302. package/dist/collection/components/avatar/avatar.ios.css +33 -7
  303. package/dist/collection/components/avatar/avatar.js +4 -120
  304. package/dist/collection/components/avatar/avatar.md.css +0 -51
  305. package/dist/collection/components/back-button/back-button.ios.css +48 -60
  306. package/dist/collection/components/back-button/back-button.js +61 -46
  307. package/dist/collection/components/back-button/back-button.md.css +48 -60
  308. package/dist/collection/components/backdrop/backdrop.ios.css +19 -56
  309. package/dist/collection/components/backdrop/backdrop.js +22 -26
  310. package/dist/collection/components/backdrop/backdrop.md.css +19 -56
  311. package/dist/collection/components/badge/badge.ios.css +12 -137
  312. package/dist/collection/components/badge/badge.js +15 -145
  313. package/dist/collection/components/badge/badge.md.css +12 -122
  314. package/dist/collection/components/breadcrumb/breadcrumb.ios.css +8 -20
  315. package/dist/collection/components/breadcrumb/breadcrumb.js +101 -72
  316. package/dist/collection/components/breadcrumb/breadcrumb.md.css +8 -20
  317. package/dist/collection/components/breadcrumbs/breadcrumbs.ios.css +0 -6
  318. package/dist/collection/components/breadcrumbs/breadcrumbs.js +112 -99
  319. package/dist/collection/components/breadcrumbs/breadcrumbs.md.css +0 -6
  320. package/dist/collection/components/button/button.ios.css +46 -154
  321. package/dist/collection/components/button/button.js +157 -122
  322. package/dist/collection/components/button/button.md.css +50 -150
  323. package/dist/collection/components/buttons/buttons.ios.css +7 -59
  324. package/dist/collection/components/buttons/buttons.js +21 -29
  325. package/dist/collection/components/buttons/buttons.md.css +3 -55
  326. package/dist/collection/components/card/card.ios.css +14 -65
  327. package/dist/collection/components/card/card.js +63 -61
  328. package/dist/collection/components/card/card.md.css +14 -65
  329. package/dist/collection/components/card-content/card-content.ios.css +35 -20
  330. package/dist/collection/components/card-content/card-content.js +10 -12
  331. package/dist/collection/components/card-content/card-content.md.css +35 -20
  332. package/dist/collection/components/card-header/card-header.ios.css +15 -27
  333. package/dist/collection/components/card-header/card-header.js +21 -20
  334. package/dist/collection/components/card-header/card-header.md.css +15 -27
  335. package/dist/collection/components/card-subtitle/card-subtitle.ios.css +0 -12
  336. package/dist/collection/components/card-subtitle/card-subtitle.js +14 -11
  337. package/dist/collection/components/card-subtitle/card-subtitle.md.css +0 -12
  338. package/dist/collection/components/card-title/card-title.ios.css +0 -73
  339. package/dist/collection/components/card-title/card-title.js +14 -11
  340. package/dist/collection/components/card-title/card-title.md.css +0 -73
  341. package/dist/collection/components/checkbox/checkbox.ios.css +117 -242
  342. package/dist/collection/components/checkbox/checkbox.js +160 -165
  343. package/dist/collection/components/checkbox/checkbox.md.css +118 -243
  344. package/dist/collection/components/chip/chip.ios.css +14 -67
  345. package/dist/collection/components/chip/chip.js +20 -116
  346. package/dist/collection/components/chip/chip.md.css +14 -67
  347. package/dist/collection/components/col/col.css +4 -192
  348. package/dist/collection/components/col/col.js +186 -212
  349. package/dist/collection/components/content/content.css +2 -47
  350. package/dist/collection/components/content/content.js +101 -78
  351. package/dist/collection/components/datetime/datetime.ios.css +148 -304
  352. package/dist/collection/components/datetime/datetime.js +1064 -906
  353. package/dist/collection/components/datetime/datetime.md.css +138 -294
  354. package/dist/collection/components/datetime/utils/data.js +18 -19
  355. package/dist/collection/components/datetime/utils/format.js +21 -11
  356. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  357. package/dist/collection/components/datetime/utils/parse.js +10 -10
  358. package/dist/collection/components/datetime/utils/state.js +8 -2
  359. package/dist/collection/components/datetime/utils/validate.js +4 -5
  360. package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -6
  361. package/dist/collection/components/datetime-button/datetime-button.js +253 -246
  362. package/dist/collection/components/datetime-button/datetime-button.md.css +5 -6
  363. package/dist/collection/components/fab/fab.css +1 -25
  364. package/dist/collection/components/fab/fab.js +25 -22
  365. package/dist/collection/components/fab-button/fab-button.ios.css +6 -18
  366. package/dist/collection/components/fab-button/fab-button.js +117 -83
  367. package/dist/collection/components/fab-button/fab-button.md.css +8 -20
  368. package/dist/collection/components/fab-list/fab-list.css +0 -12
  369. package/dist/collection/components/fab-list/fab-list.js +15 -20
  370. package/dist/collection/components/footer/footer.ios.css +6 -33
  371. package/dist/collection/components/footer/footer.js +65 -151
  372. package/dist/collection/components/footer/footer.md.css +0 -40
  373. package/dist/collection/components/grid/grid.css +0 -12
  374. package/dist/collection/components/grid/grid.js +9 -15
  375. package/dist/collection/components/header/header.ios.css +133 -178
  376. package/dist/collection/components/header/header.js +70 -202
  377. package/dist/collection/components/header/header.md.css +9 -199
  378. package/dist/collection/components/header/header.utils.js +13 -6
  379. package/dist/collection/components/img/img.js +34 -16
  380. package/dist/collection/components/infinite-scroll/infinite-scroll.js +76 -164
  381. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.ios.css +0 -12
  382. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +30 -19
  383. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.md.css +0 -12
  384. package/dist/collection/components/input/input.ios.css +135 -223
  385. package/dist/collection/components/input/input.js +339 -307
  386. package/dist/collection/components/input/input.md.css +207 -193
  387. package/dist/collection/components/input-otp/input-otp.ios.css +60 -105
  388. package/dist/collection/components/input-otp/input-otp.js +432 -437
  389. package/dist/collection/components/input-otp/input-otp.md.css +60 -105
  390. package/dist/collection/components/input-password-toggle/input-password-toggle.js +37 -60
  391. package/dist/collection/components/item/item.ios.css +80 -120
  392. package/dist/collection/components/item/item.js +113 -102
  393. package/dist/collection/components/item/item.md.css +79 -131
  394. package/dist/collection/components/item-divider/item-divider.ios.css +0 -18
  395. package/dist/collection/components/item-divider/item-divider.js +23 -21
  396. package/dist/collection/components/item-divider/item-divider.md.css +0 -18
  397. package/dist/collection/components/item-group/item-group.ios.css +0 -12
  398. package/dist/collection/components/item-group/item-group.js +7 -13
  399. package/dist/collection/components/item-group/item-group.md.css +0 -12
  400. package/dist/collection/components/item-option/item-option.ios.css +29 -136
  401. package/dist/collection/components/item-option/item-option.js +56 -92
  402. package/dist/collection/components/item-option/item-option.md.css +29 -136
  403. package/dist/collection/components/item-options/item-options.ios.css +34 -77
  404. package/dist/collection/components/item-options/item-options.js +17 -20
  405. package/dist/collection/components/item-options/item-options.md.css +34 -77
  406. package/dist/collection/components/item-sliding/{item-sliding.native.css → item-sliding.css} +9 -84
  407. package/dist/collection/components/item-sliding/item-sliding.js +61 -441
  408. package/dist/collection/components/item-sliding/test/test.utils.js +0 -13
  409. package/dist/collection/components/label/label.ios.css +0 -18
  410. package/dist/collection/components/label/label.js +32 -15
  411. package/dist/collection/components/label/label.md.css +0 -18
  412. package/dist/collection/components/list/list.ios.css +14 -54
  413. package/dist/collection/components/list/list.js +19 -55
  414. package/dist/collection/components/list/list.md.css +16 -56
  415. package/dist/collection/components/list-header/list-header.ios.css +38 -82
  416. package/dist/collection/components/list-header/list-header.js +18 -11
  417. package/dist/collection/components/list-header/list-header.md.css +38 -82
  418. package/dist/collection/components/loading/loading.ios.css +1 -13
  419. package/dist/collection/components/loading/loading.js +143 -62
  420. package/dist/collection/components/loading/loading.md.css +1 -13
  421. package/dist/collection/components/menu/menu.ios.css +3 -15
  422. package/dist/collection/components/menu/menu.js +108 -71
  423. package/dist/collection/components/menu/menu.md.css +3 -15
  424. package/dist/collection/components/menu-button/menu-button.ios.css +14 -48
  425. package/dist/collection/components/menu-button/menu-button.js +38 -45
  426. package/dist/collection/components/menu-button/menu-button.md.css +15 -49
  427. package/dist/collection/components/menu-toggle/menu-toggle.js +25 -21
  428. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  429. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  430. package/dist/collection/components/modal/animations/sheet.js +2 -8
  431. package/dist/collection/components/modal/gestures/sheet.js +16 -83
  432. package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -2
  433. package/dist/collection/components/modal/modal.ios.css +70 -178
  434. package/dist/collection/components/modal/modal.js +399 -268
  435. package/dist/collection/components/modal/modal.md.css +70 -178
  436. package/dist/collection/components/modal/safe-area-utils.js +4 -5
  437. package/dist/collection/components/modal/test/fixtures.js +3 -0
  438. package/dist/collection/components/nav/nav.css +1 -7
  439. package/dist/collection/components/nav/nav.js +72 -256
  440. package/dist/collection/components/nav/view-controller.js +7 -1
  441. package/dist/collection/components/nav-link/nav-link.js +21 -14
  442. package/dist/collection/components/note/note.ios.css +0 -12
  443. package/dist/collection/components/note/note.js +14 -11
  444. package/dist/collection/components/note/note.md.css +0 -12
  445. package/dist/collection/components/picker/picker.ios.css +3 -15
  446. package/dist/collection/components/picker/picker.js +403 -398
  447. package/dist/collection/components/picker/picker.md.css +3 -15
  448. package/dist/collection/components/picker-column/picker-column.css +5 -9
  449. package/dist/collection/components/picker-column/picker-column.js +418 -409
  450. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +0 -6
  451. package/dist/collection/components/picker-column-option/picker-column-option.js +38 -42
  452. package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -7
  453. package/dist/collection/components/popover/animations/ios.enter.js +1 -2
  454. package/dist/collection/components/popover/animations/md.enter.js +1 -2
  455. package/dist/collection/components/popover/popover.ios.css +2 -15
  456. package/dist/collection/components/popover/popover.js +313 -199
  457. package/dist/collection/components/popover/popover.md.css +2 -15
  458. package/dist/collection/components/popover/test/fixture.js +1 -0
  459. package/dist/collection/components/popover/utils.js +4 -6
  460. package/dist/collection/components/progress-bar/progress-bar.ios.css +17 -48
  461. package/dist/collection/components/progress-bar/progress-bar.js +33 -65
  462. package/dist/collection/components/progress-bar/progress-bar.md.css +17 -48
  463. package/dist/collection/components/radio/radio.ios.css +102 -207
  464. package/dist/collection/components/radio/radio.js +108 -77
  465. package/dist/collection/components/radio/radio.md.css +102 -207
  466. package/dist/collection/components/radio-group/radio-group.ios.css +19 -43
  467. package/dist/collection/components/radio-group/radio-group.js +107 -113
  468. package/dist/collection/components/radio-group/radio-group.md.css +19 -43
  469. package/dist/collection/components/radio-group/test/fixtures.js +2 -0
  470. package/dist/collection/components/range/range.ios.css +85 -128
  471. package/dist/collection/components/range/range.js +303 -245
  472. package/dist/collection/components/range/range.md.css +85 -128
  473. package/dist/collection/components/refresher/refresher.ios.css +1 -14
  474. package/dist/collection/components/refresher/refresher.js +117 -88
  475. package/dist/collection/components/refresher/refresher.md.css +2 -15
  476. package/dist/collection/components/refresher-content/refresher-content.js +47 -31
  477. package/dist/collection/components/reorder/reorder.ios.css +0 -6
  478. package/dist/collection/components/reorder/reorder.js +7 -33
  479. package/dist/collection/components/reorder/reorder.md.css +0 -6
  480. package/dist/collection/components/reorder-group/reorder-group.css +0 -6
  481. package/dist/collection/components/reorder-group/reorder-group.js +47 -22
  482. package/dist/collection/components/ripple-effect/{ripple-effect.common.css → ripple-effect.css} +1 -7
  483. package/dist/collection/components/ripple-effect/ripple-effect.js +17 -26
  484. package/dist/collection/components/route/route.js +39 -14
  485. package/dist/collection/components/route-redirect/route-redirect.js +31 -0
  486. package/dist/collection/components/router/router.js +37 -37
  487. package/dist/collection/components/router/utils/dom.js +25 -7
  488. package/dist/collection/components/router/utils/matching.js +7 -9
  489. package/dist/collection/components/router/utils/parser.js +1 -1
  490. package/dist/collection/components/router/utils/path.js +0 -1
  491. package/dist/collection/components/router-link/router-link.css +2 -8
  492. package/dist/collection/components/router-link/router-link.js +40 -19
  493. package/dist/collection/components/router-outlet/router-outlet.css +1 -7
  494. package/dist/collection/components/router-outlet/router-outlet.js +83 -25
  495. package/dist/collection/components/row/row.css +0 -16
  496. package/dist/collection/components/row/row.js +2 -9
  497. package/dist/collection/components/searchbar/searchbar.ios.css +18 -56
  498. package/dist/collection/components/searchbar/searchbar.js +321 -380
  499. package/dist/collection/components/searchbar/searchbar.md.css +18 -56
  500. package/dist/collection/components/segment/segment.ios.css +2 -45
  501. package/dist/collection/components/segment/segment.js +126 -94
  502. package/dist/collection/components/segment/segment.md.css +2 -45
  503. package/dist/collection/components/segment-button/segment-button.ios.css +105 -146
  504. package/dist/collection/components/segment-button/segment-button.js +49 -46
  505. package/dist/collection/components/segment-button/segment-button.md.css +107 -148
  506. package/dist/collection/components/segment-content/segment-content.js +1 -1
  507. package/dist/collection/components/segment-view/segment-view.ios.css +0 -6
  508. package/dist/collection/components/segment-view/segment-view.js +28 -27
  509. package/dist/collection/components/segment-view/segment-view.md.css +0 -6
  510. package/dist/collection/components/select/select.ios.css +177 -316
  511. package/dist/collection/components/select/select.js +401 -399
  512. package/dist/collection/components/select/select.md.css +179 -332
  513. package/dist/collection/components/select-modal/select-modal.ios.css +45 -293
  514. package/dist/collection/components/select-modal/select-modal.js +37 -79
  515. package/dist/collection/components/select-modal/select-modal.md.css +43 -273
  516. package/dist/collection/components/select-modal/test/fixtures.js +8 -1
  517. package/dist/collection/components/select-option/select-option.js +48 -15
  518. package/dist/collection/components/select-popover/select-popover.ios.css +124 -188
  519. package/dist/collection/components/select-popover/select-popover.js +44 -37
  520. package/dist/collection/components/select-popover/select-popover.md.css +47 -228
  521. package/dist/collection/components/select-popover/test/fixtures.js +8 -1
  522. package/dist/collection/components/skeleton-text/skeleton-text.css +0 -6
  523. package/dist/collection/components/skeleton-text/skeleton-text.js +15 -15
  524. package/dist/collection/components/spinner/{spinner.ionic.css → spinner.css} +10 -78
  525. package/dist/collection/components/spinner/spinner.js +26 -55
  526. package/dist/collection/components/split-pane/split-pane.ios.css +2 -20
  527. package/dist/collection/components/split-pane/split-pane.js +33 -28
  528. package/dist/collection/components/split-pane/split-pane.md.css +2 -20
  529. package/dist/collection/components/tab/tab.js +17 -10
  530. package/dist/collection/components/tab-bar/tab-bar.ios.css +43 -86
  531. package/dist/collection/components/tab-bar/tab-bar.js +44 -190
  532. package/dist/collection/components/tab-bar/tab-bar.md.css +43 -86
  533. package/dist/collection/components/tab-button/tab-button.ios.css +95 -171
  534. package/dist/collection/components/tab-button/tab-button.js +68 -74
  535. package/dist/collection/components/tab-button/tab-button.md.css +93 -137
  536. package/dist/collection/components/tabs/tabs.css +1 -7
  537. package/dist/collection/components/tabs/tabs.js +33 -23
  538. package/dist/collection/components/text/text.css +0 -6
  539. package/dist/collection/components/text/text.js +12 -7
  540. package/dist/collection/components/textarea/textarea.ios.css +158 -298
  541. package/dist/collection/components/textarea/textarea.js +275 -295
  542. package/dist/collection/components/textarea/textarea.md.css +159 -312
  543. package/dist/collection/components/thumbnail/thumbnail.css +0 -6
  544. package/dist/collection/components/thumbnail/thumbnail.js +2 -9
  545. package/dist/collection/components/title/title.ios.css +4 -32
  546. package/dist/collection/components/title/title.js +23 -13
  547. package/dist/collection/components/title/title.md.css +4 -39
  548. package/dist/collection/components/toast/animations/utils.js +1 -1
  549. package/dist/collection/components/toast/toast.ios.css +45 -84
  550. package/dist/collection/components/toast/toast.js +232 -178
  551. package/dist/collection/components/toast/toast.md.css +45 -84
  552. package/dist/collection/components/toggle/toggle.ios.css +127 -247
  553. package/dist/collection/components/toggle/toggle.js +175 -177
  554. package/dist/collection/components/toggle/toggle.md.css +127 -245
  555. package/dist/collection/components/toolbar/toolbar.ios.css +47 -90
  556. package/dist/collection/components/toolbar/toolbar.js +25 -222
  557. package/dist/collection/components/toolbar/toolbar.md.css +47 -90
  558. package/dist/collection/global/config.js +4 -6
  559. package/dist/collection/global/ionic-global.js +20 -242
  560. package/dist/collection/index.js +1 -1
  561. package/dist/collection/utils/animation/animation.js +3 -3
  562. package/dist/collection/utils/config.js +5 -4
  563. package/dist/collection/utils/focus-controller/index.js +1 -1
  564. package/dist/collection/utils/focus-trap.js +5 -16
  565. package/dist/collection/utils/focus-visible.js +0 -22
  566. package/dist/collection/utils/forms/index.js +0 -1
  567. package/dist/collection/utils/forms/validity.js +0 -31
  568. package/dist/collection/utils/framework-delegate.js +5 -9
  569. package/dist/collection/utils/gesture/gesture-controller.js +15 -8
  570. package/dist/collection/utils/gesture/index.js +10 -2
  571. package/dist/collection/utils/gesture/listener.js +1 -1
  572. package/dist/collection/utils/hardware-back-button.js +3 -18
  573. package/dist/collection/utils/helpers.js +5 -72
  574. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  575. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  576. package/dist/collection/utils/keyboard/keyboard-controller.js +6 -8
  577. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  578. package/dist/collection/utils/media.js +0 -1
  579. package/dist/collection/utils/menu-controller/animations/overlay.js +3 -3
  580. package/dist/collection/utils/menu-controller/animations/push.js +1 -2
  581. package/dist/collection/utils/menu-controller/animations/reveal.js +1 -2
  582. package/dist/collection/utils/menu-controller/index.js +1 -2
  583. package/dist/collection/utils/native/haptic.js +2 -3
  584. package/dist/collection/utils/native/keyboard.js +2 -2
  585. package/dist/collection/utils/native/status-bar.js +1 -1
  586. package/dist/collection/utils/overlay-control-label.js +11 -13
  587. package/dist/collection/utils/overlays.js +45 -312
  588. package/dist/collection/utils/platform.js +4 -5
  589. package/dist/collection/utils/rtl/dir.js +1 -1
  590. package/dist/collection/utils/sanitization/index.js +2 -2
  591. package/dist/collection/utils/select-option-render.js +1 -2
  592. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  593. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
  594. package/dist/collection/utils/test/playwright/drag-element.js +11 -35
  595. package/dist/collection/utils/test/playwright/generator.js +25 -51
  596. package/dist/collection/utils/test/playwright/page/event-spy.js +11 -12
  597. package/dist/collection/utils/test/playwright/page/utils/goto.js +5 -15
  598. package/dist/collection/utils/test/playwright/page/utils/set-content.js +4 -27
  599. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  600. package/dist/collection/utils/test/press-keys.js +10 -17
  601. package/dist/collection/utils/theme.js +7 -26
  602. package/dist/collection/utils/transition/ios.transition.js +9 -14
  603. package/dist/collection/utils/transition/md.transition.js +3 -4
  604. package/dist/docs.json +502 -10022
  605. package/dist/esm/{animation-B2qdQ_ou.js → animation-CVK55yMY.js} +5 -5
  606. package/dist/esm/{app-globals-DZ-iIjxA.js → app-globals-Bk1_t4sH.js} +1 -1
  607. package/dist/esm/{button-active-BmajAby6.js → button-active-CdCqmeT0.js} +3 -3
  608. package/dist/esm/{capacitor-CtQSWUU0.js → capacitor-CFERIeaU.js} +1 -1
  609. package/dist/esm/{config-BwKpO3Is.js → config-DWCzVL3Y.js} +5 -4
  610. package/dist/esm/{dir-C53feagD.js → dir-B-FxiyeI.js} +1 -1
  611. package/dist/{cjs/focus-visible-BIj-I3-C.js → esm/focus-visible-BmVRXR1y.js} +1 -27
  612. package/dist/esm/{format-2WlZcMvG.js → format-sMi4BZ_l.js} +41 -31
  613. package/dist/esm/{framework-delegate-DO2QXccA.js → framework-delegate-BfAlKlW5.js} +6 -10
  614. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-TXPDHL13.js} +15 -8
  615. package/dist/esm/{haptic-DFgKNCce.js → haptic-Cq4UAeka.js} +3 -4
  616. package/dist/esm/hardware-back-button-DcHMMB9j.js +115 -0
  617. package/dist/esm/{helpers-DfF5_wJc.js → helpers-BPcITY5s.js} +7 -73
  618. package/dist/esm/{index-BjaaZqVY.js → index-B9GsUd2c.js} +3 -4
  619. package/dist/esm/{index-B4Kq2YNk.js → index-BvabGprD.js} +1 -2
  620. package/dist/esm/{index-C0EQceqV.js → index-D1CQtpUN.js} +9 -48
  621. package/dist/esm/{index-Mq5pCWmZ.js → index-DDa8edAS.js} +3 -3
  622. package/dist/esm/{index-KxK0gcRp.js → index-DcUt1pPn.js} +2 -2
  623. package/dist/esm/{index-CfgBF1SE.js → index-DppOcPFQ.js} +10 -4
  624. package/dist/esm/{index-BIUWGRUl.js → index-DqVqy_Cy.js} +5 -5
  625. package/dist/esm/index-ZjP4CjeZ.js +7 -0
  626. package/dist/esm/{index-Di034G4O.js → index-ks-BjikL.js} +12 -13
  627. package/dist/esm/index.js +17 -16
  628. package/dist/esm/{input-shims-DvNNw70a.js → input-shims-C1dCKVMO.js} +11 -14
  629. package/dist/esm/{input.utils-_LkBfBWt.js → input.utils-Dd5xwlP6.js} +4 -5
  630. package/dist/esm/ion-accordion_2.entry.js +378 -382
  631. package/dist/esm/ion-action-sheet.entry.js +178 -86
  632. package/dist/esm/ion-alert.entry.js +250 -125
  633. package/dist/esm/ion-app_8.entry.js +459 -607
  634. package/dist/esm/ion-avatar_3.entry.js +19 -125
  635. package/dist/esm/ion-back-button.entry.js +64 -49
  636. package/dist/esm/ion-backdrop.entry.js +23 -22
  637. package/dist/esm/ion-breadcrumb_2.entry.js +211 -169
  638. package/dist/esm/ion-button_2.entry.js +152 -117
  639. package/dist/esm/ion-card_5.entry.js +109 -79
  640. package/dist/esm/ion-checkbox.entry.js +163 -129
  641. package/dist/esm/ion-chip.entry.js +21 -56
  642. package/dist/esm/ion-col_3.entry.js +186 -61
  643. package/dist/esm/ion-datetime-button.entry.js +255 -247
  644. package/dist/esm/ion-datetime.entry.js +2765 -0
  645. package/dist/esm/ion-fab_3.entry.js +154 -112
  646. package/dist/esm/ion-img.entry.js +34 -16
  647. package/dist/esm/ion-infinite-scroll_2.entry.js +108 -156
  648. package/dist/esm/ion-input-otp.entry.js +435 -437
  649. package/dist/esm/ion-input-password-toggle.entry.js +40 -64
  650. package/dist/esm/ion-input.entry.js +330 -276
  651. package/dist/esm/ion-item-option_3.entry.js +136 -511
  652. package/dist/esm/ion-item_8.entry.js +217 -189
  653. package/dist/esm/ion-loading.entry.js +151 -68
  654. package/dist/esm/ion-menu_3.entry.js +181 -137
  655. package/dist/esm/ion-modal.entry.js +491 -448
  656. package/dist/esm/ion-nav_2.entry.js +103 -163
  657. package/dist/esm/ion-picker-column-option.entry.js +39 -39
  658. package/dist/esm/ion-picker-column.entry.js +421 -409
  659. package/dist/esm/ion-picker.entry.js +405 -400
  660. package/dist/esm/ion-popover.entry.js +323 -211
  661. package/dist/esm/ion-progress-bar.entry.js +35 -47
  662. package/dist/esm/ion-radio_2.entry.js +216 -161
  663. package/dist/esm/ion-range.entry.js +307 -249
  664. package/dist/esm/ion-refresher_2.entry.js +174 -121
  665. package/dist/esm/ion-reorder_2.entry.js +59 -53
  666. package/dist/esm/ion-ripple-effect.entry.js +18 -26
  667. package/dist/esm/ion-route_4.entry.js +178 -75
  668. package/dist/esm/ion-searchbar.entry.js +308 -331
  669. package/dist/esm/ion-segment-content.entry.js +2 -2
  670. package/dist/esm/ion-segment-view.entry.js +28 -27
  671. package/dist/esm/ion-segment_2.entry.js +177 -141
  672. package/dist/esm/ion-select-modal.entry.js +49 -69
  673. package/dist/esm/ion-select_3.entry.js +482 -386
  674. package/dist/esm/ion-spinner.entry.js +28 -36
  675. package/dist/esm/ion-split-pane.entry.js +34 -25
  676. package/dist/esm/ion-tab-bar_2.entry.js +115 -178
  677. package/dist/esm/ion-tab_2.entry.js +54 -29
  678. package/dist/esm/ion-text.entry.js +13 -7
  679. package/dist/esm/ion-textarea.entry.js +274 -269
  680. package/dist/esm/ion-toast.entry.js +243 -148
  681. package/dist/esm/ion-toggle.entry.js +184 -187
  682. package/dist/esm/ionic-global-5bZ91kOL.js +151 -0
  683. package/dist/esm/ionic.js +5 -5
  684. package/dist/esm/{ios.transition-CgScDbsb.js → ios.transition-OcwIGkv9.js} +14 -20
  685. package/dist/esm/{item-multiple-inputs-C6onMFOo.js → item-multiple-inputs-ifd3ZrqY.js} +1 -1
  686. package/dist/esm/{keyboard-WJix-wcz.js → keyboard-Cj8mLJeq.js} +4 -5
  687. package/dist/esm/{keyboard-CyyguLDw.js → keyboard-DAF8GNJ9.js} +3 -3
  688. package/dist/esm/keyboard-controller-DEwoa1ev.js +165 -0
  689. package/dist/esm/loader.js +5 -5
  690. package/dist/esm/{md.transition-DThqYazt.js → md.transition-BetdF0bc.js} +8 -10
  691. package/dist/esm/{notch-controller-MTblRxjD.js → notch-controller-DBSn-Uat.js} +2 -2
  692. package/dist/esm/{overlay-control-label-CODBQrPj.js → overlay-control-label-BSQPZ79H.js} +11 -13
  693. package/dist/esm/{overlays-tv6nLsmk.js → overlays-DUzb9CQf.js} +57 -333
  694. package/dist/esm/{select-option-render-BlKZ2H83.js → select-option-render-DsW8svRr.js} +3 -4
  695. package/dist/esm/{status-tap-CoPI1M2q.js → status-tap-C-wNhea0.js} +3 -4
  696. package/dist/esm/{swipe-back-qmvTRnSq.js → swipe-back-D6YSgAn7.js} +5 -6
  697. package/dist/esm/theme-byZM6qHV.js +48 -0
  698. package/dist/esm/validity-DJztqcrH.js +17 -0
  699. package/dist/html.html-data.json +146 -2713
  700. package/dist/ionic/index.esm.js +1 -1
  701. package/dist/ionic/ionic.esm.js +1 -1
  702. package/dist/ionic/p-01eaee58.entry.js +4 -0
  703. package/dist/ionic/p-0c567140.entry.js +4 -0
  704. package/dist/ionic/p-105bb794.entry.js +4 -0
  705. package/dist/ionic/p-10d55bb6.entry.js +4 -0
  706. package/dist/ionic/p-173a87d8.entry.js +4 -0
  707. package/dist/ionic/p-178da672.entry.js +4 -0
  708. package/dist/ionic/p-1ead2857.entry.js +4 -0
  709. package/dist/ionic/p-224e2464.entry.js +4 -0
  710. package/dist/ionic/p-2268e718.entry.js +4 -0
  711. package/dist/ionic/p-2b5283f3.entry.js +4 -0
  712. package/dist/ionic/p-2b6decac.entry.js +4 -0
  713. package/dist/ionic/p-2da5d9c6.entry.js +4 -0
  714. package/dist/ionic/p-31890acd.entry.js +4 -0
  715. package/dist/ionic/p-34ef7425.entry.js +4 -0
  716. package/dist/ionic/p-34f7c1d8.entry.js +4 -0
  717. package/dist/ionic/p-3b1e6fa4.entry.js +4 -0
  718. package/dist/ionic/p-42fefd2c.entry.js +4 -0
  719. package/dist/ionic/p-440cd489.entry.js +4 -0
  720. package/dist/ionic/p-460da491.entry.js +4 -0
  721. package/dist/ionic/p-53f680e8.entry.js +4 -0
  722. package/dist/ionic/p-57ba508f.entry.js +4 -0
  723. package/dist/ionic/p-599e5a75.entry.js +4 -0
  724. package/dist/ionic/p-5f670a9e.entry.js +4 -0
  725. package/dist/ionic/p-63502088.entry.js +4 -0
  726. package/dist/ionic/p-6e6bf45d.entry.js +4 -0
  727. package/dist/ionic/p-6f0b6a48.entry.js +4 -0
  728. package/dist/ionic/p-7438c462.entry.js +4 -0
  729. package/dist/ionic/p-747716e7.entry.js +4 -0
  730. package/dist/ionic/p-7759fcaf.entry.js +4 -0
  731. package/dist/ionic/p-7a8338e2.entry.js +4 -0
  732. package/dist/ionic/p-80f9f1dc.entry.js +4 -0
  733. package/dist/ionic/p-83ff4dcb.entry.js +4 -0
  734. package/dist/ionic/p-86f03895.entry.js +4 -0
  735. package/dist/ionic/p-87b8d70e.entry.js +4 -0
  736. package/dist/ionic/p-888236bf.entry.js +4 -0
  737. package/dist/ionic/p-8a92ca23.entry.js +4 -0
  738. package/dist/ionic/p-8c9af4ad.entry.js +4 -0
  739. package/dist/ionic/p-9669f546.entry.js +4 -0
  740. package/dist/ionic/p-9bcd8b74.entry.js +4 -0
  741. package/dist/ionic/p-B-FxiyeI.js +4 -0
  742. package/dist/ionic/p-B2trYd8K.js +4 -0
  743. package/dist/ionic/p-BMPN55of.js +4 -0
  744. package/dist/ionic/p-BNKr91bi.js +4 -0
  745. package/dist/ionic/p-BSQPZ79H.js +4 -0
  746. package/dist/ionic/p-BSzG1VcX.js +4 -0
  747. package/dist/ionic/p-BVgBHS96.js +4 -0
  748. package/dist/ionic/p-BX2IOAqC.js +4 -0
  749. package/dist/ionic/p-BhamHSw3.js +4 -0
  750. package/dist/ionic/p-BmVRXR1y.js +4 -0
  751. package/dist/ionic/p-BufXJ_A8.js +4 -0
  752. package/dist/ionic/p-BvabGprD.js +4 -0
  753. package/dist/ionic/p-C73UOs4m.js +4 -0
  754. package/dist/ionic/p-CHpEzg-o.js +4 -0
  755. package/dist/ionic/p-CIGNaXM1.js +4 -0
  756. package/{components/p-r_CFQBc1.js → dist/ionic/p-CUSwMljM.js} +1 -1
  757. package/dist/ionic/p-CeOSrSdu.js +4 -0
  758. package/dist/ionic/p-CfkB7_FV.js +4 -0
  759. package/dist/ionic/p-CmKf4pgI.js +4 -0
  760. package/dist/ionic/p-CnM-CMw7.js +4 -0
  761. package/dist/ionic/p-D1CQtpUN.js +5 -0
  762. package/dist/ionic/p-D5t_-oMk.js +4 -0
  763. package/dist/ionic/p-DJztqcrH.js +4 -0
  764. package/dist/ionic/p-DVYb1IVZ.js +4 -0
  765. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  766. package/dist/ionic/p-DfJ-SVJf.js +4 -0
  767. package/dist/ionic/p-DmXrLsoD.js +4 -0
  768. package/dist/ionic/p-DtLHAMFW.js +4 -0
  769. package/dist/ionic/p-Dtlob2JL.js +4 -0
  770. package/dist/ionic/p-F7ipfyOA.js +4 -0
  771. package/dist/ionic/p-I9ETXg5W.js +4 -0
  772. package/dist/ionic/{p-oUgyLDGL.js → p-IaXd5VMv.js} +1 -1
  773. package/dist/ionic/p-T71k3C35.js +4 -0
  774. package/dist/ionic/p-TXPDHL13.js +4 -0
  775. package/dist/ionic/p-ZjP4CjeZ.js +4 -0
  776. package/dist/ionic/{p-Cipl19Qe.js → p-aL0G45tD.js} +1 -1
  777. package/dist/ionic/p-acbb97c3.entry.js +4 -0
  778. package/dist/ionic/p-aeb85531.entry.js +4 -0
  779. package/dist/ionic/p-b157f80d.entry.js +4 -0
  780. package/dist/ionic/p-b158de5d.entry.js +4 -0
  781. package/dist/ionic/p-b40c9715.entry.js +4 -0
  782. package/dist/ionic/p-b852101e.entry.js +4 -0
  783. package/dist/ionic/p-byZM6qHV.js +4 -0
  784. package/dist/ionic/p-c0d81bee.entry.js +4 -0
  785. package/dist/ionic/p-c8a327fb.entry.js +4 -0
  786. package/dist/ionic/p-d42ae99f.entry.js +4 -0
  787. package/dist/ionic/p-d47ff529.entry.js +4 -0
  788. package/dist/ionic/p-eHi73fGE.js +4 -0
  789. package/dist/ionic/p-eeabce92.entry.js +4 -0
  790. package/dist/ionic/p-efc66d77.entry.js +4 -0
  791. package/dist/ionic/p-f6d203dc.entry.js +4 -0
  792. package/dist/ionic/p-u2a770LZ.js +4 -0
  793. package/dist/types/components/accordion/accordion.d.ts +3 -6
  794. package/dist/types/components/accordion-group/accordion-group.d.ts +1 -12
  795. package/dist/types/components/action-sheet/action-sheet-interface.d.ts +7 -3
  796. package/dist/types/components/action-sheet/action-sheet.d.ts +2 -3
  797. package/dist/types/components/alert/alert-interface.d.ts +7 -3
  798. package/dist/types/components/alert/alert.d.ts +2 -3
  799. package/dist/types/components/app/app.d.ts +5 -4
  800. package/dist/types/components/avatar/avatar.d.ts +0 -32
  801. package/dist/types/components/back-button/back-button.d.ts +1 -2
  802. package/dist/types/components/backdrop/backdrop.d.ts +0 -4
  803. package/dist/types/components/badge/badge.d.ts +1 -34
  804. package/dist/types/components/breadcrumb/breadcrumb.d.ts +1 -4
  805. package/dist/types/components/breadcrumbs/breadcrumbs.d.ts +2 -2
  806. package/dist/types/components/button/button.d.ts +8 -23
  807. package/dist/types/components/buttons/buttons.d.ts +1 -5
  808. package/dist/types/components/card/card.d.ts +1 -8
  809. package/dist/types/components/card-content/card-content.d.ts +1 -2
  810. package/dist/types/components/card-header/card-header.d.ts +2 -3
  811. package/dist/types/components/card-subtitle/card-subtitle.d.ts +1 -2
  812. package/dist/types/components/card-title/card-title.d.ts +1 -2
  813. package/dist/types/components/checkbox/checkbox.d.ts +4 -14
  814. package/dist/types/components/chip/chip.d.ts +1 -26
  815. package/dist/types/components/col/col.d.ts +5 -52
  816. package/dist/types/components/content/content.d.ts +0 -3
  817. package/dist/types/components/datetime/datetime.d.ts +1 -26
  818. package/dist/types/components/datetime/utils/data.d.ts +5 -5
  819. package/dist/types/components/datetime-button/datetime-button.d.ts +1 -2
  820. package/dist/types/components/fab/fab.d.ts +0 -4
  821. package/dist/types/components/fab-button/fab-button.d.ts +3 -5
  822. package/dist/types/components/fab-list/fab-list.d.ts +0 -4
  823. package/dist/types/components/footer/footer.d.ts +3 -20
  824. package/dist/types/components/grid/grid.d.ts +0 -4
  825. package/dist/types/components/header/header.d.ts +3 -26
  826. package/dist/types/components/header/header.utils.d.ts +5 -4
  827. package/dist/types/components/img/img.d.ts +1 -2
  828. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +0 -21
  829. package/dist/types/components/infinite-scroll-content/infinite-scroll-content.d.ts +0 -4
  830. package/dist/types/components/input/input.d.ts +6 -35
  831. package/dist/types/components/input-otp/input-otp.d.ts +0 -37
  832. package/dist/types/components/input-password-toggle/input-password-toggle.d.ts +0 -2
  833. package/dist/types/components/item/item.d.ts +4 -11
  834. package/dist/types/components/item-divider/item-divider.d.ts +1 -2
  835. package/dist/types/components/item-group/item-group.d.ts +0 -4
  836. package/dist/types/components/item-option/item-option.d.ts +1 -18
  837. package/dist/types/components/item-options/item-options.d.ts +0 -4
  838. package/dist/types/components/item-sliding/item-sliding.d.ts +1 -47
  839. package/dist/types/components/item-sliding/test/test.utils.d.ts +0 -13
  840. package/dist/types/components/label/label.d.ts +1 -2
  841. package/dist/types/components/list/list.d.ts +1 -15
  842. package/dist/types/components/list-header/list-header.d.ts +1 -2
  843. package/dist/types/components/loading/loading-interface.d.ts +7 -2
  844. package/dist/types/components/loading/loading.d.ts +2 -3
  845. package/dist/types/components/menu/menu.d.ts +0 -3
  846. package/dist/types/components/menu-button/menu-button.d.ts +1 -3
  847. package/dist/types/components/menu-toggle/menu-toggle.d.ts +0 -3
  848. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  849. package/dist/types/components/modal/modal-interface.d.ts +7 -4
  850. package/dist/types/components/modal/modal.d.ts +12 -15
  851. package/dist/types/components/nav/nav-interface.d.ts +1 -10
  852. package/dist/types/components/nav/nav.d.ts +3 -27
  853. package/dist/types/components/nav-link/nav-link.d.ts +0 -4
  854. package/dist/types/components/note/note.d.ts +1 -2
  855. package/dist/types/components/picker/picker.d.ts +1 -2
  856. package/dist/types/components/picker-column/picker-column.d.ts +1 -2
  857. package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -4
  858. package/dist/types/components/popover/popover-interface.d.ts +6 -3
  859. package/dist/types/components/popover/popover.d.ts +5 -6
  860. package/dist/types/components/progress-bar/progress-bar.d.ts +1 -10
  861. package/dist/types/components/radio/radio.d.ts +1 -2
  862. package/dist/types/components/radio-group/radio-group.d.ts +0 -12
  863. package/dist/types/components/range/range.d.ts +1 -2
  864. package/dist/types/components/refresher/refresher.d.ts +1 -2
  865. package/dist/types/components/refresher-content/refresher-content.d.ts +0 -4
  866. package/dist/types/components/reorder/reorder.d.ts +0 -9
  867. package/dist/types/components/reorder-group/reorder-group.d.ts +0 -4
  868. package/dist/types/components/ripple-effect/ripple-effect.d.ts +0 -4
  869. package/dist/types/components/route/route.d.ts +1 -5
  870. package/dist/types/components/router/router.d.ts +0 -4
  871. package/dist/types/components/router-link/router-link.d.ts +0 -4
  872. package/dist/types/components/router-outlet/router-outlet.d.ts +8 -4
  873. package/dist/types/components/row/row.d.ts +0 -4
  874. package/dist/types/components/searchbar/searchbar.d.ts +11 -57
  875. package/dist/types/components/segment/segment.d.ts +1 -2
  876. package/dist/types/components/segment-button/segment-button.d.ts +1 -2
  877. package/dist/types/components/select/select.d.ts +14 -49
  878. package/dist/types/components/select-modal/select-modal.d.ts +0 -8
  879. package/dist/types/components/select-option/select-option.d.ts +4 -7
  880. package/dist/types/components/select-popover/select-popover.d.ts +0 -3
  881. package/dist/types/components/skeleton-text/skeleton-text.d.ts +0 -4
  882. package/dist/types/components/spinner/spinner.d.ts +0 -15
  883. package/dist/types/components/split-pane/split-pane.d.ts +0 -4
  884. package/dist/types/components/tab/tab.d.ts +0 -4
  885. package/dist/types/components/tab-bar/tab-bar-interface.d.ts +0 -1
  886. package/dist/types/components/tab-bar/tab-bar.d.ts +3 -41
  887. package/dist/types/components/tab-button/tab-button.d.ts +1 -12
  888. package/dist/types/components/tabs/tabs.d.ts +0 -3
  889. package/dist/types/components/text/text.d.ts +1 -2
  890. package/dist/types/components/textarea/textarea.d.ts +4 -53
  891. package/dist/types/components/thumbnail/thumbnail.d.ts +0 -4
  892. package/dist/types/components/title/title.d.ts +0 -4
  893. package/dist/types/components/toast/animations/utils.d.ts +2 -2
  894. package/dist/types/components/toast/toast-interface.d.ts +7 -3
  895. package/dist/types/components/toast/toast.d.ts +2 -19
  896. package/dist/types/components/toggle/toggle.d.ts +1 -15
  897. package/dist/types/components/toolbar/toolbar.d.ts +3 -43
  898. package/dist/types/components.d.ts +263 -2171
  899. package/dist/types/global/ionic-global.d.ts +2 -28
  900. package/dist/types/index.d.ts +1 -1
  901. package/dist/types/interface.d.ts +0 -4
  902. package/dist/types/utils/config.d.ts +2 -114
  903. package/dist/types/utils/focus-trap.d.ts +1 -1
  904. package/dist/types/utils/focus-visible.d.ts +0 -13
  905. package/dist/types/utils/forms/index.d.ts +0 -1
  906. package/dist/types/utils/forms/validity.d.ts +0 -7
  907. package/dist/types/utils/helpers.d.ts +0 -22
  908. package/dist/types/utils/overlay-control-label.d.ts +9 -11
  909. package/dist/types/utils/overlays-interface.d.ts +1 -31
  910. package/dist/types/utils/overlays.d.ts +12 -10
  911. package/dist/types/utils/test/playwright/drag-element.d.ts +3 -16
  912. package/dist/types/utils/test/playwright/generator.d.ts +2 -31
  913. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  914. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  915. package/dist/types/utils/theme.d.ts +0 -9
  916. package/hydrate/index.js +10246 -12016
  917. package/hydrate/index.mjs +10246 -12016
  918. package/package.json +56 -17
  919. package/components/ion-divider.d.ts +0 -11
  920. package/components/ion-divider.js +0 -4
  921. package/components/ion-gallery-item.d.ts +0 -11
  922. package/components/ion-gallery-item.js +0 -4
  923. package/components/ion-gallery.d.ts +0 -11
  924. package/components/ion-gallery.js +0 -4
  925. package/components/ion-picker-legacy-column.d.ts +0 -11
  926. package/components/ion-picker-legacy-column.js +0 -4
  927. package/components/ion-picker-legacy.d.ts +0 -11
  928. package/components/ion-picker-legacy.js +0 -4
  929. package/components/p-3VXQGlP7.js +0 -4
  930. package/components/p-B5krYTuW.js +0 -4
  931. package/components/p-B6a9IJZ0.js +0 -4
  932. package/components/p-BArGQkuV.js +0 -4
  933. package/components/p-BDqjX7Z_.js +0 -4
  934. package/components/p-BE21dB_a.js +0 -4
  935. package/components/p-BG-Q139o.js +0 -4
  936. package/components/p-BPxMDyfV.js +0 -4
  937. package/components/p-BT8fsdEQ.js +0 -4
  938. package/components/p-BTEOs1at.js +0 -4
  939. package/components/p-BWH3I3Dl.js +0 -4
  940. package/components/p-BYSs-jZz.js +0 -4
  941. package/components/p-BbVhJs-a.js +0 -4
  942. package/components/p-Bc6odfwr.js +0 -4
  943. package/components/p-BjW8SOqw.js +0 -4
  944. package/components/p-BkWXBpOv.js +0 -4
  945. package/components/p-Bt9GDUv-.js +0 -4
  946. package/components/p-BvNVjXg4.js +0 -4
  947. package/components/p-BwKpO3Is.js +0 -4
  948. package/components/p-BwlU9cX_.js +0 -4
  949. package/components/p-Bz4JFPmj.js +0 -4
  950. package/components/p-C53feagD.js +0 -4
  951. package/components/p-CBxy8OYq.js +0 -4
  952. package/components/p-CGdeq57o.js +0 -4
  953. package/components/p-CHPdgLHZ.js +0 -4
  954. package/components/p-CMZlqiT7.js +0 -4
  955. package/components/p-CMzkbes2.js +0 -4
  956. package/components/p-CODBQrPj.js +0 -4
  957. package/components/p-COPA4jD9.js +0 -4
  958. package/components/p-CPnW-OVE.js +0 -4
  959. package/components/p-CRmBpp1v.js +0 -4
  960. package/components/p-CT3P-wjL.js +0 -4
  961. package/components/p-CVYFPBs-.js +0 -4
  962. package/components/p-Cc3oC60a.js +0 -4
  963. package/components/p-CjY4Hs1X.js +0 -4
  964. package/components/p-Cl0B-RWe.js +0 -4
  965. package/components/p-CrYjk-l3.js +0 -4
  966. package/components/p-CsUcWJuB.js +0 -4
  967. package/components/p-D0Iqw6OZ.js +0 -4
  968. package/components/p-D0fnq0lf.js +0 -4
  969. package/components/p-D1kNlmYt.js +0 -4
  970. package/components/p-D1t981Ih.js +0 -4
  971. package/components/p-D9C5yWpF.js +0 -4
  972. package/components/p-DDNG-IsR.js +0 -4
  973. package/components/p-DJSp7Si8.js +0 -4
  974. package/components/p-DL5wyRub.js +0 -4
  975. package/components/p-DXKZXLjV.js +0 -4
  976. package/components/p-DaJxRxSQ.js +0 -4
  977. package/components/p-Dhi5xtNS.js +0 -4
  978. package/components/p-Do8qRv6r.js +0 -4
  979. package/components/p-Dt--PjSF.js +0 -4
  980. package/components/p-DylrHLJF.js +0 -4
  981. package/components/p-FCT_QxQG.js +0 -4
  982. package/components/p-OCde3AhO.js +0 -4
  983. package/components/p-OPFCgx0m.js +0 -4
  984. package/components/p-PCVpe9Tq.js +0 -4
  985. package/components/p-Rkm2AOZ2.js +0 -4
  986. package/components/p-WSZErkoI.js +0 -4
  987. package/components/p-bHSMZulH.js +0 -4
  988. package/components/p-fIOYmaqA.js +0 -4
  989. package/components/p-hNcst9K9.js +0 -4
  990. package/components/p-hW_3y-wm.js +0 -4
  991. package/components/p-nLMDgmzd.js +0 -4
  992. package/components/p-oI96rnOD.js +0 -4
  993. package/components/p-vXpMhGrs.js +0 -4
  994. package/components/p-zBZRdRDd.js +0 -4
  995. package/css/ionic/bundle.ionic.css +0 -1
  996. package/css/ionic/bundle.ionic.css.map +0 -1
  997. package/css/ionic/core.ionic.css +0 -1
  998. package/css/ionic/core.ionic.css.map +0 -1
  999. package/css/ionic/global.bundle.ionic.css +0 -1
  1000. package/css/ionic/global.bundle.ionic.css.map +0 -1
  1001. package/css/ionic/ionic-swiper.ionic.css +0 -1
  1002. package/css/ionic/ionic-swiper.ionic.css.map +0 -1
  1003. package/css/ionic/link.ionic.css +0 -1
  1004. package/css/ionic/link.ionic.css.map +0 -1
  1005. package/css/ionic/structure.ionic.css +0 -1
  1006. package/css/ionic/structure.ionic.css.map +0 -1
  1007. package/css/ionic/typography.ionic.css +0 -1
  1008. package/css/ionic/typography.ionic.css.map +0 -1
  1009. package/css/ionic/utils.bundle.ionic.css +0 -1
  1010. package/css/ionic/utils.bundle.ionic.css.map +0 -1
  1011. package/dist/cjs/caret-down-vtVgfXIs.js +0 -8
  1012. package/dist/cjs/caret-left-CxZXLRv5.js +0 -8
  1013. package/dist/cjs/caret-right-CRCgv98E.js +0 -8
  1014. package/dist/cjs/clear-button-press-controller-DGX8X5js.js +0 -45
  1015. package/dist/cjs/ion-datetime_3.cjs.entry.js +0 -3239
  1016. package/dist/cjs/ion-divider.cjs.entry.js +0 -51
  1017. package/dist/cjs/ion-gallery-item.cjs.entry.js +0 -59
  1018. package/dist/cjs/ion-gallery.cjs.entry.js +0 -607
  1019. package/dist/cjs/ionic-global-QoUqobrQ.js +0 -519
  1020. package/dist/cjs/list-a-7GSA6K.js +0 -8
  1021. package/dist/cjs/scroll-hide-controller-G9HOmmhN.js +0 -345
  1022. package/dist/cjs/validity-QmuwEptc.js +0 -51
  1023. package/dist/cjs/x-BTF99yFH.js +0 -8
  1024. package/dist/collection/components/accordion/accordion.ionic.css +0 -201
  1025. package/dist/collection/components/accordion-group/accordion-group.ionic.css +0 -93
  1026. package/dist/collection/components/action-sheet/action-sheet.ionic.css +0 -494
  1027. package/dist/collection/components/alert/alert.ionic.css +0 -787
  1028. package/dist/collection/components/avatar/avatar.ionic.css +0 -385
  1029. package/dist/collection/components/backdrop/backdrop.ionic.css +0 -109
  1030. package/dist/collection/components/badge/badge.ionic.css +0 -272
  1031. package/dist/collection/components/button/button.ionic.css +0 -644
  1032. package/dist/collection/components/buttons/buttons.ionic.css +0 -97
  1033. package/dist/collection/components/card/card.ionic.css +0 -144
  1034. package/dist/collection/components/card-content/card-content.ionic.css +0 -89
  1035. package/dist/collection/components/card-header/card-header.ionic.css +0 -85
  1036. package/dist/collection/components/card-subtitle/card-subtitle.ionic.css +0 -144
  1037. package/dist/collection/components/checkbox/checkbox.ionic.css +0 -543
  1038. package/dist/collection/components/chip/chip.ionic.css +0 -217
  1039. package/dist/collection/components/datetime/datetime.ionic.css +0 -703
  1040. package/dist/collection/components/divider/divider.ionic.css +0 -148
  1041. package/dist/collection/components/divider/divider.ios.css +0 -87
  1042. package/dist/collection/components/divider/divider.js +0 -94
  1043. package/dist/collection/components/divider/divider.md.css +0 -87
  1044. package/dist/collection/components/footer/footer-interface.js +0 -1
  1045. package/dist/collection/components/gallery/gallery-constants.js +0 -12
  1046. package/dist/collection/components/gallery/gallery-interface.js +0 -1
  1047. package/dist/collection/components/gallery/gallery.css +0 -15
  1048. package/dist/collection/components/gallery/gallery.js +0 -679
  1049. package/dist/collection/components/gallery/test/utils.js +0 -100
  1050. package/dist/collection/components/gallery-item/gallery-item.css +0 -49
  1051. package/dist/collection/components/gallery-item/gallery-item.js +0 -99
  1052. package/dist/collection/components/header/header-interface.js +0 -1
  1053. package/dist/collection/components/header/header.ionic.css +0 -250
  1054. package/dist/collection/components/input/input.ionic.css +0 -891
  1055. package/dist/collection/components/input-otp/input-otp.ionic.css +0 -371
  1056. package/dist/collection/components/input-password-toggle/input-password-toggle.ionic.css +0 -78
  1057. package/dist/collection/components/input-password-toggle/input-password-toggle.native.css +0 -61
  1058. package/dist/collection/components/item/item.ionic.css +0 -496
  1059. package/dist/collection/components/item-option/item-option.ionic.css +0 -277
  1060. package/dist/collection/components/item-options/item-options.ionic.css +0 -221
  1061. package/dist/collection/components/item-sliding/item-sliding.ionic.css +0 -211
  1062. package/dist/collection/components/list/list.ionic.css +0 -212
  1063. package/dist/collection/components/list-header/list-header.ionic.css +0 -190
  1064. package/dist/collection/components/menu-button/menu-button.ionic.css +0 -236
  1065. package/dist/collection/components/modal/animations/ionic.enter.js +0 -40
  1066. package/dist/collection/components/modal/animations/ionic.leave.js +0 -28
  1067. package/dist/collection/components/modal/modal.ionic.css +0 -255
  1068. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  1069. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  1070. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  1071. package/dist/collection/components/picker-legacy/picker.ios.css +0 -312
  1072. package/dist/collection/components/picker-legacy/picker.js +0 -891
  1073. package/dist/collection/components/picker-legacy/picker.md.css +0 -299
  1074. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -243
  1075. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  1076. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -234
  1077. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  1078. package/dist/collection/components/popover/popover.ionic.css +0 -290
  1079. package/dist/collection/components/progress-bar/progress-bar.ionic.css +0 -287
  1080. package/dist/collection/components/radio/radio.ionic.css +0 -422
  1081. package/dist/collection/components/radio-group/radio-group.ionic.css +0 -119
  1082. package/dist/collection/components/range/range.ionic.css +0 -567
  1083. package/dist/collection/components/ripple-effect/ripple-effect.ionic.css +0 -215
  1084. package/dist/collection/components/searchbar/searchbar.ionic.css +0 -622
  1085. package/dist/collection/components/segment/segment.ionic.css +0 -115
  1086. package/dist/collection/components/segment-button/segment-button.ionic.css +0 -352
  1087. package/dist/collection/components/select/select.ionic.css +0 -809
  1088. package/dist/collection/components/select-modal/select-modal.ionic.css +0 -257
  1089. package/dist/collection/components/select-popover/select-popover.ionic.css +0 -255
  1090. package/dist/collection/components/spinner/spinner.native.css +0 -199
  1091. package/dist/collection/components/tab-bar/tab-bar.ionic.css +0 -249
  1092. package/dist/collection/components/tab-button/tab-button.ionic.css +0 -373
  1093. package/dist/collection/components/textarea/textarea.ionic.css +0 -898
  1094. package/dist/collection/components/title/title.ionic.css +0 -127
  1095. package/dist/collection/components/toast/toast.ionic.css +0 -394
  1096. package/dist/collection/components/toggle/toggle.ionic.css +0 -512
  1097. package/dist/collection/components/toolbar/test/image.svg +0 -1
  1098. package/dist/collection/components/toolbar/toolbar.ionic.css +0 -249
  1099. package/dist/collection/utils/css-value-validation.js +0 -39
  1100. package/dist/collection/utils/forms/clear-button-press-controller.js +0 -40
  1101. package/dist/collection/utils/scroll-hide-controller.js +0 -178
  1102. package/dist/esm/caret-down-D1t981Ih.js +0 -6
  1103. package/dist/esm/caret-left-fIOYmaqA.js +0 -6
  1104. package/dist/esm/caret-right-BYSs-jZz.js +0 -6
  1105. package/dist/esm/clear-button-press-controller-C7AAVMKK.js +0 -43
  1106. package/dist/esm/ion-datetime_3.entry.js +0 -3235
  1107. package/dist/esm/ion-divider.entry.js +0 -49
  1108. package/dist/esm/ion-gallery-item.entry.js +0 -57
  1109. package/dist/esm/ion-gallery.entry.js +0 -605
  1110. package/dist/esm/ionic-global-BpkTponr.js +0 -508
  1111. package/dist/esm/list-Dhi5xtNS.js +0 -6
  1112. package/dist/esm/scroll-hide-controller-CUNW7EpD.js +0 -342
  1113. package/dist/esm/theme-DaJxRxSQ.js +0 -67
  1114. package/dist/esm/validity-BjW8SOqw.js +0 -48
  1115. package/dist/esm/x-BDqjX7Z_.js +0 -6
  1116. package/dist/ionic/p--sroV-k-.js +0 -4
  1117. package/dist/ionic/p-05ce9821.entry.js +0 -4
  1118. package/dist/ionic/p-085b8cdf.entry.js +0 -4
  1119. package/dist/ionic/p-0ef6bfc4.entry.js +0 -4
  1120. package/dist/ionic/p-18b7771e.entry.js +0 -4
  1121. package/dist/ionic/p-19f34fe5.entry.js +0 -4
  1122. package/dist/ionic/p-1b6e3914.entry.js +0 -4
  1123. package/dist/ionic/p-2740db6e.entry.js +0 -4
  1124. package/dist/ionic/p-2a1abbb1.entry.js +0 -4
  1125. package/dist/ionic/p-2d9c681b.entry.js +0 -4
  1126. package/dist/ionic/p-2fba8f15.entry.js +0 -4
  1127. package/dist/ionic/p-3886bfbe.entry.js +0 -4
  1128. package/dist/ionic/p-3ab9c35a.entry.js +0 -4
  1129. package/dist/ionic/p-3b4c5cb5.entry.js +0 -4
  1130. package/dist/ionic/p-3cfb4ff2.entry.js +0 -4
  1131. package/dist/ionic/p-41afaf15.entry.js +0 -4
  1132. package/dist/ionic/p-47b9dac0.entry.js +0 -4
  1133. package/dist/ionic/p-54419365.entry.js +0 -4
  1134. package/dist/ionic/p-54b7972e.entry.js +0 -4
  1135. package/dist/ionic/p-602cf876.entry.js +0 -4
  1136. package/dist/ionic/p-678ee14a.entry.js +0 -4
  1137. package/dist/ionic/p-679c1448.entry.js +0 -4
  1138. package/dist/ionic/p-68ea8ed1.entry.js +0 -4
  1139. package/dist/ionic/p-6e1ec775.entry.js +0 -4
  1140. package/dist/ionic/p-745d6b2b.entry.js +0 -4
  1141. package/dist/ionic/p-77254b78.entry.js +0 -4
  1142. package/dist/ionic/p-7k7Q1A38.js +0 -4
  1143. package/dist/ionic/p-898691b3.entry.js +0 -4
  1144. package/dist/ionic/p-89fedfda.entry.js +0 -4
  1145. package/dist/ionic/p-8cf82b85.entry.js +0 -4
  1146. package/dist/ionic/p-8d5fd199.entry.js +0 -4
  1147. package/dist/ionic/p-9087119f.entry.js +0 -4
  1148. package/dist/ionic/p-9c508a22.entry.js +0 -4
  1149. package/dist/ionic/p-B4Kq2YNk.js +0 -4
  1150. package/dist/ionic/p-BDSH5ckF.js +0 -4
  1151. package/dist/ionic/p-BDqjX7Z_.js +0 -4
  1152. package/dist/ionic/p-BFy_BK46.js +0 -4
  1153. package/dist/ionic/p-BTEOs1at.js +0 -4
  1154. package/dist/ionic/p-BYSs-jZz.js +0 -4
  1155. package/dist/ionic/p-BjW8SOqw.js +0 -4
  1156. package/dist/ionic/p-BlZo7Gy-.js +0 -4
  1157. package/dist/ionic/p-Bq8S4vhI.js +0 -4
  1158. package/dist/ionic/p-Btc4flkw.js +0 -4
  1159. package/dist/ionic/p-BwKpO3Is.js +0 -4
  1160. package/dist/ionic/p-C0EQceqV.js +0 -5
  1161. package/dist/ionic/p-C1I_d964.js +0 -4
  1162. package/dist/ionic/p-C53feagD.js +0 -4
  1163. package/dist/ionic/p-CB91Gr9M.js +0 -4
  1164. package/dist/ionic/p-CEkwLb3L.js +0 -4
  1165. package/dist/ionic/p-CJsJQPQD.js +0 -4
  1166. package/dist/ionic/p-CODBQrPj.js +0 -4
  1167. package/dist/ionic/p-Ch7MBNn_.js +0 -4
  1168. package/dist/ionic/p-Cl0B-RWe.js +0 -4
  1169. package/dist/ionic/p-CnAWnbNK.js +0 -4
  1170. package/dist/ionic/p-D1t981Ih.js +0 -4
  1171. package/dist/ionic/p-D4MT1z4_.js +0 -4
  1172. package/dist/ionic/p-D4veLKCq.js +0 -4
  1173. package/dist/ionic/p-DF7ubVci.js +0 -4
  1174. package/dist/ionic/p-DMaSfupH.js +0 -4
  1175. package/dist/ionic/p-DQDmksdT.js +0 -4
  1176. package/dist/ionic/p-DTsDGZPd.js +0 -4
  1177. package/dist/ionic/p-DaJxRxSQ.js +0 -4
  1178. package/dist/ionic/p-DdCaKRle.js +0 -4
  1179. package/dist/ionic/p-Dhi5xtNS.js +0 -4
  1180. package/dist/ionic/p-Dy243NXW.js +0 -4
  1181. package/dist/ionic/p-OkgYzj-7.js +0 -4
  1182. package/dist/ionic/p-YIsE5bNG.js +0 -4
  1183. package/dist/ionic/p-a4af8e39.entry.js +0 -4
  1184. package/dist/ionic/p-b2368a93.entry.js +0 -4
  1185. package/dist/ionic/p-b275f17e.entry.js +0 -4
  1186. package/dist/ionic/p-c5635175.entry.js +0 -4
  1187. package/dist/ionic/p-c76d57fb.entry.js +0 -4
  1188. package/dist/ionic/p-ca3a07b5.entry.js +0 -4
  1189. package/dist/ionic/p-ced3cda1.entry.js +0 -4
  1190. package/dist/ionic/p-cf22e991.entry.js +0 -4
  1191. package/dist/ionic/p-d0c1d21d.entry.js +0 -4
  1192. package/dist/ionic/p-d0d42da6.entry.js +0 -4
  1193. package/dist/ionic/p-d33dfc12.entry.js +0 -4
  1194. package/dist/ionic/p-d34bfb61.entry.js +0 -4
  1195. package/dist/ionic/p-dbc08f67.entry.js +0 -4
  1196. package/dist/ionic/p-dc8e0b91.entry.js +0 -4
  1197. package/dist/ionic/p-df642ef5.entry.js +0 -4
  1198. package/dist/ionic/p-e04d63e1.entry.js +0 -4
  1199. package/dist/ionic/p-e3615478.entry.js +0 -4
  1200. package/dist/ionic/p-f1810d29.entry.js +0 -4
  1201. package/dist/ionic/p-f1a8aead.entry.js +0 -4
  1202. package/dist/ionic/p-f69af9d3.entry.js +0 -4
  1203. package/dist/ionic/p-f760f90e.entry.js +0 -4
  1204. package/dist/ionic/p-f8001f8f.entry.js +0 -4
  1205. package/dist/ionic/p-f8b63ebb.entry.js +0 -4
  1206. package/dist/ionic/p-fIOYmaqA.js +0 -4
  1207. package/dist/ionic/p-fc6d26ff.entry.js +0 -4
  1208. package/dist/ionic/p-lMb_45ax.js +0 -4
  1209. package/dist/ionic/p-vXpMhGrs.js +0 -4
  1210. package/dist/types/components/divider/divider.d.ts +0 -20
  1211. package/dist/types/components/footer/footer-interface.d.ts +0 -1
  1212. package/dist/types/components/gallery/gallery-constants.d.ts +0 -9
  1213. package/dist/types/components/gallery/gallery-interface.d.ts +0 -10
  1214. package/dist/types/components/gallery/gallery.d.ts +0 -218
  1215. package/dist/types/components/gallery/test/utils.d.ts +0 -3
  1216. package/dist/types/components/gallery-item/gallery-item.d.ts +0 -33
  1217. package/dist/types/components/header/header-interface.d.ts +0 -1
  1218. package/dist/types/components/modal/animations/ionic.enter.d.ts +0 -6
  1219. package/dist/types/components/modal/animations/ionic.leave.d.ts +0 -6
  1220. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  1221. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  1222. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  1223. package/dist/types/components/picker-legacy/picker.d.ts +0 -159
  1224. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  1225. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  1226. package/dist/types/utils/css-value-validation.d.ts +0 -21
  1227. package/dist/types/utils/forms/clear-button-press-controller.d.ts +0 -20
  1228. package/dist/types/utils/scroll-hide-controller.d.ts +0 -56
  1229. /package/dist/collection/components/{refresher-content/refresher-content.css → input-password-toggle/input-password-toggle.css} +0 -0
@@ -1,8 +1,6 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import caretLeftRegular from "@phosphor-icons/core/assets/regular/caret-left.svg";
5
- import caretRightRegular from "@phosphor-icons/core/assets/regular/caret-right.svg";
6
4
  import { Host, h, writeTask } from "@stencil/core";
7
5
  import { startFocusVisible } from "../../utils/focus-visible";
8
6
  import { getElementRoot, raf, renderHiddenInput } from "../../utils/helpers";
@@ -12,7 +10,7 @@ import { isRTL } from "../../utils/rtl/index";
12
10
  import { createColorClasses } from "../../utils/theme";
13
11
  import { caretDownSharp, caretUpSharp, chevronBack, chevronDown, chevronForward } from "ionicons/icons";
14
12
  import { config } from "../../global/config";
15
- import { getIonMode, getIonTheme } from "../../global/ionic-global";
13
+ import { getIonMode } from "../../global/ionic-global";
16
14
  import { isSameDay, warnIfValueOutOfBounds, isBefore, isAfter } from "./utils/comparison";
17
15
  import { generateMonths, getDaysOfMonth, getDaysOfWeek, getToday, getMonthColumnData, getDayColumnData, getYearColumnData, getTimeColumnsData, getCombinedDateColumnData, } from "./utils/data";
18
16
  import { formatValue, getLocalizedDateTime, getLocalizedTime, getMonthAndYear } from "./utils/format";
@@ -22,8 +20,7 @@ import { clampDate, convertToArrayOfNumbers, getPartsFromCalendarDay, parseAmPm,
22
20
  import { getCalendarDayState, getHighlightStyles, isDayDisabled, isMonthDisabled, isNextMonthDisabled, isPrevMonthDisabled, } from "./utils/state";
23
21
  import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./utils/validate";
24
22
  /**
25
- * @virtualProp {"ios" | "md"} mode - The mode determines the platform behaviors of the component.
26
- * @virtualProp {"ios" | "md" | "ionic"} theme - The theme determines the visual appearance of the component.
23
+ * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
27
24
  *
28
25
  * @slot title - The title of the datetime.
29
26
  * @slot buttons - The buttons in the datetime.
@@ -57,775 +54,139 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./ut
57
54
  * @part datetime-selected-date - The element that contains the selected date.
58
55
  */
59
56
  export class Datetime {
60
- constructor() {
61
- this.inputId = `ion-dt-${datetimeIds++}`;
62
- /**
63
- * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
64
- * synthetic "not intersecting" entry IntersectionObserver fires on
65
- * `observe()` when the host mounts offscreen.
66
- */
67
- this.hasBeenIntersecting = false;
68
- this.prevPresentation = null;
69
- this.showMonthAndYear = false;
70
- this.activeParts = [];
71
- this.workingParts = {
72
- month: 5,
73
- day: 28,
74
- year: 2021,
75
- hour: 13,
76
- minute: 52,
77
- ampm: 'pm',
78
- isAdjacentDay: false,
79
- };
80
- this.isTimePopoverOpen = false;
81
- /**
82
- * The color to use from your application's color palette.
83
- * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
84
- * For more information on colors, see [theming](/docs/theming/basics).
85
- */
86
- this.color = 'primary';
87
- /**
88
- * The name of the control, which is submitted with the form data.
89
- */
90
- this.name = this.inputId;
91
- /**
92
- * If `true`, the user cannot interact with the datetime.
93
- */
94
- this.disabled = false;
95
- /**
96
- * If `true`, the datetime appears normal but the selected date cannot be changed.
97
- */
98
- this.readonly = false;
99
- /**
100
- * If `true`, the datetime calendar displays a six-week (42-day) layout,
101
- * including days from the previous and next months to fill the grid.
102
- * These adjacent days are selectable unless disabled.
103
- */
104
- this.showAdjacentDays = false;
105
- /**
106
- * Which values you want to select. `"date"` will show
107
- * a calendar picker to select the month, day, and year. `"time"`
108
- * will show a time picker to select the hour, minute, and (optionally)
109
- * AM/PM. `"date-time"` will show the date picker first and time picker second.
110
- * `"time-date"` will show the time picker first and date picker second.
111
- */
112
- this.presentation = 'date-time';
113
- /**
114
- * The text to display on the picker's cancel button.
115
- */
116
- this.cancelText = 'Cancel';
117
- /**
118
- * The text to display on the picker's "Done" button.
119
- */
120
- this.doneText = 'Done';
121
- /**
122
- * The text to display on the picker's "Clear" button.
123
- */
124
- this.clearText = 'Clear';
125
- /**
126
- * The locale to use for `ion-datetime`. This
127
- * impacts month and day name formatting.
128
- * The `"default"` value refers to the default
129
- * locale set by your device.
130
- */
131
- this.locale = 'default';
132
- /**
133
- * The first day of the week to use for `ion-datetime`. The
134
- * default value is `0` and represents Sunday.
135
- */
136
- this.firstDayOfWeek = 0;
137
- /**
138
- * If `true`, multiple dates can be selected at once. Only
139
- * applies to `presentation="date"` and `preferWheel="false"`.
140
- */
141
- this.multiple = false;
142
- /**
143
- * If `true`, a header will be shown above the calendar
144
- * picker. This will include both the slotted title, and
145
- * the selected date.
146
- */
147
- this.showDefaultTitle = false;
148
- /**
149
- * If `true`, the default "Cancel" and "OK" buttons
150
- * will be rendered at the bottom of the `ion-datetime`
151
- * component. Developers can also use the `button` slot
152
- * if they want to customize these buttons. If custom
153
- * buttons are set in the `button` slot then the
154
- * default buttons will not be rendered.
155
- */
156
- this.showDefaultButtons = false;
157
- /**
158
- * If `true`, a "Clear" button will be rendered alongside
159
- * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
160
- * component. Developers can also use the `button` slot
161
- * if they want to customize these buttons. If custom
162
- * buttons are set in the `button` slot then the
163
- * default buttons will not be rendered.
164
- */
165
- this.showClearButton = false;
166
- /**
167
- * If `true`, the default "Time" label will be rendered
168
- * for the time selector of the `ion-datetime` component.
169
- * Developers can also use the `time-label` slot
170
- * if they want to customize this label. If a custom
171
- * label is set in the `time-label` slot then the
172
- * default label will not be rendered.
173
- */
174
- this.showDefaultTimeLabel = true;
175
- /**
176
- * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
177
- * If `fixed`, the `ion-datetime` will have a fixed width.
178
- */
179
- this.size = 'fixed';
180
- /**
181
- * If `true`, a wheel picker will be rendered instead of a calendar grid
182
- * where possible. If `false`, a calendar grid will be rendered instead of
183
- * a wheel picker where possible.
184
- *
185
- * A wheel picker can be rendered instead of a grid when `presentation` is
186
- * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
187
- *
188
- * A wheel picker will always be rendered regardless of
189
- * the `preferWheel` value when `presentation` is one of the following values:
190
- * `"time"`, `"month"`, `"month-year"`, or `"year"`.
191
- */
192
- this.preferWheel = false;
193
- this.warnIfIncorrectValueUsage = () => {
194
- const { multiple, value } = this;
195
- if (!multiple && Array.isArray(value)) {
196
- /**
197
- * We do some processing on the `value` array so
198
- * that it looks more like an array when logged to
199
- * the console.
200
- * Example given ['a', 'b']
201
- * Default toString() behavior: a,b
202
- * Custom behavior: ['a', 'b']
203
- */
204
- 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".
205
-
206
- Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
207
- `, this.el);
208
- }
209
- };
210
- this.setValue = (value) => {
211
- this.value = value;
212
- this.ionChange.emit({ value });
213
- };
214
- /**
215
- * Returns the DatetimePart interface
216
- * to use when rendering an initial set of
217
- * data. This should be used when rendering an
218
- * interface in an environment where the `value`
219
- * may not be set. This function works
220
- * by returning the first selected date and then
221
- * falling back to defaultParts if no active date
222
- * is selected.
223
- */
224
- this.getActivePartsWithFallback = () => {
225
- var _a;
226
- const { defaultParts } = this;
227
- return (_a = this.getActivePart()) !== null && _a !== void 0 ? _a : defaultParts;
228
- };
229
- this.getActivePart = () => {
230
- const { activeParts } = this;
231
- return Array.isArray(activeParts) ? activeParts[0] : activeParts;
232
- };
233
- this.closeParentOverlay = (role) => {
234
- const popoverOrModal = this.el.closest('ion-modal, ion-popover');
235
- if (popoverOrModal) {
236
- popoverOrModal.dismiss(undefined, role);
237
- }
238
- };
239
- this.setWorkingParts = (parts) => {
240
- this.workingParts = Object.assign({}, parts);
241
- };
242
- this.setActiveParts = (parts, removeDate = false) => {
243
- /** if the datetime component is in readonly mode,
244
- * allow browsing of the calendar without changing
245
- * the set value
246
- */
247
- if (this.readonly) {
248
- return;
249
- }
250
- const { multiple, minParts, maxParts, activeParts } = this;
251
- /**
252
- * When setting the active parts, it is possible
253
- * to set invalid data. For example,
254
- * when updating January 31 to February,
255
- * February 31 does not exist. As a result
256
- * we need to validate the active parts and
257
- * ensure that we are only setting valid dates.
258
- * Additionally, we need to update the working parts
259
- * too in the event that the validated parts are different.
260
- */
261
- const validatedParts = validateParts(parts, minParts, maxParts);
262
- this.setWorkingParts(validatedParts);
263
- if (multiple) {
264
- const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
265
- if (removeDate) {
266
- this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
267
- }
268
- else {
269
- this.activeParts = [...activePartsArray, validatedParts];
270
- }
271
- }
272
- else {
273
- this.activeParts = Object.assign({}, validatedParts);
274
- }
275
- const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
276
- if (hasSlottedButtons || this.showDefaultButtons) {
277
- return;
278
- }
279
- this.confirm();
280
- };
281
- this.initializeKeyboardListeners = () => {
282
- const calendarBodyRef = this.calendarBodyRef;
283
- if (!calendarBodyRef) {
284
- return;
285
- }
286
- const root = this.el.shadowRoot;
287
- /**
288
- * Get a reference to the month
289
- * element we are currently viewing.
290
- */
291
- const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
292
- /**
293
- * When focusing the calendar body, we want to pass focus
294
- * to the working day, but other days should
295
- * only be accessible using the arrow keys. Pressing
296
- * Tab should jump between bodies of selectable content.
297
- */
298
- const checkCalendarBodyFocus = (ev) => {
299
- var _a;
300
- const record = ev[0];
301
- /**
302
- * If calendar body was already focused
303
- * when this fired or if the calendar body
304
- * if not currently focused, we should not re-focus
305
- * the inner day.
306
- */
307
- if (((_a = record.oldValue) === null || _a === void 0 ? void 0 : _a.includes('ion-focused')) || !calendarBodyRef.classList.contains('ion-focused')) {
308
- return;
309
- }
310
- this.focusWorkingDay(currentMonth);
311
- };
312
- const mo = new MutationObserver(checkCalendarBodyFocus);
313
- mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
314
- this.destroyKeyboardMO = () => {
315
- mo === null || mo === void 0 ? void 0 : mo.disconnect();
316
- };
317
- /**
318
- * We must use keydown not keyup as we want
319
- * to prevent scrolling when using the arrow keys.
320
- */
321
- calendarBodyRef.addEventListener('keydown', (ev) => {
322
- const activeElement = root.activeElement;
323
- if (!activeElement || !activeElement.classList.contains('calendar-day')) {
324
- return;
325
- }
326
- const parts = getPartsFromCalendarDay(activeElement);
327
- let partsToFocus;
328
- switch (ev.key) {
329
- case 'ArrowDown':
330
- ev.preventDefault();
331
- partsToFocus = getNextWeek(parts);
332
- break;
333
- case 'ArrowUp':
334
- ev.preventDefault();
335
- partsToFocus = getPreviousWeek(parts);
336
- break;
337
- case 'ArrowRight':
338
- ev.preventDefault();
339
- partsToFocus = getNextDay(parts);
340
- break;
341
- case 'ArrowLeft':
342
- ev.preventDefault();
343
- partsToFocus = getPreviousDay(parts);
344
- break;
345
- case 'Home':
346
- ev.preventDefault();
347
- partsToFocus = getStartOfWeek(parts);
348
- break;
349
- case 'End':
350
- ev.preventDefault();
351
- partsToFocus = getEndOfWeek(parts);
352
- break;
353
- case 'PageUp':
354
- ev.preventDefault();
355
- partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
356
- break;
357
- case 'PageDown':
358
- ev.preventDefault();
359
- partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
360
- break;
361
- /**
362
- * Do not preventDefault here
363
- * as we do not want to override other
364
- * browser defaults such as pressing Enter/Space
365
- * to select a day.
366
- */
367
- default:
368
- return;
369
- }
370
- /**
371
- * If the day we want to move focus to is
372
- * disabled, do not do anything.
373
- */
374
- if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
375
- return;
376
- }
377
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), partsToFocus));
378
- /**
379
- * Give view a chance to re-render
380
- * then move focus to the new working day
381
- */
382
- requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
383
- });
384
- };
385
- this.focusWorkingDay = (currentMonth) => {
386
- /**
387
- * Get the number of offset days so
388
- * we know how much to offset our next selector by
389
- * to grab the correct calendar-day element.
390
- */
391
- const { day, month, year } = this.workingParts;
392
- const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
393
- const offset = firstOfMonth >= this.firstDayOfWeek
394
- ? firstOfMonth - this.firstDayOfWeek
395
- : 7 - (this.firstDayOfWeek - firstOfMonth);
396
- if (day === null) {
397
- return;
398
- }
399
- /**
400
- * Get the calendar day element
401
- * and focus it.
402
- */
403
- const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
404
- if (dayEl) {
405
- dayEl.focus();
406
- }
407
- };
408
- this.processMinParts = () => {
409
- const { min, defaultParts } = this;
410
- if (min === undefined) {
411
- this.minParts = undefined;
412
- return;
413
- }
414
- this.minParts = parseMinParts(min, defaultParts);
415
- };
416
- this.processMaxParts = () => {
417
- const { max, defaultParts } = this;
418
- if (max === undefined) {
419
- this.maxParts = undefined;
420
- return;
421
- }
422
- this.maxParts = parseMaxParts(max, defaultParts);
423
- };
424
- this.initializeCalendarListener = () => {
425
- const calendarBodyRef = this.calendarBodyRef;
426
- if (!calendarBodyRef) {
427
- return;
428
- }
429
- /**
430
- * For performance reasons, we only render 3
431
- * months at a time: The current month, the previous
432
- * month, and the next month. We have a scroll listener
433
- * on the calendar body to append/prepend new months.
434
- *
435
- * We can do this because Stencil is smart enough to not
436
- * re-create the .calendar-month containers, but rather
437
- * update the content within those containers.
438
- *
439
- * As an added bonus, WebKit has some troubles with
440
- * scroll-snap-stop: always, so not rendering all of
441
- * the months in a row allows us to mostly sidestep
442
- * that issue.
443
- */
444
- const months = calendarBodyRef.querySelectorAll('.calendar-month');
445
- const startMonth = months[0];
446
- const workingMonth = months[1];
447
- const endMonth = months[2];
448
- const mode = getIonMode(this);
449
- const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
450
- /**
451
- * Before setting up the scroll listener,
452
- * scroll the middle month into view.
453
- * scrollIntoView() will scroll entire page
454
- * if element is not in viewport. Use scrollLeft instead.
455
- */
456
- writeTask(() => {
457
- calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
458
- const getChangedMonth = (parts) => {
459
- const box = calendarBodyRef.getBoundingClientRect();
460
- /**
461
- * If the current scroll position is all the way to the left
462
- * then we have scrolled to the previous month.
463
- * Otherwise, assume that we have scrolled to the next
464
- * month. We have a tolerance of 2px to account for
465
- * sub pixel rendering.
466
- *
467
- * Check below the next line ensures that we did not
468
- * swipe and abort (i.e. we swiped but we are still on the current month).
469
- */
470
- const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
471
- const month = condition ? startMonth : endMonth;
472
- /**
473
- * The edge of the month must be lined up with
474
- * the edge of the calendar body in order for
475
- * the component to update. Otherwise, it
476
- * may be the case that the user has paused their
477
- * swipe or the browser has not finished snapping yet.
478
- * Rather than check if the x values are equal,
479
- * we give it a tolerance of 2px to account for
480
- * sub pixel rendering.
481
- */
482
- const monthBox = month.getBoundingClientRect();
483
- if (Math.abs(monthBox.x - box.x) > 2)
484
- return;
485
- /**
486
- * If we're force-rendering a month, assume we've
487
- * scrolled to that and return it.
488
- *
489
- * If forceRenderDate is ever used in a context where the
490
- * forced month is not immediately auto-scrolled to, this
491
- * should be updated to also check whether `month` has the
492
- * same month and year as the forced date.
493
- */
494
- const { forceRenderDate } = this;
495
- if (forceRenderDate !== undefined) {
496
- return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
497
- }
498
- /**
499
- * From here, we can determine if the start
500
- * month or the end month was scrolled into view.
501
- * If no month was changed, then we can return from
502
- * the scroll callback early.
503
- */
504
- if (month === startMonth) {
505
- return getPreviousMonth(parts);
506
- }
507
- else if (month === endMonth) {
508
- return getNextMonth(parts);
509
- }
510
- else {
511
- return;
512
- }
513
- };
514
- const updateActiveMonth = () => {
515
- if (needsiOSRubberBandFix) {
516
- calendarBodyRef.style.removeProperty('pointer-events');
517
- appliediOSRubberBandFix = false;
518
- }
519
- /**
520
- * If the month did not change
521
- * then we can return early.
522
- */
523
- const newDate = getChangedMonth(this.workingParts);
524
- if (!newDate)
525
- return;
526
- const { month, day, year } = newDate;
527
- if (isMonthDisabled({ month, year, day: null }, {
528
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
529
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
530
- })) {
531
- return;
532
- }
533
- /**
534
- * Prevent scrolling for other browsers
535
- * to give the DOM time to update and the container
536
- * time to properly snap.
537
- */
538
- calendarBodyRef.style.setProperty('overflow', 'hidden');
539
- /**
540
- * Use a writeTask here to ensure
541
- * that the state is updated and the
542
- * correct month is scrolled into view
543
- * in the same frame. This is not
544
- * typically a problem on newer devices
545
- * but older/slower device may have a flicker
546
- * if we did not do this.
547
- */
548
- writeTask(() => {
549
- var _a;
550
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month, day: day, year }));
551
- calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
552
- calendarBodyRef.style.removeProperty('overflow');
553
- if (this.resolveForceDateScrolling) {
554
- this.resolveForceDateScrolling();
555
- }
556
- const activeEl = this.el.shadowRoot.activeElement;
557
- if (activeEl && activeEl.classList.contains('calendar-day')) {
558
- (_a = activeEl.closest('.calendar-body')) === null || _a === void 0 ? void 0 : _a.focus();
559
- }
560
- });
561
- };
562
- /**
563
- * When the container finishes scrolling we
564
- * need to update the DOM with the selected month.
565
- */
566
- let scrollTimeout;
567
- /**
568
- * We do not want to attempt to set pointer-events
569
- * multiple times within a single swipe gesture as
570
- * that adds unnecessary work to the main thread.
571
- */
572
- let appliediOSRubberBandFix = false;
573
- const scrollCallback = () => {
574
- if (scrollTimeout) {
575
- clearTimeout(scrollTimeout);
576
- }
577
- /**
578
- * On iOS it is possible to quickly rubber band
579
- * the scroll area before the scroll timeout has fired.
580
- * This results in users reaching the end of the scrollable
581
- * container before the DOM has updated.
582
- * By setting `pointer-events: none` we can ensure that
583
- * subsequent swipes do not happen while the container
584
- * is snapping.
585
- */
586
- if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
587
- calendarBodyRef.style.setProperty('pointer-events', 'none');
588
- appliediOSRubberBandFix = true;
589
- }
590
- // Wait ~3 frames
591
- scrollTimeout = setTimeout(updateActiveMonth, 50);
592
- };
593
- calendarBodyRef.addEventListener('scroll', scrollCallback);
594
- this.destroyCalendarListener = () => {
595
- calendarBodyRef.removeEventListener('scroll', scrollCallback);
596
- };
597
- });
598
- };
599
- /**
600
- * Clean up all listeners except for the overlay
601
- * listener. This is so that we can re-create the listeners
602
- * if the datetime has been hidden/presented by a modal or popover.
603
- */
604
- this.destroyInteractionListeners = () => {
605
- const { destroyCalendarListener, destroyKeyboardMO } = this;
606
- if (destroyCalendarListener !== undefined) {
607
- destroyCalendarListener();
608
- }
609
- if (destroyKeyboardMO !== undefined) {
610
- destroyKeyboardMO();
611
- }
612
- };
613
- /**
614
- * TODO(FW-6931): Remove this fallback upon solving the root cause
615
- * Fallback to ensure the datetime becomes ready even if
616
- * IntersectionObserver never reports it as intersecting.
617
- *
618
- * This is primarily used in environments where the observer
619
- * might not fire as expected, such as when running under
620
- * synthetic tests that stub IntersectionObserver.
621
- */
622
- this.ensureReadyIfVisible = () => {
623
- if (this.el.classList.contains('datetime-ready')) {
624
- return;
625
- }
626
- const rect = this.el.getBoundingClientRect();
627
- if (rect.width === 0 || rect.height === 0) {
628
- return;
629
- }
630
- this.markReady();
631
- };
632
- this.markReady = () => {
633
- if (this.el.classList.contains('datetime-ready')) {
634
- return;
635
- }
636
- this.initializeListeners();
637
- /**
638
- * TODO FW-2793: Datetime needs a frame to ensure that it
639
- * can properly scroll contents into view. As a result
640
- * we hide the scrollable content until after that frame
641
- * so users do not see the content quickly shifting. The downside
642
- * is that the content will pop into view a frame after. Maybe there
643
- * is a better way to handle this?
644
- */
645
- writeTask(() => {
646
- this.el.classList.add('datetime-ready');
647
- });
648
- };
649
- this.loadTimeoutCleanup = () => {
650
- if (this.loadTimeout) {
651
- clearTimeout(this.loadTimeout);
652
- this.loadTimeout = undefined;
653
- }
654
- };
655
- this.processValue = (value) => {
656
- const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
657
- const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
658
- const { minParts, maxParts, workingParts, el } = this;
659
- this.warnIfIncorrectValueUsage();
660
- /**
661
- * Return early if the value wasn't parsed correctly, such as
662
- * if an improperly formatted date string was provided.
663
- */
664
- if (!valueToProcess) {
665
- return;
666
- }
667
- /**
668
- * Datetime should only warn of out of bounds values
669
- * if set by the user. If the `value` is undefined,
670
- * we will default to today's date which may be out
671
- * of bounds. In this case, the warning makes it look
672
- * like the developer did something wrong which is
673
- * not true.
674
- */
675
- if (hasValue) {
676
- warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
677
- }
678
- /**
679
- * If there are multiple values, clamp to the last one.
680
- * This is because the last value is the one that the user
681
- * has most recently interacted with.
682
- */
683
- const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
684
- const targetValue = clampDate(singleValue, minParts, maxParts);
685
- const { month, day, year, hour, minute } = targetValue;
686
- const ampm = parseAmPm(hour);
687
- /**
688
- * Since `activeParts` indicates a value that been explicitly selected
689
- * either by the user or the app, only update `activeParts` if the
690
- * `value` property is set.
691
- */
692
- if (hasValue) {
693
- if (Array.isArray(valueToProcess)) {
694
- this.activeParts = [...valueToProcess];
695
- }
696
- else {
697
- this.activeParts = {
698
- month,
699
- day,
700
- year,
701
- hour,
702
- minute,
703
- ampm,
704
- };
705
- }
706
- }
707
- else {
708
- /**
709
- * Reset the active parts if the value is not set.
710
- * This will clear the selected calendar day when
711
- * performing a clear action or using the reset() method.
712
- */
713
- this.activeParts = [];
714
- }
715
- const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
716
- const bodyIsVisible = el.classList.contains('datetime-ready');
717
- const { isGridStyle, showMonthAndYear } = this;
718
- if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
719
- /**
720
- * Only animate if:
721
- * 1. We're using grid style (wheel style pickers should just jump to new value)
722
- * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
723
- * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
724
- * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
725
- */
726
- this.animateToDate(targetValue);
727
- }
728
- else {
729
- this.setWorkingParts({
730
- month,
731
- day,
732
- year,
733
- hour,
734
- minute,
735
- ampm,
736
- });
737
- }
738
- };
739
- this.animateToDate = async (targetValue) => {
740
- const { workingParts } = this;
741
- /**
742
- * Tell other render functions that we need to force the
743
- * target month to appear in place of the actual next/prev month.
744
- * Because this is a State variable, a rerender will be triggered
745
- * automatically, updating the rendered months.
746
- */
747
- this.forceRenderDate = targetValue;
748
- /**
749
- * Flag that we've started scrolling to the forced date.
750
- * The resolve function will be called by the datetime's
751
- * scroll listener when it's done updating everything.
752
- * This is a replacement for making prev/nextMonth async,
753
- * since the logic we're waiting on is in a listener.
754
- */
755
- const forceDateScrollingPromise = new Promise((resolve) => {
756
- this.resolveForceDateScrolling = resolve;
757
- });
758
- /**
759
- * Animate smoothly to the forced month. This will also update
760
- * workingParts and correct the surrounding months for us.
761
- */
762
- const targetMonthIsBefore = isBefore(targetValue, workingParts);
763
- targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
764
- await forceDateScrollingPromise;
765
- this.resolveForceDateScrolling = undefined;
766
- this.forceRenderDate = undefined;
767
- };
768
- this.onFocus = () => {
769
- this.ionFocus.emit();
770
- };
771
- this.onBlur = () => {
772
- this.ionBlur.emit();
773
- };
774
- this.hasValue = () => {
775
- return this.value != null;
776
- };
777
- this.nextMonth = () => {
778
- const calendarBodyRef = this.calendarBodyRef;
779
- if (!calendarBodyRef) {
780
- return;
781
- }
782
- const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
783
- if (!nextMonth) {
784
- return;
785
- }
786
- const left = nextMonth.offsetWidth * 2;
787
- const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
788
- calendarBodyRef.scrollTo({
789
- top: 0,
790
- left: left * (isRTL(this.el) ? -1 : 1),
791
- behavior: scrollMode,
792
- });
793
- };
794
- this.prevMonth = () => {
795
- const calendarBodyRef = this.calendarBodyRef;
796
- if (!calendarBodyRef) {
797
- return;
798
- }
799
- const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
800
- if (!prevMonth) {
801
- return;
802
- }
803
- const left = prevMonth.offsetWidth * 2;
804
- const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
805
- calendarBodyRef.scrollTo({
806
- top: 0,
807
- left: left * (isRTL(this.el) ? 1 : -1),
808
- behavior: scrollMode,
809
- });
810
- };
811
- this.toggleMonthAndYearView = () => {
812
- this.showMonthAndYear = !this.showMonthAndYear;
813
- };
814
- }
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
+ hasBeenIntersecting = false;
81
+ prevPresentation = null;
82
+ resolveForceDateScrolling;
83
+ showMonthAndYear = false;
84
+ activeParts = [];
85
+ workingParts = {
86
+ month: 5,
87
+ day: 28,
88
+ year: 2021,
89
+ hour: 13,
90
+ minute: 52,
91
+ ampm: 'pm',
92
+ isAdjacentDay: false,
93
+ };
94
+ el;
95
+ isTimePopoverOpen = false;
96
+ /**
97
+ * When defined, will force the datetime to render the month
98
+ * containing the specified date. Currently, this should only
99
+ * be used to enable immediately auto-scrolling to the new month,
100
+ * and should then be reset to undefined once the transition is
101
+ * finished and the forced month is now in view.
102
+ *
103
+ * Applies to grid-style datetimes only.
104
+ */
105
+ forceRenderDate;
106
+ /**
107
+ * The color to use from your application's color palette.
108
+ * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
109
+ * For more information on colors, see [theming](/docs/theming/basics).
110
+ */
111
+ color;
112
+ /**
113
+ * The name of the control, which is submitted with the form data.
114
+ */
115
+ name = this.inputId;
116
+ /**
117
+ * If `true`, the user cannot interact with the datetime.
118
+ */
119
+ disabled = false;
120
+ /**
121
+ * Formatting options for dates and times.
122
+ * 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).
123
+ *
124
+ */
125
+ formatOptions;
815
126
  formatOptionsChanged() {
816
127
  const { el, formatOptions, presentation } = this;
817
128
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
818
129
  warnIfTimeZoneProvided(el, formatOptions);
819
130
  }
131
+ /**
132
+ * If `true`, the datetime appears normal but the selected date cannot be changed.
133
+ */
134
+ readonly = false;
135
+ /**
136
+ * Returns if an individual date (calendar day) is enabled or disabled.
137
+ *
138
+ * If `true`, the day will be enabled/interactive.
139
+ * If `false`, the day will be disabled/non-interactive.
140
+ *
141
+ * The function accepts an ISO 8601 date string of a given day.
142
+ * By default, all days are enabled. Developers can use this function
143
+ * to write custom logic to disable certain days.
144
+ *
145
+ * The function is called for each rendered calendar day, for the previous, current and next month.
146
+ * Custom implementations should be optimized for performance to avoid jank.
147
+ */
148
+ isDateEnabled;
149
+ /**
150
+ * If `true`, the datetime calendar displays a six-week (42-day) layout,
151
+ * including days from the previous and next months to fill the grid.
152
+ * These adjacent days are selectable unless disabled.
153
+ */
154
+ showAdjacentDays = false;
820
155
  disabledChanged() {
821
156
  this.emitStyle();
822
157
  }
158
+ /**
159
+ * The minimum datetime allowed. Value must be a date string
160
+ * following the
161
+ * [ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),
162
+ * such as `1996-12-19`. The format does not have to be specific to an exact
163
+ * datetime. For example, the minimum could just be the year, such as `1994`.
164
+ * Defaults to the beginning of the year, 100 years ago from today.
165
+ */
166
+ min;
823
167
  minChanged() {
824
168
  this.processMinParts();
825
169
  }
170
+ /**
171
+ * The maximum datetime allowed. Value must be a date string
172
+ * following the
173
+ * [ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),
174
+ * `1996-12-19`. The format does not have to be specific to an exact
175
+ * datetime. For example, the maximum could just be the year, such as `1994`.
176
+ * Defaults to the end of this year.
177
+ */
178
+ max;
826
179
  maxChanged() {
827
180
  this.processMaxParts();
828
181
  }
182
+ /**
183
+ * Which values you want to select. `"date"` will show
184
+ * a calendar picker to select the month, day, and year. `"time"`
185
+ * will show a time picker to select the hour, minute, and (optionally)
186
+ * AM/PM. `"date-time"` will show the date picker first and time picker second.
187
+ * `"time-date"` will show the time picker first and date picker second.
188
+ */
189
+ presentation = 'date-time';
829
190
  presentationChanged() {
830
191
  const { el, formatOptions, presentation } = this;
831
192
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
@@ -835,32 +196,218 @@ export class Datetime {
835
196
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
836
197
  return hasDatePresentation && !preferWheel;
837
198
  }
199
+ /**
200
+ * The text to display on the picker's cancel button.
201
+ */
202
+ cancelText = 'Cancel';
203
+ /**
204
+ * The text to display on the picker's "Done" button.
205
+ */
206
+ doneText = 'Done';
207
+ /**
208
+ * The text to display on the picker's "Clear" button.
209
+ */
210
+ clearText = 'Clear';
211
+ /**
212
+ * Values used to create the list of selectable years. By default
213
+ * the year values range between the `min` and `max` datetime inputs. However, to
214
+ * control exactly which years to display, the `yearValues` input can take a number, an array
215
+ * of numbers, or string of comma separated numbers. For example, to show upcoming and
216
+ * recent leap years, then this input's value would be `yearValues="2008,2012,2016,2020,2024"`.
217
+ */
218
+ yearValues;
838
219
  yearValuesChanged() {
839
220
  this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
840
221
  }
222
+ /**
223
+ * Values used to create the list of selectable months. By default
224
+ * the month values range from `1` to `12`. However, to control exactly which months to
225
+ * display, the `monthValues` input can take a number, an array of numbers, or a string of
226
+ * comma separated numbers. For example, if only summer months should be shown, then this
227
+ * input value would be `monthValues="6,7,8"`. Note that month numbers do *not* have a
228
+ * zero-based index, meaning January's value is `1`, and December's is `12`.
229
+ */
230
+ monthValues;
841
231
  monthValuesChanged() {
842
232
  this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
843
233
  }
234
+ /**
235
+ * Values used to create the list of selectable days. By default
236
+ * every day is shown for the given month. However, to control exactly which days of
237
+ * the month to display, the `dayValues` input can take a number, an array of numbers, or
238
+ * a string of comma separated numbers. Note that even if the array days have an invalid
239
+ * number for the selected month, like `31` in February, it will correctly not show
240
+ * days which are not valid for the selected month.
241
+ */
242
+ dayValues;
844
243
  dayValuesChanged() {
845
244
  this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
846
245
  }
246
+ /**
247
+ * Values used to create the list of selectable hours. By default
248
+ * the hour values range from `0` to `23` for 24-hour, or `1` to `12` for 12-hour. However,
249
+ * to control exactly which hours to display, the `hourValues` input can take a number, an
250
+ * array of numbers, or a string of comma separated numbers.
251
+ */
252
+ hourValues;
847
253
  hourValuesChanged() {
848
254
  this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
849
255
  }
256
+ /**
257
+ * Values used to create the list of selectable minutes. By default
258
+ * the minutes range from `0` to `59`. However, to control exactly which minutes to display,
259
+ * the `minuteValues` input can take a number, an array of numbers, or a string of comma
260
+ * separated numbers. For example, if the minute selections should only be every 15 minutes,
261
+ * then this input value would be `minuteValues="0,15,30,45"`.
262
+ */
263
+ minuteValues;
850
264
  minuteValuesChanged() {
851
265
  this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
852
266
  }
853
267
  /**
854
- * Update the datetime value when the value changes
268
+ * The locale to use for `ion-datetime`. This
269
+ * impacts month and day name formatting.
270
+ * The `"default"` value refers to the default
271
+ * locale set by your device.
272
+ */
273
+ locale = 'default';
274
+ /**
275
+ * The first day of the week to use for `ion-datetime`. The
276
+ * default value is `0` and represents Sunday.
277
+ */
278
+ firstDayOfWeek = 0;
279
+ /**
280
+ * A callback used to format the header text that shows how many
281
+ * dates are selected. Only used if there are 0 or more than 1
282
+ * selected (i.e. unused for exactly 1). By default, the header
283
+ * text is set to "numberOfDates days".
284
+ *
285
+ * See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
286
+ * if you need to access `this` from within the callback.
287
+ */
288
+ titleSelectedDatesFormatter;
289
+ /**
290
+ * If `true`, multiple dates can be selected at once. Only
291
+ * applies to `presentation="date"` and `preferWheel="false"`.
292
+ */
293
+ multiple = false;
294
+ /**
295
+ * Used to apply custom text and background colors to specific dates.
296
+ *
297
+ * Can be either an array of objects containing ISO strings and colors,
298
+ * or a callback that receives an ISO string and returns the colors.
299
+ *
300
+ * Only applies to the `date`, `date-time`, and `time-date` presentations,
301
+ * with `preferWheel="false"`.
302
+ */
303
+ highlightedDates;
304
+ /**
305
+ * The value of the datetime as a valid ISO 8601 datetime string.
306
+ * This should be an array of strings only when `multiple="true"`.
307
+ */
308
+ value;
309
+ /**
310
+ * Update the datetime value when the value changes
311
+ */
312
+ async valueChanged() {
313
+ const { value } = this;
314
+ if (this.hasValue()) {
315
+ this.processValue(value);
316
+ }
317
+ this.emitStyle();
318
+ this.ionValueChange.emit({ value });
319
+ }
320
+ /**
321
+ * If `true`, a header will be shown above the calendar
322
+ * picker. This will include both the slotted title, and
323
+ * the selected date.
324
+ */
325
+ showDefaultTitle = false;
326
+ /**
327
+ * If `true`, the default "Cancel" and "OK" buttons
328
+ * will be rendered at the bottom of the `ion-datetime`
329
+ * component. Developers can also use the `button` slot
330
+ * if they want to customize these buttons. If custom
331
+ * buttons are set in the `button` slot then the
332
+ * default buttons will not be rendered.
333
+ */
334
+ showDefaultButtons = false;
335
+ /**
336
+ * If `true`, a "Clear" button will be rendered alongside
337
+ * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
338
+ * component. Developers can also use the `button` slot
339
+ * if they want to customize these buttons. If custom
340
+ * buttons are set in the `button` slot then the
341
+ * default buttons will not be rendered.
342
+ */
343
+ showClearButton = false;
344
+ /**
345
+ * If `true`, the default "Time" label will be rendered
346
+ * for the time selector of the `ion-datetime` component.
347
+ * Developers can also use the `time-label` slot
348
+ * if they want to customize this label. If a custom
349
+ * label is set in the `time-label` slot then the
350
+ * default label will not be rendered.
351
+ */
352
+ showDefaultTimeLabel = true;
353
+ /**
354
+ * The hour cycle of the `ion-datetime`. If no value is set, this is
355
+ * specified by the current locale.
356
+ */
357
+ hourCycle;
358
+ /**
359
+ * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
360
+ * If `fixed`, the `ion-datetime` will have a fixed width.
361
+ */
362
+ size = 'fixed';
363
+ /**
364
+ * If `true`, a wheel picker will be rendered instead of a calendar grid
365
+ * where possible. If `false`, a calendar grid will be rendered instead of
366
+ * a wheel picker where possible.
367
+ *
368
+ * A wheel picker can be rendered instead of a grid when `presentation` is
369
+ * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
370
+ *
371
+ * A wheel picker will always be rendered regardless of
372
+ * the `preferWheel` value when `presentation` is one of the following values:
373
+ * `"time"`, `"month"`, `"month-year"`, or `"year"`.
374
+ */
375
+ preferWheel = false;
376
+ /**
377
+ * Emitted when the datetime selection was cancelled.
855
378
  */
856
- async valueChanged() {
857
- const { value } = this;
858
- if (this.hasValue()) {
859
- this.processValue(value);
860
- }
861
- this.emitStyle();
862
- this.ionValueChange.emit({ value });
863
- }
379
+ ionCancel;
380
+ /**
381
+ * Emitted when the value (selected date) has changed.
382
+ *
383
+ * This event will not emit when programmatically setting the `value` property.
384
+ */
385
+ ionChange;
386
+ /**
387
+ * Emitted when the value property has changed.
388
+ * This is used to ensure that ion-datetime-button can respond
389
+ * to any value property changes.
390
+ * @internal
391
+ */
392
+ ionValueChange;
393
+ /**
394
+ * Emitted when the datetime has focus.
395
+ */
396
+ ionFocus;
397
+ /**
398
+ * Emitted when the datetime loses focus.
399
+ */
400
+ ionBlur;
401
+ /**
402
+ * Emitted when the styles change.
403
+ * @internal
404
+ */
405
+ ionStyle;
406
+ /**
407
+ * Emitted when componentDidRender is fired.
408
+ * @internal
409
+ */
410
+ ionRender;
864
411
  /**
865
412
  * Confirms the selected datetime value, updates the
866
413
  * `value` property, and optionally closes the popover
@@ -930,10 +477,425 @@ export class Datetime {
930
477
  async getDefaultPart() {
931
478
  return this.defaultParts;
932
479
  }
480
+ warnIfIncorrectValueUsage = () => {
481
+ const { multiple, value } = this;
482
+ if (!multiple && Array.isArray(value)) {
483
+ /**
484
+ * We do some processing on the `value` array so
485
+ * that it looks more like an array when logged to
486
+ * the console.
487
+ * Example given ['a', 'b']
488
+ * Default toString() behavior: a,b
489
+ * Custom behavior: ['a', 'b']
490
+ */
491
+ 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".
492
+
493
+ Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
494
+ `, this.el);
495
+ }
496
+ };
497
+ setValue = (value) => {
498
+ this.value = value;
499
+ this.ionChange.emit({ value });
500
+ };
501
+ /**
502
+ * Returns the DatetimePart interface
503
+ * to use when rendering an initial set of
504
+ * data. This should be used when rendering an
505
+ * interface in an environment where the `value`
506
+ * may not be set. This function works
507
+ * by returning the first selected date and then
508
+ * falling back to defaultParts if no active date
509
+ * is selected.
510
+ */
511
+ getActivePartsWithFallback = () => {
512
+ const { defaultParts } = this;
513
+ return this.getActivePart() ?? defaultParts;
514
+ };
515
+ getActivePart = () => {
516
+ const { activeParts } = this;
517
+ return Array.isArray(activeParts) ? activeParts[0] : activeParts;
518
+ };
519
+ closeParentOverlay = (role) => {
520
+ const popoverOrModal = this.el.closest('ion-modal, ion-popover');
521
+ if (popoverOrModal) {
522
+ popoverOrModal.dismiss(undefined, role);
523
+ }
524
+ };
525
+ setWorkingParts = (parts) => {
526
+ this.workingParts = {
527
+ ...parts,
528
+ };
529
+ };
530
+ setActiveParts = (parts, removeDate = false) => {
531
+ /** if the datetime component is in readonly mode,
532
+ * allow browsing of the calendar without changing
533
+ * the set value
534
+ */
535
+ if (this.readonly) {
536
+ return;
537
+ }
538
+ const { multiple, minParts, maxParts, activeParts } = this;
539
+ /**
540
+ * When setting the active parts, it is possible
541
+ * to set invalid data. For example,
542
+ * when updating January 31 to February,
543
+ * February 31 does not exist. As a result
544
+ * we need to validate the active parts and
545
+ * ensure that we are only setting valid dates.
546
+ * Additionally, we need to update the working parts
547
+ * too in the event that the validated parts are different.
548
+ */
549
+ const validatedParts = validateParts(parts, minParts, maxParts);
550
+ this.setWorkingParts(validatedParts);
551
+ if (multiple) {
552
+ const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
553
+ if (removeDate) {
554
+ this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
555
+ }
556
+ else {
557
+ this.activeParts = [...activePartsArray, validatedParts];
558
+ }
559
+ }
560
+ else {
561
+ this.activeParts = {
562
+ ...validatedParts,
563
+ };
564
+ }
565
+ const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
566
+ if (hasSlottedButtons || this.showDefaultButtons) {
567
+ return;
568
+ }
569
+ this.confirm();
570
+ };
933
571
  get isCalendarPicker() {
934
572
  const { presentation } = this;
935
573
  return presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
936
574
  }
575
+ initializeKeyboardListeners = () => {
576
+ const calendarBodyRef = this.calendarBodyRef;
577
+ if (!calendarBodyRef) {
578
+ return;
579
+ }
580
+ const root = this.el.shadowRoot;
581
+ /**
582
+ * Get a reference to the month
583
+ * element we are currently viewing.
584
+ */
585
+ const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
586
+ /**
587
+ * When focusing the calendar body, we want to pass focus
588
+ * to the working day, but other days should
589
+ * only be accessible using the arrow keys. Pressing
590
+ * Tab should jump between bodies of selectable content.
591
+ */
592
+ const checkCalendarBodyFocus = (ev) => {
593
+ const record = ev[0];
594
+ /**
595
+ * If calendar body was already focused
596
+ * when this fired or if the calendar body
597
+ * if not currently focused, we should not re-focus
598
+ * the inner day.
599
+ */
600
+ if (record.oldValue?.includes('ion-focused') || !calendarBodyRef.classList.contains('ion-focused')) {
601
+ return;
602
+ }
603
+ this.focusWorkingDay(currentMonth);
604
+ };
605
+ const mo = new MutationObserver(checkCalendarBodyFocus);
606
+ mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
607
+ this.destroyKeyboardMO = () => {
608
+ mo?.disconnect();
609
+ };
610
+ /**
611
+ * We must use keydown not keyup as we want
612
+ * to prevent scrolling when using the arrow keys.
613
+ */
614
+ calendarBodyRef.addEventListener('keydown', (ev) => {
615
+ const activeElement = root.activeElement;
616
+ if (!activeElement || !activeElement.classList.contains('calendar-day')) {
617
+ return;
618
+ }
619
+ const parts = getPartsFromCalendarDay(activeElement);
620
+ let partsToFocus;
621
+ switch (ev.key) {
622
+ case 'ArrowDown':
623
+ ev.preventDefault();
624
+ partsToFocus = getNextWeek(parts);
625
+ break;
626
+ case 'ArrowUp':
627
+ ev.preventDefault();
628
+ partsToFocus = getPreviousWeek(parts);
629
+ break;
630
+ case 'ArrowRight':
631
+ ev.preventDefault();
632
+ partsToFocus = getNextDay(parts);
633
+ break;
634
+ case 'ArrowLeft':
635
+ ev.preventDefault();
636
+ partsToFocus = getPreviousDay(parts);
637
+ break;
638
+ case 'Home':
639
+ ev.preventDefault();
640
+ partsToFocus = getStartOfWeek(parts);
641
+ break;
642
+ case 'End':
643
+ ev.preventDefault();
644
+ partsToFocus = getEndOfWeek(parts);
645
+ break;
646
+ case 'PageUp':
647
+ ev.preventDefault();
648
+ partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
649
+ break;
650
+ case 'PageDown':
651
+ ev.preventDefault();
652
+ partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
653
+ break;
654
+ /**
655
+ * Do not preventDefault here
656
+ * as we do not want to override other
657
+ * browser defaults such as pressing Enter/Space
658
+ * to select a day.
659
+ */
660
+ default:
661
+ return;
662
+ }
663
+ /**
664
+ * If the day we want to move focus to is
665
+ * disabled, do not do anything.
666
+ */
667
+ if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
668
+ return;
669
+ }
670
+ this.setWorkingParts({
671
+ ...this.workingParts,
672
+ ...partsToFocus,
673
+ });
674
+ /**
675
+ * Give view a chance to re-render
676
+ * then move focus to the new working day
677
+ */
678
+ requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
679
+ });
680
+ };
681
+ focusWorkingDay = (currentMonth) => {
682
+ /**
683
+ * Get the number of offset days so
684
+ * we know how much to offset our next selector by
685
+ * to grab the correct calendar-day element.
686
+ */
687
+ const { day, month, year } = this.workingParts;
688
+ const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
689
+ const offset = firstOfMonth >= this.firstDayOfWeek
690
+ ? firstOfMonth - this.firstDayOfWeek
691
+ : 7 - (this.firstDayOfWeek - firstOfMonth);
692
+ if (day === null) {
693
+ return;
694
+ }
695
+ /**
696
+ * Get the calendar day element
697
+ * and focus it.
698
+ */
699
+ const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
700
+ if (dayEl) {
701
+ dayEl.focus();
702
+ }
703
+ };
704
+ processMinParts = () => {
705
+ const { min, defaultParts } = this;
706
+ if (min === undefined) {
707
+ this.minParts = undefined;
708
+ return;
709
+ }
710
+ this.minParts = parseMinParts(min, defaultParts);
711
+ };
712
+ processMaxParts = () => {
713
+ const { max, defaultParts } = this;
714
+ if (max === undefined) {
715
+ this.maxParts = undefined;
716
+ return;
717
+ }
718
+ this.maxParts = parseMaxParts(max, defaultParts);
719
+ };
720
+ initializeCalendarListener = () => {
721
+ const calendarBodyRef = this.calendarBodyRef;
722
+ if (!calendarBodyRef) {
723
+ return;
724
+ }
725
+ /**
726
+ * For performance reasons, we only render 3
727
+ * months at a time: The current month, the previous
728
+ * month, and the next month. We have a scroll listener
729
+ * on the calendar body to append/prepend new months.
730
+ *
731
+ * We can do this because Stencil is smart enough to not
732
+ * re-create the .calendar-month containers, but rather
733
+ * update the content within those containers.
734
+ *
735
+ * As an added bonus, WebKit has some troubles with
736
+ * scroll-snap-stop: always, so not rendering all of
737
+ * the months in a row allows us to mostly sidestep
738
+ * that issue.
739
+ */
740
+ const months = calendarBodyRef.querySelectorAll('.calendar-month');
741
+ const startMonth = months[0];
742
+ const workingMonth = months[1];
743
+ const endMonth = months[2];
744
+ const mode = getIonMode(this);
745
+ const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
746
+ /**
747
+ * Before setting up the scroll listener,
748
+ * scroll the middle month into view.
749
+ * scrollIntoView() will scroll entire page
750
+ * if element is not in viewport. Use scrollLeft instead.
751
+ */
752
+ writeTask(() => {
753
+ calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
754
+ const getChangedMonth = (parts) => {
755
+ const box = calendarBodyRef.getBoundingClientRect();
756
+ /**
757
+ * If the current scroll position is all the way to the left
758
+ * then we have scrolled to the previous month.
759
+ * Otherwise, assume that we have scrolled to the next
760
+ * month. We have a tolerance of 2px to account for
761
+ * sub pixel rendering.
762
+ *
763
+ * Check below the next line ensures that we did not
764
+ * swipe and abort (i.e. we swiped but we are still on the current month).
765
+ */
766
+ const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
767
+ const month = condition ? startMonth : endMonth;
768
+ /**
769
+ * The edge of the month must be lined up with
770
+ * the edge of the calendar body in order for
771
+ * the component to update. Otherwise, it
772
+ * may be the case that the user has paused their
773
+ * swipe or the browser has not finished snapping yet.
774
+ * Rather than check if the x values are equal,
775
+ * we give it a tolerance of 2px to account for
776
+ * sub pixel rendering.
777
+ */
778
+ const monthBox = month.getBoundingClientRect();
779
+ if (Math.abs(monthBox.x - box.x) > 2)
780
+ return;
781
+ /**
782
+ * If we're force-rendering a month, assume we've
783
+ * scrolled to that and return it.
784
+ *
785
+ * If forceRenderDate is ever used in a context where the
786
+ * forced month is not immediately auto-scrolled to, this
787
+ * should be updated to also check whether `month` has the
788
+ * same month and year as the forced date.
789
+ */
790
+ const { forceRenderDate } = this;
791
+ if (forceRenderDate !== undefined) {
792
+ return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
793
+ }
794
+ /**
795
+ * From here, we can determine if the start
796
+ * month or the end month was scrolled into view.
797
+ * If no month was changed, then we can return from
798
+ * the scroll callback early.
799
+ */
800
+ if (month === startMonth) {
801
+ return getPreviousMonth(parts);
802
+ }
803
+ else if (month === endMonth) {
804
+ return getNextMonth(parts);
805
+ }
806
+ else {
807
+ return;
808
+ }
809
+ };
810
+ const updateActiveMonth = () => {
811
+ if (needsiOSRubberBandFix) {
812
+ calendarBodyRef.style.removeProperty('pointer-events');
813
+ appliediOSRubberBandFix = false;
814
+ }
815
+ /**
816
+ * If the month did not change
817
+ * then we can return early.
818
+ */
819
+ const newDate = getChangedMonth(this.workingParts);
820
+ if (!newDate)
821
+ return;
822
+ const { month, day, year } = newDate;
823
+ if (isMonthDisabled({ month, year, day: null }, {
824
+ minParts: { ...this.minParts, day: null },
825
+ maxParts: { ...this.maxParts, day: null },
826
+ })) {
827
+ return;
828
+ }
829
+ /**
830
+ * Prevent scrolling for other browsers
831
+ * to give the DOM time to update and the container
832
+ * time to properly snap.
833
+ */
834
+ calendarBodyRef.style.setProperty('overflow', 'hidden');
835
+ /**
836
+ * Use a writeTask here to ensure
837
+ * that the state is updated and the
838
+ * correct month is scrolled into view
839
+ * in the same frame. This is not
840
+ * typically a problem on newer devices
841
+ * but older/slower device may have a flicker
842
+ * if we did not do this.
843
+ */
844
+ writeTask(() => {
845
+ this.setWorkingParts({
846
+ ...this.workingParts,
847
+ month,
848
+ day: day,
849
+ year,
850
+ });
851
+ calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
852
+ calendarBodyRef.style.removeProperty('overflow');
853
+ if (this.resolveForceDateScrolling) {
854
+ this.resolveForceDateScrolling();
855
+ }
856
+ const activeEl = this.el.shadowRoot.activeElement;
857
+ if (activeEl && activeEl.classList.contains('calendar-day')) {
858
+ activeEl.closest('.calendar-body')?.focus();
859
+ }
860
+ });
861
+ };
862
+ /**
863
+ * When the container finishes scrolling we
864
+ * need to update the DOM with the selected month.
865
+ */
866
+ let scrollTimeout;
867
+ /**
868
+ * We do not want to attempt to set pointer-events
869
+ * multiple times within a single swipe gesture as
870
+ * that adds unnecessary work to the main thread.
871
+ */
872
+ let appliediOSRubberBandFix = false;
873
+ const scrollCallback = () => {
874
+ if (scrollTimeout) {
875
+ clearTimeout(scrollTimeout);
876
+ }
877
+ /**
878
+ * On iOS it is possible to quickly rubber band
879
+ * the scroll area before the scroll timeout has fired.
880
+ * This results in users reaching the end of the scrollable
881
+ * container before the DOM has updated.
882
+ * By setting `pointer-events: none` we can ensure that
883
+ * subsequent swipes do not happen while the container
884
+ * is snapping.
885
+ */
886
+ if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
887
+ calendarBodyRef.style.setProperty('pointer-events', 'none');
888
+ appliediOSRubberBandFix = true;
889
+ }
890
+ // Wait ~3 frames
891
+ scrollTimeout = setTimeout(updateActiveMonth, 50);
892
+ };
893
+ calendarBodyRef.addEventListener('scroll', scrollCallback);
894
+ this.destroyCalendarListener = () => {
895
+ calendarBodyRef.removeEventListener('scroll', scrollCallback);
896
+ };
897
+ });
898
+ };
937
899
  connectedCallback() {
938
900
  this.clearFocusVisible = startFocusVisible(this.el).destroy;
939
901
  this.loadTimeout = setTimeout(() => {
@@ -948,10 +910,66 @@ export class Datetime {
948
910
  this.loadTimeoutCleanup();
949
911
  this.hasBeenIntersecting = false;
950
912
  }
913
+ /**
914
+ * Clean up all listeners except for the overlay
915
+ * listener. This is so that we can re-create the listeners
916
+ * if the datetime has been hidden/presented by a modal or popover.
917
+ */
918
+ destroyInteractionListeners = () => {
919
+ const { destroyCalendarListener, destroyKeyboardMO } = this;
920
+ if (destroyCalendarListener !== undefined) {
921
+ destroyCalendarListener();
922
+ }
923
+ if (destroyKeyboardMO !== undefined) {
924
+ destroyKeyboardMO();
925
+ }
926
+ };
951
927
  initializeListeners() {
952
928
  this.initializeCalendarListener();
953
929
  this.initializeKeyboardListeners();
954
930
  }
931
+ /**
932
+ * TODO(FW-6931): Remove this fallback upon solving the root cause
933
+ * Fallback to ensure the datetime becomes ready even if
934
+ * IntersectionObserver never reports it as intersecting.
935
+ *
936
+ * This is primarily used in environments where the observer
937
+ * might not fire as expected, such as when running under
938
+ * synthetic tests that stub IntersectionObserver.
939
+ */
940
+ ensureReadyIfVisible = () => {
941
+ if (this.el.classList.contains('datetime-ready')) {
942
+ return;
943
+ }
944
+ const rect = this.el.getBoundingClientRect();
945
+ if (rect.width === 0 || rect.height === 0) {
946
+ return;
947
+ }
948
+ this.markReady();
949
+ };
950
+ markReady = () => {
951
+ if (this.el.classList.contains('datetime-ready')) {
952
+ return;
953
+ }
954
+ this.initializeListeners();
955
+ /**
956
+ * TODO FW-2793: Datetime needs a frame to ensure that it
957
+ * can properly scroll contents into view. As a result
958
+ * we hide the scrollable content until after that frame
959
+ * so users do not see the content quickly shifting. The downside
960
+ * is that the content will pop into view a frame after. Maybe there
961
+ * is a better way to handle this?
962
+ */
963
+ writeTask(() => {
964
+ this.el.classList.add('datetime-ready');
965
+ });
966
+ };
967
+ loadTimeoutCleanup = () => {
968
+ if (this.loadTimeout) {
969
+ clearTimeout(this.loadTimeout);
970
+ this.loadTimeout = undefined;
971
+ }
972
+ };
955
973
  componentDidLoad() {
956
974
  const { el, intersectionTrackerRef } = this;
957
975
  /**
@@ -976,7 +994,7 @@ export class Datetime {
976
994
  * could cause the datetime to start at a visibility of 0, erroneously
977
995
  * triggering the `hiddenIO` observer below.
978
996
  */
979
- raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(intersectionTrackerRef));
997
+ raf(() => visibleIO?.observe(intersectionTrackerRef));
980
998
  /**
981
999
  * TODO(FW-6931): Remove this fallback upon solving the root cause
982
1000
  * Fallback: If IntersectionObserver never reports that the
@@ -1022,7 +1040,7 @@ export class Datetime {
1022
1040
  });
1023
1041
  };
1024
1042
  const hiddenIO = new IntersectionObserver(hiddenCallback, { threshold: 0, root: el });
1025
- raf(() => hiddenIO === null || hiddenIO === void 0 ? void 0 : hiddenIO.observe(intersectionTrackerRef));
1043
+ raf(() => hiddenIO?.observe(intersectionTrackerRef));
1026
1044
  /**
1027
1045
  * Datetime uses Ionic components that emit
1028
1046
  * ionFocus and ionBlur. These events are
@@ -1095,6 +1113,119 @@ export class Datetime {
1095
1113
  this.ionRender.emit();
1096
1114
  });
1097
1115
  }
1116
+ processValue = (value) => {
1117
+ const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
1118
+ const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
1119
+ const { minParts, maxParts, workingParts, el } = this;
1120
+ this.warnIfIncorrectValueUsage();
1121
+ /**
1122
+ * Return early if the value wasn't parsed correctly, such as
1123
+ * if an improperly formatted date string was provided.
1124
+ */
1125
+ if (!valueToProcess) {
1126
+ return;
1127
+ }
1128
+ /**
1129
+ * Datetime should only warn of out of bounds values
1130
+ * if set by the user. If the `value` is undefined,
1131
+ * we will default to today's date which may be out
1132
+ * of bounds. In this case, the warning makes it look
1133
+ * like the developer did something wrong which is
1134
+ * not true.
1135
+ */
1136
+ if (hasValue) {
1137
+ warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
1138
+ }
1139
+ /**
1140
+ * If there are multiple values, clamp to the last one.
1141
+ * This is because the last value is the one that the user
1142
+ * has most recently interacted with.
1143
+ */
1144
+ const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
1145
+ const targetValue = clampDate(singleValue, minParts, maxParts);
1146
+ const { month, day, year, hour, minute } = targetValue;
1147
+ const ampm = parseAmPm(hour);
1148
+ /**
1149
+ * Since `activeParts` indicates a value that been explicitly selected
1150
+ * either by the user or the app, only update `activeParts` if the
1151
+ * `value` property is set.
1152
+ */
1153
+ if (hasValue) {
1154
+ if (Array.isArray(valueToProcess)) {
1155
+ this.activeParts = [...valueToProcess];
1156
+ }
1157
+ else {
1158
+ this.activeParts = {
1159
+ month,
1160
+ day,
1161
+ year,
1162
+ hour,
1163
+ minute,
1164
+ ampm,
1165
+ };
1166
+ }
1167
+ }
1168
+ else {
1169
+ /**
1170
+ * Reset the active parts if the value is not set.
1171
+ * This will clear the selected calendar day when
1172
+ * performing a clear action or using the reset() method.
1173
+ */
1174
+ this.activeParts = [];
1175
+ }
1176
+ const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
1177
+ const bodyIsVisible = el.classList.contains('datetime-ready');
1178
+ const { isGridStyle, showMonthAndYear } = this;
1179
+ if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
1180
+ /**
1181
+ * Only animate if:
1182
+ * 1. We're using grid style (wheel style pickers should just jump to new value)
1183
+ * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
1184
+ * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
1185
+ * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
1186
+ */
1187
+ this.animateToDate(targetValue);
1188
+ }
1189
+ else {
1190
+ this.setWorkingParts({
1191
+ month,
1192
+ day,
1193
+ year,
1194
+ hour,
1195
+ minute,
1196
+ ampm,
1197
+ });
1198
+ }
1199
+ };
1200
+ animateToDate = async (targetValue) => {
1201
+ const { workingParts } = this;
1202
+ /**
1203
+ * Tell other render functions that we need to force the
1204
+ * target month to appear in place of the actual next/prev month.
1205
+ * Because this is a State variable, a rerender will be triggered
1206
+ * automatically, updating the rendered months.
1207
+ */
1208
+ this.forceRenderDate = targetValue;
1209
+ /**
1210
+ * Flag that we've started scrolling to the forced date.
1211
+ * The resolve function will be called by the datetime's
1212
+ * scroll listener when it's done updating everything.
1213
+ * This is a replacement for making prev/nextMonth async,
1214
+ * since the logic we're waiting on is in a listener.
1215
+ */
1216
+ const forceDateScrollingPromise = new Promise((resolve) => {
1217
+ this.resolveForceDateScrolling = resolve;
1218
+ });
1219
+ /**
1220
+ * Animate smoothly to the forced month. This will also update
1221
+ * workingParts and correct the surrounding months for us.
1222
+ */
1223
+ const targetMonthIsBefore = isBefore(targetValue, workingParts);
1224
+ targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
1225
+ await forceDateScrollingPromise;
1226
+ this.resolveForceDateScrolling = undefined;
1227
+ this.forceRenderDate = undefined;
1228
+ };
1098
1229
  componentWillLoad() {
1099
1230
  const { el, formatOptions, highlightedDates, multiple, presentation, preferWheel } = this;
1100
1231
  if (multiple) {
@@ -1145,13 +1276,58 @@ export class Datetime {
1145
1276
  'interactive-disabled': this.disabled,
1146
1277
  });
1147
1278
  }
1279
+ onFocus = () => {
1280
+ this.ionFocus.emit();
1281
+ };
1282
+ onBlur = () => {
1283
+ this.ionBlur.emit();
1284
+ };
1285
+ hasValue = () => {
1286
+ return this.value != null;
1287
+ };
1288
+ nextMonth = () => {
1289
+ const calendarBodyRef = this.calendarBodyRef;
1290
+ if (!calendarBodyRef) {
1291
+ return;
1292
+ }
1293
+ const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
1294
+ if (!nextMonth) {
1295
+ return;
1296
+ }
1297
+ const left = nextMonth.offsetWidth * 2;
1298
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
1299
+ calendarBodyRef.scrollTo({
1300
+ top: 0,
1301
+ left: left * (isRTL(this.el) ? -1 : 1),
1302
+ behavior: scrollMode,
1303
+ });
1304
+ };
1305
+ prevMonth = () => {
1306
+ const calendarBodyRef = this.calendarBodyRef;
1307
+ if (!calendarBodyRef) {
1308
+ return;
1309
+ }
1310
+ const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
1311
+ if (!prevMonth) {
1312
+ return;
1313
+ }
1314
+ const left = prevMonth.offsetWidth * 2;
1315
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
1316
+ calendarBodyRef.scrollTo({
1317
+ top: 0,
1318
+ left: left * (isRTL(this.el) ? 1 : -1),
1319
+ behavior: scrollMode,
1320
+ });
1321
+ };
1322
+ toggleMonthAndYearView = () => {
1323
+ this.showMonthAndYear = !this.showMonthAndYear;
1324
+ };
1148
1325
  /**
1149
1326
  * Universal render methods
1150
1327
  * These are pieces of datetime that
1151
1328
  * are rendered independently of presentation.
1152
1329
  */
1153
1330
  renderFooter() {
1154
- const theme = getIonTheme(this);
1155
1331
  const { disabled, readonly, showDefaultButtons, showClearButton } = this;
1156
1332
  /**
1157
1333
  * The cancel, clear, and confirm buttons
@@ -1159,7 +1335,6 @@ export class Datetime {
1159
1335
  * is disabled or readonly.
1160
1336
  */
1161
1337
  const isButtonDisabled = disabled || readonly;
1162
- const confirmFill = theme === 'ionic' ? 'solid' : undefined;
1163
1338
  const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
1164
1339
  if (!hasSlottedButtons && !showDefaultButtons && !showClearButton) {
1165
1340
  return;
@@ -1178,7 +1353,7 @@ export class Datetime {
1178
1353
  return (h("div", { class: "datetime-footer" }, h("div", { class: "datetime-buttons" }, h("div", { class: {
1179
1354
  ['datetime-action-buttons']: true,
1180
1355
  ['has-clear-button']: this.showClearButton,
1181
- } }, h("slot", { name: "buttons" }, showDefaultButtons && (h("ion-button", { id: "cancel-button", color: this.color, onClick: () => this.cancel(true), disabled: isButtonDisabled }, this.cancelText)), h("div", { class: "datetime-action-buttons-container" }, showClearButton && (h("ion-button", { id: "clear-button", color: this.color, onClick: () => clearButtonClick(), disabled: isButtonDisabled }, this.clearText)), showDefaultButtons && (h("ion-button", { id: "confirm-button", fill: confirmFill, color: this.color, onClick: () => this.confirm(true), disabled: isButtonDisabled }, this.doneText))))))));
1356
+ } }, h("slot", { name: "buttons" }, h("ion-buttons", null, showDefaultButtons && (h("ion-button", { id: "cancel-button", color: this.color, onClick: () => this.cancel(true), disabled: isButtonDisabled }, this.cancelText)), h("div", { class: "datetime-action-buttons-container" }, showClearButton && (h("ion-button", { id: "clear-button", color: this.color, onClick: () => clearButtonClick(), disabled: isButtonDisabled }, this.clearText)), showDefaultButtons && (h("ion-button", { id: "confirm-button", color: this.color, onClick: () => this.confirm(true), disabled: isButtonDisabled }, this.doneText)))))))));
1182
1357
  }
1183
1358
  /**
1184
1359
  * Wheel picker render methods
@@ -1245,7 +1420,10 @@ export class Datetime {
1245
1420
  catch (e) {
1246
1421
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1247
1422
  }
1248
- return Object.assign(Object.assign({}, itemObject), { disabled });
1423
+ return {
1424
+ ...itemObject,
1425
+ disabled,
1426
+ };
1249
1427
  });
1250
1428
  }
1251
1429
  /**
@@ -1258,10 +1436,16 @@ export class Datetime {
1258
1436
  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) => {
1259
1437
  const { value } = ev.detail;
1260
1438
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1261
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
1262
- this.setActiveParts(Object.assign(Object.assign({}, activePart), findPart));
1439
+ this.setWorkingParts({
1440
+ ...workingParts,
1441
+ ...findPart,
1442
+ });
1443
+ this.setActiveParts({
1444
+ ...activePart,
1445
+ ...findPart,
1446
+ });
1263
1447
  ev.stopPropagation();
1264
- } }, 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)))));
1448
+ } }, 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)))));
1265
1449
  }
1266
1450
  renderIndividualDatePickerColumns(forcePresentation) {
1267
1451
  const { workingParts, isDateEnabled } = this;
@@ -1294,7 +1478,10 @@ export class Datetime {
1294
1478
  catch (e) {
1295
1479
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1296
1480
  }
1297
- return Object.assign(Object.assign({}, dayObject), { disabled });
1481
+ return {
1482
+ ...dayObject,
1483
+ disabled,
1484
+ };
1298
1485
  });
1299
1486
  }
1300
1487
  const shouldRenderYears = forcePresentation !== 'month' && forcePresentation !== 'time';
@@ -1323,18 +1510,23 @@ export class Datetime {
1323
1510
  return renderArray;
1324
1511
  }
1325
1512
  renderDayPickerColumn(days) {
1326
- var _a;
1327
1513
  if (days.length === 0) {
1328
1514
  return [];
1329
1515
  }
1330
1516
  const { disabled, workingParts } = this;
1331
1517
  const activePart = this.getActivePartsWithFallback();
1332
- const pickerColumnValue = (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined;
1518
+ const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
1333
1519
  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) => {
1334
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1335
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1520
+ this.setWorkingParts({
1521
+ ...workingParts,
1522
+ day: ev.detail.value,
1523
+ });
1524
+ this.setActiveParts({
1525
+ ...activePart,
1526
+ day: ev.detail.value,
1527
+ });
1336
1528
  ev.stopPropagation();
1337
- } }, 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)))));
1529
+ } }, 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)))));
1338
1530
  }
1339
1531
  renderMonthPickerColumn(months) {
1340
1532
  if (months.length === 0) {
@@ -1343,13 +1535,19 @@ export class Datetime {
1343
1535
  const { disabled, workingParts } = this;
1344
1536
  const activePart = this.getActivePartsWithFallback();
1345
1537
  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) => {
1346
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1538
+ this.setWorkingParts({
1539
+ ...workingParts,
1540
+ month: ev.detail.value,
1541
+ });
1347
1542
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1348
1543
  if (!this.multiple) {
1349
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1544
+ this.setActiveParts({
1545
+ ...activePart,
1546
+ month: ev.detail.value,
1547
+ });
1350
1548
  }
1351
1549
  ev.stopPropagation();
1352
- } }, 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)))));
1550
+ } }, 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)))));
1353
1551
  }
1354
1552
  renderYearPickerColumn(years) {
1355
1553
  if (years.length === 0) {
@@ -1358,13 +1556,19 @@ export class Datetime {
1358
1556
  const { disabled, workingParts } = this;
1359
1557
  const activePart = this.getActivePartsWithFallback();
1360
1558
  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) => {
1361
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1559
+ this.setWorkingParts({
1560
+ ...workingParts,
1561
+ year: ev.detail.value,
1562
+ });
1362
1563
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1363
1564
  if (!this.multiple) {
1364
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1565
+ this.setActiveParts({
1566
+ ...activePart,
1567
+ year: ev.detail.value,
1568
+ });
1365
1569
  }
1366
1570
  ev.stopPropagation();
1367
- } }, 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)))));
1571
+ } }, 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)))));
1368
1572
  }
1369
1573
  renderTimePickerColumns(forcePresentation) {
1370
1574
  if (['date', 'month', 'month-year', 'year'].includes(forcePresentation)) {
@@ -1394,10 +1598,16 @@ export class Datetime {
1394
1598
  return [];
1395
1599
  const activePart = this.getActivePartsWithFallback();
1396
1600
  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) => {
1397
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1398
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { hour: ev.detail.value }));
1601
+ this.setWorkingParts({
1602
+ ...workingParts,
1603
+ hour: ev.detail.value,
1604
+ });
1605
+ this.setActiveParts({
1606
+ ...this.getActivePartsWithFallback(),
1607
+ hour: ev.detail.value,
1608
+ });
1399
1609
  ev.stopPropagation();
1400
- } }, 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)))));
1610
+ } }, 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)))));
1401
1611
  }
1402
1612
  renderMinutePickerColumn(minutesData) {
1403
1613
  const { disabled, workingParts } = this;
@@ -1405,10 +1615,16 @@ export class Datetime {
1405
1615
  return [];
1406
1616
  const activePart = this.getActivePartsWithFallback();
1407
1617
  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) => {
1408
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1409
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { minute: ev.detail.value }));
1618
+ this.setWorkingParts({
1619
+ ...workingParts,
1620
+ minute: ev.detail.value,
1621
+ });
1622
+ this.setActiveParts({
1623
+ ...this.getActivePartsWithFallback(),
1624
+ minute: ev.detail.value,
1625
+ });
1410
1626
  ev.stopPropagation();
1411
- } }, 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)))));
1627
+ } }, 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)))));
1412
1628
  }
1413
1629
  renderDayPeriodPickerColumn(dayPeriodData) {
1414
1630
  const { disabled, workingParts } = this;
@@ -1419,10 +1635,18 @@ export class Datetime {
1419
1635
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1420
1636
  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) => {
1421
1637
  const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1422
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1423
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { ampm: ev.detail.value, hour }));
1638
+ this.setWorkingParts({
1639
+ ...workingParts,
1640
+ ampm: ev.detail.value,
1641
+ hour,
1642
+ });
1643
+ this.setActiveParts({
1644
+ ...this.getActivePartsWithFallback(),
1645
+ ampm: ev.detail.value,
1646
+ hour,
1647
+ });
1424
1648
  ev.stopPropagation();
1425
- } }, 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)))));
1649
+ } }, 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)))));
1426
1650
  }
1427
1651
  renderWheelView(forcePresentation) {
1428
1652
  const { locale } = this;
@@ -1435,8 +1659,10 @@ export class Datetime {
1435
1659
  /**
1436
1660
  * Grid Render Methods
1437
1661
  */
1438
- renderCalendarHeader(theme) {
1439
- const { disabled, datetimeNextIcon, datetimePreviousIcon, datetimeCollapsedIcon, datetimeExpandedIcon } = this;
1662
+ renderCalendarHeader(mode) {
1663
+ const { disabled } = this;
1664
+ const expandedIcon = mode === 'ios' ? chevronDown : caretUpSharp;
1665
+ const collapsedIcon = mode === 'ios' ? chevronForward : caretDownSharp;
1440
1666
  const prevMonthDisabled = disabled || isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1441
1667
  const nextMonthDisabled = disabled || isNextMonthDisabled(this.workingParts, this.maxParts);
1442
1668
  // don't use the inheritAttributes util because it removes dir from the host, and we still need that
@@ -1445,7 +1671,7 @@ export class Datetime {
1445
1671
  'calendar-month-year-toggle': true,
1446
1672
  'ion-activatable': true,
1447
1673
  'ion-focusable': true,
1448
- }, part: "month-year-button", disabled: disabled, "aria-label": this.showMonthAndYear ? 'Hide year picker' : 'Show year picker', onClick: () => this.toggleMonthAndYearView() }, h("span", { id: "toggle-wrapper" }, getMonthAndYear(this.locale, this.workingParts), theme !== 'ionic' && (h("ion-icon", { "aria-hidden": "true", icon: this.showMonthAndYear ? datetimeExpandedIcon : datetimeCollapsedIcon, lazy: false, flipRtl: true }))), theme === 'md' && h("ion-ripple-effect", null))), h("div", { class: "calendar-next-prev" }, h("ion-button", { "aria-label": "Previous month", disabled: prevMonthDisabled, onClick: () => this.prevMonth(), part: "navigation-button previous-button" }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: datetimePreviousIcon, lazy: false, flipRtl: true })), h("ion-button", { "aria-label": "Next month", disabled: nextMonthDisabled, onClick: () => this.nextMonth(), part: "navigation-button next-button" }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: datetimeNextIcon, lazy: false, flipRtl: true })))), h("div", { class: "calendar-days-of-week", "aria-hidden": "true", part: "calendar-days-of-week" }, getDaysOfWeek(this.locale, theme, this.firstDayOfWeek % 7).map((d) => {
1674
+ }, part: "month-year-button", disabled: disabled, "aria-label": this.showMonthAndYear ? 'Hide year picker' : 'Show year picker', onClick: () => this.toggleMonthAndYearView() }, h("span", { id: "toggle-wrapper" }, getMonthAndYear(this.locale, this.workingParts), h("ion-icon", { "aria-hidden": "true", icon: this.showMonthAndYear ? expandedIcon : collapsedIcon, lazy: false, flipRtl: true })), mode === 'md' && h("ion-ripple-effect", null))), h("div", { class: "calendar-next-prev" }, h("ion-buttons", null, h("ion-button", { "aria-label": "Previous month", disabled: prevMonthDisabled, onClick: () => this.prevMonth(), part: "navigation-button previous-button" }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: chevronBack, lazy: false, flipRtl: true })), h("ion-button", { "aria-label": "Next month", disabled: nextMonthDisabled, onClick: () => this.nextMonth(), part: "navigation-button next-button" }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: chevronForward, lazy: false, flipRtl: true }))))), h("div", { class: "calendar-days-of-week", "aria-hidden": "true", part: "calendar-days-of-week" }, getDaysOfWeek(this.locale, mode, this.firstDayOfWeek % 7).map((d) => {
1449
1675
  return h("div", { class: "day-of-week" }, d);
1450
1676
  }))));
1451
1677
  }
@@ -1464,8 +1690,8 @@ export class Datetime {
1464
1690
  // The day is not used when checking if a month is disabled.
1465
1691
  // Users should be able to access the min or max month, even if the
1466
1692
  // 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 }),
1693
+ minParts: { ...this.minParts, day: null },
1694
+ maxParts: { ...this.maxParts, day: null },
1469
1695
  });
1470
1696
  // The working month should never have swipe disabled.
1471
1697
  // Otherwise the CSS scroll snap will not work and the user
@@ -1574,18 +1800,24 @@ export class Datetime {
1574
1800
  if (isAdjacentDay) {
1575
1801
  // The user selected a day outside the current month. Ignore this button, as the month will be re-rendered.
1576
1802
  this.el.blur();
1577
- this.activeParts = Object.assign(Object.assign({}, activePart), referenceParts);
1803
+ this.activeParts = { ...activePart, ...referenceParts };
1578
1804
  this.animateToDate(referenceParts);
1579
1805
  this.confirm();
1580
1806
  }
1581
1807
  else {
1582
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), referenceParts));
1808
+ this.setWorkingParts({
1809
+ ...this.workingParts,
1810
+ ...referenceParts,
1811
+ });
1583
1812
  // Multiple only needs date info so we can wipe out other fields like time.
1584
1813
  if (multiple) {
1585
1814
  this.setActiveParts(referenceParts, isActive);
1586
1815
  }
1587
1816
  else {
1588
- this.setActiveParts(Object.assign(Object.assign({}, activePart), referenceParts));
1817
+ this.setActiveParts({
1818
+ ...activePart,
1819
+ ...referenceParts,
1820
+ });
1589
1821
  }
1590
1822
  }
1591
1823
  }
@@ -1597,8 +1829,8 @@ export class Datetime {
1597
1829
  return this.renderMonth(month, year);
1598
1830
  })));
1599
1831
  }
1600
- renderCalendar(theme) {
1601
- return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(theme), this.renderCalendarBody()));
1832
+ renderCalendar(mode) {
1833
+ return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(mode), this.renderCalendarBody()));
1602
1834
  }
1603
1835
  renderTimeLabel() {
1604
1836
  const hasSlottedTimeLabel = this.el.querySelector('[slot="time-label"]') !== null;
@@ -1628,7 +1860,7 @@ export class Datetime {
1628
1860
  await popoverRef.onWillDismiss();
1629
1861
  this.isTimePopoverOpen = false;
1630
1862
  }
1631
- } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.time)),
1863
+ } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions?.time)),
1632
1864
  h("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
1633
1865
  /**
1634
1866
  * Intersection Observers do not consistently fire between Blink and Webkit
@@ -1651,7 +1883,6 @@ export class Datetime {
1651
1883
  ];
1652
1884
  }
1653
1885
  getHeaderSelectedDateText() {
1654
- var _a;
1655
1886
  const { activeParts, formatOptions, multiple, titleSelectedDatesFormatter } = this;
1656
1887
  const isArray = Array.isArray(activeParts);
1657
1888
  let headerText;
@@ -1668,7 +1899,7 @@ export class Datetime {
1668
1899
  }
1669
1900
  else {
1670
1901
  // 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' });
1902
+ headerText = getLocalizedDateTime(this.locale, this.getActivePartsWithFallback(), formatOptions?.date ?? { weekday: 'short', month: 'short', day: 'numeric' });
1672
1903
  }
1673
1904
  return headerText;
1674
1905
  }
@@ -1706,7 +1937,7 @@ export class Datetime {
1706
1937
  * Render entry point
1707
1938
  * All presentation types are rendered from here.
1708
1939
  */
1709
- renderDatetime(theme) {
1940
+ renderDatetime(mode) {
1710
1941
  const { presentation, preferWheel } = this;
1711
1942
  /**
1712
1943
  * Certain presentation types have separate grid and wheel displays.
@@ -1720,7 +1951,7 @@ export class Datetime {
1720
1951
  case 'date-time':
1721
1952
  return [
1722
1953
  this.renderHeader(),
1723
- this.renderCalendar(theme),
1954
+ this.renderCalendar(mode),
1724
1955
  this.renderCalendarViewMonthYearPicker(),
1725
1956
  this.renderTime(),
1726
1957
  this.renderFooter(),
@@ -1729,7 +1960,7 @@ export class Datetime {
1729
1960
  return [
1730
1961
  this.renderHeader(),
1731
1962
  this.renderTime(),
1732
- this.renderCalendar(theme),
1963
+ this.renderCalendar(mode),
1733
1964
  this.renderCalendarViewMonthYearPicker(),
1734
1965
  this.renderFooter(),
1735
1966
  ];
@@ -1742,119 +1973,47 @@ export class Datetime {
1742
1973
  default:
1743
1974
  return [
1744
1975
  this.renderHeader(),
1745
- this.renderCalendar(theme),
1976
+ this.renderCalendar(mode),
1746
1977
  this.renderCalendarViewMonthYearPicker(),
1747
1978
  this.renderFooter(),
1748
1979
  ];
1749
1980
  }
1750
1981
  }
1751
- /**
1752
- * Get the icon to use for the next icon.
1753
- * Otherwise, use the icon set in the config.
1754
- * If no icon is set in the config, use the default icon.
1755
- */
1756
- get datetimeNextIcon() {
1757
- // Determine the theme and map to default icons
1758
- const theme = getIonTheme(this);
1759
- const defaultIcons = {
1760
- ios: chevronForward,
1761
- ionic: caretRightRegular,
1762
- md: chevronForward,
1763
- };
1764
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1765
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1766
- // Return the configured datetime next icon or the default icon
1767
- return config.get('datetimeNextIcon', defaultIcon);
1768
- }
1769
- /**
1770
- * Get the icon to use for the previous icon.
1771
- * Otherwise, use the icon set in the config.
1772
- * If no icon is set in the config, use the default icon.
1773
- */
1774
- get datetimePreviousIcon() {
1775
- // Determine the theme and map to default icons
1776
- const theme = getIonTheme(this);
1777
- const defaultIcons = {
1778
- ios: chevronBack,
1779
- ionic: caretLeftRegular,
1780
- md: chevronBack,
1781
- };
1782
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1783
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1784
- // Return the configured datetime previous icon or the default icon
1785
- return config.get('datetimePreviousIcon', defaultIcon);
1786
- }
1787
- /**
1788
- * Get the icon to use for the show month and year icon.
1789
- * Otherwise, use the icon set in the config.
1790
- * If no icon is set in the config, use the default icon.
1791
- */
1792
- get datetimeCollapsedIcon() {
1793
- // Determine the theme and map to default icons
1794
- const theme = getIonTheme(this);
1795
- const defaultIcons = {
1796
- ios: chevronForward,
1797
- ionic: undefined,
1798
- md: caretDownSharp,
1799
- };
1800
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1801
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1802
- // Return the configured datetime show month and year icon or the default icon
1803
- return config.get('datetimeCollapsedIcon', defaultIcon);
1804
- }
1805
- /**
1806
- * Get the icon to use for the hide month and year icon.
1807
- * Otherwise, use the icon set in the config.
1808
- * If no icon is set in the config, use the default icon.
1809
- */
1810
- get datetimeExpandedIcon() {
1811
- // Determine the theme and map to default icons
1812
- const theme = getIonTheme(this);
1813
- const defaultIcons = {
1814
- ios: chevronDown,
1815
- ionic: undefined,
1816
- md: caretUpSharp,
1817
- };
1818
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1819
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1820
- // Return the configured datetime hide month and year icon or the default icon
1821
- return config.get('datetimeExpandedIcon', defaultIcon);
1822
- }
1823
1982
  render() {
1824
1983
  const { name, value, disabled, el, color, readonly, showMonthAndYear, preferWheel, presentation, size, isGridStyle, } = this;
1825
- const theme = getIonTheme(this);
1984
+ const mode = getIonMode(this);
1826
1985
  const isMonthAndYearPresentation = presentation === 'year' || presentation === 'month' || presentation === 'month-year';
1827
1986
  const shouldShowMonthAndYear = showMonthAndYear || isMonthAndYearPresentation;
1828
1987
  const monthYearPickerOpen = showMonthAndYear && !isMonthAndYearPresentation;
1829
1988
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1830
1989
  const hasWheelVariant = hasDatePresentation && preferWheel;
1831
1990
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1832
- return (h(Host, { key: '3a896ebee4ec74209e1aa5d3241fe8b3bacd7fb3', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1833
- [theme]: true,
1834
- ['datetime-readonly']: readonly,
1835
- ['datetime-disabled']: disabled,
1836
- 'show-month-and-year': shouldShowMonthAndYear,
1837
- 'month-year-picker-open': monthYearPickerOpen,
1838
- [`datetime-presentation-${presentation}`]: true,
1839
- [`datetime-size-${size}`]: true,
1840
- [`datetime-prefer-wheel`]: hasWheelVariant,
1841
- [`datetime-grid`]: isGridStyle,
1842
- })) }, h("div", { key: '8f9c5cd9887214553261a294c3ee7abd65399c27', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(theme)));
1991
+ return (h(Host, { key: '79b906669d3e0d9ff356421a5f571d5cf12b6793', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1992
+ ...createColorClasses(color, {
1993
+ [mode]: true,
1994
+ ['datetime-readonly']: readonly,
1995
+ ['datetime-disabled']: disabled,
1996
+ 'show-month-and-year': shouldShowMonthAndYear,
1997
+ 'month-year-picker-open': monthYearPickerOpen,
1998
+ [`datetime-presentation-${presentation}`]: true,
1999
+ [`datetime-size-${size}`]: true,
2000
+ [`datetime-prefer-wheel`]: hasWheelVariant,
2001
+ [`datetime-grid`]: isGridStyle,
2002
+ }),
2003
+ } }, h("div", { key: 'e29ce6edd79f3efb8f7cc4a81bb543d580e5f4c6', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1843
2004
  }
1844
2005
  static get is() { return "ion-datetime"; }
1845
2006
  static get encapsulation() { return "shadow"; }
1846
2007
  static get originalStyleUrls() {
1847
2008
  return {
1848
2009
  "ios": ["datetime.ios.scss"],
1849
- "md": ["datetime.md.scss"],
1850
- "ionic": ["datetime.ionic.scss"]
2010
+ "md": ["datetime.md.scss"]
1851
2011
  };
1852
2012
  }
1853
2013
  static get styleUrls() {
1854
2014
  return {
1855
2015
  "ios": ["datetime.ios.css"],
1856
- "md": ["datetime.md.css"],
1857
- "ionic": ["datetime.ionic.css"]
2016
+ "md": ["datetime.md.css"]
1858
2017
  };
1859
2018
  }
1860
2019
  static get properties() {
@@ -1883,8 +2042,7 @@ export class Datetime {
1883
2042
  "getter": false,
1884
2043
  "setter": false,
1885
2044
  "reflect": false,
1886
- "attribute": "color",
1887
- "defaultValue": "'primary'"
2045
+ "attribute": "color"
1888
2046
  },
1889
2047
  "name": {
1890
2048
  "type": "string",