@ionic/core 7.4.1-nightly.20230918 → 7.4.1-nightly.20230920

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 (396) hide show
  1. package/components/action-sheet.js +3 -0
  2. package/components/alert.js +6 -1
  3. package/components/button.js +2 -0
  4. package/components/checkbox.js +9 -4
  5. package/components/icon.js +6 -0
  6. package/components/input-shims.js +88 -7
  7. package/components/ion-accordion-group.js +5 -1
  8. package/components/ion-accordion.js +2 -0
  9. package/components/ion-breadcrumbs.js +5 -1
  10. package/components/ion-datetime.js +10 -0
  11. package/components/ion-fab-list.js +2 -0
  12. package/components/ion-fab.js +2 -0
  13. package/components/ion-img.js +2 -0
  14. package/components/ion-infinite-scroll.js +3 -0
  15. package/components/ion-input.js +5 -0
  16. package/components/ion-item-sliding.js +2 -0
  17. package/components/ion-loading.js +3 -0
  18. package/components/ion-menu.js +10 -5
  19. package/components/ion-modal.js +3 -0
  20. package/components/ion-nav.js +3 -0
  21. package/components/ion-picker.js +3 -0
  22. package/components/ion-range.js +39 -5
  23. package/components/ion-refresher.js +2 -0
  24. package/components/ion-reorder-group.js +2 -0
  25. package/components/ion-route-redirect.js +3 -0
  26. package/components/ion-route.js +4 -0
  27. package/components/ion-router-outlet.js +2 -0
  28. package/components/ion-searchbar.js +4 -0
  29. package/components/ion-segment-button.js +2 -0
  30. package/components/ion-segment.js +6 -1
  31. package/components/ion-select.js +5 -0
  32. package/components/ion-split-pane.js +4 -0
  33. package/components/ion-tab-bar.js +2 -0
  34. package/components/ion-tab.js +2 -0
  35. package/components/ion-textarea.js +4 -0
  36. package/components/ion-title.js +2 -0
  37. package/components/ion-toast.js +3 -0
  38. package/components/ion-toggle.js +2 -0
  39. package/components/item.js +48 -10
  40. package/components/label.js +3 -0
  41. package/components/overlays.js +30 -10
  42. package/components/picker-column-internal.js +2 -0
  43. package/components/picker-column.js +2 -0
  44. package/components/popover.js +4 -0
  45. package/components/radio-group.js +3 -1
  46. package/components/radio.js +5 -0
  47. package/dist/cjs/{app-globals-a63c2a19.js → app-globals-56164d1a.js} +1 -1
  48. package/dist/cjs/{button-active-0ff8e82c.js → button-active-32f15660.js} +1 -1
  49. package/dist/cjs/{index-e6416850.js → index-5121bb90.js} +1 -1
  50. package/dist/cjs/{index-184fdd62.js → index-6f887430.js} +44 -14
  51. package/dist/cjs/{index-be8a2ab9.js → index-b183138a.js} +3 -3
  52. package/dist/cjs/index.cjs.js +7 -7
  53. package/dist/cjs/{input-shims-f8569707.js → input-shims-da7dc0de.js} +92 -12
  54. package/dist/cjs/ion-accordion_2.cjs.entry.js +2 -2
  55. package/dist/cjs/ion-action-sheet.cjs.entry.js +4 -4
  56. package/dist/cjs/ion-alert.cjs.entry.js +4 -4
  57. package/dist/cjs/ion-app_8.cjs.entry.js +5 -5
  58. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  59. package/dist/cjs/ion-back-button.cjs.entry.js +2 -2
  60. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  61. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
  62. package/dist/cjs/ion-button_2.cjs.entry.js +2 -2
  63. package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
  64. package/dist/cjs/ion-checkbox.cjs.entry.js +8 -6
  65. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  66. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  67. package/dist/cjs/ion-datetime-button.cjs.entry.js +2 -2
  68. package/dist/cjs/ion-datetime_3.cjs.entry.js +4 -4
  69. package/dist/cjs/ion-fab_3.cjs.entry.js +2 -2
  70. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  71. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -2
  72. package/dist/cjs/ion-input.cjs.entry.js +2 -2
  73. package/dist/cjs/ion-item-option_3.cjs.entry.js +2 -2
  74. package/dist/cjs/ion-item_8.cjs.entry.js +37 -10
  75. package/dist/cjs/ion-loading.cjs.entry.js +4 -4
  76. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  77. package/dist/cjs/ion-modal.cjs.entry.js +4 -4
  78. package/dist/cjs/ion-nav_2.cjs.entry.js +3 -3
  79. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +2 -2
  80. package/dist/cjs/ion-picker-internal.cjs.entry.js +1 -1
  81. package/dist/cjs/ion-popover.cjs.entry.js +5 -5
  82. package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
  83. package/dist/cjs/ion-radio_2.cjs.entry.js +2 -2
  84. package/dist/cjs/ion-range.cjs.entry.js +34 -7
  85. package/dist/cjs/ion-refresher_2.cjs.entry.js +2 -2
  86. package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
  87. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  88. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  89. package/dist/cjs/ion-searchbar.cjs.entry.js +2 -2
  90. package/dist/cjs/ion-segment_2.cjs.entry.js +2 -2
  91. package/dist/cjs/ion-select_3.cjs.entry.js +3 -3
  92. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  93. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  94. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +2 -2
  95. package/dist/cjs/ion-tab_2.cjs.entry.js +1 -1
  96. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  97. package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
  98. package/dist/cjs/ion-toast.cjs.entry.js +4 -4
  99. package/dist/cjs/ion-toggle.cjs.entry.js +2 -2
  100. package/dist/cjs/{ionic-global-6d5d27b5.js → ionic-global-14a0604b.js} +1 -1
  101. package/dist/cjs/ionic.cjs.js +5 -5
  102. package/dist/cjs/{ios.transition-80582b44.js → ios.transition-4b93903d.js} +2 -2
  103. package/dist/cjs/loader.cjs.js +4 -4
  104. package/dist/cjs/{md.transition-eeca9fb5.js → md.transition-79f3a215.js} +2 -2
  105. package/dist/cjs/{overlays-c78a0148.js → overlays-d3a13e61.js} +33 -13
  106. package/dist/cjs/{status-tap-cc4c6539.js → status-tap-e2e45ff8.js} +1 -1
  107. package/dist/collection/collection-manifest.json +1 -1
  108. package/dist/collection/components/checkbox/checkbox.js +6 -4
  109. package/dist/collection/components/checkbox/test/basic/checkbox.e2e.js +17 -0
  110. package/dist/collection/components/checkbox/test/legacy/basic/checkbox.e2e.js +17 -0
  111. package/dist/collection/components/item/item.ios.css +4 -0
  112. package/dist/collection/components/item/item.js +43 -7
  113. package/dist/collection/components/item/item.md.css +4 -0
  114. package/dist/collection/components/menu/menu.ios.css +20 -12
  115. package/dist/collection/components/menu/menu.js +2 -2
  116. package/dist/collection/components/menu/menu.md.css +20 -12
  117. package/dist/collection/components/menu/test/safe-area/menu.e2e.js +87 -0
  118. package/dist/collection/components/radio/test/item/radio.e2e.js +23 -0
  119. package/dist/collection/components/range/range.ios.css +14 -0
  120. package/dist/collection/components/range/range.js +30 -3
  121. package/dist/collection/components/range/range.md.css +14 -0
  122. package/dist/collection/components/range/test/item/range.e2e.js +11 -0
  123. package/dist/collection/components/select/test/basic/select.e2e.js +21 -0
  124. package/dist/collection/components/toggle/test/item/toggle.e2e.js +28 -0
  125. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +86 -4
  126. package/dist/collection/utils/input-shims/hacks/scroll-data.js +2 -3
  127. package/dist/collection/utils/overlays.js +29 -9
  128. package/dist/docs.json +2 -2
  129. package/dist/esm/{app-globals-c7886b40.js → app-globals-8ae762aa.js} +1 -1
  130. package/dist/esm/{button-active-b76ae4ec.js → button-active-513e9fff.js} +1 -1
  131. package/dist/esm/{index-adfb2000.js → index-2d388930.js} +44 -14
  132. package/dist/esm/{index-48f5e259.js → index-61bddc90.js} +1 -1
  133. package/dist/esm/{index-01839411.js → index-87684bba.js} +3 -3
  134. package/dist/esm/index.js +7 -7
  135. package/dist/esm/{input-shims-af993f05.js → input-shims-d78a3c77.js} +88 -8
  136. package/dist/esm/ion-accordion_2.entry.js +2 -2
  137. package/dist/esm/ion-action-sheet.entry.js +4 -4
  138. package/dist/esm/ion-alert.entry.js +4 -4
  139. package/dist/esm/ion-app_8.entry.js +5 -5
  140. package/dist/esm/ion-avatar_3.entry.js +2 -2
  141. package/dist/esm/ion-back-button.entry.js +2 -2
  142. package/dist/esm/ion-backdrop.entry.js +2 -2
  143. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  144. package/dist/esm/ion-button_2.entry.js +2 -2
  145. package/dist/esm/ion-card_5.entry.js +2 -2
  146. package/dist/esm/ion-checkbox.entry.js +8 -6
  147. package/dist/esm/ion-chip.entry.js +2 -2
  148. package/dist/esm/ion-col_3.entry.js +2 -2
  149. package/dist/esm/ion-datetime-button.entry.js +2 -2
  150. package/dist/esm/ion-datetime_3.entry.js +4 -4
  151. package/dist/esm/ion-fab_3.entry.js +2 -2
  152. package/dist/esm/ion-img.entry.js +2 -2
  153. package/dist/esm/ion-infinite-scroll_2.entry.js +2 -2
  154. package/dist/esm/ion-input.entry.js +2 -2
  155. package/dist/esm/ion-item-option_3.entry.js +2 -2
  156. package/dist/esm/ion-item_8.entry.js +37 -10
  157. package/dist/esm/ion-loading.entry.js +4 -4
  158. package/dist/esm/ion-menu_3.entry.js +7 -7
  159. package/dist/esm/ion-modal.entry.js +4 -4
  160. package/dist/esm/ion-nav_2.entry.js +3 -3
  161. package/dist/esm/ion-picker-column-internal.entry.js +2 -2
  162. package/dist/esm/ion-picker-internal.entry.js +1 -1
  163. package/dist/esm/ion-popover.entry.js +5 -5
  164. package/dist/esm/ion-progress-bar.entry.js +2 -2
  165. package/dist/esm/ion-radio_2.entry.js +2 -2
  166. package/dist/esm/ion-range.entry.js +34 -7
  167. package/dist/esm/ion-refresher_2.entry.js +2 -2
  168. package/dist/esm/ion-reorder_2.entry.js +2 -2
  169. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  170. package/dist/esm/ion-route_4.entry.js +2 -2
  171. package/dist/esm/ion-searchbar.entry.js +2 -2
  172. package/dist/esm/ion-segment_2.entry.js +2 -2
  173. package/dist/esm/ion-select_3.entry.js +3 -3
  174. package/dist/esm/ion-spinner.entry.js +2 -2
  175. package/dist/esm/ion-split-pane.entry.js +2 -2
  176. package/dist/esm/ion-tab-bar_2.entry.js +2 -2
  177. package/dist/esm/ion-tab_2.entry.js +1 -1
  178. package/dist/esm/ion-text.entry.js +2 -2
  179. package/dist/esm/ion-textarea.entry.js +2 -2
  180. package/dist/esm/ion-toast.entry.js +4 -4
  181. package/dist/esm/ion-toggle.entry.js +2 -2
  182. package/dist/esm/{ionic-global-9080266a.js → ionic-global-b3fc28dd.js} +1 -1
  183. package/dist/esm/ionic.js +6 -6
  184. package/dist/esm/{ios.transition-f43871cd.js → ios.transition-81e1aed6.js} +2 -2
  185. package/dist/esm/loader.js +5 -5
  186. package/dist/esm/{md.transition-12d21ad0.js → md.transition-5becd8b5.js} +2 -2
  187. package/dist/esm/{overlays-4565894b.js → overlays-8fc6656c.js} +31 -11
  188. package/dist/esm/{status-tap-121c711d.js → status-tap-c5af0dba.js} +1 -1
  189. package/dist/esm-es5/app-globals-8ae762aa.js +4 -0
  190. package/dist/esm-es5/{button-active-b76ae4ec.js → button-active-513e9fff.js} +1 -1
  191. package/dist/esm-es5/{index-adfb2000.js → index-2d388930.js} +1 -1
  192. package/dist/esm-es5/{index-48f5e259.js → index-61bddc90.js} +1 -1
  193. package/dist/esm-es5/{index-01839411.js → index-87684bba.js} +1 -1
  194. package/dist/esm-es5/index.js +1 -1
  195. package/dist/esm-es5/input-shims-d78a3c77.js +4 -0
  196. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  197. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  198. package/dist/esm-es5/ion-alert.entry.js +1 -1
  199. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  200. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  201. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  202. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  203. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  204. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  205. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  206. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  207. package/dist/esm-es5/ion-chip.entry.js +1 -1
  208. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  209. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  210. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  211. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  212. package/dist/esm-es5/ion-img.entry.js +1 -1
  213. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  214. package/dist/esm-es5/ion-input.entry.js +1 -1
  215. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  216. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  217. package/dist/esm-es5/ion-loading.entry.js +1 -1
  218. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  219. package/dist/esm-es5/ion-modal.entry.js +1 -1
  220. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  221. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  222. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  223. package/dist/esm-es5/ion-popover.entry.js +1 -1
  224. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  225. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  226. package/dist/esm-es5/ion-range.entry.js +1 -1
  227. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  228. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  229. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  230. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  231. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  232. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  233. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  234. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  235. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  236. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  237. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  238. package/dist/esm-es5/ion-text.entry.js +1 -1
  239. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  240. package/dist/esm-es5/ion-toast.entry.js +1 -1
  241. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  242. package/dist/esm-es5/{ionic-global-9080266a.js → ionic-global-b3fc28dd.js} +1 -1
  243. package/dist/esm-es5/ionic.js +1 -1
  244. package/dist/esm-es5/{ios.transition-f43871cd.js → ios.transition-81e1aed6.js} +1 -1
  245. package/dist/esm-es5/loader.js +1 -1
  246. package/dist/esm-es5/{md.transition-12d21ad0.js → md.transition-5becd8b5.js} +1 -1
  247. package/dist/esm-es5/overlays-8fc6656c.js +4 -0
  248. package/dist/esm-es5/{status-tap-121c711d.js → status-tap-c5af0dba.js} +1 -1
  249. package/dist/ionic/index.esm.js +1 -1
  250. package/dist/ionic/ionic.esm.js +1 -1
  251. package/dist/ionic/ionic.js +1 -1
  252. package/dist/ionic/{p-5fc777e6.system.js → p-00aed720.system.js} +1 -1
  253. package/dist/ionic/{p-a033a91d.system.entry.js → p-03e2e541.system.entry.js} +1 -1
  254. package/dist/ionic/{p-59b40b60.entry.js → p-04ef1ba6.entry.js} +1 -1
  255. package/dist/ionic/{p-2b0ecc04.entry.js → p-05f10762.entry.js} +1 -1
  256. package/dist/ionic/{p-3bf120f8.system.entry.js → p-08c5b9f4.system.entry.js} +1 -1
  257. package/dist/ionic/p-09e15a2a.system.entry.js +4 -0
  258. package/dist/ionic/p-0bd3cc92.entry.js +4 -0
  259. package/dist/ionic/{p-57847936.entry.js → p-116641fe.entry.js} +1 -1
  260. package/dist/ionic/{p-cd002251.entry.js → p-13a91505.entry.js} +1 -1
  261. package/dist/ionic/p-13ce151b.entry.js +4 -0
  262. package/dist/ionic/{p-6ccffb74.system.entry.js → p-1a36bf45.system.entry.js} +1 -1
  263. package/dist/ionic/{p-1916030e.entry.js → p-1bce805b.entry.js} +1 -1
  264. package/dist/ionic/{p-46058a1e.system.entry.js → p-1c406ee0.system.entry.js} +1 -1
  265. package/dist/ionic/{p-42e0558f.entry.js → p-20e5eb3e.entry.js} +1 -1
  266. package/dist/ionic/{p-3d5a6d14.system.js → p-2309dba2.system.js} +1 -1
  267. package/dist/ionic/{p-aa702daf.entry.js → p-270aa06b.entry.js} +1 -1
  268. package/dist/ionic/{p-9eced28c.entry.js → p-27614d55.entry.js} +1 -1
  269. package/dist/ionic/{p-c7ce7e18.entry.js → p-327fc1bf.entry.js} +1 -1
  270. package/dist/ionic/p-33630008.system.entry.js +4 -0
  271. package/dist/ionic/{p-8bcd482b.entry.js → p-3730f493.entry.js} +1 -1
  272. package/dist/ionic/{p-95188051.system.entry.js → p-37456282.system.entry.js} +1 -1
  273. package/dist/ionic/{p-07656a8a.entry.js → p-39715fcf.entry.js} +1 -1
  274. package/dist/ionic/{p-f62bed60.entry.js → p-3ae2faf0.entry.js} +1 -1
  275. package/dist/ionic/{p-fa8fc77b.system.entry.js → p-3af01ae0.system.entry.js} +1 -1
  276. package/dist/ionic/p-3cbcb899.entry.js +4 -0
  277. package/dist/ionic/{p-9e8727d6.entry.js → p-3e5676b7.entry.js} +1 -1
  278. package/dist/ionic/p-40e16caa.system.entry.js +4 -0
  279. package/dist/ionic/{p-48d378cf.entry.js → p-42a7b112.entry.js} +1 -1
  280. package/dist/ionic/{p-e239ab05.system.entry.js → p-4616f20a.system.entry.js} +1 -1
  281. package/dist/ionic/{p-4e1a58c6.system.entry.js → p-486b567b.system.entry.js} +1 -1
  282. package/dist/ionic/{p-dfee12f6.entry.js → p-4912b933.entry.js} +1 -1
  283. package/dist/ionic/{p-3d575698.system.entry.js → p-4a1ac160.system.entry.js} +1 -1
  284. package/dist/ionic/{p-b052b578.entry.js → p-4eab1bb4.entry.js} +1 -1
  285. package/dist/ionic/{p-264b5dd9.system.entry.js → p-53bbd357.system.entry.js} +1 -1
  286. package/dist/ionic/{p-9b53c813.entry.js → p-55b99166.entry.js} +1 -1
  287. package/dist/ionic/{p-e3ca182a.entry.js → p-568fec78.entry.js} +1 -1
  288. package/dist/ionic/{p-9be96bf3.system.entry.js → p-5c8c9748.system.entry.js} +1 -1
  289. package/dist/ionic/{p-d57e8b06.js → p-5e2dc8e0.js} +1 -1
  290. package/dist/ionic/{p-3c325277.js → p-5e43aa8b.js} +1 -1
  291. package/dist/ionic/{p-810f1bc9.system.entry.js → p-5e84b718.system.entry.js} +1 -1
  292. package/dist/ionic/{p-60f22efc.system.entry.js → p-60838ce3.system.entry.js} +1 -1
  293. package/dist/ionic/{p-5080e623.system.entry.js → p-62428e04.system.entry.js} +1 -1
  294. package/dist/ionic/{p-516421e2.system.entry.js → p-626f7142.system.entry.js} +1 -1
  295. package/dist/ionic/{p-a8270ae8.system.entry.js → p-63a73b69.system.entry.js} +1 -1
  296. package/dist/ionic/{p-5163baf4.system.entry.js → p-6522a762.system.entry.js} +1 -1
  297. package/dist/ionic/{p-a037b6d5.system.entry.js → p-65a4c12f.system.entry.js} +1 -1
  298. package/dist/ionic/{p-563068af.js → p-6b7e74ba.js} +1 -1
  299. package/dist/ionic/{p-6eb7b33c.system.entry.js → p-6ba07931.system.entry.js} +1 -1
  300. package/dist/ionic/{p-c8c0d58a.system.entry.js → p-6bbf2815.system.entry.js} +1 -1
  301. package/dist/ionic/{p-74834696.system.entry.js → p-6bc9c436.system.entry.js} +1 -1
  302. package/dist/ionic/{p-ec344ed1.system.entry.js → p-6ca0e4b2.system.entry.js} +1 -1
  303. package/dist/ionic/p-6edbc09b.system.js +4 -0
  304. package/dist/ionic/{p-4446e19f.system.entry.js → p-700a2cb1.system.entry.js} +1 -1
  305. package/dist/ionic/p-70ab8b73.js +5 -0
  306. package/dist/ionic/{p-52edd6b0.entry.js → p-7129d04e.entry.js} +1 -1
  307. package/dist/ionic/p-72a1cbc7.js +4 -0
  308. package/dist/ionic/{p-2e5930dd.system.js → p-73f50e29.system.js} +1 -1
  309. package/dist/ionic/{p-204fb8f0.system.entry.js → p-76e8336d.system.entry.js} +1 -1
  310. package/dist/ionic/p-78a293a5.js +4 -0
  311. package/dist/ionic/p-7a3caa4e.system.js +4 -0
  312. package/dist/ionic/{p-32983529.system.entry.js → p-7dc0ee11.system.entry.js} +1 -1
  313. package/dist/ionic/{p-ab051966.entry.js → p-7e46b6ab.entry.js} +1 -1
  314. package/dist/ionic/p-7e9e16bf.system.entry.js +4 -0
  315. package/dist/ionic/{p-6276ba2f.system.entry.js → p-82da795c.system.entry.js} +1 -1
  316. package/dist/ionic/{p-9f3ad626.system.entry.js → p-82f58c25.system.entry.js} +1 -1
  317. package/dist/ionic/{p-5df94bf8.entry.js → p-83b7bbf9.entry.js} +1 -1
  318. package/dist/ionic/{p-ec7ff98b.entry.js → p-88ad9cb6.entry.js} +1 -1
  319. package/dist/ionic/{p-fdfc7b98.entry.js → p-8b79baf0.entry.js} +1 -1
  320. package/dist/ionic/{p-5260588f.system.entry.js → p-8e28945a.system.entry.js} +1 -1
  321. package/dist/ionic/p-8fdd4a2f.system.js +4 -0
  322. package/dist/ionic/{p-49f2eaa6.entry.js → p-90d892fd.entry.js} +1 -1
  323. package/dist/ionic/{p-2441ba84.system.js → p-91546be9.system.js} +1 -1
  324. package/dist/ionic/{p-a122ecd0.system.js → p-918d5f19.system.js} +1 -1
  325. package/dist/ionic/{p-ff3d728d.system.js → p-93616477.system.js} +1 -1
  326. package/dist/ionic/{p-629b0629.js → p-972763df.js} +1 -1
  327. package/dist/ionic/p-9f2e0db9.js +4 -0
  328. package/dist/ionic/{p-c2d6088f.entry.js → p-a1a2dd4d.entry.js} +1 -1
  329. package/dist/ionic/{p-c005eb67.system.entry.js → p-a6d8476b.system.entry.js} +1 -1
  330. package/dist/ionic/{p-28d8b87b.entry.js → p-a720dc73.entry.js} +1 -1
  331. package/dist/ionic/{p-84084b75.entry.js → p-a8d33949.entry.js} +1 -1
  332. package/dist/ionic/{p-70f4fbac.entry.js → p-ab7f8f4c.entry.js} +1 -1
  333. package/dist/ionic/{p-26276eb7.system.entry.js → p-abf426cd.system.entry.js} +1 -1
  334. package/dist/ionic/{p-9fccec52.system.js → p-b098f738.system.js} +1 -1
  335. package/dist/ionic/{p-eb91aee6.entry.js → p-b0dd4f33.entry.js} +1 -1
  336. package/dist/ionic/p-b132c2c0.system.js +4 -0
  337. package/dist/ionic/{p-b453b38d.entry.js → p-b49fe110.entry.js} +1 -1
  338. package/dist/ionic/{p-b703ebeb.system.entry.js → p-b5637aeb.system.entry.js} +1 -1
  339. package/dist/ionic/p-b95fd3c6.entry.js +4 -0
  340. package/dist/ionic/{p-ff0611e6.system.entry.js → p-be321bb6.system.entry.js} +1 -1
  341. package/dist/ionic/{p-7474a472.system.entry.js → p-bf8224f4.system.entry.js} +1 -1
  342. package/dist/ionic/{p-0dbfa45f.entry.js → p-bf9b1560.entry.js} +1 -1
  343. package/dist/ionic/{p-98bfaff3.system.entry.js → p-bfac43d7.system.entry.js} +1 -1
  344. package/dist/ionic/{p-574411f2.system.entry.js → p-c4d08d6d.system.entry.js} +1 -1
  345. package/dist/ionic/{p-d8d30fd1.system.entry.js → p-c5729044.system.entry.js} +1 -1
  346. package/dist/ionic/{p-07f5e286.entry.js → p-c7fca267.entry.js} +1 -1
  347. package/dist/ionic/{p-041ac2c3.entry.js → p-cc3aa152.entry.js} +1 -1
  348. package/dist/ionic/{p-6dff4431.entry.js → p-cd12dcd9.entry.js} +1 -1
  349. package/dist/ionic/{p-d0d09178.system.entry.js → p-cd675d89.system.entry.js} +1 -1
  350. package/dist/ionic/{p-ef8a8827.system.entry.js → p-ce24ddd7.system.entry.js} +1 -1
  351. package/dist/ionic/{p-b3f6f321.js → p-ce7a651e.js} +1 -1
  352. package/dist/ionic/{p-5e549223.system.js → p-d4cea1ba.system.js} +1 -1
  353. package/dist/ionic/{p-765e6339.entry.js → p-d8b2c214.entry.js} +1 -1
  354. package/dist/ionic/{p-2ac2278e.system.entry.js → p-de0f1af2.system.entry.js} +1 -1
  355. package/dist/ionic/{p-5a9dc764.system.entry.js → p-de676d36.system.entry.js} +1 -1
  356. package/dist/ionic/{p-22e92b06.system.entry.js → p-df699a02.system.entry.js} +1 -1
  357. package/dist/ionic/{p-99a3df5c.entry.js → p-e24630f9.entry.js} +1 -1
  358. package/dist/ionic/{p-3f15f60b.entry.js → p-e57a38f3.entry.js} +1 -1
  359. package/dist/ionic/{p-74ef17ea.system.entry.js → p-e89abe38.system.entry.js} +1 -1
  360. package/dist/ionic/{p-37c9e295.entry.js → p-ea88031d.entry.js} +1 -1
  361. package/dist/ionic/{p-47a11fc4.entry.js → p-ebaeeee8.entry.js} +1 -1
  362. package/dist/ionic/{p-a314559e.system.js → p-ec102360.system.js} +1 -1
  363. package/dist/ionic/{p-072f99fd.entry.js → p-ee6d9730.entry.js} +1 -1
  364. package/dist/ionic/{p-bacf09d3.entry.js → p-f0dcf99b.entry.js} +1 -1
  365. package/dist/ionic/p-f9015336.js +4 -0
  366. package/dist/ionic/{p-11d0977d.entry.js → p-f920f5ca.entry.js} +1 -1
  367. package/dist/ionic/p-f978ccd1.js +4 -0
  368. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  369. package/dist/types/components/item/item.d.ts +1 -0
  370. package/dist/types/components/range/range.d.ts +8 -0
  371. package/dist/types/utils/browser/index.d.ts +16 -1
  372. package/dist/types/utils/input-shims/hacks/scroll-data.d.ts +1 -1
  373. package/dist/types/utils/overlays.d.ts +5 -2
  374. package/hydrate/index.js +128 -40
  375. package/package.json +2 -2
  376. package/dist/esm-es5/app-globals-c7886b40.js +0 -4
  377. package/dist/esm-es5/input-shims-af993f05.js +0 -4
  378. package/dist/esm-es5/overlays-4565894b.js +0 -4
  379. package/dist/ionic/p-23ddd787.system.entry.js +0 -4
  380. package/dist/ionic/p-4531b920.system.js +0 -4
  381. package/dist/ionic/p-56495958.js +0 -4
  382. package/dist/ionic/p-6d640b2b.entry.js +0 -4
  383. package/dist/ionic/p-75d4ceab.js +0 -4
  384. package/dist/ionic/p-83459b99.entry.js +0 -4
  385. package/dist/ionic/p-8f7edf3e.js +0 -4
  386. package/dist/ionic/p-a18eb556.js +0 -5
  387. package/dist/ionic/p-a533868d.system.js +0 -4
  388. package/dist/ionic/p-be187db3.entry.js +0 -4
  389. package/dist/ionic/p-bfee11b2.system.js +0 -4
  390. package/dist/ionic/p-c68a8814.system.js +0 -4
  391. package/dist/ionic/p-cc758251.system.entry.js +0 -4
  392. package/dist/ionic/p-d898dd46.js +0 -4
  393. package/dist/ionic/p-dacb0258.js +0 -4
  394. package/dist/ionic/p-ee55302a.system.entry.js +0 -4
  395. package/dist/ionic/p-f0c28fbd.entry.js +0 -4
  396. package/dist/ionic/p-fde174d6.system.entry.js +0 -4
