@ionic/core 8.4.4-dev.11741294920.1c3e822a → 8.4.4-dev.11741298262.12200f27

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 (449) hide show
  1. package/components/alert.js +4 -30
  2. package/components/checkbox.js +6 -4
  3. package/components/helpers.js +1 -7
  4. package/components/index6.js +11 -3
  5. package/components/index9.js +1 -1
  6. package/components/ion-input.js +2 -2
  7. package/components/ion-range.js +1 -5
  8. package/components/ion-router.js +1 -1
  9. package/components/ion-segment-button.js +1 -1
  10. package/components/ion-select.js +6 -4
  11. package/components/ion-textarea.js +2 -2
  12. package/components/ion-toggle.js +40 -6
  13. package/components/ionic-global.js +1 -2
  14. package/components/modal.js +259 -35
  15. package/components/toolbar.js +2 -2
  16. package/css/core.css.map +1 -1
  17. package/css/ionic.bundle.css.map +1 -1
  18. package/dist/cjs/{app-globals-4283fe37.js → app-globals-21afee77.js} +1 -1
  19. package/dist/cjs/{data-21dc0f81.js → data-108e531d.js} +1 -1
  20. package/dist/cjs/{framework-delegate-c4f2ba04.js → framework-delegate-05579976.js} +1 -1
  21. package/dist/cjs/{hardware-back-button-f2cbbdce.js → hardware-back-button-9e8a2c4f.js} +1 -1
  22. package/dist/cjs/{helpers-b14a0f09.js → helpers-4be3f90d.js} +0 -7
  23. package/dist/cjs/{index-1248dbd7.js → index-0ff61d0b.js} +4 -4
  24. package/dist/cjs/{index-4e37257d.js → index-26bb7e42.js} +5 -5
  25. package/dist/cjs/{index-5915f9b3.js → index-2a46a047.js} +11 -3
  26. package/dist/cjs/{index-a4a74252.js → index-6770fc00.js} +2 -2
  27. package/dist/cjs/{index-786364c7.js → index-ad7a712e.js} +1 -1
  28. package/dist/cjs/index.cjs.js +10 -10
  29. package/dist/cjs/{input-shims-b4c0eee7.js → input-shims-fd997b01.js} +5 -3
  30. package/dist/cjs/{input.utils-4af208ab.js → input.utils-c15a1814.js} +2 -2
  31. package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
  32. package/dist/cjs/ion-action-sheet.cjs.entry.js +6 -6
  33. package/dist/cjs/ion-alert.cjs.entry.js +10 -36
  34. package/dist/cjs/ion-app_8.cjs.entry.js +14 -14
  35. package/dist/cjs/ion-avatar_3.cjs.entry.js +1 -1
  36. package/dist/cjs/ion-back-button.cjs.entry.js +2 -2
  37. package/dist/cjs/ion-backdrop.cjs.entry.js +1 -1
  38. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
  39. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  40. package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
  41. package/dist/cjs/ion-checkbox.cjs.entry.js +7 -6
  42. package/dist/cjs/ion-chip.cjs.entry.js +1 -1
  43. package/dist/cjs/ion-col_3.cjs.entry.js +1 -1
  44. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  45. package/dist/cjs/ion-datetime_3.cjs.entry.js +7 -7
  46. package/dist/cjs/ion-fab_3.cjs.entry.js +2 -2
  47. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  48. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +4 -4
  49. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
  50. package/dist/cjs/ion-input.cjs.entry.js +7 -7
  51. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  52. package/dist/cjs/ion-item_8.cjs.entry.js +2 -2
  53. package/dist/cjs/ion-loading.cjs.entry.js +6 -6
  54. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  55. package/dist/cjs/ion-modal.cjs.entry.js +266 -43
  56. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
  57. package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
  58. package/dist/cjs/ion-picker-column.cjs.entry.js +2 -2
  59. package/dist/cjs/ion-picker.cjs.entry.js +1 -1
  60. package/dist/cjs/ion-popover.cjs.entry.js +7 -7
  61. package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
  62. package/dist/cjs/ion-radio_2.cjs.entry.js +2 -2
  63. package/dist/cjs/ion-range.cjs.entry.js +4 -8
  64. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  65. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  66. package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
  67. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  68. package/dist/cjs/ion-searchbar.cjs.entry.js +2 -2
  69. package/dist/cjs/ion-segment_2.cjs.entry.js +2 -2
  70. package/dist/cjs/ion-select-modal.cjs.entry.js +6 -6
  71. package/dist/cjs/ion-select_3.cjs.entry.js +12 -11
  72. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  73. package/dist/cjs/ion-split-pane.cjs.entry.js +1 -1
  74. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +2 -2
  75. package/dist/cjs/ion-tab_2.cjs.entry.js +2 -2
  76. package/dist/cjs/ion-text.cjs.entry.js +1 -1
  77. package/dist/cjs/ion-textarea.cjs.entry.js +7 -7
  78. package/dist/cjs/ion-toast.cjs.entry.js +6 -6
  79. package/dist/cjs/ion-toggle.cjs.entry.js +39 -8
  80. package/dist/cjs/{ionic-global-96da1b2e.js → ionic-global-d9a8bb5b.js} +1 -2
  81. package/dist/cjs/ionic.cjs.js +3 -3
  82. package/dist/cjs/{ios.transition-8d363d77.js → ios.transition-a4f35c55.js} +4 -4
  83. package/dist/cjs/loader.cjs.js +3 -3
  84. package/dist/cjs/{md.transition-57d695fa.js → md.transition-cdf904e6.js} +4 -4
  85. package/dist/cjs/{notch-controller-bd07748b.js → notch-controller-a0c464d1.js} +1 -1
  86. package/dist/cjs/{overlays-27703a30.js → overlays-86695cf1.js} +5 -5
  87. package/dist/cjs/{status-tap-654077ee.js → status-tap-1a2485c1.js} +4 -3
  88. package/dist/cjs/{swipe-back-b70cd52e.js → swipe-back-47a52b83.js} +1 -1
  89. package/dist/collection/components/alert/alert.js +4 -34
  90. package/dist/collection/components/checkbox/checkbox.js +23 -4
  91. package/dist/collection/components/input/input.ios.css +3 -2
  92. package/dist/collection/components/input/input.md.css +7 -2
  93. package/dist/collection/components/modal/animations/ios.enter.js +50 -4
  94. package/dist/collection/components/modal/animations/ios.leave.js +24 -2
  95. package/dist/collection/components/modal/animations/md.enter.js +52 -5
  96. package/dist/collection/components/modal/animations/md.leave.js +26 -3
  97. package/dist/collection/components/modal/animations/sheet.js +11 -2
  98. package/dist/collection/components/modal/gestures/sheet.js +79 -10
  99. package/dist/collection/components/modal/modal.ios.css +16 -0
  100. package/dist/collection/components/modal/modal.js +32 -7
  101. package/dist/collection/components/modal/modal.md.css +6 -0
  102. package/dist/collection/components/select/select.js +23 -4
  103. package/dist/collection/components/textarea/textarea.ios.css +3 -2
  104. package/dist/collection/components/textarea/textarea.md.css +7 -2
  105. package/dist/collection/components/toggle/toggle.ios.css +52 -15
  106. package/dist/collection/components/toggle/toggle.js +90 -4
  107. package/dist/collection/components/toggle/toggle.md.css +52 -15
  108. package/dist/collection/components/toolbar/toolbar.js +6 -2
  109. package/dist/collection/utils/floating-point/index.js +0 -5
  110. package/dist/collection/utils/helpers.js +0 -6
  111. package/dist/collection/utils/logging/index.js +10 -3
  112. package/dist/collection/utils/platform.js +1 -2
  113. package/dist/collection/utils/test/platform.utils.js +1 -1
  114. package/dist/docs.json +187 -6
  115. package/dist/esm/{app-globals-c10a1137.js → app-globals-5dbb61a5.js} +1 -1
  116. package/dist/esm/{data-ae11fd43.js → data-b3284b5e.js} +1 -1
  117. package/dist/esm/{framework-delegate-42bc40b1.js → framework-delegate-f683816e.js} +1 -1
  118. package/dist/esm/{hardware-back-button-44195e92.js → hardware-back-button-06ef3c3e.js} +1 -1
  119. package/dist/esm/{helpers-13b816c6.js → helpers-9b49d7d2.js} +1 -7
  120. package/dist/esm/{index-28c8fd64.js → index-5a0f5fd0.js} +1 -1
  121. package/dist/esm/{index-4b39521b.js → index-6a5baab0.js} +5 -5
  122. package/dist/esm/{index-9b0d46f4.js → index-6ad967f3.js} +11 -3
  123. package/dist/esm/{index-6b548278.js → index-7105cd59.js} +4 -4
  124. package/dist/esm/{index-edf58462.js → index-dd0f7395.js} +2 -2
  125. package/dist/esm/index.js +10 -10
  126. package/dist/esm/{input-shims-5e5e47e8.js → input-shims-dff819a9.js} +5 -3
  127. package/dist/esm/{input.utils-d3717b00.js → input.utils-2f1029cf.js} +2 -2
  128. package/dist/esm/ion-accordion_2.entry.js +3 -3
  129. package/dist/esm/ion-action-sheet.entry.js +6 -6
  130. package/dist/esm/ion-alert.entry.js +10 -36
  131. package/dist/esm/ion-app_8.entry.js +14 -14
  132. package/dist/esm/ion-avatar_3.entry.js +1 -1
  133. package/dist/esm/ion-back-button.entry.js +2 -2
  134. package/dist/esm/ion-backdrop.entry.js +1 -1
  135. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  136. package/dist/esm/ion-button_2.entry.js +3 -3
  137. package/dist/esm/ion-card_5.entry.js +2 -2
  138. package/dist/esm/ion-checkbox.entry.js +7 -6
  139. package/dist/esm/ion-chip.entry.js +1 -1
  140. package/dist/esm/ion-col_3.entry.js +1 -1
  141. package/dist/esm/ion-datetime-button.entry.js +4 -4
  142. package/dist/esm/ion-datetime_3.entry.js +7 -7
  143. package/dist/esm/ion-fab_3.entry.js +2 -2
  144. package/dist/esm/ion-img.entry.js +2 -2
  145. package/dist/esm/ion-infinite-scroll_2.entry.js +4 -4
  146. package/dist/esm/ion-input-password-toggle.entry.js +2 -2
  147. package/dist/esm/ion-input.entry.js +7 -7
  148. package/dist/esm/ion-item-option_3.entry.js +4 -4
  149. package/dist/esm/ion-item_8.entry.js +2 -2
  150. package/dist/esm/ion-loading.entry.js +6 -6
  151. package/dist/esm/ion-menu_3.entry.js +7 -7
  152. package/dist/esm/ion-modal.entry.js +266 -43
  153. package/dist/esm/ion-nav_2.entry.js +6 -6
  154. package/dist/esm/ion-picker-column-option.entry.js +2 -2
  155. package/dist/esm/ion-picker-column.entry.js +2 -2
  156. package/dist/esm/ion-picker.entry.js +1 -1
  157. package/dist/esm/ion-popover.entry.js +7 -7
  158. package/dist/esm/ion-progress-bar.entry.js +2 -2
  159. package/dist/esm/ion-radio_2.entry.js +2 -2
  160. package/dist/esm/ion-range.entry.js +4 -8
  161. package/dist/esm/ion-refresher_2.entry.js +4 -4
  162. package/dist/esm/ion-reorder_2.entry.js +4 -4
  163. package/dist/esm/ion-ripple-effect.entry.js +1 -1
  164. package/dist/esm/ion-route_4.entry.js +2 -2
  165. package/dist/esm/ion-searchbar.entry.js +2 -2
  166. package/dist/esm/ion-segment_2.entry.js +2 -2
  167. package/dist/esm/ion-select-modal.entry.js +6 -6
  168. package/dist/esm/ion-select_3.entry.js +12 -11
  169. package/dist/esm/ion-spinner.entry.js +1 -1
  170. package/dist/esm/ion-split-pane.entry.js +1 -1
  171. package/dist/esm/ion-tab-bar_2.entry.js +2 -2
  172. package/dist/esm/ion-tab_2.entry.js +2 -2
  173. package/dist/esm/ion-text.entry.js +1 -1
  174. package/dist/esm/ion-textarea.entry.js +7 -7
  175. package/dist/esm/ion-toast.entry.js +6 -6
  176. package/dist/esm/ion-toggle.entry.js +39 -8
  177. package/dist/esm/{ionic-global-bf78a847.js → ionic-global-c81d82ab.js} +1 -2
  178. package/dist/esm/ionic.js +3 -3
  179. package/dist/esm/{ios.transition-e7a4de4f.js → ios.transition-314468a2.js} +4 -4
  180. package/dist/esm/loader.js +3 -3
  181. package/dist/esm/{md.transition-290d8802.js → md.transition-a560e0e2.js} +4 -4
  182. package/dist/esm/{notch-controller-bb8f3a48.js → notch-controller-3dc61260.js} +1 -1
  183. package/dist/esm/{overlays-4ff6e618.js → overlays-9a81f230.js} +5 -5
  184. package/dist/esm/{status-tap-ba401484.js → status-tap-d07dbc82.js} +4 -3
  185. package/dist/esm/{swipe-back-a258b011.js → swipe-back-23ee7ab1.js} +1 -1
  186. package/dist/esm-es5/app-globals-5dbb61a5.js +4 -0
  187. package/dist/esm-es5/{data-ae11fd43.js → data-b3284b5e.js} +1 -1
  188. package/dist/esm-es5/{framework-delegate-42bc40b1.js → framework-delegate-f683816e.js} +1 -1
  189. package/dist/esm-es5/{hardware-back-button-44195e92.js → hardware-back-button-06ef3c3e.js} +1 -1
  190. package/dist/esm-es5/{helpers-13b816c6.js → helpers-9b49d7d2.js} +1 -1
  191. package/dist/esm-es5/{index-28c8fd64.js → index-5a0f5fd0.js} +1 -1
  192. package/dist/esm-es5/{index-4b39521b.js → index-6a5baab0.js} +1 -1
  193. package/dist/esm-es5/index-6ad967f3.js +4 -0
  194. package/dist/esm-es5/{index-6b548278.js → index-7105cd59.js} +1 -1
  195. package/dist/esm-es5/{index-edf58462.js → index-dd0f7395.js} +1 -1
  196. package/dist/esm-es5/index.js +1 -1
  197. package/dist/esm-es5/input-shims-dff819a9.js +4 -0
  198. package/dist/esm-es5/{input.utils-d3717b00.js → input.utils-2f1029cf.js} +1 -1
  199. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  200. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  201. package/dist/esm-es5/ion-alert.entry.js +1 -1
  202. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  203. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  204. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  205. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  206. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  207. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  208. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  209. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  210. package/dist/esm-es5/ion-chip.entry.js +1 -1
  211. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  212. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  213. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  214. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  215. package/dist/esm-es5/ion-img.entry.js +1 -1
  216. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  217. package/dist/esm-es5/ion-input-password-toggle.entry.js +1 -1
  218. package/dist/esm-es5/ion-input.entry.js +1 -1
  219. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  220. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  221. package/dist/esm-es5/ion-loading.entry.js +1 -1
  222. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  223. package/dist/esm-es5/ion-modal.entry.js +1 -1
  224. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  225. package/dist/esm-es5/ion-picker-column-option.entry.js +1 -1
  226. package/dist/esm-es5/ion-picker-column.entry.js +1 -1
  227. package/dist/esm-es5/ion-picker.entry.js +1 -1
  228. package/dist/esm-es5/ion-popover.entry.js +1 -1
  229. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  230. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  231. package/dist/esm-es5/ion-range.entry.js +1 -1
  232. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  233. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  234. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  235. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  236. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  237. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  238. package/dist/esm-es5/ion-select-modal.entry.js +1 -1
  239. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  240. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  241. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  242. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  243. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  244. package/dist/esm-es5/ion-text.entry.js +1 -1
  245. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  246. package/dist/esm-es5/ion-toast.entry.js +1 -1
  247. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  248. package/dist/esm-es5/{ionic-global-bf78a847.js → ionic-global-c81d82ab.js} +1 -1
  249. package/dist/esm-es5/ionic.js +1 -1
  250. package/dist/esm-es5/{ios.transition-e7a4de4f.js → ios.transition-314468a2.js} +1 -1
  251. package/dist/esm-es5/loader.js +1 -1
  252. package/dist/esm-es5/md.transition-a560e0e2.js +4 -0
  253. package/dist/esm-es5/{notch-controller-bb8f3a48.js → notch-controller-3dc61260.js} +1 -1
  254. package/dist/esm-es5/{overlays-4ff6e618.js → overlays-9a81f230.js} +1 -1
  255. package/dist/esm-es5/status-tap-d07dbc82.js +4 -0
  256. package/dist/esm-es5/{swipe-back-a258b011.js → swipe-back-23ee7ab1.js} +1 -1
  257. package/dist/html.html-data.json +24 -0
  258. package/dist/ionic/index.esm.js +1 -1
  259. package/dist/ionic/ionic.esm.js +1 -1
  260. package/dist/ionic/ionic.js +1 -1
  261. package/dist/ionic/{p-37a21d70.entry.js → p-02e23f26.entry.js} +1 -1
  262. package/dist/ionic/{p-cc991f05.entry.js → p-037fc3f3.entry.js} +1 -1
  263. package/dist/ionic/p-04e08129.entry.js +4 -0
  264. package/dist/ionic/p-0574e87e.js +4 -0
  265. package/dist/ionic/{p-64bb1da1.system.js → p-058e61eb.system.js} +1 -1
  266. package/dist/ionic/{p-4a98a017.system.entry.js → p-0eb2553a.system.entry.js} +1 -1
  267. package/dist/ionic/p-0f5d878e.system.entry.js +4 -0
  268. package/dist/ionic/{p-bc148b43.system.entry.js → p-10327ad2.system.entry.js} +1 -1
  269. package/dist/ionic/{p-5e9733d0.entry.js → p-155c2bb0.entry.js} +1 -1
  270. package/dist/ionic/p-155f4d90.entry.js +4 -0
  271. package/dist/ionic/p-16bfb979.system.entry.js +4 -0
  272. package/dist/ionic/{p-7a9407cc.system.entry.js → p-18e101b7.system.entry.js} +2 -2
  273. package/dist/ionic/{p-d60342e3.js → p-1a5bc5f7.js} +1 -1
  274. package/dist/ionic/p-1f405274.js +4 -0
  275. package/dist/ionic/p-21227121.js +4 -0
  276. package/dist/ionic/p-22149a4f.js +4 -0
  277. package/dist/ionic/{p-a873feda.system.entry.js → p-2507278c.system.entry.js} +1 -1
  278. package/dist/ionic/{p-5996d3ad.system.entry.js → p-2515cb4d.system.entry.js} +1 -1
  279. package/dist/ionic/{p-37264dcc.entry.js → p-265939f0.entry.js} +1 -1
  280. package/dist/ionic/{p-4eed0eb2.system.entry.js → p-2abae1cc.system.entry.js} +1 -1
  281. package/dist/ionic/{p-3559bd4f.js → p-2bc73fb5.js} +1 -1
  282. package/dist/ionic/p-2c9eb774.system.js +4 -0
  283. package/dist/ionic/{p-a8d31cd5.entry.js → p-2cbe5399.entry.js} +1 -1
  284. package/dist/ionic/{p-c3a51c19.system.entry.js → p-2ef3c7ee.system.entry.js} +1 -1
  285. package/dist/ionic/{p-d785235b.system.entry.js → p-31a6efce.system.entry.js} +1 -1
  286. package/dist/ionic/p-322c5fb4.system.js +4 -0
  287. package/dist/ionic/{p-c66604e4.entry.js → p-33a8a71b.entry.js} +1 -1
  288. package/dist/ionic/{p-f687573e.system.js → p-343b6b1d.system.js} +1 -1
  289. package/dist/ionic/p-34479cfb.entry.js +4 -0
  290. package/dist/ionic/{p-5ae70860.js → p-346b2baf.js} +1 -1
  291. package/dist/ionic/{p-eab9414f.entry.js → p-36c448fe.entry.js} +1 -1
  292. package/dist/ionic/p-3990c92b.entry.js +4 -0
  293. package/dist/ionic/{p-5d1be985.js → p-39dd4f62.js} +1 -1
  294. package/dist/ionic/{p-8911101b.system.js → p-3c8e5c23.system.js} +1 -1
  295. package/dist/ionic/p-3e99e3e0.entry.js +4 -0
  296. package/dist/ionic/p-4129228f.system.entry.js +4 -0
  297. package/dist/ionic/{p-8c0d81a9.entry.js → p-41780810.entry.js} +1 -1
  298. package/dist/ionic/p-42c9deb1.entry.js +4 -0
  299. package/dist/ionic/{p-f5a536e1.system.js → p-4452a8ac.system.js} +1 -1
  300. package/dist/ionic/{p-e3be9fa8.system.entry.js → p-484d855b.system.entry.js} +2 -2
  301. package/dist/ionic/p-49a0e74c.entry.js +4 -0
  302. package/dist/ionic/{p-1f62c30b.entry.js → p-4ad78edc.entry.js} +1 -1
  303. package/dist/ionic/{p-ffb6d30e.js → p-4d3a5f86.js} +1 -1
  304. package/dist/ionic/{p-ae02a7ea.system.entry.js → p-4d413973.system.entry.js} +1 -1
  305. package/dist/ionic/{p-43df2d06.system.entry.js → p-5010643d.system.entry.js} +1 -1
  306. package/dist/ionic/{p-52b61cba.system.js → p-5126cf1e.system.js} +1 -1
  307. package/dist/ionic/p-52245809.js +4 -0
  308. package/dist/ionic/{p-e4c1fd74.system.entry.js → p-56da53ad.system.entry.js} +1 -1
  309. package/dist/ionic/{p-6a649fcd.system.js → p-578efda4.system.js} +2 -2
  310. package/dist/ionic/{p-d6b3e734.system.entry.js → p-5882bffa.system.entry.js} +1 -1
  311. package/dist/ionic/{p-026517fb.entry.js → p-5b932840.entry.js} +1 -1
  312. package/dist/ionic/p-5c9324c6.js +4 -0
  313. package/dist/ionic/{p-9c7efe25.system.entry.js → p-5fce0c0b.system.entry.js} +1 -1
  314. package/dist/ionic/{p-ebb85488.entry.js → p-6190d0d6.entry.js} +1 -1
  315. package/dist/ionic/{p-85b1ffae.entry.js → p-62af944c.entry.js} +1 -1
  316. package/dist/ionic/{p-feab8373.system.entry.js → p-63c09585.system.entry.js} +1 -1
  317. package/dist/ionic/{p-d854f4bc.system.entry.js → p-65346408.system.entry.js} +1 -1
  318. package/dist/ionic/{p-ac2c154f.system.entry.js → p-655723eb.system.entry.js} +1 -1
  319. package/dist/ionic/p-67222c16.system.js +4 -0
  320. package/dist/ionic/{p-c2583512.entry.js → p-6d32975a.entry.js} +1 -1
  321. package/dist/ionic/{p-13637707.entry.js → p-70af0afb.entry.js} +1 -1
  322. package/dist/ionic/{p-6c85db7e.system.entry.js → p-70ccc275.system.entry.js} +1 -1
  323. package/dist/ionic/p-712fedc9.entry.js +4 -0
  324. package/dist/ionic/{p-ca5eef42.entry.js → p-72ec9a26.entry.js} +1 -1
  325. package/dist/ionic/{p-0116e7d7.system.js → p-73897169.system.js} +1 -1
  326. package/dist/ionic/{p-d4896d36.system.entry.js → p-7458862e.system.entry.js} +1 -1
  327. package/dist/ionic/{p-166f4ba0.entry.js → p-76446a85.entry.js} +1 -1
  328. package/dist/ionic/{p-3fe95571.system.entry.js → p-77e7b7b6.system.entry.js} +1 -1
  329. package/dist/ionic/{p-89e678fa.js → p-7a1766d6.js} +1 -1
  330. package/dist/ionic/{p-486dc46d.system.entry.js → p-7ae680ba.system.entry.js} +1 -1
  331. package/dist/ionic/{p-fd2c0aa6.entry.js → p-7b98cebe.entry.js} +1 -1
  332. package/dist/ionic/p-80c6d619.entry.js +4 -0
  333. package/dist/ionic/{p-e0a2abde.system.entry.js → p-84d08aae.system.entry.js} +1 -1
  334. package/dist/ionic/{p-c09a2f58.system.js → p-860eb968.system.js} +1 -1
  335. package/dist/ionic/{p-31918ee1.entry.js → p-8818edd8.entry.js} +1 -1
  336. package/dist/ionic/{p-ebd0a280.entry.js → p-89bf08c7.entry.js} +1 -1
  337. package/dist/ionic/{p-830f1a37.system.entry.js → p-8cfba7e9.system.entry.js} +1 -1
  338. package/dist/ionic/{p-bba0bc47.system.js → p-8e407469.system.js} +1 -1
  339. package/dist/ionic/{p-48e13807.system.entry.js → p-92365bc1.system.entry.js} +1 -1
  340. package/dist/ionic/{p-ee41045b.system.entry.js → p-93e3654c.system.entry.js} +1 -1
  341. package/dist/ionic/{p-8f89c8e3.entry.js → p-955c3eb8.entry.js} +1 -1
  342. package/dist/ionic/{p-56a8aa85.entry.js → p-95775830.entry.js} +1 -1
  343. package/dist/ionic/{p-f6e7870b.system.js → p-95da3ae2.system.js} +1 -1
  344. package/dist/ionic/{p-230af7f2.js → p-990630ca.js} +1 -1
  345. package/dist/ionic/{p-4429e8c5.entry.js → p-9962f63f.entry.js} +1 -1
  346. package/dist/ionic/p-9a100adc.entry.js +4 -0
  347. package/dist/ionic/{p-34182275.entry.js → p-9b3bb24e.entry.js} +1 -1
  348. package/dist/ionic/{p-a69cf9ea.entry.js → p-9de5c787.entry.js} +1 -1
  349. package/dist/ionic/{p-eb4ac14d.system.js → p-9f3008d4.system.js} +1 -1
  350. package/dist/ionic/{p-17c772fb.entry.js → p-a5b31c0f.entry.js} +1 -1
  351. package/dist/ionic/{p-d86d7845.system.js → p-a69b9fc5.system.js} +1 -1
  352. package/dist/ionic/{p-c55254f0.system.entry.js → p-a9e24ae2.system.entry.js} +1 -1
  353. package/dist/ionic/{p-d7607262.system.js → p-acb30a5c.system.js} +1 -1
  354. package/dist/ionic/{p-361ab803.system.entry.js → p-acc8399c.system.entry.js} +2 -2
  355. package/dist/ionic/p-af09741c.entry.js +4 -0
  356. package/dist/ionic/{p-953d9cf5.system.js → p-af452fa4.system.js} +1 -1
  357. package/dist/ionic/{p-b533b7ab.system.entry.js → p-af744710.system.entry.js} +1 -1
  358. package/dist/ionic/{p-42a9bb35.entry.js → p-afecb188.entry.js} +1 -1
  359. package/dist/ionic/{p-8aa290af.system.js → p-b3680e2f.system.js} +1 -1
  360. package/dist/ionic/p-b936eb7e.system.entry.js +4 -0
  361. package/dist/ionic/{p-6eb35904.js → p-bb11d9fb.js} +1 -1
  362. package/dist/ionic/{p-00d5ab83.entry.js → p-bb2a6761.entry.js} +1 -1
  363. package/dist/ionic/{p-327b452e.entry.js → p-bc616455.entry.js} +1 -1
  364. package/dist/ionic/{p-9d4a8059.entry.js → p-bdad26e3.entry.js} +1 -1
  365. package/dist/ionic/{p-91b944fa.entry.js → p-c32644d7.entry.js} +1 -1
  366. package/dist/ionic/p-c3802319.system.js +4 -0
  367. package/dist/ionic/{p-a4b108a7.entry.js → p-c8d645b3.entry.js} +1 -1
  368. package/dist/ionic/{p-07d0478c.js → p-c935cfc9.js} +1 -1
  369. package/dist/ionic/{p-45109533.system.entry.js → p-d1172fe3.system.entry.js} +1 -1
  370. package/dist/ionic/{p-b566749e.js → p-d4ca0475.js} +1 -1
  371. package/dist/ionic/{p-e25cd3c7.js → p-d743e981.js} +1 -1
  372. package/dist/ionic/{p-80f2a47b.entry.js → p-d7bb5325.entry.js} +1 -1
  373. package/dist/ionic/{p-364ed29d.system.entry.js → p-d821466d.system.entry.js} +1 -1
  374. package/dist/ionic/{p-733f53f8.system.js → p-d99e8644.system.js} +1 -1
  375. package/dist/ionic/{p-05f90810.system.entry.js → p-da8ef548.system.entry.js} +1 -1
  376. package/dist/ionic/{p-de4fef3c.system.entry.js → p-dc146a2a.system.entry.js} +1 -1
  377. package/dist/ionic/{p-25580c85.system.entry.js → p-dd0c9350.system.entry.js} +1 -1
  378. package/dist/ionic/{p-136ff13e.entry.js → p-df862603.entry.js} +1 -1
  379. package/dist/ionic/{p-e84da6cb.system.entry.js → p-e2e19375.system.entry.js} +1 -1
  380. package/dist/ionic/{p-0793353d.system.entry.js → p-e32557bb.system.entry.js} +1 -1
  381. package/dist/ionic/{p-fced06e0.entry.js → p-e5849f8d.entry.js} +1 -1
  382. package/dist/ionic/p-e8d56122.js +4 -0
  383. package/dist/ionic/{p-441c2c8c.entry.js → p-e8f34871.entry.js} +1 -1
  384. package/dist/ionic/{p-6f3d8334.js → p-ecceeb90.js} +1 -1
  385. package/dist/ionic/{p-d7fef52e.system.entry.js → p-ed75fcfb.system.entry.js} +1 -1
  386. package/dist/ionic/{p-213b12ce.system.entry.js → p-eeb5cb45.system.entry.js} +2 -2
  387. package/dist/ionic/p-efbf5af5.system.entry.js +4 -0
  388. package/dist/ionic/p-f2613334.system.entry.js +4 -0
  389. package/dist/ionic/{p-6347c733.system.entry.js → p-f301a694.system.entry.js} +1 -1
  390. package/dist/ionic/{p-478dfa8c.system.entry.js → p-f3102647.system.entry.js} +1 -1
  391. package/dist/ionic/{p-f8ef15ba.system.entry.js → p-f56752be.system.entry.js} +1 -1
  392. package/dist/ionic/{p-379d9002.entry.js → p-f5d6624d.entry.js} +1 -1
  393. package/dist/ionic/{p-5d3dc32b.system.entry.js → p-f78af648.system.entry.js} +1 -1
  394. package/dist/ionic/{p-c3de6cd1.system.entry.js → p-f89cf011.system.entry.js} +1 -1
  395. package/dist/ionic/p-fbf86e62.system.js +4 -0
  396. package/dist/ionic/{p-16dd9c9b.entry.js → p-fca17935.entry.js} +1 -1
  397. package/dist/ionic/{p-712b57f9.system.entry.js → p-fca6ef5f.system.entry.js} +1 -1
  398. package/dist/ionic/{p-c06312bf.entry.js → p-fec13c57.entry.js} +1 -1
  399. package/dist/types/components/checkbox/checkbox.d.ts +6 -0
  400. package/dist/types/components/modal/animations/sheet.d.ts +1 -0
  401. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  402. package/dist/types/components/modal/modal-interface.d.ts +1 -0
  403. package/dist/types/components/modal/modal.d.ts +11 -0
  404. package/dist/types/components/select/select.d.ts +6 -0
  405. package/dist/types/components/toggle/toggle.d.ts +25 -0
  406. package/dist/types/components/toolbar/toolbar.d.ts +4 -0
  407. package/dist/types/components.d.ts +48 -0
  408. package/dist/types/utils/config.d.ts +9 -0
  409. package/dist/types/utils/helpers.d.ts +0 -4
  410. package/dist/types/utils/logging/index.d.ts +13 -1
  411. package/dist/types/utils/native/capacitor.d.ts +1 -7
  412. package/dist/types/utils/test/platform.utils.d.ts +1 -1
  413. package/hydrate/index.js +338 -100
  414. package/hydrate/index.mjs +338 -100
  415. package/package.json +5 -5
  416. package/dist/esm-es5/app-globals-c10a1137.js +0 -4
  417. package/dist/esm-es5/index-9b0d46f4.js +0 -4
  418. package/dist/esm-es5/input-shims-5e5e47e8.js +0 -4
  419. package/dist/esm-es5/md.transition-290d8802.js +0 -4
  420. package/dist/esm-es5/status-tap-ba401484.js +0 -4
  421. package/dist/ionic/p-06fee233.js +0 -4
  422. package/dist/ionic/p-1b2657c9.system.entry.js +0 -4
  423. package/dist/ionic/p-1c89b09c.system.entry.js +0 -4
  424. package/dist/ionic/p-1f1b8704.entry.js +0 -4
  425. package/dist/ionic/p-30ec5574.entry.js +0 -4
  426. package/dist/ionic/p-4075165f.js +0 -4
  427. package/dist/ionic/p-4133f9ec.entry.js +0 -4
  428. package/dist/ionic/p-47ed8b64.entry.js +0 -4
  429. package/dist/ionic/p-4e8946f7.js +0 -4
  430. package/dist/ionic/p-51d4cdba.system.js +0 -4
  431. package/dist/ionic/p-665f9987.entry.js +0 -4
  432. package/dist/ionic/p-8b367303.entry.js +0 -4
  433. package/dist/ionic/p-8f3d6be8.entry.js +0 -4
  434. package/dist/ionic/p-9e23592d.system.js +0 -4
  435. package/dist/ionic/p-a749d4a9.entry.js +0 -4
  436. package/dist/ionic/p-acb5a6e4.entry.js +0 -4
  437. package/dist/ionic/p-b1c4a9db.js +0 -4
  438. package/dist/ionic/p-b58057d4.js +0 -4
  439. package/dist/ionic/p-b5a10c8b.system.entry.js +0 -4
  440. package/dist/ionic/p-b6ee3fc7.system.entry.js +0 -4
  441. package/dist/ionic/p-c312ea08.entry.js +0 -4
  442. package/dist/ionic/p-c42a4dad.system.entry.js +0 -4
  443. package/dist/ionic/p-e03cd18a.system.entry.js +0 -4
  444. package/dist/ionic/p-e03d645e.entry.js +0 -4
  445. package/dist/ionic/p-efa8edbc.system.js +0 -4
  446. package/dist/ionic/p-f1bbc785.js +0 -4
  447. package/dist/ionic/p-f4f255cb.system.js +0 -4
  448. package/dist/ionic/p-f6fe87c1.js +0 -4
  449. package/dist/ionic/p-ff4b7e40.system.js +0 -4
