@ionic/core 8.8.20-dev.11787158518.168a2fea → 8.8.20-dev.11789504012.1a675914

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 (1221) 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-divider.d.ts +11 -0
  27. package/components/ion-divider.js +4 -0
  28. package/components/ion-fab-button.js +1 -1
  29. package/components/ion-fab-list.js +1 -1
  30. package/components/ion-fab.js +1 -1
  31. package/components/ion-footer.js +1 -1
  32. package/components/ion-gallery-item.d.ts +11 -0
  33. package/components/ion-gallery-item.js +4 -0
  34. package/components/ion-gallery.d.ts +11 -0
  35. package/components/ion-gallery.js +4 -0
  36. package/components/ion-grid.js +1 -1
  37. package/components/ion-header.js +1 -1
  38. package/components/ion-icon.js +1 -1
  39. package/components/ion-img.js +1 -1
  40. package/components/ion-infinite-scroll-content.js +1 -1
  41. package/components/ion-infinite-scroll.js +1 -1
  42. package/components/ion-input-otp.js +1 -1
  43. package/components/ion-input-password-toggle.js +1 -1
  44. package/components/ion-input.js +1 -1
  45. package/components/ion-item-divider.js +1 -1
  46. package/components/ion-item-group.js +1 -1
  47. package/components/ion-item-option.js +1 -1
  48. package/components/ion-item-options.js +1 -1
  49. package/components/ion-item-sliding.js +1 -1
  50. package/components/ion-item.js +1 -1
  51. package/components/ion-label.js +1 -1
  52. package/components/ion-list-header.js +1 -1
  53. package/components/ion-list.js +1 -1
  54. package/components/ion-loading.js +1 -1
  55. package/components/ion-menu-button.js +1 -1
  56. package/components/ion-menu-toggle.js +1 -1
  57. package/components/ion-menu.js +1 -1
  58. package/components/ion-modal.js +1 -1
  59. package/components/ion-nav-link.js +1 -1
  60. package/components/ion-nav.js +1 -1
  61. package/components/ion-note.js +1 -1
  62. package/components/ion-picker-column-option.js +1 -1
  63. package/components/ion-picker-column.js +1 -1
  64. package/components/ion-picker-legacy-column.d.ts +11 -0
  65. package/components/ion-picker-legacy-column.js +4 -0
  66. package/components/ion-picker-legacy.d.ts +11 -0
  67. package/components/ion-picker-legacy.js +4 -0
  68. package/components/ion-picker.js +1 -1
  69. package/components/ion-popover.js +1 -1
  70. package/components/ion-progress-bar.js +1 -1
  71. package/components/ion-radio-group.js +1 -1
  72. package/components/ion-radio.js +1 -1
  73. package/components/ion-range.js +1 -1
  74. package/components/ion-refresher-content.js +1 -1
  75. package/components/ion-refresher.js +1 -1
  76. package/components/ion-reorder-group.js +1 -1
  77. package/components/ion-reorder.js +1 -1
  78. package/components/ion-ripple-effect.js +1 -1
  79. package/components/ion-route-redirect.js +1 -1
  80. package/components/ion-route.js +1 -1
  81. package/components/ion-router-link.js +1 -1
  82. package/components/ion-router-outlet.js +1 -1
  83. package/components/ion-router.js +1 -1
  84. package/components/ion-row.js +1 -1
  85. package/components/ion-searchbar.js +1 -1
  86. package/components/ion-segment-button.js +1 -1
  87. package/components/ion-segment-content.js +1 -1
  88. package/components/ion-segment-view.js +1 -1
  89. package/components/ion-segment.js +1 -1
  90. package/components/ion-select-modal.js +1 -1
  91. package/components/ion-select-option.js +1 -1
  92. package/components/ion-select-popover.js +1 -1
  93. package/components/ion-select.js +1 -1
  94. package/components/ion-skeleton-text.js +1 -1
  95. package/components/ion-spinner.js +1 -1
  96. package/components/ion-split-pane.js +1 -1
  97. package/components/ion-tab-bar.js +1 -1
  98. package/components/ion-tab-button.js +1 -1
  99. package/components/ion-tab.js +1 -1
  100. package/components/ion-tabs.js +1 -1
  101. package/components/ion-text.js +1 -1
  102. package/components/ion-textarea.js +1 -1
  103. package/components/ion-thumbnail.js +1 -1
  104. package/components/ion-title.js +1 -1
  105. package/components/ion-toast.js +1 -1
  106. package/components/ion-toggle.js +1 -1
  107. package/components/ion-toolbar.js +1 -1
  108. package/components/p-0MMiHJhx.js +4 -0
  109. package/components/p-0rXxxCTt.js +4 -0
  110. package/components/{p-DwpKZ6rl.js → p-B2SvA6NE.js} +1 -1
  111. package/components/p-B4GJERAm.js +4 -0
  112. package/components/p-B9_sPaDw.js +4 -0
  113. package/components/p-BE21dB_a.js +4 -0
  114. package/components/p-BJyeT56g.js +4 -0
  115. package/components/p-BTBa_wH7.js +4 -0
  116. package/components/p-BTEOs1at.js +4 -0
  117. package/components/p-BU8Blvqg.js +4 -0
  118. package/components/p-BXXTyrCp.js +4 -0
  119. package/components/p-BXjGM4gW.js +4 -0
  120. package/components/p-BXuZo5-p.js +4 -0
  121. package/components/p-BYRVyMu9.js +4 -0
  122. package/components/{p-ryyf_ItD.js → p-BZwQa9ey.js} +1 -1
  123. package/components/p-BZxBDeEU.js +4 -0
  124. package/components/p-BcWO94Sl.js +4 -0
  125. package/components/p-BjW8SOqw.js +4 -0
  126. package/components/p-Br6q6Rgq.js +4 -0
  127. package/components/p-BwKpO3Is.js +4 -0
  128. package/components/p-BwzRqsq1.js +4 -0
  129. package/components/p-C-cw-bM-.js +4 -0
  130. package/components/p-C0K6CGg9.js +4 -0
  131. package/components/p-C2J-Hvv3.js +4 -0
  132. package/components/p-C3ydXg9O.js +4 -0
  133. package/components/p-C5Bnq_Hm.js +4 -0
  134. package/components/p-C5JYXyPD.js +4 -0
  135. package/components/p-C898H5L0.js +4 -0
  136. package/components/p-C8kcgEG7.js +4 -0
  137. package/components/p-CEz0vNHD.js +4 -0
  138. package/components/p-CH8ypgvS.js +4 -0
  139. package/components/{p-CMLAwl_N.js → p-CKLXmqy1.js} +1 -1
  140. package/components/p-CMtmHGrE.js +4 -0
  141. package/components/p-CNlz8OTE.js +4 -0
  142. package/components/p-CODBQrPj.js +4 -0
  143. package/components/p-CToV3-ig.js +4 -0
  144. package/components/p-CV7PNBGr.js +4 -0
  145. package/components/p-CVYFPBs-.js +4 -0
  146. package/components/p-CgbD1udy.js +4 -0
  147. package/components/p-CjlmHeGM.js +4 -0
  148. package/components/p-ClTdIlic.js +4 -0
  149. package/components/p-CstXr-x9.js +4 -0
  150. package/components/{p-DzRT60Tw.js → p-Cu8FoYIJ.js} +1 -1
  151. package/components/p-CxhjkdQ_.js +4 -0
  152. package/components/p-D0Iqw6OZ.js +4 -0
  153. package/components/p-D12Xsfh7.js +4 -0
  154. package/components/p-DExJ63jR.js +4 -0
  155. package/components/p-DHvfufkW.js +4 -0
  156. package/components/p-DRUGmlKi.js +4 -0
  157. package/components/p-DYq-5riI.js +4 -0
  158. package/components/p-DaJxRxSQ.js +4 -0
  159. package/components/p-Db3A3kHi.js +4 -0
  160. package/components/p-Df6AAcu8.js +4 -0
  161. package/components/p-Dh1f5tAK.js +4 -0
  162. package/components/{p-63OhffQv.js → p-Di8NbWfs.js} +1 -1
  163. package/components/p-DqkLOArC.js +4 -0
  164. package/components/p-DriGEn08.js +4 -0
  165. package/components/p-DylrHLJF.js +4 -0
  166. package/components/p-WeNgVmOy.js +4 -0
  167. package/components/p-Wn4ujuPW.js +4 -0
  168. package/components/p-X6YgGSBf.js +4 -0
  169. package/components/p-dLA3JnNJ.js +4 -0
  170. package/components/p-eRqVSlkn.js +4 -0
  171. package/components/p-fUXE2zLc.js +4 -0
  172. package/components/p-o8OKV5aD.js +4 -0
  173. package/components/p-pztWcmzj.js +4 -0
  174. package/components/p-vXpMhGrs.js +4 -0
  175. package/css/core.css +1 -1
  176. package/css/core.css.map +1 -1
  177. package/css/display.css +1 -1
  178. package/css/display.css.map +1 -1
  179. package/css/flex-utils.css +1 -1
  180. package/css/flex-utils.css.map +1 -1
  181. package/css/float-elements.css.map +1 -1
  182. package/css/global.bundle.css.map +1 -1
  183. package/css/ionic/bundle.ionic.css +1 -0
  184. package/css/ionic/bundle.ionic.css.map +1 -0
  185. package/css/ionic/core.ionic.css +1 -0
  186. package/css/ionic/core.ionic.css.map +1 -0
  187. package/css/ionic/global.bundle.ionic.css +1 -0
  188. package/css/ionic/global.bundle.ionic.css.map +1 -0
  189. package/css/ionic/ionic-swiper.ionic.css +1 -0
  190. package/css/ionic/ionic-swiper.ionic.css.map +1 -0
  191. package/css/ionic/link.ionic.css +1 -0
  192. package/css/ionic/link.ionic.css.map +1 -0
  193. package/css/ionic/structure.ionic.css +1 -0
  194. package/css/ionic/structure.ionic.css.map +1 -0
  195. package/css/ionic/typography.ionic.css +1 -0
  196. package/css/ionic/typography.ionic.css.map +1 -0
  197. package/css/ionic/utils.bundle.ionic.css +1 -0
  198. package/css/ionic/utils.bundle.ionic.css.map +1 -0
  199. package/css/ionic-swiper.css +1 -1
  200. package/css/ionic-swiper.css.map +1 -1
  201. package/css/ionic.bundle.css +1 -1
  202. package/css/ionic.bundle.css.map +1 -1
  203. package/css/normalize.css.map +1 -1
  204. package/css/padding.css.map +1 -1
  205. package/css/palettes/dark.always.css.map +1 -1
  206. package/css/palettes/dark.class.css.map +1 -1
  207. package/css/palettes/dark.system.css.map +1 -1
  208. package/css/palettes/high-contrast-dark.always.css.map +1 -1
  209. package/css/palettes/high-contrast-dark.class.css.map +1 -1
  210. package/css/palettes/high-contrast-dark.system.css.map +1 -1
  211. package/css/palettes/high-contrast.always.css.map +1 -1
  212. package/css/palettes/high-contrast.class.css.map +1 -1
  213. package/css/palettes/high-contrast.system.css.map +1 -1
  214. package/css/structure.css.map +1 -1
  215. package/css/text-alignment.css.map +1 -1
  216. package/css/text-transformation.css.map +1 -1
  217. package/css/typography.css.map +1 -1
  218. package/css/utils.bundle.css +1 -1
  219. package/css/utils.bundle.css.map +1 -1
  220. package/dist/cjs/{animation-C0mOHzej.js → animation-CxRPIayb.js} +6 -6
  221. package/dist/cjs/{app-globals-BREG4twP.js → app-globals-BwvlV6g7.js} +1 -1
  222. package/dist/cjs/{button-active-CVMevT9a.js → button-active-qCQDwE2m.js} +3 -3
  223. package/dist/cjs/{capacitor-DmA66EwP.js → capacitor-CRl0exFC.js} +3 -3
  224. package/dist/cjs/clear-button-press-controller-C7B9kyMa.js +45 -0
  225. package/dist/cjs/{config-CjUbvdPW.js → config-DWdFbSNK.js} +4 -5
  226. package/dist/cjs/{dir-zwDPRE5K.js → dir-DD0jPVH3.js} +3 -2
  227. package/dist/cjs/{focus-visible-CCvKiLh3.js → focus-visible-BIj-I3-C.js} +24 -0
  228. package/dist/cjs/{format-pp0Du3K-.js → format-COAsdjOc.js} +30 -40
  229. package/dist/cjs/{framework-delegate-Dfo5XsGv.js → framework-delegate-IvkF1VuM.js} +10 -6
  230. package/dist/cjs/{gesture-controller-BDUH7687.js → gesture-controller-dtqlP_q4.js} +8 -15
  231. package/dist/cjs/{haptic-Ch-X4gRx.js → haptic-DG25gZzb.js} +4 -3
  232. package/dist/cjs/{helpers-YPQybDph.js → helpers-Dhimwhpn.js} +74 -7
  233. package/dist/cjs/{index-DwlRtFZe.js → index-BJ2-LydH.js} +3 -9
  234. package/dist/cjs/{index-zVCah4Uz.js → index-Bsq0SbXc.js} +2 -2
  235. package/dist/cjs/{index-uvry__L4.js → index-C1knGA9x.js} +65 -33
  236. package/dist/cjs/{index-wOmugbdg.js → index-CxDnX7hd.js} +2 -0
  237. package/dist/cjs/{index-DXsPSne6.js → index-DhDV4RxJ.js} +16 -15
  238. package/dist/cjs/{index-BLdJCcJY.js → index-DuleInoh.js} +5 -5
  239. package/dist/cjs/{index-B7zJsYWS.js → index-YYUVCfP-.js} +3 -3
  240. package/dist/cjs/{index-DDg31ZF5.js → index-yon1HGB7.js} +10 -9
  241. package/dist/cjs/index.cjs.js +18 -18
  242. package/dist/cjs/{input-shims-Cbu1fcye.js → input-shims-BgJcHtqI.js} +23 -20
  243. package/dist/cjs/input.utils--RmR5lVe.js +150 -0
  244. package/dist/cjs/ion-accordion_2.cjs.entry.js +376 -376
  245. package/dist/cjs/ion-action-sheet.cjs.entry.js +87 -179
  246. package/dist/cjs/ion-alert.cjs.entry.js +126 -251
  247. package/dist/cjs/ion-app_8.cjs.entry.js +608 -461
  248. package/dist/cjs/ion-avatar_3.cjs.entry.js +125 -19
  249. package/dist/cjs/ion-back-button.cjs.entry.js +49 -65
  250. package/dist/cjs/ion-backdrop.cjs.entry.js +22 -23
  251. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +157 -210
  252. package/dist/cjs/ion-button_2.cjs.entry.js +118 -153
  253. package/dist/cjs/ion-card_5.cjs.entry.js +80 -110
  254. package/dist/cjs/ion-checkbox.cjs.entry.js +134 -160
  255. package/dist/cjs/ion-chip.cjs.entry.js +56 -21
  256. package/dist/cjs/ion-col_3.cjs.entry.js +61 -186
  257. package/dist/cjs/ion-datetime-button.cjs.entry.js +248 -256
  258. package/dist/cjs/ion-datetime_3.cjs.entry.js +3210 -0
  259. package/dist/cjs/ion-divider.cjs.entry.js +51 -0
  260. package/dist/cjs/ion-fab_3.cjs.entry.js +109 -155
  261. package/dist/cjs/ion-gallery-item.cjs.entry.js +59 -0
  262. package/dist/cjs/ion-gallery.cjs.entry.js +608 -0
  263. package/dist/cjs/ion-img.cjs.entry.js +17 -35
  264. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +157 -109
  265. package/dist/cjs/ion-input-otp.cjs.entry.js +437 -435
  266. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +54 -40
  267. package/dist/cjs/ion-input.cjs.entry.js +305 -351
  268. package/dist/cjs/ion-item-option_3.cjs.entry.js +512 -137
  269. package/dist/cjs/ion-item_8.cjs.entry.js +186 -218
  270. package/dist/cjs/ion-loading.cjs.entry.js +69 -152
  271. package/dist/cjs/ion-menu_3.cjs.entry.js +136 -182
  272. package/dist/cjs/ion-modal.cjs.entry.js +501 -571
  273. package/dist/cjs/ion-nav_2.cjs.entry.js +164 -104
  274. package/dist/cjs/ion-picker-column-option.cjs.entry.js +40 -40
  275. package/dist/cjs/ion-picker-column.cjs.entry.js +410 -422
  276. package/dist/cjs/ion-picker.cjs.entry.js +401 -406
  277. package/dist/cjs/ion-popover.cjs.entry.js +212 -324
  278. package/dist/cjs/ion-progress-bar.cjs.entry.js +48 -36
  279. package/dist/cjs/ion-radio_2.cjs.entry.js +162 -217
  280. package/dist/cjs/ion-range.cjs.entry.js +251 -309
  281. package/dist/cjs/ion-refresher_2.cjs.entry.js +127 -175
  282. package/dist/cjs/ion-reorder_2.cjs.entry.js +47 -60
  283. package/dist/cjs/ion-ripple-effect.cjs.entry.js +26 -18
  284. package/dist/cjs/ion-route_4.cjs.entry.js +76 -179
  285. package/dist/cjs/ion-searchbar.cjs.entry.js +305 -308
  286. package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
  287. package/dist/cjs/ion-segment-view.cjs.entry.js +27 -28
  288. package/dist/cjs/ion-segment_2.cjs.entry.js +141 -177
  289. package/dist/cjs/ion-select-modal.cjs.entry.js +71 -50
  290. package/dist/cjs/ion-select_3.cjs.entry.js +416 -507
  291. package/dist/cjs/ion-spinner.cjs.entry.js +36 -28
  292. package/dist/cjs/ion-split-pane.cjs.entry.js +25 -34
  293. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +180 -117
  294. package/dist/cjs/ion-tab_2.cjs.entry.js +30 -55
  295. package/dist/cjs/ion-text.cjs.entry.js +7 -13
  296. package/dist/cjs/ion-textarea.cjs.entry.js +310 -303
  297. package/dist/cjs/ion-toast.cjs.entry.js +170 -265
  298. package/dist/cjs/ion-toggle.cjs.entry.js +172 -184
  299. package/dist/cjs/ionic-global-DYLhJaw7.js +519 -0
  300. package/dist/cjs/ionic.cjs.js +4 -4
  301. package/dist/cjs/{ios.transition-zTmJz8T-.js → ios.transition-Blgf-vZU.js} +21 -15
  302. package/dist/cjs/{item-multiple-inputs-BdYSbfKN.js → item-multiple-inputs-DKn76MYO.js} +1 -1
  303. package/dist/cjs/{keyboard-cHxZlTyz.js → keyboard-BgioTbwQ.js} +3 -3
  304. package/dist/cjs/{keyboard-Cix5TVkD.js → keyboard-Otnp8OQI.js} +5 -4
  305. package/dist/cjs/loader.cjs.js +4 -4
  306. package/dist/cjs/{md.transition-nb_4pUXu.js → md.transition-ClgvbGfq.js} +11 -9
  307. package/dist/cjs/notch-controller-0hkmmSGo.js +155 -0
  308. package/dist/cjs/{overlay-control-label-D2sdL2O8.js → overlay-control-label-DnRLQR1t.js} +13 -11
  309. package/dist/cjs/{overlays-KaNVDNqC.js → overlays-Bxjqh2m3.js} +336 -60
  310. package/dist/cjs/scroll-hide-controller-qWMU5yOk.js +345 -0
  311. package/dist/cjs/{select-option-render-pULCGldr.js → select-option-render-BqJEK1N1.js} +4 -3
  312. package/dist/cjs/{status-tap-o9IIymsP.js → status-tap-ClA8u57t.js} +5 -4
  313. package/dist/cjs/{swipe-back-B7X9VOlH.js → swipe-back-4vY7mi8i.js} +6 -5
  314. package/dist/cjs/{theme-Bw0rpaNN.js → theme-IlOsGAz7.js} +26 -7
  315. package/dist/cjs/validity-QmuwEptc.js +51 -0
  316. package/dist/collection/collection-manifest.json +13 -1
  317. package/dist/collection/components/accordion/accordion.ionic.css +201 -0
  318. package/dist/collection/components/accordion/accordion.ios.css +73 -58
  319. package/dist/collection/components/accordion/accordion.js +331 -324
  320. package/dist/collection/components/accordion/accordion.md.css +67 -59
  321. package/dist/collection/components/accordion-group/accordion-group.ionic.css +93 -0
  322. package/dist/collection/components/accordion-group/accordion-group.ios.css +16 -4
  323. package/dist/collection/components/accordion-group/accordion-group.js +69 -56
  324. package/dist/collection/components/accordion-group/accordion-group.md.css +22 -4
  325. package/dist/collection/components/action-sheet/action-sheet.ionic.css +494 -0
  326. package/dist/collection/components/action-sheet/action-sheet.ios.css +184 -54
  327. package/dist/collection/components/action-sheet/action-sheet.js +76 -166
  328. package/dist/collection/components/action-sheet/action-sheet.md.css +179 -55
  329. package/dist/collection/components/action-sheet/test/basic/fixture.js +0 -3
  330. package/dist/collection/components/alert/alert.ionic.css +787 -0
  331. package/dist/collection/components/alert/alert.ios.css +247 -54
  332. package/dist/collection/components/alert/alert.js +113 -236
  333. package/dist/collection/components/alert/alert.md.css +243 -56
  334. package/dist/collection/components/app/app.js +15 -86
  335. package/dist/collection/components/avatar/avatar.ionic.css +385 -0
  336. package/dist/collection/components/avatar/avatar.ios.css +7 -33
  337. package/dist/collection/components/avatar/avatar.js +120 -4
  338. package/dist/collection/components/avatar/avatar.md.css +51 -0
  339. package/dist/collection/components/back-button/back-button.ios.css +60 -48
  340. package/dist/collection/components/back-button/back-button.js +45 -61
  341. package/dist/collection/components/back-button/back-button.md.css +60 -48
  342. package/dist/collection/components/backdrop/backdrop.ionic.css +109 -0
  343. package/dist/collection/components/backdrop/backdrop.ios.css +56 -19
  344. package/dist/collection/components/backdrop/backdrop.js +26 -22
  345. package/dist/collection/components/backdrop/backdrop.md.css +56 -19
  346. package/dist/collection/components/badge/badge.ionic.css +272 -0
  347. package/dist/collection/components/badge/badge.ios.css +137 -12
  348. package/dist/collection/components/badge/badge.js +145 -15
  349. package/dist/collection/components/badge/badge.md.css +122 -12
  350. package/dist/collection/components/breadcrumb/breadcrumb.ios.css +20 -8
  351. package/dist/collection/components/breadcrumb/breadcrumb.js +60 -99
  352. package/dist/collection/components/breadcrumb/breadcrumb.md.css +20 -8
  353. package/dist/collection/components/breadcrumbs/breadcrumbs.ios.css +6 -0
  354. package/dist/collection/components/breadcrumbs/breadcrumbs.js +99 -112
  355. package/dist/collection/components/breadcrumbs/breadcrumbs.md.css +6 -0
  356. package/dist/collection/components/button/button.ionic.css +644 -0
  357. package/dist/collection/components/button/button.ios.css +154 -46
  358. package/dist/collection/components/button/button.js +122 -157
  359. package/dist/collection/components/button/button.md.css +150 -50
  360. package/dist/collection/components/buttons/buttons.ionic.css +97 -0
  361. package/dist/collection/components/buttons/buttons.ios.css +59 -7
  362. package/dist/collection/components/buttons/buttons.js +29 -21
  363. package/dist/collection/components/buttons/buttons.md.css +55 -3
  364. package/dist/collection/components/card/card.ionic.css +144 -0
  365. package/dist/collection/components/card/card.ios.css +65 -14
  366. package/dist/collection/components/card/card.js +61 -63
  367. package/dist/collection/components/card/card.md.css +65 -14
  368. package/dist/collection/components/card-content/card-content.ionic.css +89 -0
  369. package/dist/collection/components/card-content/card-content.ios.css +20 -35
  370. package/dist/collection/components/card-content/card-content.js +12 -10
  371. package/dist/collection/components/card-content/card-content.md.css +20 -35
  372. package/dist/collection/components/card-header/card-header.ionic.css +85 -0
  373. package/dist/collection/components/card-header/card-header.ios.css +27 -15
  374. package/dist/collection/components/card-header/card-header.js +20 -21
  375. package/dist/collection/components/card-header/card-header.md.css +27 -15
  376. package/dist/collection/components/card-subtitle/card-subtitle.ionic.css +144 -0
  377. package/dist/collection/components/card-subtitle/card-subtitle.ios.css +12 -0
  378. package/dist/collection/components/card-subtitle/card-subtitle.js +11 -14
  379. package/dist/collection/components/card-subtitle/card-subtitle.md.css +12 -0
  380. package/dist/collection/components/card-title/card-title.ios.css +73 -0
  381. package/dist/collection/components/card-title/card-title.js +11 -14
  382. package/dist/collection/components/card-title/card-title.md.css +73 -0
  383. package/dist/collection/components/checkbox/checkbox.ionic.css +536 -0
  384. package/dist/collection/components/checkbox/checkbox.ios.css +246 -115
  385. package/dist/collection/components/checkbox/checkbox.js +172 -157
  386. package/dist/collection/components/checkbox/checkbox.md.css +247 -116
  387. package/dist/collection/components/chip/chip.ionic.css +217 -0
  388. package/dist/collection/components/chip/chip.ios.css +67 -14
  389. package/dist/collection/components/chip/chip.js +116 -20
  390. package/dist/collection/components/chip/chip.md.css +67 -14
  391. package/dist/collection/components/col/col.css +192 -4
  392. package/dist/collection/components/col/col.js +212 -186
  393. package/dist/collection/components/content/content.css +47 -2
  394. package/dist/collection/components/content/content.js +78 -102
  395. package/dist/collection/components/datetime/datetime.ionic.css +703 -0
  396. package/dist/collection/components/datetime/datetime.ios.css +304 -148
  397. package/dist/collection/components/datetime/datetime.js +900 -1090
  398. package/dist/collection/components/datetime/datetime.md.css +294 -138
  399. package/dist/collection/components/datetime/utils/data.js +19 -18
  400. package/dist/collection/components/datetime/utils/format.js +11 -21
  401. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  402. package/dist/collection/components/datetime/utils/parse.js +10 -10
  403. package/dist/collection/components/datetime/utils/state.js +2 -8
  404. package/dist/collection/components/datetime/utils/validate.js +5 -4
  405. package/dist/collection/components/datetime-button/datetime-button.ios.css +6 -5
  406. package/dist/collection/components/datetime-button/datetime-button.js +246 -253
  407. package/dist/collection/components/datetime-button/datetime-button.md.css +6 -5
  408. package/dist/collection/components/divider/divider.ionic.css +148 -0
  409. package/dist/collection/components/divider/divider.ios.css +87 -0
  410. package/dist/collection/components/divider/divider.js +94 -0
  411. package/dist/collection/components/divider/divider.md.css +87 -0
  412. package/dist/collection/components/fab/fab.css +25 -1
  413. package/dist/collection/components/fab/fab.js +22 -25
  414. package/dist/collection/components/fab-button/fab-button.ios.css +18 -6
  415. package/dist/collection/components/fab-button/fab-button.js +79 -117
  416. package/dist/collection/components/fab-button/fab-button.md.css +20 -8
  417. package/dist/collection/components/fab-list/fab-list.css +12 -0
  418. package/dist/collection/components/fab-list/fab-list.js +20 -15
  419. package/dist/collection/components/footer/footer-interface.js +1 -0
  420. package/dist/collection/components/footer/footer.ios.css +33 -6
  421. package/dist/collection/components/footer/footer.js +151 -65
  422. package/dist/collection/components/footer/footer.md.css +40 -0
  423. package/dist/collection/components/gallery/gallery-constants.js +12 -0
  424. package/dist/collection/components/gallery/gallery-interface.js +1 -0
  425. package/dist/collection/components/gallery/gallery.css +15 -0
  426. package/dist/collection/components/gallery/gallery.js +679 -0
  427. package/dist/collection/components/gallery/test/utils.js +100 -0
  428. package/dist/collection/components/gallery-item/gallery-item.css +49 -0
  429. package/dist/collection/components/gallery-item/gallery-item.js +99 -0
  430. package/dist/collection/components/grid/grid.css +12 -0
  431. package/dist/collection/components/grid/grid.js +15 -9
  432. package/dist/collection/components/header/header-interface.js +1 -0
  433. package/dist/collection/components/header/header.ionic.css +250 -0
  434. package/dist/collection/components/header/header.ios.css +178 -133
  435. package/dist/collection/components/header/header.js +202 -70
  436. package/dist/collection/components/header/header.md.css +199 -9
  437. package/dist/collection/components/header/header.utils.js +6 -13
  438. package/dist/collection/components/img/img.js +16 -34
  439. package/dist/collection/components/infinite-scroll/infinite-scroll.js +164 -76
  440. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.ios.css +12 -0
  441. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +19 -30
  442. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.md.css +12 -0
  443. package/dist/collection/components/input/input.ionic.css +891 -0
  444. package/dist/collection/components/input/input.ios.css +247 -191
  445. package/dist/collection/components/input/input.js +333 -357
  446. package/dist/collection/components/input/input.md.css +234 -285
  447. package/dist/collection/components/input-otp/input-otp.ionic.css +371 -0
  448. package/dist/collection/components/input-otp/input-otp.ios.css +105 -60
  449. package/dist/collection/components/input-otp/input-otp.js +437 -432
  450. package/dist/collection/components/input-otp/input-otp.md.css +105 -60
  451. package/dist/collection/components/input-password-toggle/input-password-toggle.ionic.css +78 -0
  452. package/dist/collection/components/input-password-toggle/input-password-toggle.js +51 -36
  453. package/dist/collection/components/input-password-toggle/input-password-toggle.native.css +61 -0
  454. package/dist/collection/components/item/item.ionic.css +496 -0
  455. package/dist/collection/components/item/item.ios.css +120 -80
  456. package/dist/collection/components/item/item.js +98 -113
  457. package/dist/collection/components/item/item.md.css +131 -79
  458. package/dist/collection/components/item-divider/item-divider.ios.css +18 -0
  459. package/dist/collection/components/item-divider/item-divider.js +21 -23
  460. package/dist/collection/components/item-divider/item-divider.md.css +18 -0
  461. package/dist/collection/components/item-group/item-group.ios.css +12 -0
  462. package/dist/collection/components/item-group/item-group.js +13 -7
  463. package/dist/collection/components/item-group/item-group.md.css +12 -0
  464. package/dist/collection/components/item-option/item-option.ionic.css +277 -0
  465. package/dist/collection/components/item-option/item-option.ios.css +136 -29
  466. package/dist/collection/components/item-option/item-option.js +92 -56
  467. package/dist/collection/components/item-option/item-option.md.css +136 -29
  468. package/dist/collection/components/item-options/item-options.ionic.css +221 -0
  469. package/dist/collection/components/item-options/item-options.ios.css +77 -34
  470. package/dist/collection/components/item-options/item-options.js +20 -17
  471. package/dist/collection/components/item-options/item-options.md.css +77 -34
  472. package/dist/collection/components/item-sliding/item-sliding.ionic.css +211 -0
  473. package/dist/collection/components/item-sliding/item-sliding.js +441 -61
  474. package/dist/collection/components/item-sliding/{item-sliding.css → item-sliding.native.css} +84 -9
  475. package/dist/collection/components/item-sliding/test/test.utils.js +13 -0
  476. package/dist/collection/components/label/label.ios.css +18 -0
  477. package/dist/collection/components/label/label.js +15 -32
  478. package/dist/collection/components/label/label.md.css +18 -0
  479. package/dist/collection/components/list/list.ionic.css +212 -0
  480. package/dist/collection/components/list/list.ios.css +54 -14
  481. package/dist/collection/components/list/list.js +55 -19
  482. package/dist/collection/components/list/list.md.css +56 -16
  483. package/dist/collection/components/list-header/list-header.ionic.css +190 -0
  484. package/dist/collection/components/list-header/list-header.ios.css +82 -38
  485. package/dist/collection/components/list-header/list-header.js +11 -18
  486. package/dist/collection/components/list-header/list-header.md.css +82 -38
  487. package/dist/collection/components/loading/loading.ios.css +13 -1
  488. package/dist/collection/components/loading/loading.js +62 -143
  489. package/dist/collection/components/loading/loading.md.css +13 -1
  490. package/dist/collection/components/menu/menu.ios.css +15 -3
  491. package/dist/collection/components/menu/menu.js +71 -108
  492. package/dist/collection/components/menu/menu.md.css +15 -3
  493. package/dist/collection/components/menu-button/menu-button.ionic.css +236 -0
  494. package/dist/collection/components/menu-button/menu-button.ios.css +48 -14
  495. package/dist/collection/components/menu-button/menu-button.js +43 -38
  496. package/dist/collection/components/menu-button/menu-button.md.css +49 -15
  497. package/dist/collection/components/menu-toggle/menu-toggle.js +21 -25
  498. package/dist/collection/components/modal/animations/ionic.enter.js +40 -0
  499. package/dist/collection/components/modal/animations/ionic.leave.js +28 -0
  500. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  501. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  502. package/dist/collection/components/modal/animations/sheet.js +8 -2
  503. package/dist/collection/components/modal/gestures/sheet.js +86 -32
  504. package/dist/collection/components/modal/gestures/swipe-to-close.js +3 -15
  505. package/dist/collection/components/modal/modal.ionic.css +255 -0
  506. package/dist/collection/components/modal/modal.ios.css +178 -70
  507. package/dist/collection/components/modal/modal.js +272 -404
  508. package/dist/collection/components/modal/modal.md.css +178 -70
  509. package/dist/collection/components/modal/safe-area-utils.js +7 -6
  510. package/dist/collection/components/modal/test/fixtures.js +0 -3
  511. package/dist/collection/components/nav/nav.css +7 -1
  512. package/dist/collection/components/nav/nav.js +256 -72
  513. package/dist/collection/components/nav/view-controller.js +1 -7
  514. package/dist/collection/components/nav-link/nav-link.js +14 -21
  515. package/dist/collection/components/note/note.ios.css +12 -0
  516. package/dist/collection/components/note/note.js +11 -14
  517. package/dist/collection/components/note/note.md.css +12 -0
  518. package/dist/collection/components/picker/picker.ios.css +15 -3
  519. package/dist/collection/components/picker/picker.js +398 -403
  520. package/dist/collection/components/picker/picker.md.css +15 -3
  521. package/dist/collection/components/picker-column/picker-column.css +9 -5
  522. package/dist/collection/components/picker-column/picker-column.js +409 -418
  523. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +6 -0
  524. package/dist/collection/components/picker-column-option/picker-column-option.js +42 -38
  525. package/dist/collection/components/picker-column-option/picker-column-option.md.css +7 -6
  526. package/dist/collection/components/picker-legacy/animations/ios.enter.js +27 -0
  527. package/dist/collection/components/picker-legacy/animations/ios.leave.js +23 -0
  528. package/dist/collection/components/picker-legacy/picker-interface.js +1 -0
  529. package/dist/collection/components/picker-legacy/picker.ios.css +312 -0
  530. package/dist/collection/components/picker-legacy/picker.js +891 -0
  531. package/dist/collection/components/picker-legacy/picker.md.css +299 -0
  532. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +243 -0
  533. package/dist/collection/components/picker-legacy-column/picker-column.js +422 -0
  534. package/dist/collection/components/picker-legacy-column/picker-column.md.css +234 -0
  535. package/dist/collection/components/picker-legacy-column/test/test.utils.js +43 -0
  536. package/dist/collection/components/popover/animations/ios.enter.js +2 -1
  537. package/dist/collection/components/popover/animations/md.enter.js +2 -1
  538. package/dist/collection/components/popover/popover.ionic.css +290 -0
  539. package/dist/collection/components/popover/popover.ios.css +15 -2
  540. package/dist/collection/components/popover/popover.js +199 -313
  541. package/dist/collection/components/popover/popover.md.css +15 -2
  542. package/dist/collection/components/popover/test/fixture.js +0 -1
  543. package/dist/collection/components/popover/utils.js +6 -4
  544. package/dist/collection/components/progress-bar/progress-bar.ionic.css +287 -0
  545. package/dist/collection/components/progress-bar/progress-bar.ios.css +48 -17
  546. package/dist/collection/components/progress-bar/progress-bar.js +65 -33
  547. package/dist/collection/components/progress-bar/progress-bar.md.css +48 -17
  548. package/dist/collection/components/radio/radio.ionic.css +422 -0
  549. package/dist/collection/components/radio/radio.ios.css +207 -102
  550. package/dist/collection/components/radio/radio.js +77 -108
  551. package/dist/collection/components/radio/radio.md.css +207 -102
  552. package/dist/collection/components/radio-group/radio-group.ionic.css +119 -0
  553. package/dist/collection/components/radio-group/radio-group.ios.css +43 -19
  554. package/dist/collection/components/radio-group/radio-group.js +113 -107
  555. package/dist/collection/components/radio-group/radio-group.md.css +43 -19
  556. package/dist/collection/components/radio-group/test/fixtures.js +0 -2
  557. package/dist/collection/components/range/range.ionic.css +567 -0
  558. package/dist/collection/components/range/range.ios.css +128 -85
  559. package/dist/collection/components/range/range.js +247 -305
  560. package/dist/collection/components/range/range.md.css +128 -85
  561. package/dist/collection/components/refresher/refresher.ios.css +14 -1
  562. package/dist/collection/components/refresher/refresher.js +88 -117
  563. package/dist/collection/components/refresher/refresher.md.css +15 -2
  564. package/dist/collection/components/refresher-content/refresher-content.js +37 -47
  565. package/dist/collection/components/reorder/reorder.ios.css +6 -0
  566. package/dist/collection/components/reorder/reorder.js +26 -7
  567. package/dist/collection/components/reorder/reorder.md.css +6 -0
  568. package/dist/collection/components/reorder-group/reorder-group.css +6 -0
  569. package/dist/collection/components/reorder-group/reorder-group.js +22 -47
  570. package/dist/collection/components/ripple-effect/{ripple-effect.css → ripple-effect.common.css} +7 -1
  571. package/dist/collection/components/ripple-effect/ripple-effect.ionic.css +215 -0
  572. package/dist/collection/components/ripple-effect/ripple-effect.js +26 -17
  573. package/dist/collection/components/route/route.js +14 -39
  574. package/dist/collection/components/route-redirect/route-redirect.js +0 -31
  575. package/dist/collection/components/router/router.js +37 -37
  576. package/dist/collection/components/router/utils/dom.js +7 -25
  577. package/dist/collection/components/router/utils/matching.js +9 -7
  578. package/dist/collection/components/router/utils/parser.js +1 -1
  579. package/dist/collection/components/router/utils/path.js +1 -0
  580. package/dist/collection/components/router-link/router-link.css +8 -2
  581. package/dist/collection/components/router-link/router-link.js +19 -40
  582. package/dist/collection/components/router-outlet/router-outlet.css +7 -1
  583. package/dist/collection/components/router-outlet/router-outlet.js +25 -83
  584. package/dist/collection/components/row/row.css +16 -0
  585. package/dist/collection/components/row/row.js +9 -2
  586. package/dist/collection/components/searchbar/searchbar.ionic.css +622 -0
  587. package/dist/collection/components/searchbar/searchbar.ios.css +56 -18
  588. package/dist/collection/components/searchbar/searchbar.js +356 -321
  589. package/dist/collection/components/searchbar/searchbar.md.css +56 -18
  590. package/dist/collection/components/segment/segment.ionic.css +115 -0
  591. package/dist/collection/components/segment/segment.ios.css +45 -2
  592. package/dist/collection/components/segment/segment.js +94 -126
  593. package/dist/collection/components/segment/segment.md.css +45 -2
  594. package/dist/collection/components/segment-button/segment-button.ionic.css +352 -0
  595. package/dist/collection/components/segment-button/segment-button.ios.css +146 -105
  596. package/dist/collection/components/segment-button/segment-button.js +46 -49
  597. package/dist/collection/components/segment-button/segment-button.md.css +148 -107
  598. package/dist/collection/components/segment-content/segment-content.js +1 -1
  599. package/dist/collection/components/segment-view/segment-view.ios.css +6 -0
  600. package/dist/collection/components/segment-view/segment-view.js +27 -28
  601. package/dist/collection/components/segment-view/segment-view.md.css +6 -0
  602. package/dist/collection/components/select/select.ionic.css +809 -0
  603. package/dist/collection/components/select/select.ios.css +351 -206
  604. package/dist/collection/components/select/select.js +431 -431
  605. package/dist/collection/components/select/select.md.css +383 -230
  606. package/dist/collection/components/select-modal/select-modal.ionic.css +257 -0
  607. package/dist/collection/components/select-modal/select-modal.ios.css +293 -45
  608. package/dist/collection/components/select-modal/select-modal.js +81 -37
  609. package/dist/collection/components/select-modal/select-modal.md.css +273 -43
  610. package/dist/collection/components/select-modal/test/fixtures.js +1 -8
  611. package/dist/collection/components/select-option/select-option.js +15 -48
  612. package/dist/collection/components/select-popover/select-popover.ionic.css +255 -0
  613. package/dist/collection/components/select-popover/select-popover.ios.css +188 -124
  614. package/dist/collection/components/select-popover/select-popover.js +37 -44
  615. package/dist/collection/components/select-popover/select-popover.md.css +228 -47
  616. package/dist/collection/components/select-popover/test/fixtures.js +1 -8
  617. package/dist/collection/components/skeleton-text/skeleton-text.css +6 -0
  618. package/dist/collection/components/skeleton-text/skeleton-text.js +15 -15
  619. package/dist/collection/components/spinner/{spinner.css → spinner.ionic.css} +78 -10
  620. package/dist/collection/components/spinner/spinner.js +55 -26
  621. package/dist/collection/components/spinner/spinner.native.css +199 -0
  622. package/dist/collection/components/split-pane/split-pane.ios.css +20 -2
  623. package/dist/collection/components/split-pane/split-pane.js +28 -33
  624. package/dist/collection/components/split-pane/split-pane.md.css +20 -2
  625. package/dist/collection/components/tab/tab.js +10 -17
  626. package/dist/collection/components/tab-bar/tab-bar.ionic.css +249 -0
  627. package/dist/collection/components/tab-bar/tab-bar.ios.css +86 -43
  628. package/dist/collection/components/tab-bar/tab-bar.js +190 -44
  629. package/dist/collection/components/tab-bar/tab-bar.md.css +86 -43
  630. package/dist/collection/components/tab-button/tab-button.ionic.css +373 -0
  631. package/dist/collection/components/tab-button/tab-button.ios.css +171 -95
  632. package/dist/collection/components/tab-button/tab-button.js +74 -68
  633. package/dist/collection/components/tab-button/tab-button.md.css +137 -93
  634. package/dist/collection/components/tabs/tabs.css +7 -1
  635. package/dist/collection/components/tabs/tabs.js +23 -33
  636. package/dist/collection/components/text/text.css +6 -0
  637. package/dist/collection/components/text/text.js +7 -12
  638. package/dist/collection/components/textarea/textarea.ionic.css +898 -0
  639. package/dist/collection/components/textarea/textarea.ios.css +329 -221
  640. package/dist/collection/components/textarea/textarea.js +334 -302
  641. package/dist/collection/components/textarea/textarea.md.css +358 -231
  642. package/dist/collection/components/thumbnail/thumbnail.css +6 -0
  643. package/dist/collection/components/thumbnail/thumbnail.js +9 -2
  644. package/dist/collection/components/title/title.ionic.css +127 -0
  645. package/dist/collection/components/title/title.ios.css +32 -4
  646. package/dist/collection/components/title/title.js +13 -23
  647. package/dist/collection/components/title/title.md.css +39 -4
  648. package/dist/collection/components/toast/animations/utils.js +1 -1
  649. package/dist/collection/components/toast/toast.ionic.css +394 -0
  650. package/dist/collection/components/toast/toast.ios.css +84 -45
  651. package/dist/collection/components/toast/toast.js +178 -232
  652. package/dist/collection/components/toast/toast.md.css +84 -45
  653. package/dist/collection/components/toggle/toggle.ionic.css +512 -0
  654. package/dist/collection/components/toggle/toggle.ios.css +247 -127
  655. package/dist/collection/components/toggle/toggle.js +164 -175
  656. package/dist/collection/components/toggle/toggle.md.css +245 -127
  657. package/dist/collection/components/toolbar/test/image.svg +1 -0
  658. package/dist/collection/components/toolbar/toolbar.ionic.css +249 -0
  659. package/dist/collection/components/toolbar/toolbar.ios.css +90 -47
  660. package/dist/collection/components/toolbar/toolbar.js +222 -25
  661. package/dist/collection/components/toolbar/toolbar.md.css +90 -47
  662. package/dist/collection/global/config.js +6 -4
  663. package/dist/collection/global/ionic-global.js +242 -20
  664. package/dist/collection/index.js +1 -1
  665. package/dist/collection/utils/animation/animation.js +3 -3
  666. package/dist/collection/utils/config.js +4 -5
  667. package/dist/collection/utils/css-value-validation.js +39 -0
  668. package/dist/collection/utils/focus-controller/index.js +1 -1
  669. package/dist/collection/utils/focus-trap.js +16 -5
  670. package/dist/collection/utils/focus-visible.js +22 -0
  671. package/dist/collection/utils/forms/clear-button-press-controller.js +40 -0
  672. package/dist/collection/utils/forms/index.js +1 -1
  673. package/dist/collection/utils/forms/validity.js +31 -0
  674. package/dist/collection/utils/framework-delegate.js +9 -5
  675. package/dist/collection/utils/gesture/gesture-controller.js +8 -15
  676. package/dist/collection/utils/gesture/index.js +2 -10
  677. package/dist/collection/utils/hardware-back-button.js +18 -3
  678. package/dist/collection/utils/helpers.js +72 -5
  679. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +5 -4
  680. package/dist/collection/utils/input-shims/hacks/scroll-data.js +2 -1
  681. package/dist/collection/utils/keyboard/keyboard-controller.js +8 -6
  682. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  683. package/dist/collection/utils/logging/index.js +4 -23
  684. package/dist/collection/utils/media.js +1 -0
  685. package/dist/collection/utils/menu-controller/animations/overlay.js +3 -3
  686. package/dist/collection/utils/menu-controller/animations/push.js +2 -1
  687. package/dist/collection/utils/menu-controller/animations/reveal.js +2 -1
  688. package/dist/collection/utils/menu-controller/index.js +2 -1
  689. package/dist/collection/utils/native/haptic.js +3 -2
  690. package/dist/collection/utils/native/keyboard.js +2 -2
  691. package/dist/collection/utils/native/status-bar.js +1 -1
  692. package/dist/collection/utils/overlay-control-label.js +13 -11
  693. package/dist/collection/utils/overlays.js +312 -45
  694. package/dist/collection/utils/platform.js +5 -4
  695. package/dist/collection/utils/rtl/dir.js +3 -2
  696. package/dist/collection/utils/sanitization/index.js +2 -2
  697. package/dist/collection/utils/scroll-hide-controller.js +178 -0
  698. package/dist/collection/utils/select-option-render.js +2 -1
  699. package/dist/collection/utils/slot-mutation-controller.js +2 -1
  700. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
  701. package/dist/collection/utils/test/playwright/drag-element.js +35 -11
  702. package/dist/collection/utils/test/playwright/generator.js +51 -25
  703. package/dist/collection/utils/test/playwright/page/event-spy.js +12 -11
  704. package/dist/collection/utils/test/playwright/page/utils/goto.js +15 -5
  705. package/dist/collection/utils/test/playwright/page/utils/set-content.js +27 -4
  706. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +3 -2
  707. package/dist/collection/utils/test/press-keys.js +17 -10
  708. package/dist/collection/utils/theme.js +26 -7
  709. package/dist/collection/utils/transition/ios.transition.js +14 -9
  710. package/dist/collection/utils/transition/md.transition.js +4 -3
  711. package/dist/docs.json +10054 -537
  712. package/dist/esm/{animation-CGFdmGk9.js → animation-BsVixxLP.js} +5 -5
  713. package/dist/esm/{app-globals-CYmMeGdU.js → app-globals-rPvWQFXp.js} +1 -1
  714. package/dist/esm/{button-active-BDOsVAiZ.js → button-active-BS8YgJRD.js} +3 -3
  715. package/dist/esm/{capacitor-CFERIeaU.js → capacitor-BnXrCBvt.js} +1 -1
  716. package/dist/esm/clear-button-press-controller-Ci6Q_x5-.js +43 -0
  717. package/dist/esm/{config-DWCzVL3Y.js → config-BwKpO3Is.js} +4 -5
  718. package/dist/esm/{dir-Dojwmvde.js → dir-o8OKV5aD.js} +3 -2
  719. package/dist/esm/{focus-visible-BmVRXR1y.js → focus-visible-vXpMhGrs.js} +23 -1
  720. package/dist/esm/{format-Dcwga61t.js → format-2WlZcMvG.js} +31 -41
  721. package/dist/esm/{framework-delegate-BHTU2Ip9.js → framework-delegate-P5K_3uYw.js} +10 -6
  722. package/dist/esm/{gesture-controller-TXPDHL13.js → gesture-controller-BTEOs1at.js} +8 -15
  723. package/dist/esm/{haptic-Cq4UAeka.js → haptic-ByW74Ow9.js} +4 -3
  724. package/dist/esm/{helpers-CAGf8Wgp.js → helpers-ChPZH7zh.js} +74 -8
  725. package/dist/esm/{index-DcPaH5uL.js → index-Bck1OwMs.js} +3 -9
  726. package/dist/esm/{index-ChhhtsGZ.js → index-C0EQceqV.js} +66 -34
  727. package/dist/esm/{index-Clc-28O1.js → index-C7EAbm0C.js} +5 -4
  728. package/dist/esm/{index-CqneaaGd.js → index-C7F1yJyV.js} +13 -12
  729. package/dist/esm/{index-WlteAIqz.js → index-CXSPjEca.js} +5 -5
  730. package/dist/esm/{index-CKM1DdGm.js → index-Mq5pCWmZ.js} +3 -3
  731. package/dist/esm/{index-BvabGprD.js → index-PnwG0glX.js} +2 -1
  732. package/dist/esm/{index-T0JxBI8V.js → index-niemeDYi.js} +2 -2
  733. package/dist/esm/index.js +17 -18
  734. package/dist/esm/{input-shims-B8sfni1e.js → input-shims-CM5m0K8T.js} +15 -12
  735. package/dist/esm/input.utils-DhJNJPiU.js +147 -0
  736. package/dist/esm/ion-accordion_2.entry.js +376 -376
  737. package/dist/esm/ion-action-sheet.entry.js +87 -179
  738. package/dist/esm/ion-alert.entry.js +126 -251
  739. package/dist/esm/ion-app_8.entry.js +607 -460
  740. package/dist/esm/ion-avatar_3.entry.js +125 -19
  741. package/dist/esm/ion-back-button.entry.js +49 -65
  742. package/dist/esm/ion-backdrop.entry.js +22 -23
  743. package/dist/esm/ion-breadcrumb_2.entry.js +157 -210
  744. package/dist/esm/ion-button_2.entry.js +118 -153
  745. package/dist/esm/ion-card_5.entry.js +80 -110
  746. package/dist/esm/ion-checkbox.entry.js +134 -160
  747. package/dist/esm/ion-chip.entry.js +56 -21
  748. package/dist/esm/ion-col_3.entry.js +61 -186
  749. package/dist/esm/ion-datetime-button.entry.js +248 -256
  750. package/dist/esm/ion-datetime_3.entry.js +3206 -0
  751. package/dist/esm/ion-divider.entry.js +49 -0
  752. package/dist/esm/ion-fab_3.entry.js +109 -155
  753. package/dist/esm/ion-gallery-item.entry.js +57 -0
  754. package/dist/esm/ion-gallery.entry.js +606 -0
  755. package/dist/esm/ion-img.entry.js +17 -35
  756. package/dist/esm/ion-infinite-scroll_2.entry.js +157 -109
  757. package/dist/esm/ion-input-otp.entry.js +437 -435
  758. package/dist/esm/ion-input-password-toggle.entry.js +54 -40
  759. package/dist/esm/ion-input.entry.js +303 -349
  760. package/dist/esm/ion-item-option_3.entry.js +512 -137
  761. package/dist/esm/ion-item_8.entry.js +186 -218
  762. package/dist/esm/ion-loading.entry.js +69 -152
  763. package/dist/esm/ion-menu_3.entry.js +136 -182
  764. package/dist/esm/ion-modal.entry.js +459 -529
  765. package/dist/esm/ion-nav_2.entry.js +164 -104
  766. package/dist/esm/ion-picker-column-option.entry.js +40 -40
  767. package/dist/esm/ion-picker-column.entry.js +410 -422
  768. package/dist/esm/ion-picker.entry.js +401 -406
  769. package/dist/esm/ion-popover.entry.js +212 -324
  770. package/dist/esm/ion-progress-bar.entry.js +48 -36
  771. package/dist/esm/ion-radio_2.entry.js +162 -217
  772. package/dist/esm/ion-range.entry.js +251 -309
  773. package/dist/esm/ion-refresher_2.entry.js +127 -175
  774. package/dist/esm/ion-reorder_2.entry.js +47 -60
  775. package/dist/esm/ion-ripple-effect.entry.js +26 -18
  776. package/dist/esm/ion-route_4.entry.js +76 -179
  777. package/dist/esm/ion-searchbar.entry.js +305 -308
  778. package/dist/esm/ion-segment-content.entry.js +2 -2
  779. package/dist/esm/ion-segment-view.entry.js +27 -28
  780. package/dist/esm/ion-segment_2.entry.js +141 -177
  781. package/dist/esm/ion-select-modal.entry.js +71 -50
  782. package/dist/esm/ion-select_3.entry.js +416 -507
  783. package/dist/esm/ion-spinner.entry.js +36 -28
  784. package/dist/esm/ion-split-pane.entry.js +25 -34
  785. package/dist/esm/ion-tab-bar_2.entry.js +179 -116
  786. package/dist/esm/ion-tab_2.entry.js +30 -55
  787. package/dist/esm/ion-text.entry.js +7 -13
  788. package/dist/esm/ion-textarea.entry.js +309 -302
  789. package/dist/esm/ion-toast.entry.js +149 -244
  790. package/dist/esm/ion-toggle.entry.js +172 -184
  791. package/dist/esm/ionic-global-BJDU78B6.js +508 -0
  792. package/dist/esm/ionic.js +5 -5
  793. package/dist/esm/{ios.transition-DXRCmcbC.js → ios.transition-6oGu53GR.js} +21 -15
  794. package/dist/esm/{item-multiple-inputs-rU8VaNNg.js → item-multiple-inputs-C6onMFOo.js} +1 -1
  795. package/dist/esm/{keyboard-Cj8mLJeq.js → keyboard-XukEYIFf.js} +5 -4
  796. package/dist/esm/{keyboard-DAF8GNJ9.js → keyboard-x-uHYVoq.js} +3 -3
  797. package/dist/esm/loader.js +5 -5
  798. package/dist/esm/{md.transition-BMngO4i_.js → md.transition-Dy5HxiSE.js} +11 -9
  799. package/dist/esm/notch-controller-BYB7mUMg.js +153 -0
  800. package/dist/esm/{overlay-control-label-BSQPZ79H.js → overlay-control-label-CODBQrPj.js} +13 -11
  801. package/dist/esm/{overlays-CPmIs9Ls.js → overlays-C3YvaMgX.js} +333 -57
  802. package/dist/esm/scroll-hide-controller-B3MRYNXh.js +342 -0
  803. package/dist/esm/{select-option-render-C4m76VGH.js → select-option-render-BlKZ2H83.js} +4 -3
  804. package/dist/esm/{status-tap-CHB7KwIb.js → status-tap-DK-ylvU7.js} +5 -4
  805. package/dist/esm/{swipe-back-C9HW1bug.js → swipe-back-DFICtpMC.js} +6 -5
  806. package/dist/esm/theme-DaJxRxSQ.js +67 -0
  807. package/dist/esm/validity-BjW8SOqw.js +48 -0
  808. package/dist/html.html-data.json +2690 -123
  809. package/dist/ionic/index.esm.js +1 -1
  810. package/dist/ionic/ionic.esm.js +1 -1
  811. package/dist/ionic/p--sroV-k-.js +4 -0
  812. package/dist/ionic/p-0115c2fa.entry.js +4 -0
  813. package/dist/ionic/p-0ac15b5f.entry.js +4 -0
  814. package/dist/ionic/p-0b2c58e0.entry.js +4 -0
  815. package/dist/ionic/p-0bfb8d9e.entry.js +4 -0
  816. package/dist/ionic/p-1147fa06.entry.js +4 -0
  817. package/dist/ionic/p-1e45586e.entry.js +4 -0
  818. package/dist/ionic/p-1febf200.entry.js +4 -0
  819. package/dist/ionic/p-208cecae.entry.js +4 -0
  820. package/dist/ionic/p-29f69d29.entry.js +4 -0
  821. package/dist/ionic/p-2b5e04c5.entry.js +4 -0
  822. package/dist/ionic/p-311ef139.entry.js +4 -0
  823. package/dist/ionic/p-3eff3411.entry.js +4 -0
  824. package/dist/ionic/p-3f17704b.entry.js +4 -0
  825. package/dist/ionic/p-46e754ae.entry.js +4 -0
  826. package/dist/ionic/p-4901a10b.entry.js +4 -0
  827. package/dist/ionic/p-4c8178d8.entry.js +4 -0
  828. package/dist/ionic/p-5196bee9.entry.js +4 -0
  829. package/dist/ionic/p-5386b094.entry.js +4 -0
  830. package/dist/ionic/p-54579b68.entry.js +4 -0
  831. package/dist/ionic/p-54baa1af.entry.js +4 -0
  832. package/dist/ionic/p-59e59209.entry.js +4 -0
  833. package/dist/ionic/p-5ad0c670.entry.js +4 -0
  834. package/dist/ionic/p-62602fbd.entry.js +4 -0
  835. package/dist/ionic/p-6b86cb62.entry.js +4 -0
  836. package/dist/ionic/p-7134537b.entry.js +4 -0
  837. package/dist/ionic/p-72eacca0.entry.js +4 -0
  838. package/dist/ionic/p-7ae06f6f.entry.js +4 -0
  839. package/dist/ionic/p-7bde9ee1.entry.js +4 -0
  840. package/dist/ionic/p-7f59020c.entry.js +4 -0
  841. package/dist/ionic/p-7k7Q1A38.js +4 -0
  842. package/dist/ionic/p-87ab986c.entry.js +4 -0
  843. package/dist/ionic/p-9dff6288.entry.js +4 -0
  844. package/dist/ionic/p-9e09cb80.entry.js +4 -0
  845. package/dist/ionic/p-BFhQ1N-L.js +4 -0
  846. package/dist/ionic/p-BG7tpRhR.js +4 -0
  847. package/dist/ionic/p-BITyMTKr.js +4 -0
  848. package/dist/ionic/p-BRPONI7N.js +4 -0
  849. package/dist/ionic/p-BTEOs1at.js +4 -0
  850. package/dist/ionic/p-BVdSuKmt.js +4 -0
  851. package/dist/ionic/p-BYRVyMu9.js +4 -0
  852. package/dist/ionic/p-BjW8SOqw.js +4 -0
  853. package/dist/ionic/p-Bpx1lBiP.js +4 -0
  854. package/dist/ionic/p-BwKpO3Is.js +4 -0
  855. package/dist/ionic/p-C-BLhfUi.js +4 -0
  856. package/dist/ionic/p-C-aO35cw.js +4 -0
  857. package/dist/ionic/p-C0EQceqV.js +5 -0
  858. package/dist/ionic/p-CDrQfM-I.js +4 -0
  859. package/dist/ionic/p-CODBQrPj.js +4 -0
  860. package/dist/ionic/p-CTSaffvS.js +4 -0
  861. package/dist/ionic/p-CaM5HwzM.js +4 -0
  862. package/dist/ionic/p-CgaW5Zy8.js +4 -0
  863. package/dist/ionic/p-Cipl19Qe.js +4 -0
  864. package/dist/ionic/p-CnBfCmL2.js +4 -0
  865. package/dist/ionic/p-D-Xit5Ye.js +4 -0
  866. package/dist/ionic/p-D7LIC84Z.js +4 -0
  867. package/dist/ionic/p-D844sgjq.js +4 -0
  868. package/dist/ionic/p-DWDKFjrH.js +4 -0
  869. package/dist/ionic/p-DaJxRxSQ.js +4 -0
  870. package/dist/ionic/p-DhyWlGap.js +4 -0
  871. package/dist/ionic/p-DiyY-i-5.js +4 -0
  872. package/dist/ionic/p-DrxPmT9E.js +4 -0
  873. package/dist/ionic/p-PnwG0glX.js +4 -0
  874. package/dist/ionic/p-YIsE5bNG.js +4 -0
  875. package/dist/ionic/p-a320cdb2.entry.js +4 -0
  876. package/dist/ionic/p-a37444b3.entry.js +4 -0
  877. package/dist/ionic/p-a4bed36b.entry.js +4 -0
  878. package/dist/ionic/p-a7914fe5.entry.js +4 -0
  879. package/dist/ionic/p-aa298c58.entry.js +4 -0
  880. package/dist/ionic/p-ace3062d.entry.js +4 -0
  881. package/dist/ionic/p-b70775b0.entry.js +4 -0
  882. package/dist/ionic/p-b7c75507.entry.js +4 -0
  883. package/dist/ionic/p-b920f149.entry.js +4 -0
  884. package/dist/ionic/p-c39025c0.entry.js +4 -0
  885. package/dist/ionic/p-c9cda5ce.entry.js +4 -0
  886. package/dist/ionic/p-cc314123.entry.js +4 -0
  887. package/dist/ionic/p-d1f42864.entry.js +4 -0
  888. package/dist/ionic/p-d4506138.entry.js +4 -0
  889. package/dist/ionic/p-dbd06d8d.entry.js +4 -0
  890. package/dist/ionic/p-dda49380.entry.js +4 -0
  891. package/dist/ionic/p-de4e8418.entry.js +4 -0
  892. package/dist/ionic/p-e95618c4.entry.js +4 -0
  893. package/dist/ionic/p-f89fcf62.entry.js +4 -0
  894. package/dist/ionic/p-fcce2dda.entry.js +4 -0
  895. package/dist/ionic/p-fd2a869f.entry.js +4 -0
  896. package/dist/ionic/p-fd95a423.entry.js +4 -0
  897. package/dist/ionic/p-fe14205b.entry.js +4 -0
  898. package/dist/ionic/p-i6iV8hMy.js +4 -0
  899. package/dist/ionic/p-nUlpIttM.js +4 -0
  900. package/dist/ionic/p-o8OKV5aD.js +4 -0
  901. package/dist/ionic/p-vXpMhGrs.js +4 -0
  902. package/dist/ionic/p-zRFin7iz.js +4 -0
  903. package/dist/ionic/p-zn4qAQ_d.js +4 -0
  904. package/dist/types/components/accordion/accordion.d.ts +12 -3
  905. package/dist/types/components/accordion-group/accordion-group.d.ts +12 -1
  906. package/dist/types/components/action-sheet/action-sheet-interface.d.ts +3 -7
  907. package/dist/types/components/action-sheet/action-sheet.d.ts +3 -2
  908. package/dist/types/components/alert/alert-interface.d.ts +3 -7
  909. package/dist/types/components/alert/alert.d.ts +3 -2
  910. package/dist/types/components/app/app.d.ts +4 -5
  911. package/dist/types/components/avatar/avatar.d.ts +32 -0
  912. package/dist/types/components/back-button/back-button.d.ts +8 -1
  913. package/dist/types/components/backdrop/backdrop.d.ts +4 -0
  914. package/dist/types/components/badge/badge.d.ts +34 -1
  915. package/dist/types/components/breadcrumb/breadcrumb.d.ts +14 -1
  916. package/dist/types/components/breadcrumbs/breadcrumbs.d.ts +2 -2
  917. package/dist/types/components/button/button.d.ts +23 -8
  918. package/dist/types/components/buttons/buttons.d.ts +5 -1
  919. package/dist/types/components/card/card.d.ts +8 -1
  920. package/dist/types/components/card-content/card-content.d.ts +2 -1
  921. package/dist/types/components/card-header/card-header.d.ts +3 -2
  922. package/dist/types/components/card-subtitle/card-subtitle.d.ts +2 -1
  923. package/dist/types/components/card-title/card-title.d.ts +2 -1
  924. package/dist/types/components/checkbox/checkbox.d.ts +26 -5
  925. package/dist/types/components/chip/chip.d.ts +26 -1
  926. package/dist/types/components/col/col.d.ts +52 -5
  927. package/dist/types/components/content/content.d.ts +3 -0
  928. package/dist/types/components/datetime/datetime.d.ts +26 -1
  929. package/dist/types/components/datetime/utils/data.d.ts +5 -5
  930. package/dist/types/components/datetime-button/datetime-button.d.ts +2 -1
  931. package/dist/types/components/divider/divider.d.ts +20 -0
  932. package/dist/types/components/fab/fab.d.ts +4 -0
  933. package/dist/types/components/fab-button/fab-button.d.ts +11 -3
  934. package/dist/types/components/fab-list/fab-list.d.ts +4 -0
  935. package/dist/types/components/footer/footer-interface.d.ts +1 -0
  936. package/dist/types/components/footer/footer.d.ts +20 -3
  937. package/dist/types/components/gallery/gallery-constants.d.ts +9 -0
  938. package/dist/types/components/gallery/gallery-interface.d.ts +10 -0
  939. package/dist/types/components/gallery/gallery.d.ts +218 -0
  940. package/dist/types/components/gallery/test/utils.d.ts +3 -0
  941. package/dist/types/components/gallery-item/gallery-item.d.ts +33 -0
  942. package/dist/types/components/grid/grid.d.ts +4 -0
  943. package/dist/types/components/header/header-interface.d.ts +1 -0
  944. package/dist/types/components/header/header.d.ts +26 -3
  945. package/dist/types/components/header/header.utils.d.ts +4 -5
  946. package/dist/types/components/img/img.d.ts +2 -1
  947. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +21 -0
  948. package/dist/types/components/infinite-scroll-content/infinite-scroll-content.d.ts +4 -0
  949. package/dist/types/components/input/input.d.ts +40 -17
  950. package/dist/types/components/input-otp/input-otp.d.ts +37 -0
  951. package/dist/types/components/input-password-toggle/input-password-toggle.d.ts +14 -0
  952. package/dist/types/components/item/item.d.ts +17 -4
  953. package/dist/types/components/item-divider/item-divider.d.ts +2 -1
  954. package/dist/types/components/item-group/item-group.d.ts +4 -0
  955. package/dist/types/components/item-option/item-option.d.ts +18 -1
  956. package/dist/types/components/item-options/item-options.d.ts +4 -0
  957. package/dist/types/components/item-sliding/item-sliding.d.ts +47 -1
  958. package/dist/types/components/item-sliding/test/test.utils.d.ts +13 -0
  959. package/dist/types/components/label/label.d.ts +2 -1
  960. package/dist/types/components/list/list.d.ts +15 -1
  961. package/dist/types/components/list-header/list-header.d.ts +2 -1
  962. package/dist/types/components/loading/loading-interface.d.ts +2 -7
  963. package/dist/types/components/loading/loading.d.ts +3 -2
  964. package/dist/types/components/menu/menu.d.ts +3 -0
  965. package/dist/types/components/menu-button/menu-button.d.ts +8 -1
  966. package/dist/types/components/menu-toggle/menu-toggle.d.ts +3 -0
  967. package/dist/types/components/modal/animations/ionic.enter.d.ts +6 -0
  968. package/dist/types/components/modal/animations/ionic.leave.d.ts +6 -0
  969. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  970. package/dist/types/components/modal/modal-interface.d.ts +4 -16
  971. package/dist/types/components/modal/modal.d.ts +15 -12
  972. package/dist/types/components/nav/nav-interface.d.ts +10 -1
  973. package/dist/types/components/nav/nav.d.ts +27 -3
  974. package/dist/types/components/nav-link/nav-link.d.ts +4 -0
  975. package/dist/types/components/note/note.d.ts +2 -1
  976. package/dist/types/components/picker/picker.d.ts +2 -1
  977. package/dist/types/components/picker-column/picker-column.d.ts +2 -1
  978. package/dist/types/components/picker-column-option/picker-column-option.d.ts +4 -0
  979. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +5 -0
  980. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +5 -0
  981. package/dist/types/components/picker-legacy/picker-interface.d.ts +52 -0
  982. package/dist/types/components/picker-legacy/picker.d.ts +159 -0
  983. package/dist/types/components/picker-legacy-column/picker-column.d.ts +46 -0
  984. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +9 -0
  985. package/dist/types/components/popover/popover-interface.d.ts +3 -6
  986. package/dist/types/components/popover/popover.d.ts +6 -5
  987. package/dist/types/components/progress-bar/progress-bar.d.ts +10 -1
  988. package/dist/types/components/radio/radio.d.ts +2 -1
  989. package/dist/types/components/radio-group/radio-group.d.ts +12 -0
  990. package/dist/types/components/range/range.d.ts +2 -1
  991. package/dist/types/components/refresher/refresher.d.ts +2 -1
  992. package/dist/types/components/refresher-content/refresher-content.d.ts +10 -0
  993. package/dist/types/components/reorder/reorder.d.ts +9 -0
  994. package/dist/types/components/reorder-group/reorder-group.d.ts +4 -0
  995. package/dist/types/components/ripple-effect/ripple-effect.d.ts +4 -0
  996. package/dist/types/components/route/route.d.ts +5 -1
  997. package/dist/types/components/router/router.d.ts +4 -0
  998. package/dist/types/components/router-link/router-link.d.ts +4 -0
  999. package/dist/types/components/router-outlet/router-outlet.d.ts +4 -8
  1000. package/dist/types/components/row/row.d.ts +4 -0
  1001. package/dist/types/components/searchbar/searchbar.d.ts +57 -11
  1002. package/dist/types/components/segment/segment.d.ts +2 -1
  1003. package/dist/types/components/segment-button/segment-button.d.ts +2 -1
  1004. package/dist/types/components/select/select.d.ts +55 -26
  1005. package/dist/types/components/select-modal/select-modal.d.ts +13 -0
  1006. package/dist/types/components/select-option/select-option.d.ts +7 -4
  1007. package/dist/types/components/select-popover/select-popover.d.ts +3 -0
  1008. package/dist/types/components/skeleton-text/skeleton-text.d.ts +4 -0
  1009. package/dist/types/components/spinner/spinner.d.ts +15 -0
  1010. package/dist/types/components/split-pane/split-pane.d.ts +4 -0
  1011. package/dist/types/components/tab/tab.d.ts +4 -0
  1012. package/dist/types/components/tab-bar/tab-bar-interface.d.ts +1 -0
  1013. package/dist/types/components/tab-bar/tab-bar.d.ts +41 -3
  1014. package/dist/types/components/tab-button/tab-button.d.ts +12 -1
  1015. package/dist/types/components/tabs/tabs.d.ts +3 -0
  1016. package/dist/types/components/text/text.d.ts +2 -1
  1017. package/dist/types/components/textarea/textarea.d.ts +58 -16
  1018. package/dist/types/components/thumbnail/thumbnail.d.ts +4 -0
  1019. package/dist/types/components/title/title.d.ts +4 -0
  1020. package/dist/types/components/toast/animations/utils.d.ts +2 -2
  1021. package/dist/types/components/toast/toast-interface.d.ts +3 -7
  1022. package/dist/types/components/toast/toast.d.ts +19 -2
  1023. package/dist/types/components/toggle/toggle.d.ts +18 -1
  1024. package/dist/types/components/toolbar/toolbar.d.ts +43 -3
  1025. package/dist/types/components.d.ts +2171 -263
  1026. package/dist/types/global/ionic-global.d.ts +28 -2
  1027. package/dist/types/index.d.ts +1 -1
  1028. package/dist/types/interface.d.ts +4 -0
  1029. package/dist/types/utils/config.d.ts +133 -3
  1030. package/dist/types/utils/css-value-validation.d.ts +21 -0
  1031. package/dist/types/utils/focus-trap.d.ts +1 -1
  1032. package/dist/types/utils/focus-visible.d.ts +13 -0
  1033. package/dist/types/utils/forms/clear-button-press-controller.d.ts +20 -0
  1034. package/dist/types/utils/forms/index.d.ts +1 -1
  1035. package/dist/types/utils/forms/validity.d.ts +7 -0
  1036. package/dist/types/utils/helpers.d.ts +22 -0
  1037. package/dist/types/utils/logging/index.d.ts +1 -2
  1038. package/dist/types/utils/overlay-control-label.d.ts +11 -9
  1039. package/dist/types/utils/overlays-interface.d.ts +31 -1
  1040. package/dist/types/utils/overlays.d.ts +10 -12
  1041. package/dist/types/utils/scroll-hide-controller.d.ts +56 -0
  1042. package/dist/types/utils/test/playwright/drag-element.d.ts +16 -3
  1043. package/dist/types/utils/test/playwright/generator.d.ts +31 -2
  1044. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  1045. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  1046. package/dist/types/utils/theme.d.ts +9 -0
  1047. package/hydrate/index.js +12008 -10485
  1048. package/hydrate/index.mjs +12008 -10485
  1049. package/package.json +16 -56
  1050. package/components/p--m5cCjbK.js +0 -4
  1051. package/components/p-1jI5oW-W.js +0 -4
  1052. package/components/p-8FN7p701.js +0 -4
  1053. package/components/p-B4uHHhPK.js +0 -4
  1054. package/components/p-BMPN55of.js +0 -4
  1055. package/components/p-BNJOu1Q2.js +0 -4
  1056. package/components/p-BOvLNVKq.js +0 -4
  1057. package/components/p-BSQPZ79H.js +0 -4
  1058. package/components/p-BeamQXHF.js +0 -4
  1059. package/components/p-BhamHSw3.js +0 -4
  1060. package/components/p-Bjig0DJK.js +0 -4
  1061. package/components/p-BjluhQMI.js +0 -4
  1062. package/components/p-BlsIikdZ.js +0 -4
  1063. package/components/p-BmVRXR1y.js +0 -4
  1064. package/components/p-BqPNzJf6.js +0 -4
  1065. package/components/p-BrD9Xv62.js +0 -4
  1066. package/components/p-BvJqoZ5R.js +0 -4
  1067. package/components/p-Bz6z3Asd.js +0 -4
  1068. package/components/p-C5KYjZWD.js +0 -4
  1069. package/components/p-C6HnVvHO.js +0 -4
  1070. package/components/p-C7jvh5Wy.js +0 -4
  1071. package/components/p-C9BGR5fy.js +0 -4
  1072. package/components/p-CB-y1CdP.js +0 -4
  1073. package/components/p-CEW4RXZO.js +0 -4
  1074. package/components/p-CHH3loEE.js +0 -4
  1075. package/components/p-CIGNaXM1.js +0 -4
  1076. package/components/p-CJKUWjmg.js +0 -4
  1077. package/components/p-C_phlPMC.js +0 -4
  1078. package/components/p-CbhUdtjf.js +0 -4
  1079. package/components/p-CejmQs3h.js +0 -4
  1080. package/components/p-CtZqa4HM.js +0 -4
  1081. package/components/p-D7-vHX0A.js +0 -4
  1082. package/components/p-D9qIVSWm.js +0 -4
  1083. package/components/p-DD5fQ4EQ.js +0 -4
  1084. package/components/p-DE-3iMNW.js +0 -4
  1085. package/components/p-DFvZn99E.js +0 -4
  1086. package/components/p-DHFt2rdc.js +0 -4
  1087. package/components/p-DJztqcrH.js +0 -4
  1088. package/components/p-DM-PrAoh.js +0 -4
  1089. package/components/p-DSzSbVP2.js +0 -4
  1090. package/components/p-DV85C0e0.js +0 -4
  1091. package/components/p-DWCzVL3Y.js +0 -4
  1092. package/components/p-D_RCyzwu.js +0 -4
  1093. package/components/p-D_tD8r3L.js +0 -4
  1094. package/components/p-DaA_8eqt.js +0 -4
  1095. package/components/p-DjCtLZbF.js +0 -4
  1096. package/components/p-Dmd2xqCe.js +0 -4
  1097. package/components/p-Dojwmvde.js +0 -4
  1098. package/components/p-G0TxqHfe.js +0 -4
  1099. package/components/p-G6JR-cr_.js +0 -4
  1100. package/components/p-GG5GhznE.js +0 -4
  1101. package/components/p-LpMHEu3v.js +0 -4
  1102. package/components/p-TXPDHL13.js +0 -4
  1103. package/components/p-UIBJkZf8.js +0 -4
  1104. package/components/p-ZjP4CjeZ.js +0 -4
  1105. package/components/p-_IKFD3ID.js +0 -4
  1106. package/components/p-byZM6qHV.js +0 -4
  1107. package/components/p-dKq2jIum.js +0 -4
  1108. package/components/p-fruGqVHh.js +0 -4
  1109. package/components/p-iYhH60Tc.js +0 -4
  1110. package/components/p-ia3IDdJS.js +0 -4
  1111. package/dist/cjs/hardware-back-button-fqpYh-kd.js +0 -121
  1112. package/dist/cjs/index-DkNv4J_i.js +0 -10
  1113. package/dist/cjs/input.utils-BZdMWVrt.js +0 -35
  1114. package/dist/cjs/ion-datetime.cjs.entry.js +0 -2770
  1115. package/dist/cjs/ionic-global-k6hOWWpn.js +0 -156
  1116. package/dist/cjs/keyboard-controller-PtZoN2GS.js +0 -167
  1117. package/dist/cjs/slot-mutation-controller-DPHmqXdV.js +0 -397
  1118. package/dist/cjs/validity-BpS37YFM.js +0 -19
  1119. package/dist/collection/utils/forms/start-container-controller.js +0 -132
  1120. package/dist/esm/hardware-back-button-gLJHMX_F.js +0 -115
  1121. package/dist/esm/index-ZjP4CjeZ.js +0 -7
  1122. package/dist/esm/input.utils-B1ValN_N.js +0 -33
  1123. package/dist/esm/ion-datetime.entry.js +0 -2768
  1124. package/dist/esm/ionic-global-BVB7BrLT.js +0 -151
  1125. package/dist/esm/keyboard-controller-DEwoa1ev.js +0 -165
  1126. package/dist/esm/slot-mutation-controller-DiE_C9un.js +0 -393
  1127. package/dist/esm/theme-byZM6qHV.js +0 -48
  1128. package/dist/esm/validity-DJztqcrH.js +0 -17
  1129. package/dist/ionic/p-06ec7136.entry.js +0 -4
  1130. package/dist/ionic/p-09fe4fa3.entry.js +0 -4
  1131. package/dist/ionic/p-10d45a07.entry.js +0 -4
  1132. package/dist/ionic/p-208c8a07.entry.js +0 -4
  1133. package/dist/ionic/p-212474fa.entry.js +0 -4
  1134. package/dist/ionic/p-2eef1396.entry.js +0 -4
  1135. package/dist/ionic/p-347e005d.entry.js +0 -4
  1136. package/dist/ionic/p-3a0b3f1d.entry.js +0 -4
  1137. package/dist/ionic/p-3b071259.entry.js +0 -4
  1138. package/dist/ionic/p-40424a88.entry.js +0 -4
  1139. package/dist/ionic/p-4204184c.entry.js +0 -4
  1140. package/dist/ionic/p-47464391.entry.js +0 -4
  1141. package/dist/ionic/p-4eOQC00Z.js +0 -4
  1142. package/dist/ionic/p-4f9c9126.entry.js +0 -4
  1143. package/dist/ionic/p-5JsKPLJD.js +0 -4
  1144. package/dist/ionic/p-5bc485c6.entry.js +0 -4
  1145. package/dist/ionic/p-603a61e6.entry.js +0 -4
  1146. package/dist/ionic/p-60576951.entry.js +0 -4
  1147. package/dist/ionic/p-67a81d33.entry.js +0 -4
  1148. package/dist/ionic/p-6affb775.entry.js +0 -4
  1149. package/dist/ionic/p-6f120c25.entry.js +0 -4
  1150. package/dist/ionic/p-71c82b60.entry.js +0 -4
  1151. package/dist/ionic/p-79325ffe.entry.js +0 -4
  1152. package/dist/ionic/p-7CBuOvEo.js +0 -4
  1153. package/dist/ionic/p-7e4d51fa.entry.js +0 -4
  1154. package/dist/ionic/p-7f5d4664.entry.js +0 -4
  1155. package/dist/ionic/p-80ee82fc.entry.js +0 -4
  1156. package/dist/ionic/p-84af7dbc.entry.js +0 -4
  1157. package/dist/ionic/p-89ca830a.entry.js +0 -4
  1158. package/dist/ionic/p-93b8ec8f.entry.js +0 -4
  1159. package/dist/ionic/p-946f65c2.entry.js +0 -4
  1160. package/dist/ionic/p-9c4b39fb.entry.js +0 -4
  1161. package/dist/ionic/p-B1NEZUzQ.js +0 -4
  1162. package/dist/ionic/p-B1ck5iy-.js +0 -4
  1163. package/dist/ionic/p-B4FrqdW0.js +0 -4
  1164. package/dist/ionic/p-BB0LlG4y.js +0 -4
  1165. package/dist/ionic/p-BMPN55of.js +0 -4
  1166. package/dist/ionic/p-BSQPZ79H.js +0 -4
  1167. package/dist/ionic/p-BYEAtHr-.js +0 -4
  1168. package/dist/ionic/p-BhamHSw3.js +0 -4
  1169. package/dist/ionic/p-BmVRXR1y.js +0 -4
  1170. package/dist/ionic/p-BvabGprD.js +0 -4
  1171. package/dist/ionic/p-C-94tAim.js +0 -4
  1172. package/dist/ionic/p-C-eHZMYE.js +0 -4
  1173. package/dist/ionic/p-CBR_W98Z.js +0 -4
  1174. package/dist/ionic/p-CBWAXjA5.js +0 -4
  1175. package/dist/ionic/p-CIGNaXM1.js +0 -4
  1176. package/dist/ionic/p-CMRtMbJc.js +0 -4
  1177. package/dist/ionic/p-CPcPmkGv.js +0 -4
  1178. package/dist/ionic/p-CaRuIadB.js +0 -4
  1179. package/dist/ionic/p-Cdjxf_yg.js +0 -4
  1180. package/dist/ionic/p-ChhhtsGZ.js +0 -5
  1181. package/dist/ionic/p-CzS1qWve.js +0 -4
  1182. package/dist/ionic/p-D5t_-oMk.js +0 -4
  1183. package/dist/ionic/p-D94_RztK.js +0 -4
  1184. package/dist/ionic/p-DJztqcrH.js +0 -4
  1185. package/dist/ionic/p-DWCzVL3Y.js +0 -4
  1186. package/dist/ionic/p-DjjfauRM.js +0 -4
  1187. package/dist/ionic/p-DkUB-ROc.js +0 -4
  1188. package/dist/ionic/p-Dn0mqQ_R.js +0 -4
  1189. package/dist/ionic/p-Dojwmvde.js +0 -4
  1190. package/dist/ionic/p-DplOqGUv.js +0 -4
  1191. package/dist/ionic/p-Dst_XmZh.js +0 -4
  1192. package/dist/ionic/p-T71k3C35.js +0 -4
  1193. package/dist/ionic/p-TXPDHL13.js +0 -4
  1194. package/dist/ionic/p-UIBJkZf8.js +0 -4
  1195. package/dist/ionic/p-ZjP4CjeZ.js +0 -4
  1196. package/dist/ionic/p-a438b193.entry.js +0 -4
  1197. package/dist/ionic/p-babaaaa7.entry.js +0 -4
  1198. package/dist/ionic/p-be08d500.entry.js +0 -4
  1199. package/dist/ionic/p-be9a4f51.entry.js +0 -4
  1200. package/dist/ionic/p-byZM6qHV.js +0 -4
  1201. package/dist/ionic/p-c00d3092.entry.js +0 -4
  1202. package/dist/ionic/p-c36dc8f5.entry.js +0 -4
  1203. package/dist/ionic/p-c72a7e17.entry.js +0 -4
  1204. package/dist/ionic/p-c8edd88c.entry.js +0 -4
  1205. package/dist/ionic/p-ce0e380b.entry.js +0 -4
  1206. package/dist/ionic/p-ce32912b.entry.js +0 -4
  1207. package/dist/ionic/p-d07cf130.entry.js +0 -4
  1208. package/dist/ionic/p-d27edeb3.entry.js +0 -4
  1209. package/dist/ionic/p-d5d2c506.entry.js +0 -4
  1210. package/dist/ionic/p-d5e31ca9.entry.js +0 -4
  1211. package/dist/ionic/p-de91444f.entry.js +0 -4
  1212. package/dist/ionic/p-ded69ceb.entry.js +0 -4
  1213. package/dist/ionic/p-df72866d.entry.js +0 -4
  1214. package/dist/ionic/p-e47e3151.entry.js +0 -4
  1215. package/dist/ionic/p-e621e5e8.entry.js +0 -4
  1216. package/dist/ionic/p-eea9cf93.entry.js +0 -4
  1217. package/dist/ionic/p-f402f5a4.entry.js +0 -4
  1218. package/dist/ionic/p-fe1bfbcf.entry.js +0 -4
  1219. package/dist/ionic/p-ffb90460.entry.js +0 -4
  1220. package/dist/types/utils/forms/start-container-controller.d.ts +0 -34
  1221. /package/dist/collection/components/{input-password-toggle/input-password-toggle.css → refresher-content/refresher-content.css} +0 -0