@@ -3,11 +3,12 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- const ionicGlobal = require('./ionic-global-6d5d27b5.js');
6
+ const index = require('./index-306a7476.js');
7
+ const ionicGlobal = require('./ionic-global-14a0604b.js');
7
8
  const frameworkDelegate = require('./framework-delegate-c0873a6f.js');
8
9
  const hardwareBackButton = require('./hardware-back-button-b67c8e75.js');
9
10
  const helpers = require('./helpers-ea4ccbcb.js');
10
- const index = require('./index-cc7dfb7c.js');
11
+ const index$1 = require('./index-cc7dfb7c.js');
11
12
 
12
13
  let lastOverlayIndex = 0;
13
14
  let lastId = 0;
@@ -21,7 +22,7 @@ const createController = (tagName) => {
21
22
  return dismissOverlay(document, data, role, tagName, id);
22
23
  },
23
24
  async getTop() {
24
- return getOverlay(document, tagName);
25
+ return getPresentedOverlay(document, tagName);
25
26
  },
26
27
  };
27
28
  };
@@ -138,7 +139,7 @@ const focusLastDescendant = (ref, overlay) => {
138
139
  * Should NOT include: Toast
139
140
  */
140
141
  const trapKeyboardFocus = (ev, doc) => {
141
- const lastOverlay = getOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover');
142
+ const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover');
142
143
  const target = ev.target;
143
144
  /**
144
145
  * If no active overlay, ignore this event.
@@ -293,7 +294,7 @@ const connectListeners = (doc) => {
293
294
  }, true);
294
295
  // handle back-button click
295
296
  doc.addEventListener('ionBackButton', (ev) => {
296
- const lastOverlay = getOverlay(doc);
297
+ const lastOverlay = getPresentedOverlay(doc);
297
298
  if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {
298
299
  ev.detail.register(hardwareBackButton.OVERLAY_BACK_BUTTON_PRIORITY, () => {
299
300
  return lastOverlay.dismiss(undefined, BACKDROP);
@@ -303,7 +304,7 @@ const connectListeners = (doc) => {
303
304
  // handle ESC to close overlay
304
305
  doc.addEventListener('keydown', (ev) => {
305
306
  if (ev.key === 'Escape') {
306
- const lastOverlay = getOverlay(doc);
307
+ const lastOverlay = getPresentedOverlay(doc);
307
308
  if (lastOverlay === null || lastOverlay === void 0 ? void 0 : lastOverlay.backdropDismiss) {
308
309
  lastOverlay.dismiss(undefined, BACKDROP);
309
310
  }
@@ -312,12 +313,15 @@ const connectListeners = (doc) => {
312
313
  }
313
314
  };
314
315
  const dismissOverlay = (doc, data, role, overlayTag, id) => {
315
- const overlay = getOverlay(doc, overlayTag, id);
316
+ const overlay = getPresentedOverlay(doc, overlayTag, id);
316
317
  if (!overlay) {
317
318
  return Promise.reject('overlay does not exist');
318
319
  }
319
320
  return overlay.dismiss(data, role);
320
321
  };
322
+ /**
323
+ * Returns a list of all overlays in the DOM even if they are not presented.
324
+ */
321
325
  const getOverlays = (doc, selector) => {
322
326
  if (selector === undefined) {
323
327
  selector = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover,ion-toast';
@@ -325,14 +329,24 @@ const getOverlays = (doc, selector) => {
325
329
  return Array.from(doc.querySelectorAll(selector)).filter((c) => c.overlayIndex > 0);
326
330
  };
327
331
  /**
328
- * Returns an overlay element
332
+ * Returns a list of all presented overlays.
333
+ * Inline overlays can exist in the DOM but not be presented,
334
+ * so there are times when we want to exclude those.
335
+ * @param doc The document to find the element within.
336
+ * @param overlayTag The selector for the overlay, defaults to Ionic overlay components.
337
+ */
338
+ const getPresentedOverlays = (doc, overlayTag) => {
339
+ return getOverlays(doc, overlayTag).filter((o) => !isOverlayHidden(o));
340
+ };
341
+ /**
342
+ * Returns a presented overlay element.
329
343
  * @param doc The document to find the element within.
330
344
  * @param overlayTag The selector for the overlay, defaults to Ionic overlay components.
331
345
  * @param id The unique identifier for the overlay instance.
332
346
  * @returns The overlay element or `undefined` if no overlay element is found.
333
347
  */
334
- const getOverlay = (doc, overlayTag, id) => {
335
- const overlays = getOverlays(doc, overlayTag).filter((o) => !isOverlayHidden(o));
348
+ const getPresentedOverlay = (doc, overlayTag, id) => {
349
+ const overlays = getPresentedOverlays(doc, overlayTag);
336
350
  return id === undefined ? overlays[overlays.length - 1] : overlays.find((o) => o.id === id);
337
351
  };
338
352
  /**
@@ -438,7 +452,13 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
438
452
  if (!overlay.presented) {
439
453
  return false;
440
454
  }
441
- setRootAriaHidden(false);
455
+ /**
456
+ * If this is the last visible overlay then
457
+ * we want to re-add the root to the accessibility tree.
458
+ */
459
+ if (index.doc !== undefined && getPresentedOverlays(index.doc).length === 1) {
460
+ setRootAriaHidden(false);
461
+ }
442
462
  overlay.presented = false;
443
463
  try {
444
464
  // Overlay contents should not be clickable during dismiss
@@ -650,7 +670,7 @@ const createTriggerController = () => {
650
670
  removeClickListener();
651
671
  const triggerEl = trigger !== undefined ? document.getElementById(trigger) : null;
652
672
  if (!triggerEl) {
653
- index.printIonWarning(`A trigger element with the ID "${trigger}" was not found in the DOM. The trigger element must be in the DOM when the "trigger" property is set on an overlay component.`, el);
673
+ index$1.printIonWarning(`A trigger element with the ID "${trigger}" was not found in the DOM. The trigger element must be in the DOM when the "trigger" property is set on an overlay component.`, el);
654
674
  return;
655
675
  }
656
676
  const configureTriggerInteraction = (targetEl, overlayEl) => {
@@ -680,7 +700,7 @@ exports.createTriggerController = createTriggerController;
680
700
  exports.dismiss = dismiss;
681
701
  exports.eventMethod = eventMethod;
682
702
  exports.focusFirstDescendant = focusFirstDescendant;
683
- exports.getOverlay = getOverlay;
703
+ exports.getPresentedOverlay = getPresentedOverlay;
684
704
  exports.isCancel = isCancel;
685
705
  exports.loadingController = loadingController;
686
706
  exports.modalController = modalController;
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- const index = require('./index-184fdd62.js');
6
+ const index = require('./index-6f887430.js');
7
7
  const index$1 = require('./index-10873539.js');
8
8
  const helpers = require('./helpers-ea4ccbcb.js');
9
9
  require('./index-cc7dfb7c.js');
@@ -94,7 +94,7 @@
94
94
  ],
95
95
  "compiler": {
96
96
  "name": "@stencil/core",
97
- "version": "4.2.1",
97
+ "version": "4.3.0",
98
98
  "typescriptVersion": "5.1.6"
99
99
  },
100
100
  "collections": [
@@ -47,6 +47,9 @@ export class Checkbox {
47
47
  this.onBlur = () => {
48
48
  this.ionBlur.emit();
49
49
  };
50
+ this.onClick = (ev) => {
51
+ this.toggleChecked(ev);
52
+ };
50
53
  this.color = undefined;
51
54
  this.name = this.inputId;
52
55
  this.checked = false;
@@ -58,9 +61,8 @@ export class Checkbox {
58
61
  this.alignment = 'center';
59
62
  this.legacy = undefined;
60
63
  }
61
- // TODO(FW-3100): remove this
62
64
  connectedCallback() {
63
- this.legacyFormController = createLegacyFormController(this.el);
65
+ this.legacyFormController = createLegacyFormController(this.el); // TODO(FW-3100): remove this
64
66
  }
65
67
  componentWillLoad() {
66
68
  this.emitStyle();
@@ -107,7 +109,7 @@ export class Checkbox {
107
109
  [`checkbox-justify-${justify}`]: true,
108
110
  [`checkbox-alignment-${alignment}`]: true,
109
111
  [`checkbox-label-placement-${labelPlacement}`]: true,
110
- }) }, 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: {
112
+ }), 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: {
111
113
  'label-text-wrapper': true,
112
114
  'label-text-wrapper-hidden': el.textContent === '',
113
115
  } }, h("slot", null)), h("div", { class: "native-wrapper" }, h("svg", { class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
@@ -140,7 +142,7 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
140
142
  'checkbox-indeterminate': indeterminate,
141
143
  'legacy-checkbox': true,
142
144
  interactive: true,
143
- }) }, h("svg", { class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path), h("label", { htmlFor: inputId }, labelText), h("input", { type: "checkbox", "aria-checked": `${checked}`, disabled: disabled, id: inputId, onChange: this.toggleChecked, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl) })));
145
+ }), onClick: this.onClick }, h("svg", { class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path), h("label", { htmlFor: inputId }, labelText), h("input", { type: "checkbox", "aria-checked": `${checked}`, disabled: disabled, id: inputId, onChange: this.toggleChecked, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl) })));
144
146
  }
