@ionic/core 8.4.4-dev.11738618213.1e9f211b → 8.4.4-dev.11738772061.152d6e09

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 (271) hide show
  1. package/components/checkbox.js +6 -4
  2. package/components/index6.js +11 -3
  3. package/components/ion-select.js +6 -4
  4. package/components/ion-tab-button.js +1 -1
  5. package/components/ion-tab.js +6 -2
  6. package/components/ion-toggle.js +6 -4
  7. package/components/modal.js +259 -35
  8. package/components/ripple-effect.js +2 -4
  9. package/components/toolbar.js +2 -2
  10. package/css/core.css.map +1 -1
  11. package/css/ionic.bundle.css.map +1 -1
  12. package/dist/cjs/{data-21dc0f81.js → data-108e531d.js} +1 -1
  13. package/dist/cjs/{index-5b6a7459.js → index-0d762bba.js} +1 -1
  14. package/dist/cjs/{index-5915f9b3.js → index-2a46a047.js} +11 -3
  15. package/dist/cjs/{index-8e789962.js → index-3652c918.js} +1 -1
  16. package/dist/cjs/{index-f05acd21.js → index-e975c92b.js} +3 -3
  17. package/dist/cjs/index.cjs.js +6 -6
  18. package/dist/cjs/{input-shims-9e59ef62.js → input-shims-cd05268a.js} +4 -2
  19. package/dist/cjs/{input.utils-611cde0b.js → input.utils-ffb2f81b.js} +1 -1
  20. package/dist/cjs/ion-accordion_2.cjs.entry.js +1 -1
  21. package/dist/cjs/ion-action-sheet.cjs.entry.js +2 -2
  22. package/dist/cjs/ion-alert.cjs.entry.js +2 -2
  23. package/dist/cjs/ion-app_8.cjs.entry.js +7 -7
  24. package/dist/cjs/ion-button_2.cjs.entry.js +1 -1
  25. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -4
  26. package/dist/cjs/ion-datetime-button.cjs.entry.js +2 -2
  27. package/dist/cjs/ion-datetime_3.cjs.entry.js +3 -3
  28. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -2
  29. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +1 -1
  30. package/dist/cjs/ion-input.cjs.entry.js +2 -2
  31. package/dist/cjs/ion-item-option_3.cjs.entry.js +2 -2
  32. package/dist/cjs/ion-loading.cjs.entry.js +2 -2
  33. package/dist/cjs/ion-menu_3.cjs.entry.js +3 -3
  34. package/dist/cjs/ion-modal.cjs.entry.js +262 -39
  35. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  36. package/dist/cjs/ion-popover.cjs.entry.js +3 -3
  37. package/dist/cjs/ion-range.cjs.entry.js +2 -2
  38. package/dist/cjs/ion-refresher_2.cjs.entry.js +2 -2
  39. package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
  40. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -4
  41. package/dist/cjs/ion-select-modal.cjs.entry.js +2 -2
  42. package/dist/cjs/ion-select_3.cjs.entry.js +7 -6
  43. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +1 -1
  44. package/dist/cjs/ion-tab_2.cjs.entry.js +6 -2
  45. package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
  46. package/dist/cjs/ion-toast.cjs.entry.js +2 -2
  47. package/dist/cjs/ion-toggle.cjs.entry.js +5 -4
  48. package/dist/cjs/ionic.cjs.js +1 -1
  49. package/dist/cjs/{ios.transition-cf40433b.js → ios.transition-0e664e88.js} +2 -2
  50. package/dist/cjs/loader.cjs.js +1 -1
  51. package/dist/cjs/{md.transition-ededf99f.js → md.transition-2e8aef2c.js} +2 -2
  52. package/dist/cjs/{overlays-aa669eb8.js → overlays-65fdaff6.js} +1 -1
  53. package/dist/cjs/{status-tap-37681226.js → status-tap-d74f1429.js} +3 -2
  54. package/dist/collection/components/checkbox/checkbox.js +23 -4
  55. package/dist/collection/components/modal/animations/ios.enter.js +50 -4
  56. package/dist/collection/components/modal/animations/ios.leave.js +24 -2
  57. package/dist/collection/components/modal/animations/md.enter.js +52 -5
  58. package/dist/collection/components/modal/animations/md.leave.js +26 -3
  59. package/dist/collection/components/modal/animations/sheet.js +11 -2
  60. package/dist/collection/components/modal/gestures/sheet.js +79 -10
  61. package/dist/collection/components/modal/modal.ios.css +16 -0
  62. package/dist/collection/components/modal/modal.js +32 -7
  63. package/dist/collection/components/modal/modal.md.css +6 -0
  64. package/dist/collection/components/ripple-effect/ripple-effect.js +2 -4
  65. package/dist/collection/components/select/select.js +23 -4
  66. package/dist/collection/components/tab/tab.js +6 -2
  67. package/dist/collection/components/tab-button/tab-button.js +1 -1
  68. package/dist/collection/components/toggle/toggle.js +23 -4
  69. package/dist/collection/components/toolbar/toolbar.js +6 -2
  70. package/dist/collection/utils/logging/index.js +10 -3
  71. package/dist/docs.json +115 -2
  72. package/dist/esm/{data-ae11fd43.js → data-b3284b5e.js} +1 -1
  73. package/dist/esm/{index-3ad7f18b.js → index-2f7fde3d.js} +3 -3
  74. package/dist/esm/{index-9b0d46f4.js → index-6ad967f3.js} +11 -3
  75. package/dist/esm/{index-24b48b06.js → index-cb21eccb.js} +1 -1
  76. package/dist/esm/{index-5cc724f3.js → index-efb8ecdf.js} +1 -1
  77. package/dist/esm/index.js +6 -6
  78. package/dist/esm/{input-shims-0314bbe5.js → input-shims-2fd7c6ef.js} +4 -2
  79. package/dist/esm/{input.utils-09c71bc7.js → input.utils-961c9f17.js} +1 -1
  80. package/dist/esm/ion-accordion_2.entry.js +1 -1
  81. package/dist/esm/ion-action-sheet.entry.js +2 -2
  82. package/dist/esm/ion-alert.entry.js +2 -2
  83. package/dist/esm/ion-app_8.entry.js +7 -7
  84. package/dist/esm/ion-button_2.entry.js +1 -1
  85. package/dist/esm/ion-checkbox.entry.js +5 -4
  86. package/dist/esm/ion-datetime-button.entry.js +2 -2
  87. package/dist/esm/ion-datetime_3.entry.js +3 -3
  88. package/dist/esm/ion-infinite-scroll_2.entry.js +2 -2
  89. package/dist/esm/ion-input-password-toggle.entry.js +1 -1
  90. package/dist/esm/ion-input.entry.js +2 -2
  91. package/dist/esm/ion-item-option_3.entry.js +2 -2
  92. package/dist/esm/ion-loading.entry.js +2 -2
  93. package/dist/esm/ion-menu_3.entry.js +3 -3
  94. package/dist/esm/ion-modal.entry.js +262 -39
  95. package/dist/esm/ion-nav_2.entry.js +2 -2
  96. package/dist/esm/ion-popover.entry.js +3 -3
  97. package/dist/esm/ion-range.entry.js +2 -2
  98. package/dist/esm/ion-refresher_2.entry.js +2 -2
  99. package/dist/esm/ion-reorder_2.entry.js +2 -2
  100. package/dist/esm/ion-ripple-effect.entry.js +2 -4
  101. package/dist/esm/ion-select-modal.entry.js +2 -2
  102. package/dist/esm/ion-select_3.entry.js +7 -6
  103. package/dist/esm/ion-tab-bar_2.entry.js +1 -1
  104. package/dist/esm/ion-tab_2.entry.js +6 -2
  105. package/dist/esm/ion-textarea.entry.js +2 -2
  106. package/dist/esm/ion-toast.entry.js +2 -2
  107. package/dist/esm/ion-toggle.entry.js +5 -4
  108. package/dist/esm/ionic.js +1 -1
  109. package/dist/esm/{ios.transition-4ee1a3af.js → ios.transition-b1da3753.js} +2 -2
  110. package/dist/esm/loader.js +1 -1
  111. package/dist/esm/{md.transition-5106a0d2.js → md.transition-571b3859.js} +2 -2
  112. package/dist/esm/{overlays-e7b9d6d9.js → overlays-5deab4de.js} +1 -1
  113. package/dist/esm/{status-tap-f472b09f.js → status-tap-79eac0ac.js} +3 -2
  114. package/dist/esm-es5/{data-ae11fd43.js → data-b3284b5e.js} +1 -1
  115. package/dist/esm-es5/{index-3ad7f18b.js → index-2f7fde3d.js} +1 -1
  116. package/dist/esm-es5/index-6ad967f3.js +4 -0
  117. package/dist/esm-es5/{index-24b48b06.js → index-cb21eccb.js} +1 -1
  118. package/dist/esm-es5/{index-5cc724f3.js → index-efb8ecdf.js} +1 -1
  119. package/dist/esm-es5/index.js +1 -1
  120. package/dist/esm-es5/input-shims-2fd7c6ef.js +4 -0
  121. package/dist/esm-es5/{input.utils-09c71bc7.js → input.utils-961c9f17.js} +1 -1
  122. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  123. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  124. package/dist/esm-es5/ion-alert.entry.js +1 -1
  125. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  126. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  127. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  128. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  129. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  130. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  131. package/dist/esm-es5/ion-input-password-toggle.entry.js +1 -1
  132. package/dist/esm-es5/ion-input.entry.js +1 -1
  133. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  134. package/dist/esm-es5/ion-loading.entry.js +1 -1
  135. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  136. package/dist/esm-es5/ion-modal.entry.js +1 -1
  137. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  138. package/dist/esm-es5/ion-popover.entry.js +1 -1
  139. package/dist/esm-es5/ion-range.entry.js +1 -1
  140. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  141. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  142. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  143. package/dist/esm-es5/ion-select-modal.entry.js +1 -1
  144. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  145. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  146. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  147. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  148. package/dist/esm-es5/ion-toast.entry.js +1 -1
  149. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  150. package/dist/esm-es5/ionic.js +1 -1
  151. package/dist/esm-es5/{ios.transition-4ee1a3af.js → ios.transition-b1da3753.js} +1 -1
  152. package/dist/esm-es5/loader.js +1 -1
  153. package/dist/esm-es5/{md.transition-5106a0d2.js → md.transition-571b3859.js} +1 -1
  154. package/dist/esm-es5/{overlays-e7b9d6d9.js → overlays-5deab4de.js} +1 -1
  155. package/dist/esm-es5/status-tap-79eac0ac.js +4 -0
  156. package/dist/html.html-data.json +16 -0
  157. package/dist/ionic/index.esm.js +1 -1
  158. package/dist/ionic/ionic.esm.js +1 -1
  159. package/dist/ionic/p-017be83b.entry.js +4 -0
  160. package/dist/ionic/p-0430c2e0.entry.js +4 -0
  161. package/dist/ionic/{p-6499df44.system.entry.js → p-05b74e45.system.entry.js} +1 -1
  162. package/dist/ionic/{p-21e5e7e4.js → p-0af823e1.js} +1 -1
  163. package/dist/ionic/{p-0c06e09b.system.js → p-0eb35a7f.system.js} +1 -1
  164. package/dist/ionic/{p-797eeea8.system.entry.js → p-1199e388.system.entry.js} +1 -1
  165. package/dist/ionic/{p-c9f3a539.entry.js → p-120fb79a.entry.js} +1 -1
  166. package/dist/ionic/p-147e2d39.system.entry.js +4 -0
  167. package/dist/ionic/{p-e563a35c.entry.js → p-15d18206.entry.js} +1 -1
  168. package/dist/ionic/{p-d60342e3.js → p-1a5bc5f7.js} +1 -1
  169. package/dist/ionic/{p-96cc4814.js → p-1ab13b2b.js} +1 -1
  170. package/dist/ionic/{p-f1acf541.system.entry.js → p-2346ab53.system.entry.js} +1 -1
  171. package/dist/ionic/{p-37cb43bd.system.entry.js → p-248318e0.system.entry.js} +1 -1
  172. package/dist/ionic/{p-a882acef.system.entry.js → p-2507278c.system.entry.js} +1 -1
  173. package/dist/ionic/{p-e6635685.js → p-28706c6f.js} +1 -1
  174. package/dist/ionic/{p-6b280620.entry.js → p-2da9c8a7.entry.js} +1 -1
  175. package/dist/ionic/{p-b335ffed.system.entry.js → p-302b50bb.system.entry.js} +1 -1
  176. package/dist/ionic/p-322c5fb4.system.js +1 -1
  177. package/dist/ionic/{p-f687573e.system.js → p-343b6b1d.system.js} +1 -1
  178. package/dist/ionic/p-4c98e2cf.system.js +4 -0
  179. package/dist/ionic/p-577bc414.entry.js +4 -0
  180. package/dist/ionic/{p-66640ff7.system.entry.js → p-585b455c.system.entry.js} +1 -1
  181. package/dist/ionic/{p-c449820c.system.js → p-5c08627a.system.js} +1 -1
  182. package/dist/ionic/{p-9ee1e8a6.entry.js → p-5c9eb9af.entry.js} +1 -1
  183. package/dist/ionic/{p-9e33104d.entry.js → p-61db139d.entry.js} +1 -1
  184. package/dist/ionic/p-67222c16.system.js +4 -0
  185. package/dist/ionic/{p-32d44024.system.entry.js → p-6933c482.system.entry.js} +1 -1
  186. package/dist/ionic/p-6c95736e.entry.js +4 -0
  187. package/dist/ionic/p-6d32975a.entry.js +4 -0
  188. package/dist/ionic/{p-12a722b8.system.entry.js → p-6dfb0f39.system.entry.js} +1 -1
  189. package/dist/ionic/{p-bc36ad98.system.entry.js → p-744c8672.system.entry.js} +1 -1
  190. package/dist/ionic/{p-5823babc.system.entry.js → p-74e3f0af.system.entry.js} +2 -2
  191. package/dist/ionic/p-7513b0c4.js +4 -0
  192. package/dist/ionic/p-783411f1.entry.js +4 -0
  193. package/dist/ionic/{p-508d024a.entry.js → p-7a02f476.entry.js} +1 -1
  194. package/dist/ionic/{p-efaffe74.entry.js → p-7a6eaf9e.entry.js} +1 -1
  195. package/dist/ionic/{p-e7ed4a7f.system.js → p-7de1e42c.system.js} +1 -1
  196. package/dist/ionic/{p-2fc0dafe.entry.js → p-8694928f.entry.js} +1 -1
  197. package/dist/ionic/{p-da074ff7.entry.js → p-89bf08c7.entry.js} +1 -1
  198. package/dist/ionic/{p-69666e8a.system.entry.js → p-8ac07653.system.entry.js} +2 -2
  199. package/dist/ionic/{p-c29f8157.system.entry.js → p-8cfba7e9.system.entry.js} +1 -1
  200. package/dist/ionic/{p-a61cba41.entry.js → p-92763d3d.entry.js} +1 -1
  201. package/dist/ionic/{p-d18ab582.system.entry.js → p-933727f9.system.entry.js} +1 -1
  202. package/dist/ionic/{p-06e58c4e.js → p-9343a445.js} +1 -1
  203. package/dist/ionic/{p-45693d7e.entry.js → p-948e6c6a.entry.js} +1 -1
  204. package/dist/ionic/{p-2799c6d3.system.entry.js → p-9b122e3c.system.entry.js} +1 -1
  205. package/dist/ionic/{p-4439fc2a.entry.js → p-9b428d25.entry.js} +1 -1
  206. package/dist/ionic/{p-b2272f51.system.entry.js → p-9f364443.system.entry.js} +1 -1
  207. package/dist/ionic/{p-ca065903.system.entry.js → p-a090bce8.system.entry.js} +1 -1
  208. package/dist/ionic/{p-ddaa748a.system.entry.js → p-a0eb506c.system.entry.js} +1 -1
  209. package/dist/ionic/p-a3db8ee3.js +4 -0
  210. package/dist/ionic/{p-14e159ea.system.entry.js → p-a4a2420e.system.entry.js} +1 -1
  211. package/dist/ionic/{p-9ea607bd.system.js → p-a88dec0d.system.js} +2 -2
  212. package/dist/ionic/{p-942b5e13.entry.js → p-a8f2c254.entry.js} +1 -1
  213. package/dist/ionic/{p-a49378bb.system.entry.js → p-ab674093.system.entry.js} +1 -1
  214. package/dist/ionic/{p-0aa833fb.system.js → p-ada36597.system.js} +1 -1
  215. package/dist/ionic/{p-9fa07aec.entry.js → p-b1eb86fd.entry.js} +1 -1
  216. package/dist/ionic/{p-a4565eb5.system.js → p-b3c60433.system.js} +1 -1
  217. package/dist/ionic/{p-d6841eac.js → p-b6efeab8.js} +1 -1
  218. package/dist/ionic/{p-ebf042e0.system.entry.js → p-bdf2cb2e.system.entry.js} +1 -1
  219. package/dist/ionic/{p-f9a53abb.system.js → p-c4238c12.system.js} +1 -1
  220. package/dist/ionic/{p-b82d4cab.js → p-cb13696c.js} +1 -1
  221. package/dist/ionic/{p-1046866e.system.entry.js → p-cba1f9bc.system.entry.js} +1 -1
  222. package/dist/ionic/p-d1c5b60e.system.js +4 -0
  223. package/dist/ionic/{p-5da94421.system.js → p-d22e2a38.system.js} +1 -1
  224. package/dist/ionic/{p-2bd0ae94.system.entry.js → p-d6eaffb1.system.entry.js} +1 -1
  225. package/dist/ionic/p-d7dd8fb1.entry.js +4 -0
  226. package/dist/ionic/{p-19a5be0a.entry.js → p-e06057c9.entry.js} +1 -1
  227. package/dist/ionic/{p-1e010627.system.entry.js → p-e09d6392.system.entry.js} +2 -2
  228. package/dist/ionic/p-e3171ff3.entry.js +4 -0
  229. package/dist/ionic/p-e6376b93.system.entry.js +4 -0
  230. package/dist/ionic/{p-a43467d8.entry.js → p-e76dae93.entry.js} +1 -1
  231. package/dist/ionic/p-e8d56122.js +4 -0
  232. package/dist/ionic/{p-b79ba17c.entry.js → p-eef505e8.entry.js} +1 -1
  233. package/dist/ionic/{p-61e3f887.entry.js → p-f1060cd8.entry.js} +1 -1
  234. package/dist/ionic/{p-1fe02220.system.entry.js → p-f1120724.system.entry.js} +1 -1
  235. package/dist/ionic/{p-88e63c7d.js → p-f1c4dcd4.js} +1 -1
  236. package/dist/ionic/{p-982315a6.entry.js → p-f63c2d12.entry.js} +1 -1
  237. package/dist/ionic/{p-e4f69534.system.entry.js → p-fbd41a7e.system.entry.js} +1 -1
  238. package/dist/ionic/{p-19ec4f42.entry.js → p-fceec762.entry.js} +1 -1
  239. package/dist/types/components/checkbox/checkbox.d.ts +6 -0
  240. package/dist/types/components/modal/animations/sheet.d.ts +1 -0
  241. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  242. package/dist/types/components/modal/modal-interface.d.ts +1 -0
  243. package/dist/types/components/modal/modal.d.ts +11 -0
  244. package/dist/types/components/select/select.d.ts +6 -0
  245. package/dist/types/components/toggle/toggle.d.ts +6 -0
  246. package/dist/types/components/toolbar/toolbar.d.ts +4 -0
  247. package/dist/types/components.d.ts +32 -0
  248. package/dist/types/utils/config.d.ts +9 -0
  249. package/dist/types/utils/logging/index.d.ts +13 -1
  250. package/hydrate/index.js +301 -59
  251. package/hydrate/index.mjs +301 -59
  252. package/package.json +1 -1
  253. package/dist/esm-es5/index-9b0d46f4.js +0 -4
  254. package/dist/esm-es5/input-shims-0314bbe5.js +0 -4
  255. package/dist/esm-es5/status-tap-f472b09f.js +0 -4
  256. package/dist/ionic/p-0303d0f8.js +0 -4
  257. package/dist/ionic/p-06fee233.js +0 -4
  258. package/dist/ionic/p-17474161.system.js +0 -4
  259. package/dist/ionic/p-1d8761e6.entry.js +0 -4
  260. package/dist/ionic/p-2172893e.system.entry.js +0 -4
  261. package/dist/ionic/p-2690b1de.js +0 -4
  262. package/dist/ionic/p-2b9b78c7.entry.js +0 -4
  263. package/dist/ionic/p-4ec778aa.entry.js +0 -4
  264. package/dist/ionic/p-5ab1b709.entry.js +0 -4
  265. package/dist/ionic/p-8b8be2fd.entry.js +0 -4
  266. package/dist/ionic/p-908d6080.entry.js +0 -4
  267. package/dist/ionic/p-98ff6b32.entry.js +0 -4
  268. package/dist/ionic/p-dfb78785.system.js +0 -4
  269. package/dist/ionic/p-e85d901b.system.entry.js +0 -4
  270. package/dist/ionic/p-eba29931.entry.js +0 -4
  271. package/dist/ionic/p-ff4b7e40.system.js +0 -4