@@ -58,6 +58,7 @@ export class Checkbox {
58
58
  this.labelPlacement = 'start';
59
59
  this.justify = undefined;
60
60
  this.alignment = undefined;
61
+ this.required = false;
61
62
  }
62
63
  componentWillLoad() {
63
64
  this.inheritedAttributes = Object.assign({}, inheritAriaAttributes(this.el));
@@ -69,11 +70,11 @@ export class Checkbox {
69
70
  }
70
71
  }
71
72
  render() {
72
- const { color, checked, disabled, el, getSVGPath, indeterminate, inheritedAttributes, inputId, justify, labelPlacement, name, value, alignment, } = this;
73
+ const { color, checked, disabled, el, getSVGPath, indeterminate, inheritedAttributes, inputId, justify, labelPlacement, name, value, alignment, required, } = this;
73
74
  const mode = getIonMode(this);
74
75
  const path = getSVGPath(mode, indeterminate);
75
76
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
76
- return (h(Host, { key: '6dc787e1100521d08c4900104e1a3e2f594e919f', "aria-checked": indeterminate ? 'mixed' : `${checked}`, class: createColorClasses(color, {
77
+ return (h(Host, { key: '07a5884062dd256b570e856270c74a5a09d2f2a5', "aria-checked": indeterminate ? 'mixed' : `${checked}`, class: createColorClasses(color, {
77
78
  [mode]: true,
78
79
  'in-item': hostContext('ion-item', el),
79
80
  'checkbox-checked': checked,
@@ -83,10 +84,10 @@ export class Checkbox {
83
84
  [`checkbox-justify-${justify}`]: justify !== undefined,
84
85
  [`checkbox-alignment-${alignment}`]: alignment !== undefined,
85
86
  [`checkbox-label-placement-${labelPlacement}`]: true,
86
- }), onClick: this.onClick }, h("label", { key: '68222fb736a5ec3f2e488649b0e2ce0417dcb224', class: "checkbox-wrapper" }, h("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)), h("div", { key: 'c72df2699414b1e5a41a1bc267bc634f0c93dcff', class: {
87
+ }), onClick: this.onClick }, h("label", { key: '3439d546e8b60187421db698eab63a0bdd31c973', class: "checkbox-wrapper" }, h("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)), h("div", { key: '4e882f98939cc4b7c7ab7459c751d3f4bb2023fe', class: {
87
88
  'label-text-wrapper': true,
88
89
  'label-text-wrapper-hidden': el.textContent === '',
89
- }, part: "label" }, h("slot", { key: 'a2a80285178a7e0e3b536fc9ca26b8b444aa4307' })), h("div", { key: 'c2b05e0d1fe8df5dcd72858220b5ff51ecaee4cc', class: "native-wrapper" }, h("svg", { key: 'ee24913fded72258ebd9713654a6dba92a18fcf7', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
90
+ }, part: "label" }, h("slot", { key: '0abda81297a086d02c4a56af75005547971dfcfe' })), h("div", { key: '36489ea3f48a7d0ec46b77c243f9f253ef5c2b3b', class: "native-wrapper" }, h("svg", { key: '4c53b52f5e93752672a34eb6f180b75fa9af9046', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container" }, path)))));
90
91
  }
91
92
  getSVGPath(mode, indeterminate) {
92
93
  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" }));
@@ -275,6 +276,24 @@ export class Checkbox {
275
276
  },
276
277
  "attribute": "alignment",
277
278
  "reflect": false
279
+ },
280
+ "required": {
281
+ "type": "boolean",
282
+ "mutable": false,
283
+ "complexType": {
284
+ "original": "boolean",
285
+ "resolved": "boolean",
286
+ "references": {}
287
+ },
288
+ "required": false,
289
+ "optional": false,
290
+ "docs": {
291
+ "tags": [],
292
+ "text": "If true, screen readers will announce it as a required field. This property\nworks only for accessibility purposes, it will not prevent the form from\nsubmitting if the value is invalid."
293
+ },
294
+ "attribute": "required",
295
+ "reflect": false,
296
+ "defaultValue": "false"
278
297
  }
279
298
  };
280
299
  }
@@ -311,6 +311,7 @@
311
311
  justify-content: space-between;
312
312
  border-top: var(--border-width) var(--border-style) var(--border-color);
313
313
  font-size: 0.75rem;
314
+ white-space: normal;
314
315
  }
315
316
 
316
317
  /**
@@ -340,7 +341,7 @@
340
341
 
341
342
  .input-bottom .helper-text {
342
343
  display: block;
343
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
344
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
344
345
  }
345
346
 
346
347
  :host(.ion-touched.ion-invalid) .input-bottom .error-text {
@@ -359,7 +360,7 @@
359
360
  */
360
361
  -webkit-margin-start: auto;
361
362
  margin-inline-start: auto;
362
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
363
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
363
364
  white-space: nowrap;
364
365
  padding-inline-start: 16px;
365
366
  }
@@ -311,6 +311,7 @@
311
311
  justify-content: space-between;
312
312
  border-top: var(--border-width) var(--border-style) var(--border-color);
313
313
  font-size: 0.75rem;
314
+ white-space: normal;
314
315
  }
315
316
 
316
317
  /**
@@ -340,7 +341,7 @@
340
341
 
341
342
  .input-bottom .helper-text {
342
343
  display: block;
343
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
344
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
344
345
  }
345
346
 
346
347
  :host(.ion-touched.ion-invalid) .input-bottom .error-text {
@@ -359,7 +360,7 @@
359
360
  */
360
361
  -webkit-margin-start: auto;
361
362
  margin-inline-start: auto;
362
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
363
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
363
364
  white-space: nowrap;
364
365
  padding-inline-start: 16px;
365
366
  }
@@ -799,6 +800,10 @@
799
800
  --border-color: var(--highlight-color);
800
801
  }
801
802
 
803
+ /**
804
+ * The bottom content should never have
805
+ * a border with the solid style.
806
+ */
802
807
  :host(.input-fill-solid) .input-bottom {
803
808
  border-top: none;
804
809
  }
@@ -13,22 +13,68 @@ const createEnterAnimation = () => {
13
13
  })
14
14
  .afterClearStyles(['pointer-events']);
15
15
  const wrapperAnimation = createAnimation().fromTo('transform', 'translateY(100vh)', 'translateY(0vh)');
16
- return { backdropAnimation, wrapperAnimation };
16
+ return { backdropAnimation, wrapperAnimation, contentAnimation: undefined };
17
17
  };
