@ionic/core 7.5.8-dev.11701806358.1ca1b519 → 7.5.8-dev.11701876182.1e71e7a0

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 (551) hide show
  1. package/components/animation.js +12 -11
  2. package/components/backdrop.js +12 -0
  3. package/components/checkbox.js +5 -3
  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 +64 -40
  12. package/components/ion-infinite-scroll.js +11 -3
  13. package/components/ion-input.js +31 -8
  14. package/components/ion-modal.js +2 -2
  15. package/components/ion-picker-column-internal.d.ts +11 -0
  16. package/components/ion-picker-column-internal.js +9 -0
  17. package/components/ion-picker-column.js +2 -2
  18. package/components/{ion-picker-legacy.d.ts → ion-picker-internal.d.ts} +4 -4
  19. package/components/ion-picker-internal.js +9 -0
  20. package/components/ion-picker.js +309 -1
  21. package/components/ion-range.js +5 -3
  22. package/components/ion-select.js +44 -29
  23. package/components/ion-skeleton-text.js +14 -1
  24. package/components/ion-textarea.js +30 -7
  25. package/components/ion-toast.js +419 -74
  26. package/components/ion-toggle.js +5 -3
  27. package/components/item.js +2 -2
  28. package/components/label.js +2 -2
  29. package/components/overlays.js +6 -12
  30. package/components/picker-column-internal.js +390 -0
  31. package/components/picker-column.js +317 -363
  32. package/components/{picker.js → picker-internal.js} +16 -16
  33. package/components/radio-group.js +2 -0
  34. package/components/radio.js +45 -5
  35. package/dist/cjs/{animation-cc40e39c.js → animation-9b401d39.js} +13 -12
  36. package/dist/cjs/{button-active-9d7e0640.js → button-active-a5185907.js} +2 -2
  37. package/dist/cjs/{capacitor-46980811.js → capacitor-c04564bf.js} +1 -1
  38. package/dist/cjs/compare-with-utils-df1001d7.js +44 -0
  39. package/dist/cjs/{data-e7526b58.js → data-36b9094e.js} +1 -1
  40. package/dist/cjs/{gesture-controller-9436f482.js → gesture-controller-c40c045a.js} +0 -1
  41. package/dist/cjs/{haptic-216df36c.js → haptic-b882e0bb.js} +1 -1
  42. package/dist/cjs/{index-8c1e77d6.js → index-b4f986cd.js} +1 -1
  43. package/dist/cjs/index-c8d52405.js +10 -0
  44. package/dist/cjs/{index-5cbb20f9.js → index-ce101dc9.js} +11 -13
  45. package/dist/cjs/{index-ee07ed59.js → index-d1b59ffa.js} +1 -1
  46. package/dist/cjs/{index-d4c2e02c.js → index-f8f13389.js} +2 -2
  47. package/dist/cjs/index.cjs.js +10 -10
  48. package/dist/cjs/{input-shims-87102b6a.js → input-shims-a23bb0f4.js} +15 -10
  49. package/dist/cjs/{input.utils-2a11c1fe.js → input.utils-3d0166a2.js} +4 -3
  50. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  51. package/dist/cjs/ion-alert.cjs.entry.js +8 -8
  52. package/dist/cjs/ion-app_8.cjs.entry.js +10 -10
  53. package/dist/cjs/ion-backdrop.cjs.entry.js +12 -0
  54. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -3
  55. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  56. package/dist/cjs/ion-datetime_3.cjs.entry.js +60 -40
  57. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +11 -3
  58. package/dist/cjs/ion-input.cjs.entry.js +34 -11
  59. package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
  60. package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
  61. package/dist/cjs/ion-loading.cjs.entry.js +3 -4
  62. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  63. package/dist/cjs/ion-modal.cjs.entry.js +10 -10
  64. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  65. package/dist/cjs/{ion-picker-column.cjs.entry.js → ion-picker-column-internal.cjs.entry.js} +74 -107
  66. package/dist/cjs/{ion-picker.cjs.entry.js → ion-picker-internal.cjs.entry.js} +13 -13
  67. package/dist/cjs/ion-popover.cjs.entry.js +4 -5
  68. package/dist/cjs/ion-radio_2.cjs.entry.js +9 -4
  69. package/dist/cjs/ion-range.cjs.entry.js +6 -4
  70. package/dist/cjs/ion-refresher_2.cjs.entry.js +7 -7
  71. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  72. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  73. package/dist/cjs/ion-select_3.cjs.entry.js +51 -36
  74. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  75. package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
  76. package/dist/cjs/ion-toast.cjs.entry.js +434 -93
  77. package/dist/cjs/ion-toggle.cjs.entry.js +9 -7
  78. package/dist/cjs/ionic.cjs.js +1 -1
  79. package/dist/cjs/{ios.transition-a4ffb5a2.js → ios.transition-6787b799.js} +3 -3
  80. package/dist/cjs/{keyboard-9390928c.js → keyboard-0272231f.js} +1 -1
  81. package/dist/cjs/{keyboard-7d621ee9.js → keyboard-af1bb365.js} +3 -3
  82. package/dist/cjs/{keyboard-controller-2158b478.js → keyboard-controller-c05e747a.js} +2 -2
  83. package/dist/cjs/loader.cjs.js +1 -1
  84. package/dist/cjs/{md.transition-292abe1c.js → md.transition-e033d20a.js} +3 -3
  85. package/dist/cjs/{notch-controller-1dce508a.js → notch-controller-9735e7ac.js} +1 -1
  86. package/dist/cjs/{overlays-e8e05b0e.js → overlays-27a6fb16.js} +7 -12
  87. package/dist/cjs/{swipe-back-b8f2330b.js → swipe-back-2a858bbd.js} +2 -2
  88. package/dist/collection/collection-manifest.json +6 -7
  89. package/dist/collection/components/backdrop/backdrop.js +12 -0
  90. package/dist/collection/components/checkbox/checkbox.ios.css +0 -6
  91. package/dist/collection/components/checkbox/checkbox.js +4 -1
  92. package/dist/collection/components/checkbox/checkbox.md.css +0 -6
  93. package/dist/collection/components/checkbox/test/checkbox.spec.js +14 -0
  94. package/dist/collection/components/content/content.css +4 -0
  95. package/dist/collection/components/datetime/datetime.ios.css +38 -83
  96. package/dist/collection/components/datetime/datetime.js +36 -24
  97. package/dist/collection/components/datetime/datetime.md.css +38 -88
  98. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  99. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +9 -6
  100. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +0 -10
  101. package/dist/collection/components/datetime/test/datetime.e2e.js +2 -2
  102. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  103. package/dist/collection/components/datetime/test/locale/datetime.e2e.js +2 -2
  104. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +6 -6
  105. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  106. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +41 -43
  107. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  108. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +4 -4
  109. package/dist/collection/components/datetime/test/values/datetime.e2e.js +12 -15
  110. package/dist/collection/components/datetime/utils/data.js +1 -1
  111. package/dist/collection/components/infinite-scroll/infinite-scroll.js +11 -3
  112. package/dist/collection/components/infinite-scroll/test/small-dom-update/infinite-scroll.e2e.js +31 -0
  113. package/dist/collection/components/input/input.ios.css +10 -3
  114. package/dist/collection/components/input/input.js +31 -6
  115. package/dist/collection/components/input/input.md.css +13 -12
  116. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  117. package/dist/collection/components/item/item.ios.css +41 -3
  118. package/dist/collection/components/item/item.md.css +41 -3
  119. package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
  120. package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
  121. package/dist/collection/components/label/label.ios.css +14 -3
  122. package/dist/collection/components/label/label.md.css +14 -3
  123. package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
  124. package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
  125. package/dist/collection/components/picker/picker.ios.css +205 -100
  126. package/dist/collection/components/picker/picker.js +743 -461
  127. package/dist/collection/components/picker/picker.md.css +194 -98
  128. package/dist/collection/components/picker/test/basic/picker.e2e.js +13 -99
  129. package/dist/collection/components/{picker-legacy → picker}/test/is-open/picker.e2e.js +4 -4
  130. package/dist/collection/components/{picker-legacy → picker}/test/picker-id.spec.js +5 -5
  131. package/dist/collection/components/{picker-legacy → picker}/test/trigger/picker.e2e.js +1 -1
  132. package/dist/collection/components/picker-column/picker-column.ios.css +160 -120
  133. package/dist/collection/components/picker-column/picker-column.js +329 -514
  134. package/dist/collection/components/picker-column/picker-column.md.css +107 -134
  135. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-aria.spec.js +3 -3
  136. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-dynamic.spec.js +2 -2
  137. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column.spec.js +2 -2
  138. package/dist/collection/components/{picker-legacy-column → picker-column}/test/standalone/picker-column.e2e.js +3 -3
  139. package/dist/collection/components/{picker-column-option/picker-column-option.md.css → picker-column-internal/picker-column-internal.ios.css} +53 -6
  140. package/dist/collection/components/picker-column-internal/picker-column-internal.js +565 -0
  141. package/dist/collection/components/{picker-legacy-column/picker-column.md.css → picker-column-internal/picker-column-internal.md.css} +63 -113
  142. package/dist/collection/components/{picker-column/test/basic/picker-column.e2e.js → picker-column-internal/test/basic/picker-column-internal.e2e.js} +8 -8
  143. package/dist/collection/components/picker-column-internal/test/disabled/picker-column-internal.e2e.js +162 -0
  144. package/dist/collection/components/{picker-legacy/picker.md.css → picker-internal/picker-internal.ios.css} +100 -192
  145. package/dist/collection/components/picker-internal/picker-internal.js +544 -0
  146. package/dist/collection/components/{picker-legacy-column/picker-column.ios.css → picker-internal/picker-internal.md.css} +101 -98
  147. package/dist/collection/components/{picker/test/a11y/picker.e2e.js → picker-internal/test/a11y/picker-internal.e2e.js} +2 -2
  148. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +118 -0
  149. package/dist/collection/components/{picker/test/keyboard-entry/picker.e2e.js → picker-internal/test/keyboard-entry/picker-internal.e2e.js} +22 -23
  150. package/dist/collection/components/radio/radio.ios.css +0 -6
  151. package/dist/collection/components/radio/radio.js +7 -3
  152. package/dist/collection/components/radio/radio.md.css +0 -6
  153. package/dist/collection/components/radio/test/radio.spec.js +14 -0
  154. package/dist/collection/components/radio-group/radio-group.js +24 -0
  155. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  156. package/dist/collection/components/range/range.ios.css +0 -6
  157. package/dist/collection/components/range/range.js +4 -1
  158. package/dist/collection/components/range/range.md.css +0 -6
  159. package/dist/collection/components/range/test/range.spec.js +16 -0
  160. package/dist/collection/components/select/select.ios.css +60 -7
  161. package/dist/collection/components/select/select.js +45 -28
  162. package/dist/collection/components/select/select.md.css +63 -19
  163. package/dist/collection/components/select/test/item/select.e2e.js +15 -0
  164. package/dist/collection/components/select/test/label/select.e2e.js +1 -1
  165. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
  166. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  167. package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
  168. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  169. package/dist/collection/components/textarea/textarea.ios.css +37 -5
  170. package/dist/collection/components/textarea/textarea.js +30 -5
  171. package/dist/collection/components/textarea/textarea.md.css +47 -14
  172. package/dist/collection/components/toast/animations/ios.enter.js +2 -1
  173. package/dist/collection/components/toast/animations/md.enter.js +4 -3
  174. package/dist/collection/components/toast/animations/utils.js +20 -14
  175. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  176. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  177. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  178. package/dist/collection/components/toast/test/toast.spec.js +80 -0
  179. package/dist/collection/components/toast/toast.ios.css +10 -10
  180. package/dist/collection/components/toast/toast.js +104 -1
  181. package/dist/collection/components/toast/toast.md.css +10 -0
  182. package/dist/collection/components/toggle/test/toggle.spec.js +12 -0
  183. package/dist/collection/components/toggle/toggle.ios.css +0 -6
  184. package/dist/collection/components/toggle/toggle.js +4 -1
  185. package/dist/collection/components/toggle/toggle.md.css +0 -6
  186. package/dist/collection/utils/animation/animation.js +12 -11
  187. package/dist/collection/utils/animation/test/animation.spec.js +16 -0
  188. package/dist/collection/utils/browser/index.js +0 -22
  189. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  190. package/dist/collection/utils/forms/index.js +1 -0
  191. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  192. package/dist/collection/utils/input-shims/input-shims.js +12 -6
  193. package/dist/collection/utils/menu-controller/index.js +10 -12
  194. package/dist/collection/utils/overlays.js +5 -11
  195. package/dist/collection/utils/slot-mutation-controller.js +3 -2
  196. package/dist/docs.json +265 -561
  197. package/dist/esm/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +13 -12
  198. package/dist/esm/{button-active-ed9d848c.js → button-active-c6ee4f50.js} +2 -2
  199. package/dist/esm/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  200. package/dist/esm/compare-with-utils-a96ff2ea.js +41 -0
  201. package/dist/esm/{data-4b9508c9.js → data-f5c75b4e.js} +1 -1
  202. package/dist/esm/{gesture-controller-314a54f6.js → gesture-controller-1bf57181.js} +1 -1
  203. package/dist/esm/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  204. package/dist/esm/{index-80492ed3.js → index-0c12c22b.js} +11 -13
  205. package/dist/esm/{index-d8817fb0.js → index-1932b201.js} +2 -2
  206. package/dist/esm/{index-39782642.js → index-2cf77112.js} +2 -2
  207. package/dist/esm/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  208. package/dist/esm/index-a5d50daf.js +7 -0
  209. package/dist/esm/index.js +10 -10
  210. package/dist/esm/{input-shims-0a2e541d.js → input-shims-6539ce13.js} +14 -9
  211. package/dist/esm/{input.utils-2846d430.js → input.utils-a5a2d164.js} +4 -3
  212. package/dist/esm/ion-action-sheet.entry.js +8 -8
  213. package/dist/esm/ion-alert.entry.js +8 -8
  214. package/dist/esm/ion-app_8.entry.js +10 -10
  215. package/dist/esm/ion-backdrop.entry.js +12 -0
  216. package/dist/esm/ion-checkbox.entry.js +5 -3
  217. package/dist/esm/ion-datetime-button.entry.js +1 -1
  218. package/dist/esm/ion-datetime_3.entry.js +59 -39
  219. package/dist/esm/ion-infinite-scroll_2.entry.js +11 -3
  220. package/dist/esm/ion-input.entry.js +34 -11
  221. package/dist/esm/ion-item-option_3.entry.js +1 -1
  222. package/dist/esm/ion-item_8.entry.js +17 -4
  223. package/dist/esm/ion-loading.entry.js +3 -4
  224. package/dist/esm/ion-menu_3.entry.js +7 -7
  225. package/dist/esm/ion-modal.entry.js +10 -10
  226. package/dist/esm/ion-nav_2.entry.js +2 -2
  227. package/dist/esm/{ion-picker-column.entry.js → ion-picker-column-internal.entry.js} +74 -107
  228. package/dist/esm/{ion-picker.entry.js → ion-picker-internal.entry.js} +13 -13
  229. package/dist/esm/ion-popover.entry.js +4 -5
  230. package/dist/esm/ion-radio_2.entry.js +9 -4
  231. package/dist/esm/ion-range.entry.js +6 -4
  232. package/dist/esm/ion-refresher_2.entry.js +7 -7
  233. package/dist/esm/ion-reorder_2.entry.js +4 -4
  234. package/dist/esm/ion-segment_2.entry.js +1 -1
  235. package/dist/esm/ion-select_3.entry.js +47 -32
  236. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  237. package/dist/esm/ion-textarea.entry.js +33 -10
  238. package/dist/esm/ion-toast.entry.js +417 -76
  239. package/dist/esm/ion-toggle.entry.js +9 -7
  240. package/dist/esm/ionic.js +1 -1
  241. package/dist/esm/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +3 -3
  242. package/dist/esm/{keyboard-c402e885.js → keyboard-52278bd7.js} +3 -3
  243. package/dist/esm/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  244. package/dist/esm/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +2 -2
  245. package/dist/esm/loader.js +1 -1
  246. package/dist/esm/{md.transition-94ac93e1.js → md.transition-43c2874d.js} +3 -3
  247. package/dist/esm/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  248. package/dist/esm/{overlays-fbc5cab5.js → overlays-32ef481d.js} +7 -13
  249. package/dist/esm/{swipe-back-a8ca7f93.js → swipe-back-a6f386fc.js} +2 -2
  250. package/dist/esm-es5/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +1 -1
  251. package/dist/esm-es5/{button-active-ed9d848c.js → button-active-c6ee4f50.js} +1 -1
  252. package/dist/esm-es5/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  253. package/dist/esm-es5/compare-with-utils-a96ff2ea.js +4 -0
  254. package/dist/esm-es5/{gesture-controller-314a54f6.js → gesture-controller-1bf57181.js} +1 -1
  255. package/dist/esm-es5/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  256. package/dist/esm-es5/index-0c12c22b.js +4 -0
  257. package/dist/esm-es5/{index-d8817fb0.js → index-1932b201.js} +1 -1
  258. package/dist/esm-es5/{index-39782642.js → index-2cf77112.js} +1 -1
  259. package/dist/esm-es5/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  260. package/dist/esm-es5/index.js +1 -1
  261. package/dist/esm-es5/input-shims-6539ce13.js +4 -0
  262. package/dist/esm-es5/input.utils-a5a2d164.js +4 -0
  263. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  264. package/dist/esm-es5/ion-alert.entry.js +1 -1
  265. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  266. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  267. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  268. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  269. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  270. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  271. package/dist/esm-es5/ion-input.entry.js +1 -1
  272. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  273. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  274. package/dist/esm-es5/ion-loading.entry.js +1 -1
  275. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  276. package/dist/esm-es5/ion-modal.entry.js +1 -1
  277. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  278. package/dist/esm-es5/ion-picker-column-internal.entry.js +4 -0
  279. package/dist/esm-es5/ion-picker-internal.entry.js +4 -0
  280. package/dist/esm-es5/ion-popover.entry.js +1 -1
  281. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  282. package/dist/esm-es5/ion-range.entry.js +1 -1
  283. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  284. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  285. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  286. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  287. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  288. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  289. package/dist/esm-es5/ion-toast.entry.js +1 -1
  290. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  291. package/dist/esm-es5/ionic.js +1 -1
  292. package/dist/esm-es5/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +1 -1
  293. package/dist/esm-es5/{keyboard-c402e885.js → keyboard-52278bd7.js} +1 -1
  294. package/dist/esm-es5/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  295. package/dist/esm-es5/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +1 -1
  296. package/dist/esm-es5/loader.js +1 -1
  297. package/dist/esm-es5/md.transition-43c2874d.js +4 -0
  298. package/dist/esm-es5/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  299. package/dist/esm-es5/overlays-32ef481d.js +4 -0
  300. package/dist/esm-es5/swipe-back-a6f386fc.js +4 -0
  301. package/dist/html.html-data.json +15 -153
  302. package/dist/ionic/index.esm.js +1 -1
  303. package/dist/ionic/ionic.esm.js +1 -1
  304. package/dist/ionic/p-01d14eba.system.entry.js +4 -0
  305. package/dist/ionic/p-042e6f4b.entry.js +4 -0
  306. package/dist/ionic/p-05d83227.system.entry.js +4 -0
  307. package/dist/ionic/{p-32e19bee.system.js → p-0bd51c34.system.js} +1 -1
  308. package/dist/ionic/p-16756e94.system.entry.js +4 -0
  309. package/dist/ionic/p-1b19c04b.entry.js +4 -0
  310. package/dist/ionic/{p-95c26010.system.js → p-1cca10d6.system.js} +1 -1
  311. package/dist/ionic/p-1e4371bd.js +4 -0
  312. package/dist/ionic/{p-21c3515a.entry.js → p-251666e2.entry.js} +1 -1
  313. package/dist/ionic/{p-4e8e09e1.js → p-27281edd.js} +1 -1
  314. package/dist/ionic/p-28249b10.system.entry.js +4 -0
  315. package/dist/ionic/p-28a2c2a2.entry.js +4 -0
  316. package/dist/ionic/p-29d03b3a.js +4 -0
  317. package/dist/ionic/p-2b7827c7.js +4 -0
  318. package/dist/ionic/p-2d3b9fa3.system.entry.js +4 -0
  319. package/dist/ionic/p-2d539df1.entry.js +4 -0
  320. package/dist/ionic/{p-9c229210.system.entry.js → p-3137c025.system.entry.js} +2 -2
  321. package/dist/ionic/{p-3e1e14d9.system.js → p-31b2326e.system.js} +1 -1
  322. package/dist/ionic/{p-30029cc2.system.js → p-31fcb233.system.js} +1 -1
  323. package/dist/ionic/{p-1d624e03.system.js → p-33a37fad.system.js} +1 -1
  324. package/dist/ionic/p-35ce400e.system.js +4 -0
  325. package/dist/ionic/p-36d187af.js +4 -0
  326. package/dist/ionic/p-376a6063.js +4 -0
  327. package/dist/ionic/p-38f2c6bb.system.js +4 -0
  328. package/dist/ionic/p-39c31982.system.entry.js +4 -0
  329. package/dist/ionic/{p-75445583.js → p-3a75d7fd.js} +1 -1
  330. package/dist/ionic/{p-1fc72959.entry.js → p-3dd98a73.entry.js} +1 -1
  331. package/dist/ionic/p-3e6b47e8.system.entry.js +4 -0
  332. package/dist/ionic/p-3f5179b5.entry.js +4 -0
  333. package/dist/ionic/p-40f68333.system.js +4 -0
  334. package/dist/ionic/{p-643a8fae.js → p-42f189f4.js} +1 -1
  335. package/dist/ionic/p-438e1b8a.entry.js +4 -0
  336. package/dist/ionic/{p-b752714f.system.entry.js → p-46d400b4.system.entry.js} +1 -1
  337. package/dist/ionic/p-47b6ba5b.js +4 -0
  338. package/dist/ionic/{p-5d42b6b4.entry.js → p-4d67d27a.entry.js} +1 -1
  339. package/dist/ionic/{p-535d2a67.entry.js → p-4f3ae45a.entry.js} +1 -1
  340. package/dist/ionic/p-517a9885.system.entry.js +4 -0
  341. package/dist/ionic/p-53ec4f1c.system.js +4 -0
  342. package/dist/ionic/p-5e4eec2e.entry.js +4 -0
  343. package/dist/ionic/{p-57477107.system.js → p-5e745192.system.js} +1 -1
  344. package/dist/ionic/{p-a9a80f5b.entry.js → p-5eda1d7d.entry.js} +1 -1
  345. package/dist/ionic/{p-e8e86f69.system.entry.js → p-6577aea9.system.entry.js} +1 -1
  346. package/dist/ionic/p-6a6477b2.js +4 -0
  347. package/dist/ionic/{p-4890093d.js → p-6de472cb.js} +1 -1
  348. package/dist/ionic/{p-b4d31b30.system.entry.js → p-6de62649.system.entry.js} +1 -1
  349. package/dist/ionic/p-72f6ff89.js +4 -0
  350. package/dist/ionic/p-765f4dde.entry.js +4 -0
  351. package/dist/ionic/{p-3f6270b3.entry.js → p-78aadecb.entry.js} +1 -1
  352. package/dist/ionic/p-7d92bf15.system.entry.js +4 -0
  353. package/dist/ionic/p-7ee0f3f2.entry.js +4 -0
  354. package/dist/ionic/p-80fa068e.entry.js +4 -0
  355. package/dist/ionic/p-8314281e.system.js +4 -0
  356. package/dist/ionic/p-88d5fbd3.js +4 -0
  357. package/dist/ionic/{p-4911a5d6.entry.js → p-88fde0e0.entry.js} +1 -1
  358. package/dist/ionic/{p-0e4f2e17.system.js → p-8985cdb6.system.js} +1 -1
  359. package/dist/ionic/{p-96dbbac1.system.entry.js → p-8acae6b0.system.entry.js} +1 -1
  360. package/dist/ionic/p-8d69a624.entry.js +4 -0
  361. package/dist/ionic/p-8de17614.system.entry.js +4 -0
  362. package/dist/ionic/p-908475e7.system.entry.js +4 -0
  363. package/dist/ionic/p-91d33c4a.js +4 -0
  364. package/dist/ionic/p-979d4f5c.system.js +4 -0
  365. package/dist/ionic/p-9b7f0b0f.entry.js +4 -0
  366. package/dist/ionic/p-9e447eb1.system.js +4 -0
  367. package/dist/ionic/{p-f910cc73.system.entry.js → p-9eec42cc.system.entry.js} +1 -1
  368. package/dist/ionic/p-9f6ee2c0.system.entry.js +4 -0
  369. package/dist/ionic/{p-77965464.system.entry.js → p-a0bb7b92.system.entry.js} +1 -1
  370. package/dist/ionic/p-a0d7bb5e.system.js +4 -0
  371. package/dist/ionic/{p-6d72fb44.entry.js → p-a1987850.entry.js} +1 -1
  372. package/dist/ionic/p-a3277a67.entry.js +4 -0
  373. package/dist/ionic/{p-6b7c55cd.entry.js → p-a9978d08.entry.js} +1 -1
  374. package/dist/ionic/{p-fbf3a689.system.entry.js → p-ada96dd0.system.entry.js} +1 -1
  375. package/dist/ionic/p-afd6ca9d.entry.js +4 -0
  376. package/dist/ionic/p-b56d0866.system.entry.js +4 -0
  377. package/dist/ionic/p-b6f9d32a.entry.js +4 -0
  378. package/dist/ionic/{p-9b97df10.js → p-bb3615f7.js} +1 -1
  379. package/dist/ionic/p-c61cc894.js +4 -0
  380. package/dist/ionic/{p-20d469d0.system.js → p-c7c8429a.system.js} +1 -1
  381. package/dist/ionic/{p-304383f9.system.js → p-cabad15b.system.js} +1 -1
  382. package/dist/ionic/p-cce9f61a.system.entry.js +4 -0
  383. package/dist/ionic/{p-31158892.js → p-cdbeaadc.js} +1 -1
  384. package/dist/ionic/p-d032f825.system.entry.js +4 -0
  385. package/dist/ionic/p-d51674c5.system.js +4 -0
  386. package/dist/ionic/{p-b133e9b4.entry.js → p-ddb30596.entry.js} +1 -1
  387. package/dist/ionic/{p-98d82c73.system.js → p-ddbb2d5b.system.js} +1 -1
  388. package/dist/ionic/p-de6f8b28.system.js +4 -0
  389. package/dist/ionic/p-de756e5c.js +4 -0
  390. package/dist/ionic/p-dee7c1d0.system.entry.js +4 -0
  391. package/dist/ionic/p-dfd9432a.entry.js +4 -0
  392. package/dist/ionic/{p-54dfc9b5.system.js → p-e24ce1e5.system.js} +1 -1
  393. package/dist/ionic/p-e3584231.system.js +1 -1
  394. package/dist/ionic/{p-6fd64e7c.system.entry.js → p-e6d68e02.system.entry.js} +1 -1
  395. package/dist/ionic/p-e94c392d.entry.js +4 -0
  396. package/dist/ionic/p-f0445d82.system.entry.js +4 -0
  397. package/dist/ionic/{p-8ededb41.js → p-f5d2dc9b.js} +1 -1
  398. package/dist/ionic/p-f656e032.system.entry.js +4 -0
  399. package/dist/ionic/{p-76d3765d.js → p-f70970cf.js} +1 -1
  400. package/dist/ionic/{p-c18de88a.system.entry.js → p-fba0a6e7.system.entry.js} +1 -1
  401. package/dist/ionic/p-feae5133.entry.js +4 -0
  402. package/dist/types/components/backdrop/backdrop.d.ts +3 -0
  403. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  404. package/dist/types/components/datetime/datetime.d.ts +1 -0
  405. package/dist/types/components/datetime/utils/data.d.ts +2 -2
  406. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +7 -0
  407. package/dist/types/components/input/input.d.ts +2 -0
  408. package/dist/types/components/menu/menu.d.ts +1 -1
  409. package/dist/types/components/picker/picker.d.ts +131 -74
  410. package/dist/types/components/picker-column/picker-column.d.ts +39 -105
  411. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +102 -0
  412. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
  413. package/dist/types/components/picker-internal/picker-internal.d.ts +102 -0
  414. package/dist/types/components/radio/radio.d.ts +1 -0
  415. package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
  416. package/dist/types/components/radio-group/radio-group.d.ts +8 -1
  417. package/dist/types/components/range/range.d.ts +1 -0
  418. package/dist/types/components/router/router.d.ts +2 -1
  419. package/dist/types/components/select/select.d.ts +6 -1
  420. package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
  421. package/dist/types/components/textarea/textarea.d.ts +2 -0
  422. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  423. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  424. package/dist/types/components/toast/toast-interface.d.ts +2 -0
  425. package/dist/types/components/toast/toast.d.ts +28 -1
  426. package/dist/types/components/toggle/toggle.d.ts +1 -0
  427. package/dist/types/components.d.ts +159 -169
  428. package/dist/types/interface.d.ts +2 -6
  429. package/dist/types/jest.d.ts +5 -0
  430. package/dist/types/utils/animation/animation-interface.d.ts +4 -4
  431. package/dist/types/utils/browser/index.d.ts +11 -2
  432. package/dist/types/utils/config.d.ts +2 -2
  433. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  434. package/dist/types/utils/forms/index.d.ts +1 -0
  435. package/dist/types/utils/gesture/gesture-controller.d.ts +0 -1
  436. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  437. package/dist/types/utils/overlays.d.ts +3 -5
  438. package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
  439. package/hydrate/index.js +1855 -1509
  440. package/package.json +1 -1
  441. package/components/ion-picker-column-option.d.ts +0 -11
  442. package/components/ion-picker-column-option.js +0 -9
  443. package/components/ion-picker-legacy-column.d.ts +0 -11
  444. package/components/ion-picker-legacy-column.js +0 -9
  445. package/components/ion-picker-legacy.js +0 -309
  446. package/components/picker-column-option.js +0 -122
  447. package/components/picker-column2.js +0 -379
  448. package/dist/cjs/index-306a7476.js +0 -32
  449. package/dist/cjs/ion-picker-column-option.cjs.entry.js +0 -104
  450. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  451. package/dist/collection/components/picker-column/test/disabled/picker-column.e2e.js +0 -113
  452. package/dist/collection/components/picker-column/test/slots/picker-column.e2e.js +0 -39
  453. package/dist/collection/components/picker-column-option/picker-column-option.ios.css +0 -87
  454. package/dist/collection/components/picker-column-option/picker-column-option.js +0 -173
  455. package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +0 -18
  456. package/dist/collection/components/picker-column-option/test/basic/picker-column-option.e2e.js +0 -37
  457. package/dist/collection/components/picker-legacy/picker.ios.css +0 -367
  458. package/dist/collection/components/picker-legacy/picker.js +0 -817
  459. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +0 -25
  460. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -419
  461. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +0 -65
  462. package/dist/esm/index-7a14ecec.js +0 -29
  463. package/dist/esm/ion-picker-column-option.entry.js +0 -100
  464. package/dist/esm-es5/index-80492ed3.js +0 -4
  465. package/dist/esm-es5/input-shims-0a2e541d.js +0 -4
  466. package/dist/esm-es5/input.utils-2846d430.js +0 -4
  467. package/dist/esm-es5/ion-picker-column-option.entry.js +0 -4
  468. package/dist/esm-es5/ion-picker-column.entry.js +0 -4
  469. package/dist/esm-es5/ion-picker.entry.js +0 -4
  470. package/dist/esm-es5/md.transition-94ac93e1.js +0 -4
  471. package/dist/esm-es5/overlays-fbc5cab5.js +0 -4
  472. package/dist/esm-es5/swipe-back-a8ca7f93.js +0 -4
  473. package/dist/ionic/p-22e5af95.entry.js +0 -4
  474. package/dist/ionic/p-232d1f22.entry.js +0 -4
  475. package/dist/ionic/p-23672c82.system.entry.js +0 -4
  476. package/dist/ionic/p-26798a7b.system.entry.js +0 -4
  477. package/dist/ionic/p-27bcbbc7.system.entry.js +0 -4
  478. package/dist/ionic/p-2ab4e925.system.entry.js +0 -4
  479. package/dist/ionic/p-2d5aeccc.js +0 -4
  480. package/dist/ionic/p-2d600c25.system.js +0 -4
  481. package/dist/ionic/p-308e1341.js +0 -4
  482. package/dist/ionic/p-32303650.system.entry.js +0 -4
  483. package/dist/ionic/p-34c39c48.entry.js +0 -4
  484. package/dist/ionic/p-3ba01a9c.system.entry.js +0 -4
  485. package/dist/ionic/p-3c58a71b.js +0 -4
  486. package/dist/ionic/p-3fd26bd6.system.entry.js +0 -4
  487. package/dist/ionic/p-3fe96156.system.js +0 -4
  488. package/dist/ionic/p-42ba3902.entry.js +0 -4
  489. package/dist/ionic/p-4a081ea9.entry.js +0 -4
  490. package/dist/ionic/p-4a31c99f.entry.js +0 -4
  491. package/dist/ionic/p-4a36430f.system.entry.js +0 -4
  492. package/dist/ionic/p-51abefb7.system.js +0 -4
  493. package/dist/ionic/p-563c41f0.system.entry.js +0 -4
  494. package/dist/ionic/p-5a68960f.entry.js +0 -4
  495. package/dist/ionic/p-6c37f051.js +0 -4
  496. package/dist/ionic/p-73190c5f.entry.js +0 -4
  497. package/dist/ionic/p-73aa7604.entry.js +0 -4
  498. package/dist/ionic/p-7b725280.entry.js +0 -4
  499. package/dist/ionic/p-8017aad2.system.entry.js +0 -4
  500. package/dist/ionic/p-83af3685.system.js +0 -4
  501. package/dist/ionic/p-846ee227.entry.js +0 -4
  502. package/dist/ionic/p-856c430d.js +0 -4
  503. package/dist/ionic/p-8c97cdc0.entry.js +0 -4
  504. package/dist/ionic/p-8fa6583d.system.js +0 -4
  505. package/dist/ionic/p-9282b16f.entry.js +0 -4
  506. package/dist/ionic/p-93000a81.system.entry.js +0 -4
  507. package/dist/ionic/p-990ffd0e.js +0 -4
  508. package/dist/ionic/p-9ba90516.system.entry.js +0 -4
  509. package/dist/ionic/p-a225bf0f.system.entry.js +0 -4
  510. package/dist/ionic/p-a60a1ce5.js +0 -4
  511. package/dist/ionic/p-a8baa23e.entry.js +0 -4
  512. package/dist/ionic/p-a98dc0c1.entry.js +0 -4
  513. package/dist/ionic/p-a9e3b5be.system.entry.js +0 -4
  514. package/dist/ionic/p-ab9456e9.system.entry.js +0 -4
  515. package/dist/ionic/p-afcf4620.entry.js +0 -4
  516. package/dist/ionic/p-c2910c78.entry.js +0 -4
  517. package/dist/ionic/p-c8f0a036.entry.js +0 -4
  518. package/dist/ionic/p-ca8938f4.js +0 -4
  519. package/dist/ionic/p-ca9d1792.system.entry.js +0 -4
  520. package/dist/ionic/p-cde52378.system.entry.js +0 -4
  521. package/dist/ionic/p-d43f1f3d.system.js +0 -4
  522. package/dist/ionic/p-d662d908.js +0 -4
  523. package/dist/ionic/p-d9695ad9.system.js +0 -4
  524. package/dist/ionic/p-da15f571.system.entry.js +0 -4
  525. package/dist/ionic/p-e4d90573.js +0 -4
  526. package/dist/ionic/p-f54c72b0.system.js +0 -4
  527. package/dist/ionic/p-f7a36cd0.system.js +0 -4
  528. package/dist/ionic/p-f967631d.js +0 -4
  529. package/dist/ionic/p-fe4dde76.entry.js +0 -4
  530. package/dist/ionic/p-ffd5dba4.system.entry.js +0 -4
  531. package/dist/types/components/picker/picker-interfaces.d.ts +0 -8
  532. package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -66
  533. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  534. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  535. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.enter.js +0 -0
  536. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.leave.js +0 -0
  537. /package/dist/collection/components/picker/{picker-interfaces.js → picker-interface.js} +0 -0
  538. /package/dist/collection/components/{picker-legacy-column → picker-column}/test/test.utils.js +0 -0
  539. /package/dist/collection/components/{picker-column/picker-column-interfaces.js → picker-column-internal/picker-column-internal-interfaces.js} +0 -0
  540. /package/dist/collection/components/{picker-legacy/picker-interface.js → picker-internal/picker-internal-interfaces.js} +0 -0
  541. /package/dist/esm-es5/{data-4b9508c9.js → data-f5c75b4e.js} +0 -0
  542. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  543. /package/dist/ionic/{p-368f5215.js → p-2aea8b1e.js} +0 -0
  544. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  545. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
  546. /package/dist/ionic/{p-f58981c2.system.js → p-82e3d633.system.js} +0 -0
  547. /package/dist/types/components/{picker-legacy → picker}/animations/ios.enter.d.ts +0 -0
  548. /package/dist/types/components/{picker-legacy → picker}/animations/ios.leave.d.ts +0 -0
  549. /package/dist/types/components/{picker-legacy → picker}/picker-interface.d.ts +0 -0
  550. /package/dist/types/components/{picker-legacy-column → picker-column}/test/test.utils.d.ts +0 -0
  551. /package/dist/types/components/{picker-column/picker-column-interfaces.d.ts → picker-column-internal/picker-column-internal-interfaces.d.ts} +0 -0