@@ -10,7 +10,7 @@ import { isRTL } from "../../utils/rtl/index";
10
10
  import { createColorClasses } from "../../utils/theme";
11
11
  import { caretDownSharp, caretUpSharp, chevronBack, chevronDown, chevronForward } from "ionicons/icons";
12
12
  import { config } from "../../global/config";
13
- import { getIonMode } from "../../global/ionic-global";
13
+ import { getIonMode, getIonTheme } from "../../global/ionic-global";
14
14
  import { isSameDay, warnIfValueOutOfBounds, isBefore, isAfter } from "./utils/comparison";
15
15
  import { generateMonths, getDaysOfMonth, getDaysOfWeek, getToday, getMonthColumnData, getDayColumnData, getYearColumnData, getTimeColumnsData, getCombinedDateColumnData, } from "./utils/data";
16
16
  import { formatValue, getLocalizedDateTime, getLocalizedTime, getMonthAndYear } from "./utils/format";
@@ -20,7 +20,8 @@ import { clampDate, convertToArrayOfNumbers, getPartsFromCalendarDay, parseAmPm,
20
20
  import { getCalendarDayState, getHighlightStyles, isDayDisabled, isMonthDisabled, isNextMonthDisabled, isPrevMonthDisabled, } from "./utils/state";
21
21
  import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./utils/validate";
22
22
  /**
23
- * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
23
+ * @virtualProp {"ios" | "md"} mode - The mode determines the platform behaviors of the component.
24
+ * @virtualProp {"ios" | "md" | "ionic"} theme - The theme determines the visual appearance of the component.
24
25
  *
25
26
  * @slot title - The title of the datetime.
26
27
  * @slot buttons - The buttons in the datetime.
@@ -54,364 +55,814 @@ import { checkForPresentationFormatMismatch, warnIfTimeZoneProvided } from "./ut
54
55
  * @part datetime-selected-date - The element that contains the selected date.
55
56
  */
56
57
  export class Datetime {
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;
58
+ constructor() {
59
+ this.inputId = `ion-dt-${datetimeIds++}`;
60
+ /**
61
+ * Set true only by `visibleCallback`. Lets `hiddenCallback` ignore the
62
+ * synthetic "not intersecting" entry IntersectionObserver fires on
63
+ * `observe()` when the host mounts offscreen.
64
+ *
65
+ * Don't reset this in `disconnectedCallback`. Overlays disconnect and
66
+ * reconnect the host without re-creating the observers, so a reset there
67
+ * makes `hiddenCallback` miss the dismissal.
68
+ */
69
+ this.hasBeenIntersecting = false;
70
+ this.prevPresentation = null;
71
+ this.showMonthAndYear = false;
72
+ this.activeParts = [];
73
+ this.workingParts = {
74
+ month: 5,
75
+ day: 28,
76
+ year: 2021,
77
+ hour: 13,
78
+ minute: 52,
79
+ ampm: 'pm',
80
+ isAdjacentDay: false,
81
+ };
82
+ this.isTimePopoverOpen = false;
83
+ /**
84
+ * The color to use from your application's color palette.
85
+ * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
86
+ * For more information on colors, refer to [theming](/docs/theming/basics).
87
+ */
88
+ this.color = 'primary';
89
+ /**
90
+ * The name of the control, which is submitted with the form data.
91
+ */
92
+ this.name = this.inputId;
93
+ /**
94
+ * If `true`, the user cannot interact with the datetime.
95
+ */
96
+ this.disabled = false;
97
+ /**
98
+ * If `true`, the datetime appears normal but the selected date cannot be changed.
99
+ */
100
+ this.readonly = false;
101
+ /**
102
+ * If `true`, the datetime calendar displays a six-week (42-day) layout,
103
+ * including days from the previous and next months to fill the grid.
104
+ * These adjacent days are selectable unless disabled.
105
+ */
106
+ this.showAdjacentDays = false;
107
+ /**
108
+ * Which values you want to select. `"date"` will show
109
+ * a calendar picker to select the month, day, and year. `"time"`
110
+ * will show a time picker to select the hour, minute, and (optionally)
111
+ * AM/PM. `"date-time"` will show the date picker first and time picker second.
112
+ * `"time-date"` will show the time picker first and date picker second.
113
+ */
114
+ this.presentation = 'date-time';
115
+ /**
116
+ * The text to display on the picker's cancel button.
117
+ */
118
+ this.cancelText = 'Cancel';
119
+ /**
120
+ * The text to display on the picker's "Done" button.
121
+ */
122
+ this.doneText = 'Done';
123
+ /**
124
+ * The text to display on the picker's "Clear" button.
125
+ */
126
+ this.clearText = 'Clear';
127
+ /**
128
+ * The locale to use for `ion-datetime`. This
129
+ * impacts month and day name formatting.
130
+ * The `"default"` value refers to the default
131
+ * locale set by your device.
132
+ */
133
+ this.locale = 'default';
134
+ /**
135
+ * The first day of the week to use for `ion-datetime`. The
136
+ * default value is `0` and represents Sunday.
137
+ */
138
+ this.firstDayOfWeek = 0;
139
+ /**
140
+ * If `true`, multiple dates can be selected at once. Only
141
+ * applies to `presentation="date"` and `preferWheel="false"`.
142
+ */
143
+ this.multiple = false;
144
+ /**
145
+ * If `true`, a header will be shown above the calendar
146
+ * picker. This will include both the slotted title, and
147
+ * the selected date.
148
+ */
149
+ this.showDefaultTitle = false;
150
+ /**
151
+ * If `true`, the default "Cancel" and "OK" buttons
152
+ * will be rendered at the bottom of the `ion-datetime`
153
+ * component. Developers can also use the `button` slot
154
+ * if they want to customize these buttons. If custom
155
+ * buttons are set in the `button` slot then the
156
+ * default buttons will not be rendered.
157
+ */
158
+ this.showDefaultButtons = false;
159
+ /**
160
+ * If `true`, a "Clear" button will be rendered alongside
161
+ * the default "Cancel" and "OK" buttons at the bottom of the `ion-datetime`
162
+ * component. Developers can also use the `button` slot
163
+ * if they want to customize these buttons. If custom
164
+ * buttons are set in the `button` slot then the
165
+ * default buttons will not be rendered.
166
+ */
167
+ this.showClearButton = false;
168
+ /**
169
+ * If `true`, the default "Time" label will be rendered
170
+ * for the time selector of the `ion-datetime` component.
171
+ * Developers can also use the `time-label` slot
172
+ * if they want to customize this label. If a custom
173
+ * label is set in the `time-label` slot then the
174
+ * default label will not be rendered.
175
+ */
176
+ this.showDefaultTimeLabel = true;
177
+ /**
178
+ * If `cover`, the `ion-datetime` will expand to cover the full width of its container.
179
+ * If `fixed`, the `ion-datetime` will have a fixed width.
180
+ */
181
+ this.size = 'fixed';
182
+ /**
183
+ * If `true`, a wheel picker will be rendered instead of a calendar grid
184
+ * where possible. If `false`, a calendar grid will be rendered instead of
185
+ * a wheel picker where possible.
186
+ *
187
+ * A wheel picker can be rendered instead of a grid when `presentation` is
188
+ * one of the following values: `"date"`, `"date-time"`, or `"time-date"`.
189
+ *
190
+ * A wheel picker will always be rendered regardless of
191
+ * the `preferWheel` value when `presentation` is one of the following values:
192
+ * `"time"`, `"month"`, `"month-year"`, or `"year"`.
193
+ */
194
+ this.preferWheel = false;
195
+ this.warnIfIncorrectValueUsage = () => {
196
+ const { multiple, value } = this;
197
+ if (!multiple && Array.isArray(value)) {
198
+ /**
199
+ * We do some processing on the `value` array so
200
+ * that it looks more like an array when logged to
201
+ * the console.
202
+ * Example given ['a', 'b']
203
+ * Default toString() behavior: a,b
204
+ * Custom behavior: ['a', 'b']
205
+ */
206
+ 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".
207
+
208
+ Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
209
+ `, this.el);
210
+ }
211
+ };
212
+ this.setValue = (value) => {
213
+ this.value = value;
214
+ this.ionChange.emit({ value });
215
+ };
216
+ /**
217
+ * Returns the DatetimePart interface
218
+ * to use when rendering an initial set of
219
+ * data. This should be used when rendering an
220
+ * interface in an environment where the `value`
221
+ * may not be set. This function works
222
+ * by returning the first selected date and then
223
+ * falling back to defaultParts if no active date
224
+ * is selected.
225
+ */
226
+ this.getActivePartsWithFallback = () => {
227
+ var _a;
228
+ const { defaultParts } = this;
229
+ return (_a = this.getActivePart()) !== null && _a !== void 0 ? _a : defaultParts;
230
+ };
231
+ this.getActivePart = () => {
232
+ const { activeParts } = this;
233
+ return Array.isArray(activeParts) ? activeParts[0] : activeParts;
234
+ };
235
+ this.closeParentOverlay = (role) => {
236
+ const popoverOrModal = this.el.closest('ion-modal, ion-popover');
237
+ if (popoverOrModal) {
238
+ popoverOrModal.dismiss(undefined, role);
239
+ }
240
+ };
241
+ this.setWorkingParts = (parts) => {
242
+ this.workingParts = Object.assign({}, parts);
243
+ };
244
+ this.setActiveParts = (parts, removeDate = false) => {
245
+ /** if the datetime component is in readonly mode,
246
+ * allow browsing of the calendar without changing
247
+ * the set value
248
+ */
249
+ if (this.readonly) {
250
+ return;
251
+ }
252
+ const { multiple, minParts, maxParts, activeParts } = this;
253
+ /**
254
+ * When setting the active parts, it is possible
255
+ * to set invalid data. For example,
256
+ * when updating January 31 to February,
257
+ * February 31 does not exist. As a result
258
+ * we need to validate the active parts and
259
+ * ensure that we are only setting valid dates.
260
+ * Additionally, we need to update the working parts
261
+ * too in the event that the validated parts are different.
262
+ */
263
+ const validatedParts = validateParts(parts, minParts, maxParts);
264
+ this.setWorkingParts(validatedParts);
265
+ if (multiple) {
266
+ const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
267
+ if (removeDate) {
268
+ this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
269
+ }
270
+ else {
271
+ this.activeParts = [...activePartsArray, validatedParts];
272
+ }
273
+ }
274
+ else {
275
+ this.activeParts = Object.assign({}, validatedParts);
276
+ }
277
+ const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
278
+ if (hasSlottedButtons || this.showDefaultButtons) {
279
+ return;
280
+ }
281
+ this.confirm();
282
+ };
283
+ this.initializeKeyboardListeners = () => {
284
+ const calendarBodyRef = this.calendarBodyRef;
285
+ if (!calendarBodyRef) {
286
+ return;
287
+ }
288
+ const root = this.el.shadowRoot;
289
+ /**
290
+ * Get a reference to the month
291
+ * element we are currently viewing.
292
+ */
293
+ const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
294
+ /**
295
+ * When focusing the calendar body, we want to pass focus
296
+ * to the working day, but other days should
297
+ * only be accessible using the arrow keys. Pressing
298
+ * Tab should jump between bodies of selectable content.
299
+ */
300
+ const checkCalendarBodyFocus = (ev) => {
301
+ var _a;
302
+ const record = ev[0];
303
+ /**
304
+ * If calendar body was already focused
305
+ * when this fired or if the calendar body
306
+ * if not currently focused, we should not re-focus
307
+ * the inner day.
308
+ */
309
+ if (((_a = record.oldValue) === null || _a === void 0 ? void 0 : _a.includes('ion-focused')) || !calendarBodyRef.classList.contains('ion-focused')) {
310
+ return;
311
+ }
312
+ this.focusWorkingDay(currentMonth);
313
+ };
314
+ const mo = new MutationObserver(checkCalendarBodyFocus);
315
+ mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
316
+ this.destroyKeyboardMO = () => {
317
+ mo === null || mo === void 0 ? void 0 : mo.disconnect();
318
+ };
319
+ /**
320
+ * We must use keydown not keyup as we want
321
+ * to prevent scrolling when using the arrow keys.
322
+ */
323
+ calendarBodyRef.addEventListener('keydown', (ev) => {
324
+ const activeElement = root.activeElement;
325
+ if (!activeElement || !activeElement.classList.contains('calendar-day')) {
326
+ return;
327
+ }
328
+ const parts = getPartsFromCalendarDay(activeElement);
329
+ let partsToFocus;
330
+ switch (ev.key) {
331
+ case 'ArrowDown':
332
+ ev.preventDefault();
333
+ partsToFocus = getNextWeek(parts);
334
+ break;
335
+ case 'ArrowUp':
336
+ ev.preventDefault();
337
+ partsToFocus = getPreviousWeek(parts);
338
+ break;
339
+ case 'ArrowRight':
340
+ ev.preventDefault();
341
+ partsToFocus = getNextDay(parts);
342
+ break;
343
+ case 'ArrowLeft':
344
+ ev.preventDefault();
345
+ partsToFocus = getPreviousDay(parts);
346
+ break;
347
+ case 'Home':
348
+ ev.preventDefault();
349
+ partsToFocus = getStartOfWeek(parts);
350
+ break;
351
+ case 'End':
352
+ ev.preventDefault();
353
+ partsToFocus = getEndOfWeek(parts);
354
+ break;
355
+ case 'PageUp':
356
+ ev.preventDefault();
357
+ partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
358
+ break;
359
+ case 'PageDown':
360
+ ev.preventDefault();
361
+ partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
362
+ break;
363
+ /**
364
+ * Do not preventDefault here
365
+ * as we do not want to override other
366
+ * browser defaults such as pressing Enter/Space
367
+ * to select a day.
368
+ */
369
+ default:
370
+ return;
371
+ }
372
+ /**
373
+ * If the day we want to move focus to is
374
+ * disabled, do not do anything.
375
+ */
376
+ if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
377
+ return;
378
+ }
379
+ this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), partsToFocus));
380
+ /**
381
+ * Give view a chance to re-render
382
+ * then move focus to the new working day
383
+ */
384
+ requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
385
+ });
386
+ };
387
+ this.focusWorkingDay = (currentMonth) => {
388
+ /**
389
+ * Get the number of offset days so
390
+ * we know how much to offset our next selector by
391
+ * to grab the correct calendar-day element.
392
+ */
393
+ const { day, month, year } = this.workingParts;
394
+ const firstOfMonth = new Date(`${month}/1/${year}`).getDay();
395
+ const offset = firstOfMonth >= this.firstDayOfWeek
396
+ ? firstOfMonth - this.firstDayOfWeek
397
+ : 7 - (this.firstDayOfWeek - firstOfMonth);
398
+ if (day === null) {
399
+ return;
400
+ }
401
+ /**
402
+ * Get the calendar day element
403
+ * and focus it.
404
+ */
405
+ const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${offset + day}) .calendar-day`);
406
+ if (dayEl) {
407
+ dayEl.focus();
408
+ }
409
+ };
410
+ this.processMinParts = () => {
411
+ const { min, defaultParts } = this;
412
+ if (min === undefined) {
413
+ this.minParts = undefined;
414
+ return;
415
+ }
416
+ this.minParts = parseMinParts(min, defaultParts);
417
+ };
418
+ this.processMaxParts = () => {
419
+ const { max, defaultParts } = this;
420
+ if (max === undefined) {
421
+ this.maxParts = undefined;
422
+ return;
423
+ }
424
+ this.maxParts = parseMaxParts(max, defaultParts);
425
+ };
426
+ this.initializeCalendarListener = () => {
427
+ const calendarBodyRef = this.calendarBodyRef;
428
+ if (!calendarBodyRef) {
429
+ return;
430
+ }
431
+ /**
432
+ * For performance reasons, we only render 3
433
+ * months at a time: The current month, the previous
434
+ * month, and the next month. We have a scroll listener
435
+ * on the calendar body to append/prepend new months.
436
+ *
437
+ * We can do this because Stencil is smart enough to not
438
+ * re-create the .calendar-month containers, but rather
439
+ * update the content within those containers.
440
+ *
441
+ * As an added bonus, WebKit has some troubles with
442
+ * scroll-snap-stop: always, so not rendering all of
443
+ * the months in a row allows us to mostly sidestep
444
+ * that issue.
445
+ */
446
+ const months = calendarBodyRef.querySelectorAll('.calendar-month');
447
+ const startMonth = months[0];
448
+ const workingMonth = months[1];
449
+ const endMonth = months[2];
450
+ const mode = getIonMode(this);
451
+ const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
452
+ /**
453
+ * Before setting up the scroll listener,
454
+ * scroll the middle month into view.
455
+ * scrollIntoView() will scroll entire page
456
+ * if element is not in viewport. Use scrollLeft instead.
457
+ */
458
+ writeTask(() => {
459
+ calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
460
+ const getChangedMonth = (parts) => {
461
+ const box = calendarBodyRef.getBoundingClientRect();
462
+ /**
463
+ * If the current scroll position is all the way to the left
464
+ * then we have scrolled to the previous month.
465
+ * Otherwise, assume that we have scrolled to the next
466
+ * month. We have a tolerance of 2px to account for
467
+ * sub pixel rendering.
468
+ *
469
+ * Check below the next line ensures that we did not
470
+ * swipe and abort (i.e. we swiped but we are still on the current month).
471
+ */
472
+ const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
473
+ const month = condition ? startMonth : endMonth;
474
+ /**
475
+ * The edge of the month must be lined up with
476
+ * the edge of the calendar body in order for
477
+ * the component to update. Otherwise, it
478
+ * may be the case that the user has paused their
479
+ * swipe or the browser has not finished snapping yet.
480
+ * Rather than check if the x values are equal,
481
+ * we give it a tolerance of 2px to account for
482
+ * sub pixel rendering.
483
+ */
484
+ const monthBox = month.getBoundingClientRect();
485
+ if (Math.abs(monthBox.x - box.x) > 2)
486
+ return;
487
+ /**
488
+ * If we're force-rendering a month, assume we've
489
+ * scrolled to that and return it.
490
+ *
491
+ * If forceRenderDate is ever used in a context where the
492
+ * forced month is not immediately auto-scrolled to, this
493
+ * should be updated to also check whether `month` has the
494
+ * same month and year as the forced date.
495
+ */
496
+ const { forceRenderDate } = this;
497
+ if (forceRenderDate !== undefined) {
498
+ return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
499
+ }
500
+ /**
501
+ * From here, we can determine if the start
502
+ * month or the end month was scrolled into view.
503
+ * If no month was changed, then we can return from
504
+ * the scroll callback early.
505
+ */
506
+ if (month === startMonth) {
507
+ return getPreviousMonth(parts);
508
+ }
509
+ else if (month === endMonth) {
510
+ return getNextMonth(parts);
511
+ }
512
+ else {
513
+ return;
514
+ }
515
+ };
516
+ const updateActiveMonth = () => {
517
+ if (needsiOSRubberBandFix) {
518
+ calendarBodyRef.style.removeProperty('pointer-events');
519
+ appliediOSRubberBandFix = false;
520
+ }
521
+ /**
522
+ * If the month did not change
523
+ * then we can return early.
524
+ */
525
+ const newDate = getChangedMonth(this.workingParts);
526
+ if (!newDate)
527
+ return;
528
+ const { month, day, year } = newDate;
529
+ if (isMonthDisabled({ month, year, day: null }, {
530
+ minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
531
+ maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
532
+ })) {
533
+ return;
534
+ }
535
+ /**
536
+ * Prevent scrolling for other browsers
537
+ * to give the DOM time to update and the container
538
+ * time to properly snap.
539
+ */
540
+ calendarBodyRef.style.setProperty('overflow', 'hidden');
541
+ /**
542
+ * Use a writeTask here to ensure
543
+ * that the state is updated and the
544
+ * correct month is scrolled into view
545
+ * in the same frame. This is not
546
+ * typically a problem on newer devices
547
+ * but older/slower device may have a flicker
548
+ * if we did not do this.
549
+ */
550
+ writeTask(() => {
551
+ var _a;
552
+ this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month, day: day, year }));
553
+ calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
554
+ calendarBodyRef.style.removeProperty('overflow');
555
+ if (this.resolveForceDateScrolling) {
556
+ this.resolveForceDateScrolling();
557
+ }
558
+ const activeEl = this.el.shadowRoot.activeElement;
559
+ if (activeEl && activeEl.classList.contains('calendar-day')) {
560
+ (_a = activeEl.closest('.calendar-body')) === null || _a === void 0 ? void 0 : _a.focus();
561
+ }
562
+ });
563
+ };
564
+ /**
565
+ * When the container finishes scrolling we
566
+ * need to update the DOM with the selected month.
567
+ */
568
+ let scrollTimeout;
569
+ /**
570
+ * We do not want to attempt to set pointer-events
571
+ * multiple times within a single swipe gesture as
572
+ * that adds unnecessary work to the main thread.
573
+ */
574
+ let appliediOSRubberBandFix = false;
575
+ const scrollCallback = () => {
576
+ if (scrollTimeout) {
577
+ clearTimeout(scrollTimeout);
578
+ }
579
+ /**
580
+ * On iOS it is possible to quickly rubber band
581
+ * the scroll area before the scroll timeout has fired.
582
+ * This results in users reaching the end of the scrollable
583
+ * container before the DOM has updated.
584
+ * By setting `pointer-events: none` we can ensure that
585
+ * subsequent swipes do not happen while the container
586
+ * is snapping.
587
+ */
588
+ if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
589
+ calendarBodyRef.style.setProperty('pointer-events', 'none');
590
+ appliediOSRubberBandFix = true;
591
+ }
592
+ // Wait ~3 frames
593
+ scrollTimeout = setTimeout(updateActiveMonth, 50);
594
+ };
595
+ calendarBodyRef.addEventListener('scroll', scrollCallback);
596
+ this.destroyCalendarListener = () => {
597
+ calendarBodyRef.removeEventListener('scroll', scrollCallback);
598
+ };
599
+ });
600
+ };
601
+ /**
602
+ * Clean up all listeners except for the overlay
603
+ * listener. This is so that we can re-create the listeners
604
+ * if the datetime has been hidden/presented by a modal or popover.
605
+ */
606
+ this.destroyInteractionListeners = () => {
607
+ const { destroyCalendarListener, destroyKeyboardMO } = this;
608
+ if (destroyCalendarListener !== undefined) {
609
+ destroyCalendarListener();
610
+ }
611
+ if (destroyKeyboardMO !== undefined) {
612
+ destroyKeyboardMO();
613
+ }
614
+ };
615
+ /**
616
+ * TODO(FW-6931): Remove this fallback upon solving the root cause
617
+ * Fallback to ensure the datetime becomes ready even if
618
+ * IntersectionObserver never reports it as intersecting.
619
+ *
620
+ * This is primarily used in environments where the observer
621
+ * might not fire as expected, such as when running under
622
+ * synthetic tests that stub IntersectionObserver.
623
+ */
624
+ this.ensureReadyIfVisible = () => {
625
+ if (this.el.classList.contains('datetime-ready')) {
626
+ return;
627
+ }
628
+ const rect = this.el.getBoundingClientRect();
629
+ if (rect.width === 0 || rect.height === 0) {
630
+ return;
631
+ }
632
+ this.markReady();
633
+ };
634
+ this.markReady = () => {
635
+ if (this.el.classList.contains('datetime-ready')) {
636
+ return;
637
+ }
638
+ this.initializeListeners();
639
+ /**
640
+ * TODO FW-2793: Datetime needs a frame to ensure that it
641
+ * can properly scroll contents into view. As a result
642
+ * we hide the scrollable content until after that frame
643
+ * so users do not see the content quickly shifting. The downside
644
+ * is that the content will pop into view a frame after. Maybe there
645
+ * is a better way to handle this?
646
+ */
647
+ writeTask(() => {
648
+ this.el.classList.add('datetime-ready');
649
+ });
650
+ };
651
+ this.loadTimeoutCleanup = () => {
652
+ if (this.loadTimeout) {
653
+ clearTimeout(this.loadTimeout);
654
+ this.loadTimeout = undefined;
655
+ }
656
+ };
657
+ this.processValue = (value) => {
658
+ const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
659
+ const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
660
+ const { minParts, maxParts, workingParts, el } = this;
661
+ this.warnIfIncorrectValueUsage();
662
+ /**
663
+ * Return early if the value wasn't parsed correctly, such as
664
+ * if an improperly formatted date string was provided.
665
+ */
666
+ if (!valueToProcess) {
667
+ return;
668
+ }
669
+ /**
670
+ * Datetime should only warn of out of bounds values
671
+ * if set by the user. If the `value` is undefined,
672
+ * we will default to today's date which may be out
673
+ * of bounds. In this case, the warning makes it look
674
+ * like the developer did something wrong which is
675
+ * not true.
676
+ */
677
+ if (hasValue) {
678
+ warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
679
+ }
680
+ /**
681
+ * If there are multiple values, clamp to the last one.
682
+ * This is because the last value is the one that the user
683
+ * has most recently interacted with.
684
+ */
685
+ const singleValue = Array.isArray(valueToProcess) ? valueToProcess[valueToProcess.length - 1] : valueToProcess;
686
+ const targetValue = clampDate(singleValue, minParts, maxParts);
687
+ const { month, day, year, hour, minute } = targetValue;
688
+ const ampm = parseAmPm(hour);
689
+ /**
690
+ * Since `activeParts` indicates a value that been explicitly selected
691
+ * either by the user or the app, only update `activeParts` if the
692
+ * `value` property is set.
693
+ */
694
+ if (hasValue) {
695
+ if (Array.isArray(valueToProcess)) {
696
+ this.activeParts = [...valueToProcess];
697
+ }
698
+ else {
699
+ this.activeParts = {
700
+ month,
701
+ day,
702
+ year,
703
+ hour,
704
+ minute,
705
+ ampm,
706
+ };
707
+ }
708
+ }
709
+ else {
710
+ /**
711
+ * Reset the active parts if the value is not set.
712
+ * This will clear the selected calendar day when
713
+ * performing a clear action or using the reset() method.
714
+ */
715
+ this.activeParts = [];
716
+ }
717
+ const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
718
+ const bodyIsVisible = el.classList.contains('datetime-ready');
719
+ const { isGridStyle, showMonthAndYear } = this;
720
+ if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
721
+ /**
722
+ * Only animate if:
723
+ * 1. We're using grid style (wheel style pickers should just jump to new value)
724
+ * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
725
+ * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
726
+ * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
727
+ */
728
+ this.animateToDate(targetValue);
729
+ }
730
+ else {
731
+ this.setWorkingParts({
732
+ month,
733
+ day,
734
+ year,
735
+ hour,
736
+ minute,
737
+ ampm,
738
+ });
739
+ }
740
+ };
741
+ this.animateToDate = async (targetValue) => {
742
+ const { workingParts } = this;
743
+ /**
744
+ * Tell other render functions that we need to force the
745
+ * target month to appear in place of the actual next/prev month.
746
+ * Because this is a State variable, a rerender will be triggered
747
+ * automatically, updating the rendered months.
748
+ */
749
+ this.forceRenderDate = targetValue;
750
+ /**
751
+ * Flag that we've started scrolling to the forced date.
752
+ * The resolve function will be called by the datetime's
753
+ * scroll listener when it's done updating everything.
754
+ * This is a replacement for making prev/nextMonth async,
755
+ * since the logic we're waiting on is in a listener.
756
+ */
757
+ const forceDateScrollingPromise = new Promise((resolve) => {
758
+ this.resolveForceDateScrolling = resolve;
759
+ });
760
+ /**
761
+ * Animate smoothly to the forced month. This will also update
762
+ * workingParts and correct the surrounding months for us.
763
+ */
764
+ const targetMonthIsBefore = isBefore(targetValue, workingParts);
765
+ targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
766
+ await forceDateScrollingPromise;
767
+ this.resolveForceDateScrolling = undefined;
768
+ this.forceRenderDate = undefined;
769
+ };
770
+ this.onFocus = () => {
771
+ this.ionFocus.emit();
772
+ };
773
+ this.onBlur = () => {
774
+ this.ionBlur.emit();
775
+ };
776
+ this.hasValue = () => {
777
+ return this.value != null;
778
+ };
779
+ this.nextMonth = () => {
780
+ const calendarBodyRef = this.calendarBodyRef;
781
+ if (!calendarBodyRef) {
782
+ return;
783
+ }
784
+ const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
785
+ if (!nextMonth) {
786
+ return;
787
+ }
788
+ const left = nextMonth.offsetWidth * 2;
789
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
790
+ calendarBodyRef.scrollTo({
791
+ top: 0,
792
+ left: left * (isRTL(this.el) ? -1 : 1),
793
+ behavior: scrollMode,
794
+ });
795
+ };
796
+ this.prevMonth = () => {
797
+ const calendarBodyRef = this.calendarBodyRef;
798
+ if (!calendarBodyRef) {
799
+ return;
800
+ }
801
+ const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
802
+ if (!prevMonth) {
803
+ return;
804
+ }
805
+ const left = prevMonth.offsetWidth * 2;
806
+ const scrollMode = config.getBoolean('animated', true) ? 'smooth' : 'instant';
807
+ calendarBodyRef.scrollTo({
808
+ top: 0,
809
+ left: left * (isRTL(this.el) ? 1 : -1),
810
+ behavior: scrollMode,
811
+ });
812
+ };
813
+ this.toggleMonthAndYearView = () => {
814
+ this.showMonthAndYear = !this.showMonthAndYear;
815
+ };
816
+ }
130
817
  formatOptionsChanged() {
131
818
  const { el, formatOptions, presentation } = this;
132
819
  checkForPresentationFormatMismatch(el, presentation, formatOptions);
133
820
  warnIfTimeZoneProvided(el, formatOptions);
134
821
  }
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;
159
822
  disabledChanged() {
160
823
  this.emitStyle();
161
824
  }
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;
171
825
  minChanged() {
172
826
  this.processMinParts();
173
827
  }
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;
183
828
  maxChanged() {
184
829
  this.processMaxParts();
185
830
  }
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';
194
831
  presentationChanged() {
195
832
  const { el, formatOptions, presentation } = this;
196
- checkForPresentationFormatMismatch(el, presentation, formatOptions);
197
- }
198
- get isGridStyle() {
199
- const { presentation, preferWheel } = this;
200
- const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
201
- return hasDatePresentation && !preferWheel;
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;
223
- yearValuesChanged() {
224
- this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
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;
235
- monthValuesChanged() {
236
- this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
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;
247
- dayValuesChanged() {
248
- this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
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;
257
- hourValuesChanged() {
258
- this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
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;
268
- minuteValuesChanged() {
269
- this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
270
- }
271
- /**
272
- * The locale to use for `ion-datetime`. This
273
- * impacts month and day name formatting.
274
- * The `"default"` value refers to the default
275
- * locale set by your device.
276
- */
277
- locale = 'default';
278
- /**
279
- * The first day of the week to use for `ion-datetime`. The
280
- * default value is `0` and represents Sunday.
281
- */
282
- firstDayOfWeek = 0;
283
- /**
284
- * A callback used to format the header text that shows how many
285
- * dates are selected. Only used if there are 0 or more than 1
286
- * selected (i.e. unused for exactly 1). By default, the header
287
- * text is set to "numberOfDates days".
288
- *
289
- * See https://ionicframework.com/docs/troubleshooting/runtime#accessing-this
290
- * if you need to access `this` from within the callback.
291
- */
292
- titleSelectedDatesFormatter;
293
- /**
294
- * If `true`, multiple dates can be selected at once. Only
295
- * applies to `presentation="date"` and `preferWheel="false"`.
296
- */
297
- multiple = false;
298
- /**
299
- * Used to apply custom text and background colors to specific dates.
300
- *
301
- * Can be either an array of objects containing ISO strings and colors,
302
- * or a callback that receives an ISO string and returns the colors.
303
- *
304
- * Only applies to the `date`, `date-time`, and `time-date` presentations,
305
- * with `preferWheel="false"`.
306
- */
307
- highlightedDates;
308
- /**
309
- * The value of the datetime as a valid ISO 8601 datetime string.
310
- * This should be an array of strings only when `multiple="true"`.
311
- */
312
- value;
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.
382
- */
383
- ionCancel;
384
- /**
385
- * Emitted when the value (selected date) has changed.
386
- *
387
- * This event will not emit when programmatically setting the `value` property.
388
- */
389
- ionChange;
390
- /**
391
- * Emitted when the value property has changed.
392
- * This is used to ensure that ion-datetime-button can respond
393
- * to any value property changes.
394
- * @internal
395
- */
396
- ionValueChange;
397
- /**
398
- * Emitted when the datetime has focus.
399
- */
400
- ionFocus;
401
- /**
402
- * Emitted when the datetime loses focus.
403
- */
404
- ionBlur;
405
- /**
406
- * Emitted when the styles change.
407
- * @internal
408
- */
409
- ionStyle;
833
+ checkForPresentationFormatMismatch(el, presentation, formatOptions);
834
+ }
835
+ get isGridStyle() {
836
+ const { presentation, preferWheel } = this;
837
+ const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
838
+ return hasDatePresentation && !preferWheel;
839
+ }
840
+ yearValuesChanged() {
841
+ this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
842
+ }
843
+ monthValuesChanged() {
844
+ this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
845
+ }
846
+ dayValuesChanged() {
847
+ this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
848
+ }
849
+ hourValuesChanged() {
850
+ this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
851
+ }
852
+ minuteValuesChanged() {
853
+ this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
854
+ }
410
855
  /**
411
- * Emitted when componentDidRender is fired.
412
- * @internal
856
+ * Update the datetime value when the value changes
413
857
  */
414
- ionRender;
858
+ async valueChanged() {
859
+ const { value } = this;
860
+ if (this.hasValue()) {
861
+ this.processValue(value);
862
+ }
863
+ this.emitStyle();
864
+ this.ionValueChange.emit({ value });
865
+ }
415
866
  /**
416
867
  * Confirms the selected datetime value, updates the
417
868
  * `value` property, and optionally closes the popover
@@ -481,425 +932,10 @@ export class Datetime {
481
932
  async getDefaultPart() {
482
933
  return this.defaultParts;
483
934
  }
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
- };
575
935
  get isCalendarPicker() {
576
936
  const { presentation } = this;
577
937
  return presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
578
938
  }
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
- };
903
939
  connectedCallback() {
904
940
  this.clearFocusVisible = startFocusVisible(this.el).destroy;
905
941
  this.loadTimeout = setTimeout(() => {
@@ -913,66 +949,10 @@ export class Datetime {
913
949
  }
914
950
  this.loadTimeoutCleanup();
915
951
  }
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
- };
930
952
  initializeListeners() {
931
953
  this.initializeCalendarListener();
932
954
  this.initializeKeyboardListeners();
933
955
  }
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
- };
976
956
  componentDidLoad() {
977
957
  const { el, intersectionTrackerRef } = this;
978
958
  /**
@@ -997,7 +977,7 @@ export class Datetime {
997
977
  * could cause the datetime to start at a visibility of 0, erroneously
998
978
  * triggering the `hiddenIO` observer below.
999
979
  */
1000
- raf(() => visibleIO?.observe(intersectionTrackerRef));
980
+ raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(intersectionTrackerRef));
1001
981
  /**
1002
982
  * TODO(FW-6931): Remove this fallback upon solving the root cause
1003
983
  * Fallback: If IntersectionObserver never reports that the
@@ -1043,7 +1023,7 @@ export class Datetime {
1043
1023
  });
1044
1024
  };
1045
1025
  const hiddenIO = new IntersectionObserver(hiddenCallback, { threshold: 0, root: el });
1046
- raf(() => hiddenIO?.observe(intersectionTrackerRef));
1026
+ raf(() => hiddenIO === null || hiddenIO === void 0 ? void 0 : hiddenIO.observe(intersectionTrackerRef));
1047
1027
  /**
1048
1028
  * Datetime uses Ionic components that emit
1049
1029
  * ionFocus and ionBlur. These events are
@@ -1116,119 +1096,6 @@ export class Datetime {
1116
1096
  this.ionRender.emit();
1117
1097
  });
1118
1098
  }
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
- };
1232
1099
  componentWillLoad() {
1233
1100
  const { el, formatOptions, highlightedDates, multiple, presentation, preferWheel } = this;
1234
1101
  if (multiple) {
@@ -1279,58 +1146,13 @@ export class Datetime {
1279
1146
  'interactive-disabled': this.disabled,
1280
1147
  });
1281
1148
  }
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
- };
1328
1149
  /**
1329
1150
  * Universal render methods
1330
1151
  * These are pieces of datetime that
1331
1152
  * are rendered independently of presentation.
1332
1153
  */
1333
1154
  renderFooter() {
1155
+ const theme = getIonTheme(this);
1334
1156
  const { disabled, readonly, showDefaultButtons, showClearButton } = this;
1335
1157
  /**
1336
1158
  * The cancel, clear, and confirm buttons
@@ -1338,6 +1160,7 @@ export class Datetime {
1338
1160
  * is disabled or readonly.
1339
1161
  */
1340
1162
  const isButtonDisabled = disabled || readonly;
1163
+ const confirmFill = theme === 'ionic' ? 'solid' : undefined;
1341
1164
  const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
1342
1165
  if (!hasSlottedButtons && !showDefaultButtons && !showClearButton) {
1343
1166
  return;
@@ -1356,7 +1179,7 @@ export class Datetime {
1356
1179
  return (h("div", { class: "datetime-footer" }, h("div", { class: "datetime-buttons" }, h("div", { class: {
1357
1180
  ['datetime-action-buttons']: true,
1358
1181
  ['has-clear-button']: this.showClearButton,
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)))))))));
1182
+ } }, 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))))))));
1360
1183
  }
