@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.
Files changed (511) hide show
  1. package/components/animation.js +12 -11
  2. package/components/backdrop.js +12 -0
  3. package/components/checkbox.js +2 -0
  4. package/components/data.js +1 -1
  5. package/components/gesture-controller.js +1 -1
  6. package/components/index4.js +10 -12
  7. package/components/index5.js +0 -22
  8. package/components/input-shims.js +12 -7
  9. package/components/input.utils.js +3 -2
  10. package/components/ion-content.js +1 -1
  11. package/components/ion-datetime.js +61 -28
  12. package/components/ion-input.js +31 -8
  13. package/components/ion-modal.js +2 -2
  14. package/components/ion-picker-column-internal.d.ts +11 -0
  15. package/components/ion-picker-column-internal.js +9 -0
  16. package/components/ion-picker-column.js +2 -2
  17. package/components/{ion-picker-legacy.d.ts → ion-picker-internal.d.ts} +4 -4
  18. package/components/ion-picker-internal.js +9 -0
  19. package/components/ion-picker.js +299 -1
  20. package/components/ion-range.js +2 -0
  21. package/components/ion-select.js +44 -29
  22. package/components/ion-skeleton-text.js +14 -1
  23. package/components/ion-textarea.js +30 -7
  24. package/components/ion-toast.js +419 -74
  25. package/components/ion-toggle.js +2 -0
  26. package/components/item.js +2 -2
  27. package/components/label.js +2 -2
  28. package/components/overlays.js +6 -12
  29. package/components/picker-column-internal.js +390 -0
  30. package/components/picker-column.js +320 -331
  31. package/components/{picker.js → picker-internal.js} +16 -16
  32. package/components/radio-group.js +2 -0
  33. package/components/radio.js +42 -2
  34. package/dist/cjs/{animation-1083855c.js → animation-d101aa7a.js} +13 -12
  35. package/dist/cjs/{button-active-cd07b55b.js → button-active-ba107e4e.js} +2 -2
  36. package/dist/cjs/{capacitor-2ffba62a.js → capacitor-f68447d3.js} +1 -1
  37. package/dist/cjs/compare-with-utils-c0444525.js +44 -0
  38. package/dist/cjs/{data-4845b494.js → data-c8d21093.js} +1 -1
  39. package/dist/cjs/{gesture-controller-d6a3f907.js → gesture-controller-b46721be.js} +0 -1
  40. package/dist/cjs/{haptic-678abc9f.js → haptic-a74c2767.js} +1 -1
  41. package/dist/cjs/{index-0f8b33f8.js → index-0ee995e4.js} +1 -1
  42. package/dist/cjs/{index-d7561763.js → index-4f0c67e1.js} +11 -13
  43. package/dist/cjs/{index-573877f3.js → index-56d41f51.js} +2 -2
  44. package/dist/cjs/index-c8d52405.js +10 -0
  45. package/dist/cjs/{index-9f379eaa.js → index-e9634bc9.js} +1 -1
  46. package/dist/cjs/index.cjs.js +10 -10
  47. package/dist/cjs/{input-shims-b0a75a01.js → input-shims-3e3f35b9.js} +15 -10
  48. package/dist/cjs/{input.utils-0fe3097c.js → input.utils-bdb6953c.js} +4 -3
  49. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  50. package/dist/cjs/ion-alert.cjs.entry.js +8 -8
  51. package/dist/cjs/ion-app_8.cjs.entry.js +10 -10
  52. package/dist/cjs/ion-backdrop.cjs.entry.js +12 -0
  53. package/dist/cjs/ion-checkbox.cjs.entry.js +2 -0
  54. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  55. package/dist/cjs/ion-datetime_3.cjs.entry.js +43 -30
  56. package/dist/cjs/ion-input.cjs.entry.js +34 -11
  57. package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
  58. package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
  59. package/dist/cjs/ion-loading.cjs.entry.js +3 -4
  60. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  61. package/dist/cjs/ion-modal.cjs.entry.js +10 -10
  62. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  63. package/dist/cjs/{ion-picker-column.cjs.entry.js → ion-picker-column-internal.cjs.entry.js} +12 -12
  64. package/dist/cjs/{ion-picker.cjs.entry.js → ion-picker-internal.cjs.entry.js} +13 -13
  65. package/dist/cjs/ion-popover.cjs.entry.js +4 -5
  66. package/dist/cjs/ion-radio_2.cjs.entry.js +6 -1
  67. package/dist/cjs/ion-range.cjs.entry.js +3 -1
  68. package/dist/cjs/ion-refresher_2.cjs.entry.js +7 -7
  69. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  70. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  71. package/dist/cjs/ion-select_3.cjs.entry.js +51 -36
  72. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  73. package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
  74. package/dist/cjs/ion-toast.cjs.entry.js +434 -93
  75. package/dist/cjs/ion-toggle.cjs.entry.js +6 -4
  76. package/dist/cjs/ionic.cjs.js +1 -1
  77. package/dist/cjs/{ios.transition-ac909bc8.js → ios.transition-f4caf640.js} +3 -3
  78. package/dist/cjs/{keyboard-fd7db491.js → keyboard-43df0428.js} +1 -1
  79. package/dist/cjs/{keyboard-38f2bb7b.js → keyboard-840107b3.js} +3 -3
  80. package/dist/cjs/{keyboard-controller-50beb83a.js → keyboard-controller-019f42df.js} +2 -2
  81. package/dist/cjs/loader.cjs.js +1 -1
  82. package/dist/cjs/{md.transition-907af519.js → md.transition-33331e93.js} +3 -3
  83. package/dist/cjs/{notch-controller-f4f6af5d.js → notch-controller-c22d1344.js} +1 -1
  84. package/dist/cjs/{overlays-dbb71984.js → overlays-4d8897dc.js} +7 -12
  85. package/dist/cjs/{swipe-back-a6dc6e5d.js → swipe-back-d0412fb6.js} +2 -2
  86. package/dist/collection/collection-manifest.json +6 -7
  87. package/dist/collection/components/backdrop/backdrop.js +12 -0
  88. package/dist/collection/components/checkbox/checkbox.js +2 -0
  89. package/dist/collection/components/content/content.css +4 -0
  90. package/dist/collection/components/datetime/datetime.ios.css +26 -84
  91. package/dist/collection/components/datetime/datetime.js +29 -14
  92. package/dist/collection/components/datetime/datetime.md.css +26 -89
  93. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  94. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +9 -6
  95. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +0 -10
  96. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  97. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +5 -5
  98. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  99. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +2 -2
  100. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  101. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
  102. package/dist/collection/components/datetime/test/values/datetime.e2e.js +5 -5
  103. package/dist/collection/components/datetime/utils/data.js +1 -1
  104. package/dist/collection/components/input/input.ios.css +10 -3
  105. package/dist/collection/components/input/input.js +31 -6
  106. package/dist/collection/components/input/input.md.css +13 -12
  107. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  108. package/dist/collection/components/item/item.ios.css +25 -3
  109. package/dist/collection/components/item/item.md.css +25 -3
  110. package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
  111. package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
  112. package/dist/collection/components/label/label.ios.css +14 -3
  113. package/dist/collection/components/label/label.md.css +14 -3
  114. package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
  115. package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
  116. package/dist/collection/components/picker/picker.ios.css +205 -100
  117. package/dist/collection/components/picker/picker.js +735 -463
  118. package/dist/collection/components/picker/picker.md.css +194 -98
  119. package/dist/collection/components/picker/test/basic/picker.e2e.js +13 -106
  120. package/dist/collection/components/{picker-legacy → picker}/test/is-open/picker.e2e.js +4 -4
  121. package/dist/collection/components/{picker-legacy → picker}/test/picker-id.spec.js +5 -5
  122. package/dist/collection/components/{picker-legacy → picker}/test/trigger/picker.e2e.js +1 -1
  123. package/dist/collection/components/picker-column/picker-column.ios.css +176 -59
  124. package/dist/collection/components/picker-column/picker-column.js +333 -478
  125. package/dist/collection/components/picker-column/picker-column.md.css +113 -63
  126. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-aria.spec.js +3 -3
  127. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-dynamic.spec.js +2 -2
  128. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column.spec.js +2 -2
  129. package/dist/collection/components/{picker-legacy-column → picker-column}/test/standalone/picker-column.e2e.js +3 -3
  130. package/dist/collection/components/picker-column-internal/picker-column-internal.ios.css +138 -0
  131. package/dist/collection/components/picker-column-internal/picker-column-internal.js +565 -0
  132. package/dist/collection/components/{picker-legacy-column/picker-column.md.css → picker-column-internal/picker-column-internal.md.css} +63 -113
  133. package/dist/collection/components/{picker-column/test/basic/picker-column.e2e.js → picker-column-internal/test/basic/picker-column-internal.e2e.js} +7 -7
  134. package/dist/collection/components/{picker-column/test/disabled/picker-column.e2e.js → picker-column-internal/test/disabled/picker-column-internal.e2e.js} +39 -39
  135. package/dist/collection/components/{picker-legacy/picker.md.css → picker-internal/picker-internal.ios.css} +100 -192
  136. package/dist/collection/components/picker-internal/picker-internal.js +544 -0
  137. package/dist/collection/components/{picker-legacy-column/picker-column.ios.css → picker-internal/picker-internal.md.css} +101 -98
  138. package/dist/collection/components/{picker/test/a11y/picker.e2e.js → picker-internal/test/a11y/picker-internal.e2e.js} +2 -2
  139. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +118 -0
  140. package/dist/collection/components/{picker/test/keyboard-entry/picker.e2e.js → picker-internal/test/keyboard-entry/picker-internal.e2e.js} +20 -20
  141. package/dist/collection/components/radio/radio.js +5 -2
  142. package/dist/collection/components/radio-group/radio-group.js +24 -0
  143. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  144. package/dist/collection/components/range/range.js +2 -0
  145. package/dist/collection/components/select/select.ios.css +61 -7
  146. package/dist/collection/components/select/select.js +45 -28
  147. package/dist/collection/components/select/select.md.css +64 -19
  148. package/dist/collection/components/select/test/label/select.e2e.js +1 -1
  149. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
  150. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  151. package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
  152. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  153. package/dist/collection/components/textarea/textarea.ios.css +37 -5
  154. package/dist/collection/components/textarea/textarea.js +30 -5
  155. package/dist/collection/components/textarea/textarea.md.css +47 -14
  156. package/dist/collection/components/toast/animations/ios.enter.js +2 -1
  157. package/dist/collection/components/toast/animations/md.enter.js +4 -3
  158. package/dist/collection/components/toast/animations/utils.js +20 -14
  159. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  160. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  161. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  162. package/dist/collection/components/toast/test/toast.spec.js +80 -0
  163. package/dist/collection/components/toast/toast.ios.css +10 -10
  164. package/dist/collection/components/toast/toast.js +104 -1
  165. package/dist/collection/components/toast/toast.md.css +10 -0
  166. package/dist/collection/components/toggle/toggle.js +2 -0
  167. package/dist/collection/utils/animation/animation.js +12 -11
  168. package/dist/collection/utils/animation/test/animation.spec.js +16 -0
  169. package/dist/collection/utils/browser/index.js +0 -22
  170. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  171. package/dist/collection/utils/forms/index.js +1 -0
  172. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  173. package/dist/collection/utils/input-shims/input-shims.js +12 -6
  174. package/dist/collection/utils/menu-controller/index.js +10 -12
  175. package/dist/collection/utils/overlays.js +5 -11
  176. package/dist/collection/utils/slot-mutation-controller.js +3 -2
  177. package/dist/docs.json +166 -385
  178. package/dist/esm/{animation-8aa13916.js → animation-cf3dd234.js} +13 -12
  179. package/dist/esm/{button-active-5b0516e7.js → button-active-47196c40.js} +2 -2
  180. package/dist/esm/{capacitor-b4979570.js → capacitor-f1f25364.js} +1 -1
  181. package/dist/esm/compare-with-utils-4928c09d.js +41 -0
  182. package/dist/esm/{data-12e24f00.js → data-44d9e816.js} +1 -1
  183. package/dist/esm/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
  184. package/dist/esm/{haptic-1243b917.js → haptic-1a66d69f.js} +1 -1
  185. package/dist/esm/{index-0aa6e61f.js → index-23c05a55.js} +11 -13
  186. package/dist/esm/{index-6a0ccabb.js → index-702b3cd3.js} +2 -2
  187. package/dist/esm/index-a5d50daf.js +7 -0
  188. package/dist/esm/{index-f0cc4e14.js → index-c9e82353.js} +1 -1
  189. package/dist/esm/{index-32cbee52.js → index-ff313b19.js} +2 -2
  190. package/dist/esm/index.js +10 -10
  191. package/dist/esm/{input-shims-d0c93e5d.js → input-shims-1d767845.js} +14 -9
  192. package/dist/esm/{input.utils-ec063df4.js → input.utils-2cf5e372.js} +4 -3
  193. package/dist/esm/ion-action-sheet.entry.js +8 -8
  194. package/dist/esm/ion-alert.entry.js +8 -8
  195. package/dist/esm/ion-app_8.entry.js +10 -10
  196. package/dist/esm/ion-backdrop.entry.js +12 -0
  197. package/dist/esm/ion-checkbox.entry.js +2 -0
  198. package/dist/esm/ion-datetime-button.entry.js +1 -1
  199. package/dist/esm/ion-datetime_3.entry.js +42 -29
  200. package/dist/esm/ion-input.entry.js +34 -11
  201. package/dist/esm/ion-item-option_3.entry.js +1 -1
  202. package/dist/esm/ion-item_8.entry.js +17 -4
  203. package/dist/esm/ion-loading.entry.js +3 -4
  204. package/dist/esm/ion-menu_3.entry.js +7 -7
  205. package/dist/esm/ion-modal.entry.js +10 -10
  206. package/dist/esm/ion-nav_2.entry.js +2 -2
  207. package/dist/esm/{ion-picker-column.entry.js → ion-picker-column-internal.entry.js} +12 -12
  208. package/dist/esm/{ion-picker.entry.js → ion-picker-internal.entry.js} +13 -13
  209. package/dist/esm/ion-popover.entry.js +4 -5
  210. package/dist/esm/ion-radio_2.entry.js +6 -1
  211. package/dist/esm/ion-range.entry.js +3 -1
  212. package/dist/esm/ion-refresher_2.entry.js +7 -7
  213. package/dist/esm/ion-reorder_2.entry.js +4 -4
  214. package/dist/esm/ion-segment_2.entry.js +1 -1
  215. package/dist/esm/ion-select_3.entry.js +47 -32
  216. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  217. package/dist/esm/ion-textarea.entry.js +33 -10
  218. package/dist/esm/ion-toast.entry.js +417 -76
  219. package/dist/esm/ion-toggle.entry.js +6 -4
  220. package/dist/esm/ionic.js +1 -1
  221. package/dist/esm/{ios.transition-1651c430.js → ios.transition-c3e77862.js} +3 -3
  222. package/dist/esm/{keyboard-b551279d.js → keyboard-9f771a04.js} +3 -3
  223. package/dist/esm/{keyboard-b063f012.js → keyboard-b6230bfb.js} +1 -1
  224. package/dist/esm/{keyboard-controller-0c2dce71.js → keyboard-controller-3f0faa10.js} +2 -2
  225. package/dist/esm/loader.js +1 -1
  226. package/dist/esm/{md.transition-66f18369.js → md.transition-1173eca9.js} +3 -3
  227. package/dist/esm/{notch-controller-8c9c0e54.js → notch-controller-3f79197e.js} +1 -1
  228. package/dist/esm/{overlays-789cd7a7.js → overlays-34169295.js} +7 -13
  229. package/dist/esm/{swipe-back-cc4c2bcb.js → swipe-back-0f3bfc8e.js} +2 -2
  230. package/dist/esm-es5/{animation-8aa13916.js → animation-cf3dd234.js} +1 -1
  231. package/dist/esm-es5/{button-active-5b0516e7.js → button-active-47196c40.js} +1 -1
  232. package/dist/esm-es5/{capacitor-b4979570.js → capacitor-f1f25364.js} +1 -1
  233. package/dist/esm-es5/compare-with-utils-4928c09d.js +4 -0
  234. package/dist/esm-es5/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
  235. package/dist/esm-es5/{haptic-1243b917.js → haptic-1a66d69f.js} +1 -1
  236. package/dist/esm-es5/index-23c05a55.js +4 -0
  237. package/dist/esm-es5/{index-6a0ccabb.js → index-702b3cd3.js} +1 -1
  238. package/dist/esm-es5/index-c9e82353.js +4 -0
  239. package/dist/esm-es5/{index-32cbee52.js → index-ff313b19.js} +1 -1
  240. package/dist/esm-es5/index.js +1 -1
  241. package/dist/esm-es5/input-shims-1d767845.js +4 -0
  242. package/dist/esm-es5/input.utils-2cf5e372.js +4 -0
  243. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  244. package/dist/esm-es5/ion-alert.entry.js +1 -1
  245. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  246. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  247. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  248. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  249. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  250. package/dist/esm-es5/ion-input.entry.js +1 -1
  251. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  252. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  253. package/dist/esm-es5/ion-loading.entry.js +1 -1
  254. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  255. package/dist/esm-es5/ion-modal.entry.js +1 -1
  256. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  257. package/dist/esm-es5/ion-picker-column-internal.entry.js +4 -0
  258. package/dist/esm-es5/ion-picker-internal.entry.js +4 -0
  259. package/dist/esm-es5/ion-popover.entry.js +1 -1
  260. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  261. package/dist/esm-es5/ion-range.entry.js +1 -1
  262. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  263. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  264. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  265. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  266. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  267. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  268. package/dist/esm-es5/ion-toast.entry.js +1 -1
  269. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  270. package/dist/esm-es5/ionic.js +1 -1
  271. package/dist/esm-es5/{ios.transition-1651c430.js → ios.transition-c3e77862.js} +1 -1
  272. package/dist/esm-es5/{keyboard-b551279d.js → keyboard-9f771a04.js} +1 -1
  273. package/dist/esm-es5/{keyboard-b063f012.js → keyboard-b6230bfb.js} +1 -1
  274. package/dist/esm-es5/{keyboard-controller-0c2dce71.js → keyboard-controller-3f0faa10.js} +1 -1
  275. package/dist/esm-es5/loader.js +1 -1
  276. package/dist/esm-es5/md.transition-1173eca9.js +4 -0
  277. package/dist/esm-es5/{notch-controller-8c9c0e54.js → notch-controller-3f79197e.js} +1 -1
  278. package/dist/esm-es5/overlays-34169295.js +4 -0
  279. package/dist/esm-es5/swipe-back-0f3bfc8e.js +4 -0
  280. package/dist/html.html-data.json +15 -120
  281. package/dist/ionic/index.esm.js +1 -1
  282. package/dist/ionic/ionic.esm.js +1 -1
  283. package/dist/ionic/{p-02d8fdba.system.entry.js → p-03ed6107.system.entry.js} +1 -1
  284. package/dist/ionic/p-0547e914.entry.js +4 -0
  285. package/dist/ionic/{p-81c818e7.js → p-11cb4e19.js} +1 -1
  286. package/dist/ionic/p-131761b4.entry.js +4 -0
  287. package/dist/ionic/p-196f2123.system.entry.js +4 -0
  288. package/dist/ionic/{p-64ed03a3.entry.js → p-1abc74d9.entry.js} +1 -1
  289. package/dist/ionic/p-1cf5e8d6.entry.js +4 -0
  290. package/dist/ionic/{p-c4042875.system.js → p-21b4981c.system.js} +1 -1
  291. package/dist/ionic/p-2207f3c2.js +4 -0
  292. package/dist/ionic/p-27eb8a91.system.entry.js +4 -0
  293. package/dist/ionic/p-2a41d4d1.js +4 -0
  294. package/dist/ionic/p-31189dae.entry.js +4 -0
  295. package/dist/ionic/p-314c4dee.js +4 -0
  296. package/dist/ionic/{p-4f3e2767.system.entry.js → p-37c69d34.system.entry.js} +1 -1
  297. package/dist/ionic/p-385c51f8.system.entry.js +4 -0
  298. package/dist/ionic/{p-477a182e.entry.js → p-3abf5b7a.entry.js} +1 -1
  299. package/dist/ionic/p-3bc3d880.system.js +4 -0
  300. package/dist/ionic/{p-56224549.entry.js → p-3de79805.entry.js} +1 -1
  301. package/dist/ionic/{p-9e6bf9ed.entry.js → p-3e655d4c.entry.js} +1 -1
  302. package/dist/ionic/p-40903d34.system.js +1 -1
  303. package/dist/ionic/p-43716898.js +4 -0
  304. package/dist/ionic/p-450a26bf.js +4 -0
  305. package/dist/ionic/p-485668f0.entry.js +4 -0
  306. package/dist/ionic/p-48c59094.system.entry.js +4 -0
  307. package/dist/ionic/p-494e75ad.js +4 -0
  308. package/dist/ionic/{p-cb62e3fc.system.entry.js → p-4c80afe1.system.entry.js} +1 -1
  309. package/dist/ionic/{p-0e23256e.system.entry.js → p-54824705.system.entry.js} +1 -1
  310. package/dist/ionic/p-561cc050.system.js +4 -0
  311. package/dist/ionic/{p-4a142496.system.entry.js → p-587afb80.system.entry.js} +1 -1
  312. package/dist/ionic/{p-8cf94fc1.js → p-5885e9af.js} +1 -1
  313. package/dist/ionic/p-5bd4e009.entry.js +4 -0
  314. package/dist/ionic/{p-b3e79338.system.entry.js → p-5e6bc319.system.entry.js} +1 -1
  315. package/dist/ionic/{p-939d903b.entry.js → p-64ab3eb3.entry.js} +1 -1
  316. package/dist/ionic/p-671dbd61.js +4 -0
  317. package/dist/ionic/{p-702d85d8.system.js → p-67951604.system.js} +1 -1
  318. package/dist/ionic/{p-835e0346.entry.js → p-6797887a.entry.js} +1 -1
  319. package/dist/ionic/{p-b923f3d7.js → p-6a309574.js} +1 -1
  320. package/dist/ionic/{p-a4cda7a8.system.entry.js → p-6e23777e.system.entry.js} +1 -1
  321. package/dist/ionic/{p-06e6d235.system.entry.js → p-7047a40c.system.entry.js} +2 -2
  322. package/dist/ionic/p-70dcf429.js +4 -0
  323. package/dist/ionic/p-710cea83.system.js +4 -0
  324. package/dist/ionic/p-7b44e419.js +4 -0
  325. package/dist/ionic/p-80a9b397.entry.js +4 -0
  326. package/dist/ionic/{p-9b5301cc.system.entry.js → p-823890d5.system.entry.js} +1 -1
  327. package/dist/ionic/{p-a57f223c.system.js → p-83a455fd.system.js} +1 -1
  328. package/dist/ionic/{p-baa7cb1e.entry.js → p-8ad82eb3.entry.js} +1 -1
  329. package/dist/ionic/{p-c1229981.entry.js → p-8b15ca22.entry.js} +1 -1
  330. package/dist/ionic/{p-a7e2ac5c.js → p-8b1be026.js} +1 -1
  331. package/dist/ionic/p-8dbdb163.system.js +4 -0
  332. package/dist/ionic/p-8ddfecbf.entry.js +4 -0
  333. package/dist/ionic/{p-b4b4bb29.system.js → p-9292fd42.system.js} +1 -1
  334. package/dist/ionic/{p-41477ad9.system.js → p-958f1c70.system.js} +1 -1
  335. package/dist/ionic/{p-5ce11143.entry.js → p-965677f1.entry.js} +1 -1
  336. package/dist/ionic/p-9c6787e2.entry.js +4 -0
  337. package/dist/ionic/{p-6500b298.system.js → p-9e852ff1.system.js} +1 -1
  338. package/dist/ionic/p-a11c1aff.system.entry.js +4 -0
  339. package/dist/ionic/{p-419eb426.js → p-a135e3ba.js} +1 -1
  340. package/dist/ionic/p-a31099a4.entry.js +4 -0
  341. package/dist/ionic/p-a6bc00ab.entry.js +4 -0
  342. package/dist/ionic/p-a9c3699b.system.entry.js +4 -0
  343. package/dist/ionic/p-ac668fb8.entry.js +4 -0
  344. package/dist/ionic/p-ad4b4f73.system.entry.js +4 -0
  345. package/dist/ionic/{p-ab4cff27.system.js → p-aec8a70a.system.js} +1 -1
  346. package/dist/ionic/p-b673ee9b.entry.js +4 -0
  347. package/dist/ionic/p-be0f6600.system.js +4 -0
  348. package/dist/ionic/p-beb64be7.system.entry.js +4 -0
  349. package/dist/ionic/{p-dd837fa8.entry.js → p-c1e725db.entry.js} +1 -1
  350. package/dist/ionic/p-c2db1374.system.js +4 -0
  351. package/dist/ionic/p-c3547c7a.system.js +4 -0
  352. package/dist/ionic/{p-c7fd81ba.system.js → p-c4de53af.system.js} +1 -1
  353. package/dist/ionic/p-c700acef.system.js +4 -0
  354. package/dist/ionic/p-c919498d.entry.js +4 -0
  355. package/dist/ionic/{p-3f88eab8.system.entry.js → p-cc615985.system.entry.js} +1 -1
  356. package/dist/ionic/p-d48872b1.system.js +4 -0
  357. package/dist/ionic/p-d4fba36b.system.entry.js +4 -0
  358. package/dist/ionic/{p-22813b28.system.entry.js → p-d61a2cee.system.entry.js} +1 -1
  359. package/dist/ionic/{p-c31fc05f.system.entry.js → p-db5043df.system.entry.js} +1 -1
  360. package/dist/ionic/{p-100ef961.js → p-e0b06b65.js} +1 -1
  361. package/dist/ionic/p-e5b8f2f7.js +4 -0
  362. package/dist/ionic/{p-3bad5c1a.js → p-e5fd9f10.js} +1 -1
  363. package/dist/ionic/{p-302091ab.js → p-e627ed84.js} +1 -1
  364. package/dist/ionic/{p-ccdcb022.system.js → p-e7d20dfb.system.js} +1 -1
  365. package/dist/ionic/{p-14b4348c.system.js → p-e9e5755c.system.js} +1 -1
  366. package/dist/ionic/p-ea9addc8.system.entry.js +4 -0
  367. package/dist/ionic/p-edd07654.system.entry.js +4 -0
  368. package/dist/ionic/p-f36112b4.entry.js +4 -0
  369. package/dist/ionic/p-f43f4102.entry.js +4 -0
  370. package/dist/ionic/p-f5d78105.entry.js +4 -0
  371. package/dist/ionic/p-f7769c83.js +4 -0
  372. package/dist/ionic/{p-bba2ce59.system.js → p-f9a641fa.system.js} +1 -1
  373. package/dist/ionic/{p-2e1794df.system.js → p-fa8d4788.system.js} +1 -1
  374. package/dist/ionic/p-fcb148dc.system.entry.js +4 -0
  375. package/dist/ionic/p-fcc23f25.system.entry.js +4 -0
  376. package/dist/ionic/{p-878c7aa5.system.entry.js → p-fce6b76a.system.entry.js} +1 -1
  377. package/dist/ionic/p-fdcf04c3.system.entry.js +4 -0
  378. package/dist/ionic/{p-a0b6d438.js → p-fe1f93f2.js} +1 -1
  379. package/dist/types/components/backdrop/backdrop.d.ts +3 -0
  380. package/dist/types/components/datetime/datetime.d.ts +1 -0
  381. package/dist/types/components/datetime/utils/data.d.ts +2 -2
  382. package/dist/types/components/input/input.d.ts +2 -0
  383. package/dist/types/components/menu/menu.d.ts +1 -1
  384. package/dist/types/components/picker/picker.d.ts +131 -74
  385. package/dist/types/components/picker-column/picker-column.d.ts +39 -94
  386. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +102 -0
  387. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
  388. package/dist/types/components/picker-internal/picker-internal.d.ts +102 -0
  389. package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
  390. package/dist/types/components/radio-group/radio-group.d.ts +8 -1
  391. package/dist/types/components/router/router.d.ts +2 -1
  392. package/dist/types/components/select/select.d.ts +6 -1
  393. package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
  394. package/dist/types/components/textarea/textarea.d.ts +2 -0
  395. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  396. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  397. package/dist/types/components/toast/toast-interface.d.ts +2 -0
  398. package/dist/types/components/toast/toast.d.ts +28 -1
  399. package/dist/types/components.d.ts +159 -157
  400. package/dist/types/interface.d.ts +2 -6
  401. package/dist/types/utils/animation/animation-interface.d.ts +4 -4
  402. package/dist/types/utils/browser/index.d.ts +11 -2
  403. package/dist/types/utils/config.d.ts +2 -2
  404. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  405. package/dist/types/utils/forms/index.d.ts +1 -0
  406. package/dist/types/utils/gesture/gesture-controller.d.ts +0 -1
  407. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  408. package/dist/types/utils/overlays.d.ts +3 -5
  409. package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
  410. package/hydrate/index.js +2003 -1567
  411. package/package.json +1 -1
  412. package/components/ion-picker-column-option.d.ts +0 -11
  413. package/components/ion-picker-column-option.js +0 -52
  414. package/components/ion-picker-legacy-column.d.ts +0 -11
  415. package/components/ion-picker-legacy-column.js +0 -9
  416. package/components/ion-picker-legacy.js +0 -309
  417. package/components/picker-column2.js +0 -379
  418. package/dist/cjs/index-306a7476.js +0 -32
  419. package/dist/cjs/ion-picker-column-option.cjs.entry.js +0 -35
  420. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  421. package/dist/collection/components/picker-column-option/picker-column-option.js +0 -68
  422. package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +0 -18
  423. package/dist/collection/components/picker-legacy/picker.ios.css +0 -367
  424. package/dist/collection/components/picker-legacy/picker.js +0 -817
  425. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +0 -25
  426. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -419
  427. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +0 -65
  428. package/dist/esm/index-7a14ecec.js +0 -29
  429. package/dist/esm/ion-picker-column-option.entry.js +0 -31
  430. package/dist/esm-es5/index-0aa6e61f.js +0 -4
  431. package/dist/esm-es5/index-f0cc4e14.js +0 -4
  432. package/dist/esm-es5/input-shims-d0c93e5d.js +0 -4
  433. package/dist/esm-es5/input.utils-ec063df4.js +0 -4
  434. package/dist/esm-es5/ion-picker-column-option.entry.js +0 -4
  435. package/dist/esm-es5/ion-picker-column.entry.js +0 -4
  436. package/dist/esm-es5/ion-picker.entry.js +0 -4
  437. package/dist/esm-es5/md.transition-66f18369.js +0 -4
  438. package/dist/esm-es5/overlays-789cd7a7.js +0 -4
  439. package/dist/esm-es5/swipe-back-cc4c2bcb.js +0 -4
  440. package/dist/ionic/p-0c244faf.entry.js +0 -4
  441. package/dist/ionic/p-20cf4994.js +0 -4
  442. package/dist/ionic/p-234b9617.system.entry.js +0 -4
  443. package/dist/ionic/p-25c34422.system.entry.js +0 -4
  444. package/dist/ionic/p-276afddd.js +0 -4
  445. package/dist/ionic/p-2804781b.entry.js +0 -4
  446. package/dist/ionic/p-2ad38423.system.entry.js +0 -4
  447. package/dist/ionic/p-2ba9414e.entry.js +0 -4
  448. package/dist/ionic/p-2e8e0045.js +0 -4
  449. package/dist/ionic/p-332f64af.system.entry.js +0 -4
  450. package/dist/ionic/p-352c0232.system.entry.js +0 -4
  451. package/dist/ionic/p-3602001b.system.js +0 -4
  452. package/dist/ionic/p-3632220b.system.js +0 -4
  453. package/dist/ionic/p-39074595.entry.js +0 -4
  454. package/dist/ionic/p-439e20ef.entry.js +0 -4
  455. package/dist/ionic/p-4cd588b3.system.entry.js +0 -4
  456. package/dist/ionic/p-67aab78f.js +0 -4
  457. package/dist/ionic/p-67eecef4.system.js +0 -4
  458. package/dist/ionic/p-6893f6e4.entry.js +0 -4
  459. package/dist/ionic/p-77e7a9c8.entry.js +0 -4
  460. package/dist/ionic/p-7c66a566.system.entry.js +0 -4
  461. package/dist/ionic/p-8b4ab236.entry.js +0 -4
  462. package/dist/ionic/p-9403b297.system.entry.js +0 -4
  463. package/dist/ionic/p-966cf574.system.entry.js +0 -4
  464. package/dist/ionic/p-97c65aa5.js +0 -4
  465. package/dist/ionic/p-992d3bad.entry.js +0 -4
  466. package/dist/ionic/p-9ab6f3e6.system.js +0 -4
  467. package/dist/ionic/p-9b89cbde.js +0 -4
  468. package/dist/ionic/p-9c967a65.system.entry.js +0 -4
  469. package/dist/ionic/p-a21b8d05.entry.js +0 -4
  470. package/dist/ionic/p-b0cee324.entry.js +0 -4
  471. package/dist/ionic/p-b1142133.entry.js +0 -4
  472. package/dist/ionic/p-b4cbb736.js +0 -4
  473. package/dist/ionic/p-b6a8588f.entry.js +0 -4
  474. package/dist/ionic/p-b6f8ee31.entry.js +0 -4
  475. package/dist/ionic/p-ba70d455.entry.js +0 -4
  476. package/dist/ionic/p-bd7a3269.entry.js +0 -4
  477. package/dist/ionic/p-c32bf078.system.entry.js +0 -4
  478. package/dist/ionic/p-cc196b34.js +0 -4
  479. package/dist/ionic/p-d1de1188.js +0 -4
  480. package/dist/ionic/p-d21bfe66.system.entry.js +0 -4
  481. package/dist/ionic/p-d3952bd5.system.entry.js +0 -4
  482. package/dist/ionic/p-dc565ca3.js +0 -4
  483. package/dist/ionic/p-dfa756ed.system.js +0 -4
  484. package/dist/ionic/p-e88ed07f.system.js +0 -4
  485. package/dist/ionic/p-eb07ec1a.system.entry.js +0 -4
  486. package/dist/ionic/p-eb5697b5.system.js +0 -4
  487. package/dist/ionic/p-ee800093.entry.js +0 -4
  488. package/dist/ionic/p-f0559c5d.system.entry.js +0 -4
  489. package/dist/ionic/p-fdd22426.entry.js +0 -4
  490. package/dist/ionic/p-ff5a10f9.system.js +0 -4
  491. package/dist/types/components/picker/picker-interfaces.d.ts +0 -8
  492. package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -16
  493. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  494. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  495. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.enter.js +0 -0
  496. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.leave.js +0 -0
  497. /package/dist/collection/components/picker/{picker-interfaces.js → picker-interface.js} +0 -0
  498. /package/dist/collection/components/{picker-legacy-column → picker-column}/test/test.utils.js +0 -0
  499. /package/dist/collection/components/{picker-column/picker-column-interfaces.js → picker-column-internal/picker-column-internal-interfaces.js} +0 -0
  500. /package/dist/collection/components/{picker-legacy/picker-interface.js → picker-internal/picker-internal-interfaces.js} +0 -0
  501. /package/dist/esm-es5/{data-12e24f00.js → data-44d9e816.js} +0 -0
  502. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  503. /package/dist/ionic/{p-bb849ebb.js → p-17240d90.js} +0 -0
  504. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  505. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
  506. /package/dist/ionic/{p-e4219e27.system.js → p-b8c3f071.system.js} +0 -0
  507. /package/dist/types/components/{picker-legacy → picker}/animations/ios.enter.d.ts +0 -0
  508. /package/dist/types/components/{picker-legacy → picker}/animations/ios.leave.d.ts +0 -0
  509. /package/dist/types/components/{picker-legacy → picker}/picker-interface.d.ts +0 -0
  510. /package/dist/types/components/{picker-legacy-column → picker-column}/test/test.utils.d.ts +0 -0
  511. /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(.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 {
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) .native-wrapper,
708
- :host(.select-label-placement-floating) .native-wrapper {
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
- this.setFocus();
34
- this.open(ev);
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': this.hasValue(),
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(), this.renderListbox()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { class: "select-highlight" }))));
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": "A property name or function used to compare object values"
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(.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 {
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.select-label-placement-stacked) .label-text-wrapper,
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(.select-expanded.select-fill-outline.select-label-placement-floating) .label-text-wrapper,
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(.select-expanded.select-fill-outline.select-label-placement-floating) .select-outline-notch,
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) .native-wrapper,
1303
- :host(.select-label-placement-floating) .native-wrapper {
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(.textarea-label-placement-stacked) .label-text-wrapper,
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