@ionic/core 7.5.8 → 7.6.0

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.
Files changed (381) hide show
  1. package/components/animation.js +12 -11
  2. package/components/checkbox.js +5 -3
  3. package/components/index4.js +10 -12
  4. package/components/index5.js +0 -22
  5. package/components/input-shims.js +12 -7
  6. package/components/input.utils.js +3 -2
  7. package/components/ion-datetime.js +2 -2
  8. package/components/ion-infinite-scroll.js +11 -3
  9. package/components/ion-input.js +31 -8
  10. package/components/ion-modal.js +2 -2
  11. package/components/ion-range.js +5 -3
  12. package/components/ion-select.js +44 -29
  13. package/components/ion-skeleton-text.js +14 -1
  14. package/components/ion-textarea.js +30 -7
  15. package/components/ion-toast.js +419 -74
  16. package/components/ion-toggle.js +5 -3
  17. package/components/item.js +2 -2
  18. package/components/label.js +2 -2
  19. package/components/overlays.js +2 -1
  20. package/components/radio-group.js +2 -0
  21. package/components/radio.js +45 -5
  22. package/dist/cjs/{animation-cc40e39c.js → animation-9b401d39.js} +13 -12
  23. package/dist/cjs/{button-active-417ccdcb.js → button-active-a5185907.js} +1 -1
  24. package/dist/cjs/{capacitor-46980811.js → capacitor-c04564bf.js} +1 -1
  25. package/dist/cjs/compare-with-utils-df1001d7.js +44 -0
  26. package/dist/cjs/{haptic-216df36c.js → haptic-b882e0bb.js} +1 -1
  27. package/dist/cjs/{index-8c1e77d6.js → index-b4f986cd.js} +1 -1
  28. package/dist/cjs/index-c8d52405.js +10 -0
  29. package/dist/cjs/{index-5cbb20f9.js → index-ce101dc9.js} +11 -13
  30. package/dist/cjs/{index-d4c2e02c.js → index-f8f13389.js} +2 -2
  31. package/dist/cjs/index.cjs.js +8 -8
  32. package/dist/cjs/{input-shims-87102b6a.js → input-shims-a23bb0f4.js} +15 -10
  33. package/dist/cjs/{input.utils-2a11c1fe.js → input.utils-3d0166a2.js} +4 -3
  34. package/dist/cjs/ion-action-sheet.cjs.entry.js +6 -6
  35. package/dist/cjs/ion-alert.cjs.entry.js +6 -6
  36. package/dist/cjs/ion-app_8.cjs.entry.js +8 -8
  37. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -3
  38. package/dist/cjs/ion-datetime_3.cjs.entry.js +7 -7
  39. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +11 -3
  40. package/dist/cjs/ion-input.cjs.entry.js +34 -11
  41. package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
  42. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  43. package/dist/cjs/ion-menu_3.cjs.entry.js +5 -5
  44. package/dist/cjs/ion-modal.cjs.entry.js +8 -8
  45. package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
  46. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +3 -3
  47. package/dist/cjs/ion-popover.cjs.entry.js +4 -4
  48. package/dist/cjs/ion-radio_2.cjs.entry.js +9 -4
  49. package/dist/cjs/ion-range.cjs.entry.js +5 -3
  50. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  51. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  52. package/dist/cjs/ion-select_3.cjs.entry.js +51 -35
  53. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  54. package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
  55. package/dist/cjs/ion-toast.cjs.entry.js +434 -92
  56. package/dist/cjs/ion-toggle.cjs.entry.js +8 -6
  57. package/dist/cjs/ionic.cjs.js +1 -1
  58. package/dist/cjs/{ios.transition-a4ffb5a2.js → ios.transition-6787b799.js} +3 -3
  59. package/dist/cjs/{keyboard-9390928c.js → keyboard-0272231f.js} +1 -1
  60. package/dist/cjs/{keyboard-7d621ee9.js → keyboard-af1bb365.js} +3 -3
  61. package/dist/cjs/{keyboard-controller-2158b478.js → keyboard-controller-c05e747a.js} +2 -2
  62. package/dist/cjs/loader.cjs.js +1 -1
  63. package/dist/cjs/{md.transition-292abe1c.js → md.transition-e033d20a.js} +3 -3
  64. package/dist/cjs/{notch-controller-1dce508a.js → notch-controller-9735e7ac.js} +1 -1
  65. package/dist/cjs/{overlays-5c379703.js → overlays-27a6fb16.js} +3 -1
  66. package/dist/collection/components/checkbox/checkbox.ios.css +0 -6
  67. package/dist/collection/components/checkbox/checkbox.js +4 -1
  68. package/dist/collection/components/checkbox/checkbox.md.css +0 -6
  69. package/dist/collection/components/checkbox/test/checkbox.spec.js +14 -0
  70. package/dist/collection/components/datetime/datetime.ios.css +1 -0
  71. package/dist/collection/components/datetime/datetime.md.css +1 -0
  72. package/dist/collection/components/infinite-scroll/infinite-scroll.js +11 -3
  73. package/dist/collection/components/infinite-scroll/test/small-dom-update/infinite-scroll.e2e.js +31 -0
  74. package/dist/collection/components/input/input.ios.css +10 -3
  75. package/dist/collection/components/input/input.js +31 -6
  76. package/dist/collection/components/input/input.md.css +13 -12
  77. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  78. package/dist/collection/components/item/item.ios.css +41 -3
  79. package/dist/collection/components/item/item.md.css +41 -3
  80. package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
  81. package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
  82. package/dist/collection/components/label/label.ios.css +14 -3
  83. package/dist/collection/components/label/label.md.css +14 -3
  84. package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
  85. package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
  86. package/dist/collection/components/radio/radio.ios.css +0 -6
  87. package/dist/collection/components/radio/radio.js +7 -3
  88. package/dist/collection/components/radio/radio.md.css +0 -6
  89. package/dist/collection/components/radio/test/radio.spec.js +14 -0
  90. package/dist/collection/components/radio-group/radio-group.js +24 -0
  91. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  92. package/dist/collection/components/range/range.ios.css +0 -6
  93. package/dist/collection/components/range/range.js +4 -1
  94. package/dist/collection/components/range/range.md.css +0 -6
  95. package/dist/collection/components/range/test/range.spec.js +16 -0
  96. package/dist/collection/components/select/select.ios.css +60 -7
  97. package/dist/collection/components/select/select.js +45 -28
  98. package/dist/collection/components/select/select.md.css +63 -19
  99. package/dist/collection/components/select/test/item/select.e2e.js +15 -0
  100. package/dist/collection/components/select/test/label/select.e2e.js +1 -1
  101. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
  102. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  103. package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
  104. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  105. package/dist/collection/components/textarea/textarea.ios.css +37 -5
  106. package/dist/collection/components/textarea/textarea.js +30 -5
  107. package/dist/collection/components/textarea/textarea.md.css +47 -14
  108. package/dist/collection/components/toast/animations/ios.enter.js +2 -1
  109. package/dist/collection/components/toast/animations/md.enter.js +4 -3
  110. package/dist/collection/components/toast/animations/utils.js +20 -14
  111. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  112. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  113. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  114. package/dist/collection/components/toast/test/toast.spec.js +80 -0
  115. package/dist/collection/components/toast/toast.ios.css +10 -10
  116. package/dist/collection/components/toast/toast.js +104 -1
  117. package/dist/collection/components/toast/toast.md.css +10 -0
  118. package/dist/collection/components/toggle/test/toggle.spec.js +12 -0
  119. package/dist/collection/components/toggle/toggle.ios.css +0 -6
  120. package/dist/collection/components/toggle/toggle.js +4 -1
  121. package/dist/collection/components/toggle/toggle.md.css +0 -6
  122. package/dist/collection/utils/animation/animation.js +12 -11
  123. package/dist/collection/utils/animation/test/animation.spec.js +16 -0
  124. package/dist/collection/utils/browser/index.js +0 -22
  125. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  126. package/dist/collection/utils/forms/index.js +1 -0
  127. package/dist/collection/utils/input-shims/input-shims.js +12 -6
  128. package/dist/collection/utils/menu-controller/index.js +10 -12
  129. package/dist/collection/utils/overlays.js +1 -0
  130. package/dist/collection/utils/slot-mutation-controller.js +3 -2
  131. package/dist/docs.json +159 -2
  132. package/dist/esm/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +13 -12
  133. package/dist/esm/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
  134. package/dist/esm/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  135. package/dist/esm/compare-with-utils-a96ff2ea.js +41 -0
  136. package/dist/esm/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  137. package/dist/esm/{index-80492ed3.js → index-0c12c22b.js} +11 -13
  138. package/dist/esm/{index-d8817fb0.js → index-1932b201.js} +2 -2
  139. package/dist/esm/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  140. package/dist/esm/index-a5d50daf.js +7 -0
  141. package/dist/esm/index.js +8 -8
  142. package/dist/esm/{input-shims-0a2e541d.js → input-shims-6539ce13.js} +14 -9
  143. package/dist/esm/{input.utils-2846d430.js → input.utils-a5a2d164.js} +4 -3
  144. package/dist/esm/ion-action-sheet.entry.js +6 -6
  145. package/dist/esm/ion-alert.entry.js +6 -6
  146. package/dist/esm/ion-app_8.entry.js +8 -8
  147. package/dist/esm/ion-checkbox.entry.js +5 -3
  148. package/dist/esm/ion-datetime_3.entry.js +7 -7
  149. package/dist/esm/ion-infinite-scroll_2.entry.js +11 -3
  150. package/dist/esm/ion-input.entry.js +34 -11
  151. package/dist/esm/ion-item_8.entry.js +17 -4
  152. package/dist/esm/ion-loading.entry.js +3 -3
  153. package/dist/esm/ion-menu_3.entry.js +5 -5
  154. package/dist/esm/ion-modal.entry.js +8 -8
  155. package/dist/esm/ion-nav_2.entry.js +1 -1
  156. package/dist/esm/ion-picker-column-internal.entry.js +3 -3
  157. package/dist/esm/ion-popover.entry.js +4 -4
  158. package/dist/esm/ion-radio_2.entry.js +9 -4
  159. package/dist/esm/ion-range.entry.js +5 -3
  160. package/dist/esm/ion-refresher_2.entry.js +4 -4
  161. package/dist/esm/ion-reorder_2.entry.js +3 -3
  162. package/dist/esm/ion-select_3.entry.js +47 -31
  163. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  164. package/dist/esm/ion-textarea.entry.js +33 -10
  165. package/dist/esm/ion-toast.entry.js +417 -75
  166. package/dist/esm/ion-toggle.entry.js +8 -6
  167. package/dist/esm/ionic.js +1 -1
  168. package/dist/esm/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +3 -3
  169. package/dist/esm/{keyboard-c402e885.js → keyboard-52278bd7.js} +3 -3
  170. package/dist/esm/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  171. package/dist/esm/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +2 -2
  172. package/dist/esm/loader.js +1 -1
  173. package/dist/esm/{md.transition-94ac93e1.js → md.transition-43c2874d.js} +3 -3
  174. package/dist/esm/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  175. package/dist/esm/{overlays-abf58489.js → overlays-32ef481d.js} +3 -2
  176. package/dist/esm-es5/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +1 -1
  177. package/dist/esm-es5/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
  178. package/dist/esm-es5/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  179. package/dist/esm-es5/compare-with-utils-a96ff2ea.js +4 -0
  180. package/dist/esm-es5/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  181. package/dist/esm-es5/index-0c12c22b.js +4 -0
  182. package/dist/esm-es5/{index-d8817fb0.js → index-1932b201.js} +1 -1
  183. package/dist/esm-es5/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  184. package/dist/esm-es5/index.js +1 -1
  185. package/dist/esm-es5/input-shims-6539ce13.js +4 -0
  186. package/dist/esm-es5/input.utils-a5a2d164.js +4 -0
  187. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  188. package/dist/esm-es5/ion-alert.entry.js +1 -1
  189. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  190. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  191. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  192. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  193. package/dist/esm-es5/ion-input.entry.js +1 -1
  194. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  195. package/dist/esm-es5/ion-loading.entry.js +1 -1
  196. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  197. package/dist/esm-es5/ion-modal.entry.js +1 -1
  198. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  199. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  200. package/dist/esm-es5/ion-popover.entry.js +1 -1
  201. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  202. package/dist/esm-es5/ion-range.entry.js +1 -1
  203. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  204. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  205. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  206. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  207. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  208. package/dist/esm-es5/ion-toast.entry.js +1 -1
  209. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  210. package/dist/esm-es5/ionic.js +1 -1
  211. package/dist/esm-es5/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +1 -1
  212. package/dist/esm-es5/{keyboard-c402e885.js → keyboard-52278bd7.js} +1 -1
  213. package/dist/esm-es5/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  214. package/dist/esm-es5/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +1 -1
  215. package/dist/esm-es5/loader.js +1 -1
  216. package/dist/esm-es5/md.transition-43c2874d.js +4 -0
  217. package/dist/esm-es5/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  218. package/dist/esm-es5/{overlays-abf58489.js → overlays-32ef481d.js} +1 -1
  219. package/dist/html.html-data.json +14 -1
  220. package/dist/ionic/index.esm.js +1 -1
  221. package/dist/ionic/ionic.esm.js +1 -1
  222. package/dist/ionic/p-01d14eba.system.entry.js +4 -0
  223. package/dist/ionic/{p-3de71759.entry.js → p-042e6f4b.entry.js} +1 -1
  224. package/dist/ionic/p-05d83227.system.entry.js +4 -0
  225. package/dist/ionic/{p-32e19bee.system.js → p-0bd51c34.system.js} +1 -1
  226. package/dist/ionic/{p-73637557.system.entry.js → p-16756e94.system.entry.js} +1 -1
  227. package/dist/ionic/p-1b19c04b.entry.js +4 -0
  228. package/dist/ionic/{p-95c26010.system.js → p-1cca10d6.system.js} +1 -1
  229. package/dist/ionic/p-1e4371bd.js +4 -0
  230. package/dist/ionic/{p-0519cd21.entry.js → p-251666e2.entry.js} +1 -1
  231. package/dist/ionic/{p-4e8e09e1.js → p-27281edd.js} +1 -1
  232. package/dist/ionic/p-28249b10.system.entry.js +4 -0
  233. package/dist/ionic/p-28a2c2a2.entry.js +4 -0
  234. package/dist/ionic/p-29d03b3a.js +4 -0
  235. package/dist/ionic/p-2b7827c7.js +4 -0
  236. package/dist/ionic/p-2d3b9fa3.system.entry.js +4 -0
  237. package/dist/ionic/p-2d539df1.entry.js +4 -0
  238. package/dist/ionic/{p-a0126dd5.system.entry.js → p-3137c025.system.entry.js} +1 -1
  239. package/dist/ionic/{p-30029cc2.system.js → p-31fcb233.system.js} +1 -1
  240. package/dist/ionic/{p-b0dc1cf9.system.js → p-33a37fad.system.js} +1 -1
  241. package/dist/ionic/p-36d187af.js +4 -0
  242. package/dist/ionic/p-376a6063.js +4 -0
  243. package/dist/ionic/p-38f2c6bb.system.js +4 -0
  244. package/dist/ionic/{p-2ba0657d.system.entry.js → p-39c31982.system.entry.js} +1 -1
  245. package/dist/ionic/{p-75445583.js → p-3a75d7fd.js} +1 -1
  246. package/dist/ionic/{p-d40a974a.entry.js → p-3dd98a73.entry.js} +1 -1
  247. package/dist/ionic/p-3e6b47e8.system.entry.js +4 -0
  248. package/dist/ionic/p-3f5179b5.entry.js +4 -0
  249. package/dist/ionic/p-40f68333.system.js +4 -0
  250. package/dist/ionic/{p-643a8fae.js → p-42f189f4.js} +1 -1
  251. package/dist/ionic/{p-9c3b6849.entry.js → p-438e1b8a.entry.js} +1 -1
  252. package/dist/ionic/{p-b752714f.system.entry.js → p-46d400b4.system.entry.js} +1 -1
  253. package/dist/ionic/{p-61d7d7fb.js → p-47b6ba5b.js} +1 -1
  254. package/dist/ionic/{p-b04e4d62.entry.js → p-4d67d27a.entry.js} +1 -1
  255. package/dist/ionic/{p-0b1bc636.entry.js → p-4f3ae45a.entry.js} +1 -1
  256. package/dist/ionic/{p-18b6bd23.system.entry.js → p-517a9885.system.entry.js} +1 -1
  257. package/dist/ionic/p-53ec4f1c.system.js +4 -0
  258. package/dist/ionic/p-5e4eec2e.entry.js +4 -0
  259. package/dist/ionic/{p-57477107.system.js → p-5e745192.system.js} +1 -1
  260. package/dist/ionic/{p-ad019ef0.entry.js → p-5eda1d7d.entry.js} +1 -1
  261. package/dist/ionic/{p-4890093d.js → p-6de472cb.js} +1 -1
  262. package/dist/ionic/{p-08f196ce.system.entry.js → p-6de62649.system.entry.js} +1 -1
  263. package/dist/ionic/p-72f6ff89.js +4 -0
  264. package/dist/ionic/p-765f4dde.entry.js +4 -0
  265. package/dist/ionic/{p-3f6270b3.entry.js → p-78aadecb.entry.js} +1 -1
  266. package/dist/ionic/p-7d92bf15.system.entry.js +4 -0
  267. package/dist/ionic/p-7ee0f3f2.entry.js +4 -0
  268. package/dist/ionic/p-8314281e.system.js +4 -0
  269. package/dist/ionic/p-88d5fbd3.js +4 -0
  270. package/dist/ionic/{p-0e4f2e17.system.js → p-8985cdb6.system.js} +1 -1
  271. package/dist/ionic/{p-d7be6b7e.system.entry.js → p-8acae6b0.system.entry.js} +1 -1
  272. package/dist/ionic/p-8d69a624.entry.js +4 -0
  273. package/dist/ionic/p-8de17614.system.entry.js +4 -0
  274. package/dist/ionic/p-91d33c4a.js +4 -0
  275. package/dist/ionic/p-979d4f5c.system.js +4 -0
  276. package/dist/ionic/p-9b7f0b0f.entry.js +4 -0
  277. package/dist/ionic/p-9e447eb1.system.js +4 -0
  278. package/dist/ionic/p-9f6ee2c0.system.entry.js +4 -0
  279. package/dist/ionic/{p-94389114.system.entry.js → p-a0bb7b92.system.entry.js} +1 -1
  280. package/dist/ionic/{p-f2c21dae.system.js → p-a0d7bb5e.system.js} +1 -1
  281. package/dist/ionic/{p-82045bc1.entry.js → p-a3277a67.entry.js} +1 -1
  282. package/dist/ionic/{p-50880712.entry.js → p-a9978d08.entry.js} +1 -1
  283. package/dist/ionic/{p-3b686a65.system.entry.js → p-ada96dd0.system.entry.js} +1 -1
  284. package/dist/ionic/p-afd6ca9d.entry.js +4 -0
  285. package/dist/ionic/p-b56d0866.system.entry.js +4 -0
  286. package/dist/ionic/{p-67da080d.entry.js → p-b6f9d32a.entry.js} +1 -1
  287. package/dist/ionic/p-c61cc894.js +4 -0
  288. package/dist/ionic/{p-304383f9.system.js → p-cabad15b.system.js} +1 -1
  289. package/dist/ionic/{p-31158892.js → p-cdbeaadc.js} +1 -1
  290. package/dist/ionic/p-d032f825.system.entry.js +4 -0
  291. package/dist/ionic/p-d51674c5.system.js +4 -0
  292. package/dist/ionic/{p-98d82c73.system.js → p-ddbb2d5b.system.js} +1 -1
  293. package/dist/ionic/p-de6f8b28.system.js +4 -0
  294. package/dist/ionic/p-de756e5c.js +4 -0
  295. package/dist/ionic/{p-73ea8f82.system.entry.js → p-dee7c1d0.system.entry.js} +1 -1
  296. package/dist/ionic/p-dfd9432a.entry.js +4 -0
  297. package/dist/ionic/{p-af5cfad2.system.js → p-e24ce1e5.system.js} +1 -1
  298. package/dist/ionic/p-e3584231.system.js +1 -1
  299. package/dist/ionic/p-f0445d82.system.entry.js +4 -0
  300. package/dist/ionic/p-f656e032.system.entry.js +4 -0
  301. package/dist/ionic/{p-17f893be.js → p-f70970cf.js} +1 -1
  302. package/dist/ionic/{p-e553006f.system.entry.js → p-fba0a6e7.system.entry.js} +1 -1
  303. package/dist/ionic/p-feae5133.entry.js +4 -0
  304. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  305. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +7 -0
  306. package/dist/types/components/input/input.d.ts +2 -0
  307. package/dist/types/components/radio/radio.d.ts +1 -0
  308. package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
  309. package/dist/types/components/radio-group/radio-group.d.ts +8 -1
  310. package/dist/types/components/range/range.d.ts +1 -0
  311. package/dist/types/components/router/router.d.ts +2 -1
  312. package/dist/types/components/select/select.d.ts +6 -1
  313. package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
  314. package/dist/types/components/textarea/textarea.d.ts +2 -0
  315. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  316. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  317. package/dist/types/components/toast/toast-interface.d.ts +2 -0
  318. package/dist/types/components/toast/toast.d.ts +28 -1
  319. package/dist/types/components/toggle/toggle.d.ts +1 -0
  320. package/dist/types/components.d.ts +37 -6
  321. package/dist/types/interface.d.ts +1 -5
  322. package/dist/types/jest.d.ts +5 -0
  323. package/dist/types/utils/animation/animation-interface.d.ts +4 -4
  324. package/dist/types/utils/browser/index.d.ts +11 -2
  325. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  326. package/dist/types/utils/forms/index.d.ts +1 -0
  327. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  328. package/dist/types/utils/overlays.d.ts +1 -0
  329. package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
  330. package/hydrate/index.js +643 -184
  331. package/package.json +1 -1
  332. package/dist/cjs/index-306a7476.js +0 -32
  333. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  334. package/dist/esm/index-7a14ecec.js +0 -29
  335. package/dist/esm-es5/index-80492ed3.js +0 -4
  336. package/dist/esm-es5/input-shims-0a2e541d.js +0 -4
  337. package/dist/esm-es5/input.utils-2846d430.js +0 -4
  338. package/dist/esm-es5/md.transition-94ac93e1.js +0 -4
  339. package/dist/ionic/p-1d17219f.entry.js +0 -4
  340. package/dist/ionic/p-232d1f22.entry.js +0 -4
  341. package/dist/ionic/p-25b32c3d.entry.js +0 -4
  342. package/dist/ionic/p-2ab4e925.system.entry.js +0 -4
  343. package/dist/ionic/p-2d5aeccc.js +0 -4
  344. package/dist/ionic/p-2d600c25.system.js +0 -4
  345. package/dist/ionic/p-308e1341.js +0 -4
  346. package/dist/ionic/p-32303650.system.entry.js +0 -4
  347. package/dist/ionic/p-34c39c48.entry.js +0 -4
  348. package/dist/ionic/p-3c58a71b.js +0 -4
  349. package/dist/ionic/p-3e960213.system.entry.js +0 -4
  350. package/dist/ionic/p-3fd26bd6.system.entry.js +0 -4
  351. package/dist/ionic/p-3fe96156.system.js +0 -4
  352. package/dist/ionic/p-42ba3902.entry.js +0 -4
  353. package/dist/ionic/p-4a31c99f.entry.js +0 -4
  354. package/dist/ionic/p-5a68960f.entry.js +0 -4
  355. package/dist/ionic/p-6470b136.entry.js +0 -4
  356. package/dist/ionic/p-6c37f051.js +0 -4
  357. package/dist/ionic/p-7b8d0af2.system.entry.js +0 -4
  358. package/dist/ionic/p-7faba551.system.entry.js +0 -4
  359. package/dist/ionic/p-83af3685.system.js +0 -4
  360. package/dist/ionic/p-856c430d.js +0 -4
  361. package/dist/ionic/p-93000a81.system.entry.js +0 -4
  362. package/dist/ionic/p-98b14ece.entry.js +0 -4
  363. package/dist/ionic/p-990ffd0e.js +0 -4
  364. package/dist/ionic/p-a6f9dd7b.entry.js +0 -4
  365. package/dist/ionic/p-a98dc0c1.entry.js +0 -4
  366. package/dist/ionic/p-a9e3b5be.system.entry.js +0 -4
  367. package/dist/ionic/p-ab9456e9.system.entry.js +0 -4
  368. package/dist/ionic/p-b4bad293.system.entry.js +0 -4
  369. package/dist/ionic/p-c3289ef2.entry.js +0 -4
  370. package/dist/ionic/p-c3d09cf2.system.entry.js +0 -4
  371. package/dist/ionic/p-d1cb29a8.system.entry.js +0 -4
  372. package/dist/ionic/p-d43f1f3d.system.js +0 -4
  373. package/dist/ionic/p-d662d908.js +0 -4
  374. package/dist/ionic/p-d9695ad9.system.js +0 -4
  375. package/dist/ionic/p-e4d90573.js +0 -4
  376. package/dist/ionic/p-f54c72b0.system.js +0 -4
  377. package/dist/ionic/p-f7a36cd0.system.js +0 -4
  378. package/dist/ionic/p-f967631d.js +0 -4
  379. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  380. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  381. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