145
147
  getSVGPath(mode, indeterminate) {
146
148
  let path = indeterminate ? (h("path", { d: "M6 12L18 12", part: "mark" })) : (h("path", { d: "M5.9,12.5l3.8,3.8l8.8-8.8", part: "mark" }));
@@ -56,5 +56,22 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
56
56
  await checkbox.evaluate((el) => (el.checked = true));
57
57
  expect(ionChange).not.toHaveReceivedEvent();
58
58
  });
59
+ test('clicking padded space within item should click the checkbox', async ({ page }) => {
60
+ await page.setContent(`
61
+ <ion-item>
62
+ <ion-checkbox>Size</ion-checkbox>
63
+ </ion-item>
64
+ `, config);
65
+ const itemNative = page.locator('.item-native');
66
+ const ionChange = await page.spyOnEvent('ionChange');
67
+ // Clicks the padded space within the item
68
+ await itemNative.click({
69
+ position: {
70
+ x: 5,
71
+ y: 5,
72
+ },
73
+ });
74
+ expect(ionChange).toHaveReceivedEvent();
75
+ });
59
76
  });
60
77
  });
@@ -47,5 +47,22 @@ configs({ directions: ['ltr'] }).forEach(({ title, config }) => {
47
47
  await checkbox.evaluate((el) => (el.checked = true));
48
48
  await expect(ionChange).not.toHaveReceivedEvent();
49
49
  });