package/hydrate/index.mjs CHANGED
@@ -3213,9 +3213,12 @@ let accordionIds = 0;
3213
3213
  * @param message - The string message to be logged to the console.
3214
3214
  */
3215
3215
  const printIonWarning = (message, ...params) => {
3216
- return console.warn(`[Ionic Warning]: ${message}`, ...params);
3216
+ const logLevel = config.get('logLevel', "WARN" /* LogLevel.WARN */);
3217
+ if (["WARN" /* LogLevel.WARN */].includes(logLevel)) {
3218
+ return console.warn(`[Ionic Warning]: ${message}`, ...params);
3219
+ }
3217
3220
  };
3218
- /*
3221
+ /**
3219
3222
  * Logs an error to the console with an Ionic prefix
3220
3223
  * to indicate the library that is warning the developer.
3221
3224
  *
@@ -3223,7 +3226,10 @@ const printIonWarning = (message, ...params) => {
3223
3226
  * @param params - Additional arguments to supply to the console.error.
3224
3227
  */
3225
3228
  const printIonError = (message, ...params) => {
3226
- return console.error(`[Ionic Error]: ${message}`, ...params);
3229
+ const logLevel = config.get('logLevel', "ERROR" /* LogLevel.ERROR */);
3230
+ if (["ERROR" /* LogLevel.ERROR */, "WARN" /* LogLevel.WARN */].includes(logLevel)) {
3231
+ return console.error(`[Ionic Error]: ${message}`, ...params);
3232
+ }
3227
3233
  };
