@ionic/core 7.7.4 → 7.7.5-dev.11710260658.1fc29a6c
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/checkbox.js +1 -1
- package/components/ion-range.js +126 -21
- package/components/overlays.js +66 -17
- package/dist/cjs/{app-globals-4d26cb5a.js → app-globals-fec13f9b.js} +1 -1
- package/dist/cjs/{button-active-fcf4bd60.js → button-active-e74be007.js} +1 -1
- package/dist/cjs/{hardware-back-button-4cb049f1.js → hardware-back-button-1d378ca9.js} +2 -2
- package/dist/cjs/{index-19f1b25e.js → index-04f3624f.js} +2 -2
- package/dist/cjs/{index-ea266398.js → index-c42c9063.js} +10 -1
- package/dist/cjs/{index-905e8955.js → index-ccddf5be.js} +3 -3
- package/dist/cjs/index.cjs.js +8 -8
- package/dist/cjs/ion-accordion_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-action-sheet.cjs.entry.js +5 -5
- package/dist/cjs/ion-alert.cjs.entry.js +5 -5
- package/dist/cjs/ion-app_8.cjs.entry.js +6 -6
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-back-button.cjs.entry.js +2 -2
- package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-button_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
- package/dist/cjs/ion-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/ion-chip.cjs.entry.js +2 -2
- package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime-button.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-fab_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-img.cjs.entry.js +2 -2
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-input.cjs.entry.js +2 -2
- package/dist/cjs/ion-item-option_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-item_8.cjs.entry.js +2 -2
- package/dist/cjs/ion-loading.cjs.entry.js +4 -4
- package/dist/cjs/ion-menu_3.cjs.entry.js +5 -5
- package/dist/cjs/ion-modal.cjs.entry.js +5 -5
- package/dist/cjs/ion-nav_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-picker-column-internal.cjs.entry.js +2 -2
- package/dist/cjs/ion-picker-internal.cjs.entry.js +1 -1
- package/dist/cjs/ion-popover.cjs.entry.js +5 -5
- package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
- package/dist/cjs/ion-radio_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-range.cjs.entry.js +128 -23
- package/dist/cjs/ion-refresher_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
- package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
- package/dist/cjs/ion-searchbar.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-select_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab_2.cjs.entry.js +1 -1
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
- package/dist/cjs/ion-toast.cjs.entry.js +4 -4
- package/dist/cjs/ion-toggle.cjs.entry.js +2 -2
- package/dist/cjs/{ionic-global-59aa7eb7.js → ionic-global-34d0d04a.js} +1 -1
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-b03f91d9.js → ios.transition-de1c813a.js} +2 -2
- package/dist/cjs/loader.cjs.js +3 -3
- package/dist/cjs/{md.transition-27c337ce.js → md.transition-beea67b4.js} +2 -2
- package/dist/cjs/{overlays-53b60f81.js → overlays-dd5e1ec9.js} +68 -19
- package/dist/cjs/{status-tap-dbe2342f.js → status-tap-d9ebd6d3.js} +1 -1
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/checkbox/checkbox.js +1 -1
- package/dist/collection/components/checkbox/test/checkbox.spec.js +12 -0
- package/dist/collection/components/range/range.js +126 -21
- package/dist/collection/components/range/test/range-events.e2e.js +27 -0
- package/dist/collection/utils/overlays.js +66 -17
- package/dist/collection/utils/test/overlays/overlays.spec.js +53 -0
- package/dist/docs.json +2 -2
- package/dist/esm/{app-globals-cfb6787b.js → app-globals-4689f35b.js} +1 -1
- package/dist/esm/{button-active-01502123.js → button-active-57422dbf.js} +1 -1
- package/dist/esm/{hardware-back-button-3a14f99e.js → hardware-back-button-adcc28d5.js} +2 -2
- package/dist/esm/{index-c43cf47f.js → index-84ee782d.js} +3 -3
- package/dist/esm/{index-9c9d8b49.js → index-a3478902.js} +2 -2
- package/dist/esm/{index-9b6d6df3.js → index-eab5468b.js} +10 -1
- package/dist/esm/index.js +8 -8
- package/dist/esm/ion-accordion_2.entry.js +2 -2
- package/dist/esm/ion-action-sheet.entry.js +5 -5
- package/dist/esm/ion-alert.entry.js +5 -5
- package/dist/esm/ion-app_8.entry.js +6 -6
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-back-button.entry.js +2 -2
- package/dist/esm/ion-backdrop.entry.js +2 -2
- package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
- package/dist/esm/ion-button_2.entry.js +2 -2
- package/dist/esm/ion-card_5.entry.js +2 -2
- package/dist/esm/ion-checkbox.entry.js +3 -3
- package/dist/esm/ion-chip.entry.js +2 -2
- package/dist/esm/ion-col_3.entry.js +2 -2
- package/dist/esm/ion-datetime-button.entry.js +2 -2
- package/dist/esm/ion-datetime_3.entry.js +4 -4
- package/dist/esm/ion-fab_3.entry.js +2 -2
- package/dist/esm/ion-img.entry.js +2 -2
- package/dist/esm/ion-infinite-scroll_2.entry.js +2 -2
- package/dist/esm/ion-input.entry.js +2 -2
- package/dist/esm/ion-item-option_3.entry.js +2 -2
- package/dist/esm/ion-item_8.entry.js +2 -2
- package/dist/esm/ion-loading.entry.js +4 -4
- package/dist/esm/ion-menu_3.entry.js +5 -5
- package/dist/esm/ion-modal.entry.js +5 -5
- package/dist/esm/ion-nav_2.entry.js +3 -3
- package/dist/esm/ion-picker-column-internal.entry.js +2 -2
- package/dist/esm/ion-picker-internal.entry.js +1 -1
- package/dist/esm/ion-popover.entry.js +5 -5
- package/dist/esm/ion-progress-bar.entry.js +2 -2
- package/dist/esm/ion-radio_2.entry.js +2 -2
- package/dist/esm/ion-range.entry.js +128 -23
- package/dist/esm/ion-refresher_2.entry.js +2 -2
- package/dist/esm/ion-reorder_2.entry.js +2 -2
- package/dist/esm/ion-ripple-effect.entry.js +2 -2
- package/dist/esm/ion-route_4.entry.js +2 -2
- package/dist/esm/ion-searchbar.entry.js +2 -2
- package/dist/esm/ion-segment_2.entry.js +2 -2
- package/dist/esm/ion-select_3.entry.js +4 -4
- package/dist/esm/ion-spinner.entry.js +2 -2
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +2 -2
- package/dist/esm/ion-tab_2.entry.js +1 -1
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +2 -2
- package/dist/esm/ion-toast.entry.js +4 -4
- package/dist/esm/ion-toggle.entry.js +2 -2
- package/dist/esm/{ionic-global-c976d684.js → ionic-global-c836c8c6.js} +1 -1
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-da7d9344.js → ios.transition-eb28f539.js} +2 -2
- package/dist/esm/loader.js +4 -4
- package/dist/esm/{md.transition-bdaf610c.js → md.transition-fd4e98e6.js} +2 -2
- package/dist/esm/{overlays-9d04d779.js → overlays-f2c5fc7a.js} +68 -19
- package/dist/esm/{status-tap-cba549d9.js → status-tap-da5c40cc.js} +1 -1
- package/dist/esm-es5/app-globals-4689f35b.js +4 -0
- package/dist/esm-es5/{button-active-01502123.js → button-active-57422dbf.js} +1 -1
- package/dist/esm-es5/{hardware-back-button-3a14f99e.js → hardware-back-button-adcc28d5.js} +1 -1
- package/dist/esm-es5/{index-c43cf47f.js → index-84ee782d.js} +1 -1
- package/dist/esm-es5/{index-9c9d8b49.js → index-a3478902.js} +1 -1
- package/dist/esm-es5/{index-9b6d6df3.js → index-eab5468b.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
- package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
- package/dist/esm-es5/ion-alert.entry.js +1 -1
- package/dist/esm-es5/ion-app_8.entry.js +1 -1
- package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
- package/dist/esm-es5/ion-back-button.entry.js +1 -1
- package/dist/esm-es5/ion-backdrop.entry.js +1 -1
- package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
- package/dist/esm-es5/ion-button_2.entry.js +1 -1
- package/dist/esm-es5/ion-card_5.entry.js +1 -1
- package/dist/esm-es5/ion-checkbox.entry.js +1 -1
- package/dist/esm-es5/ion-chip.entry.js +1 -1
- package/dist/esm-es5/ion-col_3.entry.js +1 -1
- package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
- package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
- package/dist/esm-es5/ion-fab_3.entry.js +1 -1
- package/dist/esm-es5/ion-img.entry.js +1 -1
- package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
- package/dist/esm-es5/ion-input.entry.js +1 -1
- package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
- package/dist/esm-es5/ion-item_8.entry.js +1 -1
- package/dist/esm-es5/ion-loading.entry.js +1 -1
- package/dist/esm-es5/ion-menu_3.entry.js +1 -1
- package/dist/esm-es5/ion-modal.entry.js +1 -1
- package/dist/esm-es5/ion-nav_2.entry.js +1 -1
- package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
- package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
- package/dist/esm-es5/ion-popover.entry.js +1 -1
- package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
- package/dist/esm-es5/ion-radio_2.entry.js +1 -1
- package/dist/esm-es5/ion-range.entry.js +1 -1
- package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
- package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
- package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
- package/dist/esm-es5/ion-route_4.entry.js +1 -1
- package/dist/esm-es5/ion-searchbar.entry.js +1 -1
- package/dist/esm-es5/ion-segment_2.entry.js +1 -1
- package/dist/esm-es5/ion-select_3.entry.js +1 -1
- package/dist/esm-es5/ion-spinner.entry.js +1 -1
- package/dist/esm-es5/ion-split-pane.entry.js +1 -1
- package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
- package/dist/esm-es5/ion-tab_2.entry.js +1 -1
- package/dist/esm-es5/ion-text.entry.js +1 -1
- package/dist/esm-es5/ion-textarea.entry.js +1 -1
- package/dist/esm-es5/ion-toast.entry.js +1 -1
- package/dist/esm-es5/ion-toggle.entry.js +1 -1
- package/dist/esm-es5/{ionic-global-c976d684.js → ionic-global-c836c8c6.js} +1 -1
- package/dist/esm-es5/ionic.js +1 -1
- package/dist/esm-es5/{ios.transition-da7d9344.js → ios.transition-eb28f539.js} +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/md.transition-fd4e98e6.js +4 -0
- package/dist/esm-es5/overlays-f2c5fc7a.js +4 -0
- package/dist/esm-es5/{status-tap-cba549d9.js → status-tap-da5c40cc.js} +1 -1
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/ionic.js +1 -1
- package/dist/ionic/{p-5274fce5.system.entry.js → p-059fcb53.system.entry.js} +1 -1
- package/dist/ionic/{p-26dcbe9f.system.js → p-05dc41cc.system.js} +1 -1
- package/dist/ionic/{p-71999ab7.system.entry.js → p-08410e29.system.entry.js} +1 -1
- package/dist/ionic/{p-2eb313e5.entry.js → p-09b047e0.entry.js} +1 -1
- package/dist/ionic/{p-edae1e04.system.entry.js → p-0a0759ec.system.entry.js} +1 -1
- package/dist/ionic/p-0e603dd6.system.js +4 -0
- package/dist/ionic/{p-d80d274f.system.entry.js → p-0e7c8334.system.entry.js} +1 -1
- package/dist/ionic/p-0ffca6ae.js +4 -0
- package/dist/ionic/{p-30892e0c.system.js → p-10ce62b0.system.js} +1 -1
- package/dist/ionic/{p-1fa738c4.js → p-11c04506.js} +1 -1
- package/dist/ionic/p-1522bf28.entry.js +4 -0
- package/dist/ionic/{p-4535eff0.system.entry.js → p-156ba1f2.system.entry.js} +1 -1
- package/dist/ionic/{p-44145d23.entry.js → p-16ad3c38.entry.js} +1 -1
- package/dist/ionic/{p-d64ed0f8.entry.js → p-209fac74.entry.js} +1 -1
- package/dist/ionic/{p-7b3d8eec.system.entry.js → p-231a3636.system.entry.js} +1 -1
- package/dist/ionic/{p-ccca27da.system.entry.js → p-2403ed8c.system.entry.js} +1 -1
- package/dist/ionic/{p-43bbda95.system.entry.js → p-2bc2b22c.system.entry.js} +1 -1
- package/dist/ionic/{p-ecf59a91.system.entry.js → p-2f418c5e.system.entry.js} +1 -1
- package/dist/ionic/{p-238f5153.entry.js → p-2fe2c8b0.entry.js} +1 -1
- package/dist/ionic/{p-16e3ba5d.entry.js → p-3270e211.entry.js} +1 -1
- package/dist/ionic/{p-e5db268b.js → p-33d70d46.js} +1 -1
- package/dist/ionic/{p-ad9c0d92.system.entry.js → p-33dd4d0b.system.entry.js} +1 -1
- package/dist/ionic/{p-bb0bf325.system.entry.js → p-345e2dac.system.entry.js} +1 -1
- package/dist/ionic/{p-d1f0eea5.system.entry.js → p-35675fdc.system.entry.js} +1 -1
- package/dist/ionic/{p-8d602214.system.js → p-36cd9903.system.js} +3 -3
- package/dist/ionic/{p-e23090ae.system.entry.js → p-38515fc5.system.entry.js} +1 -1
- package/dist/ionic/{p-792629d9.entry.js → p-38cda7af.entry.js} +1 -1
- package/dist/ionic/{p-47ba1196.entry.js → p-3ca0c7f2.entry.js} +1 -1
- package/dist/ionic/{p-03f63663.system.js → p-45aca628.system.js} +1 -1
- package/dist/ionic/{p-a5aba83a.entry.js → p-45ea497f.entry.js} +1 -1
- package/dist/ionic/{p-3096c7af.entry.js → p-479402e1.entry.js} +1 -1
- package/dist/ionic/{p-0a3aef8e.entry.js → p-48b5a2ce.entry.js} +1 -1
- package/dist/ionic/{p-439f2946.system.entry.js → p-494e7d57.system.entry.js} +1 -1
- package/dist/ionic/{p-b340444b.entry.js → p-49ace8c0.entry.js} +1 -1
- package/dist/ionic/{p-4c79142c.system.entry.js → p-56872eba.system.entry.js} +1 -1
- package/dist/ionic/{p-eec92f77.system.js → p-5d78544e.system.js} +1 -1
- package/dist/ionic/{p-4e657e07.entry.js → p-5d8fca58.entry.js} +1 -1
- package/dist/ionic/p-5dca1253.entry.js +4 -0
- package/dist/ionic/{p-134d4936.system.js → p-60c9fd9e.system.js} +1 -1
- package/dist/ionic/{p-0b58e9d1.system.js → p-61505c72.system.js} +1 -1
- package/dist/ionic/{p-7c71b2d5.entry.js → p-616255de.entry.js} +1 -1
- package/dist/ionic/{p-378464fa.entry.js → p-66f99461.entry.js} +1 -1
- package/dist/ionic/{p-c093d16d.system.entry.js → p-68d49b47.system.entry.js} +1 -1
- package/dist/ionic/{p-74c240bf.system.entry.js → p-6b5630b9.system.entry.js} +1 -1
- package/dist/ionic/{p-4694ca86.system.js → p-6d8d931b.system.js} +1 -1
- package/dist/ionic/p-6de43e85.js +4 -0
- package/dist/ionic/{p-aadc0fc9.system.entry.js → p-6e7d3ff4.system.entry.js} +1 -1
- package/dist/ionic/{p-077f2815.system.entry.js → p-6f5b32c7.system.entry.js} +1 -1
- package/dist/ionic/{p-6f3e6442.entry.js → p-6fe606ab.entry.js} +1 -1
- package/dist/ionic/{p-a55fee0d.system.entry.js → p-72246a4d.system.entry.js} +1 -1
- package/dist/ionic/{p-22d83d7d.system.entry.js → p-72c8ca65.system.entry.js} +1 -1
- package/dist/ionic/{p-5f498870.system.entry.js → p-755539d1.system.entry.js} +1 -1
- package/dist/ionic/{p-a9e462b3.entry.js → p-76afa95f.entry.js} +1 -1
- package/dist/ionic/{p-95a30504.system.entry.js → p-775ebdb4.system.entry.js} +1 -1
- package/dist/ionic/{p-26aa2e31.entry.js → p-7874e304.entry.js} +1 -1
- package/dist/ionic/{p-7f9440bc.system.entry.js → p-7b809cc0.system.entry.js} +1 -1
- package/dist/ionic/{p-411244d7.system.js → p-8186fa23.system.js} +1 -1
- package/dist/ionic/{p-bc43ca1f.system.entry.js → p-81f18ed1.system.entry.js} +1 -1
- package/dist/ionic/{p-37ac2b8f.entry.js → p-823ecf45.entry.js} +1 -1
- package/dist/ionic/{p-f7e9141e.entry.js → p-84283745.entry.js} +1 -1
- package/dist/ionic/p-84a2dcfa.system.js +4 -0
- package/dist/ionic/{p-18ba7085.system.entry.js → p-86438241.system.entry.js} +1 -1
- package/dist/ionic/{p-27594fc2.js → p-8ac5c948.js} +1 -1
- package/dist/ionic/{p-08656497.js → p-8be73ce2.js} +1 -1
- package/dist/ionic/{p-410cfe8e.system.js → p-8c39b5ba.system.js} +1 -1
- package/dist/ionic/{p-8a3d9b80.system.entry.js → p-8c74bd0e.system.entry.js} +1 -1
- package/dist/ionic/{p-693832fb.entry.js → p-8f127180.entry.js} +1 -1
- package/dist/ionic/{p-a7f34ffe.system.entry.js → p-8f466a2c.system.entry.js} +1 -1
- package/dist/ionic/{p-8a46dbfe.system.entry.js → p-9362ad14.system.entry.js} +1 -1
- package/dist/ionic/{p-86be82c0.entry.js → p-95c2fa04.entry.js} +1 -1
- package/dist/ionic/{p-96fa4567.system.entry.js → p-98068218.system.entry.js} +1 -1
- package/dist/ionic/{p-83cdb98f.system.entry.js → p-9854082a.system.entry.js} +1 -1
- package/dist/ionic/{p-2897c9d5.system.entry.js → p-996922b4.system.entry.js} +1 -1
- package/dist/ionic/{p-010d5feb.system.entry.js → p-9a029f3b.system.entry.js} +1 -1
- package/dist/ionic/{p-48e48816.system.entry.js → p-9ae5e5ee.system.entry.js} +1 -1
- package/dist/ionic/p-9c253805.js +4 -0
- package/dist/ionic/{p-941f492e.entry.js → p-a5a3315f.entry.js} +1 -1
- package/dist/ionic/{p-13fecc8b.entry.js → p-abcc9680.entry.js} +1 -1
- package/dist/ionic/{p-ea04a24e.entry.js → p-addb7662.entry.js} +1 -1
- package/dist/ionic/{p-c5c8c151.entry.js → p-ae3aeb39.entry.js} +1 -1
- package/dist/ionic/{p-5af368cf.entry.js → p-b74ece49.entry.js} +1 -1
- package/dist/ionic/p-b80ef521.entry.js +4 -0
- package/dist/ionic/{p-317e3e37.system.entry.js → p-b9b8e462.system.entry.js} +1 -1
- package/dist/ionic/{p-98e263df.system.entry.js → p-ba385465.system.entry.js} +1 -1
- package/dist/ionic/{p-e1a33d7e.entry.js → p-c05202a7.entry.js} +1 -1
- package/dist/ionic/{p-bd5c8c40.entry.js → p-c67c9644.entry.js} +1 -1
- package/dist/ionic/{p-e3964478.entry.js → p-c6f9f608.entry.js} +1 -1
- package/dist/ionic/p-c71f1193.js +4 -0
- package/dist/ionic/{p-45e15529.entry.js → p-c764f978.entry.js} +1 -1
- package/dist/ionic/{p-b0e68334.entry.js → p-c7d8cec2.entry.js} +1 -1
- package/dist/ionic/{p-60efe117.js → p-c7ee2812.js} +2 -2
- package/dist/ionic/{p-93779e0b.entry.js → p-ca935c03.entry.js} +1 -1
- package/dist/ionic/{p-167d876d.entry.js → p-cfe767f1.entry.js} +1 -1
- package/dist/ionic/{p-d8c3f2f5.system.entry.js → p-d070ab1e.system.entry.js} +1 -1
- package/dist/ionic/{p-534e85eb.system.entry.js → p-db6a5af3.system.entry.js} +1 -1
- package/dist/ionic/{p-01a0eccb.system.js → p-ddef8aa2.system.js} +1 -1
- package/dist/ionic/{p-517a4200.entry.js → p-de0392f4.entry.js} +1 -1
- package/dist/ionic/{p-462b7b8d.entry.js → p-defe82a5.entry.js} +1 -1
- package/dist/ionic/{p-208c40aa.system.entry.js → p-e155f315.system.entry.js} +1 -1
- package/dist/ionic/{p-426b54ec.system.entry.js → p-e19a78e3.system.entry.js} +1 -1
- package/dist/ionic/p-e1e67879.js +4 -0
- package/dist/ionic/{p-9b7d721e.system.entry.js → p-e4bf5d87.system.entry.js} +1 -1
- package/dist/ionic/{p-481fce9a.entry.js → p-e54e332c.entry.js} +1 -1
- package/dist/ionic/{p-cc24988a.entry.js → p-e59803ca.entry.js} +1 -1
- package/dist/ionic/{p-6d075752.entry.js → p-e8cd9b25.entry.js} +1 -1
- package/dist/ionic/{p-a7a8e7d7.entry.js → p-e8d46a2e.entry.js} +1 -1
- package/dist/ionic/{p-bf260dee.system.entry.js → p-f2a3bece.system.entry.js} +1 -1
- package/dist/ionic/{p-02370c2e.system.entry.js → p-f3e0a78c.system.entry.js} +1 -1
- package/dist/ionic/{p-727a4979.system.entry.js → p-f5bc27d6.system.entry.js} +1 -1
- package/dist/ionic/{p-9aea6c76.entry.js → p-f5dce0c6.entry.js} +1 -1
- package/dist/ionic/p-f5f9511b.entry.js +4 -0
- package/dist/ionic/{p-e938745c.system.entry.js → p-f9f7b24a.system.entry.js} +1 -1
- package/dist/ionic/{p-94ac85ab.entry.js → p-faa9c806.entry.js} +1 -1
- package/dist/ionic/{p-d9b2497b.entry.js → p-fb8bb5bb.entry.js} +1 -1
- package/dist/ionic/{p-5aa60929.js → p-fd14636e.js} +1 -1
- package/dist/ionic/{p-d8e97396.system.entry.js → p-fef4907e.system.entry.js} +1 -1
- package/dist/types/components/range/range.d.ts +29 -0
- package/hydrate/index.js +198 -42
- package/package.json +1 -1
- package/dist/esm-es5/app-globals-cfb6787b.js +0 -4
- package/dist/esm-es5/md.transition-bdaf610c.js +0 -4
- package/dist/esm-es5/overlays-9d04d779.js +0 -4
- package/dist/ionic/p-38a75a00.entry.js +0 -4
- package/dist/ionic/p-3f5d82c9.js +0 -4
- package/dist/ionic/p-4aad8a93.js +0 -4
- package/dist/ionic/p-578c7107.js +0 -4
- package/dist/ionic/p-833579b4.system.js +0 -4
- package/dist/ionic/p-9ce15e22.entry.js +0 -4
- package/dist/ionic/p-9d9c50a0.js +0 -4
- package/dist/ionic/p-af4e42b4.entry.js +0 -4
- package/dist/ionic/p-c977af5e.entry.js +0 -4
- package/dist/ionic/p-d1f6231b.system.js +0 -4
- package/dist/ionic/p-dd5cc4c8.js +0 -4
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
'use strict';
|
|
5
5
|
|
|
6
6
|
const index = require('./index-c8d52405.js');
|
|
7
|
-
const hardwareBackButton = require('./hardware-back-button-
|
|
8
|
-
const ionicGlobal = require('./ionic-global-
|
|
7
|
+
const hardwareBackButton = require('./hardware-back-button-1d378ca9.js');
|
|
8
|
+
const ionicGlobal = require('./ionic-global-34d0d04a.js');
|
|
9
9
|
const frameworkDelegate = require('./framework-delegate-e0e13baa.js');
|
|
10
10
|
const helpers = require('./helpers-da4c0ed1.js');
|
|
11
11
|
const index$1 = require('./index-5915f9b3.js');
|
|
@@ -456,15 +456,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
|
|
|
456
456
|
return;
|
|
457
457
|
}
|
|
458
458
|
setRootAriaHidden(true);
|
|
459
|
-
|
|
460
|
-
* Hide all other overlays from screen readers so only this one
|
|
461
|
-
* can be read. Note that presenting an overlay always makes
|
|
462
|
-
* it the topmost one.
|
|
463
|
-
*/
|
|
464
|
-
if (index.doc !== undefined) {
|
|
465
|
-
const presentedOverlays = getPresentedOverlays(index.doc);
|
|
466
|
-
presentedOverlays.forEach((o) => o.setAttribute('aria-hidden', 'true'));
|
|
467
|
-
}
|
|
459
|
+
hideOverlaysFromScreenReaders(overlay.el);
|
|
468
460
|
overlay.presented = true;
|
|
469
461
|
overlay.willPresent.emit();
|
|
470
462
|
(_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
|
|
@@ -557,7 +549,7 @@ const restoreElementFocus = async (overlayEl) => {
|
|
|
557
549
|
}
|
|
558
550
|
};
|
|
559
551
|
const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
|
|
560
|
-
var _a, _b
|
|
552
|
+
var _a, _b;
|
|
561
553
|
if (!overlay.presented) {
|
|
562
554
|
return false;
|
|
563
555
|
}
|
|
@@ -608,13 +600,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
|
|
|
608
600
|
console.error(err);
|
|
609
601
|
}
|
|
610
602
|
overlay.el.remove();
|
|
611
|
-
|
|
612
|
-
* If there are other overlays presented, unhide the new
|
|
613
|
-
* topmost one from screen readers.
|
|
614
|
-
*/
|
|
615
|
-
if (index.doc !== undefined) {
|
|
616
|
-
(_c = getPresentedOverlay(index.doc)) === null || _c === void 0 ? void 0 : _c.removeAttribute('aria-hidden');
|
|
617
|
-
}
|
|
603
|
+
revealOverlaysToScreenReaders();
|
|
618
604
|
return true;
|
|
619
605
|
};
|
|
620
606
|
const getAppRoot = (doc) => {
|
|
@@ -810,6 +796,69 @@ const createTriggerController = () => {
|
|
|
810
796
|
removeClickListener,
|
|
811
797
|
};
|
|
812
798
|
};
|
|
799
|
+
/**
|
|
800
|
+
* Ensure that underlying overlays have aria-hidden if necessary so that screen readers
|
|
801
|
+
* cannot move focus to these elements. Note that we cannot rely on focus/focusin/focusout
|
|
802
|
+
* events here because those events do not fire when the screen readers moves to a non-focusable
|
|
803
|
+
* element such as text.
|
|
804
|
+
* Without this logic screen readers would be able to move focus outside of the top focus-trapped overlay.
|
|
805
|
+
*
|
|
806
|
+
* @param newTopMostOverlay - The overlay that is being presented. Since the overlay has not been
|
|
807
|
+
* fully presented yet at the time this function is called it will not be included in the getPresentedOverlays result.
|
|
808
|
+
*/
|
|
809
|
+
const hideOverlaysFromScreenReaders = (newTopMostOverlay) => {
|
|
810
|
+
var _a;
|
|
811
|
+
if (index.doc === undefined)
|
|
812
|
+
return;
|
|
813
|
+
const overlays = getPresentedOverlays(index.doc);
|
|
814
|
+
for (let i = overlays.length - 1; i >= 0; i--) {
|
|
815
|
+
const presentedOverlay = overlays[i];
|
|
816
|
+
const nextPresentedOverlay = (_a = overlays[i + 1]) !== null && _a !== void 0 ? _a : newTopMostOverlay;
|
|
817
|
+
// If next overlay has aria-hidden then all remaining overlays will have it too.
|
|
818
|
+
if (nextPresentedOverlay.hasAttribute('aria-hidden')) {
|
|
819
|
+
presentedOverlay.setAttribute('aria-hidden', 'true');
|
|
820
|
+
/**
|
|
821
|
+
* If the next overlay is a Toast this does not have aria-hidden then current overlay
|
|
822
|
+
* should not have aria-hidden either so focus can remain in the current overlay.
|
|
823
|
+
*/
|
|
824
|
+
}
|
|
825
|
+
else if (nextPresentedOverlay.tagName !== 'ION-TOAST') {
|
|
826
|
+
presentedOverlay.setAttribute('aria-hidden', 'true');
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
};
|
|
830
|
+
/**
|
|
831
|
+
* When dismissing an overlay we need to reveal the new top-most overlay to screen readers.
|
|
832
|
+
* If the top-most overlay is a Toast we potentially need to reveal more overlays since
|
|
833
|
+
* focus is never automatically moved to the Toast.
|
|
834
|
+
*/
|
|
835
|
+
const revealOverlaysToScreenReaders = () => {
|
|
836
|
+
if (index.doc === undefined)
|
|
837
|
+
return;
|
|
838
|
+
// If there are other overlays presented, unhide the new topmost one from screen readers.
|
|
839
|
+
const overlays = getPresentedOverlays(index.doc);
|
|
840
|
+
for (let i = overlays.length - 1; i >= 0; i--) {
|
|
841
|
+
const currentOverlay = overlays[i];
|
|
842
|
+
/**
|
|
843
|
+
* If the current we are looking at is a Toast then we can remove aria-hidden.
|
|
844
|
+
* However, we potentially need to keep looking at the overlay stack because there
|
|
845
|
+
* could be more Toasts underneath. Additionally, we need to unhide the closest non-Toast
|
|
846
|
+
* overlay too so focus can move there since focus is never automatically moved to the Toast.
|
|
847
|
+
*/
|
|
848
|
+
if (currentOverlay.tagName === 'ION-TOAST') {
|
|
849
|
+
currentOverlay.removeAttribute('aria-hidden');
|
|
850
|
+
/**
|
|
851
|
+
* If we found a non-Toast element then we can just remove aria-hidden and stop searching entirely
|
|
852
|
+
* since this overlay should always receive focus. As a result, all underlying overlays should still
|
|
853
|
+
* be hidden from screen readers.
|
|
854
|
+
*/
|
|
855
|
+
}
|
|
856
|
+
else {
|
|
857
|
+
currentOverlay.removeAttribute('aria-hidden');
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
};
|
|
813
862
|
|
|
814
863
|
exports.BACKDROP = BACKDROP;
|
|
815
864
|
exports.GESTURE = GESTURE;
|
|
@@ -105,7 +105,7 @@ export class Checkbox {
|
|
|
105
105
|
const mode = getIonMode(this);
|
|
106
106
|
const path = getSVGPath(mode, indeterminate);
|
|
107
107
|
renderHiddenInput(true, el, name, checked ? value : '', disabled);
|
|
108
|
-
return (h(Host, { class: createColorClasses(color, {
|
|
108
|
+
return (h(Host, { "aria-checked": indeterminate ? 'mixed' : `${checked}`, class: createColorClasses(color, {
|
|
109
109
|
[mode]: true,
|
|
110
110
|
'in-item': hostContext('ion-item', el),
|
|
111
111
|
'checkbox-checked': checked,
|
|
@@ -32,3 +32,15 @@ describe('ion-checkbox: disabled', () => {
|
|
|
32
32
|
expect(checkbox.checked).toBe(false);
|
|
33
33
|
});
|
|
34
34
|
});
|
|
35
|
+
describe('ion-checkbox: indeterminate', () => {
|
|
36
|
+
it('should have a mixed value for aria-checked', async () => {
|
|
37
|
+
const page = await newSpecPage({
|
|
38
|
+
components: [Checkbox],
|
|
39
|
+
html: `
|
|
40
|
+
<ion-checkbox indeterminate="true">Checkbox</ion-checkbox>
|
|
41
|
+
`,
|
|
42
|
+
});
|
|
43
|
+
const checkbox = page.body.querySelector('ion-checkbox');
|
|
44
|
+
expect(checkbox.getAttribute('aria-checked')).toBe('mixed');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -58,8 +58,14 @@ export class Range {
|
|
|
58
58
|
el: rangeSlider,
|
|
59
59
|
gestureName: 'range',
|
|
60
60
|
gesturePriority: 100,
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
/**
|
|
62
|
+
* Provide a threshold since the drag movement
|
|
63
|
+
* might be a user scrolling the view.
|
|
64
|
+
* If this is true, then the range
|
|
65
|
+
* should not move.
|
|
66
|
+
*/
|
|
67
|
+
threshold: 10,
|
|
68
|
+
onStart: () => this.onStart(),
|
|
63
69
|
onMove: (ev) => this.onMove(ev),
|
|
64
70
|
onEnd: (ev) => this.onEnd(ev),
|
|
65
71
|
});
|
|
@@ -242,33 +248,93 @@ export class Range {
|
|
|
242
248
|
this.value = this.ensureValueInBounds(this.value);
|
|
243
249
|
this.ionChange.emit({ value: this.value });
|
|
244
250
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
251
|
+
/**
|
|
252
|
+
* The value should be updated on touch end or
|
|
253
|
+
* when the component is being dragged.
|
|
254
|
+
* This follows the native behavior of mobile devices.
|
|
255
|
+
*
|
|
256
|
+
* For example: When the user lifts their finger from the
|
|
257
|
+
* screen after tapping the bar or dragging the bar or knob.
|
|
258
|
+
*/
|
|
259
|
+
onStart() {
|
|
260
|
+
this.ionKnobMoveStart.emit({ value: this.ensureValueInBounds(this.value) });
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* The value should be updated while dragging the
|
|
264
|
+
* bar or knob.
|
|
265
|
+
*
|
|
266
|
+
* While the user is dragging, the view
|
|
267
|
+
* should not scroll. This is to prevent the user from
|
|
268
|
+
* feeling disoriented while dragging.
|
|
269
|
+
*
|
|
270
|
+
* The user can scroll on the view if the knob or
|
|
271
|
+
* bar is not being dragged.
|
|
272
|
+
*
|
|
273
|
+
* @param detail The details of the gesture event.
|
|
274
|
+
*/
|
|
275
|
+
onMove(detail) {
|
|
276
|
+
const { contentEl, pressedKnob } = this;
|
|
277
|
+
const currentX = detail.currentX;
|
|
278
|
+
/**
|
|
279
|
+
* Since the user is dragging on the bar or knob, the view should not scroll.
|
|
280
|
+
*
|
|
281
|
+
* This only needs to be done once.
|
|
282
|
+
*/
|
|
283
|
+
if (contentEl && this.initialContentScrollY === undefined) {
|
|
248
284
|
this.initialContentScrollY = disableContentScrollY(contentEl);
|
|
249
285
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
286
|
+
/**
|
|
287
|
+
* The `pressedKnob` can be undefined if the user just
|
|
288
|
+
* started dragging the knob.
|
|
289
|
+
*
|
|
290
|
+
* This is necessary to determine which knob the user is dragging,
|
|
291
|
+
* especially when it's a dual knob.
|
|
292
|
+
* Plus, it determines when to apply certain styles.
|
|
293
|
+
*
|
|
294
|
+
* This only needs to be done once since the knob won't change
|
|
295
|
+
* while the user is dragging.
|
|
296
|
+
*/
|
|
297
|
+
if (pressedKnob === undefined) {
|
|
298
|
+
this.setPressedKnob(currentX);
|
|
256
299
|
}
|
|
257
|
-
this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
|
|
258
|
-
this.setFocus(this.pressedKnob);
|
|
259
|
-
// update the active knob's position
|
|
260
300
|
this.update(currentX);
|
|
261
|
-
this.ionKnobMoveStart.emit({ value: this.ensureValueInBounds(this.value) });
|
|
262
|
-
}
|
|
263
|
-
onMove(detail) {
|
|
264
|
-
this.update(detail.currentX);
|
|
265
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* The value should be updated on touch end:
|
|
304
|
+
* - When the user lifts their finger from the screen after
|
|
305
|
+
* tapping the bar.
|
|
306
|
+
*
|
|
307
|
+
* @param detail The details of the gesture or mouse event.
|
|
308
|
+
*/
|
|
266
309
|
onEnd(detail) {
|
|
267
310
|
const { contentEl, initialContentScrollY } = this;
|
|
268
|
-
|
|
311
|
+
const currentX = detail.currentX || detail.clientX;
|
|
312
|
+
/**
|
|
313
|
+
* The `pressedKnob` can be undefined if the user never
|
|
314
|
+
* dragged the knob. They just tapped on the bar.
|
|
315
|
+
*
|
|
316
|
+
* This is necessary to determine which knob the user is changing,
|
|
317
|
+
* especially when it's a dual knob.
|
|
318
|
+
* Plus, it determines when to apply certain styles.
|
|
319
|
+
*/
|
|
320
|
+
if (this.pressedKnob === undefined) {
|
|
321
|
+
this.setPressedKnob(currentX);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* The user is no longer dragging the bar or
|
|
325
|
+
* knob (if they were dragging it).
|
|
326
|
+
*
|
|
327
|
+
* The user can now scroll on the view in the next gesture event.
|
|
328
|
+
*/
|
|
329
|
+
if (contentEl && initialContentScrollY !== undefined) {
|
|
269
330
|
resetContentScrollY(contentEl, initialContentScrollY);
|
|
270
331
|
}
|
|
271
|
-
|
|
332
|
+
// update the active knob's position
|
|
333
|
+
this.update(currentX);
|
|
334
|
+
/**
|
|
335
|
+
* Reset the pressed knob to undefined since the user
|
|
336
|
+
* may start dragging a different knob in the next gesture event.
|
|
337
|
+
*/
|
|
272
338
|
this.pressedKnob = undefined;
|
|
273
339
|
this.emitValueChange();
|
|
274
340
|
this.ionKnobMoveEnd.emit({ value: this.ensureValueInBounds(this.value) });
|
|
@@ -295,6 +361,16 @@ export class Range {
|
|
|
295
361
|
// Update input value
|
|
296
362
|
this.updateValue();
|
|
297
363
|
}
|
|
364
|
+
setPressedKnob(currentX) {
|
|
365
|
+
const rect = (this.rect = this.rangeSlider.getBoundingClientRect());
|
|
366
|
+
// figure out which knob they started closer to
|
|
367
|
+
let ratio = clamp(0, (currentX - rect.left) / rect.width, 1);
|
|
368
|
+
if (isRTL(this.el)) {
|
|
369
|
+
ratio = 1 - ratio;
|
|
370
|
+
}
|
|
371
|
+
this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
|
|
372
|
+
this.setFocus(this.pressedKnob);
|
|
373
|
+
}
|
|
298
374
|
get valA() {
|
|
299
375
|
return ratioToValue(this.ratioA, this.min, this.max, this.step);
|
|
300
376
|
}
|
|
@@ -497,7 +573,36 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
|
|
|
497
573
|
if (!this.legacyFormController.hasLegacyControl() && this.hasLabel) {
|
|
498
574
|
labelledBy = 'range-label';
|
|
499
575
|
}
|
|
500
|
-
return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl)
|
|
576
|
+
return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl),
|
|
577
|
+
/**
|
|
578
|
+
* Since the gesture has a threshold, the value
|
|
579
|
+
* won't change until the user has dragged past
|
|
580
|
+
* the threshold. This is to prevent the range
|
|
581
|
+
* from moving when the user is scrolling.
|
|
582
|
+
*
|
|
583
|
+
* This results in the value not being updated
|
|
584
|
+
* and the event emitters not being triggered
|
|
585
|
+
* if the user taps on the range. This is why
|
|
586
|
+
* we need to listen for the "pointerUp" event.
|
|
587
|
+
*/
|
|
588
|
+
onPointerUp: (ev) => {
|
|
589
|
+
/**
|
|
590
|
+
* If the user drags the knob on the web
|
|
591
|
+
* version (does not occur on mobile),
|
|
592
|
+
* the "pointerUp" event will be triggered
|
|
593
|
+
* along with the gesture's events.
|
|
594
|
+
* This leads to duplicate events.
|
|
595
|
+
*
|
|
596
|
+
* By checking if the pressedKnob is undefined,
|
|
597
|
+
* we can determine if the "pointerUp" event was
|
|
598
|
+
* triggered by a tap or a drag. If it was
|
|
599
|
+
* dragged, the pressedKnob will be defined.
|
|
600
|
+
*/
|
|
601
|
+
if (this.pressedKnob === undefined) {
|
|
602
|
+
this.onStart();
|
|
603
|
+
this.onEnd(ev);
|
|
604
|
+
}
|
|
605
|
+
} }, ticks.map((tick) => (h("div", { style: tickStyle(tick), role: "presentation", class: {
|
|
501
606
|
'range-tick': true,
|
|
502
607
|
'range-tick-active': tick.active,
|
|
503
608
|
}, part: tick.active ? 'tick-active' : 'tick' }))), h("div", { class: "range-bar-container" }, h("div", { class: "range-bar", role: "presentation", part: "bar" }), h("div", { class: {
|
|
@@ -54,6 +54,33 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
|
|
|
54
54
|
expect(rangeStart).toHaveReceivedEventDetail({ value: 20 });
|
|
55
55
|
expect(rangeEnd).toHaveReceivedEventDetail({ value: 21 });
|
|
56
56
|
});
|
|
57
|
+
test('should emit end event on tap', async ({ page }, testInfo) => {
|
|
58
|
+
testInfo.annotations.push({
|
|
59
|
+
type: 'issue',
|
|
60
|
+
description: 'https://github.com/ionic-team/ionic-framework/issues/28487',
|
|
61
|
+
});
|
|
62
|
+
await page.setContent(`<ion-range aria-label="Range" value="20"></ion-range>`, config);
|
|
63
|
+
const range = page.locator('ion-range');
|
|
64
|
+
const rangeEndSpy = await page.spyOnEvent('ionKnobMoveEnd');
|
|
65
|
+
const rangeBoundingBox = await range.boundingBox();
|
|
66
|
+
/**
|
|
67
|
+
* Coordinates for the click event.
|
|
68
|
+
* These need to be near the end of the range
|
|
69
|
+
* (or anything that isn't the current value).
|
|
70
|
+
*
|
|
71
|
+
* The number 50 is arbitrary, but it should be
|
|
72
|
+
* less than the width of the range.
|
|
73
|
+
*/
|
|
74
|
+
const x = rangeBoundingBox.width - 50;
|
|
75
|
+
// The y coordinate is the middle of the range.
|
|
76
|
+
const y = rangeBoundingBox.height / 2;
|
|
77
|
+
// Click near the end of the range.
|
|
78
|
+
await range.click({
|
|
79
|
+
position: { x, y },
|
|
80
|
+
});
|
|
81
|
+
await rangeEndSpy.next();
|
|
82
|
+
expect(rangeEndSpy.length).toBe(1);
|
|
83
|
+
});
|
|
57
84
|
// TODO FW-2873
|
|
58
85
|
test.skip('should not scroll when the knob is swiped', async ({ page, skip }) => {
|
|
59
86
|
skip.browser('webkit', 'mouse.wheel is not available in WebKit');
|
|
@@ -455,15 +455,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
|
|
|
455
455
|
return;
|
|
456
456
|
}
|
|
457
457
|
setRootAriaHidden(true);
|
|
458
|
-
|
|
459
|
-
* Hide all other overlays from screen readers so only this one
|
|
460
|
-
* can be read. Note that presenting an overlay always makes
|
|
461
|
-
* it the topmost one.
|
|
462
|
-
*/
|
|
463
|
-
if (doc !== undefined) {
|
|
464
|
-
const presentedOverlays = getPresentedOverlays(doc);
|
|
465
|
-
presentedOverlays.forEach((o) => o.setAttribute('aria-hidden', 'true'));
|
|
466
|
-
}
|
|
458
|
+
hideOverlaysFromScreenReaders(overlay.el);
|
|
467
459
|
overlay.presented = true;
|
|
468
460
|
overlay.willPresent.emit();
|
|
469
461
|
(_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
|
|
@@ -556,7 +548,7 @@ const restoreElementFocus = async (overlayEl) => {
|
|
|
556
548
|
}
|
|
557
549
|
};
|
|
558
550
|
export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
|
|
559
|
-
var _a, _b
|
|
551
|
+
var _a, _b;
|
|
560
552
|
if (!overlay.presented) {
|
|
561
553
|
return false;
|
|
562
554
|
}
|
|
@@ -607,13 +599,7 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
|
|
|
607
599
|
console.error(err);
|
|
608
600
|
}
|
|
609
601
|
overlay.el.remove();
|
|
610
|
-
|
|
611
|
-
* If there are other overlays presented, unhide the new
|
|
612
|
-
* topmost one from screen readers.
|
|
613
|
-
*/
|
|
614
|
-
if (doc !== undefined) {
|
|
615
|
-
(_c = getPresentedOverlay(doc)) === null || _c === void 0 ? void 0 : _c.removeAttribute('aria-hidden');
|
|
616
|
-
}
|
|
602
|
+
revealOverlaysToScreenReaders();
|
|
617
603
|
return true;
|
|
618
604
|
};
|
|
619
605
|
const getAppRoot = (doc) => {
|
|
@@ -809,3 +795,66 @@ export const createTriggerController = () => {
|
|
|
809
795
|
removeClickListener,
|
|
810
796
|
};
|
|
811
797
|
};
|
|
798
|
+
/**
|
|
799
|
+
* Ensure that underlying overlays have aria-hidden if necessary so that screen readers
|
|
800
|
+
* cannot move focus to these elements. Note that we cannot rely on focus/focusin/focusout
|
|
801
|
+
* events here because those events do not fire when the screen readers moves to a non-focusable
|
|
802
|
+
* element such as text.
|
|
803
|
+
* Without this logic screen readers would be able to move focus outside of the top focus-trapped overlay.
|
|
804
|
+
*
|
|
805
|
+
* @param newTopMostOverlay - The overlay that is being presented. Since the overlay has not been
|
|
806
|
+
* fully presented yet at the time this function is called it will not be included in the getPresentedOverlays result.
|
|
807
|
+
*/
|
|
808
|
+
const hideOverlaysFromScreenReaders = (newTopMostOverlay) => {
|
|
809
|
+
var _a;
|
|
810
|
+
if (doc === undefined)
|
|
811
|
+
return;
|
|
812
|
+
const overlays = getPresentedOverlays(doc);
|
|
813
|
+
for (let i = overlays.length - 1; i >= 0; i--) {
|
|
814
|
+
const presentedOverlay = overlays[i];
|
|
815
|
+
const nextPresentedOverlay = (_a = overlays[i + 1]) !== null && _a !== void 0 ? _a : newTopMostOverlay;
|
|
816
|
+
// If next overlay has aria-hidden then all remaining overlays will have it too.
|
|
817
|
+
if (nextPresentedOverlay.hasAttribute('aria-hidden')) {
|
|
818
|
+
presentedOverlay.setAttribute('aria-hidden', 'true');
|
|
819
|
+
/**
|
|
820
|
+
* If the next overlay is a Toast this does not have aria-hidden then current overlay
|
|
821
|
+
* should not have aria-hidden either so focus can remain in the current overlay.
|
|
822
|
+
*/
|
|
823
|
+
}
|
|
824
|
+
else if (nextPresentedOverlay.tagName !== 'ION-TOAST') {
|
|
825
|
+
presentedOverlay.setAttribute('aria-hidden', 'true');
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
};
|
|
829
|
+
/**
|
|
830
|
+
* When dismissing an overlay we need to reveal the new top-most overlay to screen readers.
|
|
831
|
+
* If the top-most overlay is a Toast we potentially need to reveal more overlays since
|
|
832
|
+
* focus is never automatically moved to the Toast.
|
|
833
|
+
*/
|
|
834
|
+
const revealOverlaysToScreenReaders = () => {
|
|
835
|
+
if (doc === undefined)
|
|
836
|
+
return;
|
|
837
|
+
// If there are other overlays presented, unhide the new topmost one from screen readers.
|
|
838
|
+
const overlays = getPresentedOverlays(doc);
|
|
839
|
+
for (let i = overlays.length - 1; i >= 0; i--) {
|
|
840
|
+
const currentOverlay = overlays[i];
|
|
841
|
+
/**
|
|
842
|
+
* If the current we are looking at is a Toast then we can remove aria-hidden.
|
|
843
|
+
* However, we potentially need to keep looking at the overlay stack because there
|
|
844
|
+
* could be more Toasts underneath. Additionally, we need to unhide the closest non-Toast
|
|
845
|
+
* overlay too so focus can move there since focus is never automatically moved to the Toast.
|
|
846
|
+
*/
|
|
847
|
+
if (currentOverlay.tagName === 'ION-TOAST') {
|
|
848
|
+
currentOverlay.removeAttribute('aria-hidden');
|
|
849
|
+
/**
|
|
850
|
+
* If we found a non-Toast element then we can just remove aria-hidden and stop searching entirely
|
|
851
|
+
* since this overlay should always receive focus. As a result, all underlying overlays should still
|
|
852
|
+
* be hidden from screen readers.
|
|
853
|
+
*/
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
currentOverlay.removeAttribute('aria-hidden');
|
|
857
|
+
break;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
};
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { newSpecPage } from "@stencil/core/testing";
|
|
5
5
|
import { Modal } from "../../../components/modal/modal";
|
|
6
|
+
import { Toast } from "../../../components/toast/toast";
|
|
6
7
|
import { Nav } from "../../../components/nav/nav";
|
|
7
8
|
import { RouterOutlet } from "../../../components/router-outlet/router-outlet";
|
|
8
9
|
import { setRootAriaHidden } from "../../overlays";
|
|
@@ -150,4 +151,56 @@ describe('aria-hidden on individual overlays', () => {
|
|
|
150
151
|
await modalOne.present();
|
|
151
152
|
expect(modalOne.hasAttribute('aria-hidden')).toEqual(false);
|
|
152
153
|
});
|
|
154
|
+
it('should not hide previous overlay is top-most overlay is toast', async () => {
|
|
155
|
+
const page = await newSpecPage({
|
|
156
|
+
components: [Modal, Toast],
|
|
157
|
+
html: `
|
|
158
|
+
<ion-modal id="m-one"></ion-modal>
|
|
159
|
+
<ion-modal id="m-two"></ion-modal>
|
|
160
|
+
<ion-toast id="t-one"></ion-toast>
|
|
161
|
+
<ion-toast id="t-two"></ion-toast>
|
|
162
|
+
`,
|
|
163
|
+
});
|
|
164
|
+
const modalOne = page.body.querySelector('ion-modal#m-one');
|
|
165
|
+
const modalTwo = page.body.querySelector('ion-modal#m-two');
|
|
166
|
+
const toastOne = page.body.querySelector('ion-toast#t-one');
|
|
167
|
+
const toastTwo = page.body.querySelector('ion-toast#t-two');
|
|
168
|
+
await modalOne.present();
|
|
169
|
+
await modalTwo.present();
|
|
170
|
+
await toastOne.present();
|
|
171
|
+
await toastTwo.present();
|
|
172
|
+
expect(modalOne.hasAttribute('aria-hidden')).toEqual(true);
|
|
173
|
+
expect(modalTwo.hasAttribute('aria-hidden')).toEqual(false);
|
|
174
|
+
expect(toastOne.hasAttribute('aria-hidden')).toEqual(false);
|
|
175
|
+
expect(toastTwo.hasAttribute('aria-hidden')).toEqual(false);
|
|
176
|
+
await toastTwo.dismiss();
|
|
177
|
+
expect(modalOne.hasAttribute('aria-hidden')).toEqual(true);
|
|
178
|
+
expect(modalTwo.hasAttribute('aria-hidden')).toEqual(false);
|
|
179
|
+
expect(toastOne.hasAttribute('aria-hidden')).toEqual(false);
|
|
180
|
+
await toastOne.dismiss();
|
|
181
|
+
expect(modalOne.hasAttribute('aria-hidden')).toEqual(true);
|
|
182
|
+
expect(modalTwo.hasAttribute('aria-hidden')).toEqual(false);
|
|
183
|
+
});
|
|
184
|
+
it('should hide previous overlay even with a toast that is not the top-most overlay', async () => {
|
|
185
|
+
const page = await newSpecPage({
|
|
186
|
+
components: [Modal, Toast],
|
|
187
|
+
html: `
|
|
188
|
+
<ion-modal id="m-one"></ion-modal>
|
|
189
|
+
<ion-toast id="t-one"></ion-toast>
|
|
190
|
+
<ion-modal id="m-two"></ion-modal>
|
|
191
|
+
`,
|
|
192
|
+
});
|
|
193
|
+
const modalOne = page.body.querySelector('ion-modal#m-one');
|
|
194
|
+
const modalTwo = page.body.querySelector('ion-modal#m-two');
|
|
195
|
+
const toastOne = page.body.querySelector('ion-toast#t-one');
|
|
196
|
+
await modalOne.present();
|
|
197
|
+
await toastOne.present();
|
|
198
|
+
await modalTwo.present();
|
|
199
|
+
expect(modalOne.hasAttribute('aria-hidden')).toEqual(true);
|
|
200
|
+
expect(toastOne.hasAttribute('aria-hidden')).toEqual(true);
|
|
201
|
+
expect(modalTwo.hasAttribute('aria-hidden')).toEqual(false);
|
|
202
|
+
await modalTwo.dismiss();
|
|
203
|
+
expect(modalOne.hasAttribute('aria-hidden')).toEqual(false);
|
|
204
|
+
expect(toastOne.hasAttribute('aria-hidden')).toEqual(false);
|
|
205
|
+
});
|
|
153
206
|
});
|
package/dist/docs.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
-
import { w as writeTask } from './index-
|
|
4
|
+
import { w as writeTask } from './index-eab5468b.js';
|
|
5
5
|
import { h as hapticSelectionEnd, a as hapticSelectionStart, b as hapticSelectionChanged } from './haptic-554688a5.js';
|
|
6
6
|
import { createGesture } from './index-2cf77112.js';
|
|
7
7
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { w as win } from './index-a5d50daf.js';
|
|
5
|
-
import { c as config } from './ionic-global-
|
|
6
|
-
import './index-
|
|
5
|
+
import { c as config } from './ionic-global-c836c8c6.js';
|
|
6
|
+
import './index-eab5468b.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* CloseWatcher is a newer API that lets
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
-
import { w as writeTask, B as Build } from './index-
|
|
4
|
+
import { w as writeTask, B as Build } from './index-eab5468b.js';
|
|
5
5
|
import { r as raf } from './helpers-be245865.js';
|
|
6
6
|
|
|
7
7
|
const LIFECYCLE_WILL_ENTER = 'ionViewWillEnter';
|
|
@@ -10,8 +10,8 @@ const LIFECYCLE_WILL_LEAVE = 'ionViewWillLeave';
|
|
|
10
10
|
const LIFECYCLE_DID_LEAVE = 'ionViewDidLeave';
|
|
11
11
|
const LIFECYCLE_WILL_UNLOAD = 'ionViewWillUnload';
|
|
12
12
|
|
|
13
|
-
const iosTransitionAnimation = () => import('./ios.transition-
|
|
14
|
-
const mdTransitionAnimation = () => import('./md.transition-
|
|
13
|
+
const iosTransitionAnimation = () => import('./ios.transition-eb28f539.js');
|
|
14
|
+
const mdTransitionAnimation = () => import('./md.transition-fd4e98e6.js');
|
|
15
15
|
// TODO(FW-2832): types
|
|
16
16
|
const transition = (opts) => {
|
|
17
17
|
return new Promise((resolve, reject) => {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { d as doc } from './index-a5d50daf.js';
|
|
5
|
-
import { MENU_BACK_BUTTON_PRIORITY } from './hardware-back-button-
|
|
5
|
+
import { MENU_BACK_BUTTON_PRIORITY } from './hardware-back-button-adcc28d5.js';
|
|
6
6
|
import { p as printIonWarning } from './index-9b0d46f4.js';
|
|
7
7
|
import { c as componentOnReady } from './helpers-be245865.js';
|
|
8
|
-
import { b as getIonMode } from './ionic-global-
|
|
8
|
+
import { b as getIonMode } from './ionic-global-c836c8c6.js';
|
|
9
9
|
import { c as createAnimation } from './animation-6a0c5338.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -2267,7 +2267,8 @@ const initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
|
|
|
2267
2267
|
if ((hostRef.$flags$ & 32 /* HOST_FLAGS.hasInitializedComponent */) === 0) {
|
|
2268
2268
|
// Let the runtime know that the component has been initialized
|
|
2269
2269
|
hostRef.$flags$ |= 32 /* HOST_FLAGS.hasInitializedComponent */;
|
|
2270
|
-
|
|
2270
|
+
const bundleId = cmpMeta.$lazyBundleId$;
|
|
2271
|
+
if (bundleId) {
|
|
2271
2272
|
// lazy loaded components
|
|
2272
2273
|
// request the component's implementation to be
|
|
2273
2274
|
// wired up with the host element
|
|
@@ -2314,6 +2315,14 @@ const initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
|
|
|
2314
2315
|
endNewInstance();
|
|
2315
2316
|
fireConnectedCallback(hostRef.$lazyInstance$);
|
|
2316
2317
|
}
|
|
2318
|
+
else {
|
|
2319
|
+
// sync constructor component
|
|
2320
|
+
Cstr = elm.constructor;
|
|
2321
|
+
// wait for the CustomElementRegistry to mark the component as ready before setting `isWatchReady`. Otherwise,
|
|
2322
|
+
// watchers may fire prematurely if `customElements.get()`/`customElements.whenDefined()` resolves _before_
|
|
2323
|
+
// Stencil has completed instantiating the component.
|
|
2324
|
+
customElements.whenDefined(cmpMeta.$tagName$).then(() => (hostRef.$flags$ |= 128 /* HOST_FLAGS.isWatchReady */));
|
|
2325
|
+
}
|
|
2317
2326
|
if (Cstr.style) {
|
|
2318
2327
|
// this component has styles but we haven't registered them yet
|
|
2319
2328
|
let style = Cstr.style;
|