@@ -63,17 +63,24 @@
63
63
  font-family: var(--ion-font-family, inherit);
64
64
  font-size: inherit;
65
65
  text-overflow: ellipsis;
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ :host-context(.item-legacy) {
66
70
  white-space: nowrap;
67
71
  overflow: hidden;
68
- box-sizing: border-box;
72
+ }
73
+
74
+ :host-context(.item:not(.item-input):not(.item-legacy)) {
75
+ flex-grow: 1;
69
76
  }
70
77
 
71
78
  :host(.ion-color) {
72
79
  color: var(--ion-color-base);
73
80
  }
74
81
 
75
- :host(.ion-text-wrap) {
76
- white-space: normal;
82
+ :host(.ion-text-nowrap) {
83
+ overflow: hidden;
77
84
  }
78
85
 
79
86
  :host-context(.item-interactive-disabled:not(.item-multiple-inputs)) {
@@ -92,6 +99,10 @@
92
99
  align-self: baseline;
93
100
  }
94
101
 
102
+ :host-context(.item-skeleton-text) {
103
+ overflow: hidden;
104
+ }
105
+
95
106
  :host(.label-fixed) {
96
107
  flex: 0 0 100px;
97
108
  width: 100px;
@@ -63,17 +63,24 @@
63
63
  font-family: var(--ion-font-family, inherit);
64
64
  font-size: inherit;
65
65
  text-overflow: ellipsis;
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ :host-context(.item-legacy) {
66
70
  white-space: nowrap;
67
71
  overflow: hidden;
68
- box-sizing: border-box;
72
+ }
73
+
74
+ :host-context(.item:not(.item-input):not(.item-legacy)) {
75
+ flex-grow: 1;
69
76
  }
70
77
 
71
78
  :host(.ion-color) {
72
79
  color: var(--ion-color-base);
73
80
  }
74
81
 
75
- :host(.ion-text-wrap) {
76
- white-space: normal;
82
+ :host(.ion-text-nowrap) {
83
+ overflow: hidden;
77
84
  }
78
85
 
79
86
  :host-context(.item-interactive-disabled:not(.item-multiple-inputs)) {
@@ -92,6 +99,10 @@
92
99
  align-self: baseline;
93
100
  }
94
101
 
102
+ :host-context(.item-skeleton-text) {
103
+ overflow: hidden;
104
+ }
105
+
95
106
  :host(.label-fixed) {
96
107
  flex: 0 0 100px;
97
108
  width: 100px;
@@ -5,6 +5,7 @@ import { getTimeGivenProgression } from "../../../utils/animation/cubic-bezier";
5
5
  import { isIonContent, findClosestIonContent, disableContentScrollY, resetContentScrollY } from "../../../utils/content/index";
6
6
  import { createGesture } from "../../../utils/gesture/index";
7
7
  import { clamp, getElementRoot } from "../../../utils/helpers";
8
+ import { OVERLAY_GESTURE_PRIORITY } from "../../../utils/overlays";
8
9
  import { setCardStatusBarDark, setCardStatusBarDefault } from "../utils";
9
10
  import { calculateSpringStep, handleCanDismiss } from "./utils";
10
11
  // Defaults for the card swipe animation
@@ -250,7 +251,7 @@ export const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismi
250
251
  const gesture = createGesture({
251
252
  el,
252
253
  gestureName: 'modalSwipeToClose',
253
- gesturePriority: 39,
254
+ gesturePriority: OVERLAY_GESTURE_PRIORITY,
254
255
  direction: 'y',
255
256
  threshold: 10,
256
257
  canStart,
@@ -48,5 +48,48 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
48
48
  const note = page.locator('ion-note');
49
49
  await expect(note).toHaveScreenshot(screenshot(`note-item-divider-scale`));
50
50
  });
51
+ test('should wrap label to the next line without truncating', async ({ page }) => {
52
+ await page.setContent(`
53
+ <style>
54
+ html {
55
+ font-size: 310%;
56
+ }
57
+ </style>
58
+
59
+ <ion-list>
60
+ <ion-item>
61
+ <ion-note slot="start">Really really long note</ion-note>
62
+ <ion-label>Label</ion-label>
63
+ </ion-item>
64
+
65
+ <ion-item>
66
+ <ion-label>Label</ion-label>
67
+ <ion-note slot="end">Really really long note</ion-note>
68
+ </ion-item>
69
+
70
+ <ion-item>
71
+ <ion-note slot="start">Note</ion-note>
72
+ <ion-label>Really really long label</ion-label>
73
+ </ion-item>
74
+
75
+ <ion-item>
76
+ <ion-label>Really really long label</ion-label>
77
+ <ion-note slot="end">Note</ion-note>
78
+ </ion-item>
79
+
80
+ <ion-item>
81
+ <ion-note slot="start">Really really long note</ion-note>
82
+ <ion-label>Really really long label</ion-label>
83
+ </ion-item>
84
+
85
+ <ion-item>
86
+ <ion-label>Really really long label</ion-label>
87
+ <ion-note slot="end">Really really long note</ion-note>
88
+ </ion-item>
89
+ </ion-list>
90
+ `, config);
91
+ const list = page.locator('ion-list');
92
+ await expect(list).toHaveScreenshot(screenshot(`note-wrapping-label-scale`));
93
+ });
51
94
  });
52
95
  });