3228
3234
  /**
3229
3235
  * Prints an error informing developers that an implementation requires an element to be used
@@ -8487,6 +8493,7 @@ class Checkbox {
8487
8493
  this.labelPlacement = 'start';
8488
8494
  this.justify = undefined;
8489
8495
  this.alignment = undefined;
8496
+ this.required = false;
8490
8497
  }
8491
8498
  componentWillLoad() {
8492
8499
  this.inheritedAttributes = Object.assign({}, inheritAriaAttributes(this.el));
@@ -8498,11 +8505,11 @@ class Checkbox {
8498
8505
  }
8499
8506
  }
8500
8507
  render() {
8501
- const { color, checked, disabled, el, getSVGPath, indeterminate, inheritedAttributes, inputId, justify, labelPlacement, name, value, alignment, } = this;
8508
+ const { color, checked, disabled, el, getSVGPath, indeterminate, inheritedAttributes, inputId, justify, labelPlacement, name, value, alignment, required, } = this;
8502
8509
  const mode = getIonMode$1(this);
8503
8510
  const path = getSVGPath(mode, indeterminate);
8504
8511
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
8505
- return (hAsync(Host, { key: '6dc787e1100521d08c4900104e1a3e2f594e919f', "aria-checked": indeterminate ? 'mixed' : `${checked}`, class: createColorClasses$1(color, {
8512
+ return (hAsync(Host, { key: '07a5884062dd256b570e856270c74a5a09d2f2a5', "aria-checked": indeterminate ? 'mixed' : `${checked}`, class: createColorClasses$1(color, {
8506
8513
  [mode]: true,
8507
8514
  'in-item': hostContext('ion-item', el),
8508
8515
  'checkbox-checked': checked,
@@ -8512,10 +8519,10 @@ class Checkbox {
8512
8519
  [`checkbox-justify-${justify}`]: justify !== undefined,
8513
8520
  [`checkbox-alignment-${alignment}`]: alignment !== undefined,
8514
8521
  [`checkbox-label-placement-${labelPlacement}`]: true,
8515
- }), onClick: this.onClick }, hAsync("label", { key: '68222fb736a5ec3f2e488649b0e2ce0417dcb224', class: "checkbox-wrapper" }, hAsync("input", Object.assign({ key: 'f12962d7e9b19c744cfdbdeccc67ae7f5d080281', 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)), hAsync("div", { key: 'c72df2699414b1e5a41a1bc267bc634f0c93dcff', class: {
8522
+ }), onClick: this.onClick }, hAsync("label", { key: '3439d546e8b60187421db698eab63a0bdd31c973', class: "checkbox-wrapper" }, hAsync("input", Object.assign({ key: '9f45cf7dbdedcf01ec132c11e16979adb1aa102f', type: "checkbox", checked: checked ? true : undefined, disabled: disabled, id: inputId, onChange: this.toggleChecked, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl), required: required }, inheritedAttributes)), hAsync("div", { key: '4e882f98939cc4b7c7ab7459c751d3f4bb2023fe', class: {
8516
8523
  'label-text-wrapper': true,
8517
8524
  'label-text-wrapper-hidden': el.textContent === '',
8518
- }, part: "label" }, hAsync("slot", { key: 'a2a80285178a7e0e3b536fc9ca26b8b444aa4307' })), hAsync("div", { key: 'c2b05e0d1fe8df5dcd72858220b5ff51ecaee4cc', class: "native-wrapper" }, hAsync("svg", { key: 'ee24913fded72258ebd9713654a6dba92a18fcf7', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
8525
+ }, part: "label" }, hAsync("slot", { key: '0abda81297a086d02c4a56af75005547971dfcfe' })), hAsync("div", { key: '36489ea3f48a7d0ec46b77c243f9f253ef5c2b3b', class: "native-wrapper" }, hAsync("svg", { key: '4c53b52f5e93752672a34eb6f180b75fa9af9046', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
8519
8526
  }
8520
8527
  getSVGPath(mode, indeterminate) {
8521
8528
  let path = indeterminate ? (hAsync("path", { d: "M6 12L18 12", part: "mark" })) : (hAsync("path", { d: "M5.9,12.5l3.8,3.8l8.8-8.8", part: "mark" }));
@@ -8542,6 +8549,7 @@ class Checkbox {
8542
8549
  "labelPlacement": [1, "label-placement"],
8543
8550
  "justify": [1],
8544
8551
  "alignment": [1],
8552
+ "required": [4],
8545
8553
  "setFocus": [64]
8546
8554
  },
8547
8555
  "$listeners$": undefined,
@@ -19017,7 +19025,7 @@ const computeDuration = (remaining, velocity) => {
19017
19025
  };
19018
19026
 
19019
19027
  const createSheetEnterAnimation = (opts) => {
19020
- const { currentBreakpoint, backdropBreakpoint } = opts;
19028
+ const { currentBreakpoint, backdropBreakpoint, expandToScroll } = opts;
19021
19029
  /**
19022
19030
  * If the backdropBreakpoint is undefined, then the backdrop
19023
19031
  * should always fade in. If the backdropBreakpoint came before the
@@ -19037,7 +19045,16 @@ const createSheetEnterAnimation = (opts) => {
19037
19045
  { offset: 0, opacity: 1, transform: 'translateY(100%)' },
19038
19046
  { offset: 1, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
19039
19047
  ]);
19040
- return { wrapperAnimation, backdropAnimation };
19048
+ /**
19049
+ * This allows the content to be scrollable at any breakpoint.
19050
+ */
19051
+ const contentAnimation = !expandToScroll
19052
+ ? createAnimation('contentAnimation').keyframes([
19053
+ { offset: 0, opacity: 1, maxHeight: `${(1 - currentBreakpoint) * 100}%` },
19054
+ { offset: 1, opacity: 1, maxHeight: `${currentBreakpoint * 100}%` },
19055
+ ])
19056
+ : undefined;
19057
+ return { wrapperAnimation, backdropAnimation, contentAnimation };
19041
19058
  };
