@ionic/core 8.8.9-dev.11781024903.1e4268e5 → 8.8.9-dev.11781201980.1b6e8398
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-item.d.ts +11 -0
- package/components/ion-gallery-item.js +4 -0
- 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-BFZBl0TS.js +4 -0
- package/components/{p-pvh0bjpw.js → p-BVi3gqm6.js} +1 -1
- package/components/{p-D6g8ud1e.js → p-BVk7LVs0.js} +1 -1
- package/components/{p-B9MABkWm.js → p-BdUtZxku.js} +1 -1
- package/components/{p-CzC_ZSgb.js → p-Be8tHurp.js} +1 -1
- package/components/p-C0U8YqYW.js +4 -0
- package/components/{p-C8kBejTT.js → p-CG3ZV6ON.js} +1 -1
- package/components/{p-CBS0sBAa.js → p-CaqTORfV.js} +1 -1
- package/components/{p-D2mReIu8.js → p-CkA0SI9d.js} +1 -1
- package/components/p-Cmql_g3_.js +4 -0
- package/components/p-CsakePQg.js +4 -0
- package/components/{p-CgSn4J7d.js → p-D1gEOh9B.js} +1 -1
- package/components/p-D3qBmaqi.js +4 -0
- package/components/{p-Do7NMUwR.js → p-DGn-jQpr.js} +1 -1
- package/components/p-DH4JHV73.js +4 -0
- package/components/p-DYK0qX7x.js +4 -0
- package/components/{p-Dp2x0MpA.js → p-DfV7pOtM.js} +1 -1
- package/components/{p-BhkGOA7t.js → p-F3N54OKJ.js} +1 -1
- package/components/{p-CgZLVOCc.js → p-MPREydZp.js} +1 -1
- package/components/{p-kKYBfhbe.js → p-OFfrVDLw.js} +1 -1
- package/components/p-iZO3WzZT.js +4 -0
- package/components/{p-LB-QPk3e.js → p-qclL-gNR.js} +1 -1
- package/dist/cjs/index-BJlwOs11.js +171 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/ion-action-sheet.cjs.entry.js +5 -5
- package/dist/cjs/ion-alert.cjs.entry.js +9 -25
- 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 +4 -4
- package/dist/cjs/ion-gallery-item.cjs.entry.js +60 -0
- package/dist/cjs/ion-gallery.cjs.entry.js +91 -13
- package/dist/cjs/ion-img.cjs.entry.js +2 -2
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +4 -4
- 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 +16 -15
- package/dist/cjs/ion-loading.cjs.entry.js +3 -3
- package/dist/cjs/ion-menu_3.cjs.entry.js +6 -6
- package/dist/cjs/ion-modal.cjs.entry.js +4 -4
- 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 +2 -2
- 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 +4 -4
- 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 +10 -30
- package/dist/cjs/ion-select_3.cjs.entry.js +43 -102
- 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/select-option-render-C7klBX2H.js +81 -0
- package/dist/collection/collection-manifest.json +2 -1
- package/dist/collection/components/action-sheet/action-sheet.ionic.css +506 -163
- package/dist/collection/components/action-sheet/action-sheet.ios.css +27 -288
- package/dist/collection/components/action-sheet/action-sheet.md.css +27 -228
- package/dist/collection/components/alert/alert.ionic.css +797 -416
- package/dist/collection/components/alert/alert.ios.css +40 -402
- package/dist/collection/components/alert/alert.js +4 -20
- package/dist/collection/components/alert/alert.md.css +50 -385
- package/dist/collection/components/gallery/gallery.css +1 -86
- package/dist/collection/components/gallery/gallery.js +92 -13
- package/dist/collection/components/gallery/test/utils.js +16 -16
- package/dist/collection/components/gallery-item/gallery-item.css +88 -0
- package/dist/collection/components/gallery-item/gallery-item.js +100 -0
- 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/item.ionic.css +17 -5
- package/dist/collection/components/item/item.js +3 -2
- 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 +32 -72
- package/dist/collection/components/select-modal/select-modal.ionic.css +29 -139
- package/dist/collection/components/select-modal/select-modal.ios.css +7 -379
- package/dist/collection/components/select-modal/select-modal.js +5 -25
- package/dist/collection/components/select-modal/select-modal.md.css +7 -319
- package/dist/collection/components/select-option/select-option.js +1 -39
- package/dist/collection/components/select-popover/select-popover.ionic.css +376 -129
- package/dist/collection/components/select-popover/select-popover.ios.css +69 -252
- package/dist/collection/components/select-popover/select-popover.js +6 -25
- package/dist/collection/components/select-popover/select-popover.md.css +27 -273
- 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/sanitization/index.js +14 -255
- package/dist/collection/utils/select-option-render.js +24 -59
- package/dist/docs.json +87 -69
- package/dist/esm/index-D4ugF_sT.js +168 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +5 -5
- package/dist/esm/ion-alert.entry.js +9 -25
- 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 +4 -4
- package/dist/esm/ion-gallery-item.entry.js +58 -0
- package/dist/esm/ion-gallery.entry.js +91 -13
- package/dist/esm/ion-img.entry.js +2 -2
- package/dist/esm/ion-infinite-scroll_2.entry.js +4 -4
- 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 +16 -15
- package/dist/esm/ion-loading.entry.js +3 -3
- package/dist/esm/ion-menu_3.entry.js +6 -6
- package/dist/esm/ion-modal.entry.js +4 -4
- 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 +2 -2
- 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 +4 -4
- 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 +10 -30
- package/dist/esm/ion-select_3.entry.js +43 -102
- 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/select-option-render-B2qc5ZP7.js +79 -0
- package/dist/html.html-data.json +42 -27
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-f52856cb.entry.js → p-0592c549.entry.js} +1 -1
- package/dist/ionic/{p-67c2d349.entry.js → p-0aa510cd.entry.js} +1 -1
- package/dist/ionic/{p-9ccfb733.entry.js → p-0cd5fd9d.entry.js} +1 -1
- package/dist/ionic/p-0e9d4e11.entry.js +4 -0
- package/dist/ionic/{p-497f6391.entry.js → p-11a38333.entry.js} +1 -1
- package/dist/ionic/{p-0030507d.entry.js → p-1a009a51.entry.js} +1 -1
- package/dist/ionic/{p-7186786e.entry.js → p-23e524f8.entry.js} +1 -1
- package/dist/ionic/{p-1439fecb.entry.js → p-2826761a.entry.js} +1 -1
- package/dist/ionic/{p-93315d96.entry.js → p-2c4170d8.entry.js} +1 -1
- package/dist/ionic/p-2d5a2511.entry.js +4 -0
- package/dist/ionic/{p-7f294078.entry.js → p-3706ea52.entry.js} +1 -1
- package/dist/ionic/{p-b69add0e.entry.js → p-3e376501.entry.js} +1 -1
- package/dist/ionic/{p-c684a3b6.entry.js → p-44597202.entry.js} +1 -1
- package/dist/ionic/{p-8458f1b6.entry.js → p-4a27a79a.entry.js} +1 -1
- package/dist/ionic/{p-b7235e85.entry.js → p-4f07113d.entry.js} +1 -1
- package/dist/ionic/{p-88e7f52a.entry.js → p-52b85650.entry.js} +1 -1
- package/dist/ionic/{p-199bffb3.entry.js → p-5a6e0ae1.entry.js} +1 -1
- package/dist/ionic/p-6906dca7.entry.js +4 -0
- package/dist/ionic/p-75a1ca50.entry.js +4 -0
- package/dist/ionic/{p-19a1ff9a.entry.js → p-7b09c19d.entry.js} +1 -1
- package/dist/ionic/{p-76c70824.entry.js → p-7b886782.entry.js} +1 -1
- package/dist/ionic/p-7da8b262.entry.js +4 -0
- package/dist/ionic/{p-89eab395.entry.js → p-82c05be2.entry.js} +1 -1
- package/dist/ionic/{p-b653f4c2.entry.js → p-83c0eb9b.entry.js} +1 -1
- package/dist/ionic/{p-b4fd91b8.entry.js → p-85ff1314.entry.js} +1 -1
- package/dist/ionic/p-88048796.entry.js +4 -0
- package/dist/ionic/{p-3f18dfe9.entry.js → p-8eca5ba1.entry.js} +1 -1
- package/dist/ionic/p-96f52444.entry.js +4 -0
- package/dist/ionic/p-CFjI63GE.js +4 -0
- package/dist/ionic/p-CWJdc8f_.js +4 -0
- package/dist/ionic/{p-f2f740aa.entry.js → p-a3b047e0.entry.js} +1 -1
- package/dist/ionic/{p-40d9e029.entry.js → p-a73caa5e.entry.js} +1 -1
- package/dist/ionic/{p-1ad16c09.entry.js → p-b0dfd018.entry.js} +1 -1
- package/dist/ionic/{p-a3f9be52.entry.js → p-b6130fe4.entry.js} +1 -1
- package/dist/ionic/p-c0558552.entry.js +4 -0
- package/dist/ionic/{p-084c2623.entry.js → p-c5f745b4.entry.js} +1 -1
- package/dist/ionic/{p-bc3d68ff.entry.js → p-c781241c.entry.js} +1 -1
- package/dist/ionic/p-cb154afe.entry.js +4 -0
- package/dist/ionic/{p-b847907d.entry.js → p-cde69f38.entry.js} +1 -1
- package/dist/ionic/{p-70ee89c9.entry.js → p-d6f0a698.entry.js} +1 -1
- package/dist/ionic/{p-dd2981d0.entry.js → p-d9804d04.entry.js} +1 -1
- package/dist/ionic/{p-7054a1b9.entry.js → p-e342b205.entry.js} +1 -1
- package/dist/ionic/{p-9dfbe98d.entry.js → p-e8916b04.entry.js} +1 -1
- package/dist/ionic/{p-dac1d4de.entry.js → p-f10f8f95.entry.js} +1 -1
- package/dist/types/components/gallery/gallery.d.ts +41 -8
- package/dist/types/components/gallery/test/utils.d.ts +2 -1
- package/dist/types/components/gallery-item/gallery-item.d.ts +33 -0
- package/dist/types/components/select/select-interface.d.ts +0 -8
- package/dist/types/components/select-option/select-option.d.ts +0 -32
- package/dist/types/components.d.ts +33 -18
- package/dist/types/utils/sanitization/index.d.ts +2 -54
- package/dist/types/utils/select-option-render.d.ts +0 -31
- package/hydrate/index.js +380 -645
- package/hydrate/index.mjs +380 -645
- package/package.json +1 -1
- package/components/p-BP_TU_4l.js +0 -4
- package/components/p-BqTwa6uT.js +0 -4
- package/components/p-Bxiu1dAN.js +0 -4
- package/components/p-C91NnY87.js +0 -4
- package/components/p-CODBQrPj.js +0 -4
- package/components/p-GElQZ38c.js +0 -4
- package/components/p-WdrzoonY.js +0 -4
- package/components/p-h64_gZrH.js +0 -4
- package/components/p-sehKq5RI.js +0 -4
- package/dist/cjs/index-Dm4Dm7Vg.js +0 -414
- package/dist/cjs/overlay-control-label-DnRLQR1t.js +0 -52
- package/dist/cjs/select-option-render-DQyZnlF5.js +0 -116
- package/dist/collection/utils/overlay-control-label.js +0 -47
- package/dist/esm/index-Bmyj8b0z.js +0 -409
- package/dist/esm/overlay-control-label-CODBQrPj.js +0 -49
- package/dist/esm/select-option-render-QGJ9tZHa.js +0 -114
- package/dist/ionic/p-18ed37e3.entry.js +0 -4
- package/dist/ionic/p-2049aa81.entry.js +0 -4
- package/dist/ionic/p-290778c1.entry.js +0 -4
- package/dist/ionic/p-2aa7567e.entry.js +0 -4
- package/dist/ionic/p-2e7e3da1.entry.js +0 -4
- package/dist/ionic/p-CODBQrPj.js +0 -4
- package/dist/ionic/p-CxRK9GyE.js +0 -4
- package/dist/ionic/p-NqPMS7BP.js +0 -4
- package/dist/ionic/p-c94fbdab.entry.js +0 -4
- package/dist/ionic/p-e89848b2.entry.js +0 -4
- package/dist/ionic/p-ff09d2a5.entry.js +0 -4
- package/dist/types/utils/overlay-control-label.d.ts +0 -34
|
@@ -3,22 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { printIonError } from "../logging/index";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Parses the string into a detached DOM, removes blocked tags, strips
|
|
9
|
-
* attributes outside the `allowedAttributes` list (refer `sanitizeElement`),
|
|
10
|
-
* and scrubs script-scheme URLs. Returns the sanitized HTML string.
|
|
11
|
-
*
|
|
12
|
-
* Use this when you have an HTML string from an unknown source and need to
|
|
13
|
-
* render it via `innerHTML`. Use `sanitizeDOMTree` instead when you already
|
|
14
|
-
* have a DOM tree and want to sanitize it in place without a string round
|
|
15
|
-
* trip; both apply the same attribute policy.
|
|
16
|
-
*
|
|
17
|
-
* @param untrustedString - The HTML string to sanitize. Pass an
|
|
18
|
-
* `IonicSafeString` to bypass sanitization, or `undefined` to short-circuit.
|
|
19
|
-
* @returns The sanitized HTML string, or `undefined` if the input was
|
|
20
|
-
* `undefined`. Returns `''` if sanitization fails or the input contains
|
|
21
|
-
* an inline `onload=` handler.
|
|
6
|
+
* Does a simple sanitization of all elements
|
|
7
|
+
* in an untrusted string
|
|
22
8
|
*/
|
|
23
9
|
export const sanitizeDOMString = (untrustedString) => {
|
|
24
10
|
try {
|
|
@@ -94,36 +80,6 @@ export const sanitizeDOMString = (untrustedString) => {
|
|
|
94
80
|
return '';
|
|
95
81
|
}
|
|
96
82
|
};
|
|
97
|
-
/**
|
|
98
|
-
* Sanitize an entire trusted DOM tree in place.
|
|
99
|
-
*
|
|
100
|
-
* Removes blocked tags (`script`, `iframe`, etc.) from the subtree and
|
|
101
|
-
* then sanitizes attributes on every remaining element using the same
|
|
102
|
-
* allowlist policy as `sanitizeDOMString` (refer `sanitizeElement`).
|
|
103
|
-
* Component presentational attributes (`size`, `color`, `shape`, inline
|
|
104
|
-
* SVG, `aria-*`, `data-*`) are preserved; `style`, event handlers (`on*`),
|
|
105
|
-
* form/navigation-hijack attributes, script-scheme URLs, and non-image
|
|
106
|
-
* `data:` URLs are stripped.
|
|
107
|
-
*
|
|
108
|
-
* Use this when you have a DOM tree the developer controls (e.g.
|
|
109
|
-
* cloned slot content from a component) and you need to render it
|
|
110
|
-
* elsewhere safely.
|
|
111
|
-
*
|
|
112
|
-
* @param root - The root element whose subtree will be sanitized in
|
|
113
|
-
* place. No-op when the sanitizer is disabled via `Ionic.config`.
|
|
114
|
-
*/
|
|
115
|
-
export const sanitizeDOMTree = (root) => {
|
|
116
|
-
if (!isSanitizerEnabled()) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
blockedTags.forEach((tag) => {
|
|
120
|
-
const matches = root.querySelectorAll(tag);
|
|
121
|
-
for (let i = matches.length - 1; i >= 0; i--) {
|
|
122
|
-
matches[i].remove();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
sanitizeElement(root);
|
|
126
|
-
};
|
|
127
83
|
/**
|
|
128
84
|
* Clean up current element based on allowed attributes
|
|
129
85
|
* and then recursively dig down into any child elements to
|
|
@@ -145,60 +101,29 @@ const sanitizeElement = (element) => {
|
|
|
145
101
|
element.remove();
|
|
146
102
|
return;
|
|
147
103
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Always strip `style` (CSS injection, `background:url()` beaconing, UI
|
|
150
|
-
* spoofing). It is never on the allowlist, but it is removed explicitly
|
|
151
|
-
* here because some engines (e.g. jsdom) don't enumerate the CSSOM-backed
|
|
152
|
-
* `style` attribute in `element.attributes`, which would let the loop
|
|
153
|
-
* below skip over it.
|
|
154
|
-
*/
|
|
155
|
-
element.removeAttribute('style');
|
|
156
104
|
for (let i = element.attributes.length - 1; i >= 0; i--) {
|
|
157
105
|
const attribute = element.attributes.item(i);
|
|
158
106
|
const attributeName = attribute.name;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
* Remove any attribute that is not on the allowlist. This drops event
|
|
162
|
-
* handlers (`on*`), `style`, the form/navigation-hijack attributes
|
|
163
|
-
* (`formaction`, `action`, `target`), namespaced attributes like
|
|
164
|
-
* `xlink:href`, and anything else not explicitly known to be safe.
|
|
165
|
-
*/
|
|
166
|
-
if (!isAttributeAllowed(lowerName)) {
|
|
107
|
+
// remove non-allowed attribs
|
|
108
|
+
if (!allowedAttributes.includes(attributeName.toLowerCase())) {
|
|
167
109
|
element.removeAttribute(attributeName);
|
|
168
110
|
continue;
|
|
169
111
|
}
|
|
170
112
|
// clean up any allowed attribs
|
|
171
113
|
// that attempt to do any JS funny-business
|
|
172
114
|
const attributeValue = attribute.value;
|
|
173
|
-
if (attributeValue == null) {
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
115
|
/**
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
* `java\tscript:`, are still caught. Normalizing the value also covers
|
|
181
|
-
* namespaced attributes, where the previous `element[attributeName]`
|
|
182
|
-
* property reflection returned `undefined` and let them slip through.
|
|
116
|
+
* We also need to check the property value
|
|
117
|
+
* as javascript: can allow special characters
|
|
118
|
+
* such as 	 and still be valid (i.e. java	script)
|
|
183
119
|
*/
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
if (
|
|
187
|
-
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* For URL-bearing attributes, allow `data:` URIs only for raster
|
|
192
|
-
* images. Document-bearing types (`text/html`, `image/svg+xml`,
|
|
193
|
-
* `application/*`, etc.) can carry markup or script when navigated to
|
|
194
|
-
* or rendered, so they are stripped, while safe image types are kept so
|
|
195
|
-
* inline images keep working.
|
|
196
|
-
*/
|
|
197
|
-
if (urlAttributes.includes(lowerName) &&
|
|
198
|
-
normalizedValue.startsWith('data:') &&
|
|
199
|
-
!safeDataImageUri.test(normalizedValue)) {
|
|
120
|
+
const propertyValue = element[attributeName];
|
|
121
|
+
/* eslint-disable */
|
|
122
|
+
if ((attributeValue != null && attributeValue.toLowerCase().includes('javascript:')) ||
|
|
123
|
+
(propertyValue != null && propertyValue.toLowerCase().includes('javascript:'))) {
|
|
200
124
|
element.removeAttribute(attributeName);
|
|
201
125
|
}
|
|
126
|
+
/* eslint-enable */
|
|
202
127
|
}
|
|
203
128
|
/**
|
|
204
129
|
* Sanitize any nested children
|
|
@@ -231,174 +156,8 @@ const isSanitizerEnabled = () => {
|
|
|
231
156
|
}
|
|
232
157
|
return true;
|
|
233
158
|
};
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
* survive `cloneNode`. Call this on a DOM subtree before cloning it for
|
|
237
|
-
* rendering elsewhere (e.g. cloning slotted option content into an
|
|
238
|
-
* overlay).
|
|
239
|
-
*
|
|
240
|
-
* Only sets the attribute when the property holds a non-empty string
|
|
241
|
-
* and the attribute isn't already present, so existing attributes
|
|
242
|
-
* take precedence.
|
|
243
|
-
*
|
|
244
|
-
* @param root - The root element whose subtree (and itself) will be
|
|
245
|
-
* inspected.
|
|
246
|
-
*/
|
|
247
|
-
export const reflectPropertiesToAttributes = (root) => {
|
|
248
|
-
const candidates = [];
|
|
249
|
-
if (root.tagName in elementPropsToReflect) {
|
|
250
|
-
candidates.push(root);
|
|
251
|
-
}
|
|
252
|
-
for (const tagName of Object.keys(elementPropsToReflect)) {
|
|
253
|
-
candidates.push(...Array.from(root.querySelectorAll(tagName.toLowerCase())));
|
|
254
|
-
}
|
|
255
|
-
for (const el of candidates) {
|
|
256
|
-
if (!(el.tagName in elementPropsToReflect)) {
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
const props = elementPropsToReflect[el.tagName];
|
|
260
|
-
for (const prop of props) {
|
|
261
|
-
const value = el[prop];
|
|
262
|
-
if (typeof value === 'string' && value.length > 0 && !el.hasAttribute(prop)) {
|
|
263
|
-
el.setAttribute(prop, value);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
};
|
|
268
|
-
/**
|
|
269
|
-
* Attribute names that are always safe to keep. Covers global HTML
|
|
270
|
-
* attributes, the Ionic component presentational props that cloned rich
|
|
271
|
-
* content (e.g. `ion-select-option` markup) relies on, and the inert SVG
|
|
272
|
-
* presentation attributes used by inline icons.
|
|
273
|
-
*
|
|
274
|
-
* `aria-*` and `data-*` are allowed separately by prefix (refer
|
|
275
|
-
* `allowedAttributePrefixes`) since they are inert and not worth
|
|
276
|
-
* enumerating. URL-bearing names (`href`, `src`) are allowed here, but
|
|
277
|
-
* their values are still scrubbed for script schemes in `sanitizeElement`.
|
|
278
|
-
*
|
|
279
|
-
* Notably absent: `style`, event handlers (`on*`), and the
|
|
280
|
-
* form/navigation-hijack attributes (`formaction`, `action`, `target`),
|
|
281
|
-
* which are therefore stripped.
|
|
282
|
-
*/
|
|
283
|
-
const allowedAttributes = [
|
|
284
|
-
// Global / structural
|
|
285
|
-
'class',
|
|
286
|
-
'id',
|
|
287
|
-
'slot',
|
|
288
|
-
'name',
|
|
289
|
-
'title',
|
|
290
|
-
'alt',
|
|
291
|
-
'lang',
|
|
292
|
-
'dir',
|
|
293
|
-
'role',
|
|
294
|
-
'type',
|
|
295
|
-
'value',
|
|
296
|
-
'disabled',
|
|
297
|
-
'width',
|
|
298
|
-
'height',
|
|
299
|
-
'href',
|
|
300
|
-
'src',
|
|
301
|
-
// Ionic component presentational props
|
|
302
|
-
'color',
|
|
303
|
-
'size',
|
|
304
|
-
'shape',
|
|
305
|
-
'fill',
|
|
306
|
-
'expand',
|
|
307
|
-
'mode',
|
|
308
|
-
'theme',
|
|
309
|
-
'icon',
|
|
310
|
-
'label',
|
|
311
|
-
'label-placement',
|
|
312
|
-
'justify',
|
|
313
|
-
'inset',
|
|
314
|
-
'lines',
|
|
315
|
-
'ios',
|
|
316
|
-
'md',
|
|
317
|
-
// SVG presentation attributes (compared lowercased, e.g. `viewBox`)
|
|
318
|
-
'xmlns',
|
|
319
|
-
'viewbox',
|
|
320
|
-
'preserveaspectratio',
|
|
321
|
-
'stroke',
|
|
322
|
-
'stroke-width',
|
|
323
|
-
'stroke-linecap',
|
|
324
|
-
'stroke-linejoin',
|
|
325
|
-
'stroke-opacity',
|
|
326
|
-
'stroke-dasharray',
|
|
327
|
-
'fill-rule',
|
|
328
|
-
'fill-opacity',
|
|
329
|
-
'clip-rule',
|
|
330
|
-
'd',
|
|
331
|
-
'points',
|
|
332
|
-
'cx',
|
|
333
|
-
'cy',
|
|
334
|
-
'r',
|
|
335
|
-
'rx',
|
|
336
|
-
'ry',
|
|
337
|
-
'x',
|
|
338
|
-
'y',
|
|
339
|
-
'x1',
|
|
340
|
-
'y1',
|
|
341
|
-
'x2',
|
|
342
|
-
'y2',
|
|
343
|
-
'transform',
|
|
344
|
-
'opacity',
|
|
345
|
-
];
|
|
346
|
-
/**
|
|
347
|
-
* Attribute-name prefixes that are always safe to keep. `aria-*` and
|
|
348
|
-
* `data-*` attributes cannot execute script or load resources, so they are
|
|
349
|
-
* allowed wholesale rather than enumerated by name.
|
|
350
|
-
*/
|
|
351
|
-
const allowedAttributePrefixes = ['aria-', 'data-'];
|
|
352
|
-
/**
|
|
353
|
-
* Whether an attribute name (already lowercased) is safe to keep, by exact
|
|
354
|
-
* match or by an allowed prefix.
|
|
355
|
-
*/
|
|
356
|
-
const isAttributeAllowed = (lowerName) => {
|
|
357
|
-
if (allowedAttributes.includes(lowerName)) {
|
|
358
|
-
return true;
|
|
359
|
-
}
|
|
360
|
-
return allowedAttributePrefixes.some((prefix) => lowerName.startsWith(prefix));
|
|
361
|
-
};
|
|
362
|
-
/**
|
|
363
|
-
* Matches ASCII control characters and whitespace (including the
|
|
364
|
-
* non-breaking space). Used to normalize attribute values before matching
|
|
365
|
-
* a URL scheme so entity-obfuscated payloads such as `java	script:`
|
|
366
|
-
* (decoded by the parser to `java\tscript:`) can't smuggle a scheme past
|
|
367
|
-
* the check.
|
|
368
|
-
*/
|
|
369
|
-
// eslint-disable-next-line no-control-regex -- matching control characters is the point
|
|
370
|
-
const controlCharactersAndWhitespace = /[\u0000-\u0020\u007f-\u00a0]/g;
|
|
371
|
-
/**
|
|
372
|
-
* Attributes whose values are URLs. Their values are scheme-checked in
|
|
373
|
-
* `sanitizeElement` (e.g. `data:` filtering) beyond the script-scheme scrub
|
|
374
|
-
* applied to every attribute.
|
|
375
|
-
*/
|
|
376
|
-
const urlAttributes = ['href', 'src'];
|
|
377
|
-
/**
|
|
378
|
-
* Matches a `data:` URI for a raster image type that cannot carry script.
|
|
379
|
-
* `image/svg+xml` is deliberately excluded (SVG can execute script), as are
|
|
380
|
-
* document types like `text/html` and `application/*`. The value is already
|
|
381
|
-
* lowercased and whitespace-stripped before this is tested.
|
|
382
|
-
*/
|
|
383
|
-
const safeDataImageUri = /^data:image\/(?:png|jpe?g|gif|webp|bmp|avif|x-icon|vnd\.microsoft\.icon)[;,]/;
|
|
384
|
-
/**
|
|
385
|
-
* Tags removed entirely (with their subtree) before attribute sanitization.
|
|
386
|
-
* Exported so tests can assert the set without hardcoding it.
|
|
387
|
-
*/
|
|
388
|
-
export const blockedTags = ['script', 'style', 'iframe', 'meta', 'link', 'object', 'embed', 'base'];
|
|
389
|
-
/**
|
|
390
|
-
* Properties on custom elements that frameworks (Vue, Angular) often
|
|
391
|
-
* set as DOM properties rather than attributes. `cloneNode` only copies
|
|
392
|
-
* attributes, so these values are lost when slotted content is cloned
|
|
393
|
-
* into an overlay. For each known custom element, we mirror the listed
|
|
394
|
-
* properties onto attributes so the cloned copy still has the data it
|
|
395
|
-
* needs to render.
|
|
396
|
-
*
|
|
397
|
-
* Keyed by uppercased tagName so the lookup matches `Element.tagName`.
|
|
398
|
-
*/
|
|
399
|
-
const elementPropsToReflect = {
|
|
400
|
-
'ION-ICON': ['icon', 'name', 'src', 'ios', 'md'],
|
|
401
|
-
};
|
|
159
|
+
const allowedAttributes = ['class', 'id', 'href', 'src', 'name', 'slot'];
|
|
160
|
+
const blockedTags = ['script', 'style', 'iframe', 'meta', 'link', 'object', 'embed'];
|
|
402
161
|
export class IonicSafeString {
|
|
403
162
|
constructor(value) {
|
|
404
163
|
this.value = value;
|
|
@@ -2,63 +2,19 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { h } from "@stencil/core";
|
|
5
|
-
import {
|
|
5
|
+
import { sanitizeDOMString } from "./sanitization";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Highly recommended to pre-sanitize the source DOM (see
|
|
13
|
-
* `getOptionContent` in select.tsx). This function performs pure
|
|
14
|
-
* structural conversion — no security filtering.
|
|
15
|
-
*
|
|
16
|
-
* Preserves attributes only — properties set imperatively on the source
|
|
17
|
-
* element (e.g. `input.value` after a user types) won't carry through.
|
|
18
|
-
* In practice this isn't a concern: interactive controls shouldn't
|
|
19
|
-
* appear in select-option rich content since they'd nest inside the
|
|
20
|
-
* overlay's button/radio/checkbox wrapper, which is invalid HTML and
|
|
21
|
-
* an accessibility issue.
|
|
22
|
-
*
|
|
23
|
-
* @param node - The DOM node to convert. Text nodes become strings,
|
|
24
|
-
* element nodes become VNodes, and any other node types are skipped.
|
|
25
|
-
* @param keyPrefix - String prefix used to build a stable VNode key,
|
|
26
|
-
* so Stencil's diff can preserve elements across re-renders.
|
|
27
|
-
* @param index - Position of this node among its siblings. Combined
|
|
28
|
-
* with `keyPrefix` to form the final unique key.
|
|
29
|
-
* @returns The converted VNode, a text string, or `null` if the node
|
|
30
|
-
* type isn't supported.
|
|
31
|
-
*
|
|
32
|
-
* @internal Exported only so it can be unit tested; not part of the
|
|
33
|
-
* public API.
|
|
7
|
+
* Cache that maps rendered span elements to the source HTMLElement
|
|
8
|
+
* they were cloned from. This prevents flickering when a user
|
|
9
|
+
* selects an option that has rich content, as the content will only be
|
|
10
|
+
* re-rendered if the source HTMLElement changes.
|
|
34
11
|
*/
|
|
35
|
-
|
|
36
|
-
var _a;
|
|
37
|
-
if (node.nodeType === Node.TEXT_NODE) {
|
|
38
|
-
return (_a = node.textContent) !== null && _a !== void 0 ? _a : '';
|
|
39
|
-
}
|
|
40
|
-
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
const el = node;
|
|
44
|
-
const tag = el.tagName.toLowerCase();
|
|
45
|
-
const key = `${keyPrefix}-${index}`;
|
|
46
|
-
const attrs = { key };
|
|
47
|
-
for (let i = 0; i < el.attributes.length; i++) {
|
|
48
|
-
const attr = el.attributes.item(i);
|
|
49
|
-
attrs[attr.name] = attr.value;
|
|
50
|
-
}
|
|
51
|
-
const children = Array.from(el.childNodes)
|
|
52
|
-
.map((child, i) => cloneToVNode(child, key, i))
|
|
53
|
-
.filter((c) => c !== null);
|
|
54
|
-
return h(tag, attrs, children);
|
|
55
|
-
};
|
|
12
|
+
const contentCache = new WeakMap();
|
|
56
13
|
/**
|
|
57
|
-
* Renders cloned DOM content
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* `color` survive intact.
|
|
14
|
+
* Renders cloned DOM content into an element via a ref callback.
|
|
15
|
+
* The content is only cloned when the source element changes,
|
|
16
|
+
* preventing flicker caused by destroying and recreating web
|
|
17
|
+
* components (e.g., ion-avatar) on every re-render cycle.
|
|
62
18
|
*
|
|
63
19
|
* Span elements should be used when this content renders within buttons,
|
|
64
20
|
* depending on the select interface. Buttons can only have phrasing
|
|
@@ -66,14 +22,23 @@ export const cloneToVNode = (node, keyPrefix, index) => {
|
|
|
66
22
|
*
|
|
67
23
|
* @param id - Unique identifier for generating stable virtual DOM keys.
|
|
68
24
|
* @param content - The HTMLElement container whose child nodes will be cloned.
|
|
69
|
-
* @param className - CSS class applied to the wrapper
|
|
25
|
+
* @param className - CSS class applied to the wrapper span.
|
|
70
26
|
* @param useSpan - Whether to use a span element instead of a div for the wrapper.
|
|
71
27
|
*/
|
|
72
28
|
const renderClonedContent = (id, content, className, useSpan = false) => {
|
|
73
29
|
const Tag = useSpan ? 'span' : 'div';
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
30
|
+
return (h(Tag, { class: className, key: `${className}-${id}`, ref: (el) => {
|
|
31
|
+
if (el) {
|
|
32
|
+
const cached = contentCache.get(el);
|
|
33
|
+
// Skip if this element already has clones from the same source
|
|
34
|
+
if (cached === content) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const sanitized = sanitizeDOMString(content.innerHTML);
|
|
38
|
+
el.innerHTML = sanitized !== null && sanitized !== void 0 ? sanitized : '';
|
|
39
|
+
contentCache.set(el, content);
|
|
40
|
+
}
|
|
41
|
+
} }));
|
|
77
42
|
};
|
|
78
43
|
/**
|
|
79
44
|
* Renders the label content for a select option within an overlay
|
|
@@ -107,5 +72,5 @@ export const renderOptionLabel = (option, className, useSpan = false) => {
|
|
|
107
72
|
return (h(Tag, { class: className, key: `${className}-${id}` }, labelEl));
|
|
108
73
|
}
|
|
109
74
|
// Render label with rich content (start, end, description)
|
|
110
|
-
return (h(Tag, { class:
|
|
75
|
+
return (h(Tag, { class: className, key: `${className}-${id}` }, startContent && renderClonedContent(id, startContent, 'select-option-start', useSpan), h(Tag, { class: "select-option-content", key: `${className}-content-${id}` }, labelEl, description && (h(Tag, { class: "select-option-description", key: `${className}-desc-${id}` }, description))), endContent && renderClonedContent(id, endContent, 'select-option-end', useSpan)));
|
|
111
76
|
};
|
package/dist/docs.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"timestamp": "2026-06-
|
|
2
|
+
"timestamp": "2026-06-11T18:22:18",
|
|
3
3
|
"compiler": {
|
|
4
4
|
"name": "@stencil/core",
|
|
5
5
|
"version": "4.43.0",
|
|
@@ -14240,7 +14240,7 @@
|
|
|
14240
14240
|
},
|
|
14241
14241
|
{
|
|
14242
14242
|
"name": "slot",
|
|
14243
|
-
"text": "-
|
|
14243
|
+
"text": "- One or more `ion-gallery-item` components, placed in a responsive\ngallery layout."
|
|
14244
14244
|
}
|
|
14245
14245
|
],
|
|
14246
14246
|
"usage": {},
|
|
@@ -14460,7 +14460,91 @@
|
|
|
14460
14460
|
"slots": [
|
|
14461
14461
|
{
|
|
14462
14462
|
"name": "",
|
|
14463
|
-
"docs": "
|
|
14463
|
+
"docs": "One or more `ion-gallery-item` components, placed in a responsive\ngallery layout."
|
|
14464
|
+
}
|
|
14465
|
+
],
|
|
14466
|
+
"parts": [],
|
|
14467
|
+
"states": [],
|
|
14468
|
+
"dependents": [],
|
|
14469
|
+
"dependencies": [],
|
|
14470
|
+
"dependencyGraph": {}
|
|
14471
|
+
},
|
|
14472
|
+
{
|
|
14473
|
+
"filePath": "src/components/gallery-item/gallery-item.tsx",
|
|
14474
|
+
"encapsulation": "shadow",
|
|
14475
|
+
"tag": "ion-gallery-item",
|
|
14476
|
+
"docs": "",
|
|
14477
|
+
"docsTags": [
|
|
14478
|
+
{
|
|
14479
|
+
"name": "virtualProp",
|
|
14480
|
+
"text": "{\"ios\" | \"md\"} mode - The mode determines the platform behaviors of the component."
|
|
14481
|
+
},
|
|
14482
|
+
{
|
|
14483
|
+
"name": "virtualProp",
|
|
14484
|
+
"text": "{\"ios\" | \"md\" | \"ionic\"} theme - The theme determines the visual appearance of the component."
|
|
14485
|
+
},
|
|
14486
|
+
{
|
|
14487
|
+
"name": "slot",
|
|
14488
|
+
"text": "- The content placed inside of the gallery item. This is typically an\n`img`, but can be any element (e.g. a `figure` wrapping an image and caption)."
|
|
14489
|
+
}
|
|
14490
|
+
],
|
|
14491
|
+
"usage": {},
|
|
14492
|
+
"props": [
|
|
14493
|
+
{
|
|
14494
|
+
"name": "mode",
|
|
14495
|
+
"type": "\"ios\" | \"md\"",
|
|
14496
|
+
"mutable": false,
|
|
14497
|
+
"attr": "mode",
|
|
14498
|
+
"reflectToAttr": false,
|
|
14499
|
+
"docs": "The mode determines the platform behaviors of the component.",
|
|
14500
|
+
"docsTags": [],
|
|
14501
|
+
"values": [
|
|
14502
|
+
{
|
|
14503
|
+
"value": "ios",
|
|
14504
|
+
"type": "string"
|
|
14505
|
+
},
|
|
14506
|
+
{
|
|
14507
|
+
"value": "md",
|
|
14508
|
+
"type": "string"
|
|
14509
|
+
}
|
|
14510
|
+
],
|
|
14511
|
+
"optional": true,
|
|
14512
|
+
"required": false
|
|
14513
|
+
},
|
|
14514
|
+
{
|
|
14515
|
+
"name": "theme",
|
|
14516
|
+
"type": "\"ios\" | \"md\" | \"ionic\"",
|
|
14517
|
+
"mutable": false,
|
|
14518
|
+
"attr": "theme",
|
|
14519
|
+
"reflectToAttr": false,
|
|
14520
|
+
"docs": "The theme determines the visual appearance of the component.",
|
|
14521
|
+
"docsTags": [],
|
|
14522
|
+
"values": [
|
|
14523
|
+
{
|
|
14524
|
+
"value": "ios",
|
|
14525
|
+
"type": "string"
|
|
14526
|
+
},
|
|
14527
|
+
{
|
|
14528
|
+
"value": "md",
|
|
14529
|
+
"type": "string"
|
|
14530
|
+
},
|
|
14531
|
+
{
|
|
14532
|
+
"value": "ionic",
|
|
14533
|
+
"type": "string"
|
|
14534
|
+
}
|
|
14535
|
+
],
|
|
14536
|
+
"optional": true,
|
|
14537
|
+
"required": false
|
|
14538
|
+
}
|
|
14539
|
+
],
|
|
14540
|
+
"methods": [],
|
|
14541
|
+
"events": [],
|
|
14542
|
+
"listeners": [],
|
|
14543
|
+
"styles": [],
|
|
14544
|
+
"slots": [
|
|
14545
|
+
{
|
|
14546
|
+
"name": "",
|
|
14547
|
+
"docs": "The content placed inside of the gallery item. This is typically an\n`img`, but can be any element (e.g. a `figure` wrapping an image and caption)."
|
|
14464
14548
|
}
|
|
14465
14549
|
],
|
|
14466
14550
|
"parts": [],
|
|
@@ -39693,72 +39777,6 @@
|
|
|
39693
39777
|
"getter": false,
|
|
39694
39778
|
"setter": false
|
|
39695
39779
|
},
|
|
39696
|
-
{
|
|
39697
|
-
"name": "justify",
|
|
39698
|
-
"type": "\"end\" | \"space-between\" | \"start\" | undefined",
|
|
39699
|
-
"complexType": {
|
|
39700
|
-
"original": "'start' | 'end' | 'space-between'",
|
|
39701
|
-
"resolved": "\"end\" | \"space-between\" | \"start\" | undefined",
|
|
39702
|
-
"references": {}
|
|
39703
|
-
},
|
|
39704
|
-
"mutable": false,
|
|
39705
|
-
"attr": "justify",
|
|
39706
|
-
"reflectToAttr": false,
|
|
39707
|
-
"docs": "How to pack the label and the option's selection control within a line.\n`\"start\"`: The label and radio will appear on the left in LTR and\non the right in RTL.\n`\"end\"`: The label and radio will appear on the right in LTR and\non the left in RTL.\n`\"space-between\"`: The label and radio will appear on opposite\nends of the line with space between the two elements.\n\nApplies to the `alert`, `popover`, and `modal` interfaces, but has no\nvisible effect on radio options in `popover` or `modal` on the `md`\nand `ionic` themes (the radio control is hidden there).\n\nWhen unset, the interface picks a default based on theme and control\ntype.",
|
|
39708
|
-
"docsTags": [],
|
|
39709
|
-
"values": [
|
|
39710
|
-
{
|
|
39711
|
-
"value": "end",
|
|
39712
|
-
"type": "string"
|
|
39713
|
-
},
|
|
39714
|
-
{
|
|
39715
|
-
"value": "space-between",
|
|
39716
|
-
"type": "string"
|
|
39717
|
-
},
|
|
39718
|
-
{
|
|
39719
|
-
"value": "start",
|
|
39720
|
-
"type": "string"
|
|
39721
|
-
},
|
|
39722
|
-
{
|
|
39723
|
-
"type": "undefined"
|
|
39724
|
-
}
|
|
39725
|
-
],
|
|
39726
|
-
"optional": true,
|
|
39727
|
-
"required": false,
|
|
39728
|
-
"getter": false,
|
|
39729
|
-
"setter": false
|
|
39730
|
-
},
|
|
39731
|
-
{
|
|
39732
|
-
"name": "labelPlacement",
|
|
39733
|
-
"type": "\"end\" | \"start\" | undefined",
|
|
39734
|
-
"complexType": {
|
|
39735
|
-
"original": "'start' | 'end'",
|
|
39736
|
-
"resolved": "\"end\" | \"start\" | undefined",
|
|
39737
|
-
"references": {}
|
|
39738
|
-
},
|
|
39739
|
-
"mutable": false,
|
|
39740
|
-
"attr": "label-placement",
|
|
39741
|
-
"reflectToAttr": false,
|
|
39742
|
-
"docs": "Where the label is placed relative to the option's selection control\n(radio circle or checkbox box) when the option is rendered in an\n`alert`, `popover`, or `modal` interface.\n`\"start\"`: The label will appear to the left of the radio in LTR and to the right in RTL.\n`\"end\"`: The label will appear to the right of the radio in LTR and to the left in RTL.\n\nApplies to the `alert`, `popover`, and `modal` interfaces, but has no\nvisible effect on radio options in `popover` or `modal` on the `md`\nand `ionic` themes (the radio control is hidden there).\n\nWhen unset, the interface picks a default based on theme and control\ntype.",
|
|
39743
|
-
"docsTags": [],
|
|
39744
|
-
"values": [
|
|
39745
|
-
{
|
|
39746
|
-
"value": "end",
|
|
39747
|
-
"type": "string"
|
|
39748
|
-
},
|
|
39749
|
-
{
|
|
39750
|
-
"value": "start",
|
|
39751
|
-
"type": "string"
|
|
39752
|
-
},
|
|
39753
|
-
{
|
|
39754
|
-
"type": "undefined"
|
|
39755
|
-
}
|
|
39756
|
-
],
|
|
39757
|
-
"optional": true,
|
|
39758
|
-
"required": false,
|
|
39759
|
-
"getter": false,
|
|
39760
|
-
"setter": false
|
|
39761
|
-
},
|
|
39762
39780
|
{
|
|
39763
39781
|
"name": "mode",
|
|
39764
39782
|
"type": "\"ios\" | \"md\"",
|