@@ -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
 
@@ -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,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
@@ -824,10 +877,7 @@ button {
824
877
  }
825
878
  }
826
879
 
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 {
880
+ :host(.label-floating.select-fill-solid) .label-text-wrapper {
831
881
  /**
832
882
  * Label text should not extend
833
883
  * beyond the bounds of the select.
@@ -983,10 +1033,7 @@ button {
983
1033
  /**
984
1034
  * This makes the label sit above the select.
985
1035
  */
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 {
1036
+ :host(.label-floating.select-fill-outline) .label-text-wrapper {
990
1037
  transform: translateY(-32%) scale(0.75);
991
1038
  margin-left: 0;
992
1039
  margin-right: 0;
@@ -1131,10 +1178,7 @@ button {
1131
1178
  * the floating/stacked label. We simulate this "cut out"
1132
1179
  * by removing the top border from the notch fragment.
1133
1180
  */
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 {
1181
+ :host(.label-floating.select-fill-outline) .select-outline-notch {
1138
1182
  border-top: none;
1139
1183
  }
1140
1184
 
@@ -1299,8 +1343,8 @@ button {
1299
1343
  --border-radius: 16px;
1300
1344
  }
1301
1345
 
1302
- :host(.select-label-placement-stacked) .native-wrapper,
1303
- :host(.select-label-placement-floating) .native-wrapper {
1346
+ :host(.select-label-placement-stacked) .select-wrapper-inner,
1347
+ :host(.select-label-placement-floating) .select-wrapper-inner {
1304
1348
  width: calc(100% - 0.8125rem - 4px);
1305
1349
  }
1306
1350
 
@@ -37,5 +37,20 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
37
37
  const list = page.locator('ion-list');
38
38
  await expect(list).toHaveScreenshot(screenshot(`select-inset-list-no-fill`));
39
39
  });
40
+ test('should render correctly in an item inside of a flex container', async ({ page }) => {
41
+ await page.setContent(`
42
+ <div id="container" style="display: flex">
43
+ <ion-list>
44
+ <ion-item>
45
+ <ion-select label="Fruit" value="apple">
46
+ <ion-select-option value="apple">Apple</ion-select-option>
47
+ </ion-select>
48
+ </ion-item>
49
+ <ion-list>
50
+ </div>
51
+ `, config);
52
+ const container = page.locator('#container');
53
+ await expect(container).toHaveScreenshot(screenshot(`select-item-flex-container`));
54
+ });
40
55
  });
41
56
  });
@@ -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
+ });