19042
19059
  const createSheetLeaveAnimation = (opts) => {
19043
19060
  const { currentBreakpoint, backdropBreakpoint } = opts;
@@ -19072,22 +19089,68 @@ const createEnterAnimation$1 = () => {
19072
19089
  })
19073
19090
  .afterClearStyles(['pointer-events']);
19074
19091
  const wrapperAnimation = createAnimation().fromTo('transform', 'translateY(100vh)', 'translateY(0vh)');
19075
- return { backdropAnimation, wrapperAnimation };
19092
+ return { backdropAnimation, wrapperAnimation, contentAnimation: undefined };
19076
19093
  };
19077
19094
  /**
19078
19095
  * iOS Modal Enter Animation for the Card presentation style
19079
19096
  */
19080
19097
  const iosEnterAnimation$3 = (baseEl, opts) => {
19081
- const { presentingEl, currentBreakpoint } = opts;
19098
+ const { presentingEl, currentBreakpoint, expandToScroll } = opts;
19082
19099
  const root = getElementRoot(baseEl);
19083
- const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation$1();
19100
+ const { wrapperAnimation, backdropAnimation, contentAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation$1();
19084
19101
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
19085
19102
  wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
19103
+ // The content animation is only added if scrolling is enabled for
19104
+ // all the breakpoints.
19105
+ !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
19086
19106
  const baseAnimation = createAnimation('entering-base')
19087
19107
  .addElement(baseEl)
19088
19108
  .easing('cubic-bezier(0.32,0.72,0,1)')
19089
19109
  .duration(500)
19090
- .addAnimation(wrapperAnimation);
19110
+ .addAnimation([wrapperAnimation])
19111
+ .beforeAddWrite(() => {
19112
+ if (expandToScroll) {
19113
+ // Scroll can only be done when the modal is fully expanded.
19114
+ return;
19115
+ }
19116
+ /**
19117
+ * There are some browsers that causes flickering when
19118
+ * dragging the content when scroll is enabled at every
19119
+ * breakpoint. This is due to the wrapper element being
19120
+ * transformed off the screen and having a snap animation.
19121
+ *
19122
+ * A workaround is to clone the footer element and append
19123
+ * it outside of the wrapper element. This way, the footer
19124
+ * is still visible and the drag can be done without
19125
+ * flickering. The original footer is hidden until the modal
19126
+ * is dismissed. This maintains the animation of the footer
19127
+ * when the modal is dismissed.
19128
+ *
19129
+ * The workaround needs to be done before the animation starts
19130
+ * so there are no flickering issues.
19131
+ */
19132
+ const ionFooter = baseEl.querySelector('ion-footer');
19133
+ /**
19134
+ * This check is needed to prevent more than one footer
19135
+ * from being appended to the shadow root.
19136
+ * Otherwise, iOS and MD enter animations would append
19137
+ * the footer twice.
19138
+ */
19139
+ const ionFooterAlreadyAppended = baseEl.shadowRoot.querySelector('ion-footer');
19140
+ if (ionFooter && !ionFooterAlreadyAppended) {
19141
+ const footerHeight = ionFooter.clientHeight;
19142
+ const clonedFooter = ionFooter.cloneNode(true);
19143
+ baseEl.shadowRoot.appendChild(clonedFooter);
19144
+ ionFooter.style.setProperty('display', 'none');
19145
+ ionFooter.setAttribute('aria-hidden', 'true');
19146
+ // Padding is added to prevent some content from being hidden.
19147
+ const page = baseEl.querySelector('.ion-page');
19148
+ page.style.setProperty('padding-bottom', `${footerHeight}px`);
19149
+ }
19150
+ });
19151
+ if (contentAnimation) {
19152
+ baseAnimation.addAnimation(contentAnimation);
19153
+ }
19091
19154
  if (presentingEl) {
19092
19155
  const isMobile = window.innerWidth < 768;
19093
19156
  const hasCardModal = presentingEl.tagName === 'ION-MODAL' && presentingEl.presentingElement !== undefined;
@@ -19165,7 +19228,7 @@ const createLeaveAnimation$1 = () => {
19165
19228
  * iOS Modal Leave Animation
19166
19229
  */
19167
19230
  const iosLeaveAnimation$3 = (baseEl, opts, duration = 500) => {
19168
- const { presentingEl, currentBreakpoint } = opts;
19231
+ const { presentingEl, currentBreakpoint, expandToScroll } = opts;
19169
19232
  const root = getElementRoot(baseEl);
19170
19233
  const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetLeaveAnimation(opts) : createLeaveAnimation$1();
19171
19234
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
@@ -19174,7 +19237,29 @@ const iosLeaveAnimation$3 = (baseEl, opts, duration = 500) => {
19174
19237
  .addElement(baseEl)
19175
19238
  .easing('cubic-bezier(0.32,0.72,0,1)')
19176
19239
  .duration(duration)
19177
- .addAnimation(wrapperAnimation);
19240
+ .addAnimation(wrapperAnimation)
19241
+ .beforeAddWrite(() => {
19242
+ if (expandToScroll) {
19243
+ // Scroll can only be done when the modal is fully expanded.
19244
+ return;
19245
+ }
19246
+ /**
19247
+ * If expandToScroll is disabled, we need to swap
19248
+ * the visibility to the original, so the footer
19249
+ * dismisses with the modal and doesn't stay
19250
+ * until the modal is removed from the DOM.
19251
+ */
19252
+ const ionFooter = baseEl.querySelector('ion-footer');
19253
+ if (ionFooter) {
19254
+ const clonedFooter = baseEl.shadowRoot.querySelector('ion-footer');
19255
+ ionFooter.style.removeProperty('display');
19256
+ ionFooter.removeAttribute('aria-hidden');
19257
+ clonedFooter.style.setProperty('display', 'none');
19258
+ clonedFooter.setAttribute('aria-hidden', 'true');
19259
+ const page = baseEl.querySelector('.ion-page');
19260
+ page.style.removeProperty('padding-bottom');
19261
+ }
19262
+ });
19178
19263
  if (presentingEl) {
19179
19264
  const isMobile = window.innerWidth < 768;
19180
19265
  const hasCardModal = presentingEl.tagName === 'ION-MODAL' && presentingEl.presentingElement !== undefined;
@@ -19252,22 +19337,69 @@ const createEnterAnimation = () => {
19252
19337
  { offset: 0, opacity: 0.01, transform: 'translateY(40px)' },
19253
19338
  { offset: 1, opacity: 1, transform: `translateY(0px)` },
19254
19339
  ]);
19255
- return { backdropAnimation, wrapperAnimation };
19340
+ return { backdropAnimation, wrapperAnimation, contentAnimation: undefined };
19256
19341
  };
19257
19342
  /**
19258
19343
  * Md Modal Enter Animation
19259
19344
  */
19260
19345
  const mdEnterAnimation$2 = (baseEl, opts) => {
19261
- const { currentBreakpoint } = opts;
19346
+ const { currentBreakpoint, expandToScroll } = opts;
19262
19347
  const root = getElementRoot(baseEl);
19263
- const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation();
19348
+ const { wrapperAnimation, backdropAnimation, contentAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation();
19264
19349
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
19265
19350
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
19266
- return createAnimation()
19351
+ // The content animation is only added if scrolling is enabled for
19352
+ // all the breakpoints.
19353
+ expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
19354
+ const baseAnimation = createAnimation()
19267
19355
  .addElement(baseEl)
19268
19356
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
19269
19357
  .duration(280)
19270
- .addAnimation([backdropAnimation, wrapperAnimation]);
19358
+ .addAnimation([backdropAnimation, wrapperAnimation])
19359
+ .beforeAddWrite(() => {
19360
+ if (expandToScroll) {
19361
+ // Scroll can only be done when the modal is fully expanded.
19362
+ return;
19363
+ }
19364
+ /**
19365
+ * There are some browsers that causes flickering when
19366
+ * dragging the content when scroll is enabled at every
19367
+ * breakpoint. This is due to the wrapper element being
19368
+ * transformed off the screen and having a snap animation.
19369
+ *
19370
+ * A workaround is to clone the footer element and append
19371
+ * it outside of the wrapper element. This way, the footer
19372
+ * is still visible and the drag can be done without
19373
+ * flickering. The original footer is hidden until the modal
19374
+ * is dismissed. This maintains the animation of the footer
19375
+ * when the modal is dismissed.
19376
+ *
19377
+ * The workaround needs to be done before the animation starts
19378
+ * so there are no flickering issues.
19379
+ */
19380
+ const ionFooter = baseEl.querySelector('ion-footer');
19381
+ /**
19382
+ * This check is needed to prevent more than one footer
19383
+ * from being appended to the shadow root.
19384
+ * Otherwise, iOS and MD enter animations would append
19385
+ * the footer twice.
19386
+ */
19387
+ const ionFooterAlreadyAppended = baseEl.shadowRoot.querySelector('ion-footer');
19388
+ if (ionFooter && !ionFooterAlreadyAppended) {
19389
+ const footerHeight = ionFooter.clientHeight;
19390
+ const clonedFooter = ionFooter.cloneNode(true);
19391
+ baseEl.shadowRoot.appendChild(clonedFooter);
19392
+ ionFooter.style.setProperty('display', 'none');
19393
+ ionFooter.setAttribute('aria-hidden', 'true');
19394
+ // Padding is added to prevent some content from being hidden.
19395
+ const page = baseEl.querySelector('.ion-page');
19396
+ page.style.setProperty('padding-bottom', `${footerHeight}px`);
19397
+ }
19398
+ });
19399
+ if (contentAnimation) {
19400
+ baseAnimation.addAnimation(contentAnimation);
19401
+ }
19402
+ return baseAnimation;
19271
19403
  };
19272
19404
 
19273
19405
  const createLeaveAnimation = () => {
@@ -19282,18 +19414,41 @@ const createLeaveAnimation = () => {
19282
19414
  * Md Modal Leave Animation
19283
19415
  */
19284
19416
  const mdLeaveAnimation$2 = (baseEl, opts) => {
19285
- const { currentBreakpoint } = opts;
19417
+ const { currentBreakpoint, expandToScroll } = opts;
19286
19418
  const root = getElementRoot(baseEl);
19287
19419
  const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetLeaveAnimation(opts) : createLeaveAnimation();
19288
19420
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
19289
19421
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
19290
- return createAnimation()
19422
+ const baseAnimation = createAnimation()
19291
19423
  .easing('cubic-bezier(0.47,0,0.745,0.715)')
19292
19424
  .duration(200)
19293
- .addAnimation([backdropAnimation, wrapperAnimation]);
19425
+ .addAnimation([backdropAnimation, wrapperAnimation])
19426
+ .beforeAddWrite(() => {
19427
+ if (expandToScroll) {
19428
+ // Scroll can only be done when the modal is fully expanded.
19429
+ return;
19430
+ }
19431
+ /**
19432
+ * If expandToScroll is disabled, we need to swap
19433
+ * the visibility to the original, so the footer
19434
+ * dismisses with the modal and doesn't stay
19435
+ * until the modal is removed from the DOM.
19436
+ */
19437
+ const ionFooter = baseEl.querySelector('ion-footer');
19438
+ if (ionFooter) {
19439
+ const clonedFooter = baseEl.shadowRoot.querySelector('ion-footer');
19440
+ ionFooter.style.removeProperty('display');
19441
+ ionFooter.removeAttribute('aria-hidden');
19442
+ clonedFooter.style.setProperty('display', 'none');
19443
+ clonedFooter.setAttribute('aria-hidden', 'true');
19444
+ const page = baseEl.querySelector('.ion-page');
19445
+ page.style.removeProperty('padding-bottom');
19446
+ }
19447
+ });
19448
+ return baseAnimation;
19294
19449
  };
19295
19450
 
19296
- const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
19451
+ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
19297
19452
  // Defaults for the sheet swipe animation
19298
19453
  const defaultBackdrop = [
19299
19454
  { offset: 0, opacity: 'var(--backdrop-opacity)' },
@@ -19310,6 +19465,10 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19310
19465
  { offset: 1, transform: 'translateY(100%)' },
19311
19466
  ],
19312
19467
  BACKDROP_KEYFRAMES: backdropBreakpoint !== 0 ? customBackdrop : defaultBackdrop,
19468
+ CONTENT_KEYFRAMES: [
19469
+ { offset: 0, maxHeight: '100%' },
19470
+ { offset: 1, maxHeight: '0%' },
19471
+ ],
19313
19472
  };
19314
19473
  const contentEl = baseEl.querySelector('ion-content');
19315
19474
  const height = wrapperEl.clientHeight;
@@ -19317,10 +19476,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19317
19476
  let offset = 0;
19318
19477
  let canDismissBlocksGesture = false;
19319
19478
  const canDismissMaxStep = 0.95;
19320
- const wrapperAnimation = animation.childAnimations.find((ani) => ani.id === 'wrapperAnimation');
19321
- const backdropAnimation = animation.childAnimations.find((ani) => ani.id === 'backdropAnimation');
19322
19479
  const maxBreakpoint = breakpoints[breakpoints.length - 1];
19323
19480
  const minBreakpoint = breakpoints[0];
19481
+ const wrapperAnimation = animation.childAnimations.find((ani) => ani.id === 'wrapperAnimation');
19482
+ const backdropAnimation = animation.childAnimations.find((ani) => ani.id === 'backdropAnimation');
19483
+ const contentAnimation = animation.childAnimations.find((ani) => ani.id === 'contentAnimation');
19324
19484
  const enableBackdrop = () => {
19325
19485
  baseEl.style.setProperty('pointer-events', 'auto');
19326
19486
  backdropEl.style.setProperty('pointer-events', 'auto');
@@ -19343,6 +19503,31 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19343
19503
  */
19344
19504
  baseEl.classList.add(FOCUS_TRAP_DISABLE_CLASS);
19345
19505
  };
19506
+ /**
19507
+ * Toggles the visible modal footer when `expandToScroll` is disabled.
19508
+ * @param footer The footer to show.
19509
+ */
19510
+ const swapFooterVisibility = (footer) => {
19511
+ const originalFooter = baseEl.querySelector('ion-footer');
19512
+ if (!originalFooter) {
19513
+ return;
19514
+ }
19515
+ const clonedFooter = wrapperEl.nextElementSibling;
19516
+ const footerToHide = footer === 'original' ? clonedFooter : originalFooter;
19517
+ const footerToShow = footer === 'original' ? originalFooter : clonedFooter;
19518
+ footerToShow.style.removeProperty('display');
19519
+ footerToShow.removeAttribute('aria-hidden');
19520
+ const page = baseEl.querySelector('.ion-page');
19521
+ if (footer === 'original') {
19522
+ page.style.removeProperty('padding-bottom');
19523
+ }
19524
+ else {
19525
+ const pagePadding = footerToShow.clientHeight;
19526
+ page.style.setProperty('padding-bottom', `${pagePadding}px`);
19527
+ }
19528
+ footerToHide.style.setProperty('display', 'none');
19529
+ footerToHide.setAttribute('aria-hidden', 'true');
19530
+ };
19346
19531
  /**
19347
19532
  * After the entering animation completes,
19348
19533
  * we need to set the animation to go from
@@ -19354,6 +19539,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19354
19539
  if (wrapperAnimation && backdropAnimation) {
19355
19540
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
19356
19541
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
19542
+ contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
19357
19543
  animation.progressStart(true, 1 - currentBreakpoint);
19358
19544
  /**
19359
19545
  * If backdrop is not enabled, then content
@@ -19370,7 +19556,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19370
19556
  disableBackdrop();
19371
19557
  }
19372
19558
  }
19373
- if (contentEl && currentBreakpoint !== maxBreakpoint) {
19559
+ if (contentEl && currentBreakpoint !== maxBreakpoint && expandToScroll) {
19374
19560
  contentEl.scrollY = false;
19375
19561
  }
19376
19562
  const canStart = (detail) => {
@@ -19384,6 +19570,13 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19384
19570
  */
19385
19571
  const contentEl = findClosestIonContent(detail.event.target);
19386
19572
  currentBreakpoint = getCurrentBreakpoint();
19573
+ /**
19574
+ * If we have expandToScroll disabled, we should not allow the swipe gesture to start
19575
+ * if the content is being swiped.
19576
+ */
19577
+ if (!expandToScroll && contentEl) {
19578
+ return false;
19579
+ }
19387
19580
  if (currentBreakpoint === 1 && contentEl) {
19388
19581
  /**
19389
19582
  * The modal should never swipe to close on the content with a refresher.
@@ -19414,6 +19607,15 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19414
19607
  * Remove undefined check
19415
19608
  */
19416
19609
  canDismissBlocksGesture = baseEl.canDismiss !== undefined && baseEl.canDismiss !== true && minBreakpoint === 0;
19610
+ /**
19611
+ * If expandToScroll is disabled, we need to swap
19612
+ * the footer visibility to the original, so if the modal
19613
+ * is dismissed, the footer dismisses with the modal
19614
+ * and doesn't stay on the screen after the modal is gone.
19615
+ */
19616
+ if (!expandToScroll) {
19617
+ swapFooterVisibility('original');
19618
+ }
19417
19619
  /**
19418
19620
  * If we are pulling down, then it is possible we are pulling on the content.
19419
19621
  * We do not want scrolling to happen at the same time as the gesture.
@@ -19529,6 +19731,19 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19529
19731
  opacity: `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(snapToBreakpoint, backdropBreakpoint)})`,
19530
19732
  },
19531
19733
  ]);
19734
+ if (contentAnimation) {
19735
+ /**
19736
+ * The modal content should scroll at any breakpoint when expandToScroll
19737
+ * is disabled. In order to do this, the content needs to be completely
19738
+ * viewable so scrolling can access everything. Otherwise, the default
19739
+ * behavior would show the content off the screen and only allow
19740
+ * scrolling when the sheet is fully expanded.
19741
+ */
19742
+ contentAnimation.keyframes([
19743
+ { offset: 0, maxHeight: `${(1 - breakpointOffset) * 100}%` },
19744
+ { offset: 1, maxHeight: `${snapToBreakpoint * 100}%` },
19745
+ ]);
19746
+ }
19532
19747
  animation.progressStep(0);
19533
19748
  }
19534
19749
  /**
@@ -19536,6 +19751,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19536
19751
  * snapping animation completes.
19537
19752
  */
19538
19753
  gesture.enable(false);
19754
+ /**
19755
+ * If expandToScroll is disabled, we need to swap
19756
+ * the footer visibility to the cloned one so the footer
19757
+ * doesn't flicker when the sheet's height is animated.
19758
+ */
19759
+ if (!expandToScroll && shouldRemainOpen) {
19760
+ swapFooterVisibility('cloned');
19761
+ }
19539
19762
  if (shouldPreventDismiss) {
19540
19763
  handleCanDismiss(baseEl, animation);
19541
19764
  }
@@ -19543,13 +19766,13 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19543
19766
  onDismiss();
19544
19767
  }
19545
19768
  /**
19546
- * If the sheet is going to be fully expanded then we should enable
19547
- * scrolling immediately. The sheet modal animation takes ~500ms to finish
19548
- * so if we wait until then there is a visible delay for when scrolling is
19549
- * re-enabled. Native iOS allows for scrolling on the sheet modal as soon
19550
- * as the gesture is released, so we align with that.
19769
+ * Enables scrolling immediately if the sheet is about to fully expand
19770
+ * or if it allows scrolling at any breakpoint. Without this, there would
19771
+ * be a ~500ms delay while the modal animation completes, causing a
19772
+ * noticeable lag. Native iOS allows scrolling as soon as the gesture is
19773
+ * released, so we align with that behavior.
19551
19774
  */
19552
- if (contentEl && snapToBreakpoint === breakpoints[breakpoints.length - 1]) {
19775
+ if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
19553
19776
  contentEl.scrollY = true;
19554
19777
  }
19555
19778
  return new Promise((resolve) => {
@@ -19567,6 +19790,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19567
19790
  raf(() => {
19568
19791
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
19569
19792
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
19793
+ contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
19570
19794
  animation.progressStart(true, 1 - snapToBreakpoint);
19571
19795
  currentBreakpoint = snapToBreakpoint;
19572
19796
  onBreakpointChange(currentBreakpoint);
@@ -19619,10 +19843,10 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
19619
19843
  };
19620
19844
  };
19621
19845
 
19622
- const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}";
19846
+ const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer ion-toolbar:first-of-type{padding-top:6px}";
19623
19847
  var IonModalIosStyle0 = modalIosCss;
19624
19848
 
19625
- const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
19849
+ const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
19626
19850
  var IonModalMdStyle0 = modalMdCss;
19627
19851
 
19628
19852
  // TODO(FW-2832): types
@@ -19701,6 +19925,7 @@ class Modal {
19701
19925
  this.enterAnimation = undefined;
19702
19926
  this.leaveAnimation = undefined;
19703
19927
  this.breakpoints = undefined;
19928
+ this.expandToScroll = true;
19704
19929
  this.initialBreakpoint = undefined;
19705
19930
  this.backdropBreakpoint = 0;
19706
19931
  this.handle = undefined;
@@ -19916,6 +20141,7 @@ class Modal {
19916
20141
  presentingEl: presentingElement,
19917
20142
  currentBreakpoint: this.initialBreakpoint,
19918
20143
  backdropBreakpoint: this.backdropBreakpoint,
20144
+ expandToScroll: this.expandToScroll,
19919
20145
  });
19920
20146
  /* tslint:disable-next-line */
19921
20147
  if (typeof window !== 'undefined') {
@@ -19966,7 +20192,10 @@ class Modal {
19966
20192
  // should be in the DOM and referenced by now, except
19967
20193
  // for the presenting el
19968
20194
  const animationBuilder = this.leaveAnimation || config.get('modalLeave', iosLeaveAnimation$3);
19969
- const ani = (this.animation = animationBuilder(el, { presentingEl: this.presentingElement }));
20195
+ const ani = (this.animation = animationBuilder(el, {
20196
+ presentingEl: this.presentingElement,
20197
+ expandToScroll: this.expandToScroll,
20198
+ }));
19970
20199
  const contentEl = findIonContent(el);
19971
20200
  if (!contentEl) {
19972
20201
  printIonContentErrorMsg(el);
@@ -20011,9 +20240,10 @@ class Modal {
20011
20240
  presentingEl: this.presentingElement,
20012
20241
  currentBreakpoint: initialBreakpoint,
20013
20242
  backdropBreakpoint,
20243
+ expandToScroll: this.expandToScroll,
20014
20244
  }));
20015
20245
  ani.progressStart(true, 1);
20016
- const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, () => { var _a; return (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : 0; }, () => this.sheetOnDismiss(), (breakpoint) => {
20246
+ const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => { var _a; return (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : 0; }, () => this.sheetOnDismiss(), (breakpoint) => {
20017
20247
  if (this.currentBreakpoint !== breakpoint) {
20018
20248
  this.currentBreakpoint = breakpoint;
20019
20249
  this.ionBreakpointDidChange.emit({ breakpoint });
@@ -20091,6 +20321,7 @@ class Modal {
20091
20321
  presentingEl: presentingElement,
20092
20322
  currentBreakpoint: (_a = this.currentBreakpoint) !== null && _a !== void 0 ? _a : this.initialBreakpoint,
20093
20323
  backdropBreakpoint: this.backdropBreakpoint,
20324
+ expandToScroll: this.expandToScroll,
20094
20325
  });
20095
20326
  if (dismissed) {
20096
20327
  const { delegate } = this.getDelegate();
@@ -20176,23 +20407,23 @@ class Modal {
20176
20407
  return true;
20177
20408
  }
20178
20409
  render() {
20179
- const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap } = this;
20410
+ const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
20180
20411
  const showHandle = handle !== false && isSheetModal;
20181
20412
  const mode = getIonMode$1(this);
20182
20413
  const isCardModal = presentingElement !== undefined && mode === 'ios';
20183
20414
  const isHandleCycle = handleBehavior === 'cycle';
20184
- return (hAsync(Host, Object.assign({ key: 'b4da5111fe4719fa450c39b2d4bd884a302a7924', "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
20415
+ return (hAsync(Host, Object.assign({ key: 'ff15df63e72caaeb0a4ad68e9eedeaaa7d3f3bde', "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
20185
20416
  zIndex: `${20000 + this.overlayIndex}`,
20186
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle }), hAsync("ion-backdrop", { key: 'c12dbf747e0eb914eaf1331798548ffc7e147763', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: 'da546ee80c6576b5acc66e959fd5009e0b9a8160', class: "modal-shadow" }), hAsync("div", Object.assign({ key: '306ebe6427440ad5f7ed36d590e562d15a503b75',
20417
+ }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle }), hAsync("ion-backdrop", { key: '27a73655779af9d175a829d3d2d29e42fd2a63ee', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: '406a65080087e7895026ecc2f04e9d707439e86f', class: "modal-shadow" }), hAsync("div", Object.assign({ key: '8e410eb925374158996c82cbbd522f07d741679e',
20187
20418
  /*
20188
20419
  role and aria-modal must be used on the
20189
20420
  same element. They must also be set inside the
20190
20421
  shadow DOM otherwise ion-button will not be highlighted
20191
20422
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
20192
20423
  */
20193
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: 'c5d17e346fe255a7c0cacbbf15c0083f2d09c488', class: "modal-handle",
20424
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: '7326c969ebe5a70a35e83b09d3db2bb848c90e47', class: "modal-handle",
20194
20425
  // Prevents the handle from receiving keyboard focus when it does not cycle
20195
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle" })), hAsync("slot", { key: '5cc714170a00b67f3eda0cd1d6f37c1489a99c83' }))));
20426
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle" })), hAsync("slot", { key: '0b65cdb9e337a27edf437b9e754e79f1449c217d' }))));
20196
20427
  }
20197
20428
  get el() { return getElement(this); }
20198
20429
  static get watchers() { return {
@@ -20214,6 +20445,7 @@ class Modal {
20214
20445
  "enterAnimation": [16],
20215
20446
  "leaveAnimation": [16],
20216
20447
  "breakpoints": [16],
20448
+ "expandToScroll": [4, "expand-to-scroll"],
20217
20449
  "initialBreakpoint": [2, "initial-breakpoint"],
20218
20450
  "backdropBreakpoint": [2, "backdrop-breakpoint"],
20219
20451
  "handle": [4],
@@ -27086,12 +27318,10 @@ class RippleEffect {
27086
27318
  }; }
27087
27319
  }
27088
27320
  const removeRipple = (ripple) => {
27089
- if (!ripple.parentNode)
27090
- return;
27091
27321
  ripple.classList.add('fade-out');
27092
- ripple.addEventListener('transitionend', () => {
27322
+ setTimeout(() => {
27093
27323
  ripple.remove();
27094
- }, { once: true });
27324
+ }, 200);
27095
27325
  };
27096
27326
  const PADDING = 10;
27097
27327
  const INITIAL_ORIGIN_SCALE = 0.5;
@@ -29659,6 +29889,7 @@ class Select {
29659
29889
  this.expandedIcon = undefined;
29660
29890
  this.shape = undefined;
29661
29891
  this.value = undefined;
29892
+ this.required = false;
29662
29893
  }
29663
29894
  styleChanged() {
29664
29895
  this.emitStyle();
@@ -30143,8 +30374,8 @@ class Select {
30143
30374
  return renderedLabel;
30144
30375
  }
30145
30376
  renderListbox() {
30146
- const { disabled, inputId, isExpanded } = this;
30147
- return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
30377
+ const { disabled, inputId, isExpanded, required } = this;
30378
+ return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
30148
30379
  }
30149
30380
  render() {
30150
30381
  const { disabled, el, isExpanded, expandedIcon, labelPlacement, justify, placeholder, fill, shape, name, value } = this;
@@ -30175,7 +30406,7 @@ class Select {
30175
30406
  * TODO(FW-5592): Remove hasStartEndSlots condition
30176
30407
  */
30177
30408
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
30178
- return (hAsync(Host, { key: '144dfa5c49549a74fe516c65b9b8104a477ac789', onClick: this.onClick, class: createColorClasses$1(this.color, {
30409
+ return (hAsync(Host, { key: '491cf1b0e3aa31e7c9cfad3e87d83eb54272312a', onClick: this.onClick, class: createColorClasses$1(this.color, {
30179
30410
  [mode]: true,
30180
30411
  'in-item': inItem,
30181
30412
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -30191,7 +30422,7 @@ class Select {
30191
30422
  [`select-justify-${justify}`]: justifyEnabled,
30192
30423
  [`select-shape-${shape}`]: shape !== undefined,
30193
30424
  [`select-label-placement-${labelPlacement}`]: true,
30194
- }) }, hAsync("label", { key: '0edcfcbac575a9dccc77991531b6980d1caebf42', class: "select-wrapper", id: "select-label" }, this.renderLabelContainer(), hAsync("div", { key: '348151d90cb093f5d21c7d4a834264ac4a312c40', class: "select-wrapper-inner" }, hAsync("slot", { key: '8b7708c7f81217435c58276da0c08bba766d9500', name: "start" }), hAsync("div", { key: '10c520a335da0a0d1cf40f9365597beb244d3b48', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), hAsync("slot", { key: '0f15c40a5495e98e29d2a21ba21e0bc6f1c0125a', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && hAsync("div", { key: 'c87faad2e5ebf7f9453397d7ede43abd64d21294', class: "select-highlight" }))));
30425
+ }) }, hAsync("label", { key: '07bf3cb57bd1121383d8c746e3ac49da38300082', class: "select-wrapper", id: "select-label" }, this.renderLabelContainer(), hAsync("div", { key: '884facd18342797576bbacc761d18d83c52762e3', class: "select-wrapper-inner" }, hAsync("slot", { key: 'c4f2a2a7a76f52db15f9a0b806017caea443c47a', name: "start" }), hAsync("div", { key: '235cf383f268cc74412722cd31e246cbd4c2abe5', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), hAsync("slot", { key: '1481302e11c494d49dfd80a7aaf743f7e851558f', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && hAsync("div", { key: '8a45ea9280651695c8e5435f266c286f3e3f6a18', class: "select-highlight" }))));
30195
30426
  }
30196
30427
  get el() { return getElement(this); }
30197
30428
  static get watchers() { return {
@@ -30227,6 +30458,7 @@ class Select {
30227
30458
  "expandedIcon": [1, "expanded-icon"],
30228
30459
  "shape": [1],
30229
30460
  "value": [1032],
30461
+ "required": [4],
30230
30462
  "isExpanded": [32],
30231
30463
  "open": [64]
30232
30464
  },
@@ -30766,6 +30998,10 @@ class Tab {
30766
30998
  }
30767
30999
  changeActive(isActive) {
30768
31000
  if (isActive) {
31001
+ // ensure tabindex gets updated before setting focus to the element
31002
+ setTimeout(() => {
31003
+ this.el.focus();
31004
+ }, 50);
30769
31005
  this.prepareLazyLoaded();
30770
31006
  }
30771
31007
  }
@@ -30783,10 +31019,10 @@ class Tab {
30783
31019
  }
30784
31020
  render() {
30785
31021
  const { tab, active, component } = this;
30786
- return (hAsync(Host, { key: 'cb75d0877979b3b8df8f7e1952bfa9677da1eaa5', role: "tabpanel", "aria-hidden": !active ? 'true' : null, "aria-labelledby": `tab-button-${tab}`, class: {
31022
+ return (hAsync(Host, { key: '30783785d1c744b8a186f0bda7cd21af2742c575', role: "tabpanel", "aria-hidden": !active ? 'true' : null, "aria-labelledby": `tab-button-${tab}`, class: {
30787
31023
  'ion-page': component === undefined,
30788
31024
  'tab-hidden': !active,
30789
- } }, hAsync("slot", { key: '37fbb7b7a6b03eb93b1dacd2dc1025b78eb2aa6b' })));
31025
+ }, tabIndex: !active ? '-1' : '0' }, hAsync("slot", { key: '4fde7aa68c3149eae4bc3a5045303f31bf818b0b' })));
30790
31026
  }
30791
31027
  get el() { return getElement(this); }
30792
31028
  static get watchers() { return {
@@ -30978,7 +31214,7 @@ class TabButton {
30978
31214
  'ion-activatable': true,
30979
31215
  'ion-selectable': true,
30980
31216
  'ion-focusable': true,
30981
- } }, hAsync("a", Object.assign({ key: '1db09d861b67ff292018fb4b0dc7b85bd4677eb8' }, attrs, { class: "button-native", part: "native", role: "tab", "aria-selected": selected ? 'true' : null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? '-1' : undefined }, inheritedAttributes), hAsync("span", { key: '4381eafcb27e8c7bb0d86d4f115ceb0caf03b9b4', class: "button-inner" }, hAsync("slot", { key: '1981135f6fbb88376c1bd923c55c70fe8b5c5159' })), mode === 'md' && hAsync("ion-ripple-effect", { key: '0509bc7155d055d1ed710600e9cf4df135881491', type: "unbounded" }))));
31217
+ } }, hAsync("a", Object.assign({ key: '2f32e70232c7872b14e9ead1d1c31c98ad3577b4' }, attrs, { class: "button-native", part: "native", role: "tab", "aria-selected": selected ? 'true' : null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? '-1' : '0' }, inheritedAttributes), hAsync("span", { key: '5c9467b16e36a526a20f460980ec45022f464c3a', class: "button-inner" }, hAsync("slot", { key: 'eefd60fac84ff01366a0f82f6ad71782ee7351e9' })), mode === 'md' && hAsync("ion-ripple-effect", { key: '0d3452ae46e47f2d50c0198668c42e00e1a4d7bf', type: "unbounded" }))));
30982
31218
  }
30983
31219
  get el() { return getElement(this); }
30984
31220
  static get style() { return {
@@ -32623,6 +32859,7 @@ class Toggle {
32623
32859
  this.labelPlacement = 'start';
32624
32860
  this.justify = undefined;
32625
32861
  this.alignment = undefined;
32862
+ this.required = false;
32626
32863
  }
32627
32864
  disabledChanged() {
32628
32865
  if (this.gesture) {
@@ -32704,12 +32941,12 @@ class Toggle {
32704
32941
  return this.el.textContent !== '';
32705
32942
  }
32706
32943
  render() {
32707
- const { activated, color, checked, disabled, el, justify, labelPlacement, inputId, name, alignment } = this;
32944
+ const { activated, color, checked, disabled, el, justify, labelPlacement, inputId, name, alignment, required } = this;
32708
32945
  const mode = getIonMode$1(this);
32709
32946
  const value = this.getValue();
32710
32947
  const rtl = isRTL$1(el) ? 'rtl' : 'ltr';
32711
32948
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
32712
- return (hAsync(Host, { key: 'f52195ec3bc14c024647cb41319c32a4cd330e19', onClick: this.onClick, class: createColorClasses$1(color, {
32949
+ return (hAsync(Host, { key: 'ed75573caa6e37011f1453dd7f723fb9bd8a3656', onClick: this.onClick, class: createColorClasses$1(color, {
32713
32950
  [mode]: true,
32714
32951
  'in-item': hostContext('ion-item', el),
32715
32952
  'toggle-activated': activated,
@@ -32719,10 +32956,10 @@ class Toggle {
32719
32956
  [`toggle-alignment-${alignment}`]: alignment !== undefined,
32720
32957
  [`toggle-label-placement-${labelPlacement}`]: true,
32721
32958
  [`toggle-${rtl}`]: true,
32722
- }) }, hAsync("label", { key: 'f8b3a215ad85b2cee611ad63449b584e1640f27f', class: "toggle-wrapper" }, hAsync("input", Object.assign({ key: 'f387b1ea840737a9737917e516834c887be99c09', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl) }, this.inheritedAttributes)), hAsync("div", { key: '936af880db59fe377cd2de9101eb28a1c4fb8914', class: {
32959
+ }) }, hAsync("label", { key: '484860e2a33f4d123904edb96159f0e1972d3add', class: "toggle-wrapper" }, hAsync("input", Object.assign({ key: '360b53080aacfd99a9ff60ffb5219816bd4163ee', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl), required: required }, this.inheritedAttributes)), hAsync("div", { key: 'f7239fa668fe11257239ea30cf0198e4f3274f6b', class: {
32723
32960
  'label-text-wrapper': true,
32724
32961
  'label-text-wrapper-hidden': !this.hasLabel,
32725
- }, part: "label" }, hAsync("slot", { key: '80a6672e2e792c15011a9496dcd75363cdba31c6' })), hAsync("div", { key: '2b2b318b38ab27b194c0dab4cecd77d9d780f2ca', class: "native-wrapper" }, this.renderToggleControl()))));
32962
+ }, part: "label" }, hAsync("slot", { key: '9495a4a39889822ee68e0d89dc5a2f863d1feb3c' })), hAsync("div", { key: '55f1eb08c4b705e94fbcf02220bbe1d292f06155', class: "native-wrapper" }, this.renderToggleControl()))));
32726
32963
  }
32727
32964
  get el() { return getElement(this); }
32728
32965
  static get watchers() { return {
@@ -32745,6 +32982,7 @@ class Toggle {
32745
32982
  "labelPlacement": [1, "label-placement"],
32746
32983
  "justify": [1],
32747
32984
  "alignment": [1],
32985
+ "required": [4],
32748
32986
  "activated": [32]
32749
32987
  },
32750
32988
  "$listeners$": undefined,
@@ -32776,6 +33014,10 @@ var IonToolbarMdStyle0 = toolbarMdCss;
32776
33014
  * @slot secondary - Content is placed to the left of the toolbar text in `ios` mode, and directly to the right in `md` mode.
32777
33015
  * @slot primary - Content is placed to the right of the toolbar text in `ios` mode, and to the far right in `md` mode.
32778
33016
  * @slot end - Content is placed to the right of the toolbar text in LTR, and to the left in RTL.
33017
+ *
33018
+ * @part background - The background of the toolbar, covering the entire area behind the toolbar content.
33019
+ * @part container - The container that wraps all toolbar content, including the default slot and named slot content.
33020
+ * @part content - The container for the default slot, wrapping content provided without a named slot.
32779
33021
  */
32780
33022
  class Toolbar {
32781
33023
  constructor(hostRef) {
@@ -32826,10 +33068,10 @@ class Toolbar {
32826
33068
  this.childrenStyles.forEach((value) => {
32827
33069
  Object.assign(childStyles, value);
32828
33070
  });
32829
- return (hAsync(Host, { key: '462538a5ecd01baf3cde116c9f029aeda26c81be', class: Object.assign(Object.assign({}, childStyles), createColorClasses$1(this.color, {
33071
+ return (hAsync(Host, { key: '4fdc9ae82a93237cc28ceb95b0ebd8069b62839d', class: Object.assign(Object.assign({}, childStyles), createColorClasses$1(this.color, {
32830
33072
  [mode]: true,
32831
33073
  'in-toolbar': hostContext('ion-toolbar', this.el),
32832
- })) }, hAsync("div", { key: 'c0b4415d3b2472de643a9be7cb3b13b3b628621b', class: "toolbar-background" }), hAsync("div", { key: '0ccb8a2dbeaa28d8f9bed87629c0c097446690c2', class: "toolbar-container" }, hAsync("slot", { key: '3e726dac359e923df21d80301651f16063a3de20', name: "start" }), hAsync("slot", { key: 'cd799330b56a7f8833bc61bb2807aafb21846f71', name: "secondary" }), hAsync("div", { key: '395282e6ac8c53576922dcdb5f08c25d34638c86', class: "toolbar-content" }, hAsync("slot", { key: 'a437c60e4ba5aae65e55169ae82a6f379868ec1d' })), hAsync("slot", { key: '711af9b9d321a7b31ede924c9bdcad767aa9a1ca', name: "primary" }), hAsync("slot", { key: 'ecc02edeaf80a837890bcb08d5096df1e22a0b9a', name: "end" }))));
33074
+ })) }, hAsync("div", { key: '443a216362bbbf1c149ed12140d52b0f0ea2d664', class: "toolbar-background", part: "background" }), hAsync("div", { key: '1df87f4027d605e42757a13d4828df45b90a4fdc', class: "toolbar-container", part: "container" }, hAsync("slot", { key: 'f66f34972be8e3f4915b9c6f5808600dbaedb1ea', name: "start" }), hAsync("slot", { key: '14f38b0975e956f404c4eb3ee56f2055c6615276', name: "secondary" }), hAsync("div", { key: '75ba5953a25c7544793484d2b245792cb0a5af75', class: "toolbar-content", part: "content" }, hAsync("slot", { key: '149dfa58ff7106f318fecb4134e7c69edf8bc231' })), hAsync("slot", { key: '807ab9ad21d7f1d9d427a4086460bcb9e5e8c019', name: "primary" }), hAsync("slot", { key: 'bd2f9da95d2fa8e74dc6e0666587ceecbba99d9f', name: "end" }))));
32833
33075
  }
32834
33076
  get el() { return getElement(this); }
32835
33077
  static get style() { return {