50
+ test('clicking padded space within item should click the checkbox', async ({ page }) => {
51
+ await page.setContent(`
52
+ <ion-item>
53
+ <ion-checkbox legacy="true" value="my-checkbox"></ion-checkbox>
54
+ </ion-item>
55
+ `, config);
56
+ const itemNative = page.locator('.item-native');
57
+ const ionChange = await page.spyOnEvent('ionChange');
58
+ // Clicks the padded space within the item
59
+ await itemNative.click({
60
+ position: {
61
+ x: 5,
62
+ y: 5,
63
+ },
64
+ });
65
+ expect(ionChange).toHaveReceivedEvent();
66
+ });
50
67
  });
51
68
  });
@@ -134,6 +134,10 @@
134
134
  background: var(--ion-color-contrast);
135
135
  }
136
136
  }
137
+ :host(.item-has-interactive-control) {
138
+ cursor: pointer;
139
+ }
140
+
137
141
  :host(.item-interactive-disabled:not(.item-multiple-inputs)) {
138
142
  cursor: default;
139
143
  pointer-events: none;
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { Host, forceUpdate, h } from "@stencil/core";
4
+ import { Build, Host, forceUpdate, h } from "@stencil/core";
5
5
  import { inheritAttributes, raf } from "../../utils/helpers";
6
6
  import { printIonError, printIonWarning } from "../../utils/logging/index";
7
7
  import { createColorClasses, hostContext, openURL } from "../../utils/theme";
@@ -194,8 +194,21 @@ export class Item {
194
194
  this.el.classList.add('item-has-start-slot');
195
195
  }
196
196
  }