1361
1184
  /**
1362
1185
  * Wheel picker render methods
@@ -1423,10 +1246,7 @@ export class Datetime {
1423
1246
  catch (e) {
1424
1247
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1425
1248
  }
1426
- return {
1427
- ...itemObject,
1428
- disabled,
1429
- };
1249
+ return Object.assign(Object.assign({}, itemObject), { disabled });
1430
1250
  });
1431
1251
  }
1432
1252
  /**
@@ -1439,16 +1259,10 @@ export class Datetime {
1439
1259
  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) => {
1440
1260
  const { value } = ev.detail;
1441
1261
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1442
- this.setWorkingParts({
1443
- ...workingParts,
1444
- ...findPart,
1445
- });
1446
- this.setActiveParts({
1447
- ...activePart,
1448
- ...findPart,
1449
- });
1262
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
1263
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), findPart));
1450
1264
  ev.stopPropagation();
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)))));
1265
+ } }, 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)))));
1452
1266
  }
1453
1267
  renderIndividualDatePickerColumns(forcePresentation) {
1454
1268
  const { workingParts, isDateEnabled } = this;
@@ -1481,10 +1295,7 @@ export class Datetime {
1481
1295
  catch (e) {
1482
1296
  printIonError('[ion-datetime] - Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1483
1297
  }
1484
- return {
1485
- ...dayObject,
1486
- disabled,
1487
- };
1298
+ return Object.assign(Object.assign({}, dayObject), { disabled });
1488
1299
  });
1489
1300
  }
1490
1301
  const shouldRenderYears = forcePresentation !== 'month' && forcePresentation !== 'time';
@@ -1513,23 +1324,18 @@ export class Datetime {
1513
1324
  return renderArray;
1514
1325
  }
1515
1326
  renderDayPickerColumn(days) {
1327
+ var _a;
1516
1328
  if (days.length === 0) {
1517
1329
  return [];
1518
1330
  }
1519
1331
  const { disabled, workingParts } = this;
1520
1332
  const activePart = this.getActivePartsWithFallback();
1521
- const pickerColumnValue = (workingParts.day !== null ? workingParts.day : this.defaultParts.day) ?? undefined;
1333
+ const pickerColumnValue = (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined;
1522
1334
  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) => {
1523
- this.setWorkingParts({
1524
- ...workingParts,
1525
- day: ev.detail.value,
1526
- });
1527
- this.setActiveParts({
1528
- ...activePart,
1529
- day: ev.detail.value,
1530
- });
1335
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1336
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1531
1337
  ev.stopPropagation();
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)))));
1338
+ } }, 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)))));
1533
1339
  }
1534
1340
  renderMonthPickerColumn(months) {
1535
1341
  if (months.length === 0) {
@@ -1538,19 +1344,13 @@ export class Datetime {
1538
1344
  const { disabled, workingParts } = this;
1539
1345
  const activePart = this.getActivePartsWithFallback();
1540
1346
  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) => {
1541
- this.setWorkingParts({
1542
- ...workingParts,
1543
- month: ev.detail.value,
1544
- });
1347
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1545
1348
  // Month wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1546
1349
  if (!this.multiple) {
1547
- this.setActiveParts({
1548
- ...activePart,
1549
- month: ev.detail.value,
1550
- });
1350
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1551
1351
  }
1552
1352
  ev.stopPropagation();
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)))));
1353
+ } }, 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)))));
1554
1354
  }
1555
1355
  renderYearPickerColumn(years) {
1556
1356
  if (years.length === 0) {
@@ -1559,19 +1359,13 @@ export class Datetime {
1559
1359
  const { disabled, workingParts } = this;
1560
1360
  const activePart = this.getActivePartsWithFallback();
1561
1361
  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) => {
1562
- this.setWorkingParts({
1563
- ...workingParts,
1564
- year: ev.detail.value,
1565
- });
1362
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1566
1363
  // Year wheel is navigation-only in multi-select mode as a fix for https://github.com/ionic-team/ionic-framework/issues/29673
1567
1364
  if (!this.multiple) {
1568
- this.setActiveParts({
1569
- ...activePart,
1570
- year: ev.detail.value,
1571
- });
1365
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1572
1366
  }
1573
1367
  ev.stopPropagation();
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)))));
1368
+ } }, 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)))));
1575
1369
  }
1576
1370
  renderTimePickerColumns(forcePresentation) {
1577
1371
  if (['date', 'month', 'month-year', 'year'].includes(forcePresentation)) {
@@ -1601,16 +1395,10 @@ export class Datetime {
1601
1395
  return [];
1602
1396
  const activePart = this.getActivePartsWithFallback();
1603
1397
  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) => {
1604
- this.setWorkingParts({
1605
- ...workingParts,
1606
- hour: ev.detail.value,
1607
- });
1608
- this.setActiveParts({
1609
- ...this.getActivePartsWithFallback(),
1610
- hour: ev.detail.value,
1611
- });
1398
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1399
+ this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { hour: ev.detail.value }));
1612
1400
  ev.stopPropagation();
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)))));
1401
+ } }, 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)))));
1614
1402
  }
1615
1403
  renderMinutePickerColumn(minutesData) {
1616
1404
  const { disabled, workingParts } = this;
@@ -1618,16 +1406,10 @@ export class Datetime {
1618
1406
  return [];
1619
1407
  const activePart = this.getActivePartsWithFallback();
1620
1408
  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) => {
1621
- this.setWorkingParts({
1622
- ...workingParts,
1623
- minute: ev.detail.value,
1624
- });
1625
- this.setActiveParts({
1626
- ...this.getActivePartsWithFallback(),
1627
- minute: ev.detail.value,
1628
- });
1409
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1410
+ this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { minute: ev.detail.value }));
1629
1411
  ev.stopPropagation();
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)))));
1412
+ } }, 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)))));
1631
1413
  }
1632
1414
  renderDayPeriodPickerColumn(dayPeriodData) {
1633
1415
  const { disabled, workingParts } = this;
@@ -1638,18 +1420,10 @@ export class Datetime {
1638
1420
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1639
1421
  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) => {
1640
1422
  const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
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
- });
1423
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1424
+ this.setActiveParts(Object.assign(Object.assign({}, this.getActivePartsWithFallback()), { ampm: ev.detail.value, hour }));
1651
1425
  ev.stopPropagation();
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)))));
1426
+ } }, 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)))));
1653
1427
  }
1654
1428
  renderWheelView(forcePresentation) {
1655
1429
  const { locale } = this;
@@ -1662,10 +1436,8 @@ export class Datetime {
1662
1436
  /**
1663
1437
  * Grid Render Methods
1664
1438
  */
