@ionic/core 8.8.19-dev.11786610762.137bbb21 → 8.8.19-dev.11786735826.1fad7c0a

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 (1240) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/p--m5cCjbK.js +4 -0
  99. package/components/{p-CpHPq11n.js → p-30_sZS2V.js} +1 -1
  100. package/components/p-8FN7p701.js +4 -0
  101. package/components/p-B-FxiyeI.js +4 -0
  102. package/components/p-B4uHHhPK.js +4 -0
  103. package/components/p-BMPN55of.js +4 -0
  104. package/components/p-BMS4t-kJ.js +4 -0
  105. package/components/p-BOvLNVKq.js +4 -0
  106. package/components/p-BSQPZ79H.js +4 -0
  107. package/components/p-BWBigMsI.js +4 -0
  108. package/components/p-BZ4-QTes.js +4 -0
  109. package/components/p-BhamHSw3.js +4 -0
  110. package/components/p-BjluhQMI.js +4 -0
  111. package/components/p-BlsIikdZ.js +4 -0
  112. package/components/p-Blug1Vxu.js +4 -0
  113. package/components/p-BmVRXR1y.js +4 -0
  114. package/components/p-BpG8kBfD.js +4 -0
  115. package/components/p-BqPNzJf6.js +4 -0
  116. package/components/p-C5KYjZWD.js +4 -0
  117. package/components/p-C91npEel.js +4 -0
  118. package/components/p-C9BGR5fy.js +4 -0
  119. package/components/p-CD4fmpem.js +4 -0
  120. package/components/p-CEW4RXZO.js +4 -0
  121. package/components/p-CIGNaXM1.js +4 -0
  122. package/components/p-CKhiNOEg.js +4 -0
  123. package/components/p-CO2zzh3W.js +4 -0
  124. package/components/p-CVb3x_r3.js +4 -0
  125. package/components/p-CWLrHG8Y.js +4 -0
  126. package/components/p-CbhUdtjf.js +4 -0
  127. package/components/p-CejmQs3h.js +4 -0
  128. package/components/p-CfnNZz_d.js +4 -0
  129. package/components/p-CmKf4pgI.js +4 -0
  130. package/components/p-Cs5f-uOS.js +4 -0
  131. package/components/p-D7-vHX0A.js +4 -0
  132. package/components/p-DJztqcrH.js +4 -0
  133. package/components/p-DKrhJJV0.js +4 -0
  134. package/components/p-DRfgH82D.js +4 -0
  135. package/components/p-DSzSbVP2.js +4 -0
  136. package/components/p-DV85C0e0.js +4 -0
  137. package/components/p-DVKS-ovH.js +4 -0
  138. package/components/p-DWCzVL3Y.js +4 -0
  139. package/components/p-Dd8ajo9a.js +4 -0
  140. package/components/p-DdnhY_oj.js +4 -0
  141. package/components/p-DgZOZQjJ.js +4 -0
  142. package/components/p-Dmd2xqCe.js +4 -0
  143. package/components/{p-B2SvA6NE.js → p-DwpKZ6rl.js} +1 -1
  144. package/components/p-G0TxqHfe.js +4 -0
  145. package/components/p-GG5GhznE.js +4 -0
  146. package/components/{p-Ch8jco3x.js → p-J-p0EtHR.js} +1 -1
  147. package/components/p-LXu5-6Ti.js +4 -0
  148. package/components/p-LpMHEu3v.js +4 -0
  149. package/components/p-TXPDHL13.js +4 -0
  150. package/components/p-UQSiXX2Z.js +4 -0
  151. package/components/p-UuPYCOZE.js +4 -0
  152. package/components/p-WeeS7GvC.js +4 -0
  153. package/components/p-ZjP4CjeZ.js +4 -0
  154. package/components/{p-CzlL9T_X.js → p-_0JhwClE.js} +1 -1
  155. package/components/p-_IKFD3ID.js +4 -0
  156. package/components/p-byZM6qHV.js +4 -0
  157. package/components/p-hh7qIC-X.js +4 -0
  158. package/components/p-idq4JFo2.js +4 -0
  159. package/components/p-qT1szVjw.js +4 -0
  160. package/components/{p-BZwQa9ey.js → p-ryyf_ItD.js} +1 -1
  161. package/components/p-wzAhIh03.js +4 -0
  162. package/components/p-ypuYdSDB.js +4 -0
  163. package/components/{p-Dovs7FIs.js → p-yuj4Nkm_.js} +1 -1
  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-qlGmEn5Y.js → animation-C0mOHzej.js} +6 -6
  194. package/dist/cjs/{app-globals-CtK-3pCu.js → app-globals-BREG4twP.js} +1 -1
  195. package/dist/cjs/{button-active-CugpWmFI.js → button-active-BKj1rdFx.js} +3 -3
  196. package/dist/cjs/{capacitor-BixsAzyb.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-COAsdjOc.js → format-pp0Du3K-.js} +40 -30
  201. package/dist/cjs/{framework-delegate-CJT_QJQI.js → framework-delegate-NTLQ5YzV.js} +6 -10
  202. package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-BDUH7687.js} +15 -8
  203. package/dist/cjs/{haptic-BFgF-QCg.js → haptic-Ch-X4gRx.js} +3 -4
  204. package/dist/cjs/hardware-back-button-fqpYh-kd.js +121 -0
  205. package/dist/cjs/{helpers-Fh1iXsX9.js → helpers-CaLhEmTE.js} +6 -73
  206. package/dist/cjs/{index-YYUVCfP-.js → index-B7zJsYWS.js} +3 -3
  207. package/dist/cjs/{index-CNicxECl.js → index-BlshL9ib.js} +8 -9
  208. package/dist/cjs/{index-D94mERjz.js → index-Ck9advCT.js} +5 -5
  209. package/dist/cjs/{index-CM8iGvyx.js → index-D2X6b92x.js} +15 -16
  210. package/dist/cjs/{index-DRFkZu3V.js → index-D48vawBq.js} +2 -2
  211. package/dist/cjs/index-DkNv4J_i.js +10 -0
  212. package/dist/cjs/{index-CAvQ7Tka.js → index-P1nQxrpZ.js} +10 -4
  213. package/dist/cjs/{index-C1knGA9x.js → index-uvry__L4.js} +33 -65
  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-C8NCYfWv.js → input-shims-DvHAFqiP.js} +19 -22
  217. package/dist/cjs/input.utils-BZdMWVrt.js +35 -0
  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 +461 -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 +2770 -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 +351 -311
  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 +570 -500
  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 +507 -429
  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 +303 -309
  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-k6hOWWpn.js +156 -0
  271. package/dist/cjs/ionic.cjs.js +4 -4
  272. package/dist/cjs/{ios.transition-BgDCUY4Y.js → ios.transition-KvuRAe2W.js} +14 -20
  273. package/dist/cjs/{item-multiple-inputs-DKn76MYO.js → item-multiple-inputs-BdYSbfKN.js} +1 -1
  274. package/dist/cjs/{keyboard-nne7rvBK.js → keyboard-Cix5TVkD.js} +4 -5
  275. package/dist/cjs/{keyboard-BbZXOwZg.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-Debf4tYr.js → md.transition-Bjl5Ozph.js} +8 -10
  279. package/dist/cjs/{overlay-control-label-DnRLQR1t.js → overlay-control-label-D2sdL2O8.js} +11 -13
  280. package/dist/cjs/{overlays-DYBUkNQu.js → overlays-IlP4H2Gn.js} +60 -336
  281. package/dist/cjs/{select-option-render-BqJEK1N1.js → select-option-render-pULCGldr.js} +3 -4
  282. package/dist/cjs/slot-mutation-controller-CgTGFqlW.js +397 -0
  283. package/dist/cjs/{status-tap-hwqc0yb_.js → status-tap-BR_ujYHg.js} +3 -4
  284. package/dist/cjs/{swipe-back-DqQx5QCp.js → swipe-back-DzQKEl5g.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 +102 -78
  351. package/dist/collection/components/datetime/datetime.ios.css +148 -304
  352. package/dist/collection/components/datetime/datetime.js +1068 -910
  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 +191 -247
  385. package/dist/collection/components/input/input.js +357 -340
  386. package/dist/collection/components/input/input.md.css +285 -234
  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 +32 -86
  432. package/dist/collection/components/modal/gestures/swipe-to-close.js +15 -3
  433. package/dist/collection/components/modal/modal.ios.css +70 -178
  434. package/dist/collection/components/modal/modal.js +404 -272
  435. package/dist/collection/components/modal/modal.md.css +70 -178
  436. package/dist/collection/components/modal/safe-area-utils.js +6 -7
  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 +206 -351
  511. package/dist/collection/components/select/select.js +431 -444
  512. package/dist/collection/components/select/select.md.css +230 -383
  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 +221 -329
  541. package/dist/collection/components/textarea/textarea.js +302 -334
  542. package/dist/collection/components/textarea/textarea.md.css +231 -358
  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 +1 -1
  567. package/dist/collection/utils/forms/start-container-controller.js +132 -0
  568. package/dist/collection/utils/forms/validity.js +0 -31
  569. package/dist/collection/utils/framework-delegate.js +5 -9
  570. package/dist/collection/utils/gesture/gesture-controller.js +15 -8
  571. package/dist/collection/utils/gesture/index.js +10 -2
  572. package/dist/collection/utils/gesture/listener.js +1 -1
  573. package/dist/collection/utils/hardware-back-button.js +3 -18
  574. package/dist/collection/utils/helpers.js +5 -72
  575. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  576. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  577. package/dist/collection/utils/keyboard/keyboard-controller.js +6 -8
  578. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  579. package/dist/collection/utils/logging/index.js +23 -4
  580. package/dist/collection/utils/media.js +0 -1
  581. package/dist/collection/utils/menu-controller/animations/overlay.js +3 -3
  582. package/dist/collection/utils/menu-controller/animations/push.js +1 -2
  583. package/dist/collection/utils/menu-controller/animations/reveal.js +1 -2
  584. package/dist/collection/utils/menu-controller/index.js +1 -2
  585. package/dist/collection/utils/native/haptic.js +2 -3
  586. package/dist/collection/utils/native/keyboard.js +2 -2
  587. package/dist/collection/utils/native/status-bar.js +1 -1
  588. package/dist/collection/utils/overlay-control-label.js +11 -13
  589. package/dist/collection/utils/overlays.js +45 -312
  590. package/dist/collection/utils/platform.js +4 -5
  591. package/dist/collection/utils/rtl/dir.js +1 -1
  592. package/dist/collection/utils/sanitization/index.js +2 -2
  593. package/dist/collection/utils/select-option-render.js +1 -2
  594. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  595. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
  596. package/dist/collection/utils/test/playwright/drag-element.js +11 -35
  597. package/dist/collection/utils/test/playwright/generator.js +25 -51
  598. package/dist/collection/utils/test/playwright/page/event-spy.js +11 -12
  599. package/dist/collection/utils/test/playwright/page/utils/goto.js +5 -15
  600. package/dist/collection/utils/test/playwright/page/utils/set-content.js +4 -27
  601. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  602. package/dist/collection/utils/test/press-keys.js +10 -17
  603. package/dist/collection/utils/theme.js +7 -26
  604. package/dist/collection/utils/transition/ios.transition.js +9 -14
  605. package/dist/collection/utils/transition/md.transition.js +3 -4
  606. package/dist/docs.json +524 -10028
  607. package/dist/esm/{animation-ChfHU0RG.js → animation-CGFdmGk9.js} +5 -5
  608. package/dist/esm/{app-globals-D1OOQlqq.js → app-globals-CYmMeGdU.js} +1 -1
  609. package/dist/esm/{button-active-CPYK0dNo.js → button-active--80YqSHA.js} +3 -3
  610. package/dist/esm/{capacitor-DG_4yVXz.js → capacitor-CFERIeaU.js} +1 -1
  611. package/dist/esm/{config-BwKpO3Is.js → config-DWCzVL3Y.js} +5 -4
  612. package/dist/esm/{dir-C53feagD.js → dir-B-FxiyeI.js} +1 -1
  613. package/dist/{cjs/focus-visible-BIj-I3-C.js → esm/focus-visible-BmVRXR1y.js} +1 -27
  614. package/dist/esm/{format-2WlZcMvG.js → format-Dcwga61t.js} +41 -31
  615. package/dist/esm/{framework-delegate-DO2QXccA.js → framework-delegate--ajhSeKH.js} +6 -10
  616. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-TXPDHL13.js} +15 -8
  617. package/dist/esm/{haptic-BWlRCqa-.js → haptic-Cq4UAeka.js} +3 -4
  618. package/dist/esm/hardware-back-button-gLJHMX_F.js +115 -0
  619. package/dist/esm/{helpers-DfF5_wJc.js → helpers-DexiPLIC.js} +7 -73
  620. package/dist/esm/{index-BSDDOljg.js → index-8s8kZKJ7.js} +5 -5
  621. package/dist/esm/{index-DNY2GOUg.js → index-BCgUwrV0.js} +3 -4
  622. package/dist/esm/{index-B4Kq2YNk.js → index-BvabGprD.js} +1 -2
  623. package/dist/esm/{index-Mq5pCWmZ.js → index-CKM1DdGm.js} +3 -3
  624. package/dist/esm/{index-C0EQceqV.js → index-ChhhtsGZ.js} +34 -66
  625. package/dist/esm/{index-7eS8XtuU.js → index-CumkqGQF.js} +12 -13
  626. package/dist/esm/{index-CfgBF1SE.js → index-DppOcPFQ.js} +10 -4
  627. package/dist/esm/index-ZjP4CjeZ.js +7 -0
  628. package/dist/esm/{index-taYRjZGp.js → index-_Za5VB9w.js} +2 -2
  629. package/dist/esm/index.js +17 -16
  630. package/dist/esm/{input-shims-tZfqB5a5.js → input-shims-BB0AKb_k.js} +11 -14
  631. package/dist/esm/input.utils-B1ValN_N.js +33 -0
  632. package/dist/esm/ion-accordion_2.entry.js +378 -382
  633. package/dist/esm/ion-action-sheet.entry.js +178 -86
  634. package/dist/esm/ion-alert.entry.js +250 -125
  635. package/dist/esm/ion-app_8.entry.js +460 -607
  636. package/dist/esm/ion-avatar_3.entry.js +19 -125
  637. package/dist/esm/ion-back-button.entry.js +64 -49
  638. package/dist/esm/ion-backdrop.entry.js +23 -22
  639. package/dist/esm/ion-breadcrumb_2.entry.js +211 -169
  640. package/dist/esm/ion-button_2.entry.js +152 -117
  641. package/dist/esm/ion-card_5.entry.js +109 -79
  642. package/dist/esm/ion-checkbox.entry.js +163 -129
  643. package/dist/esm/ion-chip.entry.js +21 -56
  644. package/dist/esm/ion-col_3.entry.js +186 -61
  645. package/dist/esm/ion-datetime-button.entry.js +255 -247
  646. package/dist/esm/ion-datetime.entry.js +2768 -0
  647. package/dist/esm/ion-fab_3.entry.js +154 -112
  648. package/dist/esm/ion-img.entry.js +34 -16
  649. package/dist/esm/ion-infinite-scroll_2.entry.js +108 -156
  650. package/dist/esm/ion-input-otp.entry.js +435 -437
  651. package/dist/esm/ion-input-password-toggle.entry.js +40 -64
  652. package/dist/esm/ion-input.entry.js +349 -309
  653. package/dist/esm/ion-item-option_3.entry.js +136 -511
  654. package/dist/esm/ion-item_8.entry.js +217 -189
  655. package/dist/esm/ion-loading.entry.js +151 -68
  656. package/dist/esm/ion-menu_3.entry.js +181 -137
  657. package/dist/esm/ion-modal.entry.js +528 -458
  658. package/dist/esm/ion-nav_2.entry.js +103 -163
  659. package/dist/esm/ion-picker-column-option.entry.js +39 -39
  660. package/dist/esm/ion-picker-column.entry.js +421 -409
  661. package/dist/esm/ion-picker.entry.js +405 -400
  662. package/dist/esm/ion-popover.entry.js +323 -211
  663. package/dist/esm/ion-progress-bar.entry.js +35 -47
  664. package/dist/esm/ion-radio_2.entry.js +216 -161
  665. package/dist/esm/ion-range.entry.js +307 -249
  666. package/dist/esm/ion-refresher_2.entry.js +174 -121
  667. package/dist/esm/ion-reorder_2.entry.js +59 -53
  668. package/dist/esm/ion-ripple-effect.entry.js +18 -26
  669. package/dist/esm/ion-route_4.entry.js +178 -75
  670. package/dist/esm/ion-searchbar.entry.js +308 -331
  671. package/dist/esm/ion-segment-content.entry.js +2 -2
  672. package/dist/esm/ion-segment-view.entry.js +28 -27
  673. package/dist/esm/ion-segment_2.entry.js +177 -141
  674. package/dist/esm/ion-select-modal.entry.js +49 -69
  675. package/dist/esm/ion-select_3.entry.js +507 -429
  676. package/dist/esm/ion-spinner.entry.js +28 -36
  677. package/dist/esm/ion-split-pane.entry.js +34 -25
  678. package/dist/esm/ion-tab-bar_2.entry.js +115 -178
  679. package/dist/esm/ion-tab_2.entry.js +54 -29
  680. package/dist/esm/ion-text.entry.js +13 -7
  681. package/dist/esm/ion-textarea.entry.js +302 -308
  682. package/dist/esm/ion-toast.entry.js +243 -148
  683. package/dist/esm/ion-toggle.entry.js +184 -187
  684. package/dist/esm/ionic-global-BVB7BrLT.js +151 -0
  685. package/dist/esm/ionic.js +5 -5
  686. package/dist/esm/{ios.transition-C3r-0w96.js → ios.transition-BdhybwLl.js} +14 -20
  687. package/dist/esm/{item-multiple-inputs-C6onMFOo.js → item-multiple-inputs-rU8VaNNg.js} +1 -1
  688. package/dist/esm/{keyboard-BzbtCDwZ.js → keyboard-Cj8mLJeq.js} +4 -5
  689. package/dist/esm/{keyboard-DYGmALa7.js → keyboard-DAF8GNJ9.js} +3 -3
  690. package/dist/esm/keyboard-controller-DEwoa1ev.js +165 -0
  691. package/dist/esm/loader.js +5 -5
  692. package/dist/esm/{md.transition-CPHOF5T9.js → md.transition-B5lqKGCs.js} +8 -10
  693. package/dist/esm/{overlay-control-label-CODBQrPj.js → overlay-control-label-BSQPZ79H.js} +11 -13
  694. package/dist/esm/{overlays-C1NQMs9y.js → overlays-CjWwtvf1.js} +57 -333
  695. package/dist/esm/{select-option-render-BlKZ2H83.js → select-option-render-C4m76VGH.js} +3 -4
  696. package/dist/esm/slot-mutation-controller-u741eD3Z.js +393 -0
  697. package/dist/esm/{status-tap-BueE8Coq.js → status-tap-DpLhkDWs.js} +3 -4
  698. package/dist/esm/{swipe-back-qmvTRnSq.js → swipe-back-cz4-lyG3.js} +5 -6
  699. package/dist/esm/theme-byZM6qHV.js +48 -0
  700. package/dist/esm/validity-DJztqcrH.js +17 -0
  701. package/dist/html.html-data.json +146 -2713
  702. package/dist/ionic/index.esm.js +1 -1
  703. package/dist/ionic/ionic.esm.js +1 -1
  704. package/dist/ionic/p-06533d51.entry.js +4 -0
  705. package/dist/ionic/p-08443c08.entry.js +4 -0
  706. package/dist/ionic/p-0FNc80PN.js +4 -0
  707. package/dist/ionic/p-141f5b47.entry.js +4 -0
  708. package/dist/ionic/p-14a5e8f5.entry.js +4 -0
  709. package/dist/ionic/p-19269e04.entry.js +4 -0
  710. package/dist/ionic/p-19abbc33.entry.js +4 -0
  711. package/dist/ionic/p-1edf0573.entry.js +4 -0
  712. package/dist/ionic/p-40424a88.entry.js +4 -0
  713. package/dist/ionic/p-4204184c.entry.js +4 -0
  714. package/dist/ionic/p-4bc3ecdb.entry.js +4 -0
  715. package/dist/ionic/p-4eOQC00Z.js +4 -0
  716. package/dist/ionic/p-4eed9ca1.entry.js +4 -0
  717. package/dist/ionic/p-53bac1c9.entry.js +4 -0
  718. package/dist/ionic/p-5506caeb.entry.js +4 -0
  719. package/dist/ionic/p-5521dc1f.entry.js +4 -0
  720. package/dist/ionic/p-5993a77f.entry.js +4 -0
  721. package/dist/ionic/p-5c3626de.entry.js +4 -0
  722. package/dist/ionic/p-5d3b411c.entry.js +4 -0
  723. package/dist/ionic/p-60576951.entry.js +4 -0
  724. package/dist/ionic/p-7116e558.entry.js +4 -0
  725. package/dist/ionic/p-711a8319.entry.js +4 -0
  726. package/dist/ionic/p-71419a55.entry.js +4 -0
  727. package/dist/ionic/p-79325ffe.entry.js +4 -0
  728. package/dist/ionic/p-7bb3e957.entry.js +4 -0
  729. package/dist/ionic/p-82525fb0.entry.js +4 -0
  730. package/dist/ionic/p-84a38904.entry.js +4 -0
  731. package/dist/ionic/p-865fa114.entry.js +4 -0
  732. package/dist/ionic/p-8e1d9e3a.entry.js +4 -0
  733. package/dist/ionic/p-8f204f1e.entry.js +4 -0
  734. package/dist/ionic/p-9055e897.entry.js +4 -0
  735. package/dist/ionic/p-9658e083.entry.js +4 -0
  736. package/dist/ionic/p-988baee1.entry.js +4 -0
  737. package/dist/ionic/p-9nmHvEvw.js +4 -0
  738. package/dist/ionic/p-B-FxiyeI.js +4 -0
  739. package/dist/ionic/p-BB0LlG4y.js +4 -0
  740. package/dist/ionic/p-BMPN55of.js +4 -0
  741. package/dist/ionic/p-BQ8oNV0v.js +4 -0
  742. package/dist/ionic/p-BSQPZ79H.js +4 -0
  743. package/dist/ionic/p-BhamHSw3.js +4 -0
  744. package/dist/ionic/p-BjvtSsVI.js +4 -0
  745. package/dist/ionic/p-BkfAWuv6.js +4 -0
  746. package/dist/ionic/p-BmVRXR1y.js +4 -0
  747. package/dist/ionic/p-BvabGprD.js +4 -0
  748. package/{components/p-Va26YR7l.js → dist/ionic/p-BwIp10KV.js} +1 -1
  749. package/dist/ionic/p-C-94tAim.js +4 -0
  750. package/dist/ionic/p-C6eME8Ey.js +4 -0
  751. package/dist/ionic/p-CIGNaXM1.js +4 -0
  752. package/dist/ionic/p-CKUuSnDR.js +4 -0
  753. package/dist/ionic/p-CMRtMbJc.js +4 -0
  754. package/dist/ionic/p-CPcPmkGv.js +4 -0
  755. package/dist/ionic/p-CQ_4TirR.js +4 -0
  756. package/dist/ionic/p-CaRuIadB.js +4 -0
  757. package/dist/ionic/p-Cdjxf_yg.js +4 -0
  758. package/dist/ionic/p-ChhhtsGZ.js +5 -0
  759. package/dist/ionic/p-CmKf4pgI.js +4 -0
  760. package/dist/ionic/p-D5t_-oMk.js +4 -0
  761. package/dist/ionic/p-D94b61er.js +4 -0
  762. package/dist/ionic/p-DAztxQR0.js +4 -0
  763. package/dist/ionic/p-DCI3rXQo.js +4 -0
  764. package/dist/ionic/p-DDhtUaaA.js +4 -0
  765. package/dist/ionic/p-DJztqcrH.js +4 -0
  766. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  767. package/dist/ionic/p-DkUB-ROc.js +4 -0
  768. package/dist/ionic/p-Dn0mqQ_R.js +4 -0
  769. package/dist/ionic/p-I3In7hMC.js +4 -0
  770. package/dist/ionic/p-T71k3C35.js +4 -0
  771. package/dist/ionic/p-TXPDHL13.js +4 -0
  772. package/dist/ionic/p-ZjP4CjeZ.js +4 -0
  773. package/dist/ionic/p-a71232d6.entry.js +4 -0
  774. package/dist/ionic/p-a73d8742.entry.js +4 -0
  775. package/dist/ionic/p-a8421d18.entry.js +4 -0
  776. package/dist/ionic/p-a8c2c343.entry.js +4 -0
  777. package/dist/ionic/p-acf0a6af.entry.js +4 -0
  778. package/dist/ionic/p-ad98e3ff.entry.js +4 -0
  779. package/dist/ionic/p-af5166f5.entry.js +4 -0
  780. package/dist/ionic/p-bc2bad5f.entry.js +4 -0
  781. package/dist/ionic/p-be08d500.entry.js +4 -0
  782. package/dist/ionic/p-be9a4f51.entry.js +4 -0
  783. package/dist/ionic/p-byZM6qHV.js +4 -0
  784. package/dist/ionic/p-ccc5044d.entry.js +4 -0
  785. package/dist/ionic/p-ce32912b.entry.js +4 -0
  786. package/dist/ionic/p-ded69ceb.entry.js +4 -0
  787. package/dist/ionic/p-e0c6e31e.entry.js +4 -0
  788. package/dist/ionic/p-e1e5b507.entry.js +4 -0
  789. package/dist/ionic/p-e8c3e08a.entry.js +4 -0
  790. package/dist/ionic/p-ed5d540d.entry.js +4 -0
  791. package/dist/ionic/p-f046aa37.entry.js +4 -0
  792. package/dist/ionic/p-f2802440.entry.js +4 -0
  793. package/dist/ionic/p-f402f5a4.entry.js +4 -0
  794. package/dist/ionic/p-fe1bfbcf.entry.js +4 -0
  795. package/dist/types/components/accordion/accordion.d.ts +3 -6
  796. package/dist/types/components/accordion-group/accordion-group.d.ts +1 -12
  797. package/dist/types/components/action-sheet/action-sheet-interface.d.ts +7 -3
  798. package/dist/types/components/action-sheet/action-sheet.d.ts +2 -3
  799. package/dist/types/components/alert/alert-interface.d.ts +7 -3
  800. package/dist/types/components/alert/alert.d.ts +2 -3
  801. package/dist/types/components/app/app.d.ts +5 -4
  802. package/dist/types/components/avatar/avatar.d.ts +0 -32
  803. package/dist/types/components/back-button/back-button.d.ts +1 -2
  804. package/dist/types/components/backdrop/backdrop.d.ts +0 -4
  805. package/dist/types/components/badge/badge.d.ts +1 -34
  806. package/dist/types/components/breadcrumb/breadcrumb.d.ts +1 -4
  807. package/dist/types/components/breadcrumbs/breadcrumbs.d.ts +2 -2
  808. package/dist/types/components/button/button.d.ts +8 -23
  809. package/dist/types/components/buttons/buttons.d.ts +1 -5
  810. package/dist/types/components/card/card.d.ts +1 -8
  811. package/dist/types/components/card-content/card-content.d.ts +1 -2
  812. package/dist/types/components/card-header/card-header.d.ts +2 -3
  813. package/dist/types/components/card-subtitle/card-subtitle.d.ts +1 -2
  814. package/dist/types/components/card-title/card-title.d.ts +1 -2
  815. package/dist/types/components/checkbox/checkbox.d.ts +4 -14
  816. package/dist/types/components/chip/chip.d.ts +1 -26
  817. package/dist/types/components/col/col.d.ts +5 -52
  818. package/dist/types/components/content/content.d.ts +0 -3
  819. package/dist/types/components/datetime/datetime.d.ts +1 -26
  820. package/dist/types/components/datetime/utils/data.d.ts +5 -5
  821. package/dist/types/components/datetime-button/datetime-button.d.ts +1 -2
  822. package/dist/types/components/fab/fab.d.ts +0 -4
  823. package/dist/types/components/fab-button/fab-button.d.ts +3 -5
  824. package/dist/types/components/fab-list/fab-list.d.ts +0 -4
  825. package/dist/types/components/footer/footer.d.ts +3 -20
  826. package/dist/types/components/grid/grid.d.ts +0 -4
  827. package/dist/types/components/header/header.d.ts +3 -26
  828. package/dist/types/components/header/header.utils.d.ts +5 -4
  829. package/dist/types/components/img/img.d.ts +1 -2
  830. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +0 -21
  831. package/dist/types/components/infinite-scroll-content/infinite-scroll-content.d.ts +0 -4
  832. package/dist/types/components/input/input.d.ts +17 -40
  833. package/dist/types/components/input-otp/input-otp.d.ts +0 -37
  834. package/dist/types/components/input-password-toggle/input-password-toggle.d.ts +0 -2
  835. package/dist/types/components/item/item.d.ts +4 -11
  836. package/dist/types/components/item-divider/item-divider.d.ts +1 -2
  837. package/dist/types/components/item-group/item-group.d.ts +0 -4
  838. package/dist/types/components/item-option/item-option.d.ts +1 -18
  839. package/dist/types/components/item-options/item-options.d.ts +0 -4
  840. package/dist/types/components/item-sliding/item-sliding.d.ts +1 -47
  841. package/dist/types/components/item-sliding/test/test.utils.d.ts +0 -13
  842. package/dist/types/components/label/label.d.ts +1 -2
  843. package/dist/types/components/list/list.d.ts +1 -15
  844. package/dist/types/components/list-header/list-header.d.ts +1 -2
  845. package/dist/types/components/loading/loading-interface.d.ts +7 -2
  846. package/dist/types/components/loading/loading.d.ts +2 -3
  847. package/dist/types/components/menu/menu.d.ts +0 -3
  848. package/dist/types/components/menu-button/menu-button.d.ts +1 -3
  849. package/dist/types/components/menu-toggle/menu-toggle.d.ts +0 -3
  850. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  851. package/dist/types/components/modal/modal-interface.d.ts +16 -4
  852. package/dist/types/components/modal/modal.d.ts +12 -15
  853. package/dist/types/components/nav/nav-interface.d.ts +1 -10
  854. package/dist/types/components/nav/nav.d.ts +3 -27
  855. package/dist/types/components/nav-link/nav-link.d.ts +0 -4
  856. package/dist/types/components/note/note.d.ts +1 -2
  857. package/dist/types/components/picker/picker.d.ts +1 -2
  858. package/dist/types/components/picker-column/picker-column.d.ts +1 -2
  859. package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -4
  860. package/dist/types/components/popover/popover-interface.d.ts +6 -3
  861. package/dist/types/components/popover/popover.d.ts +5 -6
  862. package/dist/types/components/progress-bar/progress-bar.d.ts +1 -10
  863. package/dist/types/components/radio/radio.d.ts +1 -2
  864. package/dist/types/components/radio-group/radio-group.d.ts +0 -12
  865. package/dist/types/components/range/range.d.ts +1 -2
  866. package/dist/types/components/refresher/refresher.d.ts +1 -2
  867. package/dist/types/components/refresher-content/refresher-content.d.ts +0 -4
  868. package/dist/types/components/reorder/reorder.d.ts +0 -9
  869. package/dist/types/components/reorder-group/reorder-group.d.ts +0 -4
  870. package/dist/types/components/ripple-effect/ripple-effect.d.ts +0 -4
  871. package/dist/types/components/route/route.d.ts +1 -5
  872. package/dist/types/components/router/router.d.ts +0 -4
  873. package/dist/types/components/router-link/router-link.d.ts +0 -4
  874. package/dist/types/components/router-outlet/router-outlet.d.ts +8 -4
  875. package/dist/types/components/row/row.d.ts +0 -4
  876. package/dist/types/components/searchbar/searchbar.d.ts +11 -57
  877. package/dist/types/components/segment/segment.d.ts +1 -2
  878. package/dist/types/components/segment-button/segment-button.d.ts +1 -2
  879. package/dist/types/components/select/select.d.ts +26 -55
  880. package/dist/types/components/select-modal/select-modal.d.ts +0 -8
  881. package/dist/types/components/select-option/select-option.d.ts +4 -7
  882. package/dist/types/components/select-popover/select-popover.d.ts +0 -3
  883. package/dist/types/components/skeleton-text/skeleton-text.d.ts +0 -4
  884. package/dist/types/components/spinner/spinner.d.ts +0 -15
  885. package/dist/types/components/split-pane/split-pane.d.ts +0 -4
  886. package/dist/types/components/tab/tab.d.ts +0 -4
  887. package/dist/types/components/tab-bar/tab-bar-interface.d.ts +0 -1
  888. package/dist/types/components/tab-bar/tab-bar.d.ts +3 -41
  889. package/dist/types/components/tab-button/tab-button.d.ts +1 -12
  890. package/dist/types/components/tabs/tabs.d.ts +0 -3
  891. package/dist/types/components/text/text.d.ts +1 -2
  892. package/dist/types/components/textarea/textarea.d.ts +16 -58
  893. package/dist/types/components/thumbnail/thumbnail.d.ts +0 -4
  894. package/dist/types/components/title/title.d.ts +0 -4
  895. package/dist/types/components/toast/animations/utils.d.ts +2 -2
  896. package/dist/types/components/toast/toast-interface.d.ts +7 -3
  897. package/dist/types/components/toast/toast.d.ts +2 -19
  898. package/dist/types/components/toggle/toggle.d.ts +1 -15
  899. package/dist/types/components/toolbar/toolbar.d.ts +3 -43
  900. package/dist/types/components.d.ts +263 -2171
  901. package/dist/types/global/ionic-global.d.ts +2 -28
  902. package/dist/types/index.d.ts +1 -1
  903. package/dist/types/interface.d.ts +0 -4
  904. package/dist/types/utils/config.d.ts +3 -114
  905. package/dist/types/utils/focus-trap.d.ts +1 -1
  906. package/dist/types/utils/focus-visible.d.ts +0 -13
  907. package/dist/types/utils/forms/index.d.ts +1 -1
  908. package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
  909. package/dist/types/utils/forms/validity.d.ts +0 -7
  910. package/dist/types/utils/helpers.d.ts +0 -22
  911. package/dist/types/utils/logging/index.d.ts +2 -1
  912. package/dist/types/utils/overlay-control-label.d.ts +9 -11
  913. package/dist/types/utils/overlays-interface.d.ts +1 -31
  914. package/dist/types/utils/overlays.d.ts +12 -10
  915. package/dist/types/utils/test/playwright/drag-element.d.ts +3 -16
  916. package/dist/types/utils/test/playwright/generator.d.ts +2 -31
  917. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  918. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  919. package/dist/types/utils/theme.d.ts +0 -9
  920. package/hydrate/index.js +10577 -12217
  921. package/hydrate/index.mjs +10577 -12217
  922. package/package.json +56 -17
  923. package/components/ion-divider.d.ts +0 -11
  924. package/components/ion-divider.js +0 -4
  925. package/components/ion-gallery-item.d.ts +0 -11
  926. package/components/ion-gallery-item.js +0 -4
  927. package/components/ion-gallery.d.ts +0 -11
  928. package/components/ion-gallery.js +0 -4
  929. package/components/ion-picker-legacy-column.d.ts +0 -11
  930. package/components/ion-picker-legacy-column.js +0 -4
  931. package/components/ion-picker-legacy.d.ts +0 -11
  932. package/components/ion-picker-legacy.js +0 -4
  933. package/components/p-6hUZIMBp.js +0 -4
  934. package/components/p-9mfpAwJh.js +0 -4
  935. package/components/p-B2aAAEfp.js +0 -4
  936. package/components/p-B2lpqDWK.js +0 -4
  937. package/components/p-BDoEcs72.js +0 -4
  938. package/components/p-BDqjX7Z_.js +0 -4
  939. package/components/p-BE21dB_a.js +0 -4
  940. package/components/p-BFpXpzD-.js +0 -4
  941. package/components/p-BTEOs1at.js +0 -4
  942. package/components/p-BUNIyvqe.js +0 -4
  943. package/components/p-BYSs-jZz.js +0 -4
  944. package/components/p-BYoGvMgh.js +0 -4
  945. package/components/p-BYrCPOBM.js +0 -4
  946. package/components/p-BbVhJs-a.js +0 -4
  947. package/components/p-BhRXIcSN.js +0 -4
  948. package/components/p-BjW8SOqw.js +0 -4
  949. package/components/p-BsiHrVPa.js +0 -4
  950. package/components/p-BwKpO3Is.js +0 -4
  951. package/components/p-Bz8jnuiy.js +0 -4
  952. package/components/p-C-Ea1l5K.js +0 -4
  953. package/components/p-C3X10Pc6.js +0 -4
  954. package/components/p-C53feagD.js +0 -4
  955. package/components/p-CA4M5WkT.js +0 -4
  956. package/components/p-CH6jbAEI.js +0 -4
  957. package/components/p-CJE5t2qs.js +0 -4
  958. package/components/p-CODBQrPj.js +0 -4
  959. package/components/p-CUbb1HkU.js +0 -4
  960. package/components/p-CVYFPBs-.js +0 -4
  961. package/components/p-CVoLDZ7z.js +0 -4
  962. package/components/p-CZrORZXS.js +0 -4
  963. package/components/p-Cc3oC60a.js +0 -4
  964. package/components/p-Cl0B-RWe.js +0 -4
  965. package/components/p-CmoUesXp.js +0 -4
  966. package/components/p-CyNW8ypn.js +0 -4
  967. package/components/p-CzxyxYID.js +0 -4
  968. package/components/p-D0Iqw6OZ.js +0 -4
  969. package/components/p-D0LT3Z3i.js +0 -4
  970. package/components/p-D1t981Ih.js +0 -4
  971. package/components/p-D6tqrIYY.js +0 -4
  972. package/components/p-D9C5yWpF.js +0 -4
  973. package/components/p-DCRXgAoM.js +0 -4
  974. package/components/p-DL5wyRub.js +0 -4
  975. package/components/p-DQlXUUDh.js +0 -4
  976. package/components/p-DRWN7QM2.js +0 -4
  977. package/components/p-DaJxRxSQ.js +0 -4
  978. package/components/p-DbmfFkd1.js +0 -4
  979. package/components/p-Dhi5xtNS.js +0 -4
  980. package/components/p-DnwLgh9U.js +0 -4
  981. package/components/p-DoZB3DcY.js +0 -4
  982. package/components/p-DrrpZB81.js +0 -4
  983. package/components/p-DrzWRqnG.js +0 -4
  984. package/components/p-DylrHLJF.js +0 -4
  985. package/components/p-Dypq4kXE.js +0 -4
  986. package/components/p-DzeMJvWL.js +0 -4
  987. package/components/p-Dzk4Tr0X.js +0 -4
  988. package/components/p-Rkm2AOZ2.js +0 -4
  989. package/components/p-UYngqo1f.js +0 -4
  990. package/components/p-asUhrzOB.js +0 -4
  991. package/components/p-fIOYmaqA.js +0 -4
  992. package/components/p-jlwpz7Ms.js +0 -4
  993. package/components/p-kInyVu79.js +0 -4
  994. package/components/p-miSYSxcc.js +0 -4
  995. package/components/p-paDbTUL9.js +0 -4
  996. package/components/p-vXpMhGrs.js +0 -4
  997. package/components/p-znZTPd7u.js +0 -4
  998. package/css/ionic/bundle.ionic.css +0 -1
  999. package/css/ionic/bundle.ionic.css.map +0 -1
  1000. package/css/ionic/core.ionic.css +0 -1
  1001. package/css/ionic/core.ionic.css.map +0 -1
  1002. package/css/ionic/global.bundle.ionic.css +0 -1
  1003. package/css/ionic/global.bundle.ionic.css.map +0 -1
  1004. package/css/ionic/ionic-swiper.ionic.css +0 -1
  1005. package/css/ionic/ionic-swiper.ionic.css.map +0 -1
  1006. package/css/ionic/link.ionic.css +0 -1
  1007. package/css/ionic/link.ionic.css.map +0 -1
  1008. package/css/ionic/structure.ionic.css +0 -1
  1009. package/css/ionic/structure.ionic.css.map +0 -1
  1010. package/css/ionic/typography.ionic.css +0 -1
  1011. package/css/ionic/typography.ionic.css.map +0 -1
  1012. package/css/ionic/utils.bundle.ionic.css +0 -1
  1013. package/css/ionic/utils.bundle.ionic.css.map +0 -1
  1014. package/dist/cjs/caret-down-vtVgfXIs.js +0 -8
  1015. package/dist/cjs/caret-left-CxZXLRv5.js +0 -8
  1016. package/dist/cjs/caret-right-CRCgv98E.js +0 -8
  1017. package/dist/cjs/clear-button-press-controller-2hAy_qdm.js +0 -45
  1018. package/dist/cjs/input.utils-CYZZsbdf.js +0 -150
  1019. package/dist/cjs/ion-datetime_3.cjs.entry.js +0 -3242
  1020. package/dist/cjs/ion-divider.cjs.entry.js +0 -51
  1021. package/dist/cjs/ion-gallery-item.cjs.entry.js +0 -59
  1022. package/dist/cjs/ion-gallery.cjs.entry.js +0 -607
  1023. package/dist/cjs/ionic-global-DvEcO0tQ.js +0 -519
  1024. package/dist/cjs/list-a-7GSA6K.js +0 -8
  1025. package/dist/cjs/notch-controller-CFlPw7ER.js +0 -155
  1026. package/dist/cjs/scroll-hide-controller-DAf_DwKc.js +0 -345
  1027. package/dist/cjs/validity-QmuwEptc.js +0 -51
  1028. package/dist/cjs/x-BTF99yFH.js +0 -8
  1029. package/dist/collection/components/accordion/accordion.ionic.css +0 -201
  1030. package/dist/collection/components/accordion-group/accordion-group.ionic.css +0 -93
  1031. package/dist/collection/components/action-sheet/action-sheet.ionic.css +0 -494
  1032. package/dist/collection/components/alert/alert.ionic.css +0 -787
  1033. package/dist/collection/components/avatar/avatar.ionic.css +0 -385
  1034. package/dist/collection/components/backdrop/backdrop.ionic.css +0 -109
  1035. package/dist/collection/components/badge/badge.ionic.css +0 -272
  1036. package/dist/collection/components/button/button.ionic.css +0 -644
  1037. package/dist/collection/components/buttons/buttons.ionic.css +0 -97
  1038. package/dist/collection/components/card/card.ionic.css +0 -144
  1039. package/dist/collection/components/card-content/card-content.ionic.css +0 -89
  1040. package/dist/collection/components/card-header/card-header.ionic.css +0 -85
  1041. package/dist/collection/components/card-subtitle/card-subtitle.ionic.css +0 -144
  1042. package/dist/collection/components/checkbox/checkbox.ionic.css +0 -543
  1043. package/dist/collection/components/chip/chip.ionic.css +0 -217
  1044. package/dist/collection/components/datetime/datetime.ionic.css +0 -703
  1045. package/dist/collection/components/divider/divider.ionic.css +0 -148
  1046. package/dist/collection/components/divider/divider.ios.css +0 -87
  1047. package/dist/collection/components/divider/divider.js +0 -94
  1048. package/dist/collection/components/divider/divider.md.css +0 -87
  1049. package/dist/collection/components/footer/footer-interface.js +0 -1
  1050. package/dist/collection/components/gallery/gallery-constants.js +0 -12
  1051. package/dist/collection/components/gallery/gallery-interface.js +0 -1
  1052. package/dist/collection/components/gallery/gallery.css +0 -15
  1053. package/dist/collection/components/gallery/gallery.js +0 -679
  1054. package/dist/collection/components/gallery/test/utils.js +0 -100
  1055. package/dist/collection/components/gallery-item/gallery-item.css +0 -49
  1056. package/dist/collection/components/gallery-item/gallery-item.js +0 -99
  1057. package/dist/collection/components/header/header-interface.js +0 -1
  1058. package/dist/collection/components/header/header.ionic.css +0 -250
  1059. package/dist/collection/components/input/input.ionic.css +0 -891
  1060. package/dist/collection/components/input-otp/input-otp.ionic.css +0 -371
  1061. package/dist/collection/components/input-password-toggle/input-password-toggle.ionic.css +0 -78
  1062. package/dist/collection/components/input-password-toggle/input-password-toggle.native.css +0 -61
  1063. package/dist/collection/components/item/item.ionic.css +0 -496
  1064. package/dist/collection/components/item-option/item-option.ionic.css +0 -277
  1065. package/dist/collection/components/item-options/item-options.ionic.css +0 -221
  1066. package/dist/collection/components/item-sliding/item-sliding.ionic.css +0 -211
  1067. package/dist/collection/components/list/list.ionic.css +0 -212
  1068. package/dist/collection/components/list-header/list-header.ionic.css +0 -190
  1069. package/dist/collection/components/menu-button/menu-button.ionic.css +0 -236
  1070. package/dist/collection/components/modal/animations/ionic.enter.js +0 -40
  1071. package/dist/collection/components/modal/animations/ionic.leave.js +0 -28
  1072. package/dist/collection/components/modal/modal.ionic.css +0 -255
  1073. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  1074. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  1075. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  1076. package/dist/collection/components/picker-legacy/picker.ios.css +0 -312
  1077. package/dist/collection/components/picker-legacy/picker.js +0 -891
  1078. package/dist/collection/components/picker-legacy/picker.md.css +0 -299
  1079. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -243
  1080. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  1081. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -234
  1082. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  1083. package/dist/collection/components/popover/popover.ionic.css +0 -290
  1084. package/dist/collection/components/progress-bar/progress-bar.ionic.css +0 -287
  1085. package/dist/collection/components/radio/radio.ionic.css +0 -422
  1086. package/dist/collection/components/radio-group/radio-group.ionic.css +0 -119
  1087. package/dist/collection/components/range/range.ionic.css +0 -567
  1088. package/dist/collection/components/ripple-effect/ripple-effect.ionic.css +0 -215
  1089. package/dist/collection/components/searchbar/searchbar.ionic.css +0 -622
  1090. package/dist/collection/components/segment/segment.ionic.css +0 -115
  1091. package/dist/collection/components/segment-button/segment-button.ionic.css +0 -352
  1092. package/dist/collection/components/select/select.ionic.css +0 -809
  1093. package/dist/collection/components/select-modal/select-modal.ionic.css +0 -257
  1094. package/dist/collection/components/select-popover/select-popover.ionic.css +0 -255
  1095. package/dist/collection/components/spinner/spinner.native.css +0 -199
  1096. package/dist/collection/components/tab-bar/tab-bar.ionic.css +0 -249
  1097. package/dist/collection/components/tab-button/tab-button.ionic.css +0 -373
  1098. package/dist/collection/components/textarea/textarea.ionic.css +0 -898
  1099. package/dist/collection/components/title/title.ionic.css +0 -127
  1100. package/dist/collection/components/toast/toast.ionic.css +0 -394
  1101. package/dist/collection/components/toggle/toggle.ionic.css +0 -512
  1102. package/dist/collection/components/toolbar/test/image.svg +0 -1
  1103. package/dist/collection/components/toolbar/toolbar.ionic.css +0 -249
  1104. package/dist/collection/utils/css-value-validation.js +0 -39
  1105. package/dist/collection/utils/forms/clear-button-press-controller.js +0 -40
  1106. package/dist/collection/utils/scroll-hide-controller.js +0 -178
  1107. package/dist/esm/caret-down-D1t981Ih.js +0 -6
  1108. package/dist/esm/caret-left-fIOYmaqA.js +0 -6
  1109. package/dist/esm/caret-right-BYSs-jZz.js +0 -6
  1110. package/dist/esm/clear-button-press-controller-C79TPm5p.js +0 -43
  1111. package/dist/esm/input.utils-fs4B7WL5.js +0 -147
  1112. package/dist/esm/ion-datetime_3.entry.js +0 -3238
  1113. package/dist/esm/ion-divider.entry.js +0 -49
  1114. package/dist/esm/ion-gallery-item.entry.js +0 -57
  1115. package/dist/esm/ion-gallery.entry.js +0 -605
  1116. package/dist/esm/ionic-global-CEwbmRLz.js +0 -508
  1117. package/dist/esm/list-Dhi5xtNS.js +0 -6
  1118. package/dist/esm/notch-controller-CsbpmbOz.js +0 -153
  1119. package/dist/esm/scroll-hide-controller-CfbtPBWv.js +0 -342
  1120. package/dist/esm/theme-DaJxRxSQ.js +0 -67
  1121. package/dist/esm/validity-BjW8SOqw.js +0 -48
  1122. package/dist/esm/x-BDqjX7Z_.js +0 -6
  1123. package/dist/ionic/p--sroV-k-.js +0 -4
  1124. package/dist/ionic/p-00731d20.entry.js +0 -4
  1125. package/dist/ionic/p-03c20a50.entry.js +0 -4
  1126. package/dist/ionic/p-03ec6673.entry.js +0 -4
  1127. package/dist/ionic/p-0405ec57.entry.js +0 -4
  1128. package/dist/ionic/p-04f16322.entry.js +0 -4
  1129. package/dist/ionic/p-09123f89.entry.js +0 -4
  1130. package/dist/ionic/p-15028853.entry.js +0 -4
  1131. package/dist/ionic/p-16c5db90.entry.js +0 -4
  1132. package/dist/ionic/p-1d1dfb68.entry.js +0 -4
  1133. package/dist/ionic/p-231572a0.entry.js +0 -4
  1134. package/dist/ionic/p-2740db6e.entry.js +0 -4
  1135. package/dist/ionic/p-2a6d4601.entry.js +0 -4
  1136. package/dist/ionic/p-2d8fe33c.entry.js +0 -4
  1137. package/dist/ionic/p-2dbc50d9.entry.js +0 -4
  1138. package/dist/ionic/p-32d3095c.entry.js +0 -4
  1139. package/dist/ionic/p-356cd619.entry.js +0 -4
  1140. package/dist/ionic/p-391bdb60.entry.js +0 -4
  1141. package/dist/ionic/p-3b2ab5b4.entry.js +0 -4
  1142. package/dist/ionic/p-4e3e750a.entry.js +0 -4
  1143. package/dist/ionic/p-4fee0df6.entry.js +0 -4
  1144. package/dist/ionic/p-547d010c.entry.js +0 -4
  1145. package/dist/ionic/p-54895118.entry.js +0 -4
  1146. package/dist/ionic/p-6163d04d.entry.js +0 -4
  1147. package/dist/ionic/p-679c1448.entry.js +0 -4
  1148. package/dist/ionic/p-6de524e5.entry.js +0 -4
  1149. package/dist/ionic/p-764d7ea2.entry.js +0 -4
  1150. package/dist/ionic/p-7k7Q1A38.js +0 -4
  1151. package/dist/ionic/p-81BMEE8Q.js +0 -4
  1152. package/dist/ionic/p-8d6d7acb.entry.js +0 -4
  1153. package/dist/ionic/p-96732fe2.entry.js +0 -4
  1154. package/dist/ionic/p-96c4c1b9.entry.js +0 -4
  1155. package/dist/ionic/p-9745f518.entry.js +0 -4
  1156. package/dist/ionic/p-9a40af3c.entry.js +0 -4
  1157. package/dist/ionic/p-9e725104.entry.js +0 -4
  1158. package/dist/ionic/p-B4Kq2YNk.js +0 -4
  1159. package/dist/ionic/p-BDqjX7Z_.js +0 -4
  1160. package/dist/ionic/p-BTEOs1at.js +0 -4
  1161. package/dist/ionic/p-BYSs-jZz.js +0 -4
  1162. package/dist/ionic/p-BbWo-T8F.js +0 -4
  1163. package/dist/ionic/p-BjW8SOqw.js +0 -4
  1164. package/dist/ionic/p-Bvz8PHo5.js +0 -4
  1165. package/dist/ionic/p-BwKpO3Is.js +0 -4
  1166. package/dist/ionic/p-C0EQceqV.js +0 -5
  1167. package/dist/ionic/p-C1_a9uRb.js +0 -4
  1168. package/dist/ionic/p-C53feagD.js +0 -4
  1169. package/dist/ionic/p-C6WD6qSF.js +0 -4
  1170. package/dist/ionic/p-C7urd_wE.js +0 -4
  1171. package/dist/ionic/p-CCgRIJJv.js +0 -4
  1172. package/dist/ionic/p-CEkwLb3L.js +0 -4
  1173. package/dist/ionic/p-CGFf6My7.js +0 -4
  1174. package/dist/ionic/p-CLUwRxij.js +0 -4
  1175. package/dist/ionic/p-CODBQrPj.js +0 -4
  1176. package/dist/ionic/p-CP_sVwEm.js +0 -4
  1177. package/dist/ionic/p-CSMWpRc0.js +0 -4
  1178. package/dist/ionic/p-CYYo93al.js +0 -4
  1179. package/dist/ionic/p-Cipl19Qe.js +0 -4
  1180. package/dist/ionic/p-Cl0B-RWe.js +0 -4
  1181. package/dist/ionic/p-CnIzWLAn.js +0 -4
  1182. package/dist/ionic/p-Cvvva6Z7.js +0 -4
  1183. package/dist/ionic/p-D1t981Ih.js +0 -4
  1184. package/dist/ionic/p-DINFwXlp.js +0 -4
  1185. package/dist/ionic/p-DIvCXVmD.js +0 -4
  1186. package/dist/ionic/p-DTsDGZPd.js +0 -4
  1187. package/dist/ionic/p-DaJxRxSQ.js +0 -4
  1188. package/dist/ionic/p-Dhi5xtNS.js +0 -4
  1189. package/dist/ionic/p-DtQgCTtW.js +0 -4
  1190. package/dist/ionic/p-DuRx6DeQ.js +0 -4
  1191. package/dist/ionic/p-YGLqXqFd.js +0 -4
  1192. package/dist/ionic/p-YIsE5bNG.js +0 -4
  1193. package/dist/ionic/p-a61c2ace.entry.js +0 -4
  1194. package/dist/ionic/p-abb516e3.entry.js +0 -4
  1195. package/dist/ionic/p-b54edee6.entry.js +0 -4
  1196. package/dist/ionic/p-c076ac5c.entry.js +0 -4
  1197. package/dist/ionic/p-c4ff25cb.entry.js +0 -4
  1198. package/dist/ionic/p-c7279756.entry.js +0 -4
  1199. package/dist/ionic/p-c7ebed50.entry.js +0 -4
  1200. package/dist/ionic/p-cd0037e4.entry.js +0 -4
  1201. package/dist/ionic/p-d261938d.entry.js +0 -4
  1202. package/dist/ionic/p-d33dfc12.entry.js +0 -4
  1203. package/dist/ionic/p-d7764330.entry.js +0 -4
  1204. package/dist/ionic/p-defb23a2.entry.js +0 -4
  1205. package/dist/ionic/p-df642ef5.entry.js +0 -4
  1206. package/dist/ionic/p-e2a35249.entry.js +0 -4
  1207. package/dist/ionic/p-e2b952ef.entry.js +0 -4
  1208. package/dist/ionic/p-e77cfd1e.entry.js +0 -4
  1209. package/dist/ionic/p-ecb9d3d3.entry.js +0 -4
  1210. package/dist/ionic/p-efd13adf.entry.js +0 -4
  1211. package/dist/ionic/p-f0904c1d.entry.js +0 -4
  1212. package/dist/ionic/p-f33689f7.entry.js +0 -4
  1213. package/dist/ionic/p-f693efe9.entry.js +0 -4
  1214. package/dist/ionic/p-f788396b.entry.js +0 -4
  1215. package/dist/ionic/p-fIOYmaqA.js +0 -4
  1216. package/dist/ionic/p-fa16fad8.entry.js +0 -4
  1217. package/dist/ionic/p-lMb_45ax.js +0 -4
  1218. package/dist/ionic/p-oadJNPuo.js +0 -4
  1219. package/dist/ionic/p-vXpMhGrs.js +0 -4
  1220. package/dist/ionic/p-wNjWCZVO.js +0 -4
  1221. package/dist/types/components/divider/divider.d.ts +0 -20
  1222. package/dist/types/components/footer/footer-interface.d.ts +0 -1
  1223. package/dist/types/components/gallery/gallery-constants.d.ts +0 -9
  1224. package/dist/types/components/gallery/gallery-interface.d.ts +0 -10
  1225. package/dist/types/components/gallery/gallery.d.ts +0 -218
  1226. package/dist/types/components/gallery/test/utils.d.ts +0 -3
  1227. package/dist/types/components/gallery-item/gallery-item.d.ts +0 -33
  1228. package/dist/types/components/header/header-interface.d.ts +0 -1
  1229. package/dist/types/components/modal/animations/ionic.enter.d.ts +0 -6
  1230. package/dist/types/components/modal/animations/ionic.leave.d.ts +0 -6
  1231. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  1232. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  1233. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  1234. package/dist/types/components/picker-legacy/picker.d.ts +0 -159
  1235. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  1236. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  1237. package/dist/types/utils/css-value-validation.d.ts +0 -21
  1238. package/dist/types/utils/forms/clear-button-press-controller.d.ts +0 -20
  1239. package/dist/types/utils/scroll-hide-controller.d.ts +0 -56
  1240. /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,779 +54,143 @@ 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