@@ -186,12 +186,6 @@ input {
186
186
  }
187
187
 
188
188
  .label-text-wrapper {
189
- /**
190
- * This ensures that double tapping this text
191
- * clicks the <label> and focuses the radio
192
- * when a screen reader is enabled.
193
- */
194
- pointer-events: none;
195
189
  text-overflow: ellipsis;
196
190
  white-space: nowrap;
197
191
  overflow: hidden;
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Host, h } from "@stencil/core";
5
- import { createLegacyFormController } from "../../utils/forms/index";
5
+ import { createLegacyFormController, isOptionSelected } from "../../utils/forms/index";
6
6
  import { addEventListener, getAriaLabel, removeEventListener } from "../../utils/helpers";
7
7
  import { printIonWarning } from "../../utils/logging/index";
8
8
  import { createColorClasses, hostContext } from "../../utils/theme";
@@ -13,6 +13,7 @@ import { getIonMode } from "../../global/ionic-global";
13
13
  * @slot - The label text to associate with the radio. Use the "labelPlacement" property to control where the label is placed relative to the radio.
14
14
  *
15
15
  * @part container - The container for the radio mark.
16
+ * @part label - The label text describing the radio.
16
17
  * @part mark - The checkmark or dot used to indicate the checked state.
17
18
  */