1665
- renderCalendarHeader(mode) {
1666
- const { disabled } = this;
1667
- const expandedIcon = mode === 'ios' ? chevronDown : caretUpSharp;
1668
- const collapsedIcon = mode === 'ios' ? chevronForward : caretDownSharp;
1439
+ renderCalendarHeader(theme) {
1440
+ const { disabled, datetimeNextIcon, datetimePreviousIcon, datetimeCollapsedIcon, datetimeExpandedIcon } = this;
1669
1441
  const prevMonthDisabled = disabled || isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1670
1442
  const nextMonthDisabled = disabled || isNextMonthDisabled(this.workingParts, this.maxParts);
1671
1443
  // don't use the inheritAttributes util because it removes dir from the host, and we still need that
@@ -1674,7 +1446,7 @@ export class Datetime {
1674
1446
  'calendar-month-year-toggle': true,
1675
1447
  'ion-activatable': true,
1676
1448
  'ion-focusable': true,
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) => {
1449
+ }, 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) => {
1678
1450
  return h("div", { class: "day-of-week" }, d);
1679
1451
  }))));
1680
1452
  }
@@ -1693,8 +1465,8 @@ export class Datetime {
1693
1465
  // The day is not used when checking if a month is disabled.
1694
1466
  // Users should be able to access the min or max month, even if the
1695
1467
  // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1696
- minParts: { ...this.minParts, day: null },
1697
- maxParts: { ...this.maxParts, day: null },
1468
+ minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1469
+ maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1698
1470
  });
