@ionic/core 7.5.7-dev.11701270755.14f050ad → 7.5.7-dev.11701273756.1eb73d4c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/components/animation.js +12 -11
  2. package/components/backdrop.js +12 -0
  3. package/components/checkbox.js +2 -0
  4. package/components/data.js +1 -1
  5. package/components/gesture-controller.js +1 -1
  6. package/components/index4.js +10 -12
  7. package/components/index5.js +0 -22
  8. package/components/input-shims.js +12 -7
  9. package/components/input.utils.js +3 -2
  10. package/components/ion-content.js +1 -1
  11. package/components/ion-datetime.js +61 -28
  12. package/components/ion-input.js +31 -8
  13. package/components/ion-modal.js +2 -2
  14. package/components/ion-picker-column-internal.d.ts +11 -0
  15. package/components/ion-picker-column-internal.js +9 -0
  16. package/components/ion-picker-column.js +2 -2
  17. package/components/{ion-picker-legacy.d.ts → ion-picker-internal.d.ts} +4 -4
  18. package/components/ion-picker-internal.js +9 -0
  19. package/components/ion-picker.js +299 -1
  20. package/components/ion-range.js +2 -0
  21. package/components/ion-select.js +44 -29
  22. package/components/ion-skeleton-text.js +14 -1
  23. package/components/ion-textarea.js +30 -7
  24. package/components/ion-toast.js +419 -74
  25. package/components/ion-toggle.js +2 -0
  26. package/components/item.js +2 -2
  27. package/components/label.js +2 -2
  28. package/components/overlays.js +6 -12
  29. package/components/picker-column-internal.js +390 -0
  30. package/components/picker-column.js +320 -331
  31. package/components/{picker.js → picker-internal.js} +16 -16
  32. package/components/radio-group.js +2 -0
  33. package/components/radio.js +42 -2
  34. package/dist/cjs/{animation-1083855c.js → animation-d101aa7a.js} +13 -12
  35. package/dist/cjs/{button-active-cd07b55b.js → button-active-ba107e4e.js} +2 -2
  36. package/dist/cjs/{capacitor-2ffba62a.js → capacitor-f68447d3.js} +1 -1
  37. package/dist/cjs/compare-with-utils-c0444525.js +44 -0
  38. package/dist/cjs/{data-4845b494.js → data-c8d21093.js} +1 -1
  39. package/dist/cjs/{gesture-controller-d6a3f907.js → gesture-controller-b46721be.js} +0 -1
  40. package/dist/cjs/{haptic-678abc9f.js → haptic-a74c2767.js} +1 -1
  41. package/dist/cjs/{index-0f8b33f8.js → index-0ee995e4.js} +1 -1
  42. package/dist/cjs/{index-d7561763.js → index-4f0c67e1.js} +11 -13
  43. package/dist/cjs/{index-573877f3.js → index-56d41f51.js} +2 -2
  44. package/dist/cjs/index-c8d52405.js +10 -0
  45. package/dist/cjs/{index-9f379eaa.js → index-e9634bc9.js} +1 -1
  46. package/dist/cjs/index.cjs.js +10 -10
  47. package/dist/cjs/{input-shims-b0a75a01.js → input-shims-3e3f35b9.js} +15 -10
  48. package/dist/cjs/{input.utils-0fe3097c.js → input.utils-bdb6953c.js} +4 -3
  49. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  50. package/dist/cjs/ion-alert.cjs.entry.js +8 -8
  51. package/dist/cjs/ion-app_8.cjs.entry.js +10 -10
  52. package/dist/cjs/ion-backdrop.cjs.entry.js +12 -0
  53. package/dist/cjs/ion-checkbox.cjs.entry.js +2 -0
  54. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  55. package/dist/cjs/ion-datetime_3.cjs.entry.js +43 -30
  56. package/dist/cjs/ion-input.cjs.entry.js +34 -11
  57. package/dist/cjs/ion-item-option_3.cjs.entry.js +1 -1
  58. package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
  59. package/dist/cjs/ion-loading.cjs.entry.js +3 -4
  60. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  61. package/dist/cjs/ion-modal.cjs.entry.js +10 -10
  62. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  63. package/dist/cjs/{ion-picker-column.cjs.entry.js → ion-picker-column-internal.cjs.entry.js} +12 -12
  64. package/dist/cjs/{ion-picker.cjs.entry.js → ion-picker-internal.cjs.entry.js} +13 -13
  65. package/dist/cjs/ion-popover.cjs.entry.js +4 -5
  66. package/dist/cjs/ion-radio_2.cjs.entry.js +6 -1
  67. package/dist/cjs/ion-range.cjs.entry.js +3 -1
  68. package/dist/cjs/ion-refresher_2.cjs.entry.js +7 -7
  69. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  70. package/dist/cjs/ion-segment_2.cjs.entry.js +1 -1
  71. package/dist/cjs/ion-select_3.cjs.entry.js +51 -36
  72. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  73. package/dist/cjs/ion-textarea.cjs.entry.js +33 -10
  74. package/dist/cjs/ion-toast.cjs.entry.js +434 -93
  75. package/dist/cjs/ion-toggle.cjs.entry.js +6 -4
  76. package/dist/cjs/ionic.cjs.js +1 -1
  77. package/dist/cjs/{ios.transition-ac909bc8.js → ios.transition-f4caf640.js} +3 -3
  78. package/dist/cjs/{keyboard-fd7db491.js → keyboard-43df0428.js} +1 -1
  79. package/dist/cjs/{keyboard-38f2bb7b.js → keyboard-840107b3.js} +3 -3
  80. package/dist/cjs/{keyboard-controller-50beb83a.js → keyboard-controller-019f42df.js} +2 -2
  81. package/dist/cjs/loader.cjs.js +1 -1
  82. package/dist/cjs/{md.transition-907af519.js → md.transition-33331e93.js} +3 -3
  83. package/dist/cjs/{notch-controller-f4f6af5d.js → notch-controller-c22d1344.js} +1 -1
  84. package/dist/cjs/{overlays-dbb71984.js → overlays-4d8897dc.js} +7 -12
  85. package/dist/cjs/{swipe-back-a6dc6e5d.js → swipe-back-d0412fb6.js} +2 -2
  86. package/dist/collection/collection-manifest.json +6 -7
  87. package/dist/collection/components/backdrop/backdrop.js +12 -0
  88. package/dist/collection/components/checkbox/checkbox.js +2 -0
  89. package/dist/collection/components/content/content.css +4 -0
  90. package/dist/collection/components/datetime/datetime.ios.css +26 -84
  91. package/dist/collection/components/datetime/datetime.js +29 -14
  92. package/dist/collection/components/datetime/datetime.md.css +26 -89
  93. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  94. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +9 -6
  95. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +0 -10
  96. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
  97. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +5 -5
  98. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  99. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +2 -2
  100. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
  101. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
  102. package/dist/collection/components/datetime/test/values/datetime.e2e.js +5 -5
  103. package/dist/collection/components/datetime/utils/data.js +1 -1
  104. package/dist/collection/components/input/input.ios.css +10 -3
  105. package/dist/collection/components/input/input.js +31 -6
  106. package/dist/collection/components/input/input.md.css +13 -12
  107. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  108. package/dist/collection/components/item/item.ios.css +25 -3
  109. package/dist/collection/components/item/item.md.css +25 -3
  110. package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
  111. package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
  112. package/dist/collection/components/label/label.ios.css +14 -3
  113. package/dist/collection/components/label/label.md.css +14 -3
  114. package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
  115. package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
  116. package/dist/collection/components/picker/picker.ios.css +205 -100
  117. package/dist/collection/components/picker/picker.js +735 -463
  118. package/dist/collection/components/picker/picker.md.css +194 -98
  119. package/dist/collection/components/picker/test/basic/picker.e2e.js +13 -106
  120. package/dist/collection/components/{picker-legacy → picker}/test/is-open/picker.e2e.js +4 -4
  121. package/dist/collection/components/{picker-legacy → picker}/test/picker-id.spec.js +5 -5
  122. package/dist/collection/components/{picker-legacy → picker}/test/trigger/picker.e2e.js +1 -1
  123. package/dist/collection/components/picker-column/picker-column.ios.css +176 -59
  124. package/dist/collection/components/picker-column/picker-column.js +333 -478
  125. package/dist/collection/components/picker-column/picker-column.md.css +113 -63
  126. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-aria.spec.js +3 -3
  127. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column-dynamic.spec.js +2 -2
  128. package/dist/collection/components/{picker-legacy-column → picker-column}/test/picker-column.spec.js +2 -2
  129. package/dist/collection/components/{picker-legacy-column → picker-column}/test/standalone/picker-column.e2e.js +3 -3
  130. package/dist/collection/components/picker-column-internal/picker-column-internal.ios.css +138 -0
  131. package/dist/collection/components/picker-column-internal/picker-column-internal.js +565 -0
  132. package/dist/collection/components/{picker-legacy-column/picker-column.md.css → picker-column-internal/picker-column-internal.md.css} +63 -113
  133. package/dist/collection/components/{picker-column/test/basic/picker-column.e2e.js → picker-column-internal/test/basic/picker-column-internal.e2e.js} +7 -7
  134. package/dist/collection/components/{picker-column/test/disabled/picker-column.e2e.js → picker-column-internal/test/disabled/picker-column-internal.e2e.js} +39 -39
  135. package/dist/collection/components/{picker-legacy/picker.md.css → picker-internal/picker-internal.ios.css} +100 -192
  136. package/dist/collection/components/picker-internal/picker-internal.js +544 -0
  137. package/dist/collection/components/{picker-legacy-column/picker-column.ios.css → picker-internal/picker-internal.md.css} +101 -98
  138. package/dist/collection/components/{picker/test/a11y/picker.e2e.js → picker-internal/test/a11y/picker-internal.e2e.js} +2 -2
  139. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +118 -0
  140. package/dist/collection/components/{picker/test/keyboard-entry/picker.e2e.js → picker-internal/test/keyboard-entry/picker-internal.e2e.js} +20 -20
  141. package/dist/collection/components/radio/radio.js +5 -2
  142. package/dist/collection/components/radio-group/radio-group.js +24 -0
  143. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  144. package/dist/collection/components/range/range.js +2 -0
  145. package/dist/collection/components/select/select.ios.css +61 -7
  146. package/dist/collection/components/select/select.js +45 -28
  147. package/dist/collection/components/select/select.md.css +64 -19
  148. package/dist/collection/components/select/test/label/select.e2e.js +1 -1
  149. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
  150. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  151. package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
  152. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  153. package/dist/collection/components/textarea/textarea.ios.css +37 -5
  154. package/dist/collection/components/textarea/textarea.js +30 -5
  155. package/dist/collection/components/textarea/textarea.md.css +47 -14
  156. package/dist/collection/components/toast/animations/ios.enter.js +2 -1
  157. package/dist/collection/components/toast/animations/md.enter.js +4 -3
  158. package/dist/collection/components/toast/animations/utils.js +20 -14
  159. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  160. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  161. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  162. package/dist/collection/components/toast/test/toast.spec.js +80 -0
  163. package/dist/collection/components/toast/toast.ios.css +10 -10
  164. package/dist/collection/components/toast/toast.js +104 -1
  165. package/dist/collection/components/toast/toast.md.css +10 -0
  166. package/dist/collection/components/toggle/toggle.js +2 -0
  167. package/dist/collection/utils/animation/animation.js +12 -11
  168. package/dist/collection/utils/animation/test/animation.spec.js +16 -0
  169. package/dist/collection/utils/browser/index.js +0 -22
  170. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  171. package/dist/collection/utils/forms/index.js +1 -0
  172. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  173. package/dist/collection/utils/input-shims/input-shims.js +12 -6
  174. package/dist/collection/utils/menu-controller/index.js +10 -12
  175. package/dist/collection/utils/overlays.js +5 -11
  176. package/dist/collection/utils/slot-mutation-controller.js +3 -2
  177. package/dist/docs.json +166 -385
  178. package/dist/esm/{animation-8aa13916.js → animation-cf3dd234.js} +13 -12
  179. package/dist/esm/{button-active-5b0516e7.js → button-active-47196c40.js} +2 -2
  180. package/dist/esm/{capacitor-b4979570.js → capacitor-f1f25364.js} +1 -1
  181. package/dist/esm/compare-with-utils-4928c09d.js +41 -0
  182. package/dist/esm/{data-12e24f00.js → data-44d9e816.js} +1 -1
  183. package/dist/esm/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
  184. package/dist/esm/{haptic-1243b917.js → haptic-1a66d69f.js} +1 -1
  185. package/dist/esm/{index-0aa6e61f.js → index-23c05a55.js} +11 -13
  186. package/dist/esm/{index-6a0ccabb.js → index-702b3cd3.js} +2 -2
  187. package/dist/esm/index-a5d50daf.js +7 -0
  188. package/dist/esm/{index-f0cc4e14.js → index-c9e82353.js} +1 -1
  189. package/dist/esm/{index-32cbee52.js → index-ff313b19.js} +2 -2
  190. package/dist/esm/index.js +10 -10
  191. package/dist/esm/{input-shims-d0c93e5d.js → input-shims-1d767845.js} +14 -9
  192. package/dist/esm/{input.utils-ec063df4.js → input.utils-2cf5e372.js} +4 -3
  193. package/dist/esm/ion-action-sheet.entry.js +8 -8
  194. package/dist/esm/ion-alert.entry.js +8 -8
  195. package/dist/esm/ion-app_8.entry.js +10 -10
  196. package/dist/esm/ion-backdrop.entry.js +12 -0
  197. package/dist/esm/ion-checkbox.entry.js +2 -0
  198. package/dist/esm/ion-datetime-button.entry.js +1 -1
  199. package/dist/esm/ion-datetime_3.entry.js +42 -29
  200. package/dist/esm/ion-input.entry.js +34 -11
  201. package/dist/esm/ion-item-option_3.entry.js +1 -1
  202. package/dist/esm/ion-item_8.entry.js +17 -4
  203. package/dist/esm/ion-loading.entry.js +3 -4
  204. package/dist/esm/ion-menu_3.entry.js +7 -7
  205. package/dist/esm/ion-modal.entry.js +10 -10
  206. package/dist/esm/ion-nav_2.entry.js +2 -2
  207. package/dist/esm/{ion-picker-column.entry.js → ion-picker-column-internal.entry.js} +12 -12
  208. package/dist/esm/{ion-picker.entry.js → ion-picker-internal.entry.js} +13 -13
  209. package/dist/esm/ion-popover.entry.js +4 -5
  210. package/dist/esm/ion-radio_2.entry.js +6 -1
  211. package/dist/esm/ion-range.entry.js +3 -1
  212. package/dist/esm/ion-refresher_2.entry.js +7 -7
  213. package/dist/esm/ion-reorder_2.entry.js +4 -4
  214. package/dist/esm/ion-segment_2.entry.js +1 -1
  215. package/dist/esm/ion-select_3.entry.js +47 -32
  216. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  217. package/dist/esm/ion-textarea.entry.js +33 -10
  218. package/dist/esm/ion-toast.entry.js +417 -76
  219. package/dist/esm/ion-toggle.entry.js +6 -4
  220. package/dist/esm/ionic.js +1 -1
  221. package/dist/esm/{ios.transition-1651c430.js → ios.transition-c3e77862.js} +3 -3
  222. package/dist/esm/{keyboard-b551279d.js → keyboard-9f771a04.js} +3 -3
  223. package/dist/esm/{keyboard-b063f012.js → keyboard-b6230bfb.js} +1 -1
  224. package/dist/esm/{keyboard-controller-0c2dce71.js → keyboard-controller-3f0faa10.js} +2 -2
  225. package/dist/esm/loader.js +1 -1
  226. package/dist/esm/{md.transition-66f18369.js → md.transition-1173eca9.js} +3 -3
  227. package/dist/esm/{notch-controller-8c9c0e54.js → notch-controller-3f79197e.js} +1 -1
  228. package/dist/esm/{overlays-789cd7a7.js → overlays-34169295.js} +7 -13
  229. package/dist/esm/{swipe-back-cc4c2bcb.js → swipe-back-0f3bfc8e.js} +2 -2
  230. package/dist/esm-es5/{animation-8aa13916.js → animation-cf3dd234.js} +1 -1
  231. package/dist/esm-es5/{button-active-5b0516e7.js → button-active-47196c40.js} +1 -1
  232. package/dist/esm-es5/{capacitor-b4979570.js → capacitor-f1f25364.js} +1 -1
  233. package/dist/esm-es5/compare-with-utils-4928c09d.js +4 -0
  234. package/dist/esm-es5/{gesture-controller-3723db7c.js → gesture-controller-0fa396c4.js} +1 -1
  235. package/dist/esm-es5/{haptic-1243b917.js → haptic-1a66d69f.js} +1 -1
  236. package/dist/esm-es5/index-23c05a55.js +4 -0
  237. package/dist/esm-es5/{index-6a0ccabb.js → index-702b3cd3.js} +1 -1
  238. package/dist/esm-es5/index-c9e82353.js +4 -0
  239. package/dist/esm-es5/{index-32cbee52.js → index-ff313b19.js} +1 -1
  240. package/dist/esm-es5/index.js +1 -1
  241. package/dist/esm-es5/input-shims-1d767845.js +4 -0
  242. package/dist/esm-es5/input.utils-2cf5e372.js +4 -0
  243. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  244. package/dist/esm-es5/ion-alert.entry.js +1 -1
  245. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  246. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  247. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  248. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  249. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  250. package/dist/esm-es5/ion-input.entry.js +1 -1
  251. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  252. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  253. package/dist/esm-es5/ion-loading.entry.js +1 -1
  254. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  255. package/dist/esm-es5/ion-modal.entry.js +1 -1
  256. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  257. package/dist/esm-es5/ion-picker-column-internal.entry.js +4 -0
  258. package/dist/esm-es5/ion-picker-internal.entry.js +4 -0
  259. package/dist/esm-es5/ion-popover.entry.js +1 -1
  260. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  261. package/dist/esm-es5/ion-range.entry.js +1 -1
  262. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  263. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  264. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  265. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  266. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  267. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  268. package/dist/esm-es5/ion-toast.entry.js +1 -1
  269. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  270. package/dist/esm-es5/ionic.js +1 -1
  271. package/dist/esm-es5/{ios.transition-1651c430.js → ios.transition-c3e77862.js} +1 -1
  272. package/dist/esm-es5/{keyboard-b551279d.js → keyboard-9f771a04.js} +1 -1
  273. package/dist/esm-es5/{keyboard-b063f012.js → keyboard-b6230bfb.js} +1 -1
  274. package/dist/esm-es5/{keyboard-controller-0c2dce71.js → keyboard-controller-3f0faa10.js} +1 -1
  275. package/dist/esm-es5/loader.js +1 -1
  276. package/dist/esm-es5/md.transition-1173eca9.js +4 -0
  277. package/dist/esm-es5/{notch-controller-8c9c0e54.js → notch-controller-3f79197e.js} +1 -1
  278. package/dist/esm-es5/overlays-34169295.js +4 -0
  279. package/dist/esm-es5/swipe-back-0f3bfc8e.js +4 -0
  280. package/dist/html.html-data.json +15 -120
  281. package/dist/ionic/index.esm.js +1 -1
  282. package/dist/ionic/ionic.esm.js +1 -1
  283. package/dist/ionic/{p-02d8fdba.system.entry.js → p-03ed6107.system.entry.js} +1 -1
  284. package/dist/ionic/p-0547e914.entry.js +4 -0
  285. package/dist/ionic/{p-81c818e7.js → p-11cb4e19.js} +1 -1
  286. package/dist/ionic/p-131761b4.entry.js +4 -0
  287. package/dist/ionic/p-196f2123.system.entry.js +4 -0
  288. package/dist/ionic/{p-64ed03a3.entry.js → p-1abc74d9.entry.js} +1 -1
  289. package/dist/ionic/p-1cf5e8d6.entry.js +4 -0
  290. package/dist/ionic/{p-c4042875.system.js → p-21b4981c.system.js} +1 -1
  291. package/dist/ionic/p-2207f3c2.js +4 -0
  292. package/dist/ionic/p-27eb8a91.system.entry.js +4 -0
  293. package/dist/ionic/p-2a41d4d1.js +4 -0
  294. package/dist/ionic/p-31189dae.entry.js +4 -0
  295. package/dist/ionic/p-314c4dee.js +4 -0
  296. package/dist/ionic/{p-4f3e2767.system.entry.js → p-37c69d34.system.entry.js} +1 -1
  297. package/dist/ionic/p-385c51f8.system.entry.js +4 -0
  298. package/dist/ionic/{p-477a182e.entry.js → p-3abf5b7a.entry.js} +1 -1
  299. package/dist/ionic/p-3bc3d880.system.js +4 -0
  300. package/dist/ionic/{p-56224549.entry.js → p-3de79805.entry.js} +1 -1
  301. package/dist/ionic/{p-9e6bf9ed.entry.js → p-3e655d4c.entry.js} +1 -1
  302. package/dist/ionic/p-40903d34.system.js +1 -1
  303. package/dist/ionic/p-43716898.js +4 -0
  304. package/dist/ionic/p-450a26bf.js +4 -0
  305. package/dist/ionic/p-485668f0.entry.js +4 -0
  306. package/dist/ionic/p-48c59094.system.entry.js +4 -0
  307. package/dist/ionic/p-494e75ad.js +4 -0
  308. package/dist/ionic/{p-cb62e3fc.system.entry.js → p-4c80afe1.system.entry.js} +1 -1
  309. package/dist/ionic/{p-0e23256e.system.entry.js → p-54824705.system.entry.js} +1 -1
  310. package/dist/ionic/p-561cc050.system.js +4 -0
  311. package/dist/ionic/{p-4a142496.system.entry.js → p-587afb80.system.entry.js} +1 -1
  312. package/dist/ionic/{p-8cf94fc1.js → p-5885e9af.js} +1 -1
  313. package/dist/ionic/p-5bd4e009.entry.js +4 -0
  314. package/dist/ionic/{p-b3e79338.system.entry.js → p-5e6bc319.system.entry.js} +1 -1
  315. package/dist/ionic/{p-939d903b.entry.js → p-64ab3eb3.entry.js} +1 -1
  316. package/dist/ionic/p-671dbd61.js +4 -0
  317. package/dist/ionic/{p-702d85d8.system.js → p-67951604.system.js} +1 -1
  318. package/dist/ionic/{p-835e0346.entry.js → p-6797887a.entry.js} +1 -1
  319. package/dist/ionic/{p-b923f3d7.js → p-6a309574.js} +1 -1
  320. package/dist/ionic/{p-a4cda7a8.system.entry.js → p-6e23777e.system.entry.js} +1 -1
  321. package/dist/ionic/{p-06e6d235.system.entry.js → p-7047a40c.system.entry.js} +2 -2
  322. package/dist/ionic/p-70dcf429.js +4 -0
  323. package/dist/ionic/p-710cea83.system.js +4 -0
  324. package/dist/ionic/p-7b44e419.js +4 -0
  325. package/dist/ionic/p-80a9b397.entry.js +4 -0
  326. package/dist/ionic/{p-9b5301cc.system.entry.js → p-823890d5.system.entry.js} +1 -1
  327. package/dist/ionic/{p-a57f223c.system.js → p-83a455fd.system.js} +1 -1
  328. package/dist/ionic/{p-baa7cb1e.entry.js → p-8ad82eb3.entry.js} +1 -1
  329. package/dist/ionic/{p-c1229981.entry.js → p-8b15ca22.entry.js} +1 -1
  330. package/dist/ionic/{p-a7e2ac5c.js → p-8b1be026.js} +1 -1
  331. package/dist/ionic/p-8dbdb163.system.js +4 -0
  332. package/dist/ionic/p-8ddfecbf.entry.js +4 -0
  333. package/dist/ionic/{p-b4b4bb29.system.js → p-9292fd42.system.js} +1 -1
  334. package/dist/ionic/{p-41477ad9.system.js → p-958f1c70.system.js} +1 -1
  335. package/dist/ionic/{p-5ce11143.entry.js → p-965677f1.entry.js} +1 -1
  336. package/dist/ionic/p-9c6787e2.entry.js +4 -0
  337. package/dist/ionic/{p-6500b298.system.js → p-9e852ff1.system.js} +1 -1
  338. package/dist/ionic/p-a11c1aff.system.entry.js +4 -0
  339. package/dist/ionic/{p-419eb426.js → p-a135e3ba.js} +1 -1
  340. package/dist/ionic/p-a31099a4.entry.js +4 -0
  341. package/dist/ionic/p-a6bc00ab.entry.js +4 -0
  342. package/dist/ionic/p-a9c3699b.system.entry.js +4 -0
  343. package/dist/ionic/p-ac668fb8.entry.js +4 -0
  344. package/dist/ionic/p-ad4b4f73.system.entry.js +4 -0
  345. package/dist/ionic/{p-ab4cff27.system.js → p-aec8a70a.system.js} +1 -1
  346. package/dist/ionic/p-b673ee9b.entry.js +4 -0
  347. package/dist/ionic/p-be0f6600.system.js +4 -0
  348. package/dist/ionic/p-beb64be7.system.entry.js +4 -0
  349. package/dist/ionic/{p-dd837fa8.entry.js → p-c1e725db.entry.js} +1 -1
  350. package/dist/ionic/p-c2db1374.system.js +4 -0
  351. package/dist/ionic/p-c3547c7a.system.js +4 -0
  352. package/dist/ionic/{p-c7fd81ba.system.js → p-c4de53af.system.js} +1 -1
  353. package/dist/ionic/p-c700acef.system.js +4 -0
  354. package/dist/ionic/p-c919498d.entry.js +4 -0
  355. package/dist/ionic/{p-3f88eab8.system.entry.js → p-cc615985.system.entry.js} +1 -1
  356. package/dist/ionic/p-d48872b1.system.js +4 -0
  357. package/dist/ionic/p-d4fba36b.system.entry.js +4 -0
  358. package/dist/ionic/{p-22813b28.system.entry.js → p-d61a2cee.system.entry.js} +1 -1
  359. package/dist/ionic/{p-c31fc05f.system.entry.js → p-db5043df.system.entry.js} +1 -1
  360. package/dist/ionic/{p-100ef961.js → p-e0b06b65.js} +1 -1
  361. package/dist/ionic/p-e5b8f2f7.js +4 -0
  362. package/dist/ionic/{p-3bad5c1a.js → p-e5fd9f10.js} +1 -1
  363. package/dist/ionic/{p-302091ab.js → p-e627ed84.js} +1 -1
  364. package/dist/ionic/{p-ccdcb022.system.js → p-e7d20dfb.system.js} +1 -1
  365. package/dist/ionic/{p-14b4348c.system.js → p-e9e5755c.system.js} +1 -1
  366. package/dist/ionic/p-ea9addc8.system.entry.js +4 -0
  367. package/dist/ionic/p-edd07654.system.entry.js +4 -0
  368. package/dist/ionic/p-f36112b4.entry.js +4 -0
  369. package/dist/ionic/p-f43f4102.entry.js +4 -0
  370. package/dist/ionic/p-f5d78105.entry.js +4 -0
  371. package/dist/ionic/p-f7769c83.js +4 -0
  372. package/dist/ionic/{p-bba2ce59.system.js → p-f9a641fa.system.js} +1 -1
  373. package/dist/ionic/{p-2e1794df.system.js → p-fa8d4788.system.js} +1 -1
  374. package/dist/ionic/p-fcb148dc.system.entry.js +4 -0
  375. package/dist/ionic/p-fcc23f25.system.entry.js +4 -0
  376. package/dist/ionic/{p-878c7aa5.system.entry.js → p-fce6b76a.system.entry.js} +1 -1
  377. package/dist/ionic/p-fdcf04c3.system.entry.js +4 -0
  378. package/dist/ionic/{p-a0b6d438.js → p-fe1f93f2.js} +1 -1
  379. package/dist/types/components/backdrop/backdrop.d.ts +3 -0
  380. package/dist/types/components/datetime/datetime.d.ts +1 -0
  381. package/dist/types/components/datetime/utils/data.d.ts +2 -2
  382. package/dist/types/components/input/input.d.ts +2 -0
  383. package/dist/types/components/menu/menu.d.ts +1 -1
  384. package/dist/types/components/picker/picker.d.ts +131 -74
  385. package/dist/types/components/picker-column/picker-column.d.ts +39 -94
  386. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +102 -0
  387. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +8 -0
  388. package/dist/types/components/picker-internal/picker-internal.d.ts +102 -0
  389. package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
  390. package/dist/types/components/radio-group/radio-group.d.ts +8 -1
  391. package/dist/types/components/router/router.d.ts +2 -1
  392. package/dist/types/components/select/select.d.ts +6 -1
  393. package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
  394. package/dist/types/components/textarea/textarea.d.ts +2 -0
  395. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  396. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  397. package/dist/types/components/toast/toast-interface.d.ts +2 -0
  398. package/dist/types/components/toast/toast.d.ts +28 -1
  399. package/dist/types/components.d.ts +159 -157
  400. package/dist/types/interface.d.ts +2 -6
  401. package/dist/types/utils/animation/animation-interface.d.ts +4 -4
  402. package/dist/types/utils/browser/index.d.ts +11 -2
  403. package/dist/types/utils/config.d.ts +2 -2
  404. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  405. package/dist/types/utils/forms/index.d.ts +1 -0
  406. package/dist/types/utils/gesture/gesture-controller.d.ts +0 -1
  407. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  408. package/dist/types/utils/overlays.d.ts +3 -5
  409. package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
  410. package/hydrate/index.js +2003 -1567
  411. package/package.json +1 -1
  412. package/components/ion-picker-column-option.d.ts +0 -11
  413. package/components/ion-picker-column-option.js +0 -52
  414. package/components/ion-picker-legacy-column.d.ts +0 -11
  415. package/components/ion-picker-legacy-column.js +0 -9
  416. package/components/ion-picker-legacy.js +0 -309
  417. package/components/picker-column2.js +0 -379
  418. package/dist/cjs/index-306a7476.js +0 -32
  419. package/dist/cjs/ion-picker-column-option.cjs.entry.js +0 -35
  420. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  421. package/dist/collection/components/picker-column-option/picker-column-option.js +0 -68
  422. package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +0 -18
  423. package/dist/collection/components/picker-legacy/picker.ios.css +0 -367
  424. package/dist/collection/components/picker-legacy/picker.js +0 -817
  425. package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +0 -25
  426. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -419
  427. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +0 -65
  428. package/dist/esm/index-7a14ecec.js +0 -29
  429. package/dist/esm/ion-picker-column-option.entry.js +0 -31
  430. package/dist/esm-es5/index-0aa6e61f.js +0 -4
  431. package/dist/esm-es5/index-f0cc4e14.js +0 -4
  432. package/dist/esm-es5/input-shims-d0c93e5d.js +0 -4
  433. package/dist/esm-es5/input.utils-ec063df4.js +0 -4
  434. package/dist/esm-es5/ion-picker-column-option.entry.js +0 -4
  435. package/dist/esm-es5/ion-picker-column.entry.js +0 -4
  436. package/dist/esm-es5/ion-picker.entry.js +0 -4
  437. package/dist/esm-es5/md.transition-66f18369.js +0 -4
  438. package/dist/esm-es5/overlays-789cd7a7.js +0 -4
  439. package/dist/esm-es5/swipe-back-cc4c2bcb.js +0 -4
  440. package/dist/ionic/p-0c244faf.entry.js +0 -4
  441. package/dist/ionic/p-20cf4994.js +0 -4
  442. package/dist/ionic/p-234b9617.system.entry.js +0 -4
  443. package/dist/ionic/p-25c34422.system.entry.js +0 -4
  444. package/dist/ionic/p-276afddd.js +0 -4
  445. package/dist/ionic/p-2804781b.entry.js +0 -4
  446. package/dist/ionic/p-2ad38423.system.entry.js +0 -4
  447. package/dist/ionic/p-2ba9414e.entry.js +0 -4
  448. package/dist/ionic/p-2e8e0045.js +0 -4
  449. package/dist/ionic/p-332f64af.system.entry.js +0 -4
  450. package/dist/ionic/p-352c0232.system.entry.js +0 -4
  451. package/dist/ionic/p-3602001b.system.js +0 -4
  452. package/dist/ionic/p-3632220b.system.js +0 -4
  453. package/dist/ionic/p-39074595.entry.js +0 -4
  454. package/dist/ionic/p-439e20ef.entry.js +0 -4
  455. package/dist/ionic/p-4cd588b3.system.entry.js +0 -4
  456. package/dist/ionic/p-67aab78f.js +0 -4
  457. package/dist/ionic/p-67eecef4.system.js +0 -4
  458. package/dist/ionic/p-6893f6e4.entry.js +0 -4
  459. package/dist/ionic/p-77e7a9c8.entry.js +0 -4
  460. package/dist/ionic/p-7c66a566.system.entry.js +0 -4
  461. package/dist/ionic/p-8b4ab236.entry.js +0 -4
  462. package/dist/ionic/p-9403b297.system.entry.js +0 -4
  463. package/dist/ionic/p-966cf574.system.entry.js +0 -4
  464. package/dist/ionic/p-97c65aa5.js +0 -4
  465. package/dist/ionic/p-992d3bad.entry.js +0 -4
  466. package/dist/ionic/p-9ab6f3e6.system.js +0 -4
  467. package/dist/ionic/p-9b89cbde.js +0 -4
  468. package/dist/ionic/p-9c967a65.system.entry.js +0 -4
  469. package/dist/ionic/p-a21b8d05.entry.js +0 -4
  470. package/dist/ionic/p-b0cee324.entry.js +0 -4
  471. package/dist/ionic/p-b1142133.entry.js +0 -4
  472. package/dist/ionic/p-b4cbb736.js +0 -4
  473. package/dist/ionic/p-b6a8588f.entry.js +0 -4
  474. package/dist/ionic/p-b6f8ee31.entry.js +0 -4
  475. package/dist/ionic/p-ba70d455.entry.js +0 -4
  476. package/dist/ionic/p-bd7a3269.entry.js +0 -4
  477. package/dist/ionic/p-c32bf078.system.entry.js +0 -4
  478. package/dist/ionic/p-cc196b34.js +0 -4
  479. package/dist/ionic/p-d1de1188.js +0 -4
  480. package/dist/ionic/p-d21bfe66.system.entry.js +0 -4
  481. package/dist/ionic/p-d3952bd5.system.entry.js +0 -4
  482. package/dist/ionic/p-dc565ca3.js +0 -4
  483. package/dist/ionic/p-dfa756ed.system.js +0 -4
  484. package/dist/ionic/p-e88ed07f.system.js +0 -4
  485. package/dist/ionic/p-eb07ec1a.system.entry.js +0 -4
  486. package/dist/ionic/p-eb5697b5.system.js +0 -4
  487. package/dist/ionic/p-ee800093.entry.js +0 -4
  488. package/dist/ionic/p-f0559c5d.system.entry.js +0 -4
  489. package/dist/ionic/p-fdd22426.entry.js +0 -4
  490. package/dist/ionic/p-ff5a10f9.system.js +0 -4
  491. package/dist/types/components/picker/picker-interfaces.d.ts +0 -8
  492. package/dist/types/components/picker-column-option/picker-column-option.d.ts +0 -16
  493. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  494. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  495. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.enter.js +0 -0
  496. /package/dist/collection/components/{picker-legacy → picker}/animations/ios.leave.js +0 -0
  497. /package/dist/collection/components/picker/{picker-interfaces.js → picker-interface.js} +0 -0
  498. /package/dist/collection/components/{picker-legacy-column → picker-column}/test/test.utils.js +0 -0
  499. /package/dist/collection/components/{picker-column/picker-column-interfaces.js → picker-column-internal/picker-column-internal-interfaces.js} +0 -0
  500. /package/dist/collection/components/{picker-legacy/picker-interface.js → picker-internal/picker-internal-interfaces.js} +0 -0
  501. /package/dist/esm-es5/{data-12e24f00.js → data-44d9e816.js} +0 -0
  502. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  503. /package/dist/ionic/{p-bb849ebb.js → p-17240d90.js} +0 -0
  504. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  505. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
  506. /package/dist/ionic/{p-e4219e27.system.js → p-b8c3f071.system.js} +0 -0
  507. /package/dist/types/components/{picker-legacy → picker}/animations/ios.enter.d.ts +0 -0
  508. /package/dist/types/components/{picker-legacy → picker}/animations/ios.leave.d.ts +0 -0
  509. /package/dist/types/components/{picker-legacy → picker}/picker-interface.d.ts +0 -0
  510. /package/dist/types/components/{picker-legacy-column → picker-column}/test/test.utils.d.ts +0 -0
  511. /package/dist/types/components/{picker-column/picker-column-interfaces.d.ts → picker-column-internal/picker-column-internal-interfaces.d.ts} +0 -0