197
+ getFirstInteractive() {
198
+ if (Build.isTesting) {
199
+ /**
200
+ * Pseudo selectors can't be tested in unit tests.
201
+ * It will cause an error when running the tests.
202
+ *
203
+ * TODO: FW-5205 - Remove the build conditional when this is fixed in Stencil
204
+ */
205
+ return undefined;
206
+ }
207
+ const controls = this.el.querySelectorAll('ion-toggle:not([disabled]), ion-checkbox:not([disabled]), ion-radio:not([disabled]), ion-select:not([disabled])');
208
+ return controls[0];
209
+ }
197
210
  render() {
198
- const { counterString, detail, detailIcon, download, fill, labelColorStyles, lines, disabled, href, rel, shape, target, routerAnimation, routerDirection, inheritedAriaAttributes, } = this;
211
+ const { counterString, detail, detailIcon, download, fill, labelColorStyles, lines, disabled, href, rel, shape, target, routerAnimation, routerDirection, inheritedAriaAttributes, multipleInputs, } = this;
199
212
  const childStyles = {};
200
213
  const mode = getIonMode(this);
201
214
  const clickable = this.isClickable();
@@ -209,15 +222,37 @@ export class Item {
209
222
  rel,
210
223
  target,
211
224
  };
225
+ let clickFn = {};
226
+ const firstInteractive = this.getFirstInteractive();
212
227
  // Only set onClick if the item is clickable to prevent screen
213
228
  // readers from reading all items as clickable
214
- const clickFn = clickable
215
- ? {
229
+ if (clickable || (firstInteractive !== undefined && !multipleInputs)) {
230
+ clickFn = {
216
231
  onClick: (ev) => {
217
- openURL(href, ev, routerDirection, routerAnimation);
232
+ if (clickable) {
233
+ openURL(href, ev, routerDirection, routerAnimation);
234
+ }
235
+ if (firstInteractive !== undefined && !multipleInputs) {
236
+ const path = ev.composedPath();
237
+ const target = path[0];
238
+ if (ev.isTrusted) {
239
+ /**
240
+ * Dispatches a click event to the first interactive element,
241
+ * when it is the result of a user clicking on the item.
242
+ *
243
+ * We check if the click target is in the shadow root,
244
+ * which means the user clicked on the .item-native or
245
+ * .item-inner padding.
246
+ */
247
+ const clickedWithinShadowRoot = this.el.shadowRoot.contains(target);
248
+ if (clickedWithinShadowRoot) {
249
+ firstInteractive.click();
250
+ }
251
+ }
252
+ }
218
253
  },
219
- }
220
- : {};
254
+ };
255
+ }
221
256
  const showDetail = detail !== undefined ? detail : mode === 'ios' && clickable;
222
257
  this.itemStyles.forEach((value) => {
223
258
  Object.assign(childStyles, value);
@@ -232,6 +267,7 @@ export class Item {
232
267
  [`item-lines-${lines}`]: lines !== undefined,
233
268
  [`item-fill-${fillValue}`]: true,
234
269
  [`item-shape-${shape}`]: shape !== undefined,
270
+ 'item-has-interactive-control': firstInteractive !== undefined,
235
271
  'item-disabled': disabled,
236
272
  'in-list': inList,
237
273
  'item-multiple-inputs': this.multipleInputs,
@@ -134,6 +134,10 @@
134
134
  background: var(--ion-color-contrast);
135
135
  }
136
136
  }
137
+ :host(.item-has-interactive-control) {
138
+ cursor: pointer;
139
+ }
140
+
137
141
  :host(.item-interactive-disabled:not(.item-multiple-inputs)) {
138
142
  cursor: default;
139
143
  pointer-events: none;
@@ -97,12 +97,14 @@
97
97
  * Otherwise, the content will have less space on both sides.
98
98
  *
99
99
  * RTL:
100
- * The right side of the menu touches the screen edge. The safe area padding has
101
- * already been set in the core styles, so there's no need to set it again.
100
+ * The right side of the menu touches the screen edge.
101
+ * The right side needs to revert back to the default value that was set in the core styles, so we unset it here.
102
+ * This would keep the variable consistent with the core styles.
103
+ * Additionally, it would continue to allow users to override the variable if they choose to.
102
104
  * The left side of the menu is not touching the screen edge. Padding is not
103
105
  * applied to the left side of the menu. A value of 0 is set.
104
106
  */
105
- --ion-safe-area-right: env(safe-area-inset-right);
107
+ --ion-safe-area-right: unset;
106
108
  --ion-safe-area-left: 0px;
107
109
  }
108
110
 
@@ -115,12 +117,14 @@
115
117
  * Otherwise, the content will have less space on both sides.
116
118
  *
117
119
  * RTL:
118
- * The right side of the menu touches the screen edge. The safe area padding has
119
- * already been set in the core styles, so there's no need to set it again.
120
+ * The right side of the menu touches the screen edge.
121
+ * The right side needs to revert back to the default value that was set in the core styles, so we unset it here.
122
+ * This would keep the variable consistent with the core styles.
123
+ * Additionally, it would continue to allow users to override the variable if they choose to.
120
124
  * The left side of the menu is not touching the screen edge. Padding is not
121
125
  * applied to the left side of the menu. A value of 0 is set.
122
126
  */
123
- --ion-safe-area-right: env(safe-area-inset-right);
127
+ --ion-safe-area-right: unset;
124
128
  --ion-safe-area-left: 0px;
125
129
  }
126
130
  }
