@ionic/core 7.5.8-nightly.20231206 → 7.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/components/animation.js +12 -11
  2. package/components/checkbox.js +5 -3
  3. package/components/index4.js +10 -12
  4. package/components/index5.js +0 -22
  5. package/components/input-shims.js +12 -7
  6. package/components/input.utils.js +3 -2
  7. package/components/ion-datetime.js +2 -2
  8. package/components/ion-infinite-scroll.js +11 -3
  9. package/components/ion-input.js +31 -8
  10. package/components/ion-modal.js +2 -2
  11. package/components/ion-range.js +5 -3
  12. package/components/ion-select.js +44 -29
  13. package/components/ion-skeleton-text.js +14 -1
  14. package/components/ion-textarea.js +30 -7
  15. package/components/ion-toast.js +419 -74
  16. package/components/ion-toggle.js +5 -3
  17. package/components/item.js +2 -2
  18. package/components/label.js +2 -2
  19. package/components/overlays.js +2 -1
  20. package/components/radio-group.js +2 -0
  21. package/components/radio.js +45 -5
  22. package/dist/cjs/{animation-cc40e39c.js → animation-9b401d39.js} +13 -12
  23. package/dist/cjs/{button-active-417ccdcb.js → button-active-a5185907.js} +1 -1
  24. package/dist/cjs/{capacitor-46980811.js → capacitor-c04564bf.js} +1 -1
  25. package/dist/cjs/compare-with-utils-df1001d7.js +44 -0
  26. package/dist/cjs/{haptic-216df36c.js → haptic-b882e0bb.js} +1 -1
  27. package/dist/cjs/{index-8c1e77d6.js → index-b4f986cd.js} +1 -1
  28. package/dist/cjs/index-c8d52405.js +10 -0
  29. package/dist/cjs/{index-5cbb20f9.js → index-ce101dc9.js} +11 -13
  30. package/dist/cjs/{index-d4c2e02c.js → index-f8f13389.js} +2 -2
  31. package/dist/cjs/index.cjs.js +8 -8
  32. package/dist/cjs/{input-shims-87102b6a.js → input-shims-a23bb0f4.js} +15 -10
  33. package/dist/cjs/{input.utils-2a11c1fe.js → input.utils-3d0166a2.js} +4 -3
  34. package/dist/cjs/ion-action-sheet.cjs.entry.js +6 -6
  35. package/dist/cjs/ion-alert.cjs.entry.js +6 -6
  36. package/dist/cjs/ion-app_8.cjs.entry.js +8 -8
  37. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -3
  38. package/dist/cjs/ion-datetime_3.cjs.entry.js +7 -7
  39. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +11 -3
  40. package/dist/cjs/ion-input.cjs.entry.js +34 -11
  41. package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
  42. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  43. package/dist/cjs/ion-menu_3.cjs.entry.js +5 -5
  44. package/dist/cjs/ion-modal.cjs.entry.js +8 -8
  45. package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
  46. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +3 -3
  47. package/dist/cjs/ion-popover.cjs.entry.js +4 -4
  48. package/dist/cjs/ion-radio_2.cjs.entry.js +9 -4
  49. package/dist/cjs/ion-range.cjs.entry.js +5 -3
  50. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  51. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  52. package/dist/cjs/ion-select_3.cjs.entry.js +51 -35
  53. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  54. package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
  55. package/dist/cjs/ion-toast.cjs.entry.js +434 -92
  56. package/dist/cjs/ion-toggle.cjs.entry.js +8 -6
  57. package/dist/cjs/ionic.cjs.js +1 -1
  58. package/dist/cjs/{ios.transition-a4ffb5a2.js → ios.transition-6787b799.js} +3 -3
  59. package/dist/cjs/{keyboard-9390928c.js → keyboard-0272231f.js} +1 -1
  60. package/dist/cjs/{keyboard-7d621ee9.js → keyboard-af1bb365.js} +3 -3
  61. package/dist/cjs/{keyboard-controller-2158b478.js → keyboard-controller-c05e747a.js} +2 -2
  62. package/dist/cjs/loader.cjs.js +1 -1
  63. package/dist/cjs/{md.transition-292abe1c.js → md.transition-e033d20a.js} +3 -3
  64. package/dist/cjs/{notch-controller-1dce508a.js → notch-controller-9735e7ac.js} +1 -1
  65. package/dist/cjs/{overlays-5c379703.js → overlays-27a6fb16.js} +3 -1
  66. package/dist/collection/components/checkbox/checkbox.ios.css +0 -6
  67. package/dist/collection/components/checkbox/checkbox.js +4 -1
  68. package/dist/collection/components/checkbox/checkbox.md.css +0 -6
  69. package/dist/collection/components/checkbox/test/checkbox.spec.js +14 -0
  70. package/dist/collection/components/datetime/datetime.ios.css +1 -0
  71. package/dist/collection/components/datetime/datetime.md.css +1 -0
  72. package/dist/collection/components/infinite-scroll/infinite-scroll.js +11 -3
  73. package/dist/collection/components/infinite-scroll/test/small-dom-update/infinite-scroll.e2e.js +31 -0
  74. package/dist/collection/components/input/input.ios.css +10 -3
  75. package/dist/collection/components/input/input.js +31 -6
  76. package/dist/collection/components/input/input.md.css +13 -12
  77. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  78. package/dist/collection/components/item/item.ios.css +41 -3
  79. package/dist/collection/components/item/item.md.css +41 -3
  80. package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
  81. package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
  82. package/dist/collection/components/label/label.ios.css +14 -3
  83. package/dist/collection/components/label/label.md.css +14 -3
  84. package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
  85. package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
  86. package/dist/collection/components/radio/radio.ios.css +0 -6
  87. package/dist/collection/components/radio/radio.js +7 -3
  88. package/dist/collection/components/radio/radio.md.css +0 -6
  89. package/dist/collection/components/radio/test/radio.spec.js +14 -0
  90. package/dist/collection/components/radio-group/radio-group.js +24 -0
  91. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  92. package/dist/collection/components/range/range.ios.css +0 -6
  93. package/dist/collection/components/range/range.js +4 -1
  94. package/dist/collection/components/range/range.md.css +0 -6
  95. package/dist/collection/components/range/test/range.spec.js +16 -0
  96. package/dist/collection/components/select/select.ios.css +60 -7
  97. package/dist/collection/components/select/select.js +45 -28
  98. package/dist/collection/components/select/select.md.css +63 -19
  99. package/dist/collection/components/select/test/item/select.e2e.js +15 -0
  100. package/dist/collection/components/select/test/label/select.e2e.js +1 -1
  101. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
  102. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  103. package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
  104. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  105. package/dist/collection/components/textarea/textarea.ios.css +37 -5
  106. package/dist/collection/components/textarea/textarea.js +30 -5
  107. package/dist/collection/components/textarea/textarea.md.css +47 -14
  108. package/dist/collection/components/toast/animations/ios.enter.js +2 -1
  109. package/dist/collection/components/toast/animations/md.enter.js +4 -3
  110. package/dist/collection/components/toast/animations/utils.js +20 -14
  111. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  112. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  113. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  114. package/dist/collection/components/toast/test/toast.spec.js +80 -0
  115. package/dist/collection/components/toast/toast.ios.css +10 -10
  116. package/dist/collection/components/toast/toast.js +104 -1
  117. package/dist/collection/components/toast/toast.md.css +10 -0
  118. package/dist/collection/components/toggle/test/toggle.spec.js +12 -0
  119. package/dist/collection/components/toggle/toggle.ios.css +0 -6
  120. package/dist/collection/components/toggle/toggle.js +4 -1
  121. package/dist/collection/components/toggle/toggle.md.css +0 -6
  122. package/dist/collection/utils/animation/animation.js +12 -11
  123. package/dist/collection/utils/animation/test/animation.spec.js +16 -0
  124. package/dist/collection/utils/browser/index.js +0 -22
  125. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  126. package/dist/collection/utils/forms/index.js +1 -0
  127. package/dist/collection/utils/input-shims/input-shims.js +12 -6
  128. package/dist/collection/utils/menu-controller/index.js +10 -12
  129. package/dist/collection/utils/overlays.js +1 -0
  130. package/dist/collection/utils/slot-mutation-controller.js +3 -2
  131. package/dist/docs.json +159 -2
  132. package/dist/esm/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +13 -12
  133. package/dist/esm/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
  134. package/dist/esm/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  135. package/dist/esm/compare-with-utils-a96ff2ea.js +41 -0
  136. package/dist/esm/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  137. package/dist/esm/{index-80492ed3.js → index-0c12c22b.js} +11 -13
  138. package/dist/esm/{index-d8817fb0.js → index-1932b201.js} +2 -2
  139. package/dist/esm/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  140. package/dist/esm/index-a5d50daf.js +7 -0
  141. package/dist/esm/index.js +8 -8
  142. package/dist/esm/{input-shims-0a2e541d.js → input-shims-6539ce13.js} +14 -9
  143. package/dist/esm/{input.utils-2846d430.js → input.utils-a5a2d164.js} +4 -3
  144. package/dist/esm/ion-action-sheet.entry.js +6 -6
  145. package/dist/esm/ion-alert.entry.js +6 -6
  146. package/dist/esm/ion-app_8.entry.js +8 -8
  147. package/dist/esm/ion-checkbox.entry.js +5 -3
  148. package/dist/esm/ion-datetime_3.entry.js +7 -7
  149. package/dist/esm/ion-infinite-scroll_2.entry.js +11 -3
  150. package/dist/esm/ion-input.entry.js +34 -11
  151. package/dist/esm/ion-item_8.entry.js +17 -4
  152. package/dist/esm/ion-loading.entry.js +3 -3
  153. package/dist/esm/ion-menu_3.entry.js +5 -5
  154. package/dist/esm/ion-modal.entry.js +8 -8
  155. package/dist/esm/ion-nav_2.entry.js +1 -1
  156. package/dist/esm/ion-picker-column-internal.entry.js +3 -3
  157. package/dist/esm/ion-popover.entry.js +4 -4
  158. package/dist/esm/ion-radio_2.entry.js +9 -4
  159. package/dist/esm/ion-range.entry.js +5 -3
  160. package/dist/esm/ion-refresher_2.entry.js +4 -4
  161. package/dist/esm/ion-reorder_2.entry.js +3 -3
  162. package/dist/esm/ion-select_3.entry.js +47 -31
  163. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  164. package/dist/esm/ion-textarea.entry.js +33 -10
  165. package/dist/esm/ion-toast.entry.js +417 -75
  166. package/dist/esm/ion-toggle.entry.js +8 -6
  167. package/dist/esm/ionic.js +1 -1
  168. package/dist/esm/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +3 -3
  169. package/dist/esm/{keyboard-c402e885.js → keyboard-52278bd7.js} +3 -3
  170. package/dist/esm/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  171. package/dist/esm/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +2 -2
  172. package/dist/esm/loader.js +1 -1
  173. package/dist/esm/{md.transition-94ac93e1.js → md.transition-43c2874d.js} +3 -3
  174. package/dist/esm/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  175. package/dist/esm/{overlays-abf58489.js → overlays-32ef481d.js} +3 -2
  176. package/dist/esm-es5/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +1 -1
  177. package/dist/esm-es5/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
  178. package/dist/esm-es5/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
  179. package/dist/esm-es5/compare-with-utils-a96ff2ea.js +4 -0
  180. package/dist/esm-es5/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
  181. package/dist/esm-es5/index-0c12c22b.js +4 -0
  182. package/dist/esm-es5/{index-d8817fb0.js → index-1932b201.js} +1 -1
  183. package/dist/esm-es5/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
  184. package/dist/esm-es5/index.js +1 -1
  185. package/dist/esm-es5/input-shims-6539ce13.js +4 -0
  186. package/dist/esm-es5/input.utils-a5a2d164.js +4 -0
  187. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  188. package/dist/esm-es5/ion-alert.entry.js +1 -1
  189. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  190. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  191. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  192. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  193. package/dist/esm-es5/ion-input.entry.js +1 -1
  194. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  195. package/dist/esm-es5/ion-loading.entry.js +1 -1
  196. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  197. package/dist/esm-es5/ion-modal.entry.js +1 -1
  198. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  199. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  200. package/dist/esm-es5/ion-popover.entry.js +1 -1
  201. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  202. package/dist/esm-es5/ion-range.entry.js +1 -1
  203. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  204. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  205. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  206. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  207. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  208. package/dist/esm-es5/ion-toast.entry.js +1 -1
  209. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  210. package/dist/esm-es5/ionic.js +1 -1
  211. package/dist/esm-es5/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +1 -1
  212. package/dist/esm-es5/{keyboard-c402e885.js → keyboard-52278bd7.js} +1 -1
  213. package/dist/esm-es5/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
  214. package/dist/esm-es5/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +1 -1
  215. package/dist/esm-es5/loader.js +1 -1
  216. package/dist/esm-es5/md.transition-43c2874d.js +4 -0
  217. package/dist/esm-es5/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
  218. package/dist/esm-es5/{overlays-abf58489.js → overlays-32ef481d.js} +1 -1
  219. package/dist/html.html-data.json +14 -1
  220. package/dist/ionic/index.esm.js +1 -1
  221. package/dist/ionic/ionic.esm.js +1 -1
  222. package/dist/ionic/p-01d14eba.system.entry.js +4 -0
  223. package/dist/ionic/{p-3de71759.entry.js → p-042e6f4b.entry.js} +1 -1
  224. package/dist/ionic/p-05d83227.system.entry.js +4 -0
  225. package/dist/ionic/{p-32e19bee.system.js → p-0bd51c34.system.js} +1 -1
  226. package/dist/ionic/{p-73637557.system.entry.js → p-16756e94.system.entry.js} +1 -1
  227. package/dist/ionic/p-1b19c04b.entry.js +4 -0
  228. package/dist/ionic/{p-95c26010.system.js → p-1cca10d6.system.js} +1 -1
  229. package/dist/ionic/p-1e4371bd.js +4 -0
  230. package/dist/ionic/{p-0519cd21.entry.js → p-251666e2.entry.js} +1 -1
  231. package/dist/ionic/{p-4e8e09e1.js → p-27281edd.js} +1 -1
  232. package/dist/ionic/p-28249b10.system.entry.js +4 -0
  233. package/dist/ionic/p-28a2c2a2.entry.js +4 -0
  234. package/dist/ionic/p-29d03b3a.js +4 -0
  235. package/dist/ionic/p-2b7827c7.js +4 -0
  236. package/dist/ionic/p-2d3b9fa3.system.entry.js +4 -0
  237. package/dist/ionic/p-2d539df1.entry.js +4 -0
  238. package/dist/ionic/{p-a0126dd5.system.entry.js → p-3137c025.system.entry.js} +1 -1
  239. package/dist/ionic/{p-30029cc2.system.js → p-31fcb233.system.js} +1 -1
  240. package/dist/ionic/{p-b0dc1cf9.system.js → p-33a37fad.system.js} +1 -1
  241. package/dist/ionic/p-36d187af.js +4 -0
  242. package/dist/ionic/p-376a6063.js +4 -0
  243. package/dist/ionic/p-38f2c6bb.system.js +4 -0
  244. package/dist/ionic/{p-2ba0657d.system.entry.js → p-39c31982.system.entry.js} +1 -1
  245. package/dist/ionic/{p-75445583.js → p-3a75d7fd.js} +1 -1
  246. package/dist/ionic/{p-d40a974a.entry.js → p-3dd98a73.entry.js} +1 -1
  247. package/dist/ionic/p-3e6b47e8.system.entry.js +4 -0
  248. package/dist/ionic/p-3f5179b5.entry.js +4 -0
  249. package/dist/ionic/p-40f68333.system.js +4 -0
  250. package/dist/ionic/{p-643a8fae.js → p-42f189f4.js} +1 -1
  251. package/dist/ionic/{p-9c3b6849.entry.js → p-438e1b8a.entry.js} +1 -1
  252. package/dist/ionic/{p-b752714f.system.entry.js → p-46d400b4.system.entry.js} +1 -1
  253. package/dist/ionic/{p-61d7d7fb.js → p-47b6ba5b.js} +1 -1
  254. package/dist/ionic/{p-b04e4d62.entry.js → p-4d67d27a.entry.js} +1 -1
  255. package/dist/ionic/{p-0b1bc636.entry.js → p-4f3ae45a.entry.js} +1 -1
  256. package/dist/ionic/{p-18b6bd23.system.entry.js → p-517a9885.system.entry.js} +1 -1
  257. package/dist/ionic/p-53ec4f1c.system.js +4 -0
  258. package/dist/ionic/p-5e4eec2e.entry.js +4 -0
  259. package/dist/ionic/{p-57477107.system.js → p-5e745192.system.js} +1 -1
  260. package/dist/ionic/{p-ad019ef0.entry.js → p-5eda1d7d.entry.js} +1 -1
  261. package/dist/ionic/{p-4890093d.js → p-6de472cb.js} +1 -1
  262. package/dist/ionic/{p-08f196ce.system.entry.js → p-6de62649.system.entry.js} +1 -1
  263. package/dist/ionic/p-72f6ff89.js +4 -0
  264. package/dist/ionic/p-765f4dde.entry.js +4 -0
  265. package/dist/ionic/{p-3f6270b3.entry.js → p-78aadecb.entry.js} +1 -1
  266. package/dist/ionic/p-7d92bf15.system.entry.js +4 -0
  267. package/dist/ionic/p-7ee0f3f2.entry.js +4 -0
  268. package/dist/ionic/p-8314281e.system.js +4 -0
  269. package/dist/ionic/p-88d5fbd3.js +4 -0
  270. package/dist/ionic/{p-0e4f2e17.system.js → p-8985cdb6.system.js} +1 -1
  271. package/dist/ionic/{p-d7be6b7e.system.entry.js → p-8acae6b0.system.entry.js} +1 -1
  272. package/dist/ionic/p-8d69a624.entry.js +4 -0
  273. package/dist/ionic/p-8de17614.system.entry.js +4 -0
  274. package/dist/ionic/p-91d33c4a.js +4 -0
  275. package/dist/ionic/p-979d4f5c.system.js +4 -0
  276. package/dist/ionic/p-9b7f0b0f.entry.js +4 -0
  277. package/dist/ionic/p-9e447eb1.system.js +4 -0
  278. package/dist/ionic/p-9f6ee2c0.system.entry.js +4 -0
  279. package/dist/ionic/{p-94389114.system.entry.js → p-a0bb7b92.system.entry.js} +1 -1
  280. package/dist/ionic/{p-f2c21dae.system.js → p-a0d7bb5e.system.js} +1 -1
  281. package/dist/ionic/{p-82045bc1.entry.js → p-a3277a67.entry.js} +1 -1
  282. package/dist/ionic/{p-50880712.entry.js → p-a9978d08.entry.js} +1 -1
  283. package/dist/ionic/{p-3b686a65.system.entry.js → p-ada96dd0.system.entry.js} +1 -1
  284. package/dist/ionic/p-afd6ca9d.entry.js +4 -0
  285. package/dist/ionic/p-b56d0866.system.entry.js +4 -0
  286. package/dist/ionic/{p-67da080d.entry.js → p-b6f9d32a.entry.js} +1 -1
  287. package/dist/ionic/p-c61cc894.js +4 -0
  288. package/dist/ionic/{p-304383f9.system.js → p-cabad15b.system.js} +1 -1
  289. package/dist/ionic/{p-31158892.js → p-cdbeaadc.js} +1 -1
  290. package/dist/ionic/p-d032f825.system.entry.js +4 -0
  291. package/dist/ionic/p-d51674c5.system.js +4 -0
  292. package/dist/ionic/{p-98d82c73.system.js → p-ddbb2d5b.system.js} +1 -1
  293. package/dist/ionic/p-de6f8b28.system.js +4 -0
  294. package/dist/ionic/p-de756e5c.js +4 -0
  295. package/dist/ionic/{p-73ea8f82.system.entry.js → p-dee7c1d0.system.entry.js} +1 -1
  296. package/dist/ionic/p-dfd9432a.entry.js +4 -0
  297. package/dist/ionic/{p-af5cfad2.system.js → p-e24ce1e5.system.js} +1 -1
  298. package/dist/ionic/p-e3584231.system.js +1 -1
  299. package/dist/ionic/p-f0445d82.system.entry.js +4 -0
  300. package/dist/ionic/p-f656e032.system.entry.js +4 -0
  301. package/dist/ionic/{p-17f893be.js → p-f70970cf.js} +1 -1
  302. package/dist/ionic/{p-e553006f.system.entry.js → p-fba0a6e7.system.entry.js} +1 -1
  303. package/dist/ionic/p-feae5133.entry.js +4 -0
  304. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  305. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +7 -0
  306. package/dist/types/components/input/input.d.ts +2 -0
  307. package/dist/types/components/radio/radio.d.ts +1 -0
  308. package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
  309. package/dist/types/components/radio-group/radio-group.d.ts +8 -1
  310. package/dist/types/components/range/range.d.ts +1 -0
  311. package/dist/types/components/router/router.d.ts +2 -1
  312. package/dist/types/components/select/select.d.ts +6 -1
  313. package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
  314. package/dist/types/components/textarea/textarea.d.ts +2 -0
  315. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  316. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  317. package/dist/types/components/toast/toast-interface.d.ts +2 -0
  318. package/dist/types/components/toast/toast.d.ts +28 -1
  319. package/dist/types/components/toggle/toggle.d.ts +1 -0
  320. package/dist/types/components.d.ts +37 -6
  321. package/dist/types/interface.d.ts +1 -5
  322. package/dist/types/jest.d.ts +5 -0
  323. package/dist/types/utils/animation/animation-interface.d.ts +4 -4
  324. package/dist/types/utils/browser/index.d.ts +11 -2
  325. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  326. package/dist/types/utils/forms/index.d.ts +1 -0
  327. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  328. package/dist/types/utils/overlays.d.ts +1 -0
  329. package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
  330. package/hydrate/index.js +643 -184
  331. package/package.json +1 -1
  332. package/dist/cjs/index-306a7476.js +0 -32
  333. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  334. package/dist/esm/index-7a14ecec.js +0 -29
  335. package/dist/esm-es5/index-80492ed3.js +0 -4
  336. package/dist/esm-es5/input-shims-0a2e541d.js +0 -4
  337. package/dist/esm-es5/input.utils-2846d430.js +0 -4
  338. package/dist/esm-es5/md.transition-94ac93e1.js +0 -4
  339. package/dist/ionic/p-1d17219f.entry.js +0 -4
  340. package/dist/ionic/p-232d1f22.entry.js +0 -4
  341. package/dist/ionic/p-25b32c3d.entry.js +0 -4
  342. package/dist/ionic/p-2ab4e925.system.entry.js +0 -4
  343. package/dist/ionic/p-2d5aeccc.js +0 -4
  344. package/dist/ionic/p-2d600c25.system.js +0 -4
  345. package/dist/ionic/p-308e1341.js +0 -4
  346. package/dist/ionic/p-32303650.system.entry.js +0 -4
  347. package/dist/ionic/p-34c39c48.entry.js +0 -4
  348. package/dist/ionic/p-3c58a71b.js +0 -4
  349. package/dist/ionic/p-3e960213.system.entry.js +0 -4
  350. package/dist/ionic/p-3fd26bd6.system.entry.js +0 -4
  351. package/dist/ionic/p-3fe96156.system.js +0 -4
  352. package/dist/ionic/p-42ba3902.entry.js +0 -4
  353. package/dist/ionic/p-4a31c99f.entry.js +0 -4
  354. package/dist/ionic/p-5a68960f.entry.js +0 -4
  355. package/dist/ionic/p-6470b136.entry.js +0 -4
  356. package/dist/ionic/p-6c37f051.js +0 -4
  357. package/dist/ionic/p-7b8d0af2.system.entry.js +0 -4
  358. package/dist/ionic/p-7faba551.system.entry.js +0 -4
  359. package/dist/ionic/p-83af3685.system.js +0 -4
  360. package/dist/ionic/p-856c430d.js +0 -4
  361. package/dist/ionic/p-93000a81.system.entry.js +0 -4
  362. package/dist/ionic/p-98b14ece.entry.js +0 -4
  363. package/dist/ionic/p-990ffd0e.js +0 -4
  364. package/dist/ionic/p-a6f9dd7b.entry.js +0 -4
  365. package/dist/ionic/p-a98dc0c1.entry.js +0 -4
  366. package/dist/ionic/p-a9e3b5be.system.entry.js +0 -4
  367. package/dist/ionic/p-ab9456e9.system.entry.js +0 -4
  368. package/dist/ionic/p-b4bad293.system.entry.js +0 -4
  369. package/dist/ionic/p-c3289ef2.entry.js +0 -4
  370. package/dist/ionic/p-c3d09cf2.system.entry.js +0 -4
  371. package/dist/ionic/p-d1cb29a8.system.entry.js +0 -4
  372. package/dist/ionic/p-d43f1f3d.system.js +0 -4
  373. package/dist/ionic/p-d662d908.js +0 -4
  374. package/dist/ionic/p-d9695ad9.system.js +0 -4
  375. package/dist/ionic/p-e4d90573.js +0 -4
  376. package/dist/ionic/p-f54c72b0.system.js +0 -4
  377. package/dist/ionic/p-f7a36cd0.system.js +0 -4
  378. package/dist/ionic/p-f967631d.js +0 -4
  379. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  380. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  381. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