@@ -161,7 +161,7 @@ class TimePickerFixture {
161
161
  await this.page.waitForChanges();
162
162
  }
163
163
  async expectTime(hour, minute, ampm) {
164
- const pickerColumns = this.timePicker.locator('ion-picker-column');
164
+ const pickerColumns = this.timePicker.locator('ion-picker-column-internal');
165
165
  await expect(pickerColumns.nth(0)).toHaveJSProperty('value', hour);
166
166
  await expect(pickerColumns.nth(1)).toHaveJSProperty('value', minute);
167
167
  await expect(pickerColumns.nth(2)).toHaveJSProperty('value', ampm);
@@ -46,7 +46,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config, scree
46
46
  const tabKey = browserName === 'webkit' ? 'Alt+Tab' : 'Tab';
47
47
  await page.waitForSelector('.datetime-ready');
48
48
  const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
49
- const monthYearButton = page.locator('.calendar-month-year-toggle');
49
+ const monthYearButton = page.locator('.calendar-month-year ion-item');
50
50
  await expect(calendarMonthYear).toHaveText('February 2022');
51
51
  await page.keyboard.press(tabKey);
52
52
  await expect(monthYearButton).toBeFocused();
@@ -75,7 +75,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config, scree
75
75
  `, config);
76
76
  const tabKey = browserName === 'webkit' ? 'Alt+Tab' : 'Tab';
77
77
  const datetime = page.locator('ion-datetime');
78
- const monthYearButton = page.locator('.calendar-month-year-toggle');
78
+ const monthYearButton = page.locator('.calendar-month-year ion-item');
79
79
  const prevButton = page.locator('.calendar-next-prev ion-button:nth-child(1)');
80
80
  const nextButton = page.locator('.calendar-next-prev ion-button:nth-child(2)');
81
81
  const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
@@ -36,14 +36,14 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
36
36
  await page.setContent(`
37
37
  <ion-datetime locale="en-US" presentation="time" hour-values="1,2,3"></ion-datetime>
38
38
  `, config);
39
- const items = page.locator('ion-picker-column:first-of-type .picker-item:not(.picker-item-empty)');
39
+ const items = page.locator('ion-picker-column-internal:first-of-type .picker-item:not(.picker-item-empty)');
40
40
  await expect(items).toHaveText(['1', '2', '3']);
41
41
  });
42
42
  test('should render correct minutes', async ({ page }) => {
43
43
  await page.setContent(`
44
44
  <ion-datetime locale="en-US" presentation="time" minute-values="1,2,3"></ion-datetime>
45
45
  `, config);
46
- const items = page.locator('ion-picker-column:nth-of-type(2) .picker-item:not(.picker-item-empty)');
46
+ const items = page.locator('ion-picker-column-internal:nth-of-type(2) .picker-item:not(.picker-item-empty)');
47
47
  await expect(items).toHaveText(['01', '02', '03']);
48
48
  });
49
49
  test('should adjust default parts for allowed hour and minute values', async ({ page }) => {
@@ -69,17 +69,17 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
69
69
  </script>
70
70
  `, config);