@@ -176,12 +180,14 @@
176
180
  * Otherwise, the content will have less space on both sides.
177
181
  *
178
182
  * RTL:
179
- * The left side of the menu touches the screen edge. The safe area padding has
180
- * already been set in the core styles, so there's no need to set it again.
183
+ * The left side of the menu touches the screen edge.
184
+ * The left side needs to revert back to the default value that was set in the core styles, so we unset it here.
185
+ * This would keep the variable consistent with the core styles.
186
+ * Additionally, it would continue to allow users to override the variable if they choose to.
181
187
  * The right side of the menu is not touching the screen edge. Padding is not
182
188
  * applied to the right side of the menu. A value of 0 is set.
183
189
  */
184
- --ion-safe-area-left: env(safe-area-inset-left);
190
+ --ion-safe-area-left: unset;
185
191
  --ion-safe-area-right: 0px;
186
192
  }
187
193
 
@@ -194,12 +200,14 @@
194
200
  * Otherwise, the content will have less space on both sides.
195
201
  *
196
202
  * RTL:
197
- * The left side of the menu touches the screen edge. The safe area padding has
198
- * already been set in the core styles, so there's no need to set it again.
203
+ * The left side of the menu touches the screen edge.
204
+ * The left side needs to revert back to the default value that was set in the core styles, so we unset it here.
205
+ * This would keep the variable consistent with the core styles.
206
+ * Additionally, it would continue to allow users to override the variable if they choose to.
199
207
  * The right side of the menu is not touching the screen edge. Padding is not