18
19
  export class Radio {
@@ -23,7 +24,8 @@ export class Radio {
23
24
  this.hasLoggedDeprecationWarning = false;
24
25
  this.updateState = () => {
25
26
  if (this.radioGroup) {
26
- this.checked = this.radioGroup.value === this.value;
27
+ const { compareWith, value: radioGroupValue } = this.radioGroup;
28
+ this.checked = isOptionSelected(radioGroupValue, this.value, compareWith);
27
29
  }
28
30
  };
29
31
  this.onClick = () => {
@@ -120,6 +122,8 @@ export class Radio {
120
122
  emitStyle() {
121
123
  const style = {
122
124
  'interactive-disabled': this.disabled,
125
+ // TODO(FW-3125): remove this
126
+ legacy: !!this.legacy,
123
127
  };
124
128
  if (this.legacyFormController.hasLegacyControl()) {
125
129
  style['radio-checked'] = this.checked;
@@ -154,7 +158,7 @@ export class Radio {
154
158
  }), role: "radio", "aria-checked": checked ? 'true' : 'false', "aria-disabled": disabled ? 'true' : null, tabindex: buttonTabindex }, h("label", { class: "radio-wrapper" }, h("div", { class: {
155
159
  'label-text-wrapper': true,
156
160
  'label-text-wrapper-hidden': !hasLabel,
157
- } }, h("slot", null)), h("div", { class: "native-wrapper" }, this.renderRadioControl()))));
161
+ }, part: "label" }, h("slot", null)), h("div", { class: "native-wrapper" }, this.renderRadioControl()))));
158
162
  }