@@ -163,12 +163,6 @@
163
163
  }
164
164
 
165
165
  .label-text-wrapper {
166
- /**
167
- * This ensures that double tapping this text
168
- * clicks the <label> and focuses the checkbox
169
- * when a screen reader is enabled.
170
- */
171
- pointer-events: none;
172
166
  text-overflow: ellipsis;
173
167
  white-space: nowrap;
174
168
  overflow: hidden;
@@ -13,6 +13,7 @@ import { getIonMode } from "../../global/ionic-global";
13
13
  * @slot - The label text to associate with the checkbox. Use the "labelPlacement" property to control where the label is placed relative to the checkbox.
14
14
  *
15
15
  * @part container - The container for the checkbox mark.
16
+ * @part label - The label text describing the checkbox.
16
17
  * @part mark - The checkmark used to indicate the checked state.
17
18
  */
18
19
  export class Checkbox {
@@ -80,6 +81,8 @@ export class Checkbox {
80
81
  emitStyle() {
81
82
  const style = {
82
83
  'interactive-disabled': this.disabled,
84
+ // TODO(FW-3100): remove this
85
+ legacy: !!this.legacy,
83
86
  };
84
87
  // TODO(FW-3100): remove this
85
88
  if (this.legacyFormController.hasLegacyControl()) {
@@ -115,7 +118,7 @@ export class Checkbox {
115
118
  }), onClick: this.onClick }, h("label", { class: "checkbox-wrapper" }, h("input", Object.assign({ type: "checkbox", checked: checked ? true : undefined, disabled: disabled, id: inputId, onChange: this.toggleChecked, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl) }, inheritedAttributes)), h("div", { class: {
116
119
  'label-text-wrapper': true,
117
120
  'label-text-wrapper-hidden': el.textContent === '',
118
- } }, h("slot", null)), h("div", { class: "native-wrapper" }, h("svg", { class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
121
+ }, part: "label" }, h("slot", null)), h("div", { class: "native-wrapper" }, h("svg", { class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
119
122
  }
120
123
  // TODO(FW-3100): remove this
121
124
  renderLegacyCheckbox() {
@@ -163,12 +163,6 @@
163
163
  }
164
164
 
165
165
  .label-text-wrapper {
166
- /**
167
- * This ensures that double tapping this text
168
- * clicks the <label> and focuses the checkbox
169
- * when a screen reader is enabled.
170
- */
171
- pointer-events: none;
172
166
  text-overflow: ellipsis;
173
167
  white-space: nowrap;
174
168
  overflow: hidden;
@@ -3,6 +3,20 @@
3
3
  */
4
4
  import { newSpecPage } from "@stencil/core/testing";
5
5
  import { Checkbox } from "../checkbox";
6
+ describe('ion-checkbox: shadow parts', () => {
7
+ it('should render the checkbox with shadow parts', async () => {
8
+ const page = await newSpecPage({
9
+ components: [Checkbox],
10
+ html: `
11
+ <ion-checkbox>Checkbox</ion-checkbox>
12
+ `,
13
+ });
14
+ const checkbox = page.body.querySelector('ion-checkbox');
15
+ expect(checkbox).toHaveShadowPart('container');
16
+ expect(checkbox).toHaveShadowPart('label');
17
+ expect(checkbox).toHaveShadowPart('mark');
18
+ });
19
+ });
6
20
  describe('ion-checkbox: disabled', () => {
7
21
  it('clicking disabled checkbox should not toggle checked state', async () => {
8
22
  const page = await newSpecPage({
@@ -325,6 +325,7 @@ ion-picker-column-internal {
325
325
  :host .calendar-action-buttons ion-item ion-label {
326
326
  display: flex;
327
327
  align-items: center;
328
+ width: auto;
328
329
  }
329
330
 
330
331
  :host .calendar-action-buttons ion-item ion-icon {
@@ -325,6 +325,7 @@ ion-picker-column-internal {
325
325
  :host .calendar-action-buttons ion-item ion-label {
326
326
  display: flex;
327
327
  align-items: center;
328
+ width: auto;
328
329
  }
329
330
 
330
331
  :host .calendar-action-buttons ion-item ion-icon {
@@ -8,6 +8,13 @@ export class InfiniteScroll {
8
8
  constructor() {
9
9
  this.thrPx = 0;
10
10
  this.thrPc = 0;
11
+ /**
12
+ * didFire exists so that ionInfinite
13
+ * does not fire multiple times if
14
+ * users continue to scroll after
15
+ * scrolling into the infinite
16
+ * scroll threshold.
17
+ */
11
18
  this.didFire = false;
12
19
  this.isBusy = false;
13
20
  this.onScroll = () => {
@@ -35,9 +42,6 @@ export class InfiniteScroll {
35
42
  return 3;
36
43
  }
37
44
  }
38
- else {
39
- this.didFire = false;
40
- }
41
45
  return 4;
42
46
  };
43
47
  this.isLoading = false;
@@ -137,11 +141,15 @@ export class InfiniteScroll {
137
141
  writeTask(() => {
138
142
  scrollEl.scrollTop = newScrollTop;
139
143
  this.isBusy = false;
144
+ this.didFire = false;
140
145
  });
141
146
  });
142
147
  });
143
148
  });
144
149
  }
150
+ else {
151
+ this.didFire = false;
152
+ }
145
153
  }
146
154
  canStart() {
147
155
  return !this.disabled && !this.isBusy && !!this.scrollEl && !this.isLoading;
@@ -0,0 +1,31 @@
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({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
7
+ test.describe(title('infinite-scroll: appending small amounts to dom'), () => {
8
+ test('should load more after remaining in threshold', async ({ page }) => {
9
+ await page.goto('/src/components/infinite-scroll/test/small-dom-update', config);
10
+ const ionInfiniteComplete = await page.spyOnEvent('ionInfiniteComplete');
11
+ const content = page.locator('ion-content');
12
+ const items = page.locator('#list .item');
13
+ expect(await items.count()).toBe(30);
14
+ await content.evaluate((el) => el.scrollToBottom(0));
15
+ await ionInfiniteComplete.next();
16
+ /**
17
+ * Even after appending we'll still be within
18
+ * the infinite scroll's threshold
19
+ */
20
+ expect(await items.count()).toBe(33);
21
+ await content.evaluate((el) => el.scrollToBottom(0));
22
+ await ionInfiniteComplete.next();
23
+ /**
24
+ * Scrolling down again without leaving
25
+ * the threshold should still trigger
26
+ * infinite scroll again.
27
+ */
28
+ expect(await items.count()).toBe(36);
29
+ });
30
+ });
31
+ });
@@ -350,6 +350,7 @@
350
350
  display: flex;
351
351
  position: relative;
352
352
  flex-grow: 1;
353
+ align-items: center;
353
354
  width: 100%;
354
355
  }
355
356
 
@@ -654,9 +655,7 @@
654
655
  /**
655
656
  * This makes the label sit above the input.
656
657
  */
657
- :host(.input-label-placement-stacked) .label-text-wrapper,
658
- :host(.has-focus.input-label-placement-floating) .label-text-wrapper,
659
- :host(.has-value.input-label-placement-floating) .label-text-wrapper {
658
+ :host(.label-floating) .label-text-wrapper {
660
659
  transform: translateY(50%) scale(0.75);
661
660
  /**
662
661
  * Label text should not extend
@@ -665,6 +664,14 @@
665
664
  max-width: calc(100% / 0.75);
666
665
  }
667
666
 
667
+ ::slotted([slot=start]) {
668
+ margin-inline-end: 16px;
669
+ }
670
+
671
+ ::slotted([slot=end]) {
672
+ margin-inline-start: 16px;
673
+ }
674
+
668
675
  /**
669
676
  * Convert a font size to a dynamic font size.
670
677
  * Fonts that participate in Dynamic Type should use
@@ -14,6 +14,8 @@ import { getCounterText } from "./input.utils";
14
14
  * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
15
15
  *
16
16
  * @slot label - The label text to associate with the input. Use the `labelPlacement` property to control where the label is placed relative to the input. Use this if you need to render a label with custom HTML. (EXPERIMENTAL)
17
+ * @slot start - Content to display at the leading edge of the input. (EXPERIMENTAL)
18
+ * @slot end - Content to display at the trailing edge of the input. (EXPERIMENTAL)
17
19
  */
18
20
  export class Input {
19
21
  constructor() {
@@ -157,7 +159,7 @@ export class Input {
157
159
  connectedCallback() {
158
160
  const { el } = this;
159
161
  this.legacyFormController = createLegacyFormController(el);
160
- this.slotMutationController = createSlotMutationController(el, 'label', () => forceUpdate(this));
162
+ this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => forceUpdate(this));
161
163
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
162
164
  this.emitStyle();
163
165
  this.debounceChanged();
@@ -258,6 +260,8 @@ export class Input {
258
260
  'has-value': this.hasValue(),
259
261
  'has-focus': this.hasFocus,
260
262
  'interactive-disabled': this.disabled,
263
+ // TODO(FW-2764): remove this
264
+ legacy: !!this.legacy,
261
265
  });
262
266
  }
263
267
  }
@@ -363,29 +367,50 @@ export class Input {
363
367
  return this.renderLabel();
364
368
  }
365
369
  renderInput() {
366
- const { disabled, fill, readonly, shape, inputId, labelPlacement } = this;
370
+ const { disabled, fill, readonly, shape, inputId, labelPlacement, el, hasFocus } = this;
367
371
  const mode = getIonMode(this);
368
372
  const value = this.getValue();
369
373
  const inItem = hostContext('ion-item', this.el);
370
374
  const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
375
+ const hasValue = this.hasValue();
376
+ const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
377
+ /**
378
+ * If the label is stacked, it should always sit above the input.
379
+ * For floating labels, the label should move above the input if
380
+ * the input has a value, is focused, or has anything in either
381
+ * the start or end slot.
382
+ *
383
+ * If there is content in the start slot, the label would overlap
384
+ * it if not forced to float. This is also applied to the end slot
385
+ * because with the default or solid fills, the input is not
386
+ * vertically centered in the container, but the label is. This
387
+ * causes the slots and label to appear vertically offset from each
388
+ * other when the label isn't floating above the input. This doesn't
389
+ * apply to the outline fill, but this was not accounted for to keep
390
+ * things consistent.
391
+ *
392
+ * TODO(FW-5592): Remove hasStartEndSlots condition
393
+ */
394
+ const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
371
395
  return (h(Host, { class: createColorClasses(this.color, {
372
396
  [mode]: true,
373
- 'has-value': this.hasValue(),
374
- 'has-focus': this.hasFocus,
397
+ 'has-value': hasValue,
398
+ 'has-focus': hasFocus,
399
+ 'label-floating': labelShouldFloat,
375
400
  [`input-fill-${fill}`]: fill !== undefined,
376
401
  [`input-shape-${shape}`]: shape !== undefined,
377
402
  [`input-label-placement-${labelPlacement}`]: true,
378
403
  'in-item': inItem,
379
404
  'in-item-color': hostContext('ion-item.ion-color', this.el),
380
405
  'input-disabled': disabled,
381
- }) }, h("label", { class: "input-wrapper" }, this.renderLabelContainer(), h("div", { class: "native-wrapper" }, h("input", Object.assign({ class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, accept: this.accept, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, size: this.size, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
406
+ }) }, h("label", { class: "input-wrapper", htmlFor: inputId }, this.renderLabelContainer(), h("div", { class: "native-wrapper" }, h("slot", { name: "start" }), h("input", Object.assign({ class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, accept: this.accept, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, size: this.size, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
382
407
  /**
383
408
  * This prevents mobile browsers from
384
409
  * blurring the input when the clear
385
410
  * button is activated.
386
411
  */
387
412
  ev.preventDefault();
388
- }, onClick: this.clearTextInput }, h("ion-icon", { "aria-hidden": "true", icon: mode === 'ios' ? closeCircle : closeSharp })))), shouldRenderHighlight && h("div", { class: "input-highlight" })), this.renderBottomContent()));
413
+ }, onClick: this.clearTextInput }, h("ion-icon", { "aria-hidden": "true", icon: mode === 'ios' ? closeCircle : closeSharp }))), h("slot", { name: "end" })), shouldRenderHighlight && h("div", { class: "input-highlight" })), this.renderBottomContent()));
389
414
  }
390
415
  // TODO FW-2764 Remove this
391
416
  renderLegacyInput() {
@@ -350,6 +350,7 @@
350
350
  display: flex;
351
351
  position: relative;
352
352
  flex-grow: 1;
353
+ align-items: center;
353
354
  width: 100%;
354
355
  }
355
356
 
@@ -654,9 +655,7 @@
654
655
  /**
655
656
  * This makes the label sit above the input.
656
657
  */
657
- :host(.input-label-placement-stacked) .label-text-wrapper,
658
- :host(.has-focus.input-label-placement-floating) .label-text-wrapper,
659
- :host(.has-value.input-label-placement-floating) .label-text-wrapper {
658
+ :host(.label-floating) .label-text-wrapper {
660
659
  transform: translateY(50%) scale(0.75);
661
660
  /**
662
661
  * Label text should not extend
@@ -665,6 +664,14 @@
665
664
  max-width: calc(100% / 0.75);
666
665
  }
667
666
 
667
+ ::slotted([slot=start]) {
668
+ margin-inline-end: 16px;
669
+ }
670
+
671
+ ::slotted([slot=end]) {
672
+ margin-inline-start: 16px;
673
+ }
674
+
668
675
  /**
669
676
  * Convert a font size to a dynamic font size.
670
677
  * Fonts that participate in Dynamic Type should use
@@ -907,9 +914,7 @@
907
914
  }
908
915
  }
909
916
 
910
- :host(.input-fill-solid.input-label-placement-stacked) .label-text-wrapper,
911
- :host(.has-focus.input-fill-solid.input-label-placement-floating) .label-text-wrapper,
912
- :host(.has-value.input-fill-solid.input-label-placement-floating) .label-text-wrapper {
917
+ :host(.label-floating.input-fill-solid.input-label-placement-floating) .label-text-wrapper {
913
918
  /**
914
919
  * Label text should not extend
915
920
  * beyond the bounds of the input.
@@ -1063,9 +1068,7 @@
1063
1068
  /**
1064
1069
  * This makes the label sit above the input.
1065
1070
  */
1066
- :host(.has-focus.input-fill-outline.input-label-placement-floating) .label-text-wrapper,
1067
- :host(.has-value.input-fill-outline.input-label-placement-floating) .label-text-wrapper,
1068
- :host(.input-fill-outline.input-label-placement-stacked) .label-text-wrapper {
1071
+ :host(.label-floating.input-fill-outline) .label-text-wrapper {
1069
1072
  transform: translateY(-32%) scale(0.75);
1070
1073
  margin-left: 0;
1071
1074
  margin-right: 0;
@@ -1226,9 +1229,7 @@
1226
1229
  * the floating/stacked label. We simulate this "cut out"
1227
1230
  * by removing the top border from the notch fragment.
1228
1231
  */
1229
- :host(.has-focus.input-fill-outline.input-label-placement-floating) .input-outline-notch,
1230
- :host(.has-value.input-fill-outline.input-label-placement-floating) .input-outline-notch,
1231
- :host(.input-fill-outline.input-label-placement-stacked) .input-outline-notch {
1232
+ :host(.label-floating.input-fill-outline) .input-outline-notch {
1232
1233
  border-top: none;
1233
1234
  }
1234
1235
 
@@ -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('input: 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-input label-placement="start" fill="solid" value="100" label="Weight" clear-input="true">
11
+ <ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
12
+ <ion-label slot="end">lbs</ion-label>
13
+ </ion-input>
14
+ `, config);
15
+ const input = page.locator('ion-input');
16
+ await expect(input).toHaveScreenshot(screenshot(`input-slots-label-start`));
17
+ });
18
+ test('should not have visual regressions with a floating label', async ({ page }) => {
19
+ await page.setContent(`
20
+ <ion-input label-placement="floating" fill="solid" value="100" label="Weight" clear-input="true">
21
+ <ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
22
+ <ion-label slot="end">lbs</ion-label>
23
+ </ion-input>
24
+ `, config);
25
+ const input = page.locator('ion-input');
26
+ await expect(input).toHaveScreenshot(screenshot(`input-slots-label-floating`));
27
+ });
28
+ });
29
+ });
30
+ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
31
+ test.describe(title('input: 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-input label-placement="floating" fill="solid" label="Weight">
35
+ <ion-icon slot="start" name="barbell" aria-hidden="true"></ion-icon>
36
+ </ion-input>
37
+ `, config);
38
+ const input = page.locator('ion-input');
39
+ await expect(input).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-input label-placement="floating" fill="solid" label="Weight">
44
+ <ion-icon slot="end" name="barbell" aria-hidden="true"></ion-icon>
45
+ </ion-input>
46
+ `, config);
47
+ const input = page.locator('ion-input');
48
+ await expect(input).toHaveClass(/label-floating/);
49
+ });
50
+ });
51
+ });
@@ -100,6 +100,14 @@
100
100
  * @prop --highlight-color-valid: The color of the highlight on the item when valid. Only applies to inputs and textareas using the legacy form syntax. DEPRECATED: Highlights can be styled on `ion-input` or `ion-textarea` when using the modern form syntax.
101
101
  * @prop --highlight-color-invalid: The color of the highlight on the item when invalid. Only applies to inputs and textareas using the legacy form syntax. DEPRECATED: Highlights can be styled on `ion-input` or `ion-textarea` when using the modern form syntax.
102
102
  */
103
+ /**
104
+ * We change the minimum width as the
105
+ * font size changes. Using a fixed minimum
106
+ * width means that fewer and fewer characters
107
+ * can be displayed in the same space as the
108
+ * text grows.
109
+ */
110
+ --inner-min-width: 4rem;
103
111
  --border-radius: 0px;
104
112
  --border-width: 0px;
105
113
  --border-style: solid;
@@ -230,6 +238,7 @@
230
238
  /* stylelint-enable */
231
239
  display: flex;
232
240
  position: relative;
241
+ flex-wrap: wrap;
233
242
  align-items: inherit;
234
243
  justify-content: inherit;
235
244
  width: 100%;
@@ -241,8 +250,8 @@
241
250
  outline: none;
242
251
  background: var(--background);
243
252
  overflow: inherit;
244
- box-sizing: border-box;
245
253
  z-index: 1;
254
+ box-sizing: border-box;
246
255
  }
247
256
  :host-context([dir=rtl]) .item-native {
248
257
  padding-right: calc(var(--padding-start) + var(--ion-safe-area-right, 0px));
@@ -261,6 +270,10 @@
261
270
  }
262
271
  }
263
272
 
273
+ :host(.item-legacy) .item-native {
274
+ flex-wrap: unset;
275
+ }
276
+
264
277
  .item-native::-moz-focus-inner {
265
278
  border: 0;
266
279
  }
@@ -296,10 +309,20 @@ button, a {
296
309
  /* stylelint-enable */
297
310
  display: flex;
298
311
  position: relative;
299
- flex: 1;
312
+ flex: 1 0 0;
300
313
  flex-direction: inherit;
314
+ flex-wrap: wrap;
301
315
  align-items: inherit;
302
316
  align-self: stretch;
317
+ /**
318
+ * The min-width defines when the
319
+ * content in the default slot should
320
+ * stop wrapping/truncating within its own
321
+ * container. At this point the entire
322
+ * container will wrap to the next line.
323
+ */
324
+ min-width: var(--inner-min-width);
325
+ max-width: 100%;
303
326
  min-height: inherit;
304
327
  border-width: var(--inner-border-width);
305
328
  border-style: var(--border-style);
@@ -325,6 +348,12 @@ button, a {
325
348
  }
326
349
  }
327
350
 
351
+ :host(.item-legacy) .item-inner {
352
+ flex: 1;
353
+ flex-wrap: unset;
354
+ max-width: unset;
355
+ }
356
+
328
357
  .item-bottom {
329
358
  margin-left: 0;
330
359
  margin-right: 0;
@@ -388,6 +417,7 @@ button, a {
388
417
 
389
418
  ::slotted(ion-label:not([slot=end])) {
390
419
  flex: 1;
420
+ width: min-content;
391
421
  }
392
422
 
393
423
  :host(.item-input) {
@@ -396,15 +426,23 @@ button, a {
396
426
 
397
427
  .input-wrapper {
398
428
  display: flex;
399
- flex: 1;
429
+ flex: 1 0 auto;
400
430
  flex-direction: inherit;
431
+ flex-wrap: wrap;
401
432
  align-items: inherit;
402
433
  align-self: stretch;
434
+ max-width: 100%;
403
435
  text-overflow: ellipsis;
404
436
  overflow: inherit;
405
437
  box-sizing: border-box;
406
438
  }
407
439
 
440
+ :host(.item-legacy) .input-wrapper {
441
+ flex: 1;
442
+ flex-wrap: unset;
443
+ max-width: unset;
444
+ }
445
+
408
446
  :host(.item-label-stacked),
409
447
  :host(.item-label-floating) {
410
448
  align-items: start;
@@ -100,6 +100,14 @@
100
100
  * @prop --highlight-color-valid: The color of the highlight on the item when valid. Only applies to inputs and textareas using the legacy form syntax. DEPRECATED: Highlights can be styled on `ion-input` or `ion-textarea` when using the modern form syntax.
101
101
  * @prop --highlight-color-invalid: The color of the highlight on the item when invalid. Only applies to inputs and textareas using the legacy form syntax. DEPRECATED: Highlights can be styled on `ion-input` or `ion-textarea` when using the modern form syntax.
102
102
  */
103
+ /**
104
+ * We change the minimum width as the
105
+ * font size changes. Using a fixed minimum
106
+ * width means that fewer and fewer characters
107
+ * can be displayed in the same space as the
108
+ * text grows.
109
+ */
110
+ --inner-min-width: 4rem;
103
111
  --border-radius: 0px;
104
112
  --border-width: 0px;
105
113
  --border-style: solid;
@@ -230,6 +238,7 @@
230
238
  /* stylelint-enable */
231
239
  display: flex;
232
240
  position: relative;
241
+ flex-wrap: wrap;
233
242
  align-items: inherit;
234
243
  justify-content: inherit;
235
244
  width: 100%;
@@ -241,8 +250,8 @@
241
250
  outline: none;
242
251
  background: var(--background);
243
252
  overflow: inherit;
244
- box-sizing: border-box;
245
253
  z-index: 1;
254
+ box-sizing: border-box;
246
255
  }
247
256
  :host-context([dir=rtl]) .item-native {
248
257
  padding-right: calc(var(--padding-start) + var(--ion-safe-area-right, 0px));
@@ -261,6 +270,10 @@
261
270
  }
262
271
  }
263
272
 
273
+ :host(.item-legacy) .item-native {
274
+ flex-wrap: unset;
275
+ }
276
+
264
277
  .item-native::-moz-focus-inner {
265
278
  border: 0;
266
279
  }
@@ -296,10 +309,20 @@ button, a {
296
309
  /* stylelint-enable */
297
310
  display: flex;
298
311
  position: relative;
299
- flex: 1;
312
+ flex: 1 0 0;
300
313
  flex-direction: inherit;
314
+ flex-wrap: wrap;
301
315
  align-items: inherit;
302
316
  align-self: stretch;
317
+ /**
318
+ * The min-width defines when the
319
+ * content in the default slot should
320
+ * stop wrapping/truncating within its own
321
+ * container. At this point the entire
322
+ * container will wrap to the next line.
323
+ */
324
+ min-width: var(--inner-min-width);
325
+ max-width: 100%;
303
326
  min-height: inherit;
304
327
  border-width: var(--inner-border-width);
305
328
  border-style: var(--border-style);
@@ -325,6 +348,12 @@ button, a {
325
348
  }
326
349
  }
327
350
 
351
+ :host(.item-legacy) .item-inner {
352
+ flex: 1;
353
+ flex-wrap: unset;
354
+ max-width: unset;
355
+ }
356
+
328
357
  .item-bottom {
329
358
  margin-left: 0;
330
359
  margin-right: 0;
@@ -388,6 +417,7 @@ button, a {
388
417
 
389
418
  ::slotted(ion-label:not([slot=end])) {
390
419
  flex: 1;
420
+ width: min-content;
391
421
  }
392
422
 
393
423
  :host(.item-input) {
@@ -396,15 +426,23 @@ button, a {
396
426
 
397
427
  .input-wrapper {
398
428
  display: flex;
399
- flex: 1;
429
+ flex: 1 0 auto;
400
430
  flex-direction: inherit;
431
+ flex-wrap: wrap;
401
432
  align-items: inherit;
402
433
  align-self: stretch;
434
+ max-width: 100%;
403
435
  text-overflow: ellipsis;
404
436
  overflow: inherit;
405
437
  box-sizing: border-box;
406
438
  }
407
439
 
440
+ :host(.item-legacy) .input-wrapper {
441
+ flex: 1;
442
+ flex-wrap: unset;
443
+ max-width: unset;
444
+ }
445
+
408
446
  :host(.item-label-stacked),
409
447
  :host(.item-label-floating) {
410
448
  align-items: start;
@@ -29,7 +29,7 @@ configs().forEach(({ title, screenshot, config }) => {
29
29
  </ion-item>
30
30
 
31
31
  <ion-item>
32
- <ion-label> Single line text that should have ellipses when it doesn't all fit in the item</ion-label>
32
+ <ion-label class="ion-text-nowrap"> Single line text that should have ellipses when it doesn't all fit in the item</ion-label>
33
33
  </ion-item>
34
34
  </ion-list>
35
35
  `, config);
@@ -11,7 +11,6 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
11
11
  test('should not have visual regressions', async ({ page }) => {
12
12
  await page.goto(`/src/components/item/test/disabled`, config);
13
13
  await page.setIonViewport();
14
- // TODO: FW-4037 - Fix label color inconsistency between disabled controls
15
14
  await expect(page).toHaveScreenshot(screenshot(`item-disabled-diff`));
16
15
  });
17
16
  });