voyager-ionic-core 8.7.9 → 8.7.13

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 (1039) hide show
  1. package/components/action-sheet.js +186 -5
  2. package/components/checkbox.js +63 -9
  3. package/components/content.js +13 -3
  4. package/components/ion-accordion.js +1 -1
  5. package/components/ion-datetime.js +35 -2
  6. package/components/ion-fab-button.js +1 -1
  7. package/components/ion-input.js +2 -1
  8. package/components/ion-select.js +15 -9
  9. package/components/ion-textarea.js +2 -1
  10. package/components/ion-toggle.js +62 -12
  11. package/components/item.js +1 -1
  12. package/components/modal.js +97 -5
  13. package/components/notch-controller.js +153 -0
  14. package/components/overlays.js +11 -5
  15. package/components/popover.js +36 -2
  16. package/components/radio-group.js +60 -7
  17. package/components/validity.js +1 -150
  18. package/css/core.css +1 -1
  19. package/css/core.css.map +1 -1
  20. package/css/ionic.bundle.css +1 -1
  21. package/css/ionic.bundle.css.map +1 -1
  22. package/dist/cjs/index.cjs.js +1 -1
  23. package/dist/cjs/ion-action-sheet.cjs.entry.js +184 -5
  24. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  25. package/dist/cjs/ion-app_8.cjs.entry.js +12 -3
  26. package/dist/cjs/ion-checkbox.cjs.entry.js +60 -8
  27. package/dist/cjs/ion-datetime_3.cjs.entry.js +36 -3
  28. package/dist/cjs/ion-input.cjs.entry.js +3 -2
  29. package/dist/cjs/ion-loading.cjs.entry.js +1 -1
  30. package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
  31. package/dist/cjs/ion-modal.cjs.entry.js +97 -6
  32. package/dist/cjs/ion-popover.cjs.entry.js +37 -3
  33. package/dist/cjs/ion-radio_2.cjs.entry.js +57 -6
  34. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  35. package/dist/cjs/ion-select_3.cjs.entry.js +16 -10
  36. package/dist/cjs/ion-textarea.cjs.entry.js +3 -2
  37. package/dist/cjs/ion-toast.cjs.entry.js +1 -1
  38. package/dist/cjs/ion-toggle.cjs.entry.js +58 -10
  39. package/dist/cjs/ionic.cjs.js +1 -1
  40. package/dist/cjs/loader.cjs.js +1 -1
  41. package/dist/cjs/{validity-C8QoAYT2.js → notch-controller-Bzqhjm4f.js} +0 -14
  42. package/dist/cjs/{overlays-DxIZwUXI.js → overlays--dagG4QM.js} +11 -5
  43. package/dist/cjs/validity-BpS37YFM.js +19 -0
  44. package/dist/collection/components/accordion/accordion.js +3 -3
  45. package/dist/collection/components/action-sheet/action-sheet.js +199 -4
  46. package/dist/collection/components/checkbox/checkbox.js +67 -9
  47. package/dist/collection/components/content/content.js +32 -3
  48. package/dist/collection/components/datetime/datetime.js +35 -2
  49. package/dist/collection/components/fab-button/fab-button.js +3 -3
  50. package/dist/collection/components/item/item.js +3 -3
  51. package/dist/collection/components/modal/modal.js +97 -5
  52. package/dist/collection/components/popover/popover.js +36 -2
  53. package/dist/collection/components/radio-group/radio-group.js +64 -7
  54. package/dist/collection/components/select/select.js +13 -8
  55. package/dist/collection/components/toggle/toggle.js +62 -12
  56. package/dist/collection/utils/overlays.js +11 -5
  57. package/dist/collection/utils/test/playwright/page/utils/set-content.js +7 -0
  58. package/dist/docs.json +26 -20
  59. package/dist/esm/index.js +1 -1
  60. package/dist/esm/ion-action-sheet.entry.js +184 -5
  61. package/dist/esm/ion-alert.entry.js +1 -1
  62. package/dist/esm/ion-app_8.entry.js +12 -3
  63. package/dist/esm/ion-checkbox.entry.js +60 -8
  64. package/dist/esm/ion-datetime_3.entry.js +36 -3
  65. package/dist/esm/ion-input.entry.js +2 -1
  66. package/dist/esm/ion-loading.entry.js +1 -1
  67. package/dist/esm/ion-menu_3.entry.js +1 -1
  68. package/dist/esm/ion-modal.entry.js +97 -6
  69. package/dist/esm/ion-popover.entry.js +37 -3
  70. package/dist/esm/ion-radio_2.entry.js +57 -6
  71. package/dist/esm/ion-select-modal.entry.js +1 -1
  72. package/dist/esm/ion-select_3.entry.js +15 -9
  73. package/dist/esm/ion-textarea.entry.js +2 -1
  74. package/dist/esm/ion-toast.entry.js +1 -1
  75. package/dist/esm/ion-toggle.entry.js +58 -10
  76. package/dist/esm/ionic.js +1 -1
  77. package/dist/esm/loader.js +1 -1
  78. package/dist/esm/{validity-B8oWougr.js → notch-controller-BwelN_JM.js} +1 -14
  79. package/dist/esm/{overlays-BymNv-BL.js → overlays-DCabi1dI.js} +11 -5
  80. package/dist/esm/validity-DJztqcrH.js +17 -0
  81. package/dist/ionic/index.esm.js +1 -1
  82. package/dist/ionic/ionic.esm.js +1 -1
  83. package/dist/ionic/p-071e8c1b.entry.js +4 -0
  84. package/dist/ionic/{p-7da39a4d.entry.js → p-07753df3.entry.js} +1 -1
  85. package/dist/ionic/{p-0b80d700.entry.js → p-0abeb0fc.entry.js} +1 -1
  86. package/dist/ionic/p-0bf76d0f.entry.js +4 -0
  87. package/dist/ionic/p-40c261a3.entry.js +4 -0
  88. package/dist/ionic/p-4b658a7c.entry.js +4 -0
  89. package/dist/ionic/p-4e41ea20.entry.js +4 -0
  90. package/dist/ionic/{p-98fc09eb.entry.js → p-576e0965.entry.js} +1 -1
  91. package/dist/ionic/p-60e0728c.entry.js +4 -0
  92. package/dist/ionic/p-75ae4733.entry.js +4 -0
  93. package/dist/ionic/p-C6F4hat2.js +4 -0
  94. package/dist/ionic/{p-DieJyvMP.js → p-DCv9sLH2.js} +1 -1
  95. package/dist/ionic/p-DJztqcrH.js +4 -0
  96. package/dist/ionic/{p-83be404e.entry.js → p-a8ed848b.entry.js} +1 -1
  97. package/dist/ionic/p-c19f63d0.entry.js +4 -0
  98. package/dist/ionic/p-c85a2127.entry.js +4 -0
  99. package/dist/ionic/p-d1f54e28.entry.js +4 -0
  100. package/dist/ionic/p-d3014190.entry.js +4 -0
  101. package/dist/ionic/{p-15193d01.entry.js → p-ec654c42.entry.js} +1 -1
  102. package/dist/ionic/svg/document-sharp.svg +1 -0
  103. package/dist/ionic/svg/document-text-outline.svg +1 -0
  104. package/dist/ionic/svg/document-text-sharp.svg +1 -0
  105. package/dist/ionic/svg/document-text.svg +1 -0
  106. package/dist/ionic/svg/document.svg +1 -0
  107. package/dist/ionic/svg/documents-outline.svg +1 -0
  108. package/dist/ionic/svg/documents-sharp.svg +1 -0
  109. package/dist/ionic/svg/documents.svg +1 -0
  110. package/dist/ionic/svg/download-outline.svg +1 -0
  111. package/dist/ionic/svg/download-sharp.svg +1 -0
  112. package/dist/ionic/svg/download.svg +1 -0
  113. package/dist/ionic/svg/duplicate-outline.svg +1 -0
  114. package/dist/ionic/svg/duplicate-sharp.svg +1 -0
  115. package/dist/ionic/svg/duplicate.svg +1 -0
  116. package/dist/ionic/svg/ear-outline.svg +1 -0
  117. package/dist/ionic/svg/ear-sharp.svg +1 -0
  118. package/dist/ionic/svg/ear.svg +1 -0
  119. package/dist/ionic/svg/earth-outline.svg +1 -0
  120. package/dist/ionic/svg/earth-sharp.svg +1 -0
  121. package/dist/ionic/svg/earth.svg +1 -0
  122. package/dist/ionic/svg/easel-outline.svg +1 -0
  123. package/dist/ionic/svg/easel-sharp.svg +1 -0
  124. package/dist/ionic/svg/easel.svg +1 -0
  125. package/dist/ionic/svg/egg-outline.svg +1 -0
  126. package/dist/ionic/svg/egg-sharp.svg +1 -0
  127. package/dist/ionic/svg/egg.svg +1 -0
  128. package/dist/ionic/svg/ellipse-outline.svg +1 -0
  129. package/dist/ionic/svg/ellipse-sharp.svg +1 -0
  130. package/dist/ionic/svg/ellipse.svg +1 -0
  131. package/dist/ionic/svg/ellipsis-horizontal-circle-outline.svg +1 -0
  132. package/dist/ionic/svg/ellipsis-horizontal-circle-sharp.svg +1 -0
  133. package/dist/ionic/svg/ellipsis-horizontal-circle.svg +1 -0
  134. package/dist/ionic/svg/ellipsis-horizontal-outline.svg +1 -0
  135. package/dist/ionic/svg/ellipsis-horizontal-sharp.svg +1 -0
  136. package/dist/ionic/svg/ellipsis-horizontal.svg +1 -0
  137. package/dist/ionic/svg/ellipsis-vertical-circle-outline.svg +1 -0
  138. package/dist/ionic/svg/ellipsis-vertical-circle-sharp.svg +1 -0
  139. package/dist/ionic/svg/ellipsis-vertical-circle.svg +1 -0
  140. package/dist/ionic/svg/ellipsis-vertical-outline.svg +1 -0
  141. package/dist/ionic/svg/ellipsis-vertical-sharp.svg +1 -0
  142. package/dist/ionic/svg/ellipsis-vertical.svg +1 -0
  143. package/dist/ionic/svg/enter-outline.svg +1 -0
  144. package/dist/ionic/svg/enter-sharp.svg +1 -0
  145. package/dist/ionic/svg/enter.svg +1 -0
  146. package/dist/ionic/svg/exit-outline.svg +1 -0
  147. package/dist/ionic/svg/exit-sharp.svg +1 -0
  148. package/dist/ionic/svg/exit.svg +1 -0
  149. package/dist/ionic/svg/expand-outline.svg +1 -0
  150. package/dist/ionic/svg/expand-sharp.svg +1 -0
  151. package/dist/ionic/svg/expand.svg +1 -0
  152. package/dist/ionic/svg/extension-puzzle-outline.svg +1 -0
  153. package/dist/ionic/svg/extension-puzzle-sharp.svg +1 -0
  154. package/dist/ionic/svg/extension-puzzle.svg +1 -0
  155. package/dist/ionic/svg/eye-off-outline.svg +1 -0
  156. package/dist/ionic/svg/eye-off-sharp.svg +1 -0
  157. package/dist/ionic/svg/eye-off.svg +1 -0
  158. package/dist/ionic/svg/eye-outline.svg +1 -0
  159. package/dist/ionic/svg/eye-sharp.svg +1 -0
  160. package/dist/ionic/svg/eye.svg +1 -0
  161. package/dist/ionic/svg/eyedrop-outline.svg +1 -0
  162. package/dist/ionic/svg/eyedrop-sharp.svg +1 -0
  163. package/dist/ionic/svg/eyedrop.svg +1 -0
  164. package/dist/ionic/svg/fast-food-outline.svg +1 -0
  165. package/dist/ionic/svg/fast-food-sharp.svg +1 -0
  166. package/dist/ionic/svg/fast-food.svg +1 -0
  167. package/dist/ionic/svg/female-outline.svg +1 -0
  168. package/dist/ionic/svg/female-sharp.svg +1 -0
  169. package/dist/ionic/svg/female.svg +1 -0
  170. package/dist/ionic/svg/file-tray-full-outline.svg +1 -0
  171. package/dist/ionic/svg/file-tray-full-sharp.svg +1 -0
  172. package/dist/ionic/svg/file-tray-full.svg +1 -0
  173. package/dist/ionic/svg/file-tray-outline.svg +1 -0
  174. package/dist/ionic/svg/file-tray-sharp.svg +1 -0
  175. package/dist/ionic/svg/file-tray-stacked-outline.svg +1 -0
  176. package/dist/ionic/svg/file-tray-stacked-sharp.svg +1 -0
  177. package/dist/ionic/svg/file-tray-stacked.svg +1 -0
  178. package/dist/ionic/svg/file-tray.svg +1 -0
  179. package/dist/ionic/svg/film-outline.svg +1 -0
  180. package/dist/ionic/svg/film-sharp.svg +1 -0
  181. package/dist/ionic/svg/film.svg +1 -0
  182. package/dist/ionic/svg/filter-circle-outline.svg +1 -0
  183. package/dist/ionic/svg/filter-circle-sharp.svg +1 -0
  184. package/dist/ionic/svg/filter-circle.svg +1 -0
  185. package/dist/ionic/svg/filter-outline.svg +1 -0
  186. package/dist/ionic/svg/filter-sharp.svg +1 -0
  187. package/dist/ionic/svg/filter.svg +1 -0
  188. package/dist/ionic/svg/finger-print-outline.svg +1 -0
  189. package/dist/ionic/svg/finger-print-sharp.svg +1 -0
  190. package/dist/ionic/svg/finger-print.svg +1 -0
  191. package/dist/ionic/svg/fish-outline.svg +1 -0
  192. package/dist/ionic/svg/fish-sharp.svg +1 -0
  193. package/dist/ionic/svg/fish.svg +1 -0
  194. package/dist/ionic/svg/fitness-outline.svg +1 -0
  195. package/dist/ionic/svg/fitness-sharp.svg +1 -0
  196. package/dist/ionic/svg/fitness.svg +1 -0
  197. package/dist/ionic/svg/flag-outline.svg +1 -0
  198. package/dist/ionic/svg/flag-sharp.svg +1 -0
  199. package/dist/ionic/svg/flag.svg +1 -0
  200. package/dist/ionic/svg/flame-outline.svg +1 -0
  201. package/dist/ionic/svg/flame-sharp.svg +1 -0
  202. package/dist/ionic/svg/flame.svg +1 -0
  203. package/dist/ionic/svg/flash-off-outline.svg +1 -0
  204. package/dist/ionic/svg/flash-off-sharp.svg +1 -0
  205. package/dist/ionic/svg/flash-off.svg +1 -0
  206. package/dist/ionic/svg/flash-outline.svg +1 -0
  207. package/dist/ionic/svg/flash-sharp.svg +1 -0
  208. package/dist/ionic/svg/flash.svg +1 -0
  209. package/dist/ionic/svg/flashlight-outline.svg +1 -0
  210. package/dist/ionic/svg/flashlight-sharp.svg +1 -0
  211. package/dist/ionic/svg/flashlight.svg +1 -0
  212. package/dist/ionic/svg/flask-outline.svg +1 -0
  213. package/dist/ionic/svg/flask-sharp.svg +1 -0
  214. package/dist/ionic/svg/flask.svg +1 -0
  215. package/dist/ionic/svg/flower-outline.svg +1 -0
  216. package/dist/ionic/svg/flower-sharp.svg +1 -0
  217. package/dist/ionic/svg/flower.svg +1 -0
  218. package/dist/ionic/svg/folder-open-outline.svg +1 -0
  219. package/dist/ionic/svg/folder-open-sharp.svg +1 -0
  220. package/dist/ionic/svg/folder-open.svg +1 -0
  221. package/dist/ionic/svg/folder-outline.svg +1 -0
  222. package/dist/ionic/svg/folder-sharp.svg +1 -0
  223. package/dist/ionic/svg/folder.svg +1 -0
  224. package/dist/ionic/svg/football-outline.svg +1 -0
  225. package/dist/ionic/svg/football-sharp.svg +1 -0
  226. package/dist/ionic/svg/football.svg +1 -0
  227. package/dist/ionic/svg/footsteps-outline.svg +1 -0
  228. package/dist/ionic/svg/footsteps-sharp.svg +1 -0
  229. package/dist/ionic/svg/footsteps.svg +1 -0
  230. package/dist/ionic/svg/funnel-outline.svg +1 -0
  231. package/dist/ionic/svg/funnel-sharp.svg +1 -0
  232. package/dist/ionic/svg/funnel.svg +1 -0
  233. package/dist/ionic/svg/game-controller-outline.svg +1 -0
  234. package/dist/ionic/svg/game-controller-sharp.svg +1 -0
  235. package/dist/ionic/svg/game-controller.svg +1 -0
  236. package/dist/ionic/svg/gift-outline.svg +1 -0
  237. package/dist/ionic/svg/gift-sharp.svg +1 -0
  238. package/dist/ionic/svg/gift.svg +1 -0
  239. package/dist/ionic/svg/git-branch-outline.svg +1 -0
  240. package/dist/ionic/svg/git-branch-sharp.svg +1 -0
  241. package/dist/ionic/svg/git-branch.svg +1 -0
  242. package/dist/ionic/svg/git-commit-outline.svg +1 -0
  243. package/dist/ionic/svg/git-commit-sharp.svg +1 -0
  244. package/dist/ionic/svg/git-commit.svg +1 -0
  245. package/dist/ionic/svg/git-compare-outline.svg +1 -0
  246. package/dist/ionic/svg/git-compare-sharp.svg +1 -0
  247. package/dist/ionic/svg/git-compare.svg +1 -0
  248. package/dist/ionic/svg/git-merge-outline.svg +1 -0
  249. package/dist/ionic/svg/git-merge-sharp.svg +1 -0
  250. package/dist/ionic/svg/git-merge.svg +1 -0
  251. package/dist/ionic/svg/git-network-outline.svg +1 -0
  252. package/dist/ionic/svg/git-network-sharp.svg +1 -0
  253. package/dist/ionic/svg/git-network.svg +1 -0
  254. package/dist/ionic/svg/git-pull-request-outline.svg +1 -0
  255. package/dist/ionic/svg/git-pull-request-sharp.svg +1 -0
  256. package/dist/ionic/svg/git-pull-request.svg +1 -0
  257. package/dist/ionic/svg/glasses-outline.svg +1 -0
  258. package/dist/ionic/svg/glasses-sharp.svg +1 -0
  259. package/dist/ionic/svg/glasses.svg +1 -0
  260. package/dist/ionic/svg/globe-outline.svg +1 -0
  261. package/dist/ionic/svg/globe-sharp.svg +1 -0
  262. package/dist/ionic/svg/globe.svg +1 -0
  263. package/dist/ionic/svg/golf-outline.svg +1 -0
  264. package/dist/ionic/svg/golf-sharp.svg +1 -0
  265. package/dist/ionic/svg/golf.svg +1 -0
  266. package/dist/ionic/svg/grid-outline.svg +1 -0
  267. package/dist/ionic/svg/grid-sharp.svg +1 -0
  268. package/dist/ionic/svg/grid.svg +1 -0
  269. package/dist/ionic/svg/hammer-outline.svg +1 -0
  270. package/dist/ionic/svg/hammer-sharp.svg +1 -0
  271. package/dist/ionic/svg/hammer.svg +1 -0
  272. package/dist/ionic/svg/hand-left-outline.svg +1 -0
  273. package/dist/ionic/svg/hand-left-sharp.svg +1 -0
  274. package/dist/ionic/svg/hand-left.svg +1 -0
  275. package/dist/ionic/svg/hand-right-outline.svg +1 -0
  276. package/dist/ionic/svg/hand-right-sharp.svg +1 -0
  277. package/dist/ionic/svg/hand-right.svg +1 -0
  278. package/dist/ionic/svg/happy-outline.svg +1 -0
  279. package/dist/ionic/svg/happy-sharp.svg +1 -0
  280. package/dist/ionic/svg/happy.svg +1 -0
  281. package/dist/ionic/svg/hardware-chip-outline.svg +1 -0
  282. package/dist/ionic/svg/hardware-chip-sharp.svg +1 -0
  283. package/dist/ionic/svg/hardware-chip.svg +1 -0
  284. package/dist/ionic/svg/headset-outline.svg +1 -0
  285. package/dist/ionic/svg/headset-sharp.svg +1 -0
  286. package/dist/ionic/svg/headset.svg +1 -0
  287. package/dist/ionic/svg/heart-circle-outline.svg +1 -0
  288. package/dist/ionic/svg/heart-circle-sharp.svg +1 -0
  289. package/dist/ionic/svg/heart-circle.svg +1 -0
  290. package/dist/ionic/svg/heart-dislike-circle-outline.svg +1 -0
  291. package/dist/ionic/svg/heart-dislike-circle-sharp.svg +1 -0
  292. package/dist/ionic/svg/heart-dislike-circle.svg +1 -0
  293. package/dist/ionic/svg/heart-dislike-outline.svg +1 -0
  294. package/dist/ionic/svg/heart-dislike-sharp.svg +1 -0
  295. package/dist/ionic/svg/heart-dislike.svg +1 -0
  296. package/dist/ionic/svg/heart-half-outline.svg +1 -0
  297. package/dist/ionic/svg/heart-half-sharp.svg +1 -0
  298. package/dist/ionic/svg/heart-half.svg +1 -0
  299. package/dist/ionic/svg/heart-outline.svg +1 -0
  300. package/dist/ionic/svg/heart-sharp.svg +1 -0
  301. package/dist/ionic/svg/heart.svg +1 -0
  302. package/dist/ionic/svg/help-buoy-outline.svg +1 -0
  303. package/dist/ionic/svg/help-buoy-sharp.svg +1 -0
  304. package/dist/ionic/svg/help-buoy.svg +1 -0
  305. package/dist/ionic/svg/help-circle-outline.svg +1 -0
  306. package/dist/ionic/svg/help-circle-sharp.svg +1 -0
  307. package/dist/ionic/svg/help-circle.svg +1 -0
  308. package/dist/ionic/svg/help-outline.svg +1 -0
  309. package/dist/ionic/svg/help-sharp.svg +1 -0
  310. package/dist/ionic/svg/help.svg +1 -0
  311. package/dist/ionic/svg/home-outline.svg +1 -0
  312. package/dist/ionic/svg/home-sharp.svg +1 -0
  313. package/dist/ionic/svg/home.svg +1 -0
  314. package/dist/ionic/svg/hourglass-outline.svg +1 -0
  315. package/dist/ionic/svg/hourglass-sharp.svg +1 -0
  316. package/dist/ionic/svg/hourglass.svg +1 -0
  317. package/dist/ionic/svg/ice-cream-outline.svg +1 -0
  318. package/dist/ionic/svg/ice-cream-sharp.svg +1 -0
  319. package/dist/ionic/svg/ice-cream.svg +1 -0
  320. package/dist/ionic/svg/id-card-outline.svg +1 -0
  321. package/dist/ionic/svg/id-card-sharp.svg +1 -0
  322. package/dist/ionic/svg/id-card.svg +1 -0
  323. package/dist/ionic/svg/image-outline.svg +1 -0
  324. package/dist/ionic/svg/image-sharp.svg +1 -0
  325. package/dist/ionic/svg/image.svg +1 -0
  326. package/dist/ionic/svg/images-outline.svg +1 -0
  327. package/dist/ionic/svg/images-sharp.svg +1 -0
  328. package/dist/ionic/svg/images.svg +1 -0
  329. package/dist/ionic/svg/infinite-outline.svg +1 -0
  330. package/dist/ionic/svg/infinite-sharp.svg +1 -0
  331. package/dist/ionic/svg/infinite.svg +1 -0
  332. package/dist/ionic/svg/information-circle-outline.svg +1 -0
  333. package/dist/ionic/svg/information-circle-sharp.svg +1 -0
  334. package/dist/ionic/svg/information-circle.svg +1 -0
  335. package/dist/ionic/svg/information-outline.svg +1 -0
  336. package/dist/ionic/svg/information-sharp.svg +1 -0
  337. package/dist/ionic/svg/information.svg +1 -0
  338. package/dist/ionic/svg/invert-mode-outline.svg +1 -0
  339. package/dist/ionic/svg/invert-mode-sharp.svg +1 -0
  340. package/dist/ionic/svg/invert-mode.svg +1 -0
  341. package/dist/ionic/svg/journal-outline.svg +1 -0
  342. package/dist/ionic/svg/journal-sharp.svg +1 -0
  343. package/dist/ionic/svg/journal.svg +1 -0
  344. package/dist/ionic/svg/key-outline.svg +1 -0
  345. package/dist/ionic/svg/key-sharp.svg +1 -0
  346. package/dist/ionic/svg/key.svg +1 -0
  347. package/dist/ionic/svg/keypad-outline.svg +1 -0
  348. package/dist/ionic/svg/keypad-sharp.svg +1 -0
  349. package/dist/ionic/svg/keypad.svg +1 -0
  350. package/dist/ionic/svg/language-outline.svg +1 -0
  351. package/dist/ionic/svg/language-sharp.svg +1 -0
  352. package/dist/ionic/svg/language.svg +1 -0
  353. package/dist/ionic/svg/laptop-outline.svg +1 -0
  354. package/dist/ionic/svg/laptop-sharp.svg +1 -0
  355. package/dist/ionic/svg/laptop.svg +1 -0
  356. package/dist/ionic/svg/layers-outline.svg +1 -0
  357. package/dist/ionic/svg/layers-sharp.svg +1 -0
  358. package/dist/ionic/svg/layers.svg +1 -0
  359. package/dist/ionic/svg/leaf-outline.svg +1 -0
  360. package/dist/ionic/svg/leaf-sharp.svg +1 -0
  361. package/dist/ionic/svg/leaf.svg +1 -0
  362. package/dist/ionic/svg/library-outline.svg +1 -0
  363. package/dist/ionic/svg/library-sharp.svg +1 -0
  364. package/dist/ionic/svg/library.svg +1 -0
  365. package/dist/ionic/svg/link-outline.svg +1 -0
  366. package/dist/ionic/svg/link-sharp.svg +1 -0
  367. package/dist/ionic/svg/link.svg +1 -0
  368. package/dist/ionic/svg/list-circle-outline.svg +1 -0
  369. package/dist/ionic/svg/list-circle-sharp.svg +1 -0
  370. package/dist/ionic/svg/list-circle.svg +1 -0
  371. package/dist/ionic/svg/list-outline.svg +1 -0
  372. package/dist/ionic/svg/list-sharp.svg +1 -0
  373. package/dist/ionic/svg/list.svg +1 -0
  374. package/dist/ionic/svg/locate-outline.svg +1 -0
  375. package/dist/ionic/svg/locate-sharp.svg +1 -0
  376. package/dist/ionic/svg/locate.svg +1 -0
  377. package/dist/ionic/svg/location-outline.svg +1 -0
  378. package/dist/ionic/svg/location-sharp.svg +1 -0
  379. package/dist/ionic/svg/location.svg +1 -0
  380. package/dist/ionic/svg/lock-closed-outline.svg +1 -0
  381. package/dist/ionic/svg/lock-closed-sharp.svg +1 -0
  382. package/dist/ionic/svg/lock-closed.svg +1 -0
  383. package/dist/ionic/svg/lock-open-outline.svg +1 -0
  384. package/dist/ionic/svg/lock-open-sharp.svg +1 -0
  385. package/dist/ionic/svg/lock-open.svg +1 -0
  386. package/dist/ionic/svg/log-in-outline.svg +1 -0
  387. package/dist/ionic/svg/log-in-sharp.svg +1 -0
  388. package/dist/ionic/svg/log-in.svg +1 -0
  389. package/dist/ionic/svg/log-out-outline.svg +1 -0
  390. package/dist/ionic/svg/log-out-sharp.svg +1 -0
  391. package/dist/ionic/svg/log-out.svg +1 -0
  392. package/dist/ionic/svg/logo-alipay.svg +1 -0
  393. package/dist/ionic/svg/logo-amazon.svg +1 -0
  394. package/dist/ionic/svg/logo-amplify.svg +1 -0
  395. package/dist/ionic/svg/logo-android.svg +1 -0
  396. package/dist/ionic/svg/logo-angular.svg +1 -0
  397. package/dist/ionic/svg/logo-appflow.svg +1 -0
  398. package/dist/ionic/svg/logo-apple-appstore.svg +1 -0
  399. package/dist/ionic/svg/logo-apple-ar.svg +1 -0
  400. package/dist/ionic/svg/logo-apple.svg +1 -0
  401. package/dist/ionic/svg/logo-behance.svg +1 -0
  402. package/dist/ionic/svg/logo-bitbucket.svg +1 -0
  403. package/dist/ionic/svg/logo-bitcoin.svg +1 -0
  404. package/dist/ionic/svg/logo-buffer.svg +1 -0
  405. package/dist/ionic/svg/logo-capacitor.svg +1 -0
  406. package/dist/ionic/svg/logo-chrome.svg +1 -0
  407. package/dist/ionic/svg/logo-closed-captioning.svg +1 -0
  408. package/dist/ionic/svg/logo-codepen.svg +1 -0
  409. package/dist/ionic/svg/logo-css3.svg +1 -0
  410. package/dist/ionic/svg/logo-designernews.svg +1 -0
  411. package/dist/ionic/svg/logo-deviantart.svg +1 -0
  412. package/dist/ionic/svg/logo-discord.svg +1 -0
  413. package/dist/ionic/svg/logo-docker.svg +1 -0
  414. package/dist/ionic/svg/logo-dribbble.svg +1 -0
  415. package/dist/ionic/svg/logo-dropbox.svg +1 -0
  416. package/dist/ionic/svg/logo-edge.svg +1 -0
  417. package/dist/ionic/svg/logo-electron.svg +1 -0
  418. package/dist/ionic/svg/logo-euro.svg +1 -0
  419. package/dist/ionic/svg/logo-facebook.svg +1 -0
  420. package/dist/ionic/svg/logo-figma.svg +1 -0
  421. package/dist/ionic/svg/logo-firebase.svg +1 -0
  422. package/dist/ionic/svg/logo-firefox.svg +1 -0
  423. package/dist/ionic/svg/logo-flickr.svg +1 -0
  424. package/dist/ionic/svg/logo-foursquare.svg +1 -0
  425. package/dist/ionic/svg/logo-github.svg +1 -0
  426. package/dist/ionic/svg/logo-gitlab.svg +1 -0
  427. package/dist/ionic/svg/logo-google-playstore.svg +1 -0
  428. package/dist/ionic/svg/logo-google.svg +1 -0
  429. package/dist/ionic/svg/logo-hackernews.svg +1 -0
  430. package/dist/ionic/svg/logo-html5.svg +1 -0
  431. package/dist/ionic/svg/logo-instagram.svg +1 -0
  432. package/dist/ionic/svg/logo-ionic.svg +1 -0
  433. package/dist/ionic/svg/logo-ionitron.svg +1 -0
  434. package/dist/ionic/svg/logo-javascript.svg +1 -0
  435. package/dist/ionic/svg/logo-laravel.svg +1 -0
  436. package/dist/ionic/svg/logo-linkedin.svg +1 -0
  437. package/dist/ionic/svg/logo-markdown.svg +1 -0
  438. package/dist/ionic/svg/logo-mastodon.svg +1 -0
  439. package/dist/ionic/svg/logo-medium.svg +1 -0
  440. package/dist/ionic/svg/logo-microsoft.svg +1 -0
  441. package/dist/ionic/svg/logo-no-smoking.svg +1 -0
  442. package/dist/ionic/svg/logo-nodejs.svg +1 -0
  443. package/dist/ionic/svg/logo-npm.svg +1 -0
  444. package/dist/ionic/svg/logo-octocat.svg +1 -0
  445. package/dist/ionic/svg/logo-paypal.svg +1 -0
  446. package/dist/ionic/svg/logo-pinterest.svg +1 -0
  447. package/dist/ionic/svg/logo-playstation.svg +1 -0
  448. package/dist/ionic/svg/logo-pwa.svg +1 -0
  449. package/dist/ionic/svg/logo-python.svg +1 -0
  450. package/dist/ionic/svg/logo-react.svg +1 -0
  451. package/dist/ionic/svg/logo-reddit.svg +1 -0
  452. package/dist/ionic/svg/logo-rss.svg +1 -0
  453. package/dist/ionic/svg/logo-sass.svg +1 -0
  454. package/dist/ionic/svg/logo-skype.svg +1 -0
  455. package/dist/ionic/svg/logo-slack.svg +1 -0
  456. package/dist/ionic/svg/logo-snapchat.svg +1 -0
  457. package/dist/ionic/svg/logo-soundcloud.svg +1 -0
  458. package/dist/ionic/svg/logo-stackoverflow.svg +1 -0
  459. package/dist/ionic/svg/logo-steam.svg +1 -0
  460. package/dist/ionic/svg/logo-stencil.svg +1 -0
  461. package/dist/ionic/svg/logo-tableau.svg +1 -0
  462. package/dist/ionic/svg/logo-threads.svg +1 -0
  463. package/dist/ionic/svg/logo-tiktok.svg +1 -0
  464. package/dist/ionic/svg/logo-trapeze.svg +1 -0
  465. package/dist/ionic/svg/logo-tumblr.svg +1 -0
  466. package/dist/ionic/svg/logo-tux.svg +1 -0
  467. package/dist/ionic/svg/logo-twitch.svg +1 -0
  468. package/dist/ionic/svg/logo-twitter.svg +1 -0
  469. package/dist/ionic/svg/logo-usd.svg +1 -0
  470. package/dist/ionic/svg/logo-venmo.svg +1 -0
  471. package/dist/ionic/svg/logo-vercel.svg +1 -0
  472. package/dist/ionic/svg/logo-vimeo.svg +1 -0
  473. package/dist/ionic/svg/logo-vk.svg +1 -0
  474. package/dist/ionic/svg/logo-vue.svg +1 -0
  475. package/dist/ionic/svg/logo-web-component.svg +1 -0
  476. package/dist/ionic/svg/logo-wechat.svg +1 -0
  477. package/dist/ionic/svg/logo-whatsapp.svg +1 -0
  478. package/dist/ionic/svg/logo-windows.svg +1 -0
  479. package/dist/ionic/svg/logo-wordpress.svg +1 -0
  480. package/dist/ionic/svg/logo-x.svg +1 -0
  481. package/dist/ionic/svg/logo-xbox.svg +1 -0
  482. package/dist/ionic/svg/logo-xing.svg +1 -0
  483. package/dist/ionic/svg/logo-yahoo.svg +1 -0
  484. package/dist/ionic/svg/logo-yen.svg +1 -0
  485. package/dist/ionic/svg/logo-youtube.svg +1 -0
  486. package/dist/ionic/svg/magnet-outline.svg +1 -0
  487. package/dist/ionic/svg/magnet-sharp.svg +1 -0
  488. package/dist/ionic/svg/magnet.svg +1 -0
  489. package/dist/ionic/svg/mail-open-outline.svg +1 -0
  490. package/dist/ionic/svg/mail-open-sharp.svg +1 -0
  491. package/dist/ionic/svg/mail-open.svg +1 -0
  492. package/dist/ionic/svg/mail-outline.svg +1 -0
  493. package/dist/ionic/svg/mail-sharp.svg +1 -0
  494. package/dist/ionic/svg/mail-unread-outline.svg +1 -0
  495. package/dist/ionic/svg/mail-unread-sharp.svg +1 -0
  496. package/dist/ionic/svg/mail-unread.svg +1 -0
  497. package/dist/ionic/svg/mail.svg +1 -0
  498. package/dist/ionic/svg/male-female-outline.svg +1 -0
  499. package/dist/ionic/svg/male-female-sharp.svg +1 -0
  500. package/dist/ionic/svg/male-female.svg +1 -0
  501. package/dist/ionic/svg/male-outline.svg +1 -0
  502. package/dist/ionic/svg/male-sharp.svg +1 -0
  503. package/dist/ionic/svg/male.svg +1 -0
  504. package/dist/ionic/svg/man-outline.svg +1 -0
  505. package/dist/ionic/svg/man-sharp.svg +1 -0
  506. package/dist/ionic/svg/man.svg +1 -0
  507. package/dist/ionic/svg/map-outline.svg +1 -0
  508. package/dist/ionic/svg/map-sharp.svg +1 -0
  509. package/dist/ionic/svg/map.svg +1 -0
  510. package/dist/ionic/svg/medal-outline.svg +1 -0
  511. package/dist/ionic/svg/medal-sharp.svg +1 -0
  512. package/dist/ionic/svg/medal.svg +1 -0
  513. package/dist/ionic/svg/medical-outline.svg +1 -0
  514. package/dist/ionic/svg/medical-sharp.svg +1 -0
  515. package/dist/ionic/svg/medical.svg +1 -0
  516. package/dist/ionic/svg/medkit-outline.svg +1 -0
  517. package/dist/ionic/svg/medkit-sharp.svg +1 -0
  518. package/dist/ionic/svg/medkit.svg +1 -0
  519. package/dist/ionic/svg/megaphone-outline.svg +1 -0
  520. package/dist/ionic/svg/megaphone-sharp.svg +1 -0
  521. package/dist/ionic/svg/megaphone.svg +1 -0
  522. package/dist/ionic/svg/menu-outline.svg +1 -0
  523. package/dist/ionic/svg/menu-sharp.svg +1 -0
  524. package/dist/ionic/svg/menu.svg +1 -0
  525. package/dist/ionic/svg/mic-circle-outline.svg +1 -0
  526. package/dist/ionic/svg/mic-circle-sharp.svg +1 -0
  527. package/dist/ionic/svg/mic-circle.svg +1 -0
  528. package/dist/ionic/svg/mic-off-circle-outline.svg +1 -0
  529. package/dist/ionic/svg/mic-off-circle-sharp.svg +1 -0
  530. package/dist/ionic/svg/mic-off-circle.svg +1 -0
  531. package/dist/ionic/svg/mic-off-outline.svg +1 -0
  532. package/dist/ionic/svg/mic-off-sharp.svg +1 -0
  533. package/dist/ionic/svg/mic-off.svg +1 -0
  534. package/dist/ionic/svg/mic-outline.svg +1 -0
  535. package/dist/ionic/svg/mic-sharp.svg +1 -0
  536. package/dist/ionic/svg/mic.svg +1 -0
  537. package/dist/ionic/svg/moon-outline.svg +1 -0
  538. package/dist/ionic/svg/moon-sharp.svg +1 -0
  539. package/dist/ionic/svg/moon.svg +1 -0
  540. package/dist/ionic/svg/move-outline.svg +1 -0
  541. package/dist/ionic/svg/move-sharp.svg +1 -0
  542. package/dist/ionic/svg/move.svg +1 -0
  543. package/dist/ionic/svg/musical-note-outline.svg +1 -0
  544. package/dist/ionic/svg/musical-note-sharp.svg +1 -0
  545. package/dist/ionic/svg/musical-note.svg +1 -0
  546. package/dist/ionic/svg/musical-notes-outline.svg +1 -0
  547. package/dist/ionic/svg/musical-notes-sharp.svg +1 -0
  548. package/dist/ionic/svg/musical-notes.svg +1 -0
  549. package/dist/ionic/svg/navigate-circle-outline.svg +1 -0
  550. package/dist/ionic/svg/navigate-circle-sharp.svg +1 -0
  551. package/dist/ionic/svg/navigate-circle.svg +1 -0
  552. package/dist/ionic/svg/navigate-outline.svg +1 -0
  553. package/dist/ionic/svg/navigate-sharp.svg +1 -0
  554. package/dist/ionic/svg/navigate.svg +1 -0
  555. package/dist/ionic/svg/newspaper-outline.svg +1 -0
  556. package/dist/ionic/svg/newspaper-sharp.svg +1 -0
  557. package/dist/ionic/svg/newspaper.svg +1 -0
  558. package/dist/ionic/svg/notifications-circle-outline.svg +1 -0
  559. package/dist/ionic/svg/notifications-circle-sharp.svg +1 -0
  560. package/dist/ionic/svg/notifications-circle.svg +1 -0
  561. package/dist/ionic/svg/notifications-off-circle-outline.svg +1 -0
  562. package/dist/ionic/svg/notifications-off-circle-sharp.svg +1 -0
  563. package/dist/ionic/svg/notifications-off-circle.svg +1 -0
  564. package/dist/ionic/svg/notifications-off-outline.svg +1 -0
  565. package/dist/ionic/svg/notifications-off-sharp.svg +1 -0
  566. package/dist/ionic/svg/notifications-off.svg +1 -0
  567. package/dist/ionic/svg/notifications-outline.svg +1 -0
  568. package/dist/ionic/svg/notifications-sharp.svg +1 -0
  569. package/dist/ionic/svg/notifications.svg +1 -0
  570. package/dist/ionic/svg/nuclear-outline.svg +1 -0
  571. package/dist/ionic/svg/nuclear-sharp.svg +1 -0
  572. package/dist/ionic/svg/nuclear.svg +1 -0
  573. package/dist/ionic/svg/nutrition-outline.svg +1 -0
  574. package/dist/ionic/svg/nutrition-sharp.svg +1 -0
  575. package/dist/ionic/svg/nutrition.svg +1 -0
  576. package/dist/ionic/svg/open-outline.svg +1 -0
  577. package/dist/ionic/svg/open-sharp.svg +1 -0
  578. package/dist/ionic/svg/open.svg +1 -0
  579. package/dist/ionic/svg/options-outline.svg +1 -0
  580. package/dist/ionic/svg/options-sharp.svg +1 -0
  581. package/dist/ionic/svg/options.svg +1 -0
  582. package/dist/ionic/svg/paper-plane-outline.svg +1 -0
  583. package/dist/ionic/svg/paper-plane-sharp.svg +1 -0
  584. package/dist/ionic/svg/paper-plane.svg +1 -0
  585. package/dist/ionic/svg/partly-sunny-outline.svg +1 -0
  586. package/dist/ionic/svg/partly-sunny-sharp.svg +1 -0
  587. package/dist/ionic/svg/partly-sunny.svg +1 -0
  588. package/dist/ionic/svg/pause-circle-outline.svg +1 -0
  589. package/dist/ionic/svg/pause-circle-sharp.svg +1 -0
  590. package/dist/ionic/svg/pause-circle.svg +1 -0
  591. package/dist/ionic/svg/pause-outline.svg +1 -0
  592. package/dist/ionic/svg/pause-sharp.svg +1 -0
  593. package/dist/ionic/svg/pause.svg +1 -0
  594. package/dist/ionic/svg/paw-outline.svg +1 -0
  595. package/dist/ionic/svg/paw-sharp.svg +1 -0
  596. package/dist/ionic/svg/paw.svg +1 -0
  597. package/dist/ionic/svg/pencil-outline.svg +1 -0
  598. package/dist/ionic/svg/pencil-sharp.svg +1 -0
  599. package/dist/ionic/svg/pencil.svg +1 -0
  600. package/dist/ionic/svg/people-circle-outline.svg +1 -0
  601. package/dist/ionic/svg/people-circle-sharp.svg +1 -0
  602. package/dist/ionic/svg/people-circle.svg +1 -0
  603. package/dist/ionic/svg/people-outline.svg +1 -0
  604. package/dist/ionic/svg/people-sharp.svg +1 -0
  605. package/dist/ionic/svg/people.svg +1 -0
  606. package/dist/ionic/svg/person-add-outline.svg +1 -0
  607. package/dist/ionic/svg/person-add-sharp.svg +1 -0
  608. package/dist/ionic/svg/person-add.svg +1 -0
  609. package/dist/ionic/svg/person-circle-outline.svg +1 -0
  610. package/dist/ionic/svg/person-circle-sharp.svg +1 -0
  611. package/dist/ionic/svg/person-circle.svg +1 -0
  612. package/dist/ionic/svg/person-outline.svg +1 -0
  613. package/dist/ionic/svg/person-remove-outline.svg +1 -0
  614. package/dist/ionic/svg/person-remove-sharp.svg +1 -0
  615. package/dist/ionic/svg/person-remove.svg +1 -0
  616. package/dist/ionic/svg/person-sharp.svg +1 -0
  617. package/dist/ionic/svg/person.svg +1 -0
  618. package/dist/ionic/svg/phone-landscape-outline.svg +1 -0
  619. package/dist/ionic/svg/phone-landscape-sharp.svg +1 -0
  620. package/dist/ionic/svg/phone-landscape.svg +1 -0
  621. package/dist/ionic/svg/phone-portrait-outline.svg +1 -0
  622. package/dist/ionic/svg/phone-portrait-sharp.svg +1 -0
  623. package/dist/ionic/svg/phone-portrait.svg +1 -0
  624. package/dist/ionic/svg/pie-chart-outline.svg +1 -0
  625. package/dist/ionic/svg/pie-chart-sharp.svg +1 -0
  626. package/dist/ionic/svg/pie-chart.svg +1 -0
  627. package/dist/ionic/svg/pin-outline.svg +1 -0
  628. package/dist/ionic/svg/pin-sharp.svg +1 -0
  629. package/dist/ionic/svg/pin.svg +1 -0
  630. package/dist/ionic/svg/pint-outline.svg +1 -0
  631. package/dist/ionic/svg/pint-sharp.svg +1 -0
  632. package/dist/ionic/svg/pint.svg +1 -0
  633. package/dist/ionic/svg/pizza-outline.svg +1 -0
  634. package/dist/ionic/svg/pizza-sharp.svg +1 -0
  635. package/dist/ionic/svg/pizza.svg +1 -0
  636. package/dist/ionic/svg/planet-outline.svg +1 -0
  637. package/dist/ionic/svg/planet-sharp.svg +1 -0
  638. package/dist/ionic/svg/planet.svg +1 -0
  639. package/dist/ionic/svg/play-back-circle-outline.svg +1 -0
  640. package/dist/ionic/svg/play-back-circle-sharp.svg +1 -0
  641. package/dist/ionic/svg/play-back-circle.svg +1 -0
  642. package/dist/ionic/svg/play-back-outline.svg +1 -0
  643. package/dist/ionic/svg/play-back-sharp.svg +1 -0
  644. package/dist/ionic/svg/play-back.svg +1 -0
  645. package/dist/ionic/svg/play-circle-outline.svg +1 -0
  646. package/dist/ionic/svg/play-circle-sharp.svg +1 -0
  647. package/dist/ionic/svg/play-circle.svg +1 -0
  648. package/dist/ionic/svg/play-forward-circle-outline.svg +1 -0
  649. package/dist/ionic/svg/play-forward-circle-sharp.svg +1 -0
  650. package/dist/ionic/svg/play-forward-circle.svg +1 -0
  651. package/dist/ionic/svg/play-forward-outline.svg +1 -0
  652. package/dist/ionic/svg/play-forward-sharp.svg +1 -0
  653. package/dist/ionic/svg/play-forward.svg +1 -0
  654. package/dist/ionic/svg/play-outline.svg +1 -0
  655. package/dist/ionic/svg/play-sharp.svg +1 -0
  656. package/dist/ionic/svg/play-skip-back-circle-outline.svg +1 -0
  657. package/dist/ionic/svg/play-skip-back-circle-sharp.svg +1 -0
  658. package/dist/ionic/svg/play-skip-back-circle.svg +1 -0
  659. package/dist/ionic/svg/play-skip-back-outline.svg +1 -0
  660. package/dist/ionic/svg/play-skip-back-sharp.svg +1 -0
  661. package/dist/ionic/svg/play-skip-back.svg +1 -0
  662. package/dist/ionic/svg/play-skip-forward-circle-outline.svg +1 -0
  663. package/dist/ionic/svg/play-skip-forward-circle-sharp.svg +1 -0
  664. package/dist/ionic/svg/play-skip-forward-circle.svg +1 -0
  665. package/dist/ionic/svg/play-skip-forward-outline.svg +1 -0
  666. package/dist/ionic/svg/play-skip-forward-sharp.svg +1 -0
  667. package/dist/ionic/svg/play-skip-forward.svg +1 -0
  668. package/dist/ionic/svg/play.svg +1 -0
  669. package/dist/ionic/svg/podium-outline.svg +1 -0
  670. package/dist/ionic/svg/podium-sharp.svg +1 -0
  671. package/dist/ionic/svg/podium.svg +1 -0
  672. package/dist/ionic/svg/power-outline.svg +1 -0
  673. package/dist/ionic/svg/power-sharp.svg +1 -0
  674. package/dist/ionic/svg/power.svg +1 -0
  675. package/dist/ionic/svg/pricetag-outline.svg +1 -0
  676. package/dist/ionic/svg/pricetag-sharp.svg +1 -0
  677. package/dist/ionic/svg/pricetag.svg +1 -0
  678. package/dist/ionic/svg/pricetags-outline.svg +1 -0
  679. package/dist/ionic/svg/pricetags-sharp.svg +1 -0
  680. package/dist/ionic/svg/pricetags.svg +1 -0
  681. package/dist/ionic/svg/print-outline.svg +1 -0
  682. package/dist/ionic/svg/print-sharp.svg +1 -0
  683. package/dist/ionic/svg/print.svg +1 -0
  684. package/dist/ionic/svg/prism-outline.svg +1 -0
  685. package/dist/ionic/svg/prism-sharp.svg +1 -0
  686. package/dist/ionic/svg/prism.svg +1 -0
  687. package/dist/ionic/svg/pulse-outline.svg +1 -0
  688. package/dist/ionic/svg/pulse-sharp.svg +1 -0
  689. package/dist/ionic/svg/pulse.svg +1 -0
  690. package/dist/ionic/svg/push-outline.svg +1 -0
  691. package/dist/ionic/svg/push-sharp.svg +1 -0
  692. package/dist/ionic/svg/push.svg +1 -0
  693. package/dist/ionic/svg/qr-code-outline.svg +1 -0
  694. package/dist/ionic/svg/qr-code-sharp.svg +1 -0
  695. package/dist/ionic/svg/qr-code.svg +1 -0
  696. package/dist/ionic/svg/radio-button-off-outline.svg +1 -0
  697. package/dist/ionic/svg/radio-button-off-sharp.svg +1 -0
  698. package/dist/ionic/svg/radio-button-off.svg +1 -0
  699. package/dist/ionic/svg/radio-button-on-outline.svg +1 -0
  700. package/dist/ionic/svg/radio-button-on-sharp.svg +1 -0
  701. package/dist/ionic/svg/radio-button-on.svg +1 -0
  702. package/dist/ionic/svg/radio-outline.svg +1 -0
  703. package/dist/ionic/svg/radio-sharp.svg +1 -0
  704. package/dist/ionic/svg/radio.svg +1 -0
  705. package/dist/ionic/svg/rainy-outline.svg +1 -0
  706. package/dist/ionic/svg/rainy-sharp.svg +1 -0
  707. package/dist/ionic/svg/rainy.svg +1 -0
  708. package/dist/ionic/svg/reader-outline.svg +1 -0
  709. package/dist/ionic/svg/reader-sharp.svg +1 -0
  710. package/dist/ionic/svg/reader.svg +1 -0
  711. package/dist/ionic/svg/receipt-outline.svg +1 -0
  712. package/dist/ionic/svg/receipt-sharp.svg +1 -0
  713. package/dist/ionic/svg/receipt.svg +1 -0
  714. package/dist/ionic/svg/recording-outline.svg +1 -0
  715. package/dist/ionic/svg/recording-sharp.svg +1 -0
  716. package/dist/ionic/svg/recording.svg +1 -0
  717. package/dist/ionic/svg/refresh-circle-outline.svg +1 -0
  718. package/dist/ionic/svg/refresh-circle-sharp.svg +1 -0
  719. package/dist/ionic/svg/refresh-circle.svg +1 -0
  720. package/dist/ionic/svg/refresh-outline.svg +1 -0
  721. package/dist/ionic/svg/refresh-sharp.svg +1 -0
  722. package/dist/ionic/svg/refresh.svg +1 -0
  723. package/dist/ionic/svg/reload-circle-outline.svg +1 -0
  724. package/dist/ionic/svg/reload-circle-sharp.svg +1 -0
  725. package/dist/ionic/svg/reload-circle.svg +1 -0
  726. package/dist/ionic/svg/reload-outline.svg +1 -0
  727. package/dist/ionic/svg/reload-sharp.svg +1 -0
  728. package/dist/ionic/svg/reload.svg +1 -0
  729. package/dist/ionic/svg/remove-circle-outline.svg +1 -0
  730. package/dist/ionic/svg/remove-circle-sharp.svg +1 -0
  731. package/dist/ionic/svg/remove-circle.svg +1 -0
  732. package/dist/ionic/svg/remove-outline.svg +1 -0
  733. package/dist/ionic/svg/remove-sharp.svg +1 -0
  734. package/dist/ionic/svg/remove.svg +1 -0
  735. package/dist/ionic/svg/reorder-four-outline.svg +1 -0
  736. package/dist/ionic/svg/reorder-four-sharp.svg +1 -0
  737. package/dist/ionic/svg/reorder-four.svg +1 -0
  738. package/dist/ionic/svg/reorder-three-outline.svg +1 -0
  739. package/dist/ionic/svg/reorder-three-sharp.svg +1 -0
  740. package/dist/ionic/svg/reorder-three.svg +1 -0
  741. package/dist/ionic/svg/reorder-two-outline.svg +1 -0
  742. package/dist/ionic/svg/reorder-two-sharp.svg +1 -0
  743. package/dist/ionic/svg/reorder-two.svg +1 -0
  744. package/dist/ionic/svg/repeat-outline.svg +1 -0
  745. package/dist/ionic/svg/repeat-sharp.svg +1 -0
  746. package/dist/ionic/svg/repeat.svg +1 -0
  747. package/dist/ionic/svg/resize-outline.svg +1 -0
  748. package/dist/ionic/svg/resize-sharp.svg +1 -0
  749. package/dist/ionic/svg/resize.svg +1 -0
  750. package/dist/ionic/svg/restaurant-outline.svg +1 -0
  751. package/dist/ionic/svg/restaurant-sharp.svg +1 -0
  752. package/dist/ionic/svg/restaurant.svg +1 -0
  753. package/dist/ionic/svg/return-down-back-outline.svg +1 -0
  754. package/dist/ionic/svg/return-down-back-sharp.svg +1 -0
  755. package/dist/ionic/svg/return-down-back.svg +1 -0
  756. package/dist/ionic/svg/return-down-forward-outline.svg +1 -0
  757. package/dist/ionic/svg/return-down-forward-sharp.svg +1 -0
  758. package/dist/ionic/svg/return-down-forward.svg +1 -0
  759. package/dist/ionic/svg/return-up-back-outline.svg +1 -0
  760. package/dist/ionic/svg/return-up-back-sharp.svg +1 -0
  761. package/dist/ionic/svg/return-up-back.svg +1 -0
  762. package/dist/ionic/svg/return-up-forward-outline.svg +1 -0
  763. package/dist/ionic/svg/return-up-forward-sharp.svg +1 -0
  764. package/dist/ionic/svg/return-up-forward.svg +1 -0
  765. package/dist/ionic/svg/ribbon-outline.svg +1 -0
  766. package/dist/ionic/svg/ribbon-sharp.svg +1 -0
  767. package/dist/ionic/svg/ribbon.svg +1 -0
  768. package/dist/ionic/svg/rocket-outline.svg +1 -0
  769. package/dist/ionic/svg/rocket-sharp.svg +1 -0
  770. package/dist/ionic/svg/rocket.svg +1 -0
  771. package/dist/ionic/svg/rose-outline.svg +1 -0
  772. package/dist/ionic/svg/rose-sharp.svg +1 -0
  773. package/dist/ionic/svg/rose.svg +1 -0
  774. package/dist/ionic/svg/sad-outline.svg +1 -0
  775. package/dist/ionic/svg/sad-sharp.svg +1 -0
  776. package/dist/ionic/svg/sad.svg +1 -0
  777. package/dist/ionic/svg/save-outline.svg +1 -0
  778. package/dist/ionic/svg/save-sharp.svg +1 -0
  779. package/dist/ionic/svg/save.svg +1 -0
  780. package/dist/ionic/svg/scale-outline.svg +1 -0
  781. package/dist/ionic/svg/scale-sharp.svg +1 -0
  782. package/dist/ionic/svg/scale.svg +1 -0
  783. package/dist/ionic/svg/scan-circle-outline.svg +1 -0
  784. package/dist/ionic/svg/scan-circle-sharp.svg +1 -0
  785. package/dist/ionic/svg/scan-circle.svg +1 -0
  786. package/dist/ionic/svg/scan-outline.svg +1 -0
  787. package/dist/ionic/svg/scan-sharp.svg +1 -0
  788. package/dist/ionic/svg/scan.svg +1 -0
  789. package/dist/ionic/svg/school-outline.svg +1 -0
  790. package/dist/ionic/svg/school-sharp.svg +1 -0
  791. package/dist/ionic/svg/school.svg +1 -0
  792. package/dist/ionic/svg/search-circle-outline.svg +1 -0
  793. package/dist/ionic/svg/search-circle-sharp.svg +1 -0
  794. package/dist/ionic/svg/search-circle.svg +1 -0
  795. package/dist/ionic/svg/search-outline.svg +1 -0
  796. package/dist/ionic/svg/search-sharp.svg +1 -0
  797. package/dist/ionic/svg/search.svg +1 -0
  798. package/dist/ionic/svg/send-outline.svg +1 -0
  799. package/dist/ionic/svg/send-sharp.svg +1 -0
  800. package/dist/ionic/svg/send.svg +1 -0
  801. package/dist/ionic/svg/server-outline.svg +1 -0
  802. package/dist/ionic/svg/server-sharp.svg +1 -0
  803. package/dist/ionic/svg/server.svg +1 -0
  804. package/dist/ionic/svg/settings-outline.svg +1 -0
  805. package/dist/ionic/svg/settings-sharp.svg +1 -0
  806. package/dist/ionic/svg/settings.svg +1 -0
  807. package/dist/ionic/svg/shapes-outline.svg +1 -0
  808. package/dist/ionic/svg/shapes-sharp.svg +1 -0
  809. package/dist/ionic/svg/shapes.svg +1 -0
  810. package/dist/ionic/svg/share-outline.svg +1 -0
  811. package/dist/ionic/svg/share-sharp.svg +1 -0
  812. package/dist/ionic/svg/share-social-outline.svg +1 -0
  813. package/dist/ionic/svg/share-social-sharp.svg +1 -0
  814. package/dist/ionic/svg/share-social.svg +1 -0
  815. package/dist/ionic/svg/share.svg +1 -0
  816. package/dist/ionic/svg/shield-checkmark-outline.svg +1 -0
  817. package/dist/ionic/svg/shield-checkmark-sharp.svg +1 -0
  818. package/dist/ionic/svg/shield-checkmark.svg +1 -0
  819. package/dist/ionic/svg/shield-half-outline.svg +1 -0
  820. package/dist/ionic/svg/shield-half-sharp.svg +1 -0
  821. package/dist/ionic/svg/shield-half.svg +1 -0
  822. package/dist/ionic/svg/shield-outline.svg +1 -0
  823. package/dist/ionic/svg/shield-sharp.svg +1 -0
  824. package/dist/ionic/svg/shield.svg +1 -0
  825. package/dist/ionic/svg/shirt-outline.svg +1 -0
  826. package/dist/ionic/svg/shirt-sharp.svg +1 -0
  827. package/dist/ionic/svg/shirt.svg +1 -0
  828. package/dist/ionic/svg/shuffle-outline.svg +1 -0
  829. package/dist/ionic/svg/shuffle-sharp.svg +1 -0
  830. package/dist/ionic/svg/shuffle.svg +1 -0
  831. package/dist/ionic/svg/skull-outline.svg +1 -0
  832. package/dist/ionic/svg/skull-sharp.svg +1 -0
  833. package/dist/ionic/svg/skull.svg +1 -0
  834. package/dist/ionic/svg/snow-outline.svg +1 -0
  835. package/dist/ionic/svg/snow-sharp.svg +1 -0
  836. package/dist/ionic/svg/snow.svg +1 -0
  837. package/dist/ionic/svg/sparkles-outline.svg +1 -0
  838. package/dist/ionic/svg/sparkles-sharp.svg +1 -0
  839. package/dist/ionic/svg/sparkles.svg +1 -0
  840. package/dist/ionic/svg/speedometer-outline.svg +1 -0
  841. package/dist/ionic/svg/speedometer-sharp.svg +1 -0
  842. package/dist/ionic/svg/speedometer.svg +1 -0
  843. package/dist/ionic/svg/square-outline.svg +1 -0
  844. package/dist/ionic/svg/square-sharp.svg +1 -0
  845. package/dist/ionic/svg/square.svg +1 -0
  846. package/dist/ionic/svg/star-half-outline.svg +1 -0
  847. package/dist/ionic/svg/star-half-sharp.svg +1 -0
  848. package/dist/ionic/svg/star-half.svg +1 -0
  849. package/dist/ionic/svg/star-outline.svg +1 -0
  850. package/dist/ionic/svg/star-sharp.svg +1 -0
  851. package/dist/ionic/svg/star.svg +1 -0
  852. package/dist/ionic/svg/stats-chart-outline.svg +1 -0
  853. package/dist/ionic/svg/stats-chart-sharp.svg +1 -0
  854. package/dist/ionic/svg/stats-chart.svg +1 -0
  855. package/dist/ionic/svg/stop-circle-outline.svg +1 -0
  856. package/dist/ionic/svg/stop-circle-sharp.svg +1 -0
  857. package/dist/ionic/svg/stop-circle.svg +1 -0
  858. package/dist/ionic/svg/stop-outline.svg +1 -0
  859. package/dist/ionic/svg/stop-sharp.svg +1 -0
  860. package/dist/ionic/svg/stop.svg +1 -0
  861. package/dist/ionic/svg/stopwatch-outline.svg +1 -0
  862. package/dist/ionic/svg/stopwatch-sharp.svg +1 -0
  863. package/dist/ionic/svg/stopwatch.svg +1 -0
  864. package/dist/ionic/svg/storefront-outline.svg +1 -0
  865. package/dist/ionic/svg/storefront-sharp.svg +1 -0
  866. package/dist/ionic/svg/storefront.svg +1 -0
  867. package/dist/ionic/svg/subway-outline.svg +1 -0
  868. package/dist/ionic/svg/subway-sharp.svg +1 -0
  869. package/dist/ionic/svg/subway.svg +1 -0
  870. package/dist/ionic/svg/sunny-outline.svg +1 -0
  871. package/dist/ionic/svg/sunny-sharp.svg +1 -0
  872. package/dist/ionic/svg/sunny.svg +1 -0
  873. package/dist/ionic/svg/swap-horizontal-outline.svg +1 -0
  874. package/dist/ionic/svg/swap-horizontal-sharp.svg +1 -0
  875. package/dist/ionic/svg/swap-horizontal.svg +1 -0
  876. package/dist/ionic/svg/swap-vertical-outline.svg +1 -0
  877. package/dist/ionic/svg/swap-vertical-sharp.svg +1 -0
  878. package/dist/ionic/svg/swap-vertical.svg +1 -0
  879. package/dist/ionic/svg/sync-circle-outline.svg +1 -0
  880. package/dist/ionic/svg/sync-circle-sharp.svg +1 -0
  881. package/dist/ionic/svg/sync-circle.svg +1 -0
  882. package/dist/ionic/svg/sync-outline.svg +1 -0
  883. package/dist/ionic/svg/sync-sharp.svg +1 -0
  884. package/dist/ionic/svg/sync.svg +1 -0
  885. package/dist/ionic/svg/tablet-landscape-outline.svg +1 -0
  886. package/dist/ionic/svg/tablet-landscape-sharp.svg +1 -0
  887. package/dist/ionic/svg/tablet-landscape.svg +1 -0
  888. package/dist/ionic/svg/tablet-portrait-outline.svg +1 -0
  889. package/dist/ionic/svg/tablet-portrait-sharp.svg +1 -0
  890. package/dist/ionic/svg/tablet-portrait.svg +1 -0
  891. package/dist/ionic/svg/telescope-outline.svg +1 -0
  892. package/dist/ionic/svg/telescope-sharp.svg +1 -0
  893. package/dist/ionic/svg/telescope.svg +1 -0
  894. package/dist/ionic/svg/tennisball-outline.svg +1 -0
  895. package/dist/ionic/svg/tennisball-sharp.svg +1 -0
  896. package/dist/ionic/svg/tennisball.svg +1 -0
  897. package/dist/ionic/svg/terminal-outline.svg +1 -0
  898. package/dist/ionic/svg/terminal-sharp.svg +1 -0
  899. package/dist/ionic/svg/terminal.svg +1 -0
  900. package/dist/ionic/svg/text-outline.svg +1 -0
  901. package/dist/ionic/svg/text-sharp.svg +1 -0
  902. package/dist/ionic/svg/text.svg +1 -0
  903. package/dist/ionic/svg/thermometer-outline.svg +1 -0
  904. package/dist/ionic/svg/thermometer-sharp.svg +1 -0
  905. package/dist/ionic/svg/thermometer.svg +1 -0
  906. package/dist/ionic/svg/thumbs-down-outline.svg +1 -0
  907. package/dist/ionic/svg/thumbs-down-sharp.svg +1 -0
  908. package/dist/ionic/svg/thumbs-down.svg +1 -0
  909. package/dist/ionic/svg/thumbs-up-outline.svg +1 -0
  910. package/dist/ionic/svg/thumbs-up-sharp.svg +1 -0
  911. package/dist/ionic/svg/thumbs-up.svg +1 -0
  912. package/dist/ionic/svg/thunderstorm-outline.svg +1 -0
  913. package/dist/ionic/svg/thunderstorm-sharp.svg +1 -0
  914. package/dist/ionic/svg/thunderstorm.svg +1 -0
  915. package/dist/ionic/svg/ticket-outline.svg +1 -0
  916. package/dist/ionic/svg/ticket-sharp.svg +1 -0
  917. package/dist/ionic/svg/ticket.svg +1 -0
  918. package/dist/ionic/svg/time-outline.svg +1 -0
  919. package/dist/ionic/svg/time-sharp.svg +1 -0
  920. package/dist/ionic/svg/time.svg +1 -0
  921. package/dist/ionic/svg/timer-outline.svg +1 -0
  922. package/dist/ionic/svg/timer-sharp.svg +1 -0
  923. package/dist/ionic/svg/timer.svg +1 -0
  924. package/dist/ionic/svg/today-outline.svg +1 -0
  925. package/dist/ionic/svg/today-sharp.svg +1 -0
  926. package/dist/ionic/svg/today.svg +1 -0
  927. package/dist/ionic/svg/toggle-outline.svg +1 -0
  928. package/dist/ionic/svg/toggle-sharp.svg +1 -0
  929. package/dist/ionic/svg/toggle.svg +1 -0
  930. package/dist/ionic/svg/trail-sign-outline.svg +1 -0
  931. package/dist/ionic/svg/trail-sign-sharp.svg +1 -0
  932. package/dist/ionic/svg/trail-sign.svg +1 -0
  933. package/dist/ionic/svg/train-outline.svg +1 -0
  934. package/dist/ionic/svg/train-sharp.svg +1 -0
  935. package/dist/ionic/svg/train.svg +1 -0
  936. package/dist/ionic/svg/transgender-outline.svg +1 -0
  937. package/dist/ionic/svg/transgender-sharp.svg +1 -0
  938. package/dist/ionic/svg/transgender.svg +1 -0
  939. package/dist/ionic/svg/trash-bin-outline.svg +1 -0
  940. package/dist/ionic/svg/trash-bin-sharp.svg +1 -0
  941. package/dist/ionic/svg/trash-bin.svg +1 -0
  942. package/dist/ionic/svg/trash-outline.svg +1 -0
  943. package/dist/ionic/svg/trash-sharp.svg +1 -0
  944. package/dist/ionic/svg/trash.svg +1 -0
  945. package/dist/ionic/svg/trending-down-outline.svg +1 -0
  946. package/dist/ionic/svg/trending-down-sharp.svg +1 -0
  947. package/dist/ionic/svg/trending-down.svg +1 -0
  948. package/dist/ionic/svg/trending-up-outline.svg +1 -0
  949. package/dist/ionic/svg/trending-up-sharp.svg +1 -0
  950. package/dist/ionic/svg/trending-up.svg +1 -0
  951. package/dist/ionic/svg/triangle-outline.svg +1 -0
  952. package/dist/ionic/svg/triangle-sharp.svg +1 -0
  953. package/dist/ionic/svg/triangle.svg +1 -0
  954. package/dist/ionic/svg/trophy-outline.svg +1 -0
  955. package/dist/ionic/svg/trophy-sharp.svg +1 -0
  956. package/dist/ionic/svg/trophy.svg +1 -0
  957. package/dist/ionic/svg/tv-outline.svg +1 -0
  958. package/dist/ionic/svg/tv-sharp.svg +1 -0
  959. package/dist/ionic/svg/tv.svg +1 -0
  960. package/dist/ionic/svg/umbrella-outline.svg +1 -0
  961. package/dist/ionic/svg/umbrella-sharp.svg +1 -0
  962. package/dist/ionic/svg/umbrella.svg +1 -0
  963. package/dist/ionic/svg/unlink-outline.svg +1 -0
  964. package/dist/ionic/svg/unlink-sharp.svg +1 -0
  965. package/dist/ionic/svg/unlink.svg +1 -0
  966. package/dist/ionic/svg/videocam-off-outline.svg +1 -0
  967. package/dist/ionic/svg/videocam-off-sharp.svg +1 -0
  968. package/dist/ionic/svg/videocam-off.svg +1 -0
  969. package/dist/ionic/svg/videocam-outline.svg +1 -0
  970. package/dist/ionic/svg/videocam-sharp.svg +1 -0
  971. package/dist/ionic/svg/videocam.svg +1 -0
  972. package/dist/ionic/svg/volume-high-outline.svg +1 -0
  973. package/dist/ionic/svg/volume-high-sharp.svg +1 -0
  974. package/dist/ionic/svg/volume-high.svg +1 -0
  975. package/dist/ionic/svg/volume-low-outline.svg +1 -0
  976. package/dist/ionic/svg/volume-low-sharp.svg +1 -0
  977. package/dist/ionic/svg/volume-low.svg +1 -0
  978. package/dist/ionic/svg/volume-medium-outline.svg +1 -0
  979. package/dist/ionic/svg/volume-medium-sharp.svg +1 -0
  980. package/dist/ionic/svg/volume-medium.svg +1 -0
  981. package/dist/ionic/svg/volume-mute-outline.svg +1 -0
  982. package/dist/ionic/svg/volume-mute-sharp.svg +1 -0
  983. package/dist/ionic/svg/volume-mute.svg +1 -0
  984. package/dist/ionic/svg/volume-off-outline.svg +1 -0
  985. package/dist/ionic/svg/volume-off-sharp.svg +1 -0
  986. package/dist/ionic/svg/volume-off.svg +1 -0
  987. package/dist/ionic/svg/walk-outline.svg +1 -0
  988. package/dist/ionic/svg/walk-sharp.svg +1 -0
  989. package/dist/ionic/svg/walk.svg +1 -0
  990. package/dist/ionic/svg/wallet-outline.svg +1 -0
  991. package/dist/ionic/svg/wallet-sharp.svg +1 -0
  992. package/dist/ionic/svg/wallet.svg +1 -0
  993. package/dist/ionic/svg/warning-outline.svg +1 -0
  994. package/dist/ionic/svg/warning-sharp.svg +1 -0
  995. package/dist/ionic/svg/warning.svg +1 -0
  996. package/dist/ionic/svg/watch-outline.svg +1 -0
  997. package/dist/ionic/svg/watch-sharp.svg +1 -0
  998. package/dist/ionic/svg/watch.svg +1 -0
  999. package/dist/ionic/svg/water-outline.svg +1 -0
  1000. package/dist/ionic/svg/water-sharp.svg +1 -0
  1001. package/dist/ionic/svg/water.svg +1 -0
  1002. package/dist/ionic/svg/wifi-outline.svg +1 -0
  1003. package/dist/ionic/svg/wifi-sharp.svg +1 -0
  1004. package/dist/ionic/svg/wifi.svg +1 -0
  1005. package/dist/ionic/svg/wine-outline.svg +1 -0
  1006. package/dist/ionic/svg/wine-sharp.svg +1 -0
  1007. package/dist/ionic/svg/wine.svg +1 -0
  1008. package/dist/ionic/svg/woman-outline.svg +1 -0
  1009. package/dist/ionic/svg/woman-sharp.svg +1 -0
  1010. package/dist/ionic/svg/woman.svg +1 -0
  1011. package/dist/types/components/accordion/accordion.d.ts +1 -1
  1012. package/dist/types/components/action-sheet/action-sheet.d.ts +37 -0
  1013. package/dist/types/components/checkbox/checkbox.d.ts +9 -1
  1014. package/dist/types/components/content/content.d.ts +7 -0
  1015. package/dist/types/components/datetime/datetime.d.ts +10 -0
  1016. package/dist/types/components/fab-button/fab-button.d.ts +1 -1
  1017. package/dist/types/components/item/item.d.ts +1 -1
  1018. package/dist/types/components/modal/modal.d.ts +14 -0
  1019. package/dist/types/components/popover/popover.d.ts +7 -0
  1020. package/dist/types/components/radio-group/radio-group.d.ts +9 -1
  1021. package/dist/types/components/select/select.d.ts +2 -2
  1022. package/dist/types/components/toggle/toggle.d.ts +7 -1
  1023. package/dist/types/components.d.ts +10 -6
  1024. package/dist/types/utils/forms/validity.d.ts +1 -1
  1025. package/hydrate/index.js +863 -451
  1026. package/hydrate/index.mjs +863 -451
  1027. package/package.json +10 -6
  1028. package/dist/ionic/p-4cc26913.entry.js +0 -4
  1029. package/dist/ionic/p-4efea47a.entry.js +0 -4
  1030. package/dist/ionic/p-510d86e1.entry.js +0 -4
  1031. package/dist/ionic/p-5fb517e4.entry.js +0 -4
  1032. package/dist/ionic/p-7bcfc421.entry.js +0 -4
  1033. package/dist/ionic/p-8bdfc8f6.entry.js +0 -4
  1034. package/dist/ionic/p-95bddd49.entry.js +0 -4
  1035. package/dist/ionic/p-D87hU-Ly.js +0 -4
  1036. package/dist/ionic/p-dc2e126d.entry.js +0 -4
  1037. package/dist/ionic/p-e16b69e1.entry.js +0 -4
  1038. package/dist/ionic/p-f65f9308.entry.js +0 -4
  1039. package/dist/ionic/p-fc278823.entry.js +0 -4
