@ionic/core 7.5.7-dev.11701270755.14f050ad → 7.5.7-dev.11701273756.1eb73d4c
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/animation.js +12 -11
- package/components/backdrop.js +12 -0
- package/components/checkbox.js +2 -0
- package/components/data.js +1 -1
- package/components/gesture-controller.js +1 -1
- package/components/index4.js +10 -12
- package/components/index5.js +0 -22
- package/components/input-shims.js +12 -7
- package/components/input.utils.js +3 -2
- package/components/ion-content.js +1 -1
- package/components/ion-datetime.js +61 -28
- package/components/ion-input.js +31 -8
- package/components/ion-modal.js +2 -2
- package/components/ion-picker-column-internal.d.ts +11 -0
- package/components/ion-picker-column-internal.js +9 -0
- package/components/ion-picker-column.js +2 -2
- package/components/{ion-picker-legacy.d.ts → ion-picker-internal.d.ts} +4 -4
- package/components/ion-picker-internal.js +9 -0
- package/components/ion-picker.js +299 -1
- package/components/ion-range.js +2 -0
- package/components/ion-select.js +44 -29
- package/components/ion-skeleton-text.js +14 -1
- package/components/ion-textarea.js +30 -7
- package/components/ion-toast.js +419 -74
- package/components/ion-toggle.js +2 -0
- package/components/item.js +2 -2
- package/components/label.js +2 -2
- package/components/overlays.js +6 -12
- package/components/picker-column-internal.js +390 -0
- package/components/picker-column.js +320 -331
- package/components/{picker.js → picker-internal.js} +16 -16
- package/components/radio-group.js +2 -0
- package/components/radio.js +42 -2
- package/dist/cjs/{animation-1083855c.js → animation-d101aa7a.js} +13 -12
- package/dist/cjs/{button-active-cd07b55b.js → button-active-ba107e4e.js} +2 -2
- package/dist/cjs/{capacitor-2ffba62a.js → capacitor-f68447d3.js} +1 -1
- package/dist/cjs/compare-with-utils-c0444525.js +44 -0
- package/dist/cjs/{data-4845b494.js → data-c8d21093.js} +1 -1
- package/dist/cjs/{gesture-controller-d6a3f907.js → gesture-controller-b46721be.js} +0 -1
- package/dist/cjs/{haptic-678abc9f.js → haptic-a74c2767.js} +1 -1
- package/dist/cjs/{index-0f8b33f8.js → index-0ee995e4.js} +1 -1
- package/dist/cjs/{index-d7561763.js → index-4f0c67e1.js} +11 -13
- package/dist/cjs/{index-573877f3.js → index-56d41f51.js} +2 -2
- package/dist/cjs/index-c8d52405.js +10 -0
- package/dist/cjs/{index-9f379eaa.js → index-e9634bc9.js} +1 -1
- package/dist/cjs/index.cjs.js +10 -10
- package/dist/cjs/{input-shims-b0a75a01.js → input-shims-3e3f35b9.js} +15 -10
- package/dist/cjs/{input.utils-0fe3097c.js → input.utils-bdb6953c.js} +4 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
- package/dist/cjs/ion-alert.cjs.entry.js +8 -8
- package/dist/cjs/ion-app_8.cjs.entry.js +10 -10
- package/dist/cjs/ion-backdrop.cjs.entry.js +12 -0
- package/dist/cjs/ion-checkbox.cjs.entry.js +2 -0
- package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
- package/dist/cjs/ion-datetime_3.cjs.entry.js +43 -30
- package/dist/cjs/ion-input.cjs.entry.js +34 -11
- package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
- package/dist/cjs/ion-loading.cjs.entry.js +3 -4
- package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
- package/dist/cjs/ion-modal.cjs.entry.js +10 -10
- package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
- package/dist/cjs/{ion-picker-column.cjs.entry.js → ion-picker-column-internal.cjs.entry.js} +12 -12
- package/dist/cjs/{ion-picker.cjs.entry.js → ion-picker-internal.cjs.entry.js} +13 -13
- package/dist/cjs/ion-popover.cjs.entry.js +4 -5
- package/dist/cjs/ion-radio_2.cjs.entry.js +6 -1
- package/dist/cjs/ion-range.cjs.entry.js +3 -1
- package/dist/cjs/ion-refresher_2.cjs.entry.js +7 -7
- package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
- package/dist/cjs/ion-select_3.cjs.entry.js +51 -36
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
- package/dist/cjs/ion-toast.cjs.entry.js +434 -93
- package/dist/cjs/ion-toggle.cjs.entry.js +6 -4
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/{ios.transition-ac909bc8.js → ios.transition-f4caf640.js} +3 -3
- package/dist/cjs/{keyboard-fd7db491.js → keyboard-43df0428.js} +1 -1
- package/dist/cjs/{keyboard-38f2bb7b.js → keyboard-840107b3.js} +3 -3
- package/dist/cjs/{keyboard-controller-50beb83a.js → keyboard-controller-019f42df.js} +2 -2
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{md.transition-907af519.js → md.transition-33331e93.js} +3 -3
- package/dist/cjs/{notch-controller-f4f6af5d.js → notch-controller-c22d1344.js} +1 -1
- package/dist/cjs/{overlays-dbb71984.js → overlays-4d8897dc.js} +7 -12
- package/dist/cjs/{swipe-back-a6dc6e5d.js → swipe-back-d0412fb6.js} +2 -2
- package/dist/collection/collection-manifest.json +6 -7
- package/dist/collection/components/backdrop/backdrop.js +12 -0
- package/dist/collection/components/checkbox/checkbox.js +2 -0
- package/dist/collection/components/content/content.css +4 -0
- package/dist/collection/components/datetime/datetime.ios.css +26 -84
- package/dist/collection/components/datetime/datetime.js +29 -14
- package/dist/collection/components/datetime/datetime.md.css +26 -89
- package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/a11y/datetime.spec.js +9 -6
- package/dist/collection/components/datetime/test/basic/datetime.e2e.js +0 -10
- package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
- package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +5 -5
- package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/values/datetime.e2e.js +5 -5
- package/dist/collection/components/datetime/utils/data.js +1 -1
- package/dist/collection/components/input/input.ios.css +10 -3
- package/dist/collection/components/input/input.js +31 -6
- package/dist/collection/components/input/input.md.css +13 -12
- package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
- package/dist/collection/components/item/item.ios.css +25 -3
- package/dist/collection/components/item/item.md.css +25 -3
- package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
- package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
- package/dist/collection/components/label/label.ios.css +14 -3
- package/dist/collection/components/label/label.md.css +14 -3
- package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
- package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
- package/dist/collection/components/picker/picker.ios.css +205 -100
- package/dist/collection/components/picker/picker.js +735 -463
- package/dist/collection/components/picker/picker.md.css +194 -98
- package/dist/collection/components/picker/test/basic/picker.e2e.js +13 -106
- package/dist/collection/components/{picker-legacy → picker}/test/is-open/picker.e2e.js +4 -4
- package/dist/collection/components/{picker-legacy → picker}/test/picker-id.spec.js +5 -5
- package/dist/collection/components/{picker-legacy → picker}/test/trigger/picker.e2e.js +1 -1
- package/dist/collection/components/picker-column/picker-column.ios.css +176 -59
- package/dist/collection/components/picker-column/picker-column.js +333 -478
- package/dist/collection/components/picker-column/picker-column.md.css +113 -63
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-aria.spec.js +3 -3
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-dynamic.spec.js +2 -2
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column.spec.js +2 -2
- package/dist/collection/components/{picker-legacy-column → picker-column}/test/standalone/picker-column.e2e.js +3 -3
- package/dist/collection/components/picker-column-internal/picker-column-internal.ios.css +138 -0
- package/dist/collection/components/picker-column-internal/picker-column-internal.js +565 -0
- package/dist/collection/components/{picker-legacy-column/picker-column.md.css → picker-column-internal/picker-column-internal.md.css} +63 -113
- package/dist/collection/components/{picker-column/test/basic/picker-column.e2e.js → picker-column-internal/test/basic/picker-column-internal.e2e.js} +7 -7
- package/dist/collection/components/{picker-column/test/disabled/picker-column.e2e.js → picker-column-internal/test/disabled/picker-column-internal.e2e.js} +39 -39
- package/dist/collection/components/{picker-legacy/picker.md.css → picker-internal/picker-internal.ios.css} +100 -192
- package/dist/collection/components/picker-internal/picker-internal.js +544 -0
- package/dist/collection/components/{picker-legacy-column/picker-column.ios.css → picker-internal/picker-internal.md.css} +101 -98
- package/dist/collection/components/{picker/test/a11y/picker.e2e.js → picker-internal/test/a11y/picker-internal.e2e.js} +2 -2
- package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +118 -0
- package/dist/collection/components/{picker/test/keyboard-entry/picker.e2e.js → picker-internal/test/keyboard-entry/picker-internal.e2e.js} +20 -20
- package/dist/collection/components/radio/radio.js +5 -2
- package/dist/collection/components/radio-group/radio-group.js +24 -0
- package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
- package/dist/collection/components/range/range.js +2 -0
- package/dist/collection/components/select/select.ios.css +61 -7
- package/dist/collection/components/select/select.js +45 -28
- package/dist/collection/components/select/select.md.css +64 -19
- package/dist/collection/components/select/test/label/select.e2e.js +1 -1
- package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
- package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
- package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
- package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
- package/dist/collection/components/textarea/textarea.ios.css +37 -5
- package/dist/collection/components/textarea/textarea.js +30 -5
- package/dist/collection/components/textarea/textarea.md.css +47 -14
- package/dist/collection/components/toast/animations/ios.enter.js +2 -1
- package/dist/collection/components/toast/animations/md.enter.js +4 -3
- package/dist/collection/components/toast/animations/utils.js +20 -14
- package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
- package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
- package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
- package/dist/collection/components/toast/test/toast.spec.js +80 -0
- package/dist/collection/components/toast/toast.ios.css +10 -10
- package/dist/collection/components/toast/toast.js +104 -1
- package/dist/collection/components/toast/toast.md.css +10 -0
- package/dist/collection/components/toggle/toggle.js +2 -0
- package/dist/collection/utils/animation/animation.js +12 -11
- package/dist/collection/utils/animation/test/animation.spec.js +16 -0
- package/dist/collection/utils/browser/index.js +0 -22
- package/dist/collection/utils/forms/compare-with-utils.js +39 -0
- package/dist/collection/utils/forms/index.js +1 -0
- package/dist/collection/utils/gesture/gesture-controller.js +1 -1
- package/dist/collection/utils/input-shims/input-shims.js +12 -6
- package/dist/collection/utils/menu-controller/index.js +10 -12
- package/dist/collection/utils/overlays.js +5 -11
- package/dist/collection/utils/slot-mutation-controller.js +3 -2
- package/dist/docs.json +166 -385
- package/dist/esm/{animation-8aa13916.js → animation-cf3dd234.js} +13 -12
- package/dist/esm/{button-active-5b0516e7.js → button-active-47196c40.js} +2 -2
- package/dist/esm/{capacitor-b4979570.js → capacitor-f1f25364.js} +1 -1
- package/dist/esm/compare-with-utils-4928c09d.js +41 -0
- package/dist/esm/{data-12e24f00.js → data-44d9e816.js} +1 -1
- package/dist/esm/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
- package/dist/esm/{haptic-1243b917.js → haptic-1a66d69f.js} +1 -1
- package/dist/esm/{index-0aa6e61f.js → index-23c05a55.js} +11 -13
- package/dist/esm/{index-6a0ccabb.js → index-702b3cd3.js} +2 -2
- package/dist/esm/index-a5d50daf.js +7 -0
- package/dist/esm/{index-f0cc4e14.js → index-c9e82353.js} +1 -1
- package/dist/esm/{index-32cbee52.js → index-ff313b19.js} +2 -2
- package/dist/esm/index.js +10 -10
- package/dist/esm/{input-shims-d0c93e5d.js → input-shims-1d767845.js} +14 -9
- package/dist/esm/{input.utils-ec063df4.js → input.utils-2cf5e372.js} +4 -3
- package/dist/esm/ion-action-sheet.entry.js +8 -8
- package/dist/esm/ion-alert.entry.js +8 -8
- package/dist/esm/ion-app_8.entry.js +10 -10
- package/dist/esm/ion-backdrop.entry.js +12 -0
- package/dist/esm/ion-checkbox.entry.js +2 -0
- package/dist/esm/ion-datetime-button.entry.js +1 -1
- package/dist/esm/ion-datetime_3.entry.js +42 -29
- package/dist/esm/ion-input.entry.js +34 -11
- package/dist/esm/ion-item-option_3.entry.js +1 -1
- package/dist/esm/ion-item_8.entry.js +17 -4
- package/dist/esm/ion-loading.entry.js +3 -4
- package/dist/esm/ion-menu_3.entry.js +7 -7
- package/dist/esm/ion-modal.entry.js +10 -10
- package/dist/esm/ion-nav_2.entry.js +2 -2
- package/dist/esm/{ion-picker-column.entry.js → ion-picker-column-internal.entry.js} +12 -12
- package/dist/esm/{ion-picker.entry.js → ion-picker-internal.entry.js} +13 -13
- package/dist/esm/ion-popover.entry.js +4 -5
- package/dist/esm/ion-radio_2.entry.js +6 -1
- package/dist/esm/ion-range.entry.js +3 -1
- package/dist/esm/ion-refresher_2.entry.js +7 -7
- package/dist/esm/ion-reorder_2.entry.js +4 -4
- package/dist/esm/ion-segment_2.entry.js +1 -1
- package/dist/esm/ion-select_3.entry.js +47 -32
- package/dist/esm/ion-tab-bar_2.entry.js +4 -4
- package/dist/esm/ion-textarea.entry.js +33 -10
- package/dist/esm/ion-toast.entry.js +417 -76
- package/dist/esm/ion-toggle.entry.js +6 -4
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/{ios.transition-1651c430.js → ios.transition-c3e77862.js} +3 -3
- package/dist/esm/{keyboard-b551279d.js → keyboard-9f771a04.js} +3 -3
- package/dist/esm/{keyboard-b063f012.js → keyboard-b6230bfb.js} +1 -1
- package/dist/esm/{keyboard-controller-0c2dce71.js → keyboard-controller-3f0faa10.js} +2 -2
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{md.transition-66f18369.js → md.transition-1173eca9.js} +3 -3
- package/dist/esm/{notch-controller-8c9c0e54.js → notch-controller-3f79197e.js} +1 -1
- package/dist/esm/{overlays-789cd7a7.js → overlays-34169295.js} +7 -13
- package/dist/esm/{swipe-back-cc4c2bcb.js → swipe-back-0f3bfc8e.js} +2 -2
- package/dist/esm-es5/{animation-8aa13916.js → animation-cf3dd234.js} +1 -1
- package/dist/esm-es5/{button-active-5b0516e7.js → button-active-47196c40.js} +1 -1
- package/dist/esm-es5/{capacitor-b4979570.js → capacitor-f1f25364.js} +1 -1
- package/dist/esm-es5/compare-with-utils-4928c09d.js +4 -0
- package/dist/esm-es5/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
- package/dist/esm-es5/{haptic-1243b917.js → haptic-1a66d69f.js} +1 -1
- package/dist/esm-es5/index-23c05a55.js +4 -0
- package/dist/esm-es5/{index-6a0ccabb.js → index-702b3cd3.js} +1 -1
- package/dist/esm-es5/index-c9e82353.js +4 -0
- package/dist/esm-es5/{index-32cbee52.js → index-ff313b19.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/input-shims-1d767845.js +4 -0
- package/dist/esm-es5/input.utils-2cf5e372.js +4 -0
- package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
- package/dist/esm-es5/ion-alert.entry.js +1 -1
- package/dist/esm-es5/ion-app_8.entry.js +1 -1
- package/dist/esm-es5/ion-backdrop.entry.js +1 -1
- package/dist/esm-es5/ion-checkbox.entry.js +1 -1
- package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
- package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
- package/dist/esm-es5/ion-input.entry.js +1 -1
- package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
- package/dist/esm-es5/ion-item_8.entry.js +1 -1
- package/dist/esm-es5/ion-loading.entry.js +1 -1
- package/dist/esm-es5/ion-menu_3.entry.js +1 -1
- package/dist/esm-es5/ion-modal.entry.js +1 -1
- package/dist/esm-es5/ion-nav_2.entry.js +1 -1
- package/dist/esm-es5/ion-picker-column-internal.entry.js +4 -0
- package/dist/esm-es5/ion-picker-internal.entry.js +4 -0
- package/dist/esm-es5/ion-popover.entry.js +1 -1
- package/dist/esm-es5/ion-radio_2.entry.js +1 -1
- package/dist/esm-es5/ion-range.entry.js +1 -1
- package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
- package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
- package/dist/esm-es5/ion-segment_2.entry.js +1 -1
- package/dist/esm-es5/ion-select_3.entry.js +1 -1
- package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
- package/dist/esm-es5/ion-textarea.entry.js +1 -1
- package/dist/esm-es5/ion-toast.entry.js +1 -1
- package/dist/esm-es5/ion-toggle.entry.js +1 -1
- package/dist/esm-es5/ionic.js +1 -1
- package/dist/esm-es5/{ios.transition-1651c430.js → ios.transition-c3e77862.js} +1 -1
- package/dist/esm-es5/{keyboard-b551279d.js → keyboard-9f771a04.js} +1 -1
- package/dist/esm-es5/{keyboard-b063f012.js → keyboard-b6230bfb.js} +1 -1
- package/dist/esm-es5/{keyboard-controller-0c2dce71.js → keyboard-controller-3f0faa10.js} +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/md.transition-1173eca9.js +4 -0
- package/dist/esm-es5/{notch-controller-8c9c0e54.js → notch-controller-3f79197e.js} +1 -1
- package/dist/esm-es5/overlays-34169295.js +4 -0
- package/dist/esm-es5/swipe-back-0f3bfc8e.js +4 -0
- package/dist/html.html-data.json +15 -120
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-02d8fdba.system.entry.js → p-03ed6107.system.entry.js} +1 -1
- package/dist/ionic/p-0547e914.entry.js +4 -0
- package/dist/ionic/{p-81c818e7.js → p-11cb4e19.js} +1 -1
- package/dist/ionic/p-131761b4.entry.js +4 -0
- package/dist/ionic/p-196f2123.system.entry.js +4 -0
- package/dist/ionic/{p-64ed03a3.entry.js → p-1abc74d9.entry.js} +1 -1
- package/dist/ionic/p-1cf5e8d6.entry.js +4 -0
- package/dist/ionic/{p-c4042875.system.js → p-21b4981c.system.js} +1 -1
- package/dist/ionic/p-2207f3c2.js +4 -0
- package/dist/ionic/p-27eb8a91.system.entry.js +4 -0
- package/dist/ionic/p-2a41d4d1.js +4 -0
- package/dist/ionic/p-31189dae.entry.js +4 -0
- package/dist/ionic/p-314c4dee.js +4 -0
- package/dist/ionic/{p-4f3e2767.system.entry.js → p-37c69d34.system.entry.js} +1 -1
- package/dist/ionic/p-385c51f8.system.entry.js +4 -0
- package/dist/ionic/{p-477a182e.entry.js → p-3abf5b7a.entry.js} +1 -1
- package/dist/ionic/p-3bc3d880.system.js +4 -0
- package/dist/ionic/{p-56224549.entry.js → p-3de79805.entry.js} +1 -1
- package/dist/ionic/{p-9e6bf9ed.entry.js → p-3e655d4c.entry.js} +1 -1
- package/dist/ionic/p-40903d34.system.js +1 -1
- package/dist/ionic/p-43716898.js +4 -0
- package/dist/ionic/p-450a26bf.js +4 -0
- package/dist/ionic/p-485668f0.entry.js +4 -0
- package/dist/ionic/p-48c59094.system.entry.js +4 -0
- package/dist/ionic/p-494e75ad.js +4 -0
- package/dist/ionic/{p-cb62e3fc.system.entry.js → p-4c80afe1.system.entry.js} +1 -1
- package/dist/ionic/{p-0e23256e.system.entry.js → p-54824705.system.entry.js} +1 -1
- package/dist/ionic/p-561cc050.system.js +4 -0
- package/dist/ionic/{p-4a142496.system.entry.js → p-587afb80.system.entry.js} +1 -1
- package/dist/ionic/{p-8cf94fc1.js → p-5885e9af.js} +1 -1
- package/dist/ionic/p-5bd4e009.entry.js +4 -0
- package/dist/ionic/{p-b3e79338.system.entry.js → p-5e6bc319.system.entry.js} +1 -1
- package/dist/ionic/{p-939d903b.entry.js → p-64ab3eb3.entry.js} +1 -1
- package/dist/ionic/p-671dbd61.js +4 -0
- package/dist/ionic/{p-702d85d8.system.js → p-67951604.system.js} +1 -1
- package/dist/ionic/{p-835e0346.entry.js → p-6797887a.entry.js} +1 -1
- package/dist/ionic/{p-b923f3d7.js → p-6a309574.js} +1 -1
- package/dist/ionic/{p-a4cda7a8.system.entry.js → p-6e23777e.system.entry.js} +1 -1
- package/dist/ionic/{p-06e6d235.system.entry.js → p-7047a40c.system.entry.js} +2 -2
- package/dist/ionic/p-70dcf429.js +4 -0
- package/dist/ionic/p-710cea83.system.js +4 -0
- package/dist/ionic/p-7b44e419.js +4 -0
- package/dist/ionic/p-80a9b397.entry.js +4 -0
- package/dist/ionic/{p-9b5301cc.system.entry.js → p-823890d5.system.entry.js} +1 -1
- package/dist/ionic/{p-a57f223c.system.js → p-83a455fd.system.js} +1 -1
- package/dist/ionic/{p-baa7cb1e.entry.js → p-8ad82eb3.entry.js} +1 -1
- package/dist/ionic/{p-c1229981.entry.js → p-8b15ca22.entry.js} +1 -1
- package/dist/ionic/{p-a7e2ac5c.js → p-8b1be026.js} +1 -1
- package/dist/ionic/p-8dbdb163.system.js +4 -0
- package/dist/ionic/p-8ddfecbf.entry.js +4 -0
- package/dist/ionic/{p-b4b4bb29.system.js → p-9292fd42.system.js} +1 -1
- package/dist/ionic/{p-41477ad9.system.js → p-958f1c70.system.js} +1 -1
- package/dist/ionic/{p-5ce11143.entry.js → p-965677f1.entry.js} +1 -1
- package/dist/ionic/p-9c6787e2.entry.js +4 -0
- package/dist/ionic/{p-6500b298.system.js → p-9e852ff1.system.js} +1 -1
- package/dist/ionic/p-a11c1aff.system.entry.js +4 -0
- package/dist/ionic/{p-419eb426.js → p-a135e3ba.js} +1 -1
- package/dist/ionic/p-a31099a4.entry.js +4 -0
- package/dist/ionic/p-a6bc00ab.entry.js +4 -0
- package/dist/ionic/p-a9c3699b.system.entry.js +4 -0
- package/dist/ionic/p-ac668fb8.entry.js +4 -0
- package/dist/ionic/p-ad4b4f73.system.entry.js +4 -0
- package/dist/ionic/{p-ab4cff27.system.js → p-aec8a70a.system.js} +1 -1
- package/dist/ionic/p-b673ee9b.entry.js +4 -0
- package/dist/ionic/p-be0f6600.system.js +4 -0
- package/dist/ionic/p-beb64be7.system.entry.js +4 -0
- package/dist/ionic/{p-dd837fa8.entry.js → p-c1e725db.entry.js} +1 -1
- package/dist/ionic/p-c2db1374.system.js +4 -0
- package/dist/ionic/p-c3547c7a.system.js +4 -0
- package/dist/ionic/{p-c7fd81ba.system.js → p-c4de53af.system.js} +1 -1
- package/dist/ionic/p-c700acef.system.js +4 -0
- package/dist/ionic/p-c919498d.entry.js +4 -0
- package/dist/ionic/{p-3f88eab8.system.entry.js → p-cc615985.system.entry.js} +1 -1
- package/dist/ionic/p-d48872b1.system.js +4 -0
- package/dist/ionic/p-d4fba36b.system.entry.js +4 -0
- package/dist/ionic/{p-22813b28.system.entry.js → p-d61a2cee.system.entry.js} +1 -1
- package/dist/ionic/{p-c31fc05f.system.entry.js → p-db5043df.system.entry.js} +1 -1
- package/dist/ionic/{p-100ef961.js → p-e0b06b65.js} +1 -1
- package/dist/ionic/p-e5b8f2f7.js +4 -0
- package/dist/ionic/{p-3bad5c1a.js → p-e5fd9f10.js} +1 -1
- package/dist/ionic/{p-302091ab.js → p-e627ed84.js} +1 -1
- package/dist/ionic/{p-ccdcb022.system.js → p-e7d20dfb.system.js} +1 -1
- package/dist/ionic/{p-14b4348c.system.js → p-e9e5755c.system.js} +1 -1
- package/dist/ionic/p-ea9addc8.system.entry.js +4 -0
- package/dist/ionic/p-edd07654.system.entry.js +4 -0
- package/dist/ionic/p-f36112b4.entry.js +4 -0
- package/dist/ionic/p-f43f4102.entry.js +4 -0
- package/dist/ionic/p-f5d78105.entry.js +4 -0
- package/dist/ionic/p-f7769c83.js +4 -0
- package/dist/ionic/{p-bba2ce59.system.js → p-f9a641fa.system.js} +1 -1
- package/dist/ionic/{p-2e1794df.system.js → p-fa8d4788.system.js} +1 -1
- package/dist/ionic/p-fcb148dc.system.entry.js +4 -0
- package/dist/ionic/p-fcc23f25.system.entry.js +4 -0
- package/dist/ionic/{p-878c7aa5.system.entry.js → p-fce6b76a.system.entry.js} +1 -1
- package/dist/ionic/p-fdcf04c3.system.entry.js +4 -0
- package/dist/ionic/{p-a0b6d438.js → p-fe1f93f2.js} +1 -1
- package/dist/types/components/backdrop/backdrop.d.ts +3 -0
- package/dist/types/components/datetime/datetime.d.ts +1 -0
- package/dist/types/components/datetime/utils/data.d.ts +2 -2
- package/dist/types/components/input/input.d.ts +2 -0
- package/dist/types/components/menu/menu.d.ts +1 -1
- package/dist/types/components/picker/picker.d.ts +131 -74
- package/dist/types/components/picker-column/picker-column.d.ts +39 -94
- package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +102 -0
- package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
- package/dist/types/components/picker-internal/picker-internal.d.ts +102 -0
- package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
- package/dist/types/components/radio-group/radio-group.d.ts +8 -1
- package/dist/types/components/router/router.d.ts +2 -1
- package/dist/types/components/select/select.d.ts +6 -1
- package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
- package/dist/types/components/textarea/textarea.d.ts +2 -0
- package/dist/types/components/toast/animations/utils.d.ts +15 -4
- package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
- package/dist/types/components/toast/toast-interface.d.ts +2 -0
- package/dist/types/components/toast/toast.d.ts +28 -1
- package/dist/types/components.d.ts +159 -157
- package/dist/types/interface.d.ts +2 -6
- package/dist/types/utils/animation/animation-interface.d.ts +4 -4
- package/dist/types/utils/browser/index.d.ts +11 -2
- package/dist/types/utils/config.d.ts +2 -2
- package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
- package/dist/types/utils/forms/index.d.ts +1 -0
- package/dist/types/utils/gesture/gesture-controller.d.ts +0 -1
- package/dist/types/utils/hardware-back-button.d.ts +4 -0
- package/dist/types/utils/overlays.d.ts +3 -5
- package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
- package/hydrate/index.js +2003 -1567
- package/package.json +1 -1
- package/components/ion-picker-column-option.d.ts +0 -11
- package/components/ion-picker-column-option.js +0 -52
- package/components/ion-picker-legacy-column.d.ts +0 -11
- package/components/ion-picker-legacy-column.js +0 -9
- package/components/ion-picker-legacy.js +0 -309
- package/components/picker-column2.js +0 -379
- package/dist/cjs/index-306a7476.js +0 -32
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +0 -35
- package/dist/collection/components/item/test/text/item.e2e.js +0 -14
- package/dist/collection/components/picker-column-option/picker-column-option.js +0 -68
- package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +0 -18
- package/dist/collection/components/picker-legacy/picker.ios.css +0 -367
- package/dist/collection/components/picker-legacy/picker.js +0 -817
- package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +0 -25
- package/dist/collection/components/picker-legacy-column/picker-column.js +0 -419
- package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +0 -65
- package/dist/esm/index-7a14ecec.js +0 -29
- package/dist/esm/ion-picker-column-option.entry.js +0 -31
- package/dist/esm-es5/index-0aa6e61f.js +0 -4
- package/dist/esm-es5/index-f0cc4e14.js +0 -4
- package/dist/esm-es5/input-shims-d0c93e5d.js +0 -4
- package/dist/esm-es5/input.utils-ec063df4.js +0 -4
- package/dist/esm-es5/ion-picker-column-option.entry.js +0 -4
- package/dist/esm-es5/ion-picker-column.entry.js +0 -4
- package/dist/esm-es5/ion-picker.entry.js +0 -4
- package/dist/esm-es5/md.transition-66f18369.js +0 -4
- package/dist/esm-es5/overlays-789cd7a7.js +0 -4
- package/dist/esm-es5/swipe-back-cc4c2bcb.js +0 -4
- package/dist/ionic/p-0c244faf.entry.js +0 -4
- package/dist/ionic/p-20cf4994.js +0 -4
- package/dist/ionic/p-234b9617.system.entry.js +0 -4
- package/dist/ionic/p-25c34422.system.entry.js +0 -4
- package/dist/ionic/p-276afddd.js +0 -4
- package/dist/ionic/p-2804781b.entry.js +0 -4
- package/dist/ionic/p-2ad38423.system.entry.js +0 -4
- package/dist/ionic/p-2ba9414e.entry.js +0 -4
- package/dist/ionic/p-2e8e0045.js +0 -4
- package/dist/ionic/p-332f64af.system.entry.js +0 -4
- package/dist/ionic/p-352c0232.system.entry.js +0 -4
- package/dist/ionic/p-3602001b.system.js +0 -4
- package/dist/ionic/p-3632220b.system.js +0 -4
- package/dist/ionic/p-39074595.entry.js +0 -4
- package/dist/ionic/p-439e20ef.entry.js +0 -4
- package/dist/ionic/p-4cd588b3.system.entry.js +0 -4
- package/dist/ionic/p-67aab78f.js +0 -4
- package/dist/ionic/p-67eecef4.system.js +0 -4
- package/dist/ionic/p-6893f6e4.entry.js +0 -4
- package/dist/ionic/p-77e7a9c8.entry.js +0 -4
- package/dist/ionic/p-7c66a566.system.entry.js +0 -4
- package/dist/ionic/p-8b4ab236.entry.js +0 -4
- package/dist/ionic/p-9403b297.system.entry.js +0 -4
- package/dist/ionic/p-966cf574.system.entry.js +0 -4
- package/dist/ionic/p-97c65aa5.js +0 -4
- package/dist/ionic/p-992d3bad.entry.js +0 -4
- package/dist/ionic/p-9ab6f3e6.system.js +0 -4
- package/dist/ionic/p-9b89cbde.js +0 -4
- package/dist/ionic/p-9c967a65.system.entry.js +0 -4
- package/dist/ionic/p-a21b8d05.entry.js +0 -4
- package/dist/ionic/p-b0cee324.entry.js +0 -4
- package/dist/ionic/p-b1142133.entry.js +0 -4
- package/dist/ionic/p-b4cbb736.js +0 -4
- package/dist/ionic/p-b6a8588f.entry.js +0 -4
- package/dist/ionic/p-b6f8ee31.entry.js +0 -4
- package/dist/ionic/p-ba70d455.entry.js +0 -4
- package/dist/ionic/p-bd7a3269.entry.js +0 -4
- package/dist/ionic/p-c32bf078.system.entry.js +0 -4
- package/dist/ionic/p-cc196b34.js +0 -4
- package/dist/ionic/p-d1de1188.js +0 -4
- package/dist/ionic/p-d21bfe66.system.entry.js +0 -4
- package/dist/ionic/p-d3952bd5.system.entry.js +0 -4
- package/dist/ionic/p-dc565ca3.js +0 -4
- package/dist/ionic/p-dfa756ed.system.js +0 -4
- package/dist/ionic/p-e88ed07f.system.js +0 -4
- package/dist/ionic/p-eb07ec1a.system.entry.js +0 -4
- package/dist/ionic/p-eb5697b5.system.js +0 -4
- package/dist/ionic/p-ee800093.entry.js +0 -4
- package/dist/ionic/p-f0559c5d.system.entry.js +0 -4
- package/dist/ionic/p-fdd22426.entry.js +0 -4
- package/dist/ionic/p-ff5a10f9.system.js +0 -4
- package/dist/types/components/picker/picker-interfaces.d.ts +0 -8
- package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -16
- package/dist/types/components/picker-legacy/picker.d.ts +0 -158
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
- /package/dist/collection/components/{picker-legacy → picker}/animations/ios.enter.js +0 -0
- /package/dist/collection/components/{picker-legacy → picker}/animations/ios.leave.js +0 -0
- /package/dist/collection/components/picker/{picker-interfaces.js → picker-interface.js} +0 -0
- /package/dist/collection/components/{picker-legacy-column → picker-column}/test/test.utils.js +0 -0
- /package/dist/collection/components/{picker-column/picker-column-interfaces.js → picker-column-internal/picker-column-internal-interfaces.js} +0 -0
- /package/dist/collection/components/{picker-legacy/picker-interface.js → picker-internal/picker-internal-interfaces.js} +0 -0
- /package/dist/esm-es5/{data-12e24f00.js → data-44d9e816.js} +0 -0
- /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
- /package/dist/ionic/{p-bb849ebb.js → p-17240d90.js} +0 -0
- /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
- /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
- /package/dist/ionic/{p-e4219e27.system.js → p-b8c3f071.system.js} +0 -0
- /package/dist/types/components/{picker-legacy → picker}/animations/ios.enter.d.ts +0 -0
- /package/dist/types/components/{picker-legacy → picker}/animations/ios.leave.d.ts +0 -0
- /package/dist/types/components/{picker-legacy → picker}/picker-interface.d.ts +0 -0
- /package/dist/types/components/{picker-legacy-column → picker-column}/test/test.utils.d.ts +0 -0
- /package/dist/types/components/{picker-column/picker-column-interfaces.d.ts → picker-column-internal/picker-column-internal-interfaces.d.ts} +0 -0
|
@@ -132,6 +132,11 @@
|
|
|
132
132
|
overflow: hidden;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
:host(.in-item:not(.legacy-select)) {
|
|
136
|
+
flex: 1 1 0;
|
|
137
|
+
width: 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
135
140
|
:host(.in-item.legacy-select) {
|
|
136
141
|
position: static;
|
|
137
142
|
max-width: 45%;
|
|
@@ -232,6 +237,12 @@ button {
|
|
|
232
237
|
margin-top: 0;
|
|
233
238
|
margin-bottom: 0;
|
|
234
239
|
position: relative;
|
|
240
|
+
/**
|
|
241
|
+
* Prevent the icon from shrinking when the label and/or
|
|
242
|
+
* selected item text is long enough to fill the rest of
|
|
243
|
+
* the container.
|
|
244
|
+
*/
|
|
245
|
+
flex-shrink: 0;
|
|
235
246
|
}
|
|
236
247
|
|
|
237
248
|
/**
|
|
@@ -315,6 +326,23 @@ button {
|
|
|
315
326
|
transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
316
327
|
}
|
|
317
328
|
|
|
329
|
+
.select-wrapper-inner {
|
|
330
|
+
display: flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
overflow: hidden;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
:host(.select-label-placement-stacked) .select-wrapper-inner,
|
|
336
|
+
:host(.select-label-placement-floating) .select-wrapper-inner {
|
|
337
|
+
/**
|
|
338
|
+
* When using a stacked/floating label, the inner wrapper is
|
|
339
|
+
* stacked vertically under the label container. This line
|
|
340
|
+
* ensures that the inner wrapper fills all the remaining height
|
|
341
|
+
* of the component.
|
|
342
|
+
*/
|
|
343
|
+
flex-grow: 1;
|
|
344
|
+
}
|
|
345
|
+
|
|
318
346
|
:host(.ion-touched.ion-invalid) {
|
|
319
347
|
--highlight-color: var(--highlight-color-invalid);
|
|
320
348
|
}
|
|
@@ -555,11 +583,23 @@ button {
|
|
|
555
583
|
* The placeholder should be hidden when the label
|
|
556
584
|
* is on top of the select. This prevents the label
|
|
557
585
|
* from overlapping any placeholder value.
|
|
586
|
+
*
|
|
587
|
+
* TODO(FW-5592): Remove :not(.label-floating) piece
|
|
558
588
|
*/
|
|
559
|
-
:host(.select-label-placement-floating) .native-wrapper .select-placeholder {
|
|
589
|
+
:host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder {
|
|
560
590
|
opacity: 0;
|
|
561
591
|
}
|
|
562
592
|
|
|
593
|
+
/**
|
|
594
|
+
* We don't use .label-floating here because that would
|
|
595
|
+
* also include the case where the label is floating due
|
|
596
|
+
* to content in the start/end slot. We want the opacity
|
|
597
|
+
* to remain at the default in this case, since the select
|
|
598
|
+
* isn't being actively interacted with.
|
|
599
|
+
*
|
|
600
|
+
* TODO(FW-5592): Change entire selector to:
|
|
601
|
+
* :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder
|
|
602
|
+
*/
|
|
563
603
|
:host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,
|
|
564
604
|
:host(.ion-focused.select-label-placement-floating) .native-wrapper .select-placeholder,
|
|
565
605
|
:host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder {
|
|
@@ -569,10 +609,7 @@ button {
|
|
|
569
609
|
/**
|
|
570
610
|
* This makes the label sit above the input.
|
|
571
611
|
*/
|
|
572
|
-
:host(.
|
|
573
|
-
:host(.select-expanded.select-label-placement-floating) .label-text-wrapper,
|
|
574
|
-
:host(.ion-focused.select-label-placement-floating) .label-text-wrapper,
|
|
575
|
-
:host(.has-value.select-label-placement-floating) .label-text-wrapper {
|
|
612
|
+
:host(.label-floating) .label-text-wrapper {
|
|
576
613
|
transform: translateY(50%) scale(0.75);
|
|
577
614
|
/**
|
|
578
615
|
* Label text should not extend
|
|
@@ -581,6 +618,23 @@ button {
|
|
|
581
618
|
max-width: calc(100% / 0.75);
|
|
582
619
|
}
|
|
583
620
|
|
|
621
|
+
::slotted([slot=start]), ::slotted([slot=end]) {
|
|
622
|
+
/**
|
|
623
|
+
* Prevent the slots from shrinking when the label and/or
|
|
624
|
+
* selected item text is long enough to fill the rest of
|
|
625
|
+
* the container.
|
|
626
|
+
*/
|
|
627
|
+
flex-shrink: 0;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
::slotted([slot=start]) {
|
|
631
|
+
margin-inline-end: 16px;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
::slotted([slot=end]) {
|
|
635
|
+
margin-inline-start: 16px;
|
|
636
|
+
}
|
|
637
|
+
|
|
584
638
|
/**
|
|
585
639
|
* Convert a font size to a dynamic font size.
|
|
586
640
|
* Fonts that participate in Dynamic Type should use
|
|
@@ -704,8 +758,8 @@ button {
|
|
|
704
758
|
color: var(--ion-color-step-650, #595959);
|
|
705
759
|
}
|
|
706
760
|
|
|
707
|
-
:host(.select-label-placement-stacked) .
|
|
708
|
-
:host(.select-label-placement-floating) .
|
|
761
|
+
:host(.select-label-placement-stacked) .select-wrapper-inner,
|
|
762
|
+
:host(.select-label-placement-floating) .select-wrapper-inner {
|
|
709
763
|
width: calc(100% - 1.125rem - 4px);
|
|
710
764
|
}
|
|
711
765
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { Host, h, forceUpdate } from "@stencil/core";
|
|
5
|
-
import { createLegacyFormController, createNotchController } from "../../utils/forms/index";
|
|
5
|
+
import { compareOptions, createLegacyFormController, createNotchController, isOptionSelected } from "../../utils/forms/index";
|
|
6
6
|
import { findItemLabel, focusElement, getAriaLabel, renderHiddenInput, inheritAttributes } from "../../utils/helpers";
|
|
7
7
|
import { printIonWarning } from "../../utils/logging/index";
|
|
8
8
|
import { actionSheetController, alertController, popoverController } from "../../utils/overlays";
|
|
@@ -16,6 +16,8 @@ import { getIonMode } from "../../global/ionic-global";
|
|
|
16
16
|
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
|
|
17
17
|
*
|
|
18
18
|
* @slot label - The label text to associate with the select. Use the `labelPlacement` property to control where the label is placed relative to the select. Use this if you need to render a label with custom HTML.
|
|
19
|
+
* @slot start - Content to display at the leading edge of the select.
|
|
20
|
+
* @slot end - Content to display at the trailing edge of the select.
|
|
19
21
|
*
|
|
20
22
|
* @part placeholder - The text displayed in the select when there is no value.
|
|
21
23
|
* @part text - The displayed value of the select.
|
|
@@ -30,8 +32,22 @@ export class Select {
|
|
|
30
32
|
// This flag ensures we log the deprecation warning at most once.
|
|
31
33
|
this.hasLoggedDeprecationWarning = false;
|
|
32
34
|
this.onClick = (ev) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
const target = ev.target;
|
|
36
|
+
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
37
|
+
if (target === this.el || closestSlot === null) {
|
|
38
|
+
this.setFocus();
|
|
39
|
+
this.open(ev);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
/**
|
|
43
|
+
* Prevent clicks to the start/end slots from opening the select.
|
|
44
|
+
* We ensure the target isn't this element in case the select is slotted
|
|
45
|
+
* in, for example, an item. This would prevent the select from ever
|
|
46
|
+
* being opened since the element itself has slot="start"/"end".
|
|
47
|
+
*/
|
|
48
|
+
ev.stopPropagation();
|
|
49
|
+
ev.preventDefault();
|
|
50
|
+
}
|
|
35
51
|
};
|
|
36
52
|
this.onFocus = () => {
|
|
37
53
|
this.ionFocus.emit();
|
|
@@ -465,6 +481,8 @@ export class Select {
|
|
|
465
481
|
style['has-placeholder'] = this.placeholder !== undefined;
|
|
466
482
|
style['has-value'] = this.hasValue();
|
|
467
483
|
style['has-focus'] = this.isExpanded;
|
|
484
|
+
// TODO(FW-3194): remove this
|
|
485
|
+
style['legacy'] = !!this.legacy;
|
|
468
486
|
}
|
|
469
487
|
this.ionStyle.emit(style);
|
|
470
488
|
}
|
|
@@ -532,7 +550,27 @@ export class Select {
|
|
|
532
550
|
const rtl = isRTL(el) ? 'rtl' : 'ltr';
|
|
533
551
|
const inItem = hostContext('ion-item', this.el);
|
|
534
552
|
const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
|
|
553
|
+
const hasValue = this.hasValue();
|
|
554
|
+
const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
|
|
535
555
|
renderHiddenInput(true, el, name, parseValue(value), disabled);
|
|
556
|
+
/**
|
|
557
|
+
* If the label is stacked, it should always sit above the select.
|
|
558
|
+
* For floating labels, the label should move above the select if
|
|
559
|
+
* the select has a value, is open, or has anything in either
|
|
560
|
+
* the start or end slot.
|
|
561
|
+
*
|
|
562
|
+
* If there is content in the start slot, the label would overlap
|
|
563
|
+
* it if not forced to float. This is also applied to the end slot
|
|
564
|
+
* because with the default or solid fills, the select is not
|
|
565
|
+
* vertically centered in the container, but the label is. This
|
|
566
|
+
* causes the slots and label to appear vertically offset from each
|
|
567
|
+
* other when the label isn't floating above the input. This doesn't
|
|
568
|
+
* apply to the outline fill, but this was not accounted for to keep
|
|
569
|
+
* things consistent.
|
|
570
|
+
*
|
|
571
|
+
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
572
|
+
*/
|
|
573
|
+
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
|
|
536
574
|
return (h(Host, { onClick: this.onClick, class: createColorClasses(this.color, {
|
|
537
575
|
[mode]: true,
|
|
538
576
|
'in-item': inItem,
|
|
@@ -540,7 +578,8 @@ export class Select {
|
|
|
540
578
|
'select-disabled': disabled,
|
|
541
579
|
'select-expanded': isExpanded,
|
|
542
580
|
'has-expanded-icon': expandedIcon !== undefined,
|
|
543
|
-
'has-value':
|
|
581
|
+
'has-value': hasValue,
|
|
582
|
+
'label-floating': labelShouldFloat,
|
|
544
583
|
'has-placeholder': placeholder !== undefined,
|
|
545
584
|
'ion-focusable': true,
|
|
546
585
|
[`select-${rtl}`]: true,
|
|
@@ -548,7 +587,7 @@ export class Select {
|
|
|
548
587
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
549
588
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
550
589
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
551
|
-
}) }, h("label", { class: "select-wrapper", id: "select-label" }, this.renderLabelContainer(), h("div", { class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), !hasFloatingOrStackedLabel && this.renderSelectIcon()
|
|
590
|
+
}) }, h("label", { class: "select-wrapper", id: "select-label" }, this.renderLabelContainer(), h("div", { class: "select-wrapper-inner" }, h("slot", { name: "start" }), h("div", { class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { class: "select-highlight" }))));
|
|
552
591
|
}
|
|
553
592
|
// TODO FW-3194 - Remove this
|
|
554
593
|
renderLegacySelect() {
|
|
@@ -737,7 +776,7 @@ Developers can use the "legacy" property to continue using the legacy form marku
|
|
|
737
776
|
"optional": true,
|
|
738
777
|
"docs": {
|
|
739
778
|
"tags": [],
|
|
740
|
-
"text": "
|
|
779
|
+
"text": "This property allows developers to specify a custom function or property\nname for comparing objects when determining the selected option in the\nion-select. When not specified, the default behavior will use strict\nequality (===) for comparison."
|
|
741
780
|
},
|
|
742
781
|
"attribute": "compare-with",
|
|
743
782
|
"reflect": false
|
|
@@ -1215,17 +1254,6 @@ Developers can use the "legacy" property to continue using the legacy form marku
|
|
|
1215
1254
|
}];
|
|
1216
1255
|
}
|
|
1217
1256
|
}
|
|
1218
|
-
const isOptionSelected = (currentValue, compareValue, compareWith) => {
|
|
1219
|
-
if (currentValue === undefined) {
|
|
1220
|
-
return false;
|
|
1221
|
-
}
|
|
1222
|
-
if (Array.isArray(currentValue)) {
|
|
1223
|
-
return currentValue.some((val) => compareOptions(val, compareValue, compareWith));
|
|
1224
|
-
}
|
|
1225
|
-
else {
|
|
1226
|
-
return compareOptions(currentValue, compareValue, compareWith);
|
|
1227
|
-
}
|
|
1228
|
-
};
|
|
1229
1257
|
const getOptionValue = (el) => {
|
|
1230
1258
|
const value = el.value;
|
|
1231
1259
|
return value === undefined ? el.textContent || '' : value;
|
|
@@ -1239,17 +1267,6 @@ const parseValue = (value) => {
|
|
|
1239
1267
|
}
|
|
1240
1268
|
return value.toString();
|
|
1241
1269
|
};
|
|
1242
|
-
const compareOptions = (currentValue, compareValue, compareWith) => {
|
|
1243
|
-
if (typeof compareWith === 'function') {
|
|
1244
|
-
return compareWith(currentValue, compareValue);
|
|
1245
|
-
}
|
|
1246
|
-
else if (typeof compareWith === 'string') {
|
|
1247
|
-
return currentValue[compareWith] === compareValue[compareWith];
|
|
1248
|
-
}
|
|
1249
|
-
else {
|
|
1250
|
-
return Array.isArray(compareValue) ? compareValue.includes(currentValue) : currentValue === compareValue;
|
|
1251
|
-
}
|
|
1252
|
-
};
|
|
1253
1270
|
const generateText = (opts, value, compareWith) => {
|
|
1254
1271
|
if (value === undefined) {
|
|
1255
1272
|
return '';
|
|
@@ -132,6 +132,11 @@
|
|
|
132
132
|
overflow: hidden;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
:host(.in-item:not(.legacy-select)) {
|
|
136
|
+
flex: 1 1 0;
|
|
137
|
+
width: 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
135
140
|
:host(.in-item.legacy-select) {
|
|
136
141
|
position: static;
|
|
137
142
|
max-width: 45%;
|
|
@@ -232,6 +237,12 @@ button {
|
|
|
232
237
|
margin-top: 0;
|
|
233
238
|
margin-bottom: 0;
|
|
234
239
|
position: relative;
|
|
240
|
+
/**
|
|
241
|
+
* Prevent the icon from shrinking when the label and/or
|
|
242
|
+
* selected item text is long enough to fill the rest of
|
|
243
|
+
* the container.
|
|
244
|
+
*/
|
|
245
|
+
flex-shrink: 0;
|
|
235
246
|
}
|
|
236
247
|
|
|
237
248
|
/**
|
|
@@ -315,6 +326,23 @@ button {
|
|
|
315
326
|
transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
316
327
|
}
|
|
317
328
|
|
|
329
|
+
.select-wrapper-inner {
|
|
330
|
+
display: flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
overflow: hidden;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
:host(.select-label-placement-stacked) .select-wrapper-inner,
|
|
336
|
+
:host(.select-label-placement-floating) .select-wrapper-inner {
|
|
337
|
+
/**
|
|
338
|
+
* When using a stacked/floating label, the inner wrapper is
|
|
339
|
+
* stacked vertically under the label container. This line
|
|
340
|
+
* ensures that the inner wrapper fills all the remaining height
|
|
341
|
+
* of the component.
|
|
342
|
+
*/
|
|
343
|
+
flex-grow: 1;
|
|
344
|
+
}
|
|
345
|
+
|
|
318
346
|
:host(.ion-touched.ion-invalid) {
|
|
319
347
|
--highlight-color: var(--highlight-color-invalid);
|
|
320
348
|
}
|
|
@@ -555,11 +583,23 @@ button {
|
|
|
555
583
|
* The placeholder should be hidden when the label
|
|
556
584
|
* is on top of the select. This prevents the label
|
|
557
585
|
* from overlapping any placeholder value.
|
|
586
|
+
*
|
|
587
|
+
* TODO(FW-5592): Remove :not(.label-floating) piece
|
|
558
588
|
*/
|
|
559
|
-
:host(.select-label-placement-floating) .native-wrapper .select-placeholder {
|
|
589
|
+
:host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder {
|
|
560
590
|
opacity: 0;
|
|
561
591
|
}
|
|
562
592
|
|
|
593
|
+
/**
|
|
594
|
+
* We don't use .label-floating here because that would
|
|
595
|
+
* also include the case where the label is floating due
|
|
596
|
+
* to content in the start/end slot. We want the opacity
|
|
597
|
+
* to remain at the default in this case, since the select
|
|
598
|
+
* isn't being actively interacted with.
|
|
599
|
+
*
|
|
600
|
+
* TODO(FW-5592): Change entire selector to:
|
|
601
|
+
* :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder
|
|
602
|
+
*/
|
|
563
603
|
:host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,
|
|
564
604
|
:host(.ion-focused.select-label-placement-floating) .native-wrapper .select-placeholder,
|
|
565
605
|
:host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder {
|
|
@@ -569,10 +609,7 @@ button {
|
|
|
569
609
|
/**
|
|
570
610
|
* This makes the label sit above the input.
|
|
571
611
|
*/
|
|
572
|
-
:host(.
|
|
573
|
-
:host(.select-expanded.select-label-placement-floating) .label-text-wrapper,
|
|
574
|
-
:host(.ion-focused.select-label-placement-floating) .label-text-wrapper,
|
|
575
|
-
:host(.has-value.select-label-placement-floating) .label-text-wrapper {
|
|
612
|
+
:host(.label-floating) .label-text-wrapper {
|
|
576
613
|
transform: translateY(50%) scale(0.75);
|
|
577
614
|
/**
|
|
578
615
|
* Label text should not extend
|
|
@@ -581,6 +618,23 @@ button {
|
|
|
581
618
|
max-width: calc(100% / 0.75);
|
|
582
619
|
}
|
|
583
620
|
|
|
621
|
+
::slotted([slot=start]), ::slotted([slot=end]) {
|
|
622
|
+
/**
|
|
623
|
+
* Prevent the slots from shrinking when the label and/or
|
|
624
|
+
* selected item text is long enough to fill the rest of
|
|
625
|
+
* the container.
|
|
626
|
+
*/
|
|
627
|
+
flex-shrink: 0;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
::slotted([slot=start]) {
|
|
631
|
+
margin-inline-end: 16px;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
::slotted([slot=end]) {
|
|
635
|
+
margin-inline-start: 16px;
|
|
636
|
+
}
|
|
637
|
+
|
|
584
638
|
/**
|
|
585
639
|
* Convert a font size to a dynamic font size.
|
|
586
640
|
* Fonts that participate in Dynamic Type should use
|
|
@@ -824,10 +878,7 @@ button {
|
|
|
824
878
|
}
|
|
825
879
|
}
|
|
826
880
|
|
|
827
|
-
:host(.select-fill-solid
|
|
828
|
-
:host(.select-expanded.select-fill-solid.select-label-placement-floating) .label-text-wrapper,
|
|
829
|
-
:host(.ion-focused.select-fill-solid.select-label-placement-floating) .label-text-wrapper,
|
|
830
|
-
:host(.has-value.select-fill-solid.select-label-placement-floating) .label-text-wrapper {
|
|
881
|
+
:host(.label-floating.select-fill-solid) .label-text-wrapper {
|
|
831
882
|
/**
|
|
832
883
|
* Label text should not extend
|
|
833
884
|
* beyond the bounds of the select.
|
|
@@ -983,10 +1034,7 @@ button {
|
|
|
983
1034
|
/**
|
|
984
1035
|
* This makes the label sit above the select.
|
|
985
1036
|
*/
|
|
986
|
-
:host(.
|
|
987
|
-
:host(.ion-focused.select-fill-outline.select-label-placement-floating) .label-text-wrapper,
|
|
988
|
-
:host(.has-value.select-fill-outline.select-label-placement-floating) .label-text-wrapper,
|
|
989
|
-
:host(.select-fill-outline.select-label-placement-stacked) .label-text-wrapper {
|
|
1037
|
+
:host(.label-floating.select-fill-outline) .label-text-wrapper {
|
|
990
1038
|
transform: translateY(-32%) scale(0.75);
|
|
991
1039
|
margin-left: 0;
|
|
992
1040
|
margin-right: 0;
|
|
@@ -1131,10 +1179,7 @@ button {
|
|
|
1131
1179
|
* the floating/stacked label. We simulate this "cut out"
|
|
1132
1180
|
* by removing the top border from the notch fragment.
|
|
1133
1181
|
*/
|
|
1134
|
-
:host(.
|
|
1135
|
-
:host(.ion-focused.select-fill-outline.select-label-placement-floating) .select-outline-notch,
|
|
1136
|
-
:host(.has-value.select-fill-outline.select-label-placement-floating) .select-outline-notch,
|
|
1137
|
-
:host(.select-fill-outline.select-label-placement-stacked) .select-outline-notch {
|
|
1182
|
+
:host(.label-floating.select-fill-outline) .select-outline-notch {
|
|
1138
1183
|
border-top: none;
|
|
1139
1184
|
}
|
|
1140
1185
|
|
|
@@ -1299,8 +1344,8 @@ button {
|
|
|
1299
1344
|
--border-radius: 16px;
|
|
1300
1345
|
}
|
|
1301
1346
|
|
|
1302
|
-
:host(.select-label-placement-stacked) .
|
|
1303
|
-
:host(.select-label-placement-floating) .
|
|
1347
|
+
:host(.select-label-placement-stacked) .select-wrapper-inner,
|
|
1348
|
+
:host(.select-label-placement-floating) .select-wrapper-inner {
|
|
1304
1349
|
width: calc(100% - 0.8125rem - 4px);
|
|
1305
1350
|
}
|
|
1306
1351
|
|
|
@@ -121,7 +121,7 @@ configs().forEach(({ title, screenshot, config }) => {
|
|
|
121
121
|
});
|
|
122
122
|
test('label should appear on top of the select when the select is expanded', async ({ page }) => {
|
|
123
123
|
await page.setContent(`
|
|
124
|
-
<ion-select class="select-expanded" label="Label" label-placement="floating" placeholder="Select a Fruit">
|
|
124
|
+
<ion-select class="select-expanded label-floating" label="Label" label-placement="floating" placeholder="Select a Fruit">
|
|
125
125
|
<ion-select-option value="apples">Apples</ion-select-option>
|
|
126
126
|
</ion-select>
|
|
127
127
|
`, config);
|
|
@@ -27,7 +27,7 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
|
|
|
27
27
|
await page.setContent(`
|
|
28
28
|
<ion-item>
|
|
29
29
|
<ion-label>Really long label should not wrap</ion-label>
|
|
30
|
-
<ion-select value="wrap" class="ion-text-wrap">
|
|
30
|
+
<ion-select value="wrap" legacy="true" class="ion-text-wrap">
|
|
31
31
|
<ion-select-option value="wrap">Should wrap value only when label exists and really long text exists to make it wrap the text</ion-select-option>
|
|
32
32
|
</ion-select>
|
|
33
33
|
</ion-item>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import { expect } from "@playwright/test";
|
|
5
|
+
import { configs, test } from "../../../../utils/test/playwright/index";
|
|
6
|
+
configs().forEach(({ title, screenshot, config }) => {
|
|
7
|
+
test.describe(title('select: start and end slots (visual checks)'), () => {
|
|
8
|
+
test('should not have visual regressions with a start-positioned label', async ({ page }) => {
|
|
9
|
+
await page.setContent(`
|
|
10
|
+
<ion-select label-placement="start" fill="solid" placeholder="Select weight" label="Weight">
|
|
11
|
+
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
|
|
12
|
+
<ion-label slot="end">lbs</ion-label>
|
|
13
|
+
</ion-select>
|
|
14
|
+
`, config);
|
|
15
|
+
const select = page.locator('ion-select');
|
|
16
|
+
await expect(select).toHaveScreenshot(screenshot(`select-slots-label-start`));
|
|
17
|
+
});
|
|
18
|
+
test('should not have visual regressions with a floating label', async ({ page }) => {
|
|
19
|
+
await page.setContent(`
|
|
20
|
+
<ion-select label-placement="floating" fill="solid" placeholder="Select weight" label="Weight">
|
|
21
|
+
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
|
|
22
|
+
<ion-label slot="end">lbs</ion-label>
|
|
23
|
+
</ion-select>
|
|
24
|
+
`, config);
|
|
25
|
+
const select = page.locator('ion-select');
|
|
26
|
+
await expect(select).toHaveScreenshot(screenshot(`select-slots-label-floating`));
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
|
|
31
|
+
test.describe(title('select: start and end slots (functionality checks)'), () => {
|
|
32
|
+
test('should raise floating label when there is content in the start slot', async ({ page }) => {
|
|
33
|
+
await page.setContent(`
|
|
34
|
+
<ion-select label-placement="floating" fill="solid" label="Weight">
|
|
35
|
+
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
|
|
36
|
+
</ion-select>
|
|
37
|
+
`, config);
|
|
38
|
+
const select = page.locator('ion-select');
|
|
39
|
+
await expect(select).toHaveClass(/label-floating/);
|
|
40
|
+
});
|
|
41
|
+
test('should raise floating label when there is content in the end slot', async ({ page }) => {
|
|
42
|
+
await page.setContent(`
|
|
43
|
+
<ion-select label-placement="floating" fill="solid" label="Weight">
|
|
44
|
+
<ion-icon slot="end" name="barbell" aria-hidden="true"></ion-icon>
|
|
45
|
+
</ion-select>
|
|
46
|
+
`, config);
|
|
47
|
+
const select = page.locator('ion-select');
|
|
48
|
+
await expect(select).toHaveClass(/label-floating/);
|
|
49
|
+
});
|
|
50
|
+
test('should not open select when slotted buttons are clicked', async ({ page }) => {
|
|
51
|
+
await page.setContent(`
|
|
52
|
+
<ion-select label="Favorite Pizza" placeholder="Select a pizza">
|
|
53
|
+
<ion-select-option value="pepperoni">Pepperoni</ion-select-option>
|
|
54
|
+
<ion-select-option value="supreme">Supreme</ion-select-option>
|
|
55
|
+
<ion-select-option value="chicken">Chicken</ion-select-option>
|
|
56
|
+
<ion-button fill="clear" slot="end" aria-label="Show/hide password">
|
|
57
|
+
<ion-icon slot="icon-only" name="eye" aria-hidden="true"></ion-icon>
|
|
58
|
+
</ion-button>
|
|
59
|
+
</ion-select>
|
|
60
|
+
`, config);
|
|
61
|
+
await page.click('ion-select ion-button[slot="end"]');
|
|
62
|
+
await page.waitForChanges();
|
|
63
|
+
const select = page.locator('ion-select');
|
|
64
|
+
await expect(select).not.toHaveClass(/select-expanded/);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -9,6 +9,18 @@ export class SkeletonText {
|
|
|
9
9
|
constructor() {
|
|
10
10
|
this.animated = false;
|
|
11
11
|
}
|
|
12
|
+
componentWillLoad() {
|
|
13
|
+
this.emitStyle();
|
|
14
|
+
}
|
|
15
|
+
emitStyle() {
|
|
16
|
+
// The emitted property is used by item in order
|
|
17
|
+
// to add the item-skeleton-text class which applies
|
|
18
|
+
// overflow: hidden to its label
|
|
19
|
+
const style = {
|
|
20
|
+
'skeleton-text': true,
|
|
21
|
+
};
|
|
22
|
+
this.ionStyle.emit(style);
|
|
23
|
+
}
|
|
12
24
|
render() {
|
|
13
25
|
const animated = this.animated && config.getBoolean('animated', true);
|
|
14
26
|
const inMedia = hostContext('ion-avatar', this.el) || hostContext('ion-thumbnail', this.el);
|
|
@@ -53,5 +65,32 @@ export class SkeletonText {
|
|
|
53
65
|
}
|
|
54
66
|
};
|
|
55
67
|
}
|
|
68
|
+
static get events() {
|
|
69
|
+
return [{
|
|
70
|
+
"method": "ionStyle",
|
|
71
|
+
"name": "ionStyle",
|
|
72
|
+
"bubbles": true,
|
|
73
|
+
"cancelable": true,
|
|
74
|
+
"composed": true,
|
|
75
|
+
"docs": {
|
|
76
|
+
"tags": [{
|
|
77
|
+
"name": "internal",
|
|
78
|
+
"text": undefined
|
|
79
|
+
}],
|
|
80
|
+
"text": "Emitted when the styles change."
|
|
81
|
+
},
|
|
82
|
+
"complexType": {
|
|
83
|
+
"original": "StyleEventDetail",
|
|
84
|
+
"resolved": "StyleEventDetail",
|
|
85
|
+
"references": {
|
|
86
|
+
"StyleEventDetail": {
|
|
87
|
+
"location": "import",
|
|
88
|
+
"path": "../../interface",
|
|
89
|
+
"id": "src/interface.d.ts::StyleEventDetail"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}];
|
|
94
|
+
}
|
|
56
95
|
static get elementRef() { return "el"; }
|
|
57
96
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import { expect } from "@playwright/test";
|
|
5
|
+
import { configs, test } from "../../../../utils/test/playwright/index";
|
|
6
|
+
configs().forEach(({ title, screenshot, config }) => {
|
|
7
|
+
test.describe(title('textarea: start and end slots (visual checks)'), () => {
|
|
8
|
+
test('should not have visual regressions with a start-positioned label', async ({ page }) => {
|
|
9
|
+
await page.setContent(`
|
|
10
|
+
<ion-textarea label-placement="start" fill="solid" value="100" label="Weight">
|
|
11
|
+
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
|
|
12
|
+
<ion-label slot="end">lbs</ion-label>
|
|
13
|
+
</ion-textarea>
|
|
14
|
+
`, config);
|
|
15
|
+
const textarea = page.locator('ion-textarea');
|
|
16
|
+
await expect(textarea).toHaveScreenshot(screenshot(`textarea-slots-label-start`));
|
|
17
|
+
});
|
|
18
|
+
test('should not have visual regressions with a floating label', async ({ page }) => {
|
|
19
|
+
await page.setContent(`
|
|
20
|
+
<ion-textarea label-placement="floating" fill="solid" value="100" label="Weight">
|
|
21
|
+
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
|
|
22
|
+
<ion-label slot="end">lbs</ion-label>
|
|
23
|
+
</ion-textarea>
|
|
24
|
+
`, config);
|
|
25
|
+
const textarea = page.locator('ion-textarea');
|
|
26
|
+
await expect(textarea).toHaveScreenshot(screenshot(`textarea-slots-label-floating`));
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
|
|
31
|
+
test.describe(title('textarea: start and end slots (functionality checks)'), () => {
|
|
32
|
+
test('should raise floating label when there is content in the start slot', async ({ page }) => {
|
|
33
|
+
await page.setContent(`
|
|
34
|
+
<ion-textarea label-placement="floating" fill="solid" label="Weight">
|
|
35
|
+
<ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
|
|
36
|
+
</ion-textarea>
|
|
37
|
+
`, config);
|
|
38
|
+
const textarea = page.locator('ion-textarea');
|
|
39
|
+
await expect(textarea).toHaveClass(/label-floating/);
|
|
40
|
+
});
|
|
41
|
+
test('should raise floating label when there is content in the end slot', async ({ page }) => {
|
|
42
|
+
await page.setContent(`
|
|
43
|
+
<ion-textarea label-placement="floating" fill="solid" label="Weight">
|
|
44
|
+
<ion-icon slot="end" name="barbell" aria-hidden="true"></ion-icon>
|
|
45
|
+
</ion-textarea>
|
|
46
|
+
`, config);
|
|
47
|
+
const textarea = page.locator('ion-textarea');
|
|
48
|
+
await expect(textarea).toHaveClass(/label-floating/);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -356,9 +356,7 @@
|
|
|
356
356
|
}
|
|
357
357
|
|
|
358
358
|
.native-wrapper {
|
|
359
|
-
display: flex;
|
|
360
359
|
position: relative;
|
|
361
|
-
flex-grow: 1;
|
|
362
360
|
width: 100%;
|
|
363
361
|
height: 100%;
|
|
364
362
|
}
|
|
@@ -429,6 +427,12 @@
|
|
|
429
427
|
word-break: break-word;
|
|
430
428
|
}
|
|
431
429
|
|
|
430
|
+
.textarea-wrapper-inner {
|
|
431
|
+
display: flex;
|
|
432
|
+
width: 100%;
|
|
433
|
+
min-height: inherit;
|
|
434
|
+
}
|
|
435
|
+
|
|
432
436
|
:host(.ion-touched.ion-invalid) {
|
|
433
437
|
--highlight-color: var(--highlight-color-invalid);
|
|
434
438
|
}
|
|
@@ -704,6 +708,13 @@
|
|
|
704
708
|
margin-bottom: 0px;
|
|
705
709
|
}
|
|
706
710
|
|
|
711
|
+
:host(.textarea-label-placement-stacked) ::slotted([slot=start]),
|
|
712
|
+
:host(.textarea-label-placement-stacked) ::slotted([slot=end]),
|
|
713
|
+
:host(.textarea-label-placement-floating) ::slotted([slot=start]),
|
|
714
|
+
:host(.textarea-label-placement-floating) ::slotted([slot=end]) {
|
|
715
|
+
margin-top: 8px;
|
|
716
|
+
}
|
|
717
|
+
|
|
707
718
|
/**
|
|
708
719
|
* This makes the label sit over the textarea
|
|
709
720
|
* when the textarea is blurred and has no value.
|
|
@@ -729,9 +740,7 @@
|
|
|
729
740
|
/**
|
|
730
741
|
* This makes the label sit above the textarea.
|
|
731
742
|
*/
|
|
732
|
-
:host(.
|
|
733
|
-
:host(.has-focus.textarea-label-placement-floating) .label-text-wrapper,
|
|
734
|
-
:host(.has-value.textarea-label-placement-floating) .label-text-wrapper {
|
|
743
|
+
:host(.label-floating) .label-text-wrapper {
|
|
735
744
|
transform: translateY(50%) scale(0.75);
|
|
736
745
|
/**
|
|
737
746
|
* Label text should not extend
|
|
@@ -740,6 +749,29 @@
|
|
|
740
749
|
max-width: calc(100% / 0.75);
|
|
741
750
|
}
|
|
742
751
|
|
|
752
|
+
.start-slot-wrapper, .end-slot-wrapper {
|
|
753
|
+
padding-left: 0;
|
|
754
|
+
padding-right: 0;
|
|
755
|
+
padding-top: var(--padding-top);
|
|
756
|
+
padding-bottom: var(--padding-bottom);
|
|
757
|
+
display: flex;
|
|
758
|
+
flex-shrink: 0;
|
|
759
|
+
align-self: start;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
::slotted([slot=start]),
|
|
763
|
+
::slotted([slot=end]) {
|
|
764
|
+
margin-top: 0;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
::slotted([slot=start]) {
|
|
768
|
+
margin-inline-end: 16px;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
::slotted([slot=end]) {
|
|
772
|
+
margin-inline-start: 16px;
|
|
773
|
+
}
|
|
774
|
+
|
|
743
775
|
/**
|
|
744
776
|
* Convert a font size to a dynamic font size.
|
|
745
777
|
* Fonts that participate in Dynamic Type should use
|