159
163
  renderLegacyRadio() {
160
164
  if (!this.hasLoggedDeprecationWarning) {
@@ -186,12 +186,6 @@ input {
186
186
  }
187
187
 
188
188
  .label-text-wrapper {
189
- /**
190
- * This ensures that double tapping this text
191
- * clicks the <label> and focuses the radio
192
- * when a screen reader is enabled.
193
- */
194
- pointer-events: none;
195
189
  text-overflow: ellipsis;
196
190
  white-space: nowrap;
197
191
  overflow: hidden;
@@ -25,6 +25,20 @@ describe('ion-radio', () => {
25
25
  await page.waitForChanges();
26
26
  expect(radio.classList.contains('radio-checked')).toBe(true);
27
27
  });
28
+ it('should render the radio with shadow parts', async () => {
29
+ const page = await newSpecPage({
30
+ components: [Radio, RadioGroup],
31
+ html: `
32
+ <ion-radio-group>
33
+ <ion-radio value="value"></ion-radio>
34
+ </ion-radio-group>
35
+ `,
36
+ });
37
+ const radio = page.body.querySelector('ion-radio');
38
+ expect(radio).toHaveShadowPart('container');
39
+ expect(radio).toHaveShadowPart('label');
40
+ expect(radio).toHaveShadowPart('mark');
41
+ });
28
42
  });
29
43
  describe('ion-radio: disabled', () => {
30
44
  it('clicking disabled radio should not set checked state', async () => {
@@ -47,6 +47,7 @@ export class RadioGroup {
47
47
  }
48
48
  };
49
49
  this.allowEmptySelection = false;
50
+ this.compareWith = undefined;
50
51
  this.name = this.inputId;
51
52
  this.value = undefined;
52
53
  }
@@ -167,6 +168,29 @@ export class RadioGroup {
167
168
  "reflect": false,
168
169
  "defaultValue": "false"
169
170
  },
171
+ "compareWith": {
172
+ "type": "string",
173
+ "mutable": false,
174
+ "complexType": {
175
+ "original": "string | RadioGroupCompareFn | null",
176
+ "resolved": "((currentValue: any, compareValue: any) => boolean) | null | string | undefined",
177
+ "references": {
178
+ "RadioGroupCompareFn": {
179
+ "location": "import",
180
+ "path": "./radio-group-interface",
181
+ "id": "src/components/radio-group/radio-group-interface.ts::RadioGroupCompareFn"
182
+ }
183
+ }
184
+ },
185
+ "required": false,
186
+ "optional": true,
187
+ "docs": {
188
+ "tags": [],
189
+ "text": "This property allows developers to specify a custom function or property\nname for comparing objects when determining the selected option in the\nion-radio-group. When not specified, the default behavior will use strict\nequality (===) for comparison."
190
+ },
191
+ "attribute": "compare-with",
192
+ "reflect": false
193
+ },
170
194
  "name": {
171
195
  "type": "string",
172
196
  "mutable": false,
@@ -0,0 +1,69 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { h } from "@stencil/core";
5
+ import { newSpecPage } from "@stencil/core/testing";
6
+ import { Radio } from "../../radio/radio";
7
+ import { RadioGroup } from "../radio-group";
8
+ describe('ion-radio-group', () => {
9
+ it('should correctly set value when using compareWith string', async () => {
10
+ const page = await newSpecPage({
11
+ components: [Radio, RadioGroup],
12
+ template: () => (h("ion-radio-group", { compareWith: "value", value: { label: 'Blue', value: 'blue' } }, h("ion-radio", { value: { label: 'Red', value: 'red' } }, "Red"), h("ion-radio", { value: { label: 'Blue', value: 'blue' } }, "Blue"), h("ion-radio", { value: { label: 'Green', value: 'green' } }, "Green"))),
13
+ });
14
+ const radioGroup = page.body.querySelector('ion-radio-group');
15
+ const radios = document.querySelectorAll('ion-radio');
16
+ await radios[2].click();
17
+ await page.waitForChanges();
18
+ expect(radios[2].getAttribute('aria-checked')).toBe('true');
19
+ expect(radioGroup.value).toEqual({
20
+ label: 'Green',
21
+ value: 'green',
22
+ });
23
+ });
24
+ it('should correctly set value when using compareWith function', async () => {
25
+ const page = await newSpecPage({
26
+ components: [Radio, RadioGroup],
27
+ template: () => (h("ion-radio-group", { value: { label: 'Blue', value: 'blue' } }, h("ion-radio", { value: { label: 'Red', value: 'red' } }, "Red"), h("ion-radio", { value: { label: 'Blue', value: 'blue' } }, "Blue"), h("ion-radio", { value: { label: 'Green', value: 'green' } }, "Green"))),
28
+ });
29
+ const radioGroup = page.body.querySelector('ion-radio-group');
30
+ const radios = document.querySelectorAll('ion-radio');
31
+ radioGroup.compareWith = (a, b) => a.value === b.value;
32
+ await radios[2].click();
33
+ await page.waitForChanges();
34
+ expect(radios[2].getAttribute('aria-checked')).toBe('true');
35
+ expect(radioGroup.value).toEqual({
36
+ label: 'Green',
37
+ value: 'green',
38
+ });
39
+ });
40
+ it('should correctly set value when using compareWith null', async () => {
41
+ const page = await newSpecPage({
42
+ components: [RadioGroup, Radio],
43
+ template: () => (h("ion-radio-group", { compareWith: null, value: "blue" }, h("ion-radio", { value: "red" }, "Red"), h("br", null), h("ion-radio", { value: "blue" }, "Blue"), h("br", null), h("ion-radio", { value: "green" }, "Green"))),
44
+ });
45
+ const radioGroup = page.body.querySelector('ion-radio-group');
46
+ const radios = document.querySelectorAll('ion-radio');
47
+ await radios[2].click();
48
+ await page.waitForChanges();
49
+ expect(radios[2].getAttribute('aria-checked')).toBe('true');
50
+ expect(radioGroup.value).toEqual('green');
51
+ });
52
+ it('should work with different parameter types', async () => {
53
+ const page = await newSpecPage({
54
+ components: [Radio, RadioGroup],
55
+ template: () => (h("ion-radio-group", { value: 2 }, h("ion-radio", { value: 1 }, "Option #1"), h("ion-radio", { value: 2 }, "Option #2"), h("ion-radio", { value: 3 }, "Option #3"))),
56
+ });
57
+ const radioGroup = page.body.querySelector('ion-radio-group');
58
+ radioGroup.compareWith = (val1, val2) => {
59
+ // convert val1 to a number
60
+ return +val1 === val2;
61
+ };
62
+ const radios = document.querySelectorAll('ion-radio');
63
+ await expect(radios[1].getAttribute('aria-checked')).toBe('true');
64
+ await radios[2].click();
65
+ await page.waitForChanges();
66
+ expect(radios[2].getAttribute('aria-checked')).toBe('true');
67
+ expect(radioGroup.value).toEqual(3);
68
+ });
69
+ });
@@ -325,12 +325,6 @@
325
325
  * would not be able to see the range.
326
326
  */
327
327
  max-width: 200px;
328
- /**
329
- * This ensures that double tapping this text
330
- * clicks the <label> and focuses the range
331
- * when a screen reader is enabled.
332
- */
333
- pointer-events: none;
334
328
  text-overflow: ellipsis;
335
329
  white-space: nowrap;
336
330
  overflow: hidden;
@@ -24,6 +24,7 @@ import { roundToMaxDecimalPlaces } from "../../utils/floating-point";
24
24
  * @part knob - The handle that is used to drag the range.
25
25
  * @part bar - The inactive part of the bar.
26
26
  * @part bar-active - The active part of the bar.
27
+ * @part label - The label text describing the range.
27
28
  */
28
29
  export class Range {
29
30
  constructor() {
@@ -226,6 +227,8 @@ export class Range {
226
227
  this.ionStyle.emit({
227
228
  interactive: true,
228
229
  'interactive-disabled': this.disabled,
230
+ // TODO(FW-2997): remove this
231
+ legacy: !!this.legacy,
229
232
  });
230
233
  }
231
234
  }
@@ -414,7 +417,7 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
414
417
  }) }, h("label", { class: "range-wrapper", id: "range-label" }, h("div", { class: {
415
418
  'label-text-wrapper': true,
416
419
  'label-text-wrapper-hidden': !hasLabel,
417
- } }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { class: "native-wrapper" }, h("slot", { name: "start" }), this.renderRangeSlider(), h("slot", { name: "end" })))));
420
+ }, part: "label" }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { class: "native-wrapper" }, h("slot", { name: "start" }), this.renderRangeSlider(), h("slot", { name: "end" })))));
418
421
  }
