@ionic/core 8.8.7-dev.11779400352.127ba526 → 8.8.7-dev.11779467048.1641d05e
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-action-sheet.js +1 -1
- package/components/ion-alert.js +1 -1
- package/components/ion-back-button.js +1 -1
- package/components/ion-button.js +1 -1
- package/components/ion-card.js +1 -1
- package/components/ion-chip.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-gallery.js +1 -1
- package/components/ion-grid.js +1 -1
- package/components/ion-header.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-legacy-column.js +1 -1
- package/components/ion-picker-legacy.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-router-link.js +1 -1
- package/components/ion-router-outlet.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-B-oPDoNQ.js → p-BFbsici0.js} +1 -1
- package/components/{p-6_r-Odtt.js → p-BLCuPAtN.js} +1 -1
- package/components/{p-CSf_VKpz.js → p-BRWWcnBq.js} +1 -1
- package/components/{p-CvljGih0.js → p-BXcCGjEc.js} +1 -1
- package/components/{p-DZOqbnq2.js → p-BqImG3uk.js} +1 -1
- package/components/{p-D42P_qbe.js → p-C38HUpU5.js} +1 -1
- package/components/{p-Ddl4_R29.js → p-C4G6C9fP.js} +1 -1
- package/components/{p-C-Vjb84N.js → p-C8ktKu9j.js} +1 -1
- package/components/{p-J7srYGKf.js → p-CIoAIKEr.js} +1 -1
- package/components/{p-BhkRbo3L.js → p-CN-WzkJE.js} +1 -1
- package/components/p-CVRxImH6.js +4 -0
- package/components/{p-KF2RUDHO.js → p-CoFDGTFO.js} +1 -1
- package/components/{p-n94Bzx6_.js → p-CoFqDNc5.js} +1 -1
- package/components/{p-vGxjPSKT.js → p-CykCvfXQ.js} +1 -1
- package/components/p-DHTe6lDL.js +4 -0
- package/components/{p-C75do9pU.js → p-DH_9VCbD.js} +1 -1
- package/components/{p-Ct1_qpJ-.js → p-DTtRWhIZ.js} +1 -1
- package/components/{p-BdmDSErh.js → p-DXUyXgVL.js} +1 -1
- package/components/{p-BLHs-wsh.js → p-IMXp2Inn.js} +1 -1
- package/components/{p-lEYPO4ZC.js → p-TR4ubkPu.js} +1 -1
- package/components/{p-CieebRr6.js → p-qZr7hBPz.js} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
- package/dist/cjs/ion-alert.cjs.entry.js +1 -1
- package/dist/cjs/ion-app_8.cjs.entry.js +7 -7
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-col_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-datetime_3.cjs.entry.js +5 -5
- package/dist/cjs/ion-gallery.cjs.entry.js +8 -57
- package/dist/cjs/ion-img.cjs.entry.js +2 -2
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +3 -3
- package/dist/cjs/ion-input.cjs.entry.js +4 -4
- package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-item_8.cjs.entry.js +12 -12
- package/dist/cjs/ion-loading.cjs.entry.js +3 -3
- package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
- package/dist/cjs/ion-modal.cjs.entry.js +5 -5
- package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
- package/dist/cjs/ion-popover.cjs.entry.js +3 -3
- package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
- package/dist/cjs/ion-radio_2.cjs.entry.js +5 -5
- package/dist/cjs/ion-range.cjs.entry.js +3 -3
- package/dist/cjs/ion-refresher_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
- package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
- package/dist/cjs/ion-searchbar.cjs.entry.js +4 -4
- package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment-view.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-select-modal.cjs.entry.js +2 -2
- package/dist/cjs/ion-select_3.cjs.entry.js +7 -7
- package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
- package/dist/cjs/ion-toast.cjs.entry.js +3 -3
- package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{overlays-Hci_7vw_.js → overlays-C54DhaTC.js} +187 -10
- package/dist/collection/collection-manifest.json +0 -1
- package/dist/collection/components/gallery/gallery.css +24 -0
- package/dist/collection/components/gallery/gallery.js +7 -56
- package/dist/collection/components/gallery/test/utils.js +13 -13
- package/dist/collection/components/grid/grid.js +2 -2
- package/dist/collection/components/header/header.js +2 -2
- package/dist/collection/components/img/img.js +2 -2
- package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
- package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
- package/dist/collection/components/input/input.js +4 -4
- package/dist/collection/components/input-otp/input-otp.js +3 -3
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
- package/dist/collection/components/item-divider/item-divider.js +2 -2
- package/dist/collection/components/item-group/item-group.js +1 -1
- package/dist/collection/components/item-option/item-option.js +2 -2
- package/dist/collection/components/item-options/item-options.js +1 -1
- package/dist/collection/components/item-sliding/item-sliding.js +1 -1
- package/dist/collection/components/label/label.js +2 -2
- package/dist/collection/components/list/list.js +1 -1
- package/dist/collection/components/list-header/list-header.js +2 -2
- package/dist/collection/components/loading/loading.js +2 -2
- package/dist/collection/components/menu/menu.js +2 -2
- package/dist/collection/components/menu-button/menu-button.js +2 -2
- package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
- package/dist/collection/components/modal/modal.js +4 -4
- package/dist/collection/components/nav/nav.js +1 -1
- package/dist/collection/components/nav-link/nav-link.js +1 -1
- package/dist/collection/components/note/note.js +2 -2
- package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
- package/dist/collection/components/picker-legacy/picker.js +2 -2
- package/dist/collection/components/picker-legacy-column/picker-column.js +2 -2
- package/dist/collection/components/popover/popover.js +2 -2
- package/dist/collection/components/progress-bar/progress-bar.js +1 -1
- package/dist/collection/components/radio/radio.js +3 -3
- package/dist/collection/components/radio-group/radio-group.js +2 -2
- package/dist/collection/components/range/range.js +3 -3
- package/dist/collection/components/refresher/refresher.js +1 -1
- package/dist/collection/components/refresher-content/refresher-content.js +2 -2
- package/dist/collection/components/reorder/reorder.js +2 -2
- package/dist/collection/components/reorder-group/reorder-group.js +1 -1
- package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
- package/dist/collection/components/router-link/router-link.js +2 -2
- package/dist/collection/components/router-outlet/router-outlet.js +1 -1
- package/dist/collection/components/row/row.js +2 -2
- package/dist/collection/components/searchbar/searchbar.js +4 -4
- package/dist/collection/components/segment/segment.js +2 -2
- package/dist/collection/components/segment-button/segment-button.js +2 -2
- package/dist/collection/components/segment-content/segment-content.js +1 -1
- package/dist/collection/components/segment-view/segment-view.js +2 -2
- package/dist/collection/components/select/select.js +3 -3
- package/dist/collection/components/select-modal/select-modal.js +1 -1
- package/dist/collection/components/select-option/select-option.js +1 -1
- package/dist/collection/components/select-popover/select-popover.js +2 -2
- package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
- package/dist/collection/components/spinner/spinner.js +1 -1
- package/dist/collection/components/split-pane/split-pane.js +2 -2
- package/dist/collection/components/tab/tab.js +2 -2
- package/dist/collection/components/tab-bar/tab-bar.js +2 -2
- package/dist/collection/components/tab-button/tab-button.js +2 -2
- package/dist/collection/components/tabs/tabs.js +1 -1
- package/dist/collection/components/text/text.js +2 -2
- package/dist/collection/components/textarea/textarea.js +3 -3
- package/dist/collection/components/thumbnail/thumbnail.js +2 -2
- package/dist/collection/components/title/title.js +2 -2
- package/dist/collection/components/toast/toast.js +2 -2
- package/dist/collection/components/toggle/toggle.js +3 -3
- package/dist/collection/components/toolbar/toolbar.js +2 -2
- package/dist/collection/utils/overlays.js +187 -10
- package/dist/docs.json +1 -85
- package/dist/esm/index.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +1 -1
- package/dist/esm/ion-alert.entry.js +1 -1
- package/dist/esm/ion-app_8.entry.js +7 -7
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-col_3.entry.js +4 -4
- package/dist/esm/ion-datetime_3.entry.js +5 -5
- package/dist/esm/ion-gallery.entry.js +8 -57
- package/dist/esm/ion-img.entry.js +2 -2
- package/dist/esm/ion-infinite-scroll_2.entry.js +3 -3
- package/dist/esm/ion-input-otp.entry.js +3 -3
- package/dist/esm/ion-input-password-toggle.entry.js +3 -3
- package/dist/esm/ion-input.entry.js +4 -4
- package/dist/esm/ion-item-option_3.entry.js +4 -4
- package/dist/esm/ion-item_8.entry.js +12 -12
- package/dist/esm/ion-loading.entry.js +3 -3
- package/dist/esm/ion-menu_3.entry.js +7 -7
- package/dist/esm/ion-modal.entry.js +5 -5
- package/dist/esm/ion-nav_2.entry.js +2 -2
- package/dist/esm/ion-picker-column-option.entry.js +2 -2
- package/dist/esm/ion-popover.entry.js +3 -3
- package/dist/esm/ion-progress-bar.entry.js +1 -1
- package/dist/esm/ion-radio_2.entry.js +5 -5
- package/dist/esm/ion-range.entry.js +3 -3
- package/dist/esm/ion-refresher_2.entry.js +3 -3
- package/dist/esm/ion-reorder_2.entry.js +3 -3
- package/dist/esm/ion-ripple-effect.entry.js +1 -1
- package/dist/esm/ion-route_4.entry.js +2 -2
- package/dist/esm/ion-searchbar.entry.js +4 -4
- package/dist/esm/ion-segment-content.entry.js +1 -1
- package/dist/esm/ion-segment-view.entry.js +2 -2
- package/dist/esm/ion-segment_2.entry.js +4 -4
- package/dist/esm/ion-select-modal.entry.js +2 -2
- package/dist/esm/ion-select_3.entry.js +7 -7
- package/dist/esm/ion-spinner.entry.js +1 -1
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +4 -4
- package/dist/esm/ion-tab_2.entry.js +3 -3
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +3 -3
- package/dist/esm/ion-toast.entry.js +3 -3
- package/dist/esm/ion-toggle.entry.js +3 -3
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{overlays-rwDDzEs4.js → overlays-ttYCMKRp.js} +187 -10
- package/dist/html.html-data.json +0 -42
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-6911beb3.entry.js → p-00c0bd38.entry.js} +1 -1
- package/dist/ionic/p-06bd033b.entry.js +4 -0
- package/dist/ionic/{p-b8f7e970.entry.js → p-1709b0aa.entry.js} +1 -1
- package/dist/ionic/{p-7761b69d.entry.js → p-1c2c1869.entry.js} +1 -1
- package/dist/ionic/{p-bd3ae730.entry.js → p-1c4de46b.entry.js} +1 -1
- package/dist/ionic/p-1e1c8d61.entry.js +4 -0
- package/dist/ionic/{p-fe073307.entry.js → p-1f74b8d4.entry.js} +1 -1
- package/dist/ionic/p-2aa7567e.entry.js +4 -0
- package/dist/ionic/{p-455ac83a.entry.js → p-2ad79c23.entry.js} +1 -1
- package/dist/ionic/{p-2c252788.entry.js → p-2f8aa0ac.entry.js} +1 -1
- package/dist/ionic/{p-3d939d55.entry.js → p-3331cfa9.entry.js} +1 -1
- package/dist/ionic/{p-dd1e95c5.entry.js → p-33c34361.entry.js} +1 -1
- package/dist/ionic/{p-636aa79b.entry.js → p-3f79f594.entry.js} +1 -1
- package/dist/ionic/{p-8291455b.entry.js → p-48026d15.entry.js} +1 -1
- package/dist/ionic/{p-e5976b28.entry.js → p-5061a8d4.entry.js} +1 -1
- package/dist/ionic/{p-fc01563c.entry.js → p-50b61fab.entry.js} +1 -1
- package/dist/ionic/{p-c55a5578.entry.js → p-50cd2d57.entry.js} +1 -1
- package/dist/ionic/{p-503219b5.entry.js → p-5274f999.entry.js} +1 -1
- package/dist/ionic/{p-c1d6501a.entry.js → p-586d4270.entry.js} +1 -1
- package/dist/ionic/{p-e342b205.entry.js → p-7054a1b9.entry.js} +1 -1
- package/dist/ionic/{p-cecceb9f.entry.js → p-72491468.entry.js} +1 -1
- package/dist/ionic/{p-02a1a45c.entry.js → p-76307d10.entry.js} +1 -1
- package/dist/ionic/{p-5b164421.entry.js → p-7d5057c4.entry.js} +1 -1
- package/dist/ionic/{p-bb2d2635.entry.js → p-83c693c4.entry.js} +1 -1
- package/dist/ionic/{p-fdf0e290.entry.js → p-8537b2fb.entry.js} +1 -1
- package/dist/ionic/{p-4a0260e6.entry.js → p-8f04bd89.entry.js} +1 -1
- package/dist/ionic/{p-0ef2fcda.entry.js → p-90e653e3.entry.js} +1 -1
- package/dist/ionic/p-967576f8.entry.js +4 -0
- package/dist/ionic/{p-d604defc.entry.js → p-9d789053.entry.js} +1 -1
- package/dist/ionic/p-DdyNaGpi.js +4 -0
- package/dist/ionic/{p-65159e09.entry.js → p-ae667493.entry.js} +1 -1
- package/dist/ionic/{p-e73a7fe2.entry.js → p-b2fe6c1c.entry.js} +1 -1
- package/dist/ionic/{p-92427c9d.entry.js → p-b3c9f19c.entry.js} +1 -1
- package/dist/ionic/{p-83c0eb9b.entry.js → p-b653f4c2.entry.js} +1 -1
- package/dist/ionic/{p-9f914d43.entry.js → p-bb898d47.entry.js} +1 -1
- package/dist/ionic/{p-0c3bf0a7.entry.js → p-bd71a4a7.entry.js} +1 -1
- package/dist/ionic/{p-3fd97ea9.entry.js → p-d4ed5710.entry.js} +1 -1
- package/dist/ionic/{p-874945f3.entry.js → p-d6299c37.entry.js} +1 -1
- package/dist/ionic/{p-229c8fb5.entry.js → p-dea52cb3.entry.js} +1 -1
- package/dist/ionic/{p-2a66b899.entry.js → p-e18d3fdb.entry.js} +1 -1
- package/dist/ionic/{p-6ec1e450.entry.js → p-fad05840.entry.js} +1 -1
- package/dist/ionic/{p-432c5888.entry.js → p-fc796d48.entry.js} +1 -1
- package/dist/types/components/gallery/gallery.d.ts +2 -10
- package/dist/types/components/gallery/test/utils.d.ts +1 -1
- package/dist/types/components.d.ts +0 -29
- package/hydrate/index.js +317 -269
- package/hydrate/index.mjs +317 -269
- package/package.json +1 -1
- package/components/ion-gallery-item.d.ts +0 -11
- package/components/ion-gallery-item.js +0 -4
- package/components/p-C4dDZdpz.js +0 -4
- package/components/p-CtiqM786.js +0 -4
- package/dist/cjs/ion-gallery-item.cjs.entry.js +0 -72
- package/dist/collection/components/gallery-item/gallery-item.css +0 -87
- package/dist/collection/components/gallery-item/gallery-item.js +0 -87
- package/dist/esm/ion-gallery-item.entry.js +0 -70
- package/dist/ionic/p-1ab01507.entry.js +0 -4
- package/dist/ionic/p-21ca5788.entry.js +0 -4
- package/dist/ionic/p-2981a0bd.entry.js +0 -4
- package/dist/ionic/p-2d5a2511.entry.js +0 -4
- package/dist/ionic/p-76de7898.entry.js +0 -4
- package/dist/ionic/p-C4uUM9DM.js +0 -4
- package/dist/types/components/gallery-item/gallery-item.d.ts +0 -25
|
@@ -104,8 +104,101 @@ const focusElementInContext = (hostToFocus, fallbackElement) => {
|
|
|
104
104
|
let lastOverlayIndex = 0;
|
|
105
105
|
let lastId = 0;
|
|
106
106
|
const activeAnimations = new WeakMap();
|
|
107
|
+
const OVERLAY_FOCUS_TRAP_SELECTOR = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover';
|
|
108
|
+
const ION_SELECT_MODAL_SELECTOR = 'ion-select-modal';
|
|
109
|
+
const isSelectModalOptionControl = (el) => el.tagName === 'ION-RADIO' || el.tagName === 'ION-CHECKBOX';
|
|
107
110
|
/**
|
|
108
|
-
*
|
|
111
|
+
* Returns the currently focused element for keyboard focus checks.
|
|
112
|
+
*
|
|
113
|
+
* Starts from `document.activeElement` (non-shadow / light DOM focus).
|
|
114
|
+
* If focus is inside one or more open shadow roots
|
|
115
|
+
* (e.g. native control inside `ion-radio`), walks through nested
|
|
116
|
+
* `shadowRoot.activeElement` values until the innermost focused node is reached.
|
|
117
|
+
*/
|
|
118
|
+
const getActiveElement = (ownerDoc) => {
|
|
119
|
+
var _a;
|
|
120
|
+
let active = ownerDoc.activeElement;
|
|
121
|
+
if (!active) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
while ((_a = active.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) {
|
|
125
|
+
active = active.shadowRoot.activeElement;
|
|
126
|
+
}
|
|
127
|
+
return active;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Walks from a focused node (possibly deep inside shadow roots)
|
|
131
|
+
* up to the nearest `ion-radio` / `ion-checkbox` host.
|
|
132
|
+
*/
|
|
133
|
+
const getOptionControlHost = (active) => {
|
|
134
|
+
let n = active;
|
|
135
|
+
while (n) {
|
|
136
|
+
if (isSelectModalOptionControl(n)) {
|
|
137
|
+
return n;
|
|
138
|
+
}
|
|
139
|
+
const root = n.getRootNode();
|
|
140
|
+
if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {
|
|
141
|
+
n = root.host;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Sheet modals can have visual order that differs from DOM order.
|
|
151
|
+
* Without sorting, Tab can skip the handle after option traversal.
|
|
152
|
+
*
|
|
153
|
+
* Order: option controls (radio/checkbox) → sheet handle → end-slot
|
|
154
|
+
* header button. Any other focusables are appended after.
|
|
155
|
+
*/
|
|
156
|
+
const sortSheetModalFocusables = (overlay, elements) => {
|
|
157
|
+
const optionControls = elements.filter((el) => {
|
|
158
|
+
return overlay.contains(el) && isSelectModalOptionControl(el) && el.tabIndex >= 0;
|
|
159
|
+
});
|
|
160
|
+
const cancelControl = elements.find((el) => overlay.contains(el) &&
|
|
161
|
+
el.tagName === 'ION-BUTTON' &&
|
|
162
|
+
el.closest('ion-header ion-buttons[slot="end"]') !== null);
|
|
163
|
+
const handleControl = elements.find((el) => el.classList.contains('modal-handle'));
|
|
164
|
+
const sortByGeometry = (els) => [...els].sort((a, b) => {
|
|
165
|
+
const ra = a.getBoundingClientRect();
|
|
166
|
+
const rb = b.getBoundingClientRect();
|
|
167
|
+
const topDiff = ra.top - rb.top;
|
|
168
|
+
if (Math.abs(topDiff) > 1) {
|
|
169
|
+
return topDiff;
|
|
170
|
+
}
|
|
171
|
+
return ra.left - rb.left;
|
|
172
|
+
});
|
|
173
|
+
const ordered = [];
|
|
174
|
+
ordered.push(...sortByGeometry(optionControls));
|
|
175
|
+
if (handleControl) {
|
|
176
|
+
ordered.push(handleControl);
|
|
177
|
+
}
|
|
178
|
+
if (cancelControl) {
|
|
179
|
+
ordered.push(cancelControl);
|
|
180
|
+
}
|
|
181
|
+
const used = new Set(ordered);
|
|
182
|
+
for (const el of elements) {
|
|
183
|
+
if (!used.has(el)) {
|
|
184
|
+
ordered.push(el);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return ordered;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Option controls in groups use a tabindex pattern where only one
|
|
191
|
+
* option is tabbable (`tabIndex="0"`) while the others are `-1`.
|
|
192
|
+
* This returns the index of that current tabbable option.
|
|
193
|
+
*/
|
|
194
|
+
const getTabbableOptionControlIndex = (elements, overlay) => {
|
|
195
|
+
return elements.findIndex((el) => {
|
|
196
|
+
return overlay.contains(el) && isSelectModalOptionControl(el) && el.tabIndex >= 0;
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Determines if the overlay's backdrop is always blocking
|
|
201
|
+
* (no background interaction).
|
|
109
202
|
* Returns false if showBackdrop=false or backdropBreakpoint > 0.
|
|
110
203
|
*/
|
|
111
204
|
const isBackdropAlwaysBlocking = (el) => {
|
|
@@ -226,7 +319,7 @@ const focusElementInOverlay = (hostToFocus, overlay) => {
|
|
|
226
319
|
* Should NOT include: Toast
|
|
227
320
|
*/
|
|
228
321
|
const trapKeyboardFocus = (ev, doc) => {
|
|
229
|
-
const lastOverlay = getPresentedOverlay(doc,
|
|
322
|
+
const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
|
|
230
323
|
const target = ev.target;
|
|
231
324
|
/**
|
|
232
325
|
* If no active overlay, ignore this event.
|
|
@@ -409,6 +502,30 @@ const connectListeners = (doc) => {
|
|
|
409
502
|
doc.addEventListener('focus', (ev) => {
|
|
410
503
|
trapKeyboardFocus(ev, doc);
|
|
411
504
|
}, true);
|
|
505
|
+
/**
|
|
506
|
+
* Remember which option control last received focus
|
|
507
|
+
* (arrows, click, or Tab). This pattern keeps `tabIndex=0` on the
|
|
508
|
+
* checked/first radio, so the Tab trap uses this when wrapping back
|
|
509
|
+
* into the list or focusing the option-group slot.
|
|
510
|
+
*/
|
|
511
|
+
doc.addEventListener('focusin', (ev) => {
|
|
512
|
+
const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
|
|
513
|
+
if (!lastOverlay || lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS)) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
const isSheetModal = lastOverlay.classList.contains('modal-sheet');
|
|
517
|
+
if (!isSheetModal) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
const target = ev.target;
|
|
521
|
+
if (!(target instanceof HTMLElement)) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
const optionHost = getOptionControlHost(target);
|
|
525
|
+
if (optionHost && lastOverlay.contains(optionHost)) {
|
|
526
|
+
lastOverlay.trapLastSheetOptionControl = optionHost;
|
|
527
|
+
}
|
|
528
|
+
}, true);
|
|
412
529
|
// Listen for keydown events to intercept Tab navigation.
|
|
413
530
|
// This is needed for Safari and Firefox which may skip focusable
|
|
414
531
|
// elements or allow focus to escape the overlay.
|
|
@@ -418,10 +535,10 @@ const connectListeners = (doc) => {
|
|
|
418
535
|
var _a, _b, _c;
|
|
419
536
|
if (ev.key !== 'Tab' && ev.key !== 'Alt+Tab')
|
|
420
537
|
return;
|
|
421
|
-
const lastOverlay = getPresentedOverlay(doc,
|
|
538
|
+
const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
|
|
422
539
|
if (!lastOverlay || lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS))
|
|
423
540
|
return;
|
|
424
|
-
const activeElement = doc
|
|
541
|
+
const activeElement = getActiveElement(doc);
|
|
425
542
|
if (activeElement === lastOverlay) {
|
|
426
543
|
ev.preventDefault();
|
|
427
544
|
focusFirstDescendant(lastOverlay);
|
|
@@ -437,16 +554,32 @@ const connectListeners = (doc) => {
|
|
|
437
554
|
if (!isInsideOverlay)
|
|
438
555
|
return;
|
|
439
556
|
// Get all focusable elements from both light and shadow DOM
|
|
440
|
-
|
|
557
|
+
let allFocusable = [
|
|
441
558
|
...lastOverlay.querySelectorAll(focusableQueryString),
|
|
442
559
|
...(((_c = lastOverlay.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelectorAll(focusableQueryString)) || []),
|
|
443
560
|
];
|
|
561
|
+
const selectModalEl = lastOverlay.querySelector(ION_SELECT_MODAL_SELECTOR);
|
|
562
|
+
const isSheetModal = lastOverlay.classList.contains('modal-sheet');
|
|
563
|
+
/**
|
|
564
|
+
* Some sheet modal content, including ion-select-modal,
|
|
565
|
+
* renders option containers as `ion-item.select-interface-option`.
|
|
566
|
+
* These can match focusable selectors in some builds but
|
|
567
|
+
* are not intended tab stops. Keep only true interactive
|
|
568
|
+
* controls so Tab can move from options to header
|
|
569
|
+
* controls/handle.
|
|
570
|
+
*/
|
|
571
|
+
if (selectModalEl) {
|
|
572
|
+
allFocusable = allFocusable.filter((el) => !el.matches('ion-item.select-interface-option'));
|
|
573
|
+
}
|
|
574
|
+
if (isSheetModal) {
|
|
575
|
+
allFocusable = sortSheetModalFocusables(lastOverlay, allFocusable);
|
|
576
|
+
}
|
|
444
577
|
if (allFocusable.length === 0) {
|
|
445
578
|
ev.preventDefault();
|
|
446
579
|
return;
|
|
447
580
|
}
|
|
448
581
|
// Find current element's index (accounting for shadow DOM)
|
|
449
|
-
|
|
582
|
+
let currentIndex = activeElement
|
|
450
583
|
? allFocusable.findIndex((el) => {
|
|
451
584
|
var _a;
|
|
452
585
|
if (el === activeElement)
|
|
@@ -457,6 +590,31 @@ const connectListeners = (doc) => {
|
|
|
457
590
|
return rootNode instanceof ShadowRoot && rootNode.host === el;
|
|
458
591
|
})
|
|
459
592
|
: -1;
|
|
593
|
+
/**
|
|
594
|
+
* Radio/checkbox groups can move focus onto an option with
|
|
595
|
+
* `tabIndex=-1`, while another option still has `tabIndex=0`
|
|
596
|
+
* in the list. `findIndex` then yields -1 and Tab incorrectly
|
|
597
|
+
* wraps to `allFocusable[0]`.
|
|
598
|
+
* Treat focus on any option control inside the sheet modal
|
|
599
|
+
* as the same trap slot as the listed tabbable option
|
|
600
|
+
* (`tabIndex >= 0`) so Tab goes handle → Cancel, not back
|
|
601
|
+
* to the first radio.
|
|
602
|
+
*/
|
|
603
|
+
if (currentIndex < 0 && isSheetModal && activeElement) {
|
|
604
|
+
const optionHost = getOptionControlHost(activeElement);
|
|
605
|
+
if (optionHost && lastOverlay.contains(optionHost)) {
|
|
606
|
+
const directIndex = allFocusable.indexOf(optionHost);
|
|
607
|
+
if (directIndex >= 0) {
|
|
608
|
+
currentIndex = directIndex;
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
const tabbableOptionIndex = getTabbableOptionControlIndex(allFocusable, lastOverlay);
|
|
612
|
+
if (tabbableOptionIndex >= 0) {
|
|
613
|
+
currentIndex = tabbableOptionIndex;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
460
618
|
ev.preventDefault();
|
|
461
619
|
// Helper to focus an element, handling shadow DOM properly
|
|
462
620
|
const focusElement = (element) => {
|
|
@@ -470,24 +628,43 @@ const connectListeners = (doc) => {
|
|
|
470
628
|
}
|
|
471
629
|
helpers.focusVisibleElement(element);
|
|
472
630
|
};
|
|
631
|
+
let nextIndex;
|
|
473
632
|
if (ev.shiftKey) {
|
|
474
633
|
// Shift+Tab: previous element, wrap to last if at first
|
|
475
634
|
if (currentIndex <= 0) {
|
|
476
|
-
|
|
635
|
+
nextIndex = allFocusable.length - 1;
|
|
477
636
|
}
|
|
478
637
|
else {
|
|
479
|
-
|
|
638
|
+
nextIndex = currentIndex - 1;
|
|
480
639
|
}
|
|
481
640
|
}
|
|
482
641
|
else {
|
|
483
642
|
// Tab: next element, wrap to first if at last
|
|
484
643
|
if (currentIndex < 0 || currentIndex >= allFocusable.length - 1) {
|
|
485
|
-
|
|
644
|
+
nextIndex = 0;
|
|
486
645
|
}
|
|
487
646
|
else {
|
|
488
|
-
|
|
647
|
+
nextIndex = currentIndex + 1;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
const nextEl = allFocusable[nextIndex];
|
|
651
|
+
const overlayTrap = lastOverlay;
|
|
652
|
+
const tabbableOptionIndex = isSheetModal ? getTabbableOptionControlIndex(allFocusable, lastOverlay) : -1;
|
|
653
|
+
/**
|
|
654
|
+
* The trap list only includes one tabbable option host
|
|
655
|
+
* (`tabIndex >= 0`), usually the checked/first radio.
|
|
656
|
+
* `focusin` tracks the real last-focused option; use it
|
|
657
|
+
* whenever Tab would focus that slot (wrap from Cancel,
|
|
658
|
+
* Shift+Tab from handle, etc.).
|
|
659
|
+
*/
|
|
660
|
+
let focusTarget = nextEl;
|
|
661
|
+
if (isSheetModal && tabbableOptionIndex >= 0 && nextIndex === tabbableOptionIndex) {
|
|
662
|
+
const saved = overlayTrap.trapLastSheetOptionControl;
|
|
663
|
+
if ((saved === null || saved === void 0 ? void 0 : saved.isConnected) && lastOverlay.contains(saved) && saved !== nextEl) {
|
|
664
|
+
focusTarget = saved;
|
|
489
665
|
}
|
|
490
666
|
}
|
|
667
|
+
focusElement(focusTarget);
|
|
491
668
|
}, true);
|
|
492
669
|
// handle back-button click
|
|
493
670
|
doc.addEventListener('ionBackButton', (ev) => {
|
|
@@ -68,9 +68,33 @@
|
|
|
68
68
|
gap: var(--internal-gallery-gap, 16px);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
:host(.gallery-layout-uniform) ::slotted(*) {
|
|
72
|
+
aspect-ratio: 1/1;
|
|
73
|
+
}
|
|
74
|
+
|
|
71
75
|
:host(.gallery-layout-masonry) {
|
|
72
76
|
align-items: start;
|
|
73
77
|
column-gap: var(--internal-gallery-gap, 16px);
|
|
74
78
|
row-gap: 0;
|
|
75
79
|
grid-auto-rows: 2px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
:host(.gallery-layout-masonry) ::slotted(*) {
|
|
83
|
+
display: block;
|
|
84
|
+
min-height: unset;
|
|
85
|
+
margin-bottom: var(--internal-gallery-gap, 16px);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
::slotted(*) {
|
|
89
|
+
margin-left: 0;
|
|
90
|
+
margin-right: 0;
|
|
91
|
+
margin-top: 0;
|
|
92
|
+
margin-bottom: 0;
|
|
93
|
+
width: 100%;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
::slotted(img) {
|
|
97
|
+
display: block;
|
|
98
|
+
object-fit: cover;
|
|
99
|
+
object-position: center;
|
|
76
100
|
}
|
|
@@ -17,7 +17,6 @@ const BREAKPOINTS = {
|
|
|
17
17
|
xxl: 1400,
|
|
18
18
|
};
|
|
19
19
|
const BREAKPOINT_ORDER = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
|
|
20
|
-
const GALLERY_ITEM_SELECTOR = 'ion-gallery-item';
|
|
21
20
|
/**
|
|
22
21
|
* @virtualProp {"ios" | "md"} mode - The mode determines the platform behaviors of the component.
|
|
23
22
|
* @virtualProp {"ios" | "md" | "ionic"} theme - The theme determines the visual appearance of the component.
|
|
@@ -31,7 +30,6 @@ export class Gallery {
|
|
|
31
30
|
this.hasWarnedInvalidColumns = false;
|
|
32
31
|
this.hasWarnedInvalidGap = false;
|
|
33
32
|
this.hasWarnedUnusedOrder = false;
|
|
34
|
-
this.hasWarnedInvalidItems = false;
|
|
35
33
|
/**
|
|
36
34
|
* The visual layout of the gallery. When `uniform`, rows take up the height
|
|
37
35
|
* of the tallest item and are spaced evenly across the gallery. Additionally,
|
|
@@ -81,9 +79,8 @@ export class Gallery {
|
|
|
81
79
|
const styles = getComputedStyle(this.el);
|
|
82
80
|
const rowHeight = parseFloat(styles.getPropertyValue('grid-auto-rows')) || 0;
|
|
83
81
|
const rowGap = parseFloat(styles.getPropertyValue('row-gap')) || parseFloat(styles.getPropertyValue('gap')) || 0;
|
|
84
|
-
const itemGap = parseFloat(styles.getPropertyValue('column-gap')) || parseFloat(styles.getPropertyValue('gap')) || 0;
|
|
85
82
|
const items = this.getItems();
|
|
86
|
-
this.layoutMasonry(items, rowHeight, rowGap,
|
|
83
|
+
this.layoutMasonry(items, rowHeight, rowGap, columns);
|
|
87
84
|
};
|
|
88
85
|
}
|
|
89
86
|
onColumnsOrGapChanged() {
|
|
@@ -284,16 +281,6 @@ export class Gallery {
|
|
|
284
281
|
printIonWarning(`[ion-gallery] - "order" has no effect when "layout" is "uniform". Set "layout" to "masonry" for "order" to apply.`, this.el);
|
|
285
282
|
this.hasWarnedUnusedOrder = true;
|
|
286
283
|
}
|
|
287
|
-
/**
|
|
288
|
-
* Warn when gallery content is missing required `ion-gallery-item` components.
|
|
289
|
-
*/
|
|
290
|
-
warnInvalidItems() {
|
|
291
|
-
if (this.hasWarnedInvalidItems) {
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
printIonWarning('[ion-gallery] - Gallery items must be wrapped in "ion-gallery-item" components. Non-item direct children are ignored unless they contain nested "ion-gallery-item" elements.', this.el);
|
|
295
|
-
this.hasWarnedInvalidItems = true;
|
|
296
|
-
}
|
|
297
284
|
/**
|
|
298
285
|
* Resolve the active columns value for the current width. Falls back to
|
|
299
286
|
* the default responsive columns when the provided prop is invalid.
|
|
@@ -350,45 +337,12 @@ export class Gallery {
|
|
|
350
337
|
const gap = this.getGapForWidth(width);
|
|
351
338
|
this.el.style.setProperty('--internal-gallery-gap', `${gap}`);
|
|
352
339
|
}
|
|
353
|
-
isGalleryItemElement(element) {
|
|
354
|
-
var _a;
|
|
355
|
-
return typeof ((_a = element.style) === null || _a === void 0 ? void 0 : _a.setProperty) === 'function';
|
|
356
|
-
}
|
|
357
340
|
/**
|
|
358
|
-
* Return all gallery
|
|
359
|
-
*
|
|
360
|
-
* containers and flattened to nested `ion-gallery-item` children. Direct
|
|
361
|
-
* children without nested `ion-gallery-item` components are ignored.
|
|
341
|
+
* Return all directly slotted children of the gallery that can be grid items
|
|
342
|
+
* with inline placement styles (HTML elements and SVG elements).
|
|
362
343
|
*/
|
|
363
344
|
getItems() {
|
|
364
|
-
|
|
365
|
-
const flattenedItems = [];
|
|
366
|
-
// Expand an <ion-gallery-item> component into the actual gallery items
|
|
367
|
-
// that should be used for grid placement.
|
|
368
|
-
const pushWrappedItems = (galleryItemEl) => {
|
|
369
|
-
const galleryItems = Array.from(galleryItemEl.children).filter((child) => this.isGalleryItemElement(child));
|
|
370
|
-
flattenedItems.push(...galleryItems);
|
|
371
|
-
};
|
|
372
|
-
directChildren.forEach((directChildEl) => {
|
|
373
|
-
// Standard path: <ion-gallery-item> is a direct child of <ion-gallery>.
|
|
374
|
-
if (directChildEl.matches(GALLERY_ITEM_SELECTOR)) {
|
|
375
|
-
pushWrappedItems(directChildEl);
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
// Compatibility path: a non-gallery-item direct child (e.g. wrapper <div>)
|
|
379
|
-
// may contain nested <ion-gallery-item> components.
|
|
380
|
-
const nestedGalleryItems = Array.from(directChildEl.querySelectorAll(GALLERY_ITEM_SELECTOR)).filter((child) => this.isGalleryItemElement(child));
|
|
381
|
-
// Invalid children path: no <ion-gallery-item> components found.
|
|
382
|
-
if (nestedGalleryItems.length === 0) {
|
|
383
|
-
this.warnInvalidItems();
|
|
384
|
-
return;
|
|
385
|
-
}
|
|
386
|
-
// Flatten gallery-item containers so nested <ion-gallery-item> children can
|
|
387
|
-
// become the effective gallery items.
|
|
388
|
-
directChildEl.style.display = 'contents';
|
|
389
|
-
nestedGalleryItems.forEach((nestedGalleryItem) => pushWrappedItems(nestedGalleryItem));
|
|
390
|
-
});
|
|
391
|
-
return flattenedItems;
|
|
345
|
+
return Array.from(this.el.children).filter((child) => { var _a; return typeof ((_a = child.style) === null || _a === void 0 ? void 0 : _a.setProperty) === 'function'; });
|
|
392
346
|
}
|
|
393
347
|
/**
|
|
394
348
|
* Clear the item styles for the given item element.
|
|
@@ -445,14 +399,11 @@ export class Gallery {
|
|
|
445
399
|
/**
|
|
446
400
|
* Apply masonry placement by assigning each item a column and row span.
|
|
447
401
|
*/
|
|
448
|
-
layoutMasonry(items, rowHeight, rowGap,
|
|
402
|
+
layoutMasonry(items, rowHeight, rowGap, columns) {
|
|
449
403
|
const columnHeights = new Array(columns).fill(0);
|
|
450
404
|
const lastItemsByColumn = new Array(columns).fill(undefined);
|
|
451
405
|
items.forEach((itemEl, i) => {
|
|
452
406
|
itemEl.style.marginBottom = '';
|
|
453
|
-
if (itemEl.parentElement !== this.el) {
|
|
454
|
-
itemEl.style.marginBottom = `${itemGap}px`;
|
|
455
|
-
}
|
|
456
407
|
const span = this.calculateRowSpan(itemEl, rowHeight, rowGap);
|
|
457
408
|
if (span === undefined) {
|
|
458
409
|
this.clearItemStyles(itemEl);
|
|
@@ -501,11 +452,11 @@ export class Gallery {
|
|
|
501
452
|
const { layout } = this;
|
|
502
453
|
const order = this.getOrder();
|
|
503
454
|
const theme = getIonTheme(this);
|
|
504
|
-
return (h(Host, { key: '
|
|
455
|
+
return (h(Host, { key: '1bf2973d22835c0dbddf3214b602f8c08b95e421', class: {
|
|
505
456
|
[theme]: true,
|
|
506
457
|
[`gallery-layout-${layout}`]: true,
|
|
507
458
|
[`gallery-order-${order}`]: layout === 'masonry' && order !== undefined,
|
|
508
|
-
} }, h("slot", { key: '
|
|
459
|
+
} }, h("slot", { key: '0dea31f609f6afdb1d73ecb2d873909ffe49203f', onSlotchange: this.onSlotChange })));
|
|
509
460
|
}
|
|
510
461
|
static get is() { return "ion-gallery"; }
|
|
511
462
|
static get encapsulation() { return "shadow"; }
|
|
@@ -6,57 +6,57 @@ export const sharedStyles = `
|
|
|
6
6
|
width: 343px;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
div {
|
|
10
10
|
color: #fff;
|
|
11
11
|
height: 150px;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
div:nth-child(1) {
|
|
15
15
|
background: #ff6b6b;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
div:nth-child(2) {
|
|
19
19
|
background: #4ecdc4;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
div:nth-child(3) {
|
|
23
23
|
background: #ffe66d;
|
|
24
24
|
color: #333;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
div:nth-child(4) {
|
|
28
28
|
background: #5f27cd;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
div:nth-child(5) {
|
|
32
32
|
background: #7f8c8d;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
div:nth-child(6) {
|
|
36
36
|
background: #ff9f43;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
div:nth-child(7) {
|
|
40
40
|
background: #ff3f34;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
div:nth-child(8) {
|
|
44
44
|
background: #2ecc71;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
div:nth-child(9) {
|
|
48
48
|
background: #34495e;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
div:nth-child(10) {
|
|
52
52
|
background: #1abc9c;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
div:nth-child(11) {
|
|
56
56
|
background: #e67e22;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
div:nth-child(12) {
|
|
60
60
|
background: #9b59b6;
|
|
61
61
|
}
|
|
62
62
|
`;
|
|
@@ -16,10 +16,10 @@ export class Grid {
|
|
|
16
16
|
}
|
|
17
17
|
render() {
|
|
18
18
|
const theme = getIonTheme(this);
|
|
19
|
-
return (h(Host, { key: '
|
|
19
|
+
return (h(Host, { key: '43b4e05ef076160d901c70dc37e177f19b524349', class: {
|
|
20
20
|
[theme]: true,
|
|
21
21
|
'grid-fixed': this.fixed,
|
|
22
|
-
} }, h("slot", { key: '
|
|
22
|
+
} }, h("slot", { key: 'f3805936034708e6783223ded72c0ecfd40e5fb0' })));
|
|
23
23
|
}
|
|
24
24
|
static get is() { return "ion-grid"; }
|
|
25
25
|
static get encapsulation() { return "shadow"; }
|
|
@@ -156,7 +156,7 @@ export class Header {
|
|
|
156
156
|
const isCondensed = collapse === 'condense';
|
|
157
157
|
// banner role must be at top level, so remove role if inside a menu
|
|
158
158
|
const roleType = getRoleType(hostContext('ion-menu', this.el), isCondensed, theme);
|
|
159
|
-
return (h(Host, Object.assign({ key: '
|
|
159
|
+
return (h(Host, Object.assign({ key: 'b43e5f542bdcec5e94c299556183cf6d9d673438', role: roleType, class: {
|
|
160
160
|
[theme]: true,
|
|
161
161
|
// Used internally for styling
|
|
162
162
|
[`header-${theme}`]: true,
|
|
@@ -164,7 +164,7 @@ export class Header {
|
|
|
164
164
|
[`header-collapse-${collapse}`]: true,
|
|
165
165
|
[`header-translucent-${theme}`]: this.translucent,
|
|
166
166
|
['header-divider']: divider,
|
|
167
|
-
} }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: '
|
|
167
|
+
} }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'fd9938f02edd38e1afc83025373ec0aec5633711', class: "header-background" }), h("slot", { key: '900aaa7da5d6f08e6f94b128fa065348d595159e' })));
|
|
168
168
|
}
|
|
169
169
|
static get is() { return "ion-header"; }
|
|
170
170
|
static get originalStyleUrls() {
|
|
@@ -80,9 +80,9 @@ export class Img {
|
|
|
80
80
|
const { loadSrc, alt, onLoad, loadError, inheritedAttributes } = this;
|
|
81
81
|
const { draggable } = inheritedAttributes;
|
|
82
82
|
const theme = getIonTheme(this);
|
|
83
|
-
return (h(Host, { key: '
|
|
83
|
+
return (h(Host, { key: '91de170493b31d6260e975b440beceb6906b6d5a', class: {
|
|
84
84
|
[theme]: true,
|
|
85
|
-
} }, h("img", { key: '
|
|
85
|
+
} }, h("img", { key: 'ac1f41afbece34a3e38e656733f3e55cce385b4c', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
|
|
86
86
|
}
|
|
87
87
|
static get is() { return "ion-img"; }
|
|
88
88
|
static get encapsulation() { return "shadow"; }
|
|
@@ -264,7 +264,7 @@ export class InfiniteScroll {
|
|
|
264
264
|
render() {
|
|
265
265
|
const theme = getIonTheme(this);
|
|
266
266
|
const disabled = this.disabled;
|
|
267
|
-
return (h(Host, { key: '
|
|
267
|
+
return (h(Host, { key: '02beca21d668e4e605532ad5ca5a67a08c71eebb', class: {
|
|
268
268
|
[theme]: true,
|
|
269
269
|
'infinite-scroll-loading': this.isLoading,
|
|
270
270
|
'infinite-scroll-enabled': !disabled,
|
|
@@ -29,11 +29,11 @@ export class InfiniteScrollContent {
|
|
|
29
29
|
}
|
|
30
30
|
render() {
|
|
31
31
|
const theme = getIonTheme(this);
|
|
32
|
-
return (h(Host, { key: '
|
|
32
|
+
return (h(Host, { key: 'b51954f829eeafd5ec304b3e66e330776485ffc8', class: {
|
|
33
33
|
[theme]: true,
|
|
34
34
|
// Used internally for styling
|
|
35
35
|
[`infinite-scroll-content-${theme}`]: true,
|
|
36
|
-
} }, h("div", { key: '
|
|
36
|
+
} }, h("div", { key: '047da7f15fe38deed592dd66d1c97e12da4545bb', class: "infinite-loading" }, this.loadingSpinner && (h("div", { key: '1c05820f091052b8ee9e9ca20054495a676c21aa', class: "infinite-loading-spinner" }, h("ion-spinner", { key: 'ff801e3486f3c1a4605d2a2de9b47bd7bd536698', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
|
|
37
37
|
}
|
|
38
38
|
static get is() { return "ion-infinite-scroll-content"; }
|
|
39
39
|
static get originalStyleUrls() {
|
|
@@ -617,7 +617,7 @@ export class Input {
|
|
|
617
617
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
618
618
|
*/
|
|
619
619
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
|
|
620
|
-
return (h(Host, { key: '
|
|
620
|
+
return (h(Host, { key: 'beeeca9939e7e416783425f67d3c9e2be6bbae99', class: createColorClasses(this.color, {
|
|
621
621
|
[theme]: true,
|
|
622
622
|
'has-value': hasValue,
|
|
623
623
|
'has-focus': hasFocus,
|
|
@@ -630,7 +630,7 @@ export class Input {
|
|
|
630
630
|
'in-item-color': hostContext('ion-item.ion-color', this.el),
|
|
631
631
|
'input-disabled': disabled,
|
|
632
632
|
'input-readonly': readonly,
|
|
633
|
-
}) }, h("label", { key: '
|
|
633
|
+
}) }, h("label", { key: 'f227df52a6ad60344f16261a82c0d0566bb8cd5b', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'ae6da554ce21f805361a7704139b776a9344dcb2', class: "native-wrapper", onClick: this.onLabelClick },
|
|
634
634
|
/**
|
|
635
635
|
* For the ionic theme, we render the outline container here
|
|
636
636
|
* instead of higher up, so it can be positioned relative to
|
|
@@ -640,14 +640,14 @@ export class Input {
|
|
|
640
640
|
* <label> element, ensuring that clicking the label text
|
|
641
641
|
* focuses the input.
|
|
642
642
|
*/
|
|
643
|
-
theme === 'ionic' && h("div", { key: '
|
|
643
|
+
theme === 'ionic' && h("div", { key: '83aa5e7ad97b0c964e31966c1d2b8771d1ecfc53', class: "input-outline" }), h("slot", { key: '1931003f2b0d19508acaaffab58fee644d1f6158', name: "start" }), h("input", Object.assign({ key: '33a06efb4ce0b6e67c12e77f131effb113fba73f', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById() }, this.inheritedAttributes)), clearInput && !readonly && !disabled && (h("button", { key: 'd350f26cf6927ee089373ea8903db2479a0a404c', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
|
|
644
644
|
/**
|
|
645
645
|
* This prevents mobile browsers from
|
|
646
646
|
* blurring the input when the clear
|
|
647
647
|
* button is activated.
|
|
648
648
|
*/
|
|
649
649
|
ev.preventDefault();
|
|
650
|
-
}, onClick: this.clearTextInput }, h("ion-icon", { key: '
|
|
650
|
+
}, onClick: this.clearTextInput }, h("ion-icon", { key: '972a2d94dcf599e63aac1d73e34873a9c3d0bf94', "aria-hidden": "true", icon: inputClearIcon }))), h("slot", { key: 'fac4dcaabb02f647e46276e92e3f341557170aec', name: "end" })), shouldRenderHighlight && h("div", { key: 'a10e519d8d1f0dcd81ffc43b8e4086797476f753', class: "input-highlight" })), this.renderBottomContent()));
|
|
651
651
|
}
|
|
652
652
|
static get is() { return "ion-input"; }
|
|
653
653
|
static get encapsulation() { return "scoped"; }
|
|
@@ -680,7 +680,7 @@ export class InputOTP {
|
|
|
680
680
|
const tabbableIndex = this.getTabbableIndex();
|
|
681
681
|
const pattern = this.getPattern();
|
|
682
682
|
const hasDescription = ((_b = (_a = el.querySelector('.input-otp-description')) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) !== '';
|
|
683
|
-
return (h(Host, { key: '
|
|
683
|
+
return (h(Host, { key: '7a5c5dbb7e1880bd94d4b00e579af941366b1cb2', class: createColorClasses(color, {
|
|
684
684
|
[mode]: true,
|
|
685
685
|
'has-focus': hasFocus,
|
|
686
686
|
[`input-otp-size-${size}`]: true,
|
|
@@ -688,10 +688,10 @@ export class InputOTP {
|
|
|
688
688
|
[`input-otp-fill-${fill}`]: true,
|
|
689
689
|
'input-otp-disabled': disabled,
|
|
690
690
|
'input-otp-readonly': readonly,
|
|
691
|
-
}) }, h("div", Object.assign({ key: '
|
|
691
|
+
}) }, h("div", Object.assign({ key: 'a4427602ea1894d53e4d0f502dbb972c93a86bff', role: "group", "aria-label": "One-time password input", class: "input-otp-group", part: "group" }, inheritedAttributes), Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper", part: "container" }, h("input", { class: "native-input", part: "native", id: `${inputId}-${index}`, "aria-label": `Input ${index + 1} of ${length}`, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => (inputRefs[index] = el), onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator", part: "separator" }))))), h("div", { key: '7ee9d8dfd2e52875f1bfe3e3dea0494c18c12f4a', class: {
|
|
692
692
|
'input-otp-description': true,
|
|
693
693
|
'input-otp-description-hidden': !hasDescription,
|
|
694
|
-
}, part: "description" }, h("slot", { key: '
|
|
694
|
+
}, part: "description" }, h("slot", { key: '163c374e7ae5dbdb1dc12483161e5aca919a50d5' }))));
|
|
695
695
|
}
|
|
696
696
|
static get is() { return "ion-input-otp"; }
|
|
697
697
|
static get encapsulation() { return "shadow"; }
|