18
18
  /**
19
19
  * iOS Modal Enter Animation for the Card presentation style
20
20
  */
21
21
  export const iosEnterAnimation = (baseEl, opts) => {
22
- const { presentingEl, currentBreakpoint } = opts;
22
+ const { presentingEl, currentBreakpoint, expandToScroll } = opts;
23
23
  const root = getElementRoot(baseEl);
24
- const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation();
24
+ const { wrapperAnimation, backdropAnimation, contentAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation();
25
25
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
26
26
  wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
27
+ // The content animation is only added if scrolling is enabled for
28
+ // all the breakpoints.
29
+ !expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
27
30
  const baseAnimation = createAnimation('entering-base')
28
31
  .addElement(baseEl)
29
32
  .easing('cubic-bezier(0.32,0.72,0,1)')
30
33
  .duration(500)
31
- .addAnimation(wrapperAnimation);
34
+ .addAnimation([wrapperAnimation])
35
+ .beforeAddWrite(() => {
36
+ if (expandToScroll) {
37
+ // Scroll can only be done when the modal is fully expanded.
38
+ return;
39
+ }
40
+ /**
41
+ * There are some browsers that causes flickering when
42
+ * dragging the content when scroll is enabled at every
43
+ * breakpoint. This is due to the wrapper element being
44
+ * transformed off the screen and having a snap animation.
45
+ *
46
+ * A workaround is to clone the footer element and append
47
+ * it outside of the wrapper element. This way, the footer
48
+ * is still visible and the drag can be done without
49
+ * flickering. The original footer is hidden until the modal
50
+ * is dismissed. This maintains the animation of the footer
51
+ * when the modal is dismissed.
52
+ *
53
+ * The workaround needs to be done before the animation starts
54
+ * so there are no flickering issues.
55
+ */
56
+ const ionFooter = baseEl.querySelector('ion-footer');
57
+ /**
58
+ * This check is needed to prevent more than one footer
59
+ * from being appended to the shadow root.
60
+ * Otherwise, iOS and MD enter animations would append
61
+ * the footer twice.
62
+ */
63
+ const ionFooterAlreadyAppended = baseEl.shadowRoot.querySelector('ion-footer');
64
+ if (ionFooter && !ionFooterAlreadyAppended) {
65
+ const footerHeight = ionFooter.clientHeight;
66
+ const clonedFooter = ionFooter.cloneNode(true);
67
+ baseEl.shadowRoot.appendChild(clonedFooter);
68
+ ionFooter.style.setProperty('display', 'none');
69
+ ionFooter.setAttribute('aria-hidden', 'true');
70
+ // Padding is added to prevent some content from being hidden.
71
+ const page = baseEl.querySelector('.ion-page');
72
+ page.style.setProperty('padding-bottom', `${footerHeight}px`);
73
+ }
74
+ });
75
+ if (contentAnimation) {
76
+ baseAnimation.addAnimation(contentAnimation);
77
+ }
32
78
  if (presentingEl) {
33
79
  const isMobile = window.innerWidth < 768;
34
80
  const hasCardModal = presentingEl.tagName === 'ION-MODAL' && presentingEl.presentingElement !== undefined;
@@ -14,7 +14,7 @@ const createLeaveAnimation = () => {
14
14
  * iOS Modal Leave Animation
15
15
  */
16
16
  export const iosLeaveAnimation = (baseEl, opts, duration = 500) => {
17
- const { presentingEl, currentBreakpoint } = opts;
17
+ const { presentingEl, currentBreakpoint, expandToScroll } = opts;
18
18
  const root = getElementRoot(baseEl);
19
19
  const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetLeaveAnimation(opts) : createLeaveAnimation();
20
20
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
@@ -23,7 +23,29 @@ export const iosLeaveAnimation = (baseEl, opts, duration = 500) => {
23
23
  .addElement(baseEl)
24
24
  .easing('cubic-bezier(0.32,0.72,0,1)')
25
25
  .duration(duration)
26
- .addAnimation(wrapperAnimation);
26
+ .addAnimation(wrapperAnimation)
27
+ .beforeAddWrite(() => {
28
+ if (expandToScroll) {
29
+ // Scroll can only be done when the modal is fully expanded.
30
+ return;
31
+ }
32
+ /**
33
+ * If expandToScroll is disabled, we need to swap
34
+ * the visibility to the original, so the footer
35
+ * dismisses with the modal and doesn't stay
36
+ * until the modal is removed from the DOM.
37
+ */
38
+ const ionFooter = baseEl.querySelector('ion-footer');
39
+ if (ionFooter) {
40
+ const clonedFooter = baseEl.shadowRoot.querySelector('ion-footer');
41
+ ionFooter.style.removeProperty('display');
42
+ ionFooter.removeAttribute('aria-hidden');
43
+ clonedFooter.style.setProperty('display', 'none');
44
+ clonedFooter.setAttribute('aria-hidden', 'true');
45
+ const page = baseEl.querySelector('.ion-page');
46
+ page.style.removeProperty('padding-bottom');
47
+ }
48
+ });
27
49
  if (presentingEl) {
28
50
  const isMobile = window.innerWidth < 768;
29
51
  const hasCardModal = presentingEl.tagName === 'ION-MODAL' && presentingEl.presentingElement !== undefined;
@@ -15,20 +15,67 @@ const createEnterAnimation = () => {
15
15
  { offset: 0, opacity: 0.01, transform: 'translateY(40px)' },
16
16
  { offset: 1, opacity: 1, transform: `translateY(0px)` },
17
17
  ]);
18
- return { backdropAnimation, wrapperAnimation };
18
+ return { backdropAnimation, wrapperAnimation, contentAnimation: undefined };
19
19
  };
20
20
  /**
21
21
  * Md Modal Enter Animation
22
22
  */
23
23
  export const mdEnterAnimation = (baseEl, opts) => {
24
- const { currentBreakpoint } = opts;
24
+ const { currentBreakpoint, expandToScroll } = opts;
25
25
  const root = getElementRoot(baseEl);
26
- const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation();
26
+ const { wrapperAnimation, backdropAnimation, contentAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation();
27
27
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
28
28
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
29
- return createAnimation()
29
+ // The content animation is only added if scrolling is enabled for
30
+ // all the breakpoints.
31
+ expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
32
+ const baseAnimation = createAnimation()
30
33
  .addElement(baseEl)
31
34
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
32
35
  .duration(280)
33
- .addAnimation([backdropAnimation, wrapperAnimation]);
36
+ .addAnimation([backdropAnimation, wrapperAnimation])
37
+ .beforeAddWrite(() => {
38
+ if (expandToScroll) {
39
+ // Scroll can only be done when the modal is fully expanded.
40
+ return;
41
+ }
42
+ /**
43
+ * There are some browsers that causes flickering when
44
+ * dragging the content when scroll is enabled at every
45
+ * breakpoint. This is due to the wrapper element being
46
+ * transformed off the screen and having a snap animation.
47
+ *
48
+ * A workaround is to clone the footer element and append
49
+ * it outside of the wrapper element. This way, the footer
50
+ * is still visible and the drag can be done without
51
+ * flickering. The original footer is hidden until the modal
52
+ * is dismissed. This maintains the animation of the footer
53
+ * when the modal is dismissed.
54
+ *
55
+ * The workaround needs to be done before the animation starts
56
+ * so there are no flickering issues.
57
+ */
58
+ const ionFooter = baseEl.querySelector('ion-footer');
59
+ /**
60
+ * This check is needed to prevent more than one footer
61
+ * from being appended to the shadow root.
62
+ * Otherwise, iOS and MD enter animations would append
63
+ * the footer twice.
64
+ */
65
+ const ionFooterAlreadyAppended = baseEl.shadowRoot.querySelector('ion-footer');
66
+ if (ionFooter && !ionFooterAlreadyAppended) {
67
+ const footerHeight = ionFooter.clientHeight;
68
+ const clonedFooter = ionFooter.cloneNode(true);
69
+ baseEl.shadowRoot.appendChild(clonedFooter);
70
+ ionFooter.style.setProperty('display', 'none');
71
+ ionFooter.setAttribute('aria-hidden', 'true');
72
+ // Padding is added to prevent some content from being hidden.
73
+ const page = baseEl.querySelector('.ion-page');
74
+ page.style.setProperty('padding-bottom', `${footerHeight}px`);
75
+ }
76
+ });
77
+ if (contentAnimation) {
78
+ baseAnimation.addAnimation(contentAnimation);
79
+ }
80
+ return baseAnimation;
34
81
  };
@@ -16,13 +16,36 @@ const createLeaveAnimation = () => {
16
16
  * Md Modal Leave Animation
17
17
  */
18
18
  export const mdLeaveAnimation = (baseEl, opts) => {
19
- const { currentBreakpoint } = opts;
19
+ const { currentBreakpoint, expandToScroll } = opts;
20
20
  const root = getElementRoot(baseEl);
21
21
  const { wrapperAnimation, backdropAnimation } = currentBreakpoint !== undefined ? createSheetLeaveAnimation(opts) : createLeaveAnimation();
22
22
  backdropAnimation.addElement(root.querySelector('ion-backdrop'));
23
23
  wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
24
- return createAnimation()
24
+ const baseAnimation = createAnimation()
25
25
  .easing('cubic-bezier(0.47,0,0.745,0.715)')
26
26
  .duration(200)
27
- .addAnimation([backdropAnimation, wrapperAnimation]);
27
+ .addAnimation([backdropAnimation, wrapperAnimation])
28
+ .beforeAddWrite(() => {
29
+ if (expandToScroll) {
30
+ // Scroll can only be done when the modal is fully expanded.
31
+ return;
32
+ }
33
+ /**
34
+ * If expandToScroll is disabled, we need to swap
35
+ * the visibility to the original, so the footer
36
+ * dismisses with the modal and doesn't stay
37
+ * until the modal is removed from the DOM.
38
+ */
39
+ const ionFooter = baseEl.querySelector('ion-footer');
40
+ if (ionFooter) {
41
+ const clonedFooter = baseEl.shadowRoot.querySelector('ion-footer');
42
+ ionFooter.style.removeProperty('display');
43
+ ionFooter.removeAttribute('aria-hidden');
44
+ clonedFooter.style.setProperty('display', 'none');
45
+ clonedFooter.setAttribute('aria-hidden', 'true');
46
+ const page = baseEl.querySelector('.ion-page');
47
+ page.style.removeProperty('padding-bottom');
48
+ }
49
+ });
50
+ return baseAnimation;
28
51
  };
@@ -4,7 +4,7 @@
4
4
  import { createAnimation } from "../../../utils/animation/animation";
5
5
  import { getBackdropValueForSheet } from "../utils";
6
6
  export const createSheetEnterAnimation = (opts) => {
7
- const { currentBreakpoint, backdropBreakpoint } = opts;
7
+ const { currentBreakpoint, backdropBreakpoint, expandToScroll } = opts;
8
8
  /**
9
9
  * If the backdropBreakpoint is undefined, then the backdrop
10
10
  * should always fade in. If the backdropBreakpoint came before the
@@ -24,7 +24,16 @@ export const createSheetEnterAnimation = (opts) => {
24
24
  { offset: 0, opacity: 1, transform: 'translateY(100%)' },
25
25
  { offset: 1, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
26
26
  ]);
27
- return { wrapperAnimation, backdropAnimation };
27
+ /**
28
+ * This allows the content to be scrollable at any breakpoint.
29
+ */
30
+ const contentAnimation = !expandToScroll
31
+ ? createAnimation('contentAnimation').keyframes([
32
+ { offset: 0, opacity: 1, maxHeight: `${(1 - currentBreakpoint) * 100}%` },
33
+ { offset: 1, opacity: 1, maxHeight: `${currentBreakpoint * 100}%` },
34
+ ])
35
+ : undefined;
36
+ return { wrapperAnimation, backdropAnimation, contentAnimation };
28
37
  };
29
38
  export const createSheetLeaveAnimation = (opts) => {
30
39
  const { currentBreakpoint, backdropBreakpoint } = opts;
@@ -7,7 +7,7 @@ import { clamp, raf, getElementRoot } from "../../../utils/helpers";
7
7
  import { FOCUS_TRAP_DISABLE_CLASS } from "../../../utils/overlays";
8
8
  import { getBackdropValueForSheet } from "../utils";
9
9
  import { calculateSpringStep, handleCanDismiss } from "./utils";
10
- export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
10
+ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
11
11
  // Defaults for the sheet swipe animation
12
12
  const defaultBackdrop = [
13
13
  { offset: 0, opacity: 'var(--backdrop-opacity)' },
@@ -24,6 +24,10 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
24
24
  { offset: 1, transform: 'translateY(100%)' },
25
25
  ],
26
26
  BACKDROP_KEYFRAMES: backdropBreakpoint !== 0 ? customBackdrop : defaultBackdrop,
27
+ CONTENT_KEYFRAMES: [
28
+ { offset: 0, maxHeight: '100%' },
29
+ { offset: 1, maxHeight: '0%' },
30
+ ],
27
31
  };
28
32
  const contentEl = baseEl.querySelector('ion-content');
29
33
  const height = wrapperEl.clientHeight;
@@ -31,10 +35,11 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
31
35
  let offset = 0;
32
36
  let canDismissBlocksGesture = false;
33
37
  const canDismissMaxStep = 0.95;
34
- const wrapperAnimation = animation.childAnimations.find((ani) => ani.id === 'wrapperAnimation');
35
- const backdropAnimation = animation.childAnimations.find((ani) => ani.id === 'backdropAnimation');
36
38
  const maxBreakpoint = breakpoints[breakpoints.length - 1];
37
39
  const minBreakpoint = breakpoints[0];
40
+ const wrapperAnimation = animation.childAnimations.find((ani) => ani.id === 'wrapperAnimation');
41
+ const backdropAnimation = animation.childAnimations.find((ani) => ani.id === 'backdropAnimation');
42
+ const contentAnimation = animation.childAnimations.find((ani) => ani.id === 'contentAnimation');
38
43
  const enableBackdrop = () => {
39
44
  baseEl.style.setProperty('pointer-events', 'auto');
40
45
  backdropEl.style.setProperty('pointer-events', 'auto');
@@ -57,6 +62,31 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
57
62
  */
58
63
  baseEl.classList.add(FOCUS_TRAP_DISABLE_CLASS);
59
64
  };
65
+ /**
66
+ * Toggles the visible modal footer when `expandToScroll` is disabled.
67
+ * @param footer The footer to show.
68
+ */
69
+ const swapFooterVisibility = (footer) => {
70
+ const originalFooter = baseEl.querySelector('ion-footer');
71
+ if (!originalFooter) {
72
+ return;
73
+ }
74
+ const clonedFooter = wrapperEl.nextElementSibling;
75
+ const footerToHide = footer === 'original' ? clonedFooter : originalFooter;
76
+ const footerToShow = footer === 'original' ? originalFooter : clonedFooter;
77
+ footerToShow.style.removeProperty('display');
78
+ footerToShow.removeAttribute('aria-hidden');
79
+ const page = baseEl.querySelector('.ion-page');
80
+ if (footer === 'original') {
81
+ page.style.removeProperty('padding-bottom');
82
+ }
83
+ else {
84
+ const pagePadding = footerToShow.clientHeight;
85
+ page.style.setProperty('padding-bottom', `${pagePadding}px`);
86
+ }
87
+ footerToHide.style.setProperty('display', 'none');
88
+ footerToHide.setAttribute('aria-hidden', 'true');
89
+ };
60
90
  /**
61
91
  * After the entering animation completes,
62
92
  * we need to set the animation to go from
@@ -68,6 +98,7 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
68
98
  if (wrapperAnimation && backdropAnimation) {
69
99
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
70
100
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
101
+ contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
71
102
  animation.progressStart(true, 1 - currentBreakpoint);
72
103
  /**
73
104
  * If backdrop is not enabled, then content
@@ -84,7 +115,7 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
84
115
  disableBackdrop();
85
116
  }
86
117
  }
87
- if (contentEl && currentBreakpoint !== maxBreakpoint) {
118
+ if (contentEl && currentBreakpoint !== maxBreakpoint && expandToScroll) {
88
119
  contentEl.scrollY = false;
89
120
  }
90
121
  const canStart = (detail) => {
@@ -98,6 +129,13 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
98
129
  */
99
130
  const contentEl = findClosestIonContent(detail.event.target);
100
131
  currentBreakpoint = getCurrentBreakpoint();
132
+ /**
133
+ * If we have expandToScroll disabled, we should not allow the swipe gesture to start
134
+ * if the content is being swiped.
135
+ */
136
+ if (!expandToScroll && contentEl) {
137
+ return false;
138
+ }
101
139
  if (currentBreakpoint === 1 && contentEl) {
102
140
  /**
103
141
  * The modal should never swipe to close on the content with a refresher.
@@ -128,6 +166,15 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
128
166
  * Remove undefined check
129
167
  */
130
168
  canDismissBlocksGesture = baseEl.canDismiss !== undefined && baseEl.canDismiss !== true && minBreakpoint === 0;
169
+ /**
170
+ * If expandToScroll is disabled, we need to swap
171
+ * the footer visibility to the original, so if the modal
172
+ * is dismissed, the footer dismisses with the modal
173
+ * and doesn't stay on the screen after the modal is gone.
174
+ */
175
+ if (!expandToScroll) {
176
+ swapFooterVisibility('original');
177
+ }
131
178
  /**
132
179
  * If we are pulling down, then it is possible we are pulling on the content.
133
180
  * We do not want scrolling to happen at the same time as the gesture.
@@ -243,6 +290,19 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
243
290
  opacity: `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(snapToBreakpoint, backdropBreakpoint)})`,
244
291
  },
245
292
  ]);
293
+ if (contentAnimation) {
294
+ /**
295
+ * The modal content should scroll at any breakpoint when expandToScroll
296
+ * is disabled. In order to do this, the content needs to be completely
297
+ * viewable so scrolling can access everything. Otherwise, the default
298
+ * behavior would show the content off the screen and only allow
299
+ * scrolling when the sheet is fully expanded.
300
+ */
301
+ contentAnimation.keyframes([
302
+ { offset: 0, maxHeight: `${(1 - breakpointOffset) * 100}%` },
303
+ { offset: 1, maxHeight: `${snapToBreakpoint * 100}%` },
304
+ ]);
305
+ }
246
306
  animation.progressStep(0);
247
307
  }
248
308
  /**
@@ -250,6 +310,14 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
250
310
  * snapping animation completes.
251
311
  */
252
312
  gesture.enable(false);
313
+ /**
314
+ * If expandToScroll is disabled, we need to swap
315
+ * the footer visibility to the cloned one so the footer
316
+ * doesn't flicker when the sheet's height is animated.
317
+ */
318
+ if (!expandToScroll && shouldRemainOpen) {
319
+ swapFooterVisibility('cloned');
320
+ }
253
321
  if (shouldPreventDismiss) {
254
322
  handleCanDismiss(baseEl, animation);
255
323
  }
@@ -257,13 +325,13 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
257
325
  onDismiss();
258
326
  }
259
327
  /**
260
- * If the sheet is going to be fully expanded then we should enable
261
- * scrolling immediately. The sheet modal animation takes ~500ms to finish
262
- * so if we wait until then there is a visible delay for when scrolling is
263
- * re-enabled. Native iOS allows for scrolling on the sheet modal as soon
264
- * as the gesture is released, so we align with that.
328
+ * Enables scrolling immediately if the sheet is about to fully expand
329
+ * or if it allows scrolling at any breakpoint. Without this, there would
330
+ * be a ~500ms delay while the modal animation completes, causing a
331
+ * noticeable lag. Native iOS allows scrolling as soon as the gesture is
332
+ * released, so we align with that behavior.
265
333
  */
266
- if (contentEl && snapToBreakpoint === breakpoints[breakpoints.length - 1]) {
334
+ if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
267
335
  contentEl.scrollY = true;
268
336
  }
269
337
  return new Promise((resolve) => {
@@ -281,6 +349,7 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
281
349
  raf(() => {
282
350
  wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
283
351
  backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
352
+ contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
284
353
  animation.progressStart(true, 1 - snapToBreakpoint);
285
354
  currentBreakpoint = snapToBreakpoint;
286
355
  onBreakpointChange(currentBreakpoint);
@@ -201,6 +201,12 @@ ion-backdrop {
201
201
  bottom: 0;
202
202
  }
203
203
 
204
+ :host(.modal-sheet.modal-no-expand-scroll) ion-footer {
205
+ position: absolute;
206
+ bottom: 0;
207
+ width: var(--width);
208
+ }
209
+
204
210
  /**
205
211
  * Convert a font size to a dynamic font size.
206
212
  * Fonts that participate in Dynamic Type should use
@@ -325,4 +331,14 @@ ion-backdrop {
325
331
  border-start-end-radius: var(--border-radius);
326
332
  border-end-end-radius: 0;
327
333
  border-end-start-radius: 0;
334
+ }
335
+
336
+ /**
337
+ * Sheet modals require an additional padding as mentioned in the
338
+ * `core.scss` file. However, there's a workaround that requires
339
+ * a cloned footer to be added to the modal. This is only necessary
340
+ * because the core styles are not being applied to the cloned footer.
341
+ */
342
+ :host(.modal-sheet.modal-no-expand-scroll) ion-footer ion-toolbar:first-of-type {
343
+ padding-top: 6px;
328
344
  }