200
208
  * applied to the right side of the menu. A value of 0 is set.
201
209
  */
202
- --ion-safe-area-left: env(safe-area-inset-left);
210
+ --ion-safe-area-left: unset;
203
211
  --ion-safe-area-right: 0px;
204
212
  }
205
213
  }
@@ -7,7 +7,7 @@ import { doc } from "../../utils/browser/index";
7
7
  import { GESTURE_CONTROLLER } from "../../utils/gesture/index";
8
8
  import { inheritAriaAttributes, assert, clamp, isEndSide as isEnd } from "../../utils/helpers";
9
9
  import { menuController } from "../../utils/menu-controller/index";
10
- import { getOverlay } from "../../utils/overlays";
10
+ import { getPresentedOverlay } from "../../utils/overlays";
11
11
  import { config } from "../../global/config";
12
12
  import { getIonMode } from "../../global/ionic-global";
13
13
  const iosEasing = 'cubic-bezier(0.32,0.72,0,1)';
@@ -35,7 +35,7 @@ export class Menu {
35
35
  * open does not contain this ion-menu, then ion-menu's
36
36
  * focus trapping should not run.
37
37
  */
38
- const lastOverlay = getOverlay(document);
38
+ const lastOverlay = getPresentedOverlay(document);
39
39
  if (lastOverlay && !lastOverlay.contains(this.el)) {
40
40
  return;
41
41
  }
@@ -97,12 +97,14 @@
97
97
  * Otherwise, the content will have less space on both sides.
98
98
  *
99
99
  * RTL:
100
- * The right side of the menu touches the screen edge. The safe area padding has
101
- * already been set in the core styles, so there's no need to set it again.
100
+ * The right side of the menu touches the screen edge.
101
+ * The right side needs to revert back to the default value that was set in the core styles, so we unset it here.
102
+ * This would keep the variable consistent with the core styles.
103
+ * Additionally, it would continue to allow users to override the variable if they choose to.
102
104
  * The left side of the menu is not touching the screen edge. Padding is not
103
105
  * applied to the left side of the menu. A value of 0 is set.
104
106
  */
105
- --ion-safe-area-right: env(safe-area-inset-right);
107
+ --ion-safe-area-right: unset;
106
108
  --ion-safe-area-left: 0px;
107
109
  }
108
110
 
@@ -115,12 +117,14 @@
115
117
  * Otherwise, the content will have less space on both sides.
116
118
  *
117
119
  * RTL:
118
- * The right side of the menu touches the screen edge. The safe area padding has
119
- * already been set in the core styles, so there's no need to set it again.
120
+ * The right side of the menu touches the screen edge.
121
+ * The right side needs to revert back to the default value that was set in the core styles, so we unset it here.
122
+ * This would keep the variable consistent with the core styles.
123
+ * Additionally, it would continue to allow users to override the variable if they choose to.
120
124
  * The left side of the menu is not touching the screen edge. Padding is not
121
125
  * applied to the left side of the menu. A value of 0 is set.
122
126
  */
123
- --ion-safe-area-right: env(safe-area-inset-right);
127
+ --ion-safe-area-right: unset;
124
128
  --ion-safe-area-left: 0px;
125
129
  }
126
130
  }
@@ -176,12 +180,14 @@
176
180
  * Otherwise, the content will have less space on both sides.