1699
1471
  // The working month should never have swipe disabled.
1700
1472
  // Otherwise the CSS scroll snap will not work and the user
@@ -1803,24 +1575,18 @@ export class Datetime {
1803
1575
  if (isAdjacentDay) {
1804
1576
  // The user selected a day outside the current month. Ignore this button, as the month will be re-rendered.
1805
1577
  this.el.blur();
1806
- this.activeParts = { ...activePart, ...referenceParts };
1578
+ this.activeParts = Object.assign(Object.assign({}, activePart), referenceParts);
1807
1579
  this.animateToDate(referenceParts);
1808
1580
  this.confirm();
1809
1581
  }
1810
1582
  else {
1811
- this.setWorkingParts({
1812
- ...this.workingParts,
1813
- ...referenceParts,
1814
- });
1583
+ this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), referenceParts));
1815
1584
  // Multiple only needs date info so we can wipe out other fields like time.
1816
1585
  if (multiple) {
1817
1586
  this.setActiveParts(referenceParts, isActive);
1818
1587
  }
1819
1588
  else {
1820
- this.setActiveParts({
1821
- ...activePart,
1822
- ...referenceParts,
1823
- });
1589
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), referenceParts));
1824
1590
  }
1825
1591
  }
1826
1592
  }
@@ -1832,8 +1598,8 @@ export class Datetime {
1832
1598
  return this.renderMonth(month, year);
1833
1599
  })));