419
422
  get hasLabel() {
420
423
  return this.label !== undefined || this.el.querySelector('[slot="label"]') !== null;
@@ -325,12 +325,6 @@
325
325
  * would not be able to see the range.
326
326
  */
327
327
  max-width: 200px;
328
- /**
329
- * This ensures that double tapping this text
330
- * clicks the <label> and focuses the range
331
- * when a screen reader is enabled.
332
- */
333
- pointer-events: none;
334
328
  text-overflow: ellipsis;
335
329
  white-space: nowrap;
336
330
  overflow: hidden;
@@ -202,4 +202,20 @@ describe('range: item adjustments', () => {
202
202
  expect(range.classList.contains('range-item-start-adjustment')).toBe(false);
203
203
  expect(range.classList.contains('range-item-end-adjustment')).toBe(false);
204
204
  });
205
+ describe('shadow parts', () => {
206
+ it('should have shadow parts', async () => {
207
+ const page = await newSpecPage({
208
+ components: [Range],
209
+ html: `<ion-range pin="true" snaps="true" value="50" label="Label"></ion-range>`,
210
+ });
211
+ const range = page.body.querySelector('ion-range');
212
+ expect(range).toHaveShadowPart('label');
213
+ expect(range).toHaveShadowPart('pin');
214
+ expect(range).toHaveShadowPart('knob');
215
+ expect(range).toHaveShadowPart('bar');
216
+ expect(range).toHaveShadowPart('bar-active');
217
+ expect(range).toHaveShadowPart('tick');
218
+ expect(range).toHaveShadowPart('tick-active');
219
+ });
220
+ });
205
221
  });