71
71
  await page.waitForSelector('.datetime-ready');
72
- const minuteItems = page.locator('ion-picker-column:nth-of-type(2) .picker-item:not(.picker-item-empty)');
72
+ const minuteItems = page.locator('ion-picker-column-internal:nth-of-type(2) .picker-item:not(.picker-item-empty)');
73
73
  await expect(minuteItems).toHaveText(['00', '15', '30', '45']);
74
74
  await expect(minuteItems.nth(1)).toHaveClass(/picker-item-active/);
75
- const hourItems = page.locator('ion-picker-column:nth-of-type(1) .picker-item:not(.picker-item-empty)');
75
+ const hourItems = page.locator('ion-picker-column-internal:nth-of-type(1) .picker-item:not(.picker-item-empty)');
76
76
  await expect(hourItems).toHaveText(['2']);
77
77
  await expect(hourItems.nth(0)).toHaveClass(/picker-item-active/);
78
78
  /**
79
79
  * Since the allowed hour is 2AM, the time period
80
80
  * should switch from PM to AM.
81
81
  */
82
- const ampmItems = page.locator('ion-picker-column:nth-of-type(3) .picker-item:not(.picker-item-empty)');
82
+ const ampmItems = page.locator('ion-picker-column-internal:nth-of-type(3) .picker-item:not(.picker-item-empty)');
83
83
  await expect(ampmItems).toHaveText(['AM', 'PM']);