1834
1600
  }
1835
- renderCalendar(mode) {
1836
- return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(mode), this.renderCalendarBody()));
1601
+ renderCalendar(theme) {
1602
+ return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(theme), this.renderCalendarBody()));
1837
1603
  }
1838
1604
  renderTimeLabel() {
1839
1605
  const hasSlottedTimeLabel = this.el.querySelector('[slot="time-label"]') !== null;
@@ -1863,7 +1629,7 @@ export class Datetime {
1863
1629
  await popoverRef.onWillDismiss();
1864
1630
  this.isTimePopoverOpen = false;
1865
1631
  }
1866
- } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions?.time)),
1632
+ } }, getLocalizedTime(locale, activePart, computedHourCycle, formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.time)),
1867
1633
  h("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
1868
1634
  /**
1869
1635
  * Intersection Observers do not consistently fire between Blink and Webkit
@@ -1886,6 +1652,7 @@ export class Datetime {
1886
1652
  ];
1887
1653
  }
1888
1654
  getHeaderSelectedDateText() {
1655
+ var _a;
1889
1656
  const { activeParts, formatOptions, multiple, titleSelectedDatesFormatter } = this;
1890
1657
  const isArray = Array.isArray(activeParts);
1891
1658
  let headerText;
@@ -1902,7 +1669,7 @@ export class Datetime {
1902
1669
  }
1903
1670
  else {
1904
1671
  // for exactly 1 day selected (multiple set or not), show a formatted version of that
1905
- headerText = getLocalizedDateTime(this.locale, this.getActivePartsWithFallback(), formatOptions?.date ?? { weekday: 'short', month: 'short', day: 'numeric' });
1672
+ 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' });
1906
1673
  }
1907
1674
  return headerText;
1908
1675
  }
@@ -1940,7 +1707,7 @@ export class Datetime {
1940
1707
  * Render entry point
1941
1708
  * All presentation types are rendered from here.
1942
1709
  */
1943
- renderDatetime(mode) {
1710
+ renderDatetime(theme) {
1944
1711
  const { presentation, preferWheel } = this;
1945
1712
  /**
1946
1713
  * Certain presentation types have separate grid and wheel displays.
@@ -1954,7 +1721,7 @@ export class Datetime {
1954
1721
  case 'date-time':
1955
1722
  return [
1956
1723
  this.renderHeader(),
1957
- this.renderCalendar(mode),
1724
+ this.renderCalendar(theme),
1958
1725
  this.renderCalendarViewMonthYearPicker(),
1959
1726
  this.renderTime(),
1960
1727
  this.renderFooter(),
@@ -1963,7 +1730,7 @@ export class Datetime {
1963
1730
  return [
1964
1731
  this.renderHeader(),
1965
1732
  this.renderTime(),
1966
- this.renderCalendar(mode),
1733
+ this.renderCalendar(theme),
1967
1734
  this.renderCalendarViewMonthYearPicker(),
1968
1735
  this.renderFooter(),
1969
1736
  ];
@@ -1976,47 +1743,89 @@ export class Datetime {
1976
1743
  default:
1977
1744
  return [
1978
1745
  this.renderHeader(),
1979
- this.renderCalendar(mode),
1746
+ this.renderCalendar(theme),
1980
1747
  this.renderCalendarViewMonthYearPicker(),
1981
1748
  this.renderFooter(),
1982
1749
  ];
1983
1750
  }
1984
1751
  }
1752
+ /**
1753
+ * Get the icon to use for the next icon.
1754
+ * Use the icon set in the config.
1755
+ * If no icon is set in the config, use the default icon.
1756
+ */
1757
+ get datetimeNextIcon() {
1758
+ // Return the configured datetime next icon or the default icon
1759
+ return config.get('datetimeNextIcon', chevronForward);
1760
+ }
1761
+ /**
1762
+ * Get the icon to use for the previous icon.
1763
+ * Use the icon set in the config.
1764
+ * If no icon is set in the config, use the default icon.
1765
+ */
1766
+ get datetimePreviousIcon() {
1767
+ // Return the configured datetime previous icon or the default icon
1768
+ return config.get('datetimePreviousIcon', chevronBack);
1769
+ }
1770
+ /**
1771
+ * Get the icon to use for the show month and year icon.
1772
+ * Use the icon set in the config.
1773
+ * If no icon is set in the config, use the default icon.
1774
+ */
1775
+ get datetimeCollapsedIcon() {
1776
+ // Determine the theme and map to the default icon
1777
+ const theme = getIonTheme(this);
1778
+ const defaultIcon = theme === 'ios' ? chevronForward : caretDownSharp;
1779
+ // Return the configured datetime show month and year icon or the default icon
1780
+ return config.get('datetimeCollapsedIcon', defaultIcon);
1781
+ }
1782
+ /**
1783
+ * Get the icon to use for the hide month and year icon.
1784
+ * Use the icon set in the config.
1785
+ * If no icon is set in the config, use the default icon.
1786
+ */
1787
+ get datetimeExpandedIcon() {
1788
+ // Determine the theme and map to the default icon
1789
+ const theme = getIonTheme(this);
1790
+ const defaultIcon = theme === 'ios' ? chevronDown : caretUpSharp;
1791
+ // Return the configured datetime hide month and year icon or the default icon
1792
+ return config.get('datetimeExpandedIcon', defaultIcon);
1793
+ }
1985
1794
  render() {
1986
1795
  const { name, value, disabled, el, color, readonly, showMonthAndYear, preferWheel, presentation, size, isGridStyle, } = this;
1987
- const mode = getIonMode(this);
1796
+ const theme = getIonTheme(this);
1988
1797
  const isMonthAndYearPresentation = presentation === 'year' || presentation === 'month' || presentation === 'month-year';
1989
1798
  const shouldShowMonthAndYear = showMonthAndYear || isMonthAndYearPresentation;
1990
1799
  const monthYearPickerOpen = showMonthAndYear && !isMonthAndYearPresentation;
1991
1800
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1992
1801
  const hasWheelVariant = hasDatePresentation && preferWheel;
1993
1802
  renderHiddenInput(true, el, name, formatValue(value), disabled);
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)));
1803
+ return (h(Host, { key: '81d6d431595fc287861af22aff9cad3b94f4ce97', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1804
+ [theme]: true,
1805
+ ['datetime-readonly']: readonly,
1806
+ ['datetime-disabled']: disabled,
1807
+ 'show-month-and-year': shouldShowMonthAndYear,
1808
+ 'month-year-picker-open': monthYearPickerOpen,
1809
+ [`datetime-presentation-${presentation}`]: true,
1810
+ [`datetime-size-${size}`]: true,
1811
+ [`datetime-prefer-wheel`]: hasWheelVariant,
1812
+ [`datetime-grid`]: isGridStyle,
1813
+ })) }, h("div", { key: 'a5043ea9c7cabb5333edf82c8563fac2f6488086', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(theme)));
2007
1814
  }
2008
1815
  static get is() { return "ion-datetime"; }
2009
1816
  static get encapsulation() { return "shadow"; }
2010
1817
  static get originalStyleUrls() {
2011
1818
  return {
2012
1819
  "ios": ["datetime.ios.scss"],
2013
- "md": ["datetime.md.scss"]
1820
+ "md": ["datetime.md.scss"],
1821
+ "ionic": ["datetime.ionic.scss"]
2014
1822
  };
2015
1823
  }
2016
1824
  static get styleUrls() {
2017
1825
  return {
2018
1826
  "ios": ["datetime.ios.css"],
2019
- "md": ["datetime.md.css"]
1827
+ "md": ["datetime.md.css"],
1828
+ "ionic": ["datetime.ionic.css"]
2020
1829
  };
2021
1830
  }
2022
1831
  static get properties() {
@@ -2045,7 +1854,8 @@ export class Datetime {
2045
1854
  "getter": false,
2046
1855
  "setter": false,
2047
1856
  "reflect": false,
2048
- "attribute": "color"
1857
+ "attribute": "color",
1858
+ "defaultValue": "'primary'"
2049
1859
  },
2050
1860
  "name": {
2051
1861
  "type": "string",