@@ -132,6 +132,10 @@
132
132
  overflow: hidden;
133
133
  }
134
134
 
135
+ :host(.in-item:not(.legacy-select)) {
136
+ flex: 1 1 0;
137
+ }
138
+
135
139
  :host(.in-item.legacy-select) {
136
140
  position: static;
137
141
  max-width: 45%;
@@ -232,6 +236,12 @@ button {
232
236
  margin-top: 0;
233
237
  margin-bottom: 0;
234
238
  position: relative;
239
+ /**
240
+ * Prevent the icon from shrinking when the label and/or
241
+ * selected item text is long enough to fill the rest of
242
+ * the container.
243
+ */
244
+ flex-shrink: 0;
235
245
  }
236
246
 
237
247
  /**
@@ -315,6 +325,23 @@ button {
315
325
  transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
316
326
  }
317
327
 
328
+ .select-wrapper-inner {
329
+ display: flex;
330
+ align-items: center;
331
+ overflow: hidden;
332
+ }
333
+
334
+ :host(.select-label-placement-stacked) .select-wrapper-inner,
335
+ :host(.select-label-placement-floating) .select-wrapper-inner {
336
+ /**
337
+ * When using a stacked/floating label, the inner wrapper is
338
+ * stacked vertically under the label container. This line
339
+ * ensures that the inner wrapper fills all the remaining height
340
+ * of the component.
341
+ */
342
+ flex-grow: 1;
343
+ }
344
+
318
345
  :host(.ion-touched.ion-invalid) {
319
346
  --highlight-color: var(--highlight-color-invalid);
320
347
  }
