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