84
84
  await expect(ampmItems.nth(0)).toHaveClass(/picker-item-active/);
85
85
  });
@@ -323,7 +323,7 @@ export const getMonthColumnData = (locale, refParts, minParts, maxParts, monthVa
323
323
  * @param minParts The minimum bound on the date that can be returned
324
324
  * @param maxParts The maximum bound on the date that can be returned
325
325
  * @param dayValues The allowed date values
326
- * @returns Date data to be used in ion-picker-column
326
+ * @returns Date data to be used in ion-picker-column-internal
327
327
  */
328
328
  export const getDayColumnData = (locale, refParts, minParts, maxParts, dayValues, formatOptions = {
329
329
  day: 'numeric',
@@ -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();
@@ -256,6 +258,8 @@ export class Input {
256
258
  'has-value': this.hasValue(),
257
259
  'has-focus': this.hasFocus,
258
260
  'interactive-disabled': this.disabled,
261
+ // TODO(FW-2764): remove this
262
+ legacy: !!this.legacy,
259
263
  });
260
264
  }
261
265
  }
@@ -361,29 +365,50 @@ export class Input {
361
365
  return this.renderLabel();
362
366
  }
363
367
  renderInput() {
364
- const { disabled, fill, readonly, shape, inputId, labelPlacement } = this;
368
+ const { disabled, fill, readonly, shape, inputId, labelPlacement, el, hasFocus } = this;
365
369
  const mode = getIonMode(this);
366
370
  const value = this.getValue();
367
371
  const inItem = hostContext('ion-item', this.el);
368
372
  const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
373
+ const hasValue = this.hasValue();
374
+ const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
375
+ /**
376
+ * If the label is stacked, it should always sit above the input.
377
+ * For floating labels, the label should move above the input if
378
+ * the input has a value, is focused, or has anything in either
379
+ * the start or end slot.
380
+ *
381
+ * If there is content in the start slot, the label would overlap
382
+ * it if not forced to float. This is also applied to the end slot
383
+ * because with the default or solid fills, the input is not
384
+ * vertically centered in the container, but the label is. This
385
+ * causes the slots and label to appear vertically offset from each
386
+ * other when the label isn't floating above the input. This doesn't
387
+ * apply to the outline fill, but this was not accounted for to keep
388
+ * things consistent.
389
+ *
390
+ * TODO(FW-5592): Remove hasStartEndSlots condition
391
+ */
392
+ const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
369
393
  return (h(Host, { class: createColorClasses(this.color, {
370
394
  [mode]: true,
371
- 'has-value': this.hasValue(),
372
- 'has-focus': this.hasFocus,
395
+ 'has-value': hasValue,
396
+ 'has-focus': hasFocus,
397
+ 'label-floating': labelShouldFloat,
373
398
  [`input-fill-${fill}`]: fill !== undefined,
374
399
  [`input-shape-${shape}`]: shape !== undefined,
375
400
  [`input-label-placement-${labelPlacement}`]: true,
376
401
  'in-item': inItem,
377
402
  'in-item-color': hostContext('ion-item.ion-color', this.el),
378
403
  'input-disabled': disabled,
379
- }) }, 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) => {
404
+ }) }, 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) => {
380
405
  /**
381
406
  * This prevents mobile browsers from
382
407
  * blurring the input when the clear
383
408
  * button is activated.
384
409
  */
385
410
  ev.preventDefault();
386
- }, onClick: this.clearTextInput }, h("ion-icon", { "aria-hidden": "true", icon: mode === 'ios' ? closeCircle : closeSharp })))), shouldRenderHighlight && h("div", { class: "input-highlight" })), this.renderBottomContent()));
411
+ }, 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()));
387
412
  }