@@ -555,11 +582,23 @@ button {
555
582
  * The placeholder should be hidden when the label
556
583
  * is on top of the select. This prevents the label
557
584
  * from overlapping any placeholder value.
585
+ *
586
+ * TODO(FW-5592): Remove :not(.label-floating) piece
558
587
  */
559
- :host(.select-label-placement-floating) .native-wrapper .select-placeholder {
588
+ :host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder {
560
589
  opacity: 0;
561
590
  }
562
591
 
592
+ /**
593
+ * We don't use .label-floating here because that would
594
+ * also include the case where the label is floating due
595
+ * to content in the start/end slot. We want the opacity
596
+ * to remain at the default in this case, since the select
597
+ * isn't being actively interacted with.
598
+ *
599
+ * TODO(FW-5592): Change entire selector to:
600
+ * :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder
601
+ */
563
602
  :host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,
564
603
  :host(.ion-focused.select-label-placement-floating) .native-wrapper .select-placeholder,
565
604
  :host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder {
@@ -569,10 +608,7 @@ button {
569
608
  /**
570
609
  * This makes the label sit above the input.
571
610
  */
572
- :host(.select-label-placement-stacked) .label-text-wrapper,
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 {
611
+ :host(.label-floating) .label-text-wrapper {
576
612
  transform: translateY(50%) scale(0.75);
577
613
  /**
578
614
  * Label text should not extend
@@ -581,6 +617,23 @@ button {
581
617
  max-width: calc(100% / 0.75);
582
618
  }
583
619
 
620
+ ::slotted([slot=start]), ::slotted([slot=end]) {
621
+ /**
622
+ * Prevent the slots from shrinking when the label and/or
623
+ * selected item text is long enough to fill the rest of
624
+ * the container.
625
+ */
626
+ flex-shrink: 0;
627
+ }
628
+
629
+ ::slotted([slot=start]) {
630
+ margin-inline-end: 16px;
631
+ }
632
+
633
+ ::slotted([slot=end]) {
634
+ margin-inline-start: 16px;
635
+ }
636
+
584
637
  /**
585
638
  * Convert a font size to a dynamic font size.
586
639
  * Fonts that participate in Dynamic Type should use
@@ -704,8 +757,8 @@ button {
704
757
  color: var(--ion-color-step-650, #595959);
705
758
  }
706
759
 
707
- :host(.select-label-placement-stacked) .native-wrapper,
708
- :host(.select-label-placement-floating) .native-wrapper {
760
+ :host(.select-label-placement-stacked) .select-wrapper-inner,
761
+ :host(.select-label-placement-floating) .select-wrapper-inner {
709
762
  width: calc(100% - 1.125rem - 4px);
710
763
  }
711
764