- * Don't reset this in `disconnectedCallback`. Overlays disconnect and
68
- * reconnect the host without re-creating the observers, so a reset there
69
- * makes `hiddenCallback` miss the dismissal.
70
- */
71
- this.hasBeenIntersecting = false;
72
- this.prevPresentation = null;
73
- this.showMonthAndYear = false;
74
- this.activeParts = [];
75
- this.workingParts = {
76
- month: 5,
77
- day: 28,
78
- year: 2021,
79
- hour: 13,
80
- minute: 52,
81
- ampm: 'pm',
82
- isAdjacentDay: false,
83
- };
84
- this.isTimePopoverOpen = false;
85
- /**
86
- * The color to use from your application's color palette.
87
- * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
88
- * For more information on colors, refer to [theming](/docs/theming/basics).
89
- */
90
- this.color = 'primary';
91
- /**
92
- * The name of the control, which is submitted with the form data.
93
- */
94
- this.name = this.inputId;
95
- /**
96
- * If `true`, the user cannot interact with the datetime.
97
- */
98
- this.disabled = false;
99
- /**
100
- * If `true`, the datetime appears normal but the selected date cannot be changed.
101
- */
102
- this.readonly = false;
103
- /**
104
- * If `true`, the datetime calendar displays a six-week (42-day) layout,
105
- * including days from the previous and next months to fill the grid.
106
- * These adjacent days are selectable unless disabled.
107
- */
108
- this.showAdjacentDays = false;
109
- /**
110
- * Which values you want to select. `"date"` will show
111
- * a calendar picker to select the month, day, and year. `"time"`
112
- * will show a time picker to select the hour, minute, and (optionally)
113
- * AM/PM. `"date-time"` will show the date picker first and time picker second.
114
- * `"time-date"` will show the time picker first and date picker second.
115
- */
116
- this.presentation = 'date-time';
117
- /**
118
- * The text to display on the picker's cancel button.
119
- */
120
- this.cancelText = 'Cancel';
121
- /**
122
- * The text to display on the picker's "Done" button.
123
- */
124
- this.doneText = 'Done';
125
- /**
126
- * The text to display on the picker's "Clear" button.
127
- */
128
- this.clearText = 'Clear';
129
- /**
130
- * The locale to use for `ion-datetime`. This
131
- * impacts month and day name formatting.
132
- * The `"default"` value refers to the default
133
- * locale set by your device.
134
- */
135
- this.locale = 'default';
136
- /**
137
- * The first day of the week to use for `ion-datetime`. The
138
- * default value is `0` and represents Sunday.
139
- */
140
- this.firstDayOfWeek = 0;
141
- /**
142
- * If `true`, multiple dates can be selected at once. Only
143
- * applies to `presentation="date"` and `preferWheel="false"`.
144
- */
145
- this.multiple = false;
146
- /**
147
- * If `true`, a header will be shown above the calendar
148
- * picker. This will include both the slotted title, and
149
- * the selected date.
150
- */
151
- this.showDefaultTitle = false;
152
- /**
153
- * If `true`, the default "Cancel" and "OK" buttons
154
- * will be rendered at the bottom of the `ion-datetime`
155
- * component. Developers can also use the `button` slot
156
- * if they want to customize these buttons. If custom
157
- * buttons are set in the `button` slot then the
158
- * default buttons will not be rendered.
159
- */
160
- this.showDefaultButtons = false;
161
- /**
162
- * If `true`, a "Clear" button will be rendered alongside
163
- * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
164
- * component. Developers can also use the `button` slot
165
- * if they want to customize these buttons. If custom
166
- * buttons are set in the `button` slot then the
167
- * default buttons will not be rendered.
168
- */
169
- this.showClearButton = false;
170
- /**
171
- * If `true`, the default "Time" label will be rendered
172
- * for the time selector of the `ion-datetime` component.
173
- * Developers can also use the `time-label` slot
174
- * if they want to customize this label. If a custom
175
- * label is set in the `time-label` slot then the
176
- * default label will not be rendered.
177
- */
178
- this.showDefaultTimeLabel = true;
179
- /**
180
- * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
181
- * If `fixed`, the `ion-datetime` will have a fixed width.
182
- */
183
- this.size = 'fixed';
184
- /**
185
- * If `true`, a wheel picker will be rendered instead of a calendar grid
186
- * where possible. If `false`, a calendar grid will be rendered instead of
187
- * a wheel picker where possible.
188
- *
189
- * A wheel picker can be rendered instead of a grid when `presentation` is
190
- * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
191
- *
192
- * A wheel picker will always be rendered regardless of
193
- * the `preferWheel` value when `presentation` is one of the following values:
194
- * `"time"`, `"month"`, `"month-year"`, or `"year"`.
195
- */
196
- this.preferWheel = false;
197
- this.warnIfIncorrectValueUsage = () => {
198
- const { multiple, value } = this;
199
- if (!multiple && Array.isArray(value)) {
200
- /**
201
- * We do some processing on the `value` array so
202
- * that it looks more like an array when logged to
203
- * the console.
204
- * Example given ['a', 'b']
205
- * Default toString() behavior: a,b
206
- * Custom behavior: ['a', 'b']
207
- */
208
- 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".
209
-
210
- Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
211
- `, this.el);
212
- }
213
- };
214
- this.setValue = (value) => {
215
- this.value = value;
216
- this.ionChange.emit({ value });
217
- };
218
- /**
219
- * Returns the DatetimePart interface
220
- * to use when rendering an initial set of
221
- * data. This should be used when rendering an
222
- * interface in an environment where the `value`
223
- * may not be set. This function works
224
- * by returning the first selected date and then
225
- * falling back to defaultParts if no active date
226
- * is selected.
227
- */
228
- this.getActivePartsWithFallback = () => {
229
- var _a;
230
- const { defaultParts } = this;
231
- return (_a = this.getActivePart()) !== null && _a !== void 0 ? _a : defaultParts;
232
- };
233
- this.getActivePart = () => {
234
- const { activeParts } = this;
235
- return Array.isArray(activeParts) ? activeParts[0] : activeParts;
236
- };
237
- this.closeParentOverlay = (role) => {
238
- const popoverOrModal = this.el.closest('ion-modal, ion-popover');
239
- if (popoverOrModal) {
240
- popoverOrModal.dismiss(undefined, role);
241
- }
242
- };
243
- this.setWorkingParts = (parts) => {
244
- this.workingParts = Object.assign({}, parts);
245
- };
246
- this.setActiveParts = (parts, removeDate = false) => {
247
- /** if the datetime component is in readonly mode,
248
- * allow browsing of the calendar without changing
249
- * the set value
250
- */
251
- if (this.readonly) {
252
- return;
253
- }
254
- const { multiple, minParts, maxParts, activeParts } = this;
255
- /**
256
- * When setting the active parts, it is possible
257
- * to set invalid data. For example,
258
- * when updating January 31 to February,
259
- * February 31 does not exist. As a result
260
- * we need to validate the active parts and
261
- * ensure that we are only setting valid dates.
262
- * Additionally, we need to update the working parts
263
- * too in the event that the validated parts are different.
264
- */
265
- const validatedParts = validateParts(parts, minParts, maxParts);
266
- this.setWorkingParts(validatedParts);
267
- if (multiple) {
268
- const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
269
- if (removeDate) {
270
- this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
271
- }
272
- else {
273
- this.activeParts = [...activePartsArray, validatedParts];
274
- }
275
- }
276
- else {
277
- this.activeParts = Object.assign({}, validatedParts);
278
- }
279
- const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
280
- if (hasSlottedButtons || this.showDefaultButtons) {
281
- return;
282
- }
283
- this.confirm();
284
- };
285
- this.initializeKeyboardListeners = () => {
286
- const calendarBodyRef = this.calendarBodyRef;
287
- if (!calendarBodyRef) {
288
- return;
289
- }
290
- const root = this.el.shadowRoot;
291
- /**
292
- * Get a reference to the month
293
- * element we are currently viewing.
294
- */
295
- const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
296
- /**
297
- * When focusing the calendar body, we want to pass focus
298
- * to the working day, but other days should
299
- * only be accessible using the arrow keys. Pressing
300
- * Tab should jump between bodies of selectable content.
301
- */
302
- const checkCalendarBodyFocus = (ev) => {
303
- var _a;
304
- const record = ev[0];
305
- /**
306
- * If calendar body was already focused
307
- * when this fired or if the calendar body
308
- * if not currently focused, we should not re-focus
309
- * the inner day.
310
- */
311
- if (((_a = record.oldValue) === null || _a === void 0 ? void 0 : _a.includes('ion-focused')) || !calendarBodyRef.classList.contains('ion-focused')) {
312
- return;
313
- }
314
- this.focusWorkingDay(currentMonth);
315
- };
316
- const mo = new MutationObserver(checkCalendarBodyFocus);
317
- mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
318
- this.destroyKeyboardMO = () => {
319
- mo === null || mo === void 0 ? void 0 : mo.disconnect();
320
- };
321
- /**
322
- * We must use keydown not keyup as we want
323
- * to prevent scrolling when using the arrow keys.
324
- */
325
- calendarBodyRef.addEventListener('keydown', (ev) => {
326
- const activeElement = root.activeElement;
327
- if (!activeElement || !activeElement.classList.contains('calendar-day')) {
328
- return;
329
- }
330
- const parts = getPartsFromCalendarDay(activeElement);
331
- let partsToFocus;
332
- switch (ev.key) {
333
- case 'ArrowDown':
334
- ev.preventDefault();
335
- partsToFocus = getNextWeek(parts);
336
- break;
337
- case 'ArrowUp':
338
- ev.preventDefault();
339
- partsToFocus = getPreviousWeek(parts);
340
- break;
341
- case 'ArrowRight':
342
- ev.preventDefault();
343
- partsToFocus = getNextDay(parts);
344
- break;
345
- case 'ArrowLeft':
346
- ev.preventDefault();
347
- partsToFocus = getPreviousDay(parts);
348
- break;
349
- case 'Home':
350
- ev.preventDefault();
351
- partsToFocus = getStartOfWeek(parts);
352
- break;
353
- case 'End':
354
- ev.preventDefault();
355
- partsToFocus = getEndOfWeek(parts);
356
- break;
357
- case 'PageUp':
358
- ev.preventDefault();
359
- partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
360
- break;
361
- case 'PageDown':
362
- ev.preventDefault();
363
- partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
364
- break;
365
- /**
366
- * Do not preventDefault here
367
- * as we do not want to override other
368
- * browser defaults such as pressing Enter/Space
369
- * to select a day.
370
- */
371
- default:
372
- return;
373
- }
374
- /**
375
- * If the day we want to move focus to is
376
- * disabled, do not do anything.
377
- */
378
- if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
379
- return;
380
- }
381
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), partsToFocus));
382
- /**
383
- * Give view a chance to re-render
384
- * then move focus to the new working day
385
- */
386
- requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
387
- });
388
- };
389
- this.focusWorkingDay = (currentMonth) => {
390
- /**
391
- * Get the number of offset days so
392
- * we know how much to offset our next selector by
393
- * to grab the correct calendar-day element.
394
- */
395
- const { day, month, year } = this.workingParts;
396
- const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
397
- const offset = firstOfMonth >= this.firstDayOfWeek
398
- ? firstOfMonth - this.firstDayOfWeek
399
- : 7 - (this.firstDayOfWeek - firstOfMonth);
400
- if (day === null) {
401
- return;
402
- }
403
- /**
404
- * Get the calendar day element
405
- * and focus it.
406
- */
407
- const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
408
- if (dayEl) {
409
- dayEl.focus();
410
- }
411
- };
412
- this.processMinParts = () => {
413
- const { min, defaultParts } = this;
414
- if (min === undefined) {
415
- this.minParts = undefined;
416
- return;
417
- }
418
- this.minParts = parseMinParts(min, defaultParts);
419
- };
420
- this.processMaxParts = () => {
421
- const { max, defaultParts } = this;
422
- if (max === undefined) {
423
- this.maxParts = undefined;
424
- return;
425
- }
426
- this.maxParts = parseMaxParts(max, defaultParts);
427
- };
428
- this.initializeCalendarListener = () => {
429
- const calendarBodyRef = this.calendarBodyRef;
430
- if (!calendarBodyRef) {
431
- return;
432
- }
433
- /**
434
- * For performance reasons, we only render 3
435
- * months at a time: The current month, the previous
436
- * month, and the next month. We have a scroll listener
437
- * on the calendar body to append/prepend new months.
438
- *
439
- * We can do this because Stencil is smart enough to not
440
- * re-create the .calendar-month containers, but rather
441
- * update the content within those containers.
442
- *
443
- * As an added bonus, WebKit has some troubles with
444
- * scroll-snap-stop: always, so not rendering all of
445
- * the months in a row allows us to mostly sidestep
446
- * that issue.
447
- */
448
- const months = calendarBodyRef.querySelectorAll('.calendar-month');
449
- const startMonth = months[0];
450
- const workingMonth = months[1];
451
- const endMonth = months[2];
452
- const mode = getIonMode(this);
453
- const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
454
- /**
455
- * Before setting up the scroll listener,
456
- * scroll the middle month into view.
457
- * scrollIntoView() will scroll entire page
458
- * if element is not in viewport. Use scrollLeft instead.
459
- */
460
- writeTask(() => {
461
- calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
462
- const getChangedMonth = (parts) => {
463
- const box = calendarBodyRef.getBoundingClientRect();
464
- /**
465
- * If the current scroll position is all the way to the left
466
- * then we have scrolled to the previous month.
467
- * Otherwise, assume that we have scrolled to the next
468
- * month. We have a tolerance of 2px to account for
469
- * sub pixel rendering.
470
- *
471
- * Check below the next line ensures that we did not
472
- * swipe and abort (i.e. we swiped but we are still on the current month).
473
- */
474
- const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
475
- const month = condition ? startMonth : endMonth;
476
- /**
477
- * The edge of the month must be lined up with
478
- * the edge of the calendar body in order for
479
- * the component to update. Otherwise, it
480
- * may be the case that the user has paused their
481
- * swipe or the browser has not finished snapping yet.
482
- * Rather than check if the x values are equal,
483
- * we give it a tolerance of 2px to account for
484
- * sub pixel rendering.
485
- */
486
- const monthBox = month.getBoundingClientRect();
487
- if (Math.abs(monthBox.x - box.x) > 2)
488
- return;
489
- /**
490
- * If we're force-rendering a month, assume we've
491
- * scrolled to that and return it.
492
- *
493
- * If forceRenderDate is ever used in a context where the
494
- * forced month is not immediately auto-scrolled to, this
495
- * should be updated to also check whether `month` has the
496
- * same month and year as the forced date.
497
- */
498
- const { forceRenderDate } = this;
499
- if (forceRenderDate !== undefined) {
500
- return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
501
- }
502
- /**
503
- * From here, we can determine if the start
504
- * month or the end month was scrolled into view.
505
- * If no month was changed, then we can return from
506
- * the scroll callback early.
507
- */
508
- if (month === startMonth) {
509
- return getPreviousMonth(parts);
510
- }
511
- else if (month === endMonth) {
512
- return getNextMonth(parts);
513
- }
514
- else {
515
- return;
516
- }
517
- };
518
- const updateActiveMonth = () => {
519
- if (needsiOSRubberBandFix) {
520
- calendarBodyRef.style.removeProperty('pointer-events');
521
- appliediOSRubberBandFix = false;
522
- }
523
- /**
524
- * If the month did not change
525
- * then we can return early.
526
- */
527
- const newDate = getChangedMonth(this.workingParts);
528
- if (!newDate)
529
- return;
530
- const { month, day, year } = newDate;
531
- if (isMonthDisabled({ month, year, day: null }, {
532
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
533
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
534
- })) {
535
- return;
536
- }
537
- /**
538
- * Prevent scrolling for other browsers
539
- * to give the DOM time to update and the container
540
- * time to properly snap.
541
- */
542
- calendarBodyRef.style.setProperty('overflow', 'hidden');
543
- /**
544
- * Use a writeTask here to ensure
545
- * that the state is updated and the
546
- * correct month is scrolled into view
547
- * in the same frame. This is not
548
- * typically a problem on newer devices
549
- * but older/slower device may have a flicker
550
- * if we did not do this.
551
- */
552
- writeTask(() => {
553
- var _a;
554
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month, day: day, year }));
555
- calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
556
- calendarBodyRef.style.removeProperty('overflow');
557
- if (this.resolveForceDateScrolling) {
558
- this.resolveForceDateScrolling();
559
- }
560
- const activeEl = this.el.shadowRoot.activeElement;
561
- if (activeEl && activeEl.classList.contains('calendar-day')) {
562
- (_a = activeEl.closest('.calendar-body')) === null || _a === void 0 ? void 0 : _a.focus();
563
- }
564
- });
565
- };
566
- /**
567
- * When the container finishes scrolling we
568
- * need to update the DOM with the selected month.
569
- */
570
- let scrollTimeout;
571
- /**
572
- * We do not want to attempt to set pointer-events
573
- * multiple times within a single swipe gesture as
574
- * that adds unnecessary work to the main thread.
575
- */
576
- let appliediOSRubberBandFix = false;
577
- const scrollCallback = () => {
578
- if (scrollTimeout) {
579
- clearTimeout(scrollTimeout);
580
- }
581
- /**
582
- * On iOS it is possible to quickly rubber band
583
- * the scroll area before the scroll timeout has fired.
584
- * This results in users reaching the end of the scrollable
585
- * container before the DOM has updated.
586
- * By setting `pointer-events: none` we can ensure that
587
- * subsequent swipes do not happen while the container
588
- * is snapping.
589
- */
590
- if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
591
- calendarBodyRef.style.setProperty('pointer-events', 'none');
592
- appliediOSRubberBandFix = true;
593
- }
594
- // Wait ~3 frames
595
- scrollTimeout = setTimeout(updateActiveMonth, 50);
596
- };
597
- calendarBodyRef.addEventListener('scroll', scrollCallback);
598
- this.destroyCalendarListener = () => {
599
- calendarBodyRef.removeEventListener('scroll', scrollCallback);
600
- };
601
- });
602
- };
603
- /**
604
- * Clean up all listeners except for the overlay
605
- * listener. This is so that we can re-create the listeners
606
- * if the datetime has been hidden/presented by a modal or popover.
607
- */
608
- this.destroyInteractionListeners = () => {
609
- const { destroyCalendarListener, destroyKeyboardMO } = this;
610
- if (destroyCalendarListener !== undefined) {
611
- destroyCalendarListener();
612
- }
613
- if (destroyKeyboardMO !== undefined) {
614
- destroyKeyboardMO();
615
- }
616
- };
617
- /**
618
- * TODO(FW-6931): Remove this fallback upon solving the root cause
619
- * Fallback to ensure the datetime becomes ready even if
620
- * IntersectionObserver never reports it as intersecting.
621
- *
622
- * This is primarily used in environments where the observer
623
- * might not fire as expected, such as when running under
624
- * synthetic tests that stub IntersectionObserver.
625
- */
626
- this.ensureReadyIfVisible = () => {
627
- if (this.el.classList.contains('datetime-ready')) {
628
- return;
629
- }
630
- const rect = this.el.getBoundingClientRect();
631
- if (rect.width === 0 || rect.height === 0) {
632
- return;
633
- }
634
- this.markReady();
635
- };
636
- this.markReady = () => {
637
- if (this.el.classList.contains('datetime-ready')) {
638
- return;
639
- }
640
- this.initializeListeners();
641
- /**
642
- * TODO FW-2793: Datetime needs a frame to ensure that it
643
- * can properly scroll contents into view. As a result
644
- * we hide the scrollable content until after that frame
645
- * so users do not see the content quickly shifting. The downside
646
- * is that the content will pop into view a frame after. Maybe there
647
- * is a better way to handle this?
648
- */
649
- writeTask(() => {
650
- this.el.classList.add('datetime-ready');
651
- });
652
- };
653
- this.loadTimeoutCleanup = () => {
654
- if (this.loadTimeout) {
655
- clearTimeout(this.loadTimeout);
656
- this.loadTimeout = undefined;
657
- }
658
- };
659
- this.processValue = (value) => {
660
- const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
661
- const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
662
- const { minParts, maxParts, workingParts, el } = this;
663
- this.warnIfIncorrectValueUsage();
664
- /**
665
- * Return early if the value wasn't parsed correctly, such as
666
- * if an improperly formatted date string was provided.
667
- */
668
- if (!valueToProcess) {
669
- return;
670
- }
671
- /**
672
- * Datetime should only warn of out of bounds values
673
- * if set by the user. If the `value` is undefined,
674
- * we will default to today's date which may be out
675
- * of bounds. In this case, the warning makes it look
676
- * like the developer did something wrong which is
677
- * not true.
678
- */
679
- if (hasValue) {
680
- warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
681
- }
682
- /**
683
- * If there are multiple values, clamp to the last one.
684
- * This is because the last value is the one that the user
685
- * has most recently interacted with.
686
- */
687
- const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
688
- const targetValue = clampDate(singleValue, minParts, maxParts);
689
- const { month, day, year, hour, minute } = targetValue;
690
- const ampm = parseAmPm(hour);
691
- /**
692
- * Since `activeParts` indicates a value that been explicitly selected
693
- * either by the user or the app, only update `activeParts` if the
694
- * `value` property is set.
695
- */
696
- if (hasValue) {
697
- if (Array.isArray(valueToProcess)) {
698
- this.activeParts = [...valueToProcess];
699
- }
700
- else {
701
- this.activeParts = {
702
- month,
703
- day,
704
- year,
705
- hour,
706
- minute,
707
- ampm,
708
- };
709
- }
710
- }
711
- else {
712
- /**
713
- * Reset the active parts if the value is not set.
714
- * This will clear the selected calendar day when
715
- * performing a clear action or using the reset() method.
716
- */
717
- this.activeParts = [];
718
- }
719
- const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
720
- const bodyIsVisible = el.classList.contains('datetime-ready');
721
- const { isGridStyle, showMonthAndYear } = this;
722
- if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
723
- /**
724
- * Only animate if:
725
- * 1. We're using grid style (wheel style pickers should just jump to new value)
726
- * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
727
- * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
728
- * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
729
- */
730
- this.animateToDate(targetValue);
731
- }
732
- else {
733
- this.setWorkingParts({
734
- month,
735
- day,
736
- year,
737
- hour,
738
- minute,
739
- ampm,
740
- });
741
- }
742
- };
743
- this.animateToDate = async (targetValue) => {
744
- const { workingParts } = this;
745
- /**
746
- * Tell other render functions that we need to force the
747
- * target month to appear in place of the actual next/prev month.
748
- * Because this is a State variable, a rerender will be triggered
749
- * automatically, updating the rendered months.
750
- */
751
- this.forceRenderDate = targetValue;
752
- /**
753
- * Flag that we've started scrolling to the forced date.
754
- * The resolve function will be called by the datetime's
755
- * scroll listener when it's done updating everything.
756
- * This is a replacement for making prev/nextMonth async,
757
- * since the logic we're waiting on is in a listener.
758
- */
759
- const forceDateScrollingPromise = new Promise((resolve) => {
760
- this.resolveForceDateScrolling = resolve;
761
- });
762
- /**
763
- * Animate smoothly to the forced month. This will also update
764
- * workingParts and correct the surrounding months for us.
765
- */
766
- const targetMonthIsBefore = isBefore(targetValue, workingParts);
767
- targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
768
- await forceDateScrollingPromise;
769
- this.resolveForceDateScrolling = undefined;
770
- this.forceRenderDate = undefined;
771
- };
772
- this.onFocus = () => {
773
- this.ionFocus.emit();
774
- };
775
- this.onBlur = () => {
776
- this.ionBlur.emit();
777
- };
778
- this.hasValue = () => {
779
- return this.value != null;
780
- };
781
- this.nextMonth = () => {
782
- const calendarBodyRef = this.calendarBodyRef;
783
- if (!calendarBodyRef) {
784
- return;
785
- }
786
- const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
787
- if (!nextMonth) {
788
- return;
789
- }
790
- const left = nextMonth.offsetWidth * 2;
791
- const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
792
- calendarBodyRef.scrollTo({
793
- top: 0,
794
- left: left * (isRTL(this.el) ? -1 : 1),
795
- behavior: scrollMode,
796
- });
797
- };
798
- this.prevMonth = () => {
799
- const calendarBodyRef = this.calendarBodyRef;
800
- if (!calendarBodyRef) {
801
- return;
802
- }
803
- const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
804
- if (!prevMonth) {
805
- return;
806
- }
807
- const left = prevMonth.offsetWidth * 2;
808
- const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
809
- calendarBodyRef.scrollTo({
810
- top: 0,
811
- left: left * (isRTL(this.el) ? 1 : -1),
812
- behavior: scrollMode,
813
- });
814
- };
815
- this.toggleMonthAndYearView = () => {
816
- this.showMonthAndYear = !this.showMonthAndYear;
817
- };
818
- }
57
+ inputId = `ion-dt-${datetimeIds++}`;
58
+ calendarBodyRef;
59
+ popoverRef;
60
+ intersectionTrackerRef;
61
+ clearFocusVisible;
62
+ parsedMinuteValues;
63
+ parsedHourValues;
64
+ parsedMonthValues;
65
+ parsedYearValues;
66
+ parsedDayValues;
67
+ destroyCalendarListener;
68
+ destroyKeyboardMO;
69
+ // TODO(FW-2832): types (DatetimeParts causes some errors that need untangling)
70
+ minParts;
71
+ maxParts;
72
+ todayParts;
73
+ defaultParts;
74
+ loadTimeout;
75
+ /**
76
+ * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
77
+ * synthetic "not intersecting" entry IntersectionObserver fires on
78
+ * `observe()` when the host mounts offscreen.
79
+ *
80
+ * Don't reset this in `disconnectedCallback`. Overlays disconnect and
81
+ * reconnect the host without re-creating the observers, so a reset there
82
+ * makes `hiddenCallback` miss the dismissal.
83
+ */
84
+ hasBeenIntersecting = false;
85
+ prevPresentation = null;
86
+ resolveForceDateScrolling;
87
+ showMonthAndYear = false;
88
+ activeParts = [];
89
+ workingParts = {
90
+ month: 5,
91
+ day: 28,
92
+ year: 2021,
93
+ hour: 13,
94
+ minute: 52,
95
+ ampm: 'pm',
96
+ isAdjacentDay: false,
97
+ };
98
+ el;
99
+ isTimePopoverOpen = false;
100
+ /**
101
+ * When defined, will force the datetime to render the month
102
+ * containing the specified date. Currently, this should only
103
+ * be used to enable immediately auto-scrolling to the new month,
104
+ * and should then be reset to undefined once the transition is
105
+ * finished and the forced month is now in view.
106
+ *
107
+ * Applies to grid-style datetimes only.
108
+ */
109
+ forceRenderDate;
110
+ /**
111
+ * The color to use from your application's color palette.
112
+ * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
113
+ * For more information on colors, refer to [theming](/docs/theming/basics).
114
+ */
115
+ color;
116
+ /**
117
+ * The name of the control, which is submitted with the form data.
118
+ */
119
+ name = this.inputId;
120
+ /**
121
+ * If `true`, the user cannot interact with the datetime.
122
+ */
123
+ disabled = false;
124
+ /**
125
+ * Formatting options for dates and times.
126
+ * Should include a 'date' and/or 'time' object, each of which is of type [Intl.DateTimeFormatOptions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#options).
127
+ *
128
+ */
129
+ formatOptions;
819
130
  formatOptionsChanged() {
820
131
  const { el, formatOptions, presentation } = this;
821
132
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
822
133
  warnIfTimeZoneProvided(el, formatOptions);
823
134
  }
135
+ /**
136
+ * If `true`, the datetime appears normal but the selected date cannot be changed.
137
+ */
138
+ readonly = false;
139
+ /**
140
+ * Returns if an individual date (calendar day) is enabled or disabled.
141
+ *
142
+ * If `true`, the day will be enabled/interactive.
143
+ * If `false`, the day will be disabled/non-interactive.
144
+ *
145
+ * The function accepts an ISO 8601 date string of a given day.
146
+ * By default, all days are enabled. Developers can use this function
147
+ * to write custom logic to disable certain days.
148
+ *
149
+ * The function is called for each rendered calendar day, for the previous, current and next month.
150
+ * Custom implementations should be optimized for performance to avoid jank.
151
+ */
152
+ isDateEnabled;
153
+ /**
154
+ * If `true`, the datetime calendar displays a six-week (42-day) layout,
155
+ * including days from the previous and next months to fill the grid.
156
+ * These adjacent days are selectable unless disabled.
157
+ */
158
+ showAdjacentDays = false;
824
159
  disabledChanged() {
825
160
  this.emitStyle();
826
161
  }
162
+ /**
163
+ * The minimum datetime allowed. Value must be a date string
164
+ * following the
165
+ * [ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),
166
+ * such as `1996-12-19`. The format does not have to be specific to an exact
167
+ * datetime. For example, the minimum could just be the year, such as `1994`.
168
+ * Defaults to the beginning of the year, 100 years ago from today.
169
+ */
170
+ min;
827
171
  minChanged() {
828
172
  this.processMinParts();
829
173
  }
174
+ /**
175
+ * The maximum datetime allowed. Value must be a date string
176
+ * following the
177
+ * [ISO 8601 datetime format standard](https://www.w3.org/TR/NOTE-datetime),
178
+ * `1996-12-19`. The format does not have to be specific to an exact
179
+ * datetime. For example, the maximum could just be the year, such as `1994`.
180
+ * Defaults to the end of this year.
181
+ */
182
+ max;
830
183
  maxChanged() {
831
184
  this.processMaxParts();
832
185
  }
186
+ /**
187
+ * Which values you want to select. `"date"` will show
188
+ * a calendar picker to select the month, day, and year. `"time"`
189
+ * will show a time picker to select the hour, minute, and (optionally)
190
+ * AM/PM. `"date-time"` will show the date picker first and time picker second.
191
+ * `"time-date"` will show the time picker first and date picker second.
192
+ */
193
+ presentation = 'date-time';
833
194
  presentationChanged() {
834
195
  const { el, formatOptions, presentation } = this;
835
196
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
@@ -839,32 +200,218 @@ export class Datetime {
839
200
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
840
201
  return hasDatePresentation && !preferWheel;
841
202
  }
203
+ /**
204
+ * The text to display on the picker's cancel button.
205
+ */
206
+ cancelText = 'Cancel';
207
+ /**
208
+ * The text to display on the picker's "Done" button.
209
+ */
210
+ doneText = 'Done';
211
+ /**
212
+ * The text to display on the picker's "Clear" button.
213
+ */
214
+ clearText = 'Clear';
215
+ /**
216
+ * Values used to create the list of selectable years. By default
217
+ * the year values range between the `min` and `max` datetime inputs. However, to
218
+ * control exactly which years to display, the `yearValues` input can take a number, an array
219
+ * of numbers, or string of comma separated numbers. For example, to show upcoming and
220
+ * recent leap years, then this input's value would be `yearValues="2008,2012,2016,2020,2024"`.
221
+ */
222
+ yearValues;
842
223
  yearValuesChanged() {
843
224
  this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
844
225
  }
226
+ /**
227
+ * Values used to create the list of selectable months. By default
228
+ * the month values range from `1` to `12`. However, to control exactly which months to
229
+ * display, the `monthValues` input can take a number, an array of numbers, or a string of
230
+ * comma separated numbers. For example, if only summer months should be shown, then this
231
+ * input value would be `monthValues="6,7,8"`. Note that month numbers do *not* have a
232
+ * zero-based index, meaning January's value is `1`, and December's is `12`.
233
+ */
234
+ monthValues;
845
235
  monthValuesChanged() {
846
236
  this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
847
237
  }
238
+ /**
239
+ * Values used to create the list of selectable days. By default
240
+ * every day is shown for the given month. However, to control exactly which days of
241
+ * the month to display, the `dayValues` input can take a number, an array of numbers, or
242
+ * a string of comma separated numbers. Note that even if the array days have an invalid
243
+ * number for the selected month, like `31` in February, it will correctly not show
244
+ * days which are not valid for the selected month.
245
+ */
246
+ dayValues;
848
247
  dayValuesChanged() {
849
248
  this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
850
249
  }
250
+ /**
251
+ * Values used to create the list of selectable hours. By default
252
+ * the hour values range from `0` to `23` for 24-hour, or `1` to `12` for 12-hour. However,
253
+ * to control exactly which hours to display, the `hourValues` input can take a number, an
254
+ * array of numbers, or a string of comma separated numbers.
255
+ */
256
+ hourValues;
851
257
  hourValuesChanged() {
852
258
  this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
853
259
  }
260
+ /**
261
+ * Values used to create the list of selectable minutes. By default
262
+ * the minutes range from `0` to `59`. However, to control exactly which minutes to display,
263
+ * the `minuteValues` input can take a number, an array of numbers, or a string of comma
264
+ * separated numbers. For example, if the minute selections should only be every 15 minutes,
265
+ * then this input value would be `minuteValues="0,15,30,45"`.
266
+ */
267
+ minuteValues;
854
268
  minuteValuesChanged() {
855
269
  this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
856
270
  }
857
271
  /**
858
- * Update the datetime value when the value changes
272
+ * The locale to use for `ion-datetime`. This
273
+ * impacts month and day name formatting.
274
+ * The `"default"` value refers to the default
275
+ * locale set by your device.
276
+ */
277
+ locale = 'default';
278
+ /**
279
+ * The first day of the week to use for `ion-datetime`. The
280
+ * default value is `0` and represents Sunday.
281
+ */
282
+ firstDayOfWeek = 0;
283
+ /**
284
+ * A callback used to format the header text that shows how many
285
+ * dates are selected. Only used if there are 0 or more than 1
286
+ * selected (i.e. unused for exactly 1). By default, the header
287
+ * text is set to "numberOfDates days".
288
+ *
289
+ * See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
290
+ * if you need to access `this` from within the callback.
291
+ */
292
+ titleSelectedDatesFormatter;
293
+ /**
294
+ * If `true`, multiple dates can be selected at once. Only
295
+ * applies to `presentation="date"` and `preferWheel="false"`.
296
+ */
297
+ multiple = false;
298
+ /**
299
+ * Used to apply custom text and background colors to specific dates.
300
+ *
301
+ * Can be either an array of objects containing ISO strings and colors,
302
+ * or a callback that receives an ISO string and returns the colors.
303
+ *
304
+ * Only applies to the `date`, `date-time`, and `time-date` presentations,
305
+ * with `preferWheel="false"`.
306
+ */
307
+ highlightedDates;
308
+ /**
309
+ * The value of the datetime as a valid ISO 8601 datetime string.
310
+ * This should be an array of strings only when `multiple="true"`.
311
+ */
312
+ value;
313
+ /**
314
+ * Update the datetime value when the value changes
315
+ */
316
+ async valueChanged() {
317
+ const { value } = this;
318
+ if (this.hasValue()) {
319
+ this.processValue(value);
320
+ }
321
+ this.emitStyle();
322
+ this.ionValueChange.emit({ value });
323
+ }
324
+ /**
325
+ * If `true`, a header will be shown above the calendar
326
+ * picker. This will include both the slotted title, and
327
+ * the selected date.
328
+ */
329
+ showDefaultTitle = false;
330
+ /**
331
+ * If `true`, the default "Cancel" and "OK" buttons
332
+ * will be rendered at the bottom of the `ion-datetime`
333
+ * component. Developers can also use the `button` slot
334
+ * if they want to customize these buttons. If custom
335
+ * buttons are set in the `button` slot then the
336
+ * default buttons will not be rendered.
337
+ */
338
+ showDefaultButtons = false;
339
+ /**
340
+ * If `true`, a "Clear" button will be rendered alongside
341
+ * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
342
+ * component. Developers can also use the `button` slot
343
+ * if they want to customize these buttons. If custom
344
+ * buttons are set in the `button` slot then the
345
+ * default buttons will not be rendered.
346
+ */
347
+ showClearButton = false;
348
+ /**
349
+ * If `true`, the default "Time" label will be rendered
350
+ * for the time selector of the `ion-datetime` component.
351
+ * Developers can also use the `time-label` slot
352
+ * if they want to customize this label. If a custom
353
+ * label is set in the `time-label` slot then the
354
+ * default label will not be rendered.
355
+ */
356
+ showDefaultTimeLabel = true;
357
+ /**
358
+ * The hour cycle of the `ion-datetime`. If no value is set, this is
359
+ * specified by the current locale.
360
+ */
361
+ hourCycle;
362
+ /**
363
+ * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
364
+ * If `fixed`, the `ion-datetime` will have a fixed width.
365
+ */
366
+ size = 'fixed';
367
+ /**
368
+ * If `true`, a wheel picker will be rendered instead of a calendar grid
369
+ * where possible. If `false`, a calendar grid will be rendered instead of
370
+ * a wheel picker where possible.
371
+ *
372
+ * A wheel picker can be rendered instead of a grid when `presentation` is
373
+ * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
374
+ *
375
+ * A wheel picker will always be rendered regardless of
376
+ * the `preferWheel` value when `presentation` is one of the following values:
377
+ * `"time"`, `"month"`, `"month-year"`, or `"year"`.
378
+ */
379
+ preferWheel = false;
380
+ /**
381
+ * Emitted when the datetime selection was cancelled.
859
382
  */
860
- async valueChanged() {
861
- const { value } = this;
862
- if (this.hasValue()) {
863
- this.processValue(value);
864
- }
865
- this.emitStyle();
866
- this.ionValueChange.emit({ value });
867
- }
383
+ ionCancel;
384
+ /**
385
+ * Emitted when the value (selected date) has changed.
386
+ *
387
+ * This event will not emit when programmatically setting the `value` property.
388
+ */
389
+ ionChange;
390
+ /**
391
+ * Emitted when the value property has changed.
392
+ * This is used to ensure that ion-datetime-button can respond
393
+ * to any value property changes.
394
+ * @internal
395
+ */
396
+ ionValueChange;
397
+ /**
398
+ * Emitted when the datetime has focus.
399
+ */
400
+ ionFocus;
401
+ /**
402
+ * Emitted when the datetime loses focus.
403
+ */
404
+ ionBlur;
405
+ /**
406
+ * Emitted when the styles change.
407
+ * @internal
408
+ */
409
+ ionStyle;
410
+ /**
411
+ * Emitted when componentDidRender is fired.
412
+ * @internal
413
+ */
414
+ ionRender;
868
415
  /**
869
416
  * Confirms the selected datetime value, updates the
870
417
  * `value` property, and optionally closes the popover
@@ -934,10 +481,425 @@ export class Datetime {
934
481
  async getDefaultPart() {
935
482
  return this.defaultParts;
936
483
  }
484
+ warnIfIncorrectValueUsage = () => {
485
+ const { multiple, value } = this;
486
+ if (!multiple && Array.isArray(value)) {
487
+ /**
488
+ * We do some processing on the `value` array so
489
+ * that it looks more like an array when logged to
490
+ * the console.
491
+ * Example given ['a', 'b']
492
+ * Default toString() behavior: a,b
493
+ * Custom behavior: ['a', 'b']
494
+ */
495
+ printIonWarning(`[ion-datetime] - An array of values was passed, but multiple is "false". This is incorrect usage and may result in unexpected behaviors. To dismiss this warning, pass a string to the "value" property when multiple="false".
496
+
497
+ Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
498
+ `, this.el);
499
+ }
500
+ };
501
+ setValue = (value) => {
502
+ this.value = value;
503
+ this.ionChange.emit({ value });
504
+ };
505
+ /**
506
+ * Returns the DatetimePart interface
507
+ * to use when rendering an initial set of
508
+ * data. This should be used when rendering an
509
+ * interface in an environment where the `value`
510
+ * may not be set. This function works
511
+ * by returning the first selected date and then
512
+ * falling back to defaultParts if no active date
513
+ * is selected.
514
+ */
515
+ getActivePartsWithFallback = () => {
516
+ const { defaultParts } = this;
517
+ return this.getActivePart() ?? defaultParts;
518
+ };
519
+ getActivePart = () => {
520
+ const { activeParts } = this;
521
+ return Array.isArray(activeParts) ? activeParts[0] : activeParts;
522
+ };
523
+ closeParentOverlay = (role) => {
524
+ const popoverOrModal = this.el.closest('ion-modal, ion-popover');
525
+ if (popoverOrModal) {
526
+ popoverOrModal.dismiss(undefined, role);
527
+ }
528
+ };
529
+ setWorkingParts = (parts) => {
530
+ this.workingParts = {
531
+ ...parts,
532
+ };
533
+ };
534
+ setActiveParts = (parts, removeDate = false) => {
535
+ /** if the datetime component is in readonly mode,
536
+ * allow browsing of the calendar without changing
537
+ * the set value
538
+ */
539
+ if (this.readonly) {
540
+ return;
541
+ }
542
+ const { multiple, minParts, maxParts, activeParts } = this;
543
+ /**
544
+ * When setting the active parts, it is possible
545
+ * to set invalid data. For example,
546
+ * when updating January 31 to February,
547
+ * February 31 does not exist. As a result
548
+ * we need to validate the active parts and
549
+ * ensure that we are only setting valid dates.
550
+ * Additionally, we need to update the working parts
551
+ * too in the event that the validated parts are different.
552
+ */
553
+ const validatedParts = validateParts(parts, minParts, maxParts);
554
+ this.setWorkingParts(validatedParts);
555
+ if (multiple) {
556
+ const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
557
+ if (removeDate) {
558
+ this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
559
+ }
560
+ else {
561
+ this.activeParts = [...activePartsArray, validatedParts];
562
+ }
563
+ }
564
+ else {
565
+ this.activeParts = {
566
+ ...validatedParts,
567
+ };
568
+ }
569
+ const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
570
+ if (hasSlottedButtons || this.showDefaultButtons) {
571
+ return;
572
+ }
573
+ this.confirm();
574
+ };
937
575
  get isCalendarPicker() {
938
576
  const { presentation } = this;
939
577
  return presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
940
578
  }
579
+ initializeKeyboardListeners = () => {
580
+ const calendarBodyRef = this.calendarBodyRef;
581
+ if (!calendarBodyRef) {
582
+ return;
583
+ }
584
+ const root = this.el.shadowRoot;
585
+ /**
586
+ * Get a reference to the month
587
+ * element we are currently viewing.
588
+ */
589
+ const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
590
+ /**
591
+ * When focusing the calendar body, we want to pass focus
592
+ * to the working day, but other days should
593
+ * only be accessible using the arrow keys. Pressing
594
+ * Tab should jump between bodies of selectable content.
595
+ */
596
+ const checkCalendarBodyFocus = (ev) => {
597
+ const record = ev[0];
598
+ /**
599
+ * If calendar body was already focused
600
+ * when this fired or if the calendar body
601
+ * if not currently focused, we should not re-focus
602
+ * the inner day.
603
+ */
604
+ if (record.oldValue?.includes('ion-focused') || !calendarBodyRef.classList.contains('ion-focused')) {
605
+ return;
606
+ }
607
+ this.focusWorkingDay(currentMonth);
608
+ };
609
+ const mo = new MutationObserver(checkCalendarBodyFocus);
610
+ mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
611
+ this.destroyKeyboardMO = () => {
612
+ mo?.disconnect();
613
+ };
614
+ /**
615
+ * We must use keydown not keyup as we want
616
+ * to prevent scrolling when using the arrow keys.
617
+ */
618
+ calendarBodyRef.addEventListener('keydown', (ev) => {
619
+ const activeElement = root.activeElement;
620
+ if (!activeElement || !activeElement.classList.contains('calendar-day')) {
621
+ return;
622
+ }
623
+ const parts = getPartsFromCalendarDay(activeElement);
624
+ let partsToFocus;
625
+ switch (ev.key) {
626
+ case 'ArrowDown':
627
+ ev.preventDefault();
628
+ partsToFocus = getNextWeek(parts);
629
+ break;
630
+ case 'ArrowUp':
631
+ ev.preventDefault();
632
+ partsToFocus = getPreviousWeek(parts);
633
+ break;
634
+ case 'ArrowRight':
635
+ ev.preventDefault();
636
+ partsToFocus = getNextDay(parts);
637
+ break;
638
+ case 'ArrowLeft':
639
+ ev.preventDefault();
640
+ partsToFocus = getPreviousDay(parts);
641
+ break;
642
+ case 'Home':
643
+ ev.preventDefault();
644
+ partsToFocus = getStartOfWeek(parts);
645
+ break;
646
+ case 'End':
647
+ ev.preventDefault();
648
+ partsToFocus = getEndOfWeek(parts);
649
+ break;
650
+ case 'PageUp':
651
+ ev.preventDefault();
652
+ partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
653
+ break;
654
+ case 'PageDown':
655
+ ev.preventDefault();
656
+ partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
657
+ break;
658
+ /**
659
+ * Do not preventDefault here
660
+ * as we do not want to override other
661
+ * browser defaults such as pressing Enter/Space
662
+ * to select a day.
663
+ */
664
+ default:
665
+ return;
666
+ }
667
+ /**
668
+ * If the day we want to move focus to is
669
+ * disabled, do not do anything.
670
+ */
671
+ if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
672
+ return;
673
+ }
674
+ this.setWorkingParts({
675
+ ...this.workingParts,
676
+ ...partsToFocus,
677
+ });
678
+ /**
679
+ * Give view a chance to re-render
680
+ * then move focus to the new working day
681
+ */
682
+ requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
683
+ });
684
+ };
685
+ focusWorkingDay = (currentMonth) => {
686
+ /**
687
+ * Get the number of offset days so
688
+ * we know how much to offset our next selector by
689
+ * to grab the correct calendar-day element.
690
+ */
691
+ const { day, month, year } = this.workingParts;
692
+ const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
693
+ const offset = firstOfMonth >= this.firstDayOfWeek
694
+ ? firstOfMonth - this.firstDayOfWeek
695
+ : 7 - (this.firstDayOfWeek - firstOfMonth);
696
+ if (day === null) {
697
+ return;
698
+ }
699
+ /**
700
+ * Get the calendar day element
701
+ * and focus it.
702
+ */
703
+ const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
704
+ if (dayEl) {
705
+ dayEl.focus();
706
+ }
707
+ };
708
+ processMinParts = () => {
709
+ const { min, defaultParts } = this;
710
+ if (min === undefined) {
711
+ this.minParts = undefined;
712
+ return;
713
+ }
714
+ this.minParts = parseMinParts(min, defaultParts);
715
+ };
716
+ processMaxParts = () => {
717
+ const { max, defaultParts } = this;
718
+ if (max === undefined) {
719
+ this.maxParts = undefined;
720
+ return;
721
+ }
722
+ this.maxParts = parseMaxParts(max, defaultParts);
723
+ };
724
+ initializeCalendarListener = () => {
725
+ const calendarBodyRef = this.calendarBodyRef;
726
+ if (!calendarBodyRef) {
727
+ return;
728
+ }
729
+ /**
730
+ * For performance reasons, we only render 3
731
+ * months at a time: The current month, the previous
732
+ * month, and the next month. We have a scroll listener
733
+ * on the calendar body to append/prepend new months.
734
+ *
735
+ * We can do this because Stencil is smart enough to not
736
+ * re-create the .calendar-month containers, but rather
737
+ * update the content within those containers.
738
+ *
739
+ * As an added bonus, WebKit has some troubles with
740
+ * scroll-snap-stop: always, so not rendering all of
741
+ * the months in a row allows us to mostly sidestep
742
+ * that issue.
743
+ */
744
+ const months = calendarBodyRef.querySelectorAll('.calendar-month');
745
+ const startMonth = months[0];
746
+ const workingMonth = months[1];
747
+ const endMonth = months[2];
748
+ const mode = getIonMode(this);
749
+ const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
750
+ /**
751
+ * Before setting up the scroll listener,
752
+ * scroll the middle month into view.
753
+ * scrollIntoView() will scroll entire page
754
+ * if element is not in viewport. Use scrollLeft instead.
755
+ */
756
+ writeTask(() => {
757
+ calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
758
+ const getChangedMonth = (parts) => {
759
+ const box = calendarBodyRef.getBoundingClientRect();
760
+ /**
761
+ * If the current scroll position is all the way to the left
762
+ * then we have scrolled to the previous month.
763
+ * Otherwise, assume that we have scrolled to the next
764
+ * month. We have a tolerance of 2px to account for
765
+ * sub pixel rendering.
766
+ *
767
+ * Check below the next line ensures that we did not
768
+ * swipe and abort (i.e. we swiped but we are still on the current month).
769
+ */
770
+ const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
771
+ const month = condition ? startMonth : endMonth;
772
+ /**
773
+ * The edge of the month must be lined up with
774
+ * the edge of the calendar body in order for
775
+ * the component to update. Otherwise, it
776
+ * may be the case that the user has paused their
777
+ * swipe or the browser has not finished snapping yet.
778
+ * Rather than check if the x values are equal,
779
+ * we give it a tolerance of 2px to account for
780
+ * sub pixel rendering.
781
+ */
782
+ const monthBox = month.getBoundingClientRect();
783
+ if (Math.abs(monthBox.x - box.x) > 2)
784
+ return;
785
+ /**
786
+ * If we're force-rendering a month, assume we've
787
+ * scrolled to that and return it.
788
+ *
789
+ * If forceRenderDate is ever used in a context where the
790
+ * forced month is not immediately auto-scrolled to, this
791
+ * should be updated to also check whether `month` has the
792
+ * same month and year as the forced date.
793
+ */
794
+ const { forceRenderDate } = this;
795
+ if (forceRenderDate !== undefined) {
796
+ return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
797
+ }
798
+ /**
799
+ * From here, we can determine if the start
800
+ * month or the end month was scrolled into view.
801
+ * If no month was changed, then we can return from
802
+ * the scroll callback early.
803
+ */
804
+ if (month === startMonth) {
805
+ return getPreviousMonth(parts);
806
+ }
807
+ else if (month === endMonth) {
808
+ return getNextMonth(parts);
809
+ }
810
+ else {
811
+ return;
812
+ }
813
+ };
814
+ const updateActiveMonth = () => {
815
+ if (needsiOSRubberBandFix) {
816
+ calendarBodyRef.style.removeProperty('pointer-events');
817
+ appliediOSRubberBandFix = false;
818
+ }
819
+ /**
820
+ * If the month did not change
821
+ * then we can return early.
822
+ */
823
+ const newDate = getChangedMonth(this.workingParts);
824
+ if (!newDate)
825
+ return;
826
+ const { month, day, year } = newDate;
827
+ if (isMonthDisabled({ month, year, day: null }, {
828
+ minParts: { ...this.minParts, day: null },
829
+ maxParts: { ...this.maxParts, day: null },
830
+ })) {
831
+ return;
832
+ }
833
+ /**
834
+ * Prevent scrolling for other browsers
835
+ * to give the DOM time to update and the container
836
+ * time to properly snap.
837
+ */
838
+ calendarBodyRef.style.setProperty('overflow', 'hidden');
839
+ /**
840
+ * Use a writeTask here to ensure
841
+ * that the state is updated and the
842
+ * correct month is scrolled into view
843
+ * in the same frame. This is not
844
+ * typically a problem on newer devices
845
+ * but older/slower device may have a flicker
846
+ * if we did not do this.
847
+ */
848
+ writeTask(() => {
849
+ this.setWorkingParts({
850
+ ...this.workingParts,
851
+ month,
852
+ day: day,
853
+ year,
854
+ });
855
+ calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
856
+ calendarBodyRef.style.removeProperty('overflow');
857
+ if (this.resolveForceDateScrolling) {
858
+ this.resolveForceDateScrolling();
859
+ }
860
+ const activeEl = this.el.shadowRoot.activeElement;
861
+ if (activeEl && activeEl.classList.contains('calendar-day')) {
862
+ activeEl.closest('.calendar-body')?.focus();
863
+ }
864
+ });
865
+ };
866
+ /**
867
+ * When the container finishes scrolling we
868
+ * need to update the DOM with the selected month.
869
+ */
870
+ let scrollTimeout;
871
+ /**
872
+ * We do not want to attempt to set pointer-events
873
+ * multiple times within a single swipe gesture as
874
+ * that adds unnecessary work to the main thread.
875
+ */
876
+ let appliediOSRubberBandFix = false;
877
+ const scrollCallback = () => {
878
+ if (scrollTimeout) {
879
+ clearTimeout(scrollTimeout);
880
+ }
881
+ /**
882
+ * On iOS it is possible to quickly rubber band
883
+ * the scroll area before the scroll timeout has fired.
884
+ * This results in users reaching the end of the scrollable
885
+ * container before the DOM has updated.
886
+ * By setting `pointer-events: none` we can ensure that
887
+ * subsequent swipes do not happen while the container
888
+ * is snapping.
889
+ */
890
+ if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
891
+ calendarBodyRef.style.setProperty('pointer-events', 'none');
892
+ appliediOSRubberBandFix = true;
893
+ }
894
+ // Wait ~3 frames
895
+ scrollTimeout = setTimeout(updateActiveMonth, 50);
896
+ };
897
+ calendarBodyRef.addEventListener('scroll', scrollCallback);
898
+ this.destroyCalendarListener = () => {
899
+ calendarBodyRef.removeEventListener('scroll', scrollCallback);
900
+ };
901
+ });
902
+ };
941
903
  connectedCallback() {
942
904
  this.clearFocusVisible = startFocusVisible(this.el).destroy;
943
905
  this.loadTimeout = setTimeout(() => {
@@ -951,10 +913,66 @@ export class Datetime {
951
913
  }
952
914
  this.loadTimeoutCleanup();
953
915
  }
916
+ /**
917
+ * Clean up all listeners except for the overlay
918
+ * listener. This is so that we can re-create the listeners
919
+ * if the datetime has been hidden/presented by a modal or popover.
920
+ */
921
+ destroyInteractionListeners = () => {
922
+ const { destroyCalendarListener, destroyKeyboardMO } = this;
923
+ if (destroyCalendarListener !== undefined) {
924
+ destroyCalendarListener();
925
+ }
926
+ if (destroyKeyboardMO !== undefined) {
927
+ destroyKeyboardMO();
928
+ }
929
+ };
954
930
  initializeListeners() {
955
931
  this.initializeCalendarListener();
956
932
  this.initializeKeyboardListeners();
957
933
  }
934
+ /**
935
+ * TODO(FW-6931): Remove this fallback upon solving the root cause
936
+ * Fallback to ensure the datetime becomes ready even if
937
+ * IntersectionObserver never reports it as intersecting.
938
+ *
939
+ * This is primarily used in environments where the observer
940
+ * might not fire as expected, such as when running under
941
+ * synthetic tests that stub IntersectionObserver.
942
+ */
943
+ ensureReadyIfVisible = () => {
944
+ if (this.el.classList.contains('datetime-ready')) {
945
+ return;
946
+ }
947
+ const rect = this.el.getBoundingClientRect();
948
+ if (rect.width === 0 || rect.height === 0) {
949
+ return;
950
+ }
951
+ this.markReady();
952
+ };
953
+ markReady = () => {
954
+ if (this.el.classList.contains('datetime-ready')) {
955
+ return;
956
+ }
957
+ this.initializeListeners();
958
+ /**
959
+ * TODO FW-2793: Datetime needs a frame to ensure that it
960
+ * can properly scroll contents into view. As a result
961
+ * we hide the scrollable content until after that frame
962
+ * so users do not see the content quickly shifting. The downside
963
+ * is that the content will pop into view a frame after. Maybe there
964
+ * is a better way to handle this?
965
+ */
966
+ writeTask(() => {
967
+ this.el.classList.add('datetime-ready');
968
+ });
969
+ };
970
+ loadTimeoutCleanup = () => {
971
+ if (this.loadTimeout) {
972
+ clearTimeout(this.loadTimeout);
973
+ this.loadTimeout = undefined;
974
+ }
975
+ };
958
976
  componentDidLoad() {
959
977
  const { el, intersectionTrackerRef } = this;
960
978
  /**
@@ -979,7 +997,7 @@ export class Datetime {
979
997
  * could cause the datetime to start at a visibility of 0, erroneously
980
998
  * triggering the `hiddenIO` observer below.
981
999
  */
982
- raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(intersectionTrackerRef));
1000
+ raf(() => visibleIO?.observe(intersectionTrackerRef));
983
1001
  /**
984
1002
  * TODO(FW-6931): Remove this fallback upon solving the root cause
985
1003
  * Fallback: If IntersectionObserver never reports that the
@@ -1025,7 +1043,7 @@ export class Datetime {
1025
1043
  });
1026
1044
  };
1027
1045
  const hiddenIO = new IntersectionObserver(hiddenCallback, { threshold: 0, root: el });
1028
- raf(() => hiddenIO === null || hiddenIO === void 0 ? void 0 : hiddenIO.observe(intersectionTrackerRef));
1046
+ raf(() => hiddenIO?.observe(intersectionTrackerRef));
1029
1047
  /**
1030
1048
  * Datetime uses Ionic components that emit
1031
1049
  * ionFocus and ionBlur. These events are
@@ -1098,6 +1116,119 @@ export class Datetime {
1098
1116
  this.ionRender.emit();
1099
1117
  });
1100
1118
  }
1119
+ processValue = (value) => {
1120
+ const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
1121
+ const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
1122
+ const { minParts, maxParts, workingParts, el } = this;
1123
+ this.warnIfIncorrectValueUsage();
1124
+ /**
1125
+ * Return early if the value wasn't parsed correctly, such as
1126
+ * if an improperly formatted date string was provided.
1127
+ */
1128
+ if (!valueToProcess) {
1129
+ return;
1130
+ }
1131
+ /**
1132
+ * Datetime should only warn of out of bounds values
1133
+ * if set by the user. If the `value` is undefined,
1134
+ * we will default to today's date which may be out
1135
+ * of bounds. In this case, the warning makes it look
1136
+ * like the developer did something wrong which is
1137
+ * not true.
1138
+ */
1139
+ if (hasValue) {
1140
+ warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
1141
+ }
1142
+ /**
1143
+ * If there are multiple values, clamp to the last one.
1144
+ * This is because the last value is the one that the user
1145
+ * has most recently interacted with.
1146
+ */
1147
+ const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
1148
+ const targetValue = clampDate(singleValue, minParts, maxParts);
1149
+ const { month, day, year, hour, minute } = targetValue;
1150
+ const ampm = parseAmPm(hour);
1151
+ /**
1152
+ * Since `activeParts` indicates a value that been explicitly selected
1153
+ * either by the user or the app, only update `activeParts` if the
1154
+ * `value` property is set.
1155
+ */
1156
+ if (hasValue) {
1157
+ if (Array.isArray(valueToProcess)) {
1158
+ this.activeParts = [...valueToProcess];
1159
+ }
1160
+ else {
1161
+ this.activeParts = {
1162
+ month,
1163
+ day,
1164
+ year,
1165
+ hour,
1166
+ minute,
1167
+ ampm,
1168
+ };
1169
+ }
1170
+ }
1171
+ else {
1172
+ /**
1173
+ * Reset the active parts if the value is not set.
1174
+ * This will clear the selected calendar day when
1175
+ * performing a clear action or using the reset() method.
1176
+ */
1177
+ this.activeParts = [];
1178
+ }
1179
+ const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
1180
+ const bodyIsVisible = el.classList.contains('datetime-ready');
1181
+ const { isGridStyle, showMonthAndYear } = this;
1182
+ if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
1183
+ /**
1184
+ * Only animate if:
1185
+ * 1. We're using grid style (wheel style pickers should just jump to new value)
1186
+ * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
1187
+ * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
1188
+ * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
1189
+ */
1190
+ this.animateToDate(targetValue);
1191
+ }
1192
+ else {
1193
+ this.setWorkingParts({
1194
+ month,
1195
+ day,
1196
+ year,
1197
+ hour,
1198
+ minute,
1199
+ ampm,
1200
+ });
1201
+ }
1202
+ };
1203
+ animateToDate = async (targetValue) => {
1204
+ const { workingParts } = this;
1205
+ /**
1206
+ * Tell other render functions that we need to force the
1207
+ * target month to appear in place of the actual next/prev month.
1208
+ * Because this is a State variable, a rerender will be triggered
1209
+ * automatically, updating the rendered months.
1210
+ */
1211
+ this.forceRenderDate = targetValue;
1212
+ /**
1213
+ * Flag that we've started scrolling to the forced date.
1214
+ * The resolve function will be called by the datetime's
1215
+ * scroll listener when it's done updating everything.
1216
+ * This is a replacement for making prev/nextMonth async,
1217
+ * since the logic we're waiting on is in a listener.
1218
+ */
1219
+ const forceDateScrollingPromise = new Promise((resolve) => {
1220
+ this.resolveForceDateScrolling = resolve;
1221
+ });
1222
+ /**
1223
+ * Animate smoothly to the forced month. This will also update
1224
+ * workingParts and correct the surrounding months for us.
1225
+ */
1226
+ const targetMonthIsBefore = isBefore(targetValue, workingParts);
1227
+ targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
1228
+ await forceDateScrollingPromise;
1229
+ this.resolveForceDateScrolling = undefined;
1230
+ this.forceRenderDate = undefined;
1231
+ };
1101
1232
  componentWillLoad() {
1102
1233
  const { el, formatOptions, highlightedDates, multiple, presentation, preferWheel } = this;
1103
1234
  if (multiple) {
@@ -1148,13 +1279,58 @@ export class Datetime {
1148
1279
  'interactive-disabled': this.disabled,
1149
1280
  });
1150
1281
  }
1282
+ onFocus = () => {
1283
+ this.ionFocus.emit();
1284
+ };
1285
+ onBlur = () => {
1286
+ this.ionBlur.emit();
1287
+ };
1288
+ hasValue = () => {
1289
+ return this.value != null;
1290
+ };
1291
+ nextMonth = () => {
1292
+ const calendarBodyRef = this.calendarBodyRef;
1293
+ if (!calendarBodyRef) {
1294
+ return;
1295
+ }
1296
+ const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
1297
+ if (!nextMonth) {
1298
+ return;
1299
+ }
1300
+ const left = nextMonth.offsetWidth * 2;
1301
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
1302
+ calendarBodyRef.scrollTo({
1303
+ top: 0,
1304
+ left: left * (isRTL(this.el) ? -1 : 1),
1305
+ behavior: scrollMode,
1306
+ });
1307
+ };
1308
+ prevMonth = () => {
1309
+ const calendarBodyRef = this.calendarBodyRef;
1310
+ if (!calendarBodyRef) {
1311
+ return;
1312
+ }
1313
+ const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
1314
+ if (!prevMonth) {
1315
+ return;
1316
+ }
1317
+ const left = prevMonth.offsetWidth * 2;
1318
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
1319
+ calendarBodyRef.scrollTo({
1320
+ top: 0,
1321
+ left: left * (isRTL(this.el) ? 1 : -1),
1322
+ behavior: scrollMode,
1323
+ });
1324
+ };
1325
+ toggleMonthAndYearView = () => {
1326
+ this.showMonthAndYear = !this.showMonthAndYear;
1327
+ };
1151
1328
  /**
1152
1329
  * Universal render methods
1153
1330
  * These are pieces of datetime that
1154
1331
  * are rendered independently of presentation.
1155
1332
  */
1156
1333
  renderFooter() {
1157
- const theme = getIonTheme(this);
1158
1334
  const { disabled, readonly, showDefaultButtons, showClearButton } = this;
1159
1335
  /**
1160
1336
  * The cancel, clear, and confirm buttons
@@ -1162,7 +1338,6 @@ export class Datetime {
1162
1338
  * is disabled or readonly.
1163
1339
  */
1164
1340
  const isButtonDisabled = disabled || readonly;
1165
- const confirmFill = theme === 'ionic' ? 'solid' : undefined;
1166
1341
  const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
1167
1342
  if (!hasSlottedButtons && !showDefaultButtons && !showClearButton) {
1168
1343
  return;
@@ -1181,7 +1356,7 @@ export class Datetime {
1181
1356
  return (h("div", { class: "datetime-footer" }, h("div", { class: "datetime-buttons" }, h("div", { class: {
1182
1357
  ['datetime-action-buttons']: true,
1183
1358
  ['has-clear-button']: this.showClearButton,
1184
- } }, 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))))))));
1359
+ } }, 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)))))))));
1185
1360
  }
1186
1361
  /**
1187
1362
  * Wheel picker render methods
@@ -1248,7 +1423,10 @@ export class Datetime {
1248
1423
  catch (e) {
1249
1424
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1250
1425
  }
1251
- return Object.assign(Object.assign({}, itemObject), { disabled });
1426
+ return {
1427
+ ...itemObject,
1428
+ disabled,
1429
+ };
1252
1430
  });
1253
1431
  }
1254
1432
  /**
@@ -1261,10 +1439,16 @@ export class Datetime {
1261
1439
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a date", class: "date-column", color: this.color, disabled: disabled, value: todayString, onIonChange: (ev) => {
1262
1440
  const { value } = ev.detail;
1263
1441
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1264
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
1265
- this.setActiveParts(Object.assign(Object.assign({}, activePart), findPart));
1442
+ this.setWorkingParts({
1443
+ ...workingParts,
1444
+ ...findPart,
1445
+ });
1446
+ this.setActiveParts({
1447
+ ...activePart,
1448
+ ...findPart,
1449
+ });
1266
1450
  ev.stopPropagation();
1267
- } }, items.map((item) => (h("ion-picker-column-option", { part: item.value === todayString ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: item.value, disabled: item.disabled, value: item.value }, item.text)))));
1451
+ } }, items.map((item) => (h("ion-picker-column-option", { color: this.color, part: item.value === todayString ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: item.value, disabled: item.disabled, value: item.value }, item.text)))));
1268
1452
  }
1269
1453
  renderIndividualDatePickerColumns(forcePresentation) {
1270
1454
  const { workingParts, isDateEnabled } = this;
@@ -1297,7 +1481,10 @@ export class Datetime {
1297
1481
  catch (e) {
1298
1482
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1299
1483
  }
1300
- return Object.assign(Object.assign({}, dayObject), { disabled });
1484
+ return {
1485
+ ...dayObject,
1486
+ disabled,
1487
+ };
1301
1488
  });
1302
1489
  }
1303
1490
  const shouldRenderYears = forcePresentation !== 'month' && forcePresentation !== 'time';
@@ -1326,18 +1513,23 @@ export class Datetime {
1326
1513
  return renderArray;
1327
1514
  }
1328
1515
  renderDayPickerColumn(days) {
1329
- var _a;
1330
1516
  if (days.length === 0) {
1331
1517
  return [];
1332
1518
  }
1333
1519
  const { disabled, workingParts } = this;
1334
1520
  const activePart = this.getActivePartsWithFallback();
1335
- const pickerColumnValue = (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined;
1521
+ const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
1336
1522
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day", class: "day-column", color: this.color, disabled: disabled, value: pickerColumnValue, onIonChange: (ev) => {
1337
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1338
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1523
+ this.setWorkingParts({
1524
+ ...workingParts,
1525
+ day: ev.detail.value,
1526
+ });
1527
+ this.setActiveParts({
1528
+ ...activePart,
1529
+ day: ev.detail.value,
1530
+ });
1339
1531
  ev.stopPropagation();
1340
- } }, days.map((day) => (h("ion-picker-column-option", { part: day.value === pickerColumnValue ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: day.value, disabled: day.disabled, value: day.value }, day.text)))));
1532
+ } }, days.map((day) => (h("ion-picker-column-option", { color: this.color, part: day.value === pickerColumnValue ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: day.value, disabled: day.disabled, value: day.value }, day.text)))));
1341
1533
  }
1342
1534
  renderMonthPickerColumn(months) {
1343
1535
  if (months.length === 0) {
@@ -1346,13 +1538,19 @@ export class Datetime {
1346
1538
  const { disabled, workingParts } = this;
1347
1539
  const activePart = this.getActivePartsWithFallback();
1348
1540
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a month", class: "month-column", color: this.color, disabled: disabled, value: workingParts.month, onIonChange: (ev) => {
1349
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1541
+ this.setWorkingParts({
1542
+ ...workingParts,
1543
+ month: ev.detail.value,
1544
+ });
1350
1545
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1351
1546
  if (!this.multiple) {
1352
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1547
+ this.setActiveParts({
1548
+ ...activePart,
1549
+ month: ev.detail.value,
1550
+ });
1353
1551
  }
1354
1552
  ev.stopPropagation();
1355
- } }, months.map((month) => (h("ion-picker-column-option", { part: month.value === workingParts.month ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: month.value, disabled: month.disabled, value: month.value }, month.text)))));
1553
+ } }, months.map((month) => (h("ion-picker-column-option", { color: this.color, part: month.value === workingParts.month ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: month.value, disabled: month.disabled, value: month.value }, month.text)))));
1356
1554
  }
1357
1555
  renderYearPickerColumn(years) {
1358
1556
  if (years.length === 0) {
@@ -1361,13 +1559,19 @@ export class Datetime {
1361
1559
  const { disabled, workingParts } = this;
1362
1560
  const activePart = this.getActivePartsWithFallback();
1363
1561
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a year", class: "year-column", color: this.color, disabled: disabled, value: workingParts.year, onIonChange: (ev) => {
1364
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1562
+ this.setWorkingParts({
1563
+ ...workingParts,
1564
+ year: ev.detail.value,
1565
+ });
1365
1566
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1366
1567
  if (!this.multiple) {
1367
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1568
+ this.setActiveParts({
1569
+ ...activePart,
1570
+ year: ev.detail.value,
1571
+ });
1368
1572
  }
1369
1573
  ev.stopPropagation();
1370
- } }, years.map((year) => (h("ion-picker-column-option", { part: year.value === workingParts.year ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: year.value, disabled: year.disabled, value: year.value }, year.text)))));
1574
+ } }, years.map((year) => (h("ion-picker-column-option", { color: this.color, part: year.value === workingParts.year ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: year.value, disabled: year.disabled, value: year.value }, year.text)))));
1371
1575
  }
1372
1576
  renderTimePickerColumns(forcePresentation) {
1373
1577
  if (['date', 'month', 'month-year', 'year'].includes(forcePresentation)) {
@@ -1397,10 +1601,16 @@ export class Datetime {
1397
1601
  return [];
1398
1602
  const activePart = this.getActivePartsWithFallback();
1399
1603
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select an hour", color: this.color, disabled: disabled, value: activePart.hour, numericInput: true, onIonChange: (ev) => {
1400
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1401
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { hour: ev.detail.value }));
1604
+ this.setWorkingParts({
1605
+ ...workingParts,
1606
+ hour: ev.detail.value,
1607
+ });
1608
+ this.setActiveParts({
1609
+ ...this.getActivePartsWithFallback(),
1610
+ hour: ev.detail.value,
1611
+ });
1402
1612
  ev.stopPropagation();
1403
- } }, hoursData.map((hour) => (h("ion-picker-column-option", { part: hour.value === activePart.hour ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: hour.value, disabled: hour.disabled, value: hour.value }, hour.text)))));
1613
+ } }, hoursData.map((hour) => (h("ion-picker-column-option", { color: this.color, part: hour.value === activePart.hour ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: hour.value, disabled: hour.disabled, value: hour.value }, hour.text)))));
1404
1614
  }
1405
1615
  renderMinutePickerColumn(minutesData) {
1406
1616
  const { disabled, workingParts } = this;
@@ -1408,10 +1618,16 @@ export class Datetime {
1408
1618
  return [];
1409
1619
  const activePart = this.getActivePartsWithFallback();
1410
1620
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a minute", color: this.color, disabled: disabled, value: activePart.minute, numericInput: true, onIonChange: (ev) => {
1411
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1412
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { minute: ev.detail.value }));
1621
+ this.setWorkingParts({
1622
+ ...workingParts,
1623
+ minute: ev.detail.value,
1624
+ });
1625
+ this.setActiveParts({
1626
+ ...this.getActivePartsWithFallback(),
1627
+ minute: ev.detail.value,
1628
+ });
1413
1629
  ev.stopPropagation();
1414
- } }, minutesData.map((minute) => (h("ion-picker-column-option", { part: minute.value === activePart.minute ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: minute.value, disabled: minute.disabled, value: minute.value }, minute.text)))));
1630
+ } }, minutesData.map((minute) => (h("ion-picker-column-option", { color: this.color, part: minute.value === activePart.minute ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: minute.value, disabled: minute.disabled, value: minute.value }, minute.text)))));
1415
1631
  }
1416
1632
  renderDayPeriodPickerColumn(dayPeriodData) {
1417
1633
  const { disabled, workingParts } = this;
@@ -1422,10 +1638,18 @@ export class Datetime {
1422
1638
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1423
1639
  return (h("ion-picker-column", { part: WHEEL_PART, "aria-label": "Select a day period", style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, disabled: disabled, value: activePart.ampm, onIonChange: (ev) => {
1424
1640
  const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1425
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1426
- this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { ampm: ev.detail.value, hour }));
1641
+ this.setWorkingParts({
1642
+ ...workingParts,
1643
+ ampm: ev.detail.value,
1644
+ hour,
1645
+ });
1646
+ this.setActiveParts({
1647
+ ...this.getActivePartsWithFallback(),
1648
+ ampm: ev.detail.value,
1649
+ hour,
1650
+ });
1427
1651
  ev.stopPropagation();
1428
- } }, dayPeriodData.map((dayPeriod) => (h("ion-picker-column-option", { part: dayPeriod.value === activePart.ampm ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: dayPeriod.value, disabled: dayPeriod.disabled, value: dayPeriod.value }, dayPeriod.text)))));
1652
+ } }, dayPeriodData.map((dayPeriod) => (h("ion-picker-column-option", { color: this.color, part: dayPeriod.value === activePart.ampm ? `${WHEEL_ITEM_PART} ${WHEEL_ITEM_ACTIVE_PART}` : WHEEL_ITEM_PART, key: dayPeriod.value, disabled: dayPeriod.disabled, value: dayPeriod.value }, dayPeriod.text)))));
1429
1653
  }
1430
1654
  renderWheelView(forcePresentation) {
1431
1655
  const { locale } = this;
@@ -1438,8 +1662,10 @@ export class Datetime {
1438
1662
  /**
1439
1663
  * Grid Render Methods
1440
1664
  */
1441
- renderCalendarHeader(theme) {
1442
- const { disabled, datetimeNextIcon, datetimePreviousIcon, datetimeCollapsedIcon, datetimeExpandedIcon } = this;
1665
+ renderCalendarHeader(mode) {
1666
+ const { disabled } = this;
1667
+ const expandedIcon = mode === 'ios' ? chevronDown : caretUpSharp;
1668
+ const collapsedIcon = mode === 'ios' ? chevronForward : caretDownSharp;
1443
1669
  const prevMonthDisabled = disabled || isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1444
1670
  const nextMonthDisabled = disabled || isNextMonthDisabled(this.workingParts, this.maxParts);
1445
1671
  // don't use the inheritAttributes util because it removes dir from the host, and we still need that
@@ -1448,7 +1674,7 @@ export class Datetime {
1448
1674
  'calendar-month-year-toggle': true,
1449
1675
  'ion-activatable': true,
1450
1676
  'ion-focusable': true,
1451
- }, 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) => {
1677
+ }, 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) => {
1452
1678
  return h("div", { class: "day-of-week" }, d);
1453
1679
  }))));
1454
1680
  }
@@ -1467,8 +1693,8 @@ export class Datetime {
1467
1693
  // The day is not used when checking if a month is disabled.
1468
1694
  // Users should be able to access the min or max month, even if the
1469
1695
  // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1470
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1471
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1696
+ minParts: { ...this.minParts, day: null },
1697
+ maxParts: { ...this.maxParts, day: null },
1472
1698
  });
1473
1699
  // The working month should never have swipe disabled.
1474
1700
  // Otherwise the CSS scroll snap will not work and the user
@@ -1577,18 +1803,24 @@ export class Datetime {
1577
1803
  if (isAdjacentDay) {
1578
1804
  // The user selected a day outside the current month. Ignore this button, as the month will be re-rendered.
1579
1805
  this.el.blur();
1580
- this.activeParts = Object.assign(Object.assign({}, activePart), referenceParts);
1806
+ this.activeParts = { ...activePart, ...referenceParts };
1581
1807
  this.animateToDate(referenceParts);
1582
1808
  this.confirm();
1583
1809
  }
1584
1810
  else {
1585
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), referenceParts));
1811
+ this.setWorkingParts({
1812
+ ...this.workingParts,
1813
+ ...referenceParts,
1814
+ });
1586
1815
  // Multiple only needs date info so we can wipe out other fields like time.
1587
1816
  if (multiple) {
1588
1817
  this.setActiveParts(referenceParts, isActive);
1589
1818
  }
1590
1819
  else {
1591
- this.setActiveParts(Object.assign(Object.assign({}, activePart), referenceParts));
1820
+ this.setActiveParts({
1821
+ ...activePart,
1822
+ ...referenceParts,
1823
+ });
1592
1824
  }
1593
1825
  }
1594
1826
  }
@@ -1600,8 +1832,8 @@ export class Datetime {
1600
1832
  return this.renderMonth(month, year);
1601
1833
  })));
1602
1834
  }
1603
- renderCalendar(theme) {
1604
- return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(theme), this.renderCalendarBody()));
1835
+ renderCalendar(mode) {
1836
+ return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(mode), this.renderCalendarBody()));
1605
1837
  }
1606
1838
  renderTimeLabel() {
1607
1839
  const hasSlottedTimeLabel = this.el.querySelector('[slot="time-label"]') !== null;
@@ -1631,7 +1863,7 @@ export class Datetime {
1631
1863
  await popoverRef.onWillDismiss();
1632
1864
  this.isTimePopoverOpen = false;
1633
1865
  }
1634
- } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.time)),
1866
+ } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions?.time)),
1635
1867
  h("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
1636
1868
  /**
1637
1869
  * Intersection Observers do not consistently fire between Blink and Webkit
@@ -1654,7 +1886,6 @@ export class Datetime {
1654
1886
  ];
1655
1887
  }
1656
1888
  getHeaderSelectedDateText() {
1657
- var _a;
1658
1889
  const { activeParts, formatOptions, multiple, titleSelectedDatesFormatter } = this;
1659
1890
  const isArray = Array.isArray(activeParts);
1660
1891
  let headerText;
@@ -1671,7 +1902,7 @@ export class Datetime {
1671
1902
  }
1672
1903
  else {
1673
1904
  // for exactly 1 day selected (multiple set or not), show a formatted version of that
1674
- headerText = getLocalizedDateTime(this.locale, this.getActivePartsWithFallback(), (_a = formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.date) !== null && _a !== void 0 ? _a : { weekday: 'short', month: 'short', day: 'numeric' });
1905
+ headerText = getLocalizedDateTime(this.locale, this.getActivePartsWithFallback(), formatOptions?.date ?? { weekday: 'short', month: 'short', day: 'numeric' });
1675
1906
  }
1676
1907
  return headerText;
1677
1908
  }
@@ -1709,7 +1940,7 @@ export class Datetime {
1709
1940
  * Render entry point
1710
1941
  * All presentation types are rendered from here.
1711
1942
  */
1712
- renderDatetime(theme) {
1943
+ renderDatetime(mode) {
1713
1944
  const { presentation, preferWheel } = this;
1714
1945
  /**
1715
1946
  * Certain presentation types have separate grid and wheel displays.
@@ -1723,7 +1954,7 @@ export class Datetime {
1723
1954
  case 'date-time':
1724
1955
  return [
1725
1956
  this.renderHeader(),
1726
- this.renderCalendar(theme),
1957
+ this.renderCalendar(mode),
1727
1958
  this.renderCalendarViewMonthYearPicker(),
1728
1959
  this.renderTime(),
1729
1960
  this.renderFooter(),
@@ -1732,7 +1963,7 @@ export class Datetime {
1732
1963
  return [
1733
1964
  this.renderHeader(),
1734
1965
  this.renderTime(),
1735
- this.renderCalendar(theme),
1966
+ this.renderCalendar(mode),
1736
1967
  this.renderCalendarViewMonthYearPicker(),
1737
1968
  this.renderFooter(),
1738
1969
  ];
@@ -1745,119 +1976,47 @@ export class Datetime {
1745
1976
  default:
1746
1977
  return [
1747
1978
  this.renderHeader(),
1748
- this.renderCalendar(theme),
1979
+ this.renderCalendar(mode),
1749
1980
  this.renderCalendarViewMonthYearPicker(),
1750
1981
  this.renderFooter(),
1751
1982
  ];
1752
1983
  }
1753
1984
  }
1754
- /**
1755
- * Get the icon to use for the next icon.
1756
- * Otherwise, use the icon set in the config.
1757
- * If no icon is set in the config, use the default icon.
1758
- */
1759
- get datetimeNextIcon() {
1760
- // Determine the theme and map to default icons
1761
- const theme = getIonTheme(this);
1762
- const defaultIcons = {
1763
- ios: chevronForward,
1764
- ionic: caretRightRegular,
1765
- md: chevronForward,
1766
- };
1767
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1768
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1769
- // Return the configured datetime next icon or the default icon
1770
- return config.get('datetimeNextIcon', defaultIcon);
1771
- }
1772
- /**
1773
- * Get the icon to use for the previous icon.
1774
- * Otherwise, use the icon set in the config.
1775
- * If no icon is set in the config, use the default icon.
1776
- */
1777
- get datetimePreviousIcon() {
1778
- // Determine the theme and map to default icons
1779
- const theme = getIonTheme(this);
1780
- const defaultIcons = {
1781
- ios: chevronBack,
1782
- ionic: caretLeftRegular,
1783
- md: chevronBack,
1784
- };
1785
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1786
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1787
- // Return the configured datetime previous icon or the default icon
1788
- return config.get('datetimePreviousIcon', defaultIcon);
1789
- }
1790
- /**
1791
- * Get the icon to use for the show month and year icon.
1792
- * Otherwise, use the icon set in the config.
1793
- * If no icon is set in the config, use the default icon.
1794
- */
1795
- get datetimeCollapsedIcon() {
1796
- // Determine the theme and map to default icons
1797
- const theme = getIonTheme(this);
1798
- const defaultIcons = {
1799
- ios: chevronForward,
1800
- ionic: undefined,
1801
- md: caretDownSharp,
1802
- };
1803
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1804
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1805
- // Return the configured datetime show month and year icon or the default icon
1806
- return config.get('datetimeCollapsedIcon', defaultIcon);
1807
- }
1808
- /**
1809
- * Get the icon to use for the hide month and year icon.
1810
- * Otherwise, use the icon set in the config.
1811
- * If no icon is set in the config, use the default icon.
1812
- */
1813
- get datetimeExpandedIcon() {
1814
- // Determine the theme and map to default icons
1815
- const theme = getIonTheme(this);
1816
- const defaultIcons = {
1817
- ios: chevronDown,
1818
- ionic: undefined,
1819
- md: caretUpSharp,
1820
- };
1821
- // Get the default icon based on the theme, falling back to 'md' icon if necessary
1822
- const defaultIcon = defaultIcons[theme] || defaultIcons.md;
1823
- // Return the configured datetime hide month and year icon or the default icon
1824
- return config.get('datetimeExpandedIcon', defaultIcon);
1825
- }
1826
1985
  render() {
1827
1986
  const { name, value, disabled, el, color, readonly, showMonthAndYear, preferWheel, presentation, size, isGridStyle, } = this;
1828
- const theme = getIonTheme(this);
1987
+ const mode = getIonMode(this);
1829
1988
  const isMonthAndYearPresentation = presentation === 'year' || presentation === 'month' || presentation === 'month-year';
1830
1989
  const shouldShowMonthAndYear = showMonthAndYear || isMonthAndYearPresentation;
1831
1990
  const monthYearPickerOpen = showMonthAndYear && !isMonthAndYearPresentation;
1832
1991
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1833
1992
  const hasWheelVariant = hasDatePresentation && preferWheel;
1834
1993
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1835
- return (h(Host, { key: '04fb1740b1d722d20cdbb32b19d9a3b7d3334db0', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1836
- [theme]: true,
1837
- ['datetime-readonly']: readonly,
1838
- ['datetime-disabled']: disabled,
1839
- 'show-month-and-year': shouldShowMonthAndYear,
1840
- 'month-year-picker-open': monthYearPickerOpen,
1841
- [`datetime-presentation-${presentation}`]: true,
1842
- [`datetime-size-${size}`]: true,
1843
- [`datetime-prefer-wheel`]: hasWheelVariant,
1844
- [`datetime-grid`]: isGridStyle,
1845
- })) }, h("div", { key: '0cbb85b4c71e521c81b37a98da0123a1c3a15fac', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(theme)));
1994
+ return (h(Host, { key: 'd8e6dfe5e3bffb1c38a3e37b63b3aec099f40d29', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: {
1995
+ ...createColorClasses(color, {
1996
+ [mode]: true,
1997
+ ['datetime-readonly']: readonly,
1998
+ ['datetime-disabled']: disabled,
1999
+ 'show-month-and-year': shouldShowMonthAndYear,
2000
+ 'month-year-picker-open': monthYearPickerOpen,
2001
+ [`datetime-presentation-${presentation}`]: true,
2002
+ [`datetime-size-${size}`]: true,
2003
+ [`datetime-prefer-wheel`]: hasWheelVariant,
2004
+ [`datetime-grid`]: isGridStyle,
2005
+ }),
2006
+ } }, h("div", { key: '20889d3c68dd5109633c0e214411a63d6f3025bb', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1846
2007
  }
1847
2008
  static get is() { return "ion-datetime"; }
1848
2009
  static get encapsulation() { return "shadow"; }
1849
2010
  static get originalStyleUrls() {
1850
2011
  return {
1851
2012
  "ios": ["datetime.ios.scss"],
1852
- "md": ["datetime.md.scss"],
1853
- "ionic": ["datetime.ionic.scss"]
2013
+ "md": ["datetime.md.scss"]
1854
2014
  };
1855
2015
  }
1856
2016
  static get styleUrls() {
1857
2017
  return {
1858
2018
  "ios": ["datetime.ios.css"],
1859
- "md": ["datetime.md.css"],
1860
- "ionic": ["datetime.ionic.css"]
2019
+ "md": ["datetime.md.css"]
1861
2020
  };
1862
2021
  }
1863
2022
  static get properties() {
@@ -1886,8 +2045,7 @@ export class Datetime {
1886
2045
  "getter": false,
1887
2046
  "setter": false,
1888
2047
  "reflect": false,
1889
- "attribute": "color",
1890
- "defaultValue": "'primary'"
2048
+ "attribute": "color"
1891
2049
  },
1892
2050
  "name": {
1893
2051
  "type": "string",