package/hydrate/index.js CHANGED
@@ -4451,7 +4451,7 @@ class Accordion {
4451
4451
  "value": [1],
4452
4452
  "disabled": [4],
4453
4453
  "readonly": [4],
4454
- "toggleIcon": [8, "toggle-icon"],
4454
+ "toggleIcon": [1, "toggle-icon"],
4455
4455
  "toggleIconSlot": [1, "toggle-icon-slot"],
4456
4456
  "state": [32],
4457
4457
  "isNext": [32],
@@ -5851,6 +5851,14 @@ const CoreDelegate = () => {
5851
5851
  let lastOverlayIndex = 0;
5852
5852
  let lastId = 0;
5853
5853
  const activeAnimations = new WeakMap();
5854
+ /**
5855
+ * Determines if the overlay's backdrop is always blocking (no background interaction).
5856
+ * Returns false if showBackdrop=false or backdropBreakpoint > 0.
5857
+ */
5858
+ const isBackdropAlwaysBlocking = (el) => {
5859
+ var _a;
5860
+ return el.showBackdrop !== false && !(((_a = el.backdropBreakpoint) !== null && _a !== void 0 ? _a : 0) > 0);
5861
+ };
5854
5862
  const createController = (tagName) => {
5855
5863
  return {
5856
5864
  create(options) {
@@ -6288,9 +6296,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
6288
6296
  */
6289
6297
  const overlayEl = overlay.el;
6290
6298
  const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
6291
- // Only lock out root content when backdrop is active. Developers relying on showBackdrop=false
6292
- // expect background interaction to remain enabled.
6293
- const shouldLockRoot = shouldTrapFocus && overlayEl.showBackdrop !== false;
6299
+ const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
6294
6300
  overlay.presented = true;
6295
6301
  overlay.willPresent.emit();
6296
6302
  if (shouldLockRoot) {
@@ -6406,10 +6412,10 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
6406
6412
  */
6407
6413
  const overlaysLockingRoot = presentedOverlays.filter((o) => {
6408
6414
  const el = o;
6409
- return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && el.showBackdrop !== false;
6415
+ return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
6410
6416
  });
6411
6417
  const overlayEl = overlay.el;
6412
- const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && overlayEl.showBackdrop !== false;
6418
+ const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && isBackdropAlwaysBlocking(overlayEl);
6413
6419
  /**
6414
6420
  * If this is the last visible overlay that is trapping focus
6415
6421
  * then we want to re-add the root to the accessibility tree.
@@ -7613,6 +7619,7 @@ class ActionSheet {
7613
7619
  this.delegateController = createDelegateController(this);
7614
7620
  this.lockController = createLockController();
7615
7621
  this.triggerController = createTriggerController();
7622
+ this.hasRadioButtons = false;
7616
7623
  this.presented = false;
7617
7624
  /** @internal */
7618
7625
  this.hasController = false;
@@ -7657,6 +7664,19 @@ class ActionSheet {
7657
7664
  }
7658
7665
  };
7659
7666
  }
7667
+ buttonsChanged() {
7668
+ const radioButtons = this.getRadioButtons();
7669
+ this.hasRadioButtons = radioButtons.length > 0;
7670
+ // Initialize activeRadioId when buttons change
7671
+ if (this.hasRadioButtons) {
7672
+ const checkedButton = radioButtons.find((b) => { var _a; return ((_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a['aria-checked']) === 'true'; });
7673
+ if (checkedButton) {
7674
+ const allButtons = this.getButtons();
7675
+ const checkedIndex = allButtons.indexOf(checkedButton);
7676
+ this.activeRadioId = this.getButtonId(checkedButton, checkedIndex);
7677
+ }
7678
+ }
7679
+ }
7660
7680
  onIsOpenChange(newValue, oldValue) {
7661
7681
  if (newValue === true && oldValue === false) {
7662
7682
  this.present();
@@ -7737,11 +7757,122 @@ class ActionSheet {
7737
7757
  }
7738
7758
  return true;
7739
7759
  }
7760
+ /**
7761
+ * Get all buttons regardless of role.
7762
+ */
7740
7763
  getButtons() {
7741
7764
  return this.buttons.map((b) => {
7742
7765
  return typeof b === 'string' ? { text: b } : b;
7743
7766
  });
7744
7767
  }
7768
+ /**
7769
+ * Get all radio buttons (buttons with role="radio").
7770
+ */
7771
+ getRadioButtons() {
7772
+ return this.getButtons().filter((b) => {
7773
+ var _a;
7774
+ const role = (_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a.role;
7775
+ return role === 'radio' && !isCancel(role);
7776
+ });
7777
+ }
7778
+ /**
7779
+ * Handle radio button selection and update aria-checked state.
7780
+ *
7781
+ * @param button The radio button that was selected.
7782
+ */
7783
+ selectRadioButton(button) {
7784
+ const buttonId = this.getButtonId(button);
7785
+ // Set the active radio ID (this will trigger a re-render and update aria-checked)
7786
+ this.activeRadioId = buttonId;
7787
+ }
7788
+ /**
7789
+ * Get or generate an ID for a button.
7790
+ *
7791
+ * @param button The button for which to get the ID.
7792
+ * @param index Optional index of the button in the buttons array.
7793
+ * @returns The ID of the button.
7794
+ */
7795
+ getButtonId(button, index) {
7796
+ if (button.id) {
7797
+ return button.id;
7798
+ }
7799
+ const allButtons = this.getButtons();
7800
+ const buttonIndex = index !== undefined ? index : allButtons.indexOf(button);
7801
+ return `action-sheet-button-${this.overlayIndex}-${buttonIndex}`;
7802
+ }
7803
+ /**
7804
+ * When the action sheet has radio buttons, we want to follow the
7805
+ * keyboard navigation pattern for radio groups:
7806
+ * - Arrow Down/Right: Move to the next radio button (wrap to first if at end)
7807
+ * - Arrow Up/Left: Move to the previous radio button (wrap to last if at start)
7808
+ * - Space/Enter: Select the focused radio button and trigger its handler
7809
+ */
7810
+ onKeydown(ev) {
7811
+ // Only handle keyboard navigation if we have radio buttons
7812
+ if (!this.hasRadioButtons || !this.presented) {
7813
+ return;
7814
+ }
7815
+ const target = ev.target;
7816
+ // Ignore if the target element is not within the action sheet or not a radio button
7817
+ if (!this.el.contains(target) ||
7818
+ !target.classList.contains('action-sheet-button') ||
7819
+ target.getAttribute('role') !== 'radio') {
7820
+ return;
7821
+ }
7822
+ // Get all radio button elements and filter out disabled ones
7823
+ const radios = Array.from(this.el.querySelectorAll('.action-sheet-button[role="radio"]')).filter((el) => !el.disabled);
7824
+ const currentIndex = radios.findIndex((radio) => radio.id === target.id);
7825
+ if (currentIndex === -1) {
7826
+ return;
7827
+ }
7828
+ const allButtons = this.getButtons();
7829
+ const radioButtons = this.getRadioButtons();
7830
+ /**
7831
+ * Build a map of button element IDs to their ActionSheetButton
7832
+ * config objects.
7833
+ * This allows us to quickly look up which button config corresponds
7834
+ * to a DOM element when handling keyboard navigation
7835
+ * (e.g., whenuser presses Space/Enter or arrow keys).
7836
+ * The key is the ID that was set on the DOM element during render,
7837
+ * and the value is the ActionSheetButton config that contains the
7838
+ * handler and other properties.
7839
+ */
7840
+ const buttonIdMap = new Map();
7841
+ radioButtons.forEach((b) => {
7842
+ const allIndex = allButtons.indexOf(b);
7843
+ const buttonId = this.getButtonId(b, allIndex);
7844
+ buttonIdMap.set(buttonId, b);
7845
+ });
7846
+ let nextEl;
7847
+ if (['ArrowDown', 'ArrowRight'].includes(ev.key)) {
7848
+ ev.preventDefault();
7849
+ ev.stopPropagation();
7850
+ nextEl = currentIndex === radios.length - 1 ? radios[0] : radios[currentIndex + 1];
7851
+ }
7852
+ else if (['ArrowUp', 'ArrowLeft'].includes(ev.key)) {
7853
+ ev.preventDefault();
7854
+ ev.stopPropagation();
7855
+ nextEl = currentIndex === 0 ? radios[radios.length - 1] : radios[currentIndex - 1];
7856
+ }
7857
+ else if (ev.key === ' ' || ev.key === 'Enter') {
7858
+ ev.preventDefault();
7859
+ ev.stopPropagation();
7860
+ const button = buttonIdMap.get(target.id);
7861
+ if (button) {
7862
+ this.selectRadioButton(button);
7863
+ this.buttonClick(button);
7864
+ }
7865
+ return;
7866
+ }
7867
+ // Focus the next radio button
7868
+ if (nextEl) {
7869
+ const button = buttonIdMap.get(nextEl.id);
7870
+ if (button) {
7871
+ this.selectRadioButton(button);
7872
+ nextEl.focus();
7873
+ }
7874
+ }
7875
+ }
7745
7876
  connectedCallback() {
7746
7877
  prepareOverlay(this.el);
7747
7878
  this.triggerChanged();
@@ -7758,6 +7889,8 @@ class ActionSheet {
7758
7889
  if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
7759
7890
  setOverlayId(this.el);
7760
7891
  }
7892
+ // Initialize activeRadioId for radio buttons
7893
+ this.buttonsChanged();
7761
7894
  }
7762
7895
  componentDidLoad() {
7763
7896
  /**
@@ -7795,22 +7928,74 @@ class ActionSheet {
7795
7928
  */
7796
7929
  this.triggerChanged();
7797
7930
  }
7931
+ renderActionSheetButtons(filteredButtons) {
7932
+ const mode = getIonMode$1(this);
7933
+ const { activeRadioId } = this;
7934
+ return filteredButtons.map((b, index) => {
7935
+ var _a;
7936
+ const isRadio = ((_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a.role) === 'radio';
7937
+ const buttonId = this.getButtonId(b, index);
7938
+ const radioButtons = this.getRadioButtons();
7939
+ const isActiveRadio = isRadio && buttonId === activeRadioId;
7940
+ const isFirstRadio = isRadio && b === radioButtons[0];
7941
+ // For radio buttons, set tabindex: 0 for the active one, -1 for others
7942
+ // For non-radio buttons, use default tabindex (undefined, which means 0)
7943
+ /**
7944
+ * For radio buttons, set tabindex based on activeRadioId
7945
+ * - If the button is the active radio, tabindex is 0
7946
+ * - If no radio is active, the first radio button should have tabindex 0
7947
+ * - All other radio buttons have tabindex -1
7948
+ * For non-radio buttons, use default tabindex (undefined, which means 0)
7949
+ */
7950
+ let tabIndex;
7951
+ if (isRadio) {
7952
+ // Focus on the active radio button
7953
+ if (isActiveRadio) {
7954
+ tabIndex = 0;
7955
+ }
7956
+ else if (!activeRadioId && isFirstRadio) {
7957
+ // No active radio, first radio gets focus
7958
+ tabIndex = 0;
7959
+ }
7960
+ else {
7961
+ // All other radios are not focusable
7962
+ tabIndex = -1;
7963
+ }
7964
+ }
7965
+ else {
7966
+ tabIndex = undefined;
7967
+ }
7968
+ // For radio buttons, set aria-checked based on activeRadioId
7969
+ // Otherwise, use the value from htmlAttributes if provided
7970
+ const htmlAttrs = Object.assign({}, b.htmlAttributes);
7971
+ if (isRadio) {
7972
+ htmlAttrs['aria-checked'] = isActiveRadio ? 'true' : 'false';
7973
+ }
7974
+ return (hAsync("button", Object.assign({}, htmlAttrs, { role: isRadio ? 'radio' : undefined, type: "button", id: buttonId, class: Object.assign(Object.assign({}, buttonClass$3(b)), { 'action-sheet-selected': isActiveRadio }), onClick: () => {
7975
+ if (isRadio) {
7976
+ this.selectRadioButton(b);
7977
+ }
7978
+ this.buttonClick(b);
7979
+ }, disabled: b.disabled, tabIndex: tabIndex }), hAsync("span", { class: "action-sheet-button-inner" }, b.icon && hAsync("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && hAsync("ion-ripple-effect", null)));
7980
+ });
7981
+ }
7798
7982
  render() {
7799
- const { header, htmlAttributes, overlayIndex } = this;
7983
+ const { header, htmlAttributes, overlayIndex, hasRadioButtons } = this;
7800
7984
  const mode = getIonMode$1(this);
7801
7985
  const allButtons = this.getButtons();
7802
7986
  const cancelButton = allButtons.find((b) => b.role === 'cancel');
7803
7987
  const buttons = allButtons.filter((b) => b.role !== 'cancel');
7804
7988
  const headerID = `action-sheet-${overlayIndex}-header`;
7805
- return (hAsync(Host, Object.assign({ key: '9fef156b2a1f09ca4a6c1fe1f37c374139bde03c', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
7989
+ return (hAsync(Host, Object.assign({ key: '173fcff5b1da7c33c267de4667591c946b8c8d03', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
7806
7990
  zIndex: `${20000 + this.overlayIndex}`,
7807
- }, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), hAsync("ion-backdrop", { key: '81cf3f7d19864e041813987b46d2d115b8466819', tappable: this.backdropDismiss }), hAsync("div", { key: '791c6a976683646fc306a42c15c5078b6f06a45f', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: 'a350b489ef7852eab9dc2227ce6d92da27dd9bf9', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, hAsync("div", { key: '69ba51ee13510c1a411d87cb4845b11b7302a36f', class: "action-sheet-container" }, hAsync("div", { key: 'bded15b8306c36591e526f0f99e1eeabcbab3915', class: "action-sheet-group", ref: (el) => (this.groupEl = el) }, header !== undefined && (hAsync("div", { key: '06b5147c0f6d9180fe8f12e75c9b4a0310226adc', id: headerID, class: {
7991
+ }, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), hAsync("ion-backdrop", { key: '521ede659f747864f6c974e09016436eceb7158c', tappable: this.backdropDismiss }), hAsync("div", { key: '7a7946fc434bc444f16a70638f5e948c69d33fcd', tabindex: "0", "aria-hidden": "true" }), hAsync("div", { key: 'bcff39a580489dbafa255842e57aa8602c6d0f18', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, hAsync("div", { key: '84bba13ce14261f0f0daa3f9c77648c9e7f36e0e', class: "action-sheet-container" }, hAsync("div", { key: 'd9c8ac404fd6719a7adf8cb36549f67616f9a0c4', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (hAsync("div", { key: '180433a8ad03ef5c54728a1a8f34715b6921d658', id: headerID, class: {
7808
7992
  'action-sheet-title': true,
7809
7993
  'action-sheet-has-sub-title': this.subHeader !== undefined,
7810
- } }, header, this.subHeader && hAsync("div", { key: '54874362a75c679aba803bf4f8768f5404d2dd28', class: "action-sheet-sub-title" }, this.subHeader))), buttons.map((b) => (hAsync("button", Object.assign({}, b.htmlAttributes, { type: "button", id: b.id, class: buttonClass$3(b), onClick: () => this.buttonClick(b), disabled: b.disabled }), hAsync("span", { class: "action-sheet-button-inner" }, b.icon && hAsync("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && hAsync("ion-ripple-effect", null))))), cancelButton && (hAsync("div", { key: '67b0de298eb424f3dea846a841b7a06d70e3930d', class: "action-sheet-group action-sheet-group-cancel" }, hAsync("button", Object.assign({ key: 'e7e3f9a5495eea9b97dbf885ef36944f2e420eff' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass$3(cancelButton), onClick: () => this.buttonClick(cancelButton) }), hAsync("span", { key: 'f889d29ed6c3d14bbc1d805888351d87f5122377', class: "action-sheet-button-inner" }, cancelButton.icon && (hAsync("ion-icon", { key: '7c05cf424b38c37fd40aaeb42a494387291571fb', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && hAsync("ion-ripple-effect", { key: 'bed927b477dc2708a5123ef560274fca9819b3d6' })))))), hAsync("div", { key: 'c5df1b11dc15a93892d57065d3dd5fbe02e43b39', tabindex: "0", "aria-hidden": "true" })));
7994
+ } }, header, this.subHeader && hAsync("div", { key: '7138e79e61b1a8f42bc5a9175c57fa2f15d7ec5a', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (hAsync("div", { key: 'b617c722f5b8028d73ed34b69310f312c65f34a7', class: "action-sheet-group action-sheet-group-cancel" }, hAsync("button", Object.assign({ key: 'd0dd876fc48815df3710413c201c0b445a8e16c0' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass$3(cancelButton), onClick: () => this.buttonClick(cancelButton) }), hAsync("span", { key: 'e7b960157cc6fc5fe92a12090b2be55e8ae072e4', class: "action-sheet-button-inner" }, cancelButton.icon && (hAsync("ion-icon", { key: '05498ffc60cab911dbff0ecbc6168dea59ada9a5', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && hAsync("ion-ripple-effect", { key: '3d401346cea301be4ca03671f7370f6f4b0b6bde' })))))), hAsync("div", { key: '971f3c5fcc07f36c28eb469a47ec0290c692e139', tabindex: "0", "aria-hidden": "true" })));
7811
7995
  }
7812
7996
  get el() { return getElement(this); }
7813
7997
  static get watchers() { return {
7998
+ "buttons": ["buttonsChanged"],
7814
7999
  "isOpen": ["onIsOpenChange"],
7815
8000
  "trigger": ["triggerChanged"]
7816
8001
  }; }
@@ -7838,12 +8023,13 @@ class ActionSheet {
7838
8023
  "htmlAttributes": [16],
7839
8024
  "isOpen": [4, "is-open"],
7840
8025
  "trigger": [1],
8026
+ "activeRadioId": [32],
7841
8027
  "present": [64],
7842
8028
  "dismiss": [64],
7843
8029
  "onDidDismiss": [64],
7844
8030
  "onWillDismiss": [64]
7845
8031
  },
7846
- "$listeners$": undefined,
8032
+ "$listeners$": [[0, "keydown", "onKeydown"]],
7847
8033
  "$lazyBundleId$": "-",
7848
8034
  "$attrsToReflect$": []
7849
8035
  }; }
@@ -9685,105 +9871,305 @@ class CardTitle {
9685
9871
  }; }
9686
9872
  }
9687
9873
 
9688
- const checkboxIosCss = ":host{--checkbox-background-checked:var(--ion-color-primary, #0054e9);--border-color-checked:var(--ion-color-primary, #0054e9);--checkmark-color:var(--ion-color-primary-contrast, #fff);--transition:none;display:inline-block;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0;width:100%;height:100%}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}:host(.ion-color){--checkbox-background-checked:var(--ion-color-base);--border-color-checked:var(--ion-color-base);--checkmark-color:var(--ion-color-contrast)}.checkbox-wrapper{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;cursor:inherit}.label-text-wrapper{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host(.in-item) .label-text-wrapper,:host(.in-item:not(.checkbox-label-placement-stacked):not([slot])) .native-wrapper{margin-top:10px;margin-bottom:10px}:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper{margin-top:10px;margin-bottom:16px}:host(.in-item.checkbox-label-placement-stacked) .native-wrapper{margin-bottom:10px}.label-text-wrapper-hidden{display:none}input{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.checkbox-icon{border-radius:var(--border-radius);position:relative;width:var(--size);height:var(--size);-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--checkbox-background);-webkit-box-sizing:border-box;box-sizing:border-box}.checkbox-icon path{fill:none;stroke:var(--checkmark-color);stroke-width:var(--checkmark-width);opacity:0}.checkbox-bottom{padding-top:4px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;font-size:0.75rem;white-space:normal}:host(.checkbox-label-placement-stacked) .checkbox-bottom{font-size:1rem}.checkbox-bottom .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.checkbox-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .checkbox-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .checkbox-bottom .helper-text{display:none}:host(.checkbox-label-placement-start) .checkbox-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.checkbox-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-end) .checkbox-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-pack:start;justify-content:start}:host(.checkbox-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.checkbox-label-placement-stacked) .checkbox-wrapper{-ms-flex-direction:column;flex-direction:column;text-align:center}:host(.checkbox-label-placement-stacked) .label-text-wrapper{-webkit-transform:scale(0.75);transform:scale(0.75);margin-left:0;margin-right:0;margin-bottom:16px;max-width:calc(100% / 0.75)}:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-start .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}}:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper{-webkit-transform-origin:center top;transform-origin:center top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-center .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}}:host(.checkbox-justify-space-between) .checkbox-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.checkbox-justify-start) .checkbox-wrapper{-ms-flex-pack:start;justify-content:start}:host(.checkbox-justify-end) .checkbox-wrapper{-ms-flex-pack:end;justify-content:end}:host(.checkbox-alignment-start) .checkbox-wrapper{-ms-flex-align:start;align-items:start}:host(.checkbox-alignment-center) .checkbox-wrapper{-ms-flex-align:center;align-items:center}:host(.checkbox-justify-space-between),:host(.checkbox-justify-start),:host(.checkbox-justify-end),:host(.checkbox-alignment-start),:host(.checkbox-alignment-center){display:block}:host(.checkbox-checked) .checkbox-icon,:host(.checkbox-indeterminate) .checkbox-icon{border-color:var(--border-color-checked);background:var(--checkbox-background-checked)}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{opacity:1}:host(.checkbox-disabled){pointer-events:none}:host{--border-radius:50%;--border-width:0.125rem;--border-style:solid;--border-color:rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.23);--checkbox-background:var(--ion-item-background, var(--ion-background-color, #fff));--size:min(1.375rem, 55.836px);--checkmark-width:1.5px}:host(.checkbox-disabled){opacity:0.3}";
9689
-
9690
- const checkboxMdCss = ":host{--checkbox-background-checked:var(--ion-color-primary, #0054e9);--border-color-checked:var(--ion-color-primary, #0054e9);--checkmark-color:var(--ion-color-primary-contrast, #fff);--transition:none;display:inline-block;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0;width:100%;height:100%}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}:host(.ion-color){--checkbox-background-checked:var(--ion-color-base);--border-color-checked:var(--ion-color-base);--checkmark-color:var(--ion-color-contrast)}.checkbox-wrapper{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;cursor:inherit}.label-text-wrapper{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host(.in-item) .label-text-wrapper,:host(.in-item:not(.checkbox-label-placement-stacked):not([slot])) .native-wrapper{margin-top:10px;margin-bottom:10px}:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper{margin-top:10px;margin-bottom:16px}:host(.in-item.checkbox-label-placement-stacked) .native-wrapper{margin-bottom:10px}.label-text-wrapper-hidden{display:none}input{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.checkbox-icon{border-radius:var(--border-radius);position:relative;width:var(--size);height:var(--size);-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--checkbox-background);-webkit-box-sizing:border-box;box-sizing:border-box}.checkbox-icon path{fill:none;stroke:var(--checkmark-color);stroke-width:var(--checkmark-width);opacity:0}.checkbox-bottom{padding-top:4px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;font-size:0.75rem;white-space:normal}:host(.checkbox-label-placement-stacked) .checkbox-bottom{font-size:1rem}.checkbox-bottom .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.checkbox-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .checkbox-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .checkbox-bottom .helper-text{display:none}:host(.checkbox-label-placement-start) .checkbox-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.checkbox-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-end) .checkbox-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-pack:start;justify-content:start}:host(.checkbox-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.checkbox-label-placement-stacked) .checkbox-wrapper{-ms-flex-direction:column;flex-direction:column;text-align:center}:host(.checkbox-label-placement-stacked) .label-text-wrapper{-webkit-transform:scale(0.75);transform:scale(0.75);margin-left:0;margin-right:0;margin-bottom:16px;max-width:calc(100% / 0.75)}:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-start .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}}:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper{-webkit-transform-origin:center top;transform-origin:center top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-center .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}}:host(.checkbox-justify-space-between) .checkbox-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.checkbox-justify-start) .checkbox-wrapper{-ms-flex-pack:start;justify-content:start}:host(.checkbox-justify-end) .checkbox-wrapper{-ms-flex-pack:end;justify-content:end}:host(.checkbox-alignment-start) .checkbox-wrapper{-ms-flex-align:start;align-items:start}:host(.checkbox-alignment-center) .checkbox-wrapper{-ms-flex-align:center;align-items:center}:host(.checkbox-justify-space-between),:host(.checkbox-justify-start),:host(.checkbox-justify-end),:host(.checkbox-alignment-start),:host(.checkbox-alignment-center){display:block}:host(.checkbox-checked) .checkbox-icon,:host(.checkbox-indeterminate) .checkbox-icon{border-color:var(--border-color-checked);background:var(--checkbox-background-checked)}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{opacity:1}:host(.checkbox-disabled){pointer-events:none}:host{--border-radius:calc(var(--size) * .125);--border-width:2px;--border-style:solid;--border-color:rgb(var(--ion-text-color-rgb, 0, 0, 0), 0.6);--checkmark-width:3;--checkbox-background:var(--ion-item-background, var(--ion-background-color, #fff));--transition:background 180ms cubic-bezier(0.4, 0, 0.2, 1);--size:18px}.checkbox-icon path{stroke-dasharray:30;stroke-dashoffset:30}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{stroke-dashoffset:0;-webkit-transition:stroke-dashoffset 90ms linear 90ms;transition:stroke-dashoffset 90ms linear 90ms}:host(.checkbox-disabled) .label-text-wrapper{opacity:0.38}:host(.checkbox-disabled) .native-wrapper{opacity:0.63}";
9691
-
9692
9874
  /**
9693
- * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
9694
- *
9695
- * @slot - The label text to associate with the checkbox. Use the "labelPlacement" property to control where the label is placed relative to the checkbox.
9875
+ * A utility to calculate the size of an outline notch
9876
+ * width relative to the content passed. This is used in
9877
+ * components such as `ion-select` with `fill="outline"`
9878
+ * where we need to pass slotted HTML content. This is not
9879
+ * needed when rendering plaintext content because we can
9880
+ * render the plaintext again hidden with `opacity: 0` inside
9881
+ * of the notch. As a result we can rely on the intrinsic size
9882
+ * of the element to correctly compute the notch width. We
9883
+ * cannot do this with slotted content because we cannot project
9884
+ * it into 2 places at once.
9696
9885
  *
9697
- * @part container - The container for the checkbox mark.
9698
- * @part label - The label text describing the checkbox.
9699
- * @part mark - The checkmark used to indicate the checked state.
9700
- * @part supporting-text - Supporting text displayed beneath the checkbox label.
9701
- * @part helper-text - Supporting text displayed beneath the checkbox label when the checkbox is valid.
9702
- * @part error-text - Supporting text displayed beneath the checkbox label when the checkbox is invalid and touched.
9886
+ * @internal
9887
+ * @param el: The host element
9888
+ * @param getNotchSpacerEl: A function that returns a reference to the notch spacer element inside of the component template.
9889
+ * @param getLabelSlot: A function that returns a reference to the slotted content.
9703
9890
  */
9704
- class Checkbox {
9705
- constructor(hostRef) {
9706
- registerInstance(this, hostRef);
9707
- this.ionChange = createEvent(this, "ionChange", 7);
9708
- this.ionFocus = createEvent(this, "ionFocus", 7);
9709
- this.ionBlur = createEvent(this, "ionBlur", 7);
9710
- this.inputId = `ion-cb-${checkboxIds++}`;
9711
- this.inputLabelId = `${this.inputId}-lbl`;
9712
- this.helperTextId = `${this.inputId}-helper-text`;
9713
- this.errorTextId = `${this.inputId}-error-text`;
9714
- this.inheritedAttributes = {};
9715
- /**
9716
- * The name of the control, which is submitted with the form data.
9717
- */
9718
- this.name = this.inputId;
9719
- /**
9720
- * If `true`, the checkbox is selected.
9721
- */
9722
- this.checked = false;
9723
- /**
9724
- * If `true`, the checkbox will visually appear as indeterminate.
9725
- */
9726
- this.indeterminate = false;
9891
+ const createNotchController = (el, getNotchSpacerEl, getLabelSlot) => {
9892
+ let notchVisibilityIO;
9893
+ const needsExplicitNotchWidth = () => {
9894
+ const notchSpacerEl = getNotchSpacerEl();
9895
+ if (
9727
9896
  /**
9728
- * If `true`, the user cannot interact with the checkbox.
9897
+ * If the notch is not being used
9898
+ * then we do not need to set the notch width.
9729
9899
  */
9730
- this.disabled = false;
9900
+ notchSpacerEl === undefined ||
9901
+ /**
9902
+ * If either the label property is being
9903
+ * used or the label slot is not defined,
9904
+ * then we do not need to estimate the notch width.
9905
+ */
9906
+ el.label !== undefined ||
9907
+ getLabelSlot() === null) {
9908
+ return false;
9909
+ }
9910
+ return true;
9911
+ };
9912
+ const calculateNotchWidth = () => {
9913
+ if (needsExplicitNotchWidth()) {
9914
+ /**
9915
+ * Run this the frame after
9916
+ * the browser has re-painted the host element.
9917
+ * Otherwise, the label element may have a width
9918
+ * of 0 and the IntersectionObserver will be used.
9919
+ */
9920
+ raf(() => {
9921
+ setNotchWidth();
9922
+ });
9923
+ }
9924
+ };
9925
+ /**
9926
+ * When using a label prop we can render
9927
+ * the label value inside of the notch and
9928
+ * let the browser calculate the size of the notch.
9929
+ * However, we cannot render the label slot in multiple
9930
+ * places so we need to manually calculate the notch dimension
9931
+ * based on the size of the slotted content.
9932
+ *
9933
+ * This function should only be used to set the notch width
9934
+ * on slotted label content. The notch width for label prop
9935
+ * content is automatically calculated based on the
9936
+ * intrinsic size of the label text.
9937
+ */
9938
+ const setNotchWidth = () => {
9939
+ const notchSpacerEl = getNotchSpacerEl();
9940
+ if (notchSpacerEl === undefined) {
9941
+ return;
9942
+ }
9943
+ if (!needsExplicitNotchWidth()) {
9944
+ notchSpacerEl.style.removeProperty('width');
9945
+ return;
9946
+ }
9947
+ const width = getLabelSlot().scrollWidth;
9948
+ if (
9731
9949
  /**
9732
- * The value of the checkbox does not mean if it's checked or not, use the `checked`
9733
- * property for that.
9950
+ * If the computed width of the label is 0
9951
+ * and notchSpacerEl's offsetParent is null
9952
+ * then that means the element is hidden.
9953
+ * As a result, we need to wait for the element
9954
+ * to become visible before setting the notch width.
9734
9955
  *
9735
- * The value of a checkbox is analogous to the value of an `<input type="checkbox">`,
9736
- * it's only used when the checkbox participates in a native `<form>`.
9737
- */
9738
- this.value = 'on';
9739
- /**
9740
- * Where to place the label relative to the checkbox.
9741
- * `"start"`: The label will appear to the left of the checkbox in LTR and to the right in RTL.
9742
- * `"end"`: The label will appear to the right of the checkbox in LTR and to the left in RTL.
9743
- * `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
9744
- * `"stacked"`: The label will appear above the checkbox regardless of the direction. The alignment of the label can be controlled with the `alignment` property.
9745
- */
9746
- this.labelPlacement = 'start';
9747
- /**
9748
- * If true, screen readers will announce it as a required field. This property
9749
- * works only for accessibility purposes, it will not prevent the form from
9750
- * submitting if the value is invalid.
9751
- */
9752
- this.required = false;
9753
- /**
9754
- * Sets the checked property and emits
9755
- * the ionChange event. Use this to update the
9756
- * checked state in response to user-generated
9757
- * actions such as a click.
9956
+ * We do not check el.offsetParent because
9957
+ * that can be null if the host element has
9958
+ * position: fixed applied to it.
9959
+ * notchSpacerEl does not have position: fixed.
9758
9960
  */
9759
- this.setChecked = (state) => {
9760
- const isChecked = (this.checked = state);
9761
- this.ionChange.emit({
9762
- checked: isChecked,
9763
- value: this.value,
9764
- });
9765
- };
9766
- this.toggleChecked = (ev) => {
9767
- ev.preventDefault();
9768
- this.setChecked(!this.checked);
9769
- this.indeterminate = false;
9770
- };
9771
- this.onFocus = () => {
9772
- this.ionFocus.emit();
9773
- };
9774
- this.onBlur = () => {
9775
- this.ionBlur.emit();
9776
- };
9777
- this.onKeyDown = (ev) => {
9778
- if (ev.key === ' ') {
9779
- ev.preventDefault();
9780
- if (!this.disabled) {
9781
- this.toggleChecked(ev);
9782
- }
9783
- }
9784
- };
9785
- this.onClick = (ev) => {
9786
- if (this.disabled) {
9961
+ width === 0 &&
9962
+ notchSpacerEl.offsetParent === null &&
9963
+ win$1 !== undefined &&
9964
+ 'IntersectionObserver' in win$1) {
9965
+ /**
9966
+ * If there is an IO already attached
9967
+ * then that will update the notch
9968
+ * once the element becomes visible.
9969
+ * As a result, there is no need to create
9970
+ * another one.
9971
+ */
9972
+ if (notchVisibilityIO !== undefined) {
9973
+ return;
9974
+ }
9975
+ const io = (notchVisibilityIO = new IntersectionObserver((ev) => {
9976
+ /**
9977
+ * If the element is visible then we
9978
+ * can try setting the notch width again.
9979
+ */
9980
+ if (ev[0].intersectionRatio === 1) {
9981
+ setNotchWidth();
9982
+ io.disconnect();
9983
+ notchVisibilityIO = undefined;
9984
+ }
9985
+ },
9986
+ /**
9987
+ * Set the root to be the host element
9988
+ * This causes the IO callback
9989
+ * to be fired in WebKit as soon as the element
9990
+ * is visible. If we used the default root value
9991
+ * then WebKit would only fire the IO callback
9992
+ * after any animations (such as a modal transition)
9993
+ * finished, and there would potentially be a flicker.
9994
+ */
9995
+ { threshold: 0.01, root: el }));
9996
+ io.observe(notchSpacerEl);
9997
+ return;
9998
+ }
9999
+ /**
10000
+ * If the element is visible then we can set the notch width.
10001
+ * The notch is only visible when the label is scaled,
10002
+ * which is why we multiply the width by 0.75 as this is
10003
+ * the same amount the label element is scaled by in the host CSS.
10004
+ * (See $form-control-label-stacked-scale in ionic.globals.scss).
10005
+ */
10006
+ notchSpacerEl.style.setProperty('width', `${width * 0.75}px`);
10007
+ };
10008
+ const destroy = () => {
10009
+ if (notchVisibilityIO) {
10010
+ notchVisibilityIO.disconnect();
10011
+ notchVisibilityIO = undefined;
10012
+ }
10013
+ };
10014
+ return {
10015
+ calculateNotchWidth,
10016
+ destroy,
10017
+ };
10018
+ };
10019
+
10020
+ /**
10021
+ * Uses the compareWith param to compare two values to determine if they are equal.
10022
+ *
10023
+ * @param currentValue The current value of the control.
10024
+ * @param compareValue The value to compare against.
10025
+ * @param compareWith The function or property name to use to compare values.
10026
+ */
10027
+ const compareOptions = (currentValue, compareValue, compareWith) => {
10028
+ if (typeof compareWith === 'function') {
10029
+ return compareWith(currentValue, compareValue);
10030
+ }
10031
+ else if (typeof compareWith === 'string') {
10032
+ return currentValue[compareWith] === compareValue[compareWith];
10033
+ }
10034
+ else {
10035
+ return Array.isArray(compareValue) ? compareValue.includes(currentValue) : currentValue === compareValue;
10036
+ }
10037
+ };
10038
+ /**
10039
+ * Compares a value against the current value(s) to determine if it is selected.
10040
+ *
10041
+ * @param currentValue The current value of the control.
10042
+ * @param compareValue The value to compare against.
10043
+ * @param compareWith The function or property name to use to compare values.
10044
+ */
10045
+ const isOptionSelected = (currentValue, compareValue, compareWith) => {
10046
+ if (currentValue === undefined) {
10047
+ return false;
10048
+ }
10049
+ if (Array.isArray(currentValue)) {
10050
+ return currentValue.some((val) => compareOptions(val, compareValue, compareWith));
10051
+ }
10052
+ else {
10053
+ return compareOptions(currentValue, compareValue, compareWith);
10054
+ }
10055
+ };
10056
+
10057
+ /**
10058
+ * Checks if the form element is in an invalid state based on
10059
+ * Ionic validation classes.
10060
+ *
10061
+ * @param el The form element to check.
10062
+ * @returns `true` if the element is invalid, `false` otherwise.
10063
+ */
10064
+ const checkInvalidState = (el) => {
10065
+ const hasIonTouched = el.classList.contains('ion-touched');
10066
+ const hasIonInvalid = el.classList.contains('ion-invalid');
10067
+ return hasIonTouched && hasIonInvalid;
10068
+ };
10069
+
10070
+ const checkboxIosCss = ":host{--checkbox-background-checked:var(--ion-color-primary, #0054e9);--border-color-checked:var(--ion-color-primary, #0054e9);--checkmark-color:var(--ion-color-primary-contrast, #fff);--transition:none;display:inline-block;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0;width:100%;height:100%}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}:host(.ion-color){--checkbox-background-checked:var(--ion-color-base);--border-color-checked:var(--ion-color-base);--checkmark-color:var(--ion-color-contrast)}.checkbox-wrapper{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;cursor:inherit}.label-text-wrapper{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host(.in-item) .label-text-wrapper,:host(.in-item:not(.checkbox-label-placement-stacked):not([slot])) .native-wrapper{margin-top:10px;margin-bottom:10px}:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper{margin-top:10px;margin-bottom:16px}:host(.in-item.checkbox-label-placement-stacked) .native-wrapper{margin-bottom:10px}.label-text-wrapper-hidden{display:none}input{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.checkbox-icon{border-radius:var(--border-radius);position:relative;width:var(--size);height:var(--size);-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--checkbox-background);-webkit-box-sizing:border-box;box-sizing:border-box}.checkbox-icon path{fill:none;stroke:var(--checkmark-color);stroke-width:var(--checkmark-width);opacity:0}.checkbox-bottom{padding-top:4px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;font-size:0.75rem;white-space:normal}:host(.checkbox-label-placement-stacked) .checkbox-bottom{font-size:1rem}.checkbox-bottom .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.checkbox-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .checkbox-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .checkbox-bottom .helper-text{display:none}:host(.checkbox-label-placement-start) .checkbox-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.checkbox-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-end) .checkbox-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-pack:start;justify-content:start}:host(.checkbox-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.checkbox-label-placement-stacked) .checkbox-wrapper{-ms-flex-direction:column;flex-direction:column;text-align:center}:host(.checkbox-label-placement-stacked) .label-text-wrapper{-webkit-transform:scale(0.75);transform:scale(0.75);margin-left:0;margin-right:0;margin-bottom:16px;max-width:calc(100% / 0.75)}:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-start .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}}:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper{-webkit-transform-origin:center top;transform-origin:center top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-center .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}}:host(.checkbox-justify-space-between) .checkbox-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.checkbox-justify-start) .checkbox-wrapper{-ms-flex-pack:start;justify-content:start}:host(.checkbox-justify-end) .checkbox-wrapper{-ms-flex-pack:end;justify-content:end}:host(.checkbox-alignment-start) .checkbox-wrapper{-ms-flex-align:start;align-items:start}:host(.checkbox-alignment-center) .checkbox-wrapper{-ms-flex-align:center;align-items:center}:host(.checkbox-justify-space-between),:host(.checkbox-justify-start),:host(.checkbox-justify-end),:host(.checkbox-alignment-start),:host(.checkbox-alignment-center){display:block}:host(.checkbox-checked) .checkbox-icon,:host(.checkbox-indeterminate) .checkbox-icon{border-color:var(--border-color-checked);background:var(--checkbox-background-checked)}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{opacity:1}:host(.checkbox-disabled){pointer-events:none}:host{--border-radius:50%;--border-width:0.125rem;--border-style:solid;--border-color:rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.23);--checkbox-background:var(--ion-item-background, var(--ion-background-color, #fff));--size:min(1.375rem, 55.836px);--checkmark-width:1.5px}:host(.checkbox-disabled){opacity:0.3}";
10071
+
10072
+ const checkboxMdCss = ":host{--checkbox-background-checked:var(--ion-color-primary, #0054e9);--border-color-checked:var(--ion-color-primary, #0054e9);--checkmark-color:var(--ion-color-primary-contrast, #fff);--transition:none;display:inline-block;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0;width:100%;height:100%}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}:host(.ion-color){--checkbox-background-checked:var(--ion-color-base);--border-color-checked:var(--ion-color-base);--checkmark-color:var(--ion-color-contrast)}.checkbox-wrapper{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;cursor:inherit}.label-text-wrapper{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host(.in-item) .label-text-wrapper,:host(.in-item:not(.checkbox-label-placement-stacked):not([slot])) .native-wrapper{margin-top:10px;margin-bottom:10px}:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper{margin-top:10px;margin-bottom:16px}:host(.in-item.checkbox-label-placement-stacked) .native-wrapper{margin-bottom:10px}.label-text-wrapper-hidden{display:none}input{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.checkbox-icon{border-radius:var(--border-radius);position:relative;width:var(--size);height:var(--size);-webkit-transition:var(--transition);transition:var(--transition);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--checkbox-background);-webkit-box-sizing:border-box;box-sizing:border-box}.checkbox-icon path{fill:none;stroke:var(--checkmark-color);stroke-width:var(--checkmark-width);opacity:0}.checkbox-bottom{padding-top:4px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;font-size:0.75rem;white-space:normal}:host(.checkbox-label-placement-stacked) .checkbox-bottom{font-size:1rem}.checkbox-bottom .error-text{display:none;color:var(--ion-color-danger, #c5000f)}.checkbox-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .checkbox-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .checkbox-bottom .helper-text{display:none}:host(.checkbox-label-placement-start) .checkbox-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.checkbox-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-end) .checkbox-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-pack:start;justify-content:start}:host(.checkbox-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px}:host(.checkbox-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.checkbox-label-placement-stacked) .checkbox-wrapper{-ms-flex-direction:column;flex-direction:column;text-align:center}:host(.checkbox-label-placement-stacked) .label-text-wrapper{-webkit-transform:scale(0.75);transform:scale(0.75);margin-left:0;margin-right:0;margin-bottom:16px;max-width:calc(100% / 0.75)}:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-start .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}}:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper{-webkit-transform-origin:center top;transform-origin:center top}:host-context([dir=rtl]):host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper,:host-context([dir=rtl]).checkbox-label-placement-stacked.checkbox-alignment-center .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}@supports selector(:dir(rtl)){:host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper{-webkit-transform-origin:calc(100% - center) top;transform-origin:calc(100% - center) top}}:host(.checkbox-justify-space-between) .checkbox-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.checkbox-justify-start) .checkbox-wrapper{-ms-flex-pack:start;justify-content:start}:host(.checkbox-justify-end) .checkbox-wrapper{-ms-flex-pack:end;justify-content:end}:host(.checkbox-alignment-start) .checkbox-wrapper{-ms-flex-align:start;align-items:start}:host(.checkbox-alignment-center) .checkbox-wrapper{-ms-flex-align:center;align-items:center}:host(.checkbox-justify-space-between),:host(.checkbox-justify-start),:host(.checkbox-justify-end),:host(.checkbox-alignment-start),:host(.checkbox-alignment-center){display:block}:host(.checkbox-checked) .checkbox-icon,:host(.checkbox-indeterminate) .checkbox-icon{border-color:var(--border-color-checked);background:var(--checkbox-background-checked)}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{opacity:1}:host(.checkbox-disabled){pointer-events:none}:host{--border-radius:calc(var(--size) * .125);--border-width:2px;--border-style:solid;--border-color:rgb(var(--ion-text-color-rgb, 0, 0, 0), 0.6);--checkmark-width:3;--checkbox-background:var(--ion-item-background, var(--ion-background-color, #fff));--transition:background 180ms cubic-bezier(0.4, 0, 0.2, 1);--size:18px}.checkbox-icon path{stroke-dasharray:30;stroke-dashoffset:30}:host(.checkbox-checked) .checkbox-icon path,:host(.checkbox-indeterminate) .checkbox-icon path{stroke-dashoffset:0;-webkit-transition:stroke-dashoffset 90ms linear 90ms;transition:stroke-dashoffset 90ms linear 90ms}:host(.checkbox-disabled) .label-text-wrapper{opacity:0.38}:host(.checkbox-disabled) .native-wrapper{opacity:0.63}";
10073
+
10074
+ /**
10075
+ * @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
10076
+ *
10077
+ * @slot - The label text to associate with the checkbox. Use the "labelPlacement" property to control where the label is placed relative to the checkbox.
10078
+ *
10079
+ * @part container - The container for the checkbox mark.
10080
+ * @part label - The label text describing the checkbox.
10081
+ * @part mark - The checkmark used to indicate the checked state.
10082
+ * @part supporting-text - Supporting text displayed beneath the checkbox label.
10083
+ * @part helper-text - Supporting text displayed beneath the checkbox label when the checkbox is valid.
10084
+ * @part error-text - Supporting text displayed beneath the checkbox label when the checkbox is invalid and touched.
10085
+ */
10086
+ class Checkbox {
10087
+ constructor(hostRef) {
10088
+ registerInstance(this, hostRef);
10089
+ this.ionChange = createEvent(this, "ionChange", 7);
10090
+ this.ionFocus = createEvent(this, "ionFocus", 7);
10091
+ this.ionBlur = createEvent(this, "ionBlur", 7);
10092
+ this.inputId = `ion-cb-${checkboxIds++}`;
10093
+ this.inputLabelId = `${this.inputId}-lbl`;
10094
+ this.helperTextId = `${this.inputId}-helper-text`;
10095
+ this.errorTextId = `${this.inputId}-error-text`;
10096
+ this.inheritedAttributes = {};
10097
+ /**
10098
+ * The name of the control, which is submitted with the form data.
10099
+ */
10100
+ this.name = this.inputId;
10101
+ /**
10102
+ * If `true`, the checkbox is selected.
10103
+ */
10104
+ this.checked = false;
10105
+ /**
10106
+ * If `true`, the checkbox will visually appear as indeterminate.
10107
+ */
10108
+ this.indeterminate = false;
10109
+ /**
10110
+ * If `true`, the user cannot interact with the checkbox.
10111
+ */
10112
+ this.disabled = false;
10113
+ /**
10114
+ * The value of the checkbox does not mean if it's checked or not, use the `checked`
10115
+ * property for that.
10116
+ *
10117
+ * The value of a checkbox is analogous to the value of an `<input type="checkbox">`,
10118
+ * it's only used when the checkbox participates in a native `<form>`.
10119
+ */
10120
+ this.value = 'on';
10121
+ /**
10122
+ * Where to place the label relative to the checkbox.
10123
+ * `"start"`: The label will appear to the left of the checkbox in LTR and to the right in RTL.
10124
+ * `"end"`: The label will appear to the right of the checkbox in LTR and to the left in RTL.
10125
+ * `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
10126
+ * `"stacked"`: The label will appear above the checkbox regardless of the direction. The alignment of the label can be controlled with the `alignment` property.
10127
+ */
10128
+ this.labelPlacement = 'start';
10129
+ /**
10130
+ * If true, screen readers will announce it as a required field. This property
10131
+ * works only for accessibility purposes, it will not prevent the form from
10132
+ * submitting if the value is invalid.
10133
+ */
10134
+ this.required = false;
10135
+ /**
10136
+ * Track validation state for proper aria-live announcements.
10137
+ */
10138
+ this.isInvalid = false;
10139
+ /**
10140
+ * Sets the checked property and emits
10141
+ * the ionChange event. Use this to update the
10142
+ * checked state in response to user-generated
10143
+ * actions such as a click.
10144
+ */
10145
+ this.setChecked = (state) => {
10146
+ const isChecked = (this.checked = state);
10147
+ this.ionChange.emit({
10148
+ checked: isChecked,
10149
+ value: this.value,
10150
+ });
10151
+ };
10152
+ this.toggleChecked = (ev) => {
10153
+ ev.preventDefault();
10154
+ this.setChecked(!this.checked);
10155
+ this.indeterminate = false;
10156
+ };
10157
+ this.onFocus = () => {
10158
+ this.ionFocus.emit();
10159
+ };
10160
+ this.onBlur = () => {
10161
+ this.ionBlur.emit();
10162
+ };
10163
+ this.onKeyDown = (ev) => {
10164
+ if (ev.key === ' ') {
10165
+ ev.preventDefault();
10166
+ if (!this.disabled) {
10167
+ this.toggleChecked(ev);
10168
+ }
10169
+ }
10170
+ };
10171
+ this.onClick = (ev) => {
10172
+ if (this.disabled) {
9787
10173
  return;
9788
10174
  }
9789
10175
  this.toggleChecked(ev);
@@ -9796,16 +10182,29 @@ class Checkbox {
9796
10182
  ev.stopPropagation();
9797
10183
  };
9798
10184
  }
10185
+ connectedCallback() {
10186
+ const { el } = this;
10187
+ // Always set initial state
10188
+ this.isInvalid = checkInvalidState(el);
10189
+ }
9799
10190
  componentWillLoad() {
9800
10191
  this.inheritedAttributes = Object.assign({}, inheritAriaAttributes(this.el));
10192
+ this.hintTextId = this.getHintTextId();
10193
+ }
10194
+ disconnectedCallback() {
10195
+ // Clean up validation observer to prevent memory leaks.
10196
+ if (this.validationObserver) {
10197
+ this.validationObserver.disconnect();
10198
+ this.validationObserver = undefined;
10199
+ }
9801
10200
  }
9802
10201
  /** @internal */
9803
10202
  async setFocus() {
9804
10203
  this.el.focus();
9805
10204
  }
9806
- getHintTextID() {
9807
- const { el, helperText, errorText, helperTextId, errorTextId } = this;
9808
- if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
10205
+ getHintTextId() {
10206
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
10207
+ if (isInvalid && errorText) {
9809
10208
  return errorTextId;
9810
10209
  }
9811
10210
  if (helperText) {
@@ -9818,7 +10217,7 @@ class Checkbox {
9818
10217
  * This element should only be rendered if hint text is set.
9819
10218
  */
9820
10219
  renderHintText() {
9821
- const { helperText, errorText, helperTextId, errorTextId } = this;
10220
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
9822
10221
  /**
9823
10222
  * undefined and empty string values should
9824
10223
  * be treated as not having helper/error text.
@@ -9827,7 +10226,7 @@ class Checkbox {
9827
10226
  if (!hasHintText) {
9828
10227
  return;
9829
10228
  }
9830
- return (hAsync("div", { class: "checkbox-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text" }, helperText), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text" }, errorText)));
10229
+ return (hAsync("div", { class: "checkbox-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text", role: "alert" }, isInvalid ? errorText : null)));
9831
10230
  }
9832
10231
  render() {
9833
10232
  const { color, checked, disabled, el, getSVGPath, indeterminate, inheritedAttributes, inputId, justify, labelPlacement, name, value, alignment, required, } = this;
@@ -9837,7 +10236,7 @@ class Checkbox {
9837
10236
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
9838
10237
  // The host element must have a checkbox role to ensure proper VoiceOver
9839
10238
  // support in Safari for accessibility.
9840
- return (hAsync(Host, { key: 'ee2e02d28f9d15a1ec746609f7e9559444f621e5', role: "checkbox", "aria-checked": indeterminate ? 'mixed' : `${checked}`, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId, "aria-labelledby": hasLabelContent ? this.inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, onClick: this.onClick, class: createColorClasses$1(color, {
10239
+ return (hAsync(Host, { key: 'ae0fbd4b21accbac132e6b85c513512ad9179394', role: "checkbox", "aria-checked": indeterminate ? 'mixed' : `${checked}`, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": hasLabelContent ? this.inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, "aria-required": required ? 'true' : undefined, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, onClick: this.onClick, class: createColorClasses$1(color, {
9841
10240
  [mode]: true,
9842
10241
  'in-item': hostContext('ion-item', el),
9843
10242
  'checkbox-checked': checked,
@@ -9847,10 +10246,10 @@ class Checkbox {
9847
10246
  [`checkbox-justify-${justify}`]: justify !== undefined,
9848
10247
  [`checkbox-alignment-${alignment}`]: alignment !== undefined,
9849
10248
  [`checkbox-label-placement-${labelPlacement}`]: true,
9850
- }) }, hAsync("label", { key: '84d4c33da0348dc65ad36fb0fafd48be366dcf3b', class: "checkbox-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '427db69a3ab8a17aa0867519c90f585b8930406b', type: "checkbox", checked: checked ? true : undefined, disabled: disabled, id: inputId, onChange: this.toggleChecked, required: required }, inheritedAttributes)), hAsync("div", { key: '9dda7024b3a4f1ee55351f783f9a10f9b4ad0d12', class: {
10249
+ }) }, hAsync("label", { key: '7a3d7f3c27dde514f2dbf2e34f4629fad33ec3bf', class: "checkbox-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '4130d77ddf034271fecccda14e101a5a809921b6', type: "checkbox", checked: checked ? true : undefined, disabled: disabled, id: inputId, onChange: this.toggleChecked, required: required }, inheritedAttributes)), hAsync("div", { key: '5daa74f4e62b0947e37764762524001ee42609d9', class: {
9851
10250
  'label-text-wrapper': true,
9852
10251
  'label-text-wrapper-hidden': !hasLabelContent,
9853
- }, part: "label", id: this.inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: 'f9d1d545ffd4164b650808241b51ea1bedc6a42c' }), this.renderHintText()), hAsync("div", { key: 'a96d61ac324864228f14caa0e9f2c0d15418882e', class: "native-wrapper" }, hAsync("svg", { key: '64ff3e4d87e190601811ef64323edec18d510cd1', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container", "aria-hidden": "true" }, path)))));
10252
+ }, part: "label", id: this.inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: '23ff66138f8c3a2f56f39113fc842d54b2f7952a' }), this.renderHintText()), hAsync("div", { key: 'ab914d9623c19fc46821d5e62db92f1192ebbe7e', class: "native-wrapper" }, hAsync("svg", { key: '66e3f4f5dcaa9756fb0e9452299954f9ed3dcb7b', class: "checkbox-icon", viewBox: "0 0 24 24", part: "container", "aria-hidden": "true" }, path)))));
9854
10253
  }
9855
10254
  getSVGPath(mode, indeterminate) {
9856
10255
  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" }));
@@ -9880,6 +10279,8 @@ class Checkbox {
9880
10279
  "justify": [1],
9881
10280
  "alignment": [1],
9882
10281
  "required": [4],
10282
+ "isInvalid": [32],
10283
+ "hintTextId": [32],
9883
10284
  "setFocus": [64]
9884
10285
  },
9885
10286
  "$listeners$": undefined,
@@ -10268,6 +10669,15 @@ class Content {
10268
10669
  }
10269
10670
  resize() {
10270
10671
  }
10672
+ /**
10673
+ * Recalculate content dimensions. Called by overlays (e.g., popover) when
10674
+ * sibling elements like headers or footers have finished rendering and their
10675
+ * heights are available, ensuring accurate offset-top calculations.
10676
+ * @internal
10677
+ */
10678
+ async recalculateDimensions() {
10679
+ readTask(() => this.readDimensions());
10680
+ }
10271
10681
  readDimensions() {
10272
10682
  const page = getPageElement(this.el);
10273
10683
  const top = Math.max(this.el.offsetTop, 0);
@@ -10436,7 +10846,7 @@ class Content {
10436
10846
  const forceOverscroll = this.shouldForceOverscroll();
10437
10847
  const transitionShadow = mode === 'ios';
10438
10848
  this.resize();
10439
- return (hAsync(Host, Object.assign({ key: 'f2a24aa66dbf5c76f9d4b06f708eb73cadc239df', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
10849
+ return (hAsync(Host, Object.assign({ key: 'cd8781f848d8dc926fe66f43d43c49564425a507', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
10440
10850
  [mode]: true,
10441
10851
  'content-sizing': hostContext('ion-popover', this.el),
10442
10852
  overscroll: forceOverscroll,
@@ -10444,12 +10854,12 @@ class Content {
10444
10854
  }), style: {
10445
10855
  '--offset-top': `${this.cTop}px`,
10446
10856
  '--offset-bottom': `${this.cBottom}px`,
10447
- } }, inheritedAttributes), hAsync("div", { key: '6480ca7648b278abb36477b3838bccbcd4995e2a', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: '29a23b663f5f0215bb000820c01e1814c0d55985', class: {
10857
+ } }, inheritedAttributes), hAsync("div", { key: '95b112d7cae30f22ef778ceffb88edb4d941c170', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: '2fdfcbc39fb66f11b6191911f2941c660f4c12e5', class: {
10448
10858
  'inner-scroll': true,
10449
10859
  'scroll-x': scrollX,
10450
10860
  'scroll-y': scrollY,
10451
10861
  overscroll: (scrollX || scrollY) && forceOverscroll,
10452
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: '0fe1bd05609a4b88ae2ce9addf5d5dc5dc1806f0' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
10862
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: '6bc77e0054ec8e21635a7f2abfe0ca46e0962e03' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
10453
10863
  }
10454
10864
  get el() { return getElement(this); }
10455
10865
  static get style() { return contentCss; }
@@ -10464,6 +10874,7 @@ class Content {
10464
10874
  "scrollX": [4, "scroll-x"],
10465
10875
  "scrollY": [4, "scroll-y"],
10466
10876
  "scrollEvents": [4, "scroll-events"],
10877
+ "recalculateDimensions": [64],
10467
10878
  "getScrollElement": [64],
10468
10879
  "getBackgroundElement": [64],
10469
10880
  "scrollToTop": [64],
@@ -13024,6 +13435,28 @@ class Datetime {
13024
13435
  destroyKeyboardMO();
13025
13436
  }
13026
13437
  };
13438
+ /**
13439
+ * TODO(FW-6931): Remove this fallback upon solving the root cause
13440
+ * Fallback to ensure the datetime becomes ready even if
13441
+ * IntersectionObserver never reports it as intersecting.
13442
+ *
13443
+ * This is primarily used in environments where the observer
13444
+ * might not fire as expected, such as when running under
13445
+ * synthetic tests that stub IntersectionObserver.
13446
+ */
13447
+ this.ensureReadyIfVisible = () => {
13448
+ if (this.el.classList.contains('datetime-ready')) {
13449
+ return;
13450
+ }
13451
+ const rect = this.el.getBoundingClientRect();
13452
+ if (rect.width === 0 || rect.height === 0) {
13453
+ return;
13454
+ }
13455
+ this.initializeListeners();
13456
+ writeTask(() => {
13457
+ this.el.classList.add('datetime-ready');
13458
+ });
13459
+ };
13027
13460
  this.processValue = (value) => {
13028
13461
  const hasValue = value !== null && value !== undefined && value !== '' && (!Array.isArray(value) || value.length > 0);
13029
13462
  const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
@@ -13341,6 +13774,17 @@ class Datetime {
13341
13774
  * triggering the `hiddenIO` observer below.
13342
13775
  */
13343
13776
  raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(intersectionTrackerRef));
13777
+ /**
13778
+ * TODO(FW-6931): Remove this fallback upon solving the root cause
13779
+ * Fallback: If IntersectionObserver never reports that the
13780
+ * datetime is visible but the host clearly has layout, ensure
13781
+ * we still initialize listeners and mark the component as ready.
13782
+ *
13783
+ * We schedule this after everything has had a chance to run.
13784
+ */
13785
+ setTimeout(() => {
13786
+ this.ensureReadyIfVisible();
13787
+ }, 100);
13344
13788
  /**
13345
13789
  * We need to clean up listeners when the datetime is hidden
13346
13790
  * in a popover/modal so that we can properly scroll containers
@@ -14096,7 +14540,7 @@ class Datetime {
14096
14540
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
14097
14541
  const hasWheelVariant = hasDatePresentation && preferWheel;
14098
14542
  renderHiddenInput(true, el, name, formatValue(value), disabled);
14099
- return (hAsync(Host, { key: '57492534800ea059a7c2bbd9f0059cc0b75ae8d2', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses$1(color, {
14543
+ return (hAsync(Host, { key: 'efdbc0922670a841bc667ceac392cdc1dedffd01', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses$1(color, {
14100
14544
  [mode]: true,
14101
14545
  ['datetime-readonly']: readonly,
14102
14546
  ['datetime-disabled']: disabled,
@@ -14106,7 +14550,7 @@ class Datetime {
14106
14550
  [`datetime-size-${size}`]: true,
14107
14551
  [`datetime-prefer-wheel`]: hasWheelVariant,
14108
14552
  [`datetime-grid`]: isGridStyle,
14109
- })) }, hAsync("div", { key: '97dac5e5195635ac0bc5fb472b9d09e5c3c6bbc3', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
14553
+ })) }, hAsync("div", { key: '3f8bb75fcb0baff55182ef3aa1b535eacc58d81f', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
14110
14554
  }
14111
14555
  get el() { return getElement(this); }
14112
14556
  static get watchers() { return {
@@ -14748,7 +15192,7 @@ class FabButton {
14748
15192
  "translucent": [4],
14749
15193
  "type": [1],
14750
15194
  "size": [1],
14751
- "closeIcon": [8, "close-icon"]
15195
+ "closeIcon": [1, "close-icon"]
14752
15196
  },
14753
15197
  "$listeners$": undefined,
14754
15198
  "$lazyBundleId$": "-",
@@ -16198,317 +16642,121 @@ class InfiniteScroll {
16198
16642
  * Done.
16199
16643
  */
16200
16644
  this.isBusy = true;
16201
- // ******** DOM READ ****************
16202
- // Save the current content dimensions before the UI updates
16203
- const prev = scrollEl.scrollHeight - scrollEl.scrollTop;
16204
- // ******** DOM READ ****************
16205
- requestAnimationFrame(() => {
16206
- readTask(() => {
16207
- // UI has updated, save the new content dimensions
16208
- const scrollHeight = scrollEl.scrollHeight;
16209
- // New content was added on top, so the scroll position should be changed immediately to prevent it from jumping around
16210
- const newScrollTop = scrollHeight - prev;
16211
- // ******** DOM WRITE ****************
16212
- requestAnimationFrame(() => {
16213
- writeTask(() => {
16214
- scrollEl.scrollTop = newScrollTop;
16215
- this.isBusy = false;
16216
- this.didFire = false;
16217
- });
16218
- });
16219
- });
16220
- });
16221
- }
16222
- else {
16223
- this.didFire = false;
16224
- }
16225
- }
16226
- canStart() {
16227
- return !this.disabled && !this.isBusy && !!this.scrollEl && !this.isLoading;
16228
- }
16229
- enableScrollEvents(shouldListen) {
16230
- if (this.scrollEl) {
16231
- if (shouldListen) {
16232
- this.scrollEl.addEventListener('scroll', this.onScroll);
16233
- }
16234
- else {
16235
- this.scrollEl.removeEventListener('scroll', this.onScroll);
16236
- }
16237
- }
16238
- }
16239
- render() {
16240
- const mode = getIonMode$1(this);
16241
- const disabled = this.disabled;
16242
- return (hAsync(Host, { key: 'e844956795f69be33396ce4480aa7a54ad01b28c', class: {
16243
- [mode]: true,
16244
- 'infinite-scroll-loading': this.isLoading,
16245
- 'infinite-scroll-enabled': !disabled,
16246
- } }));
16247
- }
16248
- get el() { return getElement(this); }
16249
- static get watchers() { return {
16250
- "threshold": ["thresholdChanged"],
16251
- "disabled": ["disabledChanged"]
16252
- }; }
16253
- static get style() { return infiniteScrollCss; }
16254
- static get cmpMeta() { return {
16255
- "$flags$": 256,
16256
- "$tagName$": "ion-infinite-scroll",
16257
- "$members$": {
16258
- "threshold": [1],
16259
- "disabled": [4],
16260
- "position": [1],
16261
- "isLoading": [32],
16262
- "complete": [64]
16263
- },
16264
- "$listeners$": undefined,
16265
- "$lazyBundleId$": "-",
16266
- "$attrsToReflect$": []
16267
- }; }
16268
- }
16269
-
16270
- const infiniteScrollContentIosCss = "ion-infinite-scroll-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;min-height:84px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.infinite-loading{margin-left:0;margin-right:0;margin-top:0;margin-bottom:32px;display:none;width:100%}.infinite-loading-text{-webkit-margin-start:32px;margin-inline-start:32px;-webkit-margin-end:32px;margin-inline-end:32px;margin-top:4px;margin-bottom:0}.infinite-scroll-loading ion-infinite-scroll-content>.infinite-loading{display:block}.infinite-scroll-content-ios .infinite-loading-text{color:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-ios .infinite-loading-spinner .spinner-lines-ios line,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-lines-small-ios line,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-crescent circle{stroke:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-ios .infinite-loading-spinner .spinner-bubbles circle,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-circles circle,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-dots circle{fill:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}";
16271
-
16272
- const infiniteScrollContentMdCss = "ion-infinite-scroll-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;min-height:84px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.infinite-loading{margin-left:0;margin-right:0;margin-top:0;margin-bottom:32px;display:none;width:100%}.infinite-loading-text{-webkit-margin-start:32px;margin-inline-start:32px;-webkit-margin-end:32px;margin-inline-end:32px;margin-top:4px;margin-bottom:0}.infinite-scroll-loading ion-infinite-scroll-content>.infinite-loading{display:block}.infinite-scroll-content-md .infinite-loading-text{color:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-md .infinite-loading-spinner .spinner-lines-md line,.infinite-scroll-content-md .infinite-loading-spinner .spinner-lines-small-md line,.infinite-scroll-content-md .infinite-loading-spinner .spinner-crescent circle{stroke:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-md .infinite-loading-spinner .spinner-bubbles circle,.infinite-scroll-content-md .infinite-loading-spinner .spinner-circles circle,.infinite-scroll-content-md .infinite-loading-spinner .spinner-dots circle{fill:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}";
16273
-
16274
- class InfiniteScrollContent {
16275
- constructor(hostRef) {
16276
- registerInstance(this, hostRef);
16277
- this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
16278
- }
16279
- componentDidLoad() {
16280
- if (this.loadingSpinner === undefined) {
16281
- const mode = getIonMode$1(this);
16282
- this.loadingSpinner = config.get('infiniteLoadingSpinner', config.get('spinner', mode === 'ios' ? 'lines' : 'crescent'));
16283
- }
16284
- }
16285
- renderLoadingText() {
16286
- const { customHTMLEnabled, loadingText } = this;
16287
- if (customHTMLEnabled) {
16288
- return hAsync("div", { class: "infinite-loading-text", innerHTML: sanitizeDOMString(loadingText) });
16289
- }
16290
- return hAsync("div", { class: "infinite-loading-text" }, this.loadingText);
16291
- }
16292
- render() {
16293
- const mode = getIonMode$1(this);
16294
- return (hAsync(Host, { key: '7c16060dcfe2a0b0fb3e2f8f4c449589a76f1baa', class: {
16295
- [mode]: true,
16296
- // Used internally for styling
16297
- [`infinite-scroll-content-${mode}`]: true,
16298
- } }, hAsync("div", { key: 'a94f4d8746e053dc718f97520bd7e48cb316443a', class: "infinite-loading" }, this.loadingSpinner && (hAsync("div", { key: '10143d5d2a50a2a2bc5de1cee8e7ab51263bcf23', class: "infinite-loading-spinner" }, hAsync("ion-spinner", { key: '8846e88191690d9c61a0b462889ed56fbfed8b0d', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
16299
- }
16300
- static get style() { return {
16301
- ios: infiniteScrollContentIosCss,
16302
- md: infiniteScrollContentMdCss
16303
- }; }
16304
- static get cmpMeta() { return {
16305
- "$flags$": 288,
16306
- "$tagName$": "ion-infinite-scroll-content",
16307
- "$members$": {
16308
- "loadingSpinner": [1025, "loading-spinner"],
16309
- "loadingText": [1, "loading-text"]
16310
- },
16311
- "$listeners$": undefined,
16312
- "$lazyBundleId$": "-",
16313
- "$attrsToReflect$": []
16314
- }; }
16315
- }
16316
-
16317
- /**
16318
- * A utility to calculate the size of an outline notch
16319
- * width relative to the content passed. This is used in
16320
- * components such as `ion-select` with `fill="outline"`
16321
- * where we need to pass slotted HTML content. This is not
16322
- * needed when rendering plaintext content because we can
16323
- * render the plaintext again hidden with `opacity: 0` inside
16324
- * of the notch. As a result we can rely on the intrinsic size
16325
- * of the element to correctly compute the notch width. We
16326
- * cannot do this with slotted content because we cannot project
16327
- * it into 2 places at once.
16328
- *
16329
- * @internal
16330
- * @param el: The host element
16331
- * @param getNotchSpacerEl: A function that returns a reference to the notch spacer element inside of the component template.
16332
- * @param getLabelSlot: A function that returns a reference to the slotted content.
16333
- */
16334
- const createNotchController = (el, getNotchSpacerEl, getLabelSlot) => {
16335
- let notchVisibilityIO;
16336
- const needsExplicitNotchWidth = () => {
16337
- const notchSpacerEl = getNotchSpacerEl();
16338
- if (
16339
- /**
16340
- * If the notch is not being used
16341
- * then we do not need to set the notch width.
16342
- */
16343
- notchSpacerEl === undefined ||
16344
- /**
16345
- * If either the label property is being
16346
- * used or the label slot is not defined,
16347
- * then we do not need to estimate the notch width.
16348
- */
16349
- el.label !== undefined ||
16350
- getLabelSlot() === null) {
16351
- return false;
16352
- }
16353
- return true;
16354
- };
16355
- const calculateNotchWidth = () => {
16356
- if (needsExplicitNotchWidth()) {
16357
- /**
16358
- * Run this the frame after
16359
- * the browser has re-painted the host element.
16360
- * Otherwise, the label element may have a width
16361
- * of 0 and the IntersectionObserver will be used.
16362
- */
16363
- raf(() => {
16364
- setNotchWidth();
16365
- });
16366
- }
16367
- };
16368
- /**
16369
- * When using a label prop we can render
16370
- * the label value inside of the notch and
16371
- * let the browser calculate the size of the notch.
16372
- * However, we cannot render the label slot in multiple
16373
- * places so we need to manually calculate the notch dimension
16374
- * based on the size of the slotted content.
16375
- *
16376
- * This function should only be used to set the notch width
16377
- * on slotted label content. The notch width for label prop
16378
- * content is automatically calculated based on the
16379
- * intrinsic size of the label text.
16380
- */
16381
- const setNotchWidth = () => {
16382
- const notchSpacerEl = getNotchSpacerEl();
16383
- if (notchSpacerEl === undefined) {
16384
- return;
16385
- }
16386
- if (!needsExplicitNotchWidth()) {
16387
- notchSpacerEl.style.removeProperty('width');
16388
- return;
16389
- }
16390
- const width = getLabelSlot().scrollWidth;
16391
- if (
16392
- /**
16393
- * If the computed width of the label is 0
16394
- * and notchSpacerEl's offsetParent is null
16395
- * then that means the element is hidden.
16396
- * As a result, we need to wait for the element
16397
- * to become visible before setting the notch width.
16398
- *
16399
- * We do not check el.offsetParent because
16400
- * that can be null if the host element has
16401
- * position: fixed applied to it.
16402
- * notchSpacerEl does not have position: fixed.
16403
- */
16404
- width === 0 &&
16405
- notchSpacerEl.offsetParent === null &&
16406
- win$1 !== undefined &&
16407
- 'IntersectionObserver' in win$1) {
16408
- /**
16409
- * If there is an IO already attached
16410
- * then that will update the notch
16411
- * once the element becomes visible.
16412
- * As a result, there is no need to create
16413
- * another one.
16414
- */
16415
- if (notchVisibilityIO !== undefined) {
16416
- return;
16417
- }
16418
- const io = (notchVisibilityIO = new IntersectionObserver((ev) => {
16419
- /**
16420
- * If the element is visible then we
16421
- * can try setting the notch width again.
16422
- */
16423
- if (ev[0].intersectionRatio === 1) {
16424
- setNotchWidth();
16425
- io.disconnect();
16426
- notchVisibilityIO = undefined;
16427
- }
16428
- },
16429
- /**
16430
- * Set the root to be the host element
16431
- * This causes the IO callback
16432
- * to be fired in WebKit as soon as the element
16433
- * is visible. If we used the default root value
16434
- * then WebKit would only fire the IO callback
16435
- * after any animations (such as a modal transition)
16436
- * finished, and there would potentially be a flicker.
16437
- */
16438
- { threshold: 0.01, root: el }));
16439
- io.observe(notchSpacerEl);
16440
- return;
16645
+ // ******** DOM READ ****************
16646
+ // Save the current content dimensions before the UI updates
16647
+ const prev = scrollEl.scrollHeight - scrollEl.scrollTop;
16648
+ // ******** DOM READ ****************
16649
+ requestAnimationFrame(() => {
16650
+ readTask(() => {
16651
+ // UI has updated, save the new content dimensions
16652
+ const scrollHeight = scrollEl.scrollHeight;
16653
+ // New content was added on top, so the scroll position should be changed immediately to prevent it from jumping around
16654
+ const newScrollTop = scrollHeight - prev;
16655
+ // ******** DOM WRITE ****************
16656
+ requestAnimationFrame(() => {
16657
+ writeTask(() => {
16658
+ scrollEl.scrollTop = newScrollTop;
16659
+ this.isBusy = false;
16660
+ this.didFire = false;
16661
+ });
16662
+ });
16663
+ });
16664
+ });
16441
16665
  }
16442
- /**
16443
- * If the element is visible then we can set the notch width.
16444
- * The notch is only visible when the label is scaled,
16445
- * which is why we multiply the width by 0.75 as this is
16446
- * the same amount the label element is scaled by in the host CSS.
16447
- * (See $form-control-label-stacked-scale in ionic.globals.scss).
16448
- */
16449
- notchSpacerEl.style.setProperty('width', `${width * 0.75}px`);
16450
- };
16451
- const destroy = () => {
16452
- if (notchVisibilityIO) {
16453
- notchVisibilityIO.disconnect();
16454
- notchVisibilityIO = undefined;
16666
+ else {
16667
+ this.didFire = false;
16455
16668
  }
16456
- };
16457
- return {
16458
- calculateNotchWidth,
16459
- destroy,
16460
- };
16461
- };
16462
-
16463
- /**
16464
- * Uses the compareWith param to compare two values to determine if they are equal.
16465
- *
16466
- * @param currentValue The current value of the control.
16467
- * @param compareValue The value to compare against.
16468
- * @param compareWith The function or property name to use to compare values.
16469
- */
16470
- const compareOptions = (currentValue, compareValue, compareWith) => {
16471
- if (typeof compareWith === 'function') {
16472
- return compareWith(currentValue, compareValue);
16473
16669
  }
16474
- else if (typeof compareWith === 'string') {
16475
- return currentValue[compareWith] === compareValue[compareWith];
16670
+ canStart() {
16671
+ return !this.disabled && !this.isBusy && !!this.scrollEl && !this.isLoading;
16476
16672
  }
16477
- else {
16478
- return Array.isArray(compareValue) ? compareValue.includes(currentValue) : currentValue === compareValue;
16673
+ enableScrollEvents(shouldListen) {
16674
+ if (this.scrollEl) {
16675
+ if (shouldListen) {
16676
+ this.scrollEl.addEventListener('scroll', this.onScroll);
16677
+ }
16678
+ else {
16679
+ this.scrollEl.removeEventListener('scroll', this.onScroll);
16680
+ }
16681
+ }
16479
16682
  }
16480
- };
16481
- /**
16482
- * Compares a value against the current value(s) to determine if it is selected.
16483
- *
16484
- * @param currentValue The current value of the control.
16485
- * @param compareValue The value to compare against.
16486
- * @param compareWith The function or property name to use to compare values.
16487
- */
16488
- const isOptionSelected = (currentValue, compareValue, compareWith) => {
16489
- if (currentValue === undefined) {
16490
- return false;
16683
+ render() {
16684
+ const mode = getIonMode$1(this);
16685
+ const disabled = this.disabled;
16686
+ return (hAsync(Host, { key: 'e844956795f69be33396ce4480aa7a54ad01b28c', class: {
16687
+ [mode]: true,
16688
+ 'infinite-scroll-loading': this.isLoading,
16689
+ 'infinite-scroll-enabled': !disabled,
16690
+ } }));
16491
16691
  }
16492
- if (Array.isArray(currentValue)) {
16493
- return currentValue.some((val) => compareOptions(val, compareValue, compareWith));
16692
+ get el() { return getElement(this); }
16693
+ static get watchers() { return {
16694
+ "threshold": ["thresholdChanged"],
16695
+ "disabled": ["disabledChanged"]
16696
+ }; }
16697
+ static get style() { return infiniteScrollCss; }
16698
+ static get cmpMeta() { return {
16699
+ "$flags$": 256,
16700
+ "$tagName$": "ion-infinite-scroll",
16701
+ "$members$": {
16702
+ "threshold": [1],
16703
+ "disabled": [4],
16704
+ "position": [1],
16705
+ "isLoading": [32],
16706
+ "complete": [64]
16707
+ },
16708
+ "$listeners$": undefined,
16709
+ "$lazyBundleId$": "-",
16710
+ "$attrsToReflect$": []
16711
+ }; }
16712
+ }
16713
+
16714
+ const infiniteScrollContentIosCss = "ion-infinite-scroll-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;min-height:84px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.infinite-loading{margin-left:0;margin-right:0;margin-top:0;margin-bottom:32px;display:none;width:100%}.infinite-loading-text{-webkit-margin-start:32px;margin-inline-start:32px;-webkit-margin-end:32px;margin-inline-end:32px;margin-top:4px;margin-bottom:0}.infinite-scroll-loading ion-infinite-scroll-content>.infinite-loading{display:block}.infinite-scroll-content-ios .infinite-loading-text{color:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-ios .infinite-loading-spinner .spinner-lines-ios line,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-lines-small-ios line,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-crescent circle{stroke:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-ios .infinite-loading-spinner .spinner-bubbles circle,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-circles circle,.infinite-scroll-content-ios .infinite-loading-spinner .spinner-dots circle{fill:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}";
16715
+
16716
+ const infiniteScrollContentMdCss = "ion-infinite-scroll-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;min-height:84px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.infinite-loading{margin-left:0;margin-right:0;margin-top:0;margin-bottom:32px;display:none;width:100%}.infinite-loading-text{-webkit-margin-start:32px;margin-inline-start:32px;-webkit-margin-end:32px;margin-inline-end:32px;margin-top:4px;margin-bottom:0}.infinite-scroll-loading ion-infinite-scroll-content>.infinite-loading{display:block}.infinite-scroll-content-md .infinite-loading-text{color:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-md .infinite-loading-spinner .spinner-lines-md line,.infinite-scroll-content-md .infinite-loading-spinner .spinner-lines-small-md line,.infinite-scroll-content-md .infinite-loading-spinner .spinner-crescent circle{stroke:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}.infinite-scroll-content-md .infinite-loading-spinner .spinner-bubbles circle,.infinite-scroll-content-md .infinite-loading-spinner .spinner-circles circle,.infinite-scroll-content-md .infinite-loading-spinner .spinner-dots circle{fill:var(--ion-color-step-600, var(--ion-text-color-step-400, #666666))}";
16717
+
16718
+ class InfiniteScrollContent {
16719
+ constructor(hostRef) {
16720
+ registerInstance(this, hostRef);
16721
+ this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
16494
16722
  }
16495
- else {
16496
- return compareOptions(currentValue, compareValue, compareWith);
16723
+ componentDidLoad() {
16724
+ if (this.loadingSpinner === undefined) {
16725
+ const mode = getIonMode$1(this);
16726
+ this.loadingSpinner = config.get('infiniteLoadingSpinner', config.get('spinner', mode === 'ios' ? 'lines' : 'crescent'));
16727
+ }
16497
16728
  }
16498
- };
16499
-
16500
- /**
16501
- * Checks if the form element is in an invalid state based on
16502
- * Ionic validation classes.
16503
- *
16504
- * @param el The form element to check.
16505
- * @returns `true` if the element is invalid, `false` otherwise.
16506
- */
16507
- const checkInvalidState = (el) => {
16508
- const hasIonTouched = el.classList.contains('ion-touched');
16509
- const hasIonInvalid = el.classList.contains('ion-invalid');
16510
- return hasIonTouched && hasIonInvalid;
16511
- };
16729
+ renderLoadingText() {
16730
+ const { customHTMLEnabled, loadingText } = this;
16731
+ if (customHTMLEnabled) {
16732
+ return hAsync("div", { class: "infinite-loading-text", innerHTML: sanitizeDOMString(loadingText) });
16733
+ }
16734
+ return hAsync("div", { class: "infinite-loading-text" }, this.loadingText);
16735
+ }
16736
+ render() {
16737
+ const mode = getIonMode$1(this);
16738
+ return (hAsync(Host, { key: '7c16060dcfe2a0b0fb3e2f8f4c449589a76f1baa', class: {
16739
+ [mode]: true,
16740
+ // Used internally for styling
16741
+ [`infinite-scroll-content-${mode}`]: true,
16742
+ } }, hAsync("div", { key: 'a94f4d8746e053dc718f97520bd7e48cb316443a', class: "infinite-loading" }, this.loadingSpinner && (hAsync("div", { key: '10143d5d2a50a2a2bc5de1cee8e7ab51263bcf23', class: "infinite-loading-spinner" }, hAsync("ion-spinner", { key: '8846e88191690d9c61a0b462889ed56fbfed8b0d', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
16743
+ }
16744
+ static get style() { return {
16745
+ ios: infiniteScrollContentIosCss,
16746
+ md: infiniteScrollContentMdCss
16747
+ }; }
16748
+ static get cmpMeta() { return {
16749
+ "$flags$": 288,
16750
+ "$tagName$": "ion-infinite-scroll-content",
16751
+ "$members$": {
16752
+ "loadingSpinner": [1025, "loading-spinner"],
16753
+ "loadingText": [1, "loading-text"]
16754
+ },
16755
+ "$listeners$": undefined,
16756
+ "$lazyBundleId$": "-",
16757
+ "$attrsToReflect$": []
16758
+ }; }
16759
+ }
16512
16760
 
16513
16761
  /**
16514
16762
  * Used to update a scoped component that uses emulated slots. This fires when
@@ -18229,7 +18477,7 @@ class Item {
18229
18477
  "color": [513],
18230
18478
  "button": [4],
18231
18479
  "detail": [4],
18232
- "detailIcon": [8, "detail-icon"],
18480
+ "detailIcon": [1, "detail-icon"],
18233
18481
  "disabled": [516],
18234
18482
  "download": [1],
18235
18483
  "href": [1],
@@ -22965,7 +23213,13 @@ class Modal {
22965
23213
  };
22966
23214
  window.addEventListener(KEYBOARD_DID_OPEN, this.keyboardOpenCallback);
22967
23215
  }
22968
- if (this.isSheetModal) {
23216
+ /**
23217
+ * Recalculate isSheetModal because framework bindings (e.g., Angular)
23218
+ * may not have been applied when componentWillLoad ran.
23219
+ */
23220
+ const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
23221
+ this.isSheetModal = isSheetModal;
23222
+ if (isSheetModal) {
22969
23223
  this.initSheetGesture();
22970
23224
  }
22971
23225
  else if (hasCardModal) {
@@ -23047,6 +23301,79 @@ class Modal {
23047
23301
  this.gesture = gesture;
23048
23302
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
23049
23303
  this.gesture.enable(true);
23304
+ /**
23305
+ * When backdrop interaction is allowed, nested router outlets from child routes
23306
+ * may block pointer events to parent content. Apply passthrough styles only when
23307
+ * the modal was the sole content of a child route page.
23308
+ * See https://github.com/ionic-team/ionic-framework/issues/30700
23309
+ */
23310
+ const backdropNotBlocking = this.showBackdrop === false || this.focusTrap === false || backdropBreakpoint > 0;
23311
+ if (backdropNotBlocking) {
23312
+ this.setupChildRoutePassthrough();
23313
+ }
23314
+ }
23315
+ /**
23316
+ * For sheet modals that allow background interaction, sets up pointer-events
23317
+ * passthrough on child route page wrappers and nested router outlets.
23318
+ */
23319
+ setupChildRoutePassthrough() {
23320
+ var _a;
23321
+ // Cache the page parent for cleanup
23322
+ this.cachedPageParent = this.getOriginalPageParent();
23323
+ const pageParent = this.cachedPageParent;
23324
+ // Skip ion-app (controller modals) and pages with visible sibling content next to the modal
23325
+ if (!pageParent || pageParent.tagName === 'ION-APP') {
23326
+ return;
23327
+ }
23328
+ const hasVisibleContent = Array.from(pageParent.children).some((child) => {
23329
+ var _a;
23330
+ return child !== this.el &&
23331
+ !(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
23332
+ child.tagName !== 'TEMPLATE' &&
23333
+ child.tagName !== 'SLOT' &&
23334
+ !(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
23335
+ });
23336
+ if (hasVisibleContent) {
23337
+ return;
23338
+ }
23339
+ // Child route case: page only contained the modal
23340
+ pageParent.classList.add('ion-page-overlay-passthrough');
23341
+ // Also make nested router outlets passthrough
23342
+ const routerOutlet = pageParent.parentElement;
23343
+ if ((routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.tagName) === 'ION-ROUTER-OUTLET' && ((_a = routerOutlet.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) !== 'ION-APP') {
23344
+ routerOutlet.style.setProperty('pointer-events', 'none');
23345
+ routerOutlet.setAttribute('data-overlay-passthrough', 'true');
23346
+ }
23347
+ }
23348
+ /**
23349
+ * Finds the ion-page ancestor of the modal's original parent location.
23350
+ */
23351
+ getOriginalPageParent() {
23352
+ if (!this.cachedOriginalParent) {
23353
+ return null;
23354
+ }
23355
+ let pageParent = this.cachedOriginalParent;
23356
+ while (pageParent && !pageParent.classList.contains('ion-page')) {
23357
+ pageParent = pageParent.parentElement;
23358
+ }
23359
+ return pageParent;
23360
+ }
23361
+ /**
23362
+ * Removes passthrough styles added by setupChildRoutePassthrough.
23363
+ */
23364
+ cleanupChildRoutePassthrough() {
23365
+ const pageParent = this.cachedPageParent;
23366
+ if (!pageParent) {
23367
+ return;
23368
+ }
23369
+ pageParent.classList.remove('ion-page-overlay-passthrough');
23370
+ const routerOutlet = pageParent.parentElement;
23371
+ if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
23372
+ routerOutlet.style.removeProperty('pointer-events');
23373
+ routerOutlet.removeAttribute('data-overlay-passthrough');
23374
+ }
23375
+ // Clear the cached reference
23376
+ this.cachedPageParent = undefined;
23050
23377
  }
23051
23378
  sheetOnDismiss() {
23052
23379
  /**
@@ -23136,6 +23463,7 @@ class Modal {
23136
23463
  }
23137
23464
  this.cleanupViewTransitionListener();
23138
23465
  this.cleanupParentRemovalObserver();
23466
+ this.cleanupChildRoutePassthrough();
23139
23467
  }
23140
23468
  this.currentBreakpoint = undefined;
23141
23469
  this.animation = undefined;
@@ -23332,6 +23660,17 @@ class Modal {
23332
23660
  this.cachedOriginalParent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
23333
23661
  return;
23334
23662
  }
23663
+ /**
23664
+ * Don't observe for controller-based modals or when the parent is the
23665
+ * app root (document.body or ion-app). These parents won't be removed,
23666
+ * and observing document.body with subtree: true causes performance
23667
+ * issues with frameworks like Angular during change detection.
23668
+ */
23669
+ if (this.hasController ||
23670
+ this.cachedOriginalParent === document.body ||
23671
+ this.cachedOriginalParent.tagName === 'ION-APP') {
23672
+ return;
23673
+ }
23335
23674
  this.parentRemovalObserver = new MutationObserver((mutations) => {
23336
23675
  mutations.forEach((mutation) => {
23337
23676
  if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
@@ -23373,20 +23712,20 @@ class Modal {
23373
23712
  const isCardModal = presentingElement !== undefined && mode === 'ios';
23374
23713
  const isHandleCycle = handleBehavior === 'cycle';
23375
23714
  const isSheetModalWithHandle = isSheetModal && showHandle;
23376
- return (hAsync(Host, Object.assign({ key: '9e9a7bd591eb17a225a00b4fa2e379e94601d17f', "no-router": true,
23715
+ return (hAsync(Host, Object.assign({ key: '9a75095a13de0cfc96f1fa69fd92777d25da8daa', "no-router": true,
23377
23716
  // Allow the modal to be navigable when the handle is focusable
23378
23717
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
23379
23718
  zIndex: `${20000 + this.overlayIndex}`,
23380
- }, 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, onFocus: this.onModalFocus }), hAsync("ion-backdrop", { key: 'e5eae2c14f830f75e308fcd7f4c10c86fac5b962', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: 'e268f9cd310c3cf4e051b5b92524ce4fb70d005e', class: "modal-shadow" }), hAsync("div", Object.assign({ key: '9c380f36c18144c153077b15744d1c3346bce63e',
23719
+ }, 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, onFocus: this.onModalFocus }), hAsync("ion-backdrop", { key: 'd02612d8063ef20f59f173ff47795f71cdaaf63e', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: '708761b70a93e34c08faae079569f444c7416a4c', class: "modal-shadow" }), hAsync("div", Object.assign({ key: 'a72226ff1a98229f9bfd9207b98fc57e02baa430',
23381
23720
  /*
23382
23721
  role and aria-modal must be used on the
23383
23722
  same element. They must also be set inside the
23384
23723
  shadow DOM otherwise ion-button will not be highlighted
23385
23724
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
23386
23725
  */
23387
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: '2d5ee6d5959d97309c306e8ce72eb0f2c19be144', class: "modal-handle",
23726
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: '0547f32323882660221385d84d492929caa77c6b', class: "modal-handle",
23388
23727
  // Prevents the handle from receiving keyboard focus when it does not cycle
23389
- tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: '5590434c35ea04c42fc006498bc189038e15a298', onSlotchange: this.onSlotChange }))));
23728
+ tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: 'fccbd64518b6fa22f9e874deb6b4ba55d8d89c3b', onSlotchange: this.onSlotChange }))));
23390
23729
  }
23391
23730
  get el() { return getElement(this); }
23392
23731
  static get watchers() { return {
@@ -23426,6 +23765,7 @@ class Modal {
23426
23765
  "keepContentsMounted": [4, "keep-contents-mounted"],
23427
23766
  "focusTrap": [4, "focus-trap"],
23428
23767
  "canDismiss": [4, "can-dismiss"],
23768
+ "isSheetModal": [32],
23429
23769
  "presented": [32],
23430
23770
  "present": [64],
23431
23771
  "dismiss": [64],
@@ -27493,6 +27833,10 @@ class Popover {
27493
27833
  if (destroyTriggerInteraction) {
27494
27834
  destroyTriggerInteraction();
27495
27835
  }
27836
+ if (this.headerResizeObserver) {
27837
+ this.headerResizeObserver.disconnect();
27838
+ this.headerResizeObserver = undefined;
27839
+ }
27496
27840
  }
27497
27841
  componentWillLoad() {
27498
27842
  var _a, _b;
@@ -27595,6 +27939,7 @@ class Popover {
27595
27939
  */
27596
27940
  this.ionMount.emit();
27597
27941
  this.usersElement = await attachComponent(delegate, el, this.component, ['popover-viewport'], this.componentProps, inline);
27942
+ this.recalculateContentOnHeaderReady();
27598
27943
  if (!this.keyboardEvents) {
27599
27944
  this.configureKeyboardInteraction();
27600
27945
  }
@@ -27640,6 +27985,35 @@ class Popover {
27640
27985
  }
27641
27986
  unlock();
27642
27987
  }
27988
+ /**
27989
+ * Watch the header for height changes and trigger content dimension
27990
+ * recalculation when the header has a height > 0. This sets the offset-top
27991
+ * of the content to the height of the header correctly.
27992
+ */
27993
+ recalculateContentOnHeaderReady() {
27994
+ var _a;
27995
+ const popoverContent = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.popover-content');
27996
+ if (!popoverContent) {
27997
+ return;
27998
+ }
27999
+ const contentContainer = this.usersElement || popoverContent;
28000
+ const header = contentContainer.querySelector('ion-header');
28001
+ const contentElements = contentContainer.querySelectorAll('ion-content');
28002
+ if (!header || contentElements.length === 0) {
28003
+ return;
28004
+ }
28005
+ this.headerResizeObserver = new ResizeObserver(async () => {
28006
+ var _a;
28007
+ if (header.offsetHeight > 0) {
28008
+ (_a = this.headerResizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
28009
+ this.headerResizeObserver = undefined;
28010
+ for (const contentEl of contentElements) {
28011
+ await contentEl.recalculateDimensions();
28012
+ }
28013
+ }
28014
+ });
28015
+ this.headerResizeObserver.observe(header);
28016
+ }
27643
28017
  /**
27644
28018
  * Dismiss the popover overlay after it has been presented.
27645
28019
  * This is a no-op if the overlay has not been presented yet. If you want
@@ -27701,9 +28075,9 @@ class Popover {
27701
28075
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
27702
28076
  const desktop = isPlatform('desktop');
27703
28077
  const enableArrow = arrow && !parentPopover;
27704
- return (hAsync(Host, Object.assign({ key: '16866c02534968c982cf4730d2936d03a5107c8b', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
28078
+ return (hAsync(Host, Object.assign({ key: '42863f748c93f709d433931d969230137b37d42d', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
27705
28079
  zIndex: `${20000 + this.overlayIndex}`,
27706
- }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && hAsync("ion-backdrop", { key: '0df258601a4d30df3c27aa8234a7d5e056c3ecbb', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), hAsync("div", { key: 'f94e80ed996b957b5cd09b826472b4f60e8fcc78', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && hAsync("div", { key: '185ce22f6386e8444a9cc7b8818dbfc16c463c99', class: "popover-arrow", part: "arrow" }), hAsync("div", { key: '206202b299404e110de5397b229678cca18568d3', class: "popover-content", part: "content" }, hAsync("slot", { key: 'ee543a0b92d6e35a837c0a0e4617c7b0fc4ad0b0' })))));
28080
+ }, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && hAsync("ion-backdrop", { key: '22b6d82178b52158b76ab3fd9a7dd738fd6e4bbf', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), hAsync("div", { key: 'b76335c64e992a964ed3fb91d17a992c3474b4cd', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && hAsync("div", { key: '018c846c32e7ff7fa010528e6b37a17e5f03c84c', class: "popover-arrow", part: "arrow" }), hAsync("div", { key: '350c468c80052da3a07768bceab98fe159c35a43', class: "popover-content", part: "content" }, hAsync("slot", { key: '686443c17ac9873d33905c1cdb67e6d6da675282' })))));
27707
28081
  }
27708
28082
  get el() { return getElement(this); }
27709
28083
  static get watchers() { return {
@@ -28053,6 +28427,10 @@ class RadioGroup {
28053
28427
  this.helperTextId = `${this.inputId}-helper-text`;
28054
28428
  this.errorTextId = `${this.inputId}-error-text`;
28055
28429
  this.labelId = `${this.inputId}-lbl`;
28430
+ /**
28431
+ * Track validation state for proper aria-live announcements.
28432
+ */
28433
+ this.isInvalid = false;
28056
28434
  /**
28057
28435
  * If `true`, the radios can be deselected.
28058
28436
  */
@@ -28134,6 +28512,18 @@ class RadioGroup {
28134
28512
  this.labelId = label.id = this.name + '-lbl';
28135
28513
  }
28136
28514
  }
28515
+ // Always set initial state
28516
+ this.isInvalid = checkInvalidState(this.el);
28517
+ }
28518
+ componentWillLoad() {
28519
+ this.hintTextId = this.getHintTextId();
28520
+ }
28521
+ disconnectedCallback() {
28522
+ // Clean up validation observer to prevent memory leaks.
28523
+ if (this.validationObserver) {
28524
+ this.validationObserver.disconnect();
28525
+ this.validationObserver = undefined;
28526
+ }
28137
28527
  }
28138
28528
  getRadios() {
28139
28529
  return Array.from(this.el.querySelectorAll('ion-radio'));
@@ -28209,16 +28599,16 @@ class RadioGroup {
28209
28599
  * Renders the helper text or error text values
28210
28600
  */
28211
28601
  renderHintText() {
28212
- const { helperText, errorText, helperTextId, errorTextId } = this;
28602
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
28213
28603
  const hasHintText = !!helperText || !!errorText;
28214
28604
  if (!hasHintText) {
28215
28605
  return;
28216
28606
  }
28217
- return (hAsync("div", { class: "radio-group-top" }, hAsync("div", { id: helperTextId, class: "helper-text" }, helperText), hAsync("div", { id: errorTextId, class: "error-text" }, errorText)));
28607
+ return (hAsync("div", { class: "radio-group-top" }, hAsync("div", { id: helperTextId, class: "helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null), hAsync("div", { id: errorTextId, class: "error-text", role: "alert" }, isInvalid ? errorText : null)));
28218
28608
  }
28219
- getHintTextID() {
28220
- const { el, helperText, errorText, helperTextId, errorTextId } = this;
28221
- if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
28609
+ getHintTextId() {
28610
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
28611
+ if (isInvalid && errorText) {
28222
28612
  return errorTextId;
28223
28613
  }
28224
28614
  if (helperText) {
@@ -28230,7 +28620,7 @@ class RadioGroup {
28230
28620
  const { label, labelId, el, name, value } = this;
28231
28621
  const mode = getIonMode$1(this);
28232
28622
  renderHiddenInput(true, el, name, value, false);
28233
- return (hAsync(Host, { key: '81b8ebc96b2f383c36717f290d2959cc921ad6e8', role: "radiogroup", "aria-labelledby": label ? labelId : null, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId, onClick: this.onClick, class: mode }, this.renderHintText(), hAsync("div", { key: '45b09efc10776b889a8f372cba80d25a3fc849da', class: "radio-group-wrapper" }, hAsync("slot", { key: '58714934542c2fdd7396de160364f3f06b32e8f8' }))));
28623
+ return (hAsync(Host, { key: 'db593b3ed511e9395e3c7bfd91b787328692cd6d', role: "radiogroup", "aria-labelledby": label ? labelId : null, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, onClick: this.onClick, class: mode }, this.renderHintText(), hAsync("div", { key: '85045b45a0100a45f3b9a35d1c5a25ec63d525c4', class: "radio-group-wrapper" }, hAsync("slot", { key: '53dacb87ce62398e78771fb2efaf839ab922d946' }))));
28234
28624
  }
28235
28625
  get el() { return getElement(this); }
28236
28626
  static get watchers() { return {
@@ -28250,6 +28640,8 @@ class RadioGroup {
28250
28640
  "value": [1032],
28251
28641
  "helperText": [1, "helper-text"],
28252
28642
  "errorText": [1, "error-text"],
28643
+ "isInvalid": [32],
28644
+ "hintTextId": [32],
28253
28645
  "setFocus": [64]
28254
28646
  },
28255
28647
  "$listeners$": [[4, "keydown", "onKeydown"]],
@@ -33378,7 +33770,7 @@ class Select {
33378
33770
  }
33379
33771
  componentWillLoad() {
33380
33772
  this.inheritedAttributes = inheritAttributes$1(this.el, ['aria-label']);
33381
- this.hintTextID = this.getHintTextID();
33773
+ this.hintTextId = this.getHintTextId();
33382
33774
  }
33383
33775
  componentDidLoad() {
33384
33776
  /**
@@ -33557,13 +33949,18 @@ class Select {
33557
33949
  .filter((cls) => cls !== 'hydrated')
33558
33950
  .join(' ');
33559
33951
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
33952
+ const isSelected = isOptionSelected(selectValue, value, this.compareWith);
33560
33953
  return {
33561
- role: isOptionSelected(selectValue, value, this.compareWith) ? 'selected' : '',
33954
+ role: isSelected ? 'selected' : '',
33562
33955
  text: option.textContent,
33563
33956
  cssClass: optClass,
33564
33957
  handler: () => {
33565
33958
  this.setValue(value);
33566
33959
  },
33960
+ htmlAttributes: {
33961
+ 'aria-checked': isSelected ? 'true' : 'false',
33962
+ role: 'radio',
33963
+ },
33567
33964
  };
33568
33965
  });
33569
33966
  // Add "cancel" button
@@ -33877,9 +34274,9 @@ class Select {
33877
34274
  }
33878
34275
  renderListbox() {
33879
34276
  const { disabled, inputId, isExpanded, required } = this;
33880
- return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-describedby": this.hintTextID, "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
34277
+ return (hAsync("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
33881
34278
  }
33882
- getHintTextID() {
34279
+ getHintTextId() {
33883
34280
  const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
33884
34281
  if (isInvalid && errorText) {
33885
34282
  return errorTextId;
@@ -33944,7 +34341,7 @@ class Select {
33944
34341
  * TODO(FW-5592): Remove hasStartEndSlots condition
33945
34342
  */
33946
34343
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
33947
- return (hAsync(Host, { key: '35b5e18e6f79a802ff2d46d1242e80ff755cc0b9', onClick: this.onClick, class: createColorClasses$1(this.color, {
34344
+ return (hAsync(Host, { key: 'd8026835993d0e6dce747098f741a06ae4e4f54d', onClick: this.onClick, class: createColorClasses$1(this.color, {
33948
34345
  [mode]: true,
33949
34346
  'in-item': inItem,
33950
34347
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -33962,7 +34359,7 @@ class Select {
33962
34359
  [`select-justify-${justify}`]: justifyEnabled,
33963
34360
  [`select-shape-${shape}`]: shape !== undefined,
33964
34361
  [`select-label-placement-${labelPlacement}`]: true,
33965
- }) }, hAsync("label", { key: '6005b34a0c50bc4d7653a4276bc232ecd02e083c', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: 'c7e07aa81ae856c057f16275dd058f37c5670a47', class: "select-wrapper-inner" }, hAsync("slot", { key: '7fc2deefe0424404caacdbbd9e08ed43ba55d28a', name: "start" }), hAsync("div", { key: '157d74ee717b1bc30b5f1c233a09b0c8456aa68e', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), hAsync("slot", { key: 'ea66db304528b82bf9317730b6dce3db2612f235', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && hAsync("div", { key: '786eb1530b7476f0615d4e7c0bf4e7e4dc66509c', class: "select-highlight" })), this.renderBottomContent()));
34362
+ }) }, hAsync("label", { key: 'fcfb40209d6d07d49c7fdca4884b31abf6ac2567', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: 'f191664f2290c3890bde1156157c83a6ff17dbe2', class: "select-wrapper-inner" }, hAsync("slot", { key: '317a28d1115b4214f291e228ce0fe6fc782e57d5', name: "start" }), hAsync("div", { key: 'db68e18abd5ca3a1023d7c7b58bf89893ae18073', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), hAsync("slot", { key: '4274e042267c2234a198b0f65c89477898d08130', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && hAsync("div", { key: '2e2eb1ee2b2791e0683d9afb186fde6e938ca59c', class: "select-highlight" })), this.renderBottomContent()));
33966
34363
  }
33967
34364
  get el() { return getElement(this); }
33968
34365
  static get watchers() { return {
@@ -34004,7 +34401,7 @@ class Select {
34004
34401
  "isExpanded": [32],
34005
34402
  "hasFocus": [32],
34006
34403
  "isInvalid": [32],
34007
- "hintTextID": [32],
34404
+ "hintTextId": [32],
34008
34405
  "open": [64]
34009
34406
  },
34010
34407
  "$listeners$": undefined,
@@ -36475,6 +36872,10 @@ class Toggle {
36475
36872
  this.inheritedAttributes = {};
36476
36873
  this.didLoad = false;
36477
36874
  this.activated = false;
36875
+ /**
36876
+ * Track validation state for proper aria-live announcements.
36877
+ */
36878
+ this.isInvalid = false;
36478
36879
  /**
36479
36880
  * The name of the control, which is submitted with the form data.
36480
36881
  */
@@ -36588,15 +36989,18 @@ class Toggle {
36588
36989
  });
36589
36990
  }
36590
36991
  async connectedCallback() {
36992
+ const { didLoad, el } = this;
36591
36993
  /**
36592
36994
  * If we have not yet rendered
36593
36995
  * ion-toggle, then toggleTrack is not defined.
36594
36996
  * But if we are moving ion-toggle via appendChild,
36595
36997
  * then toggleTrack will be defined.
36596
36998
  */
36597
- if (this.didLoad) {
36999
+ if (didLoad) {
36598
37000
  this.setupGesture();
36599
37001
  }
37002
+ // Always set initial state
37003
+ this.isInvalid = checkInvalidState(el);
36600
37004
  }
36601
37005
  componentDidLoad() {
36602
37006
  this.setupGesture();
@@ -36607,9 +37011,15 @@ class Toggle {
36607
37011
  this.gesture.destroy();
36608
37012
  this.gesture = undefined;
36609
37013
  }
37014
+ // Clean up validation observer to prevent memory leaks.
37015
+ if (this.validationObserver) {
37016
+ this.validationObserver.disconnect();
37017
+ this.validationObserver = undefined;
37018
+ }
36610
37019
  }
36611
37020
  componentWillLoad() {
36612
37021
  this.inheritedAttributes = Object.assign({}, inheritAriaAttributes(this.el));
37022
+ this.hintTextId = this.getHintTextId();
36613
37023
  }
36614
37024
  onStart() {
36615
37025
  this.activated = true;
@@ -36650,9 +37060,9 @@ class Toggle {
36650
37060
  get hasLabel() {
36651
37061
  return this.el.textContent !== '';
36652
37062
  }
36653
- getHintTextID() {
36654
- const { el, helperText, errorText, helperTextId, errorTextId } = this;
36655
- if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
37063
+ getHintTextId() {
37064
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
37065
+ if (isInvalid && errorText) {
36656
37066
  return errorTextId;
36657
37067
  }
36658
37068
  if (helperText) {
@@ -36665,7 +37075,7 @@ class Toggle {
36665
37075
  * This element should only be rendered if hint text is set.
36666
37076
  */
36667
37077
  renderHintText() {
36668
- const { helperText, errorText, helperTextId, errorTextId } = this;
37078
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
36669
37079
  /**
36670
37080
  * undefined and empty string values should
36671
37081
  * be treated as not having helper/error text.
@@ -36674,15 +37084,15 @@ class Toggle {
36674
37084
  if (!hasHintText) {
36675
37085
  return;
36676
37086
  }
36677
- return (hAsync("div", { class: "toggle-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text" }, helperText), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text" }, errorText)));
37087
+ return (hAsync("div", { class: "toggle-bottom" }, hAsync("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null), hAsync("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text", role: "alert" }, isInvalid ? errorText : null)));
36678
37088
  }
36679
37089
  render() {
36680
- const { activated, alignment, checked, color, disabled, el, errorTextId, hasLabel, inheritedAttributes, inputId, inputLabelId, justify, labelPlacement, name, required, } = this;
37090
+ const { activated, alignment, checked, color, disabled, el, hasLabel, inheritedAttributes, inputId, inputLabelId, justify, labelPlacement, name, required, } = this;
36681
37091
  const mode = getIonMode$1(this);
36682
37092
  const value = this.getValue();
36683
37093
  const rtl = isRTL$1(el) ? 'rtl' : 'ltr';
36684
37094
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
36685
- return (hAsync(Host, { key: '17bbbc8d229868e5c872b2bc5a3faf579780c5e0', role: "switch", "aria-checked": `${checked}`, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === errorTextId, onClick: this.onClick, "aria-labelledby": hasLabel ? inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, class: createColorClasses$1(color, {
37095
+ return (hAsync(Host, { key: 'f569148edd89ee041a4719ffc4733c16b05229bd', role: "switch", "aria-checked": `${checked}`, "aria-describedby": this.hintTextId, "aria-invalid": this.isInvalid ? 'true' : undefined, onClick: this.onClick, "aria-labelledby": hasLabel ? inputLabelId : null, "aria-label": inheritedAttributes['aria-label'] || null, "aria-disabled": disabled ? 'true' : null, "aria-required": required ? 'true' : undefined, tabindex: disabled ? undefined : 0, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, class: createColorClasses$1(color, {
36686
37096
  [mode]: true,
36687
37097
  'in-item': hostContext('ion-item', el),
36688
37098
  'toggle-activated': activated,
@@ -36692,10 +37102,10 @@ class Toggle {
36692
37102
  [`toggle-alignment-${alignment}`]: alignment !== undefined,
36693
37103
  [`toggle-label-placement-${labelPlacement}`]: true,
36694
37104
  [`toggle-${rtl}`]: true,
36695
- }) }, hAsync("label", { key: '673625b62a2c909e95dccb642c91312967a6cd1c', class: "toggle-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '7dc3f357b4708116663970047765da9f8f845bf0', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, required: required }, inheritedAttributes)), hAsync("div", { key: '8f1c6a182031e8cbc6727e5f4ac0e00ad4247447', class: {
37105
+ }) }, hAsync("label", { key: '3027f2ac4be6de422a14486d847fbee77f615db1', class: "toggle-wrapper", htmlFor: inputId }, hAsync("input", Object.assign({ key: '4b0304c9e879e432b80184b4e5de37d55c11b436', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, required: required }, inheritedAttributes)), hAsync("div", { key: '8ef265ec942e7f01ff31cbb202ed146c6bf94e02', class: {
36696
37106
  'label-text-wrapper': true,
36697
37107
  'label-text-wrapper-hidden': !hasLabel,
36698
- }, part: "label", id: inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: '8322b9d54dc7edeb4e16fefcde9f7ebca8d5c3e1' }), this.renderHintText()), hAsync("div", { key: 'fe6984143db817a7b3020a3f57cf5418fc3dcc0e', class: "native-wrapper" }, this.renderToggleControl()))));
37108
+ }, part: "label", id: inputLabelId, onClick: this.onDivLabelClick }, hAsync("slot", { key: '7b162b7dd27199cca2a4c995276a18b9f8e44aaf' }), this.renderHintText()), hAsync("div", { key: 'd13c34bd42fca01cc73ddb4ea7e471b33a282a3e', class: "native-wrapper" }, this.renderToggleControl()))));
36699
37109
  }
36700
37110
  get el() { return getElement(this); }
36701
37111
  static get watchers() { return {
@@ -36721,7 +37131,9 @@ class Toggle {
36721
37131
  "justify": [1],
36722
37132
  "alignment": [1],
36723
37133
  "required": [4],
36724
- "activated": [32]
37134
+ "activated": [32],
37135
+ "isInvalid": [32],
37136
+ "hintTextId": [32]
36725
37137
  },
36726
37138
  "$listeners$": undefined,
36727
37139
  "$lazyBundleId$": "-",