177
181
  *
178
182
  * RTL:
179
- * The left side of the menu touches the screen edge. The safe area padding has
180
- * already been set in the core styles, so there's no need to set it again.
183
+ * The left side of the menu touches the screen edge.
184
+ * The left side needs to revert back to the default value that was set in the core styles, so we unset it here.
185
+ * This would keep the variable consistent with the core styles.
186
+ * Additionally, it would continue to allow users to override the variable if they choose to.
181
187
  * The right side of the menu is not touching the screen edge. Padding is not
182
188
  * applied to the right side of the menu. A value of 0 is set.
183
189
  */
184
- --ion-safe-area-left: env(safe-area-inset-left);
190
+ --ion-safe-area-left: unset;
185
191
  --ion-safe-area-right: 0px;
186
192
  }
187
193
 
@@ -194,12 +200,14 @@
194
200
  * Otherwise, the content will have less space on both sides.
195
201
  *
196
202
  * RTL:
197
- * The left side of the menu touches the screen edge. The safe area padding has
198
- * already been set in the core styles, so there's no need to set it again.
203
+ * The left side of the menu touches the screen edge.
204
+ * The left side needs to revert back to the default value that was set in the core styles, so we unset it here.
205
+ * This would keep the variable consistent with the core styles.
206
+ * Additionally, it would continue to allow users to override the variable if they choose to.
199
207
  * The right side of the menu is not touching the screen edge. Padding is not
200
208
  * applied to the right side of the menu. A value of 0 is set.
201
209
  */
202
- --ion-safe-area-left: env(safe-area-inset-left);
210
+ --ion-safe-area-left: unset;
203
211
  --ion-safe-area-right: 0px;
204
212
  }
205
213
  }
@@ -0,0 +1,87 @@
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
+ /**
7
+ * This behavior does not vary across modes.
8
+ */
9
+ configs({ modes: ['md'] }).forEach(({ title, config, screenshot }) => {
10
+ test.describe(title('menu: safe area'), () => {
11
+ test.beforeEach(async ({ page }) => {
12
+ await page.goto(`/src/components/menu/test/safe-area`, config);
13
+ });
14
+ test.describe('side: start', () => {
15
+ test('should render with safe area when notch is on the left', async ({ page }) => {
16
+ const ionDidOpen = await page.spyOnEvent('ionDidOpen');
17
+ await page.evaluate(() => {
18
+ const style = document.querySelector('style');
19
+ style.innerHTML = `
20
+ :root {
21
+ --ion-safe-area-left: 50px !important;
22
+ --ion-safe-area-right: 10px !important;
23
+ }
24
+ `;
25
+ });
26
+ await page.click('#open-start');
27
+ await ionDidOpen.next();
28
+ const startMenu = page.locator('[menu-id="start-menu"]');
29
+ await expect(startMenu).toHaveClass(/show-menu/);
30
+ await expect(page).toHaveScreenshot(screenshot(`menu-start-safe-area-left-notch`));
31
+ });
32
+ test('should render with safe area when notch is on the right', async ({ page }) => {
33
+ const ionDidOpen = await page.spyOnEvent('ionDidOpen');
34
+ await page.evaluate(() => {
35
+ const style = document.querySelector('style');
36
+ style.innerHTML = `
37
+ :root {
38
+ --ion-safe-area-left: 10px !important;
39
+ --ion-safe-area-right: 50px !important;
40
+ }
41
+ `;
42
+ });
43
+ await page.click('#open-start');
44
+ await ionDidOpen.next();
45
+ const startMenu = page.locator('[menu-id="start-menu"]');
46
+ await expect(startMenu).toHaveClass(/show-menu/);
47
+ await expect(page).toHaveScreenshot(screenshot(`menu-start-safe-area-right-notch`));
48
+ });
49
+ });
50
+ test.describe('side: end', () => {
51
+ test('should render with safe area when notch is on the left', async ({ page }) => {
52
+ const ionDidOpen = await page.spyOnEvent('ionDidOpen');
53
+ await page.evaluate(() => {
54
+ const style = document.querySelector('style');
55
+ style.innerHTML = `
56
+ :root {
57
+ --ion-safe-area-left: 50px !important;
58
+ --ion-safe-area-right: 10px !important;
59
+ }
60
+ `;
61
+ });
62
+ await page.click('#open-end');
63
+ await ionDidOpen.next();
64
+ const endMenu = page.locator('[menu-id="end-menu"]');
65
+ await expect(endMenu).toHaveClass(/show-menu/);
66
+ await expect(page).toHaveScreenshot(screenshot(`menu-end-safe-area-left-notch`));
67
+ });
68
+ test('should render with safe area when notch is on the right', async ({ page }) => {
69
+ const ionDidOpen = await page.spyOnEvent('ionDidOpen');
70
+ await page.evaluate(() => {
71
+ const style = document.querySelector('style');
72
+ style.innerHTML = `
73
+ :root {
74
+ --ion-safe-area-left: 10px !important;
75
+ --ion-safe-area-right: 50px !important;
76
+ }
77
+ `;
78
+ });
79
+ await page.click('#open-end');
80
+ await ionDidOpen.next();
81
+ const endMenu = page.locator('[menu-id="end-menu"]');
82
+ await expect(endMenu).toHaveClass(/show-menu/);
83
+ await expect(page).toHaveScreenshot(screenshot(`menu-end-safe-area-right-notch`));
84
+ });
85
+ });
86
+ });
87
+ });
@@ -66,4 +66,27 @@ configs({ directions: ['ltr'], modes: ['md'] }).forEach(({ title, screenshot, co
66
66
  await expect(list).toHaveScreenshot(screenshot(`radio-stacked-label-in-item`));
67
67
  });
68
68
  });
69
+ test.describe(title('radio: ionChange'), () => {
70
+ test('clicking padded space within item should click the radio', async ({ page }) => {
71
+ await page.setContent(`
72
+ <ion-radio-group>
73
+ <ion-item>
74
+ <ion-radio>
75
+ <ion-label>Enable Notifications</ion-label>
76
+ </ion-radio>
77
+ </ion-item>
78
+ </ion-radio-group>
79
+ `, config);
80
+ const itemNative = page.locator('.item-native');
81
+ const ionChange = await page.spyOnEvent('ionChange');
82
+ // Clicks the padded space within the item
83
+ await itemNative.click({
84
+ position: {
85
+ x: 5,
86
+ y: 5,
87
+ },
88
+ });
89
+ expect(ionChange).toHaveReceivedEvent();
90
+ });
91
+ });
69
92
  });
@@ -407,6 +407,10 @@
407
407
  margin-bottom: 0px;
408
408
  }
409
409
 
410
+ /**
411
+ * 24px was chosen so the knob and its
412
+ * shadow do not get cut off by the item.
413
+ */
410
414
  :host {
411
415
  --knob-border-radius: 50%;
412
416
  --knob-background: #ffffff;
@@ -428,6 +432,16 @@
428
432
  padding-bottom: 8px;
429
433
  }
430
434
 
435
+ :host(.range-item-start-adjustment) {
436
+ -webkit-padding-start: 24px;
437
+ padding-inline-start: 24px;
438
+ }
439
+
440
+ :host(.range-item-end-adjustment) {
441
+ -webkit-padding-end: 24px;
442
+ padding-inline-end: 24px;
443
+ }
444
+
431
445
  :host(.ion-color) .range-bar-active,
432
446
  :host(.ion-color) .range-tick-active {
433
447
  background: var(--ion-color-base);