388
413
  // TODO FW-2764 Remove this
389
414
  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
+ });
@@ -230,6 +230,7 @@
230
230
  /* stylelint-enable */
231
231
  display: flex;
232
232
  position: relative;
233
+ flex-wrap: wrap;
233
234
  align-items: inherit;
234
235
  justify-content: inherit;
235
236
  width: 100%;
@@ -241,8 +242,8 @@
241
242
  outline: none;
242
243
  background: var(--background);
243
244
  overflow: inherit;
244
- box-sizing: border-box;
245
245
  z-index: 1;
246
+ box-sizing: border-box;
246
247
  }
247
248
  :host-context([dir=rtl]) .item-native {
248
249
  padding-right: calc(var(--padding-start) + var(--ion-safe-area-right, 0px));
@@ -261,6 +262,10 @@
261
262
  }
262
263
  }
263
264
 
265
+ :host(.item-legacy) .item-native {
266
+ flex-wrap: unset;
267
+ }
268
+
264
269
  .item-native::-moz-focus-inner {
265
270
  border: 0;
266
271
  }
@@ -296,10 +301,12 @@ button, a {
296
301
  /* stylelint-enable */
297
302
  display: flex;
298
303
  position: relative;
299
- flex: 1;
304
+ flex: 1 0 auto;
300
305
  flex-direction: inherit;
306
+ flex-wrap: wrap;
301
307
  align-items: inherit;
302
308
  align-self: stretch;
309
+ max-width: 100%;
303
310
  min-height: inherit;
304
311
  border-width: var(--inner-border-width);
305
312
  border-style: var(--border-style);
@@ -325,6 +332,12 @@ button, a {
325
332
  }
326
333
  }
327
334
 
335
+ :host(.item-legacy) .item-inner {
336
+ flex: 1;
337
+ flex-wrap: unset;
338
+ max-width: unset;
339
+ }
340
+
328
341
  .item-bottom {
329
342
  margin-left: 0;
330
343
  margin-right: 0;
@@ -388,6 +401,7 @@ button, a {
388
401
 
389
402
  ::slotted(ion-label:not([slot=end])) {
390
403
  flex: 1;
404
+ width: min-content;
391
405
  }
392
406
 
393
407
  :host(.item-input) {
@@ -396,15 +410,23 @@ button, a {
396
410
 
397
411
  .input-wrapper {
398
412
  display: flex;
399
- flex: 1;
413
+ flex: 1 0 auto;
400
414
  flex-direction: inherit;
415
+ flex-wrap: wrap;
401
416
  align-items: inherit;
402
417
  align-self: stretch;
418
+ max-width: 100%;
403
419
  text-overflow: ellipsis;
404
420
  overflow: inherit;
405
421
  box-sizing: border-box;
406
422
  }
407
423
 
424
+ :host(.item-legacy) .input-wrapper {
425
+ flex: 1;
426
+ flex-wrap: unset;
427
+ max-width: unset;
428
+ }
429
+
408
430
  :host(.item-label-stacked),
409
431
  :host(.item-label-floating) {
410
432
  align-items: start;
@@ -230,6 +230,7 @@
230
230
  /* stylelint-enable */
231
231
  display: flex;
232
232
  position: relative;
233
+ flex-wrap: wrap;
233
234
  align-items: inherit;
234
235
  justify-content: inherit;
235
236
  width: 100%;
@@ -241,8 +242,8 @@
241
242
  outline: none;
242
243
  background: var(--background);
243
244
  overflow: inherit;
244
- box-sizing: border-box;
245
245
  z-index: 1;
246
+ box-sizing: border-box;
246
247
  }
247
248
  :host-context([dir=rtl]) .item-native {
248
249
  padding-right: calc(var(--padding-start) + var(--ion-safe-area-right, 0px));
@@ -261,6 +262,10 @@
261
262
  }
262
263
  }
263
264
 
265
+ :host(.item-legacy) .item-native {
266
+ flex-wrap: unset;
267
+ }
268
+
264
269
  .item-native::-moz-focus-inner {
265
270
  border: 0;
266
271
  }
@@ -296,10 +301,12 @@ button, a {
296
301
  /* stylelint-enable */
297
302
  display: flex;
298
303
  position: relative;
299
- flex: 1;
304
+ flex: 1 0 auto;
300
305
  flex-direction: inherit;
306
+ flex-wrap: wrap;
301
307
  align-items: inherit;
302
308
  align-self: stretch;
309
+ max-width: 100%;
303
310
  min-height: inherit;
304
311
  border-width: var(--inner-border-width);
305
312
  border-style: var(--border-style);
@@ -325,6 +332,12 @@ button, a {
325
332
  }
326
333
  }
327
334
 
335
+ :host(.item-legacy) .item-inner {
336
+ flex: 1;
337
+ flex-wrap: unset;
338
+ max-width: unset;
339
+ }
340
+
328
341
  .item-bottom {
329
342
  margin-left: 0;
330
343
  margin-right: 0;
@@ -388,6 +401,7 @@ button, a {
388
401
 
389
402
  ::slotted(ion-label:not([slot=end])) {
390
403
  flex: 1;
404
+ width: min-content;
391
405
  }
392
406
 
393
407
  :host(.item-input) {
@@ -396,15 +410,23 @@ button, a {
396
410
 
397
411
  .input-wrapper {
398
412
  display: flex;
399
- flex: 1;
413
+ flex: 1 0 auto;
400
414
  flex-direction: inherit;
415
+ flex-wrap: wrap;
401
416
  align-items: inherit;
402
417
  align-self: stretch;
418
+ max-width: 100%;
403
419
  text-overflow: ellipsis;
404
420
  overflow: inherit;
405
421
  box-sizing: border-box;
406
422
  }
407
423
 
424
+ :host(.item-legacy) .input-wrapper {
425
+ flex: 1;
426
+ flex-wrap: unset;
427
+ max-width: unset;
428
+ }
429
+
408
430
  :host(.item-label-stacked),
409
431
  :host(.item-label-floating) {
410
432
  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
  });
@@ -63,17 +63,24 @@
63
63
  font-family: var(--ion-font-family, inherit);
64
64
  font-size: inherit;
65
65
  text-overflow: ellipsis;
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ :host-context(.item-legacy) {
66
70
  white-space: nowrap;
67
71
  overflow: hidden;
68
- box-sizing: border-box;
72
+ }
73
+
74
+ :host-context(.item:not(.item-input):not(.item-legacy)) {
75
+ flex-grow: 1;
69
76
  }
70
77
 
71
78
  :host(.ion-color) {
72
79
  color: var(--ion-color-base);
73
80
  }
74
81
 
75
- :host(.ion-text-wrap) {
76
- white-space: normal;
82
+ :host(.ion-text-nowrap) {
83
+ overflow: hidden;
77
84
  }
78
85
 
79
86
  :host-context(.item-interactive-disabled:not(.item-multiple-inputs)) {
@@ -92,6 +99,10 @@
92
99
  align-self: baseline;
93
100
  }
94
101
 
102
+ :host-context(.item-skeleton-text) {
103
+ overflow: hidden;
104
+ }
105
+
95
106
  :host(.label-fixed) {
96
107
  flex: 0 0 100px;
97
108
  width: 100px;
@@ -63,17 +63,24 @@
63
63
  font-family: var(--ion-font-family, inherit);
64
64
  font-size: inherit;
65
65
  text-overflow: ellipsis;
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ :host-context(.item-legacy) {
66
70
  white-space: nowrap;
67
71
  overflow: hidden;
68
- box-sizing: border-box;
72
+ }
73
+
74
+ :host-context(.item:not(.item-input):not(.item-legacy)) {
75
+ flex-grow: 1;
69
76
  }
70
77
 
71
78
  :host(.ion-color) {
72
79
  color: var(--ion-color-base);
73
80
  }
74
81
 
75
- :host(.ion-text-wrap) {
76
- white-space: normal;
82
+ :host(.ion-text-nowrap) {
83
+ overflow: hidden;
77
84
  }
78
85
 
79
86
  :host-context(.item-interactive-disabled:not(.item-multiple-inputs)) {
@@ -92,6 +99,10 @@
92
99
  align-self: baseline;
93
100
  }
94
101
 
102
+ :host-context(.item-skeleton-text) {
103
+ overflow: hidden;
104
+ }
105
+
95
106
  :host(.label-fixed) {
96
107
  flex: 0 0 100px;
97
108
  width: 100px;
@@ -5,6 +5,7 @@ import { getTimeGivenProgression } from "../../../utils/animation/cubic-bezier";
5
5
  import { isIonContent, findClosestIonContent, disableContentScrollY, resetContentScrollY } from "../../../utils/content/index";
6
6
  import { createGesture } from "../../../utils/gesture/index";
7
7
  import { clamp, getElementRoot } from "../../../utils/helpers";
8
+ import { OVERLAY_GESTURE_PRIORITY } from "../../../utils/overlays";
8
9
  import { setCardStatusBarDark, setCardStatusBarDefault } from "../utils";
9
10
  import { calculateSpringStep, handleCanDismiss } from "./utils";
10
11
  // Defaults for the card swipe animation
@@ -250,7 +251,7 @@ export const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismi
250
251
  const gesture = createGesture({
251
252
  el,
252
253
  gestureName: 'modalSwipeToClose',
253
- gesturePriority: 39,
254
+ gesturePriority: OVERLAY_GESTURE_PRIORITY,
254
255
  direction: 'y',
255
256
  threshold: 10,
256
257
  canStart,
@@ -48,5 +48,48 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
48
48
  const note = page.locator('ion-note');
49
49
  await expect(note).toHaveScreenshot(screenshot(`note-item-divider-scale`));
50
50
  });
51
+ test('should wrap label to the next line without truncating', async ({ page }) => {
52
+ await page.setContent(`
53
+ <style>
54
+ html {
55
+ font-size: 310%;
56
+ }
57
+ </style>
58
+
59
+ <ion-list>
60
+ <ion-item>
61
+ <ion-note slot="start">Really really long note</ion-note>
62
+ <ion-label>Label</ion-label>
63
+ </ion-item>
64
+
65
+ <ion-item>
66
+ <ion-label>Label</ion-label>
67
+ <ion-note slot="end">Really really long note</ion-note>
68
+ </ion-item>
69
+
70
+ <ion-item>
71
+ <ion-note slot="start">Note</ion-note>
72
+ <ion-label>Really really long label</ion-label>
73
+ </ion-item>
74
+
75
+ <ion-item>
76
+ <ion-label>Really really long label</ion-label>
77
+ <ion-note slot="end">Note</ion-note>
78
+ </ion-item>
79
+
80
+ <ion-item>
81
+ <ion-note slot="start">Really really long note</ion-note>
82
+ <ion-label>Really really long label</ion-label>
83
+ </ion-item>
84
+
85
+ <ion-item>
86
+ <ion-label>Really really long label</ion-label>
87
+ <ion-note slot="end">Really really long note</ion-note>
88
+ </ion-item>
89
+ </ion-list>
90
+ `, config);
91
+ const list = page.locator('ion-list');
92
+ await expect(list).toHaveScreenshot(screenshot(`note-wrapping-label-scale`));
93
+ });
51
94
  });
52
95
  });