@ionic/core 8.8.7-dev.11779400352.127ba526 → 8.8.7-dev.11779467048.1641d05e

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 (321) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-action-sheet.js +1 -1
  3. package/components/ion-alert.js +1 -1
  4. package/components/ion-back-button.js +1 -1
  5. package/components/ion-button.js +1 -1
  6. package/components/ion-card.js +1 -1
  7. package/components/ion-chip.js +1 -1
  8. package/components/ion-datetime-button.js +1 -1
  9. package/components/ion-datetime.js +1 -1
  10. package/components/ion-fab-button.js +1 -1
  11. package/components/ion-gallery.js +1 -1
  12. package/components/ion-grid.js +1 -1
  13. package/components/ion-header.js +1 -1
  14. package/components/ion-img.js +1 -1
  15. package/components/ion-infinite-scroll-content.js +1 -1
  16. package/components/ion-infinite-scroll.js +1 -1
  17. package/components/ion-input-otp.js +1 -1
  18. package/components/ion-input-password-toggle.js +1 -1
  19. package/components/ion-input.js +1 -1
  20. package/components/ion-item-divider.js +1 -1
  21. package/components/ion-item-group.js +1 -1
  22. package/components/ion-item-option.js +1 -1
  23. package/components/ion-item-options.js +1 -1
  24. package/components/ion-item-sliding.js +1 -1
  25. package/components/ion-item.js +1 -1
  26. package/components/ion-label.js +1 -1
  27. package/components/ion-list-header.js +1 -1
  28. package/components/ion-list.js +1 -1
  29. package/components/ion-loading.js +1 -1
  30. package/components/ion-menu-button.js +1 -1
  31. package/components/ion-menu-toggle.js +1 -1
  32. package/components/ion-menu.js +1 -1
  33. package/components/ion-modal.js +1 -1
  34. package/components/ion-nav-link.js +1 -1
  35. package/components/ion-nav.js +1 -1
  36. package/components/ion-note.js +1 -1
  37. package/components/ion-picker-column-option.js +1 -1
  38. package/components/ion-picker-legacy-column.js +1 -1
  39. package/components/ion-picker-legacy.js +1 -1
  40. package/components/ion-popover.js +1 -1
  41. package/components/ion-progress-bar.js +1 -1
  42. package/components/ion-radio-group.js +1 -1
  43. package/components/ion-radio.js +1 -1
  44. package/components/ion-range.js +1 -1
  45. package/components/ion-refresher-content.js +1 -1
  46. package/components/ion-refresher.js +1 -1
  47. package/components/ion-reorder-group.js +1 -1
  48. package/components/ion-reorder.js +1 -1
  49. package/components/ion-ripple-effect.js +1 -1
  50. package/components/ion-router-link.js +1 -1
  51. package/components/ion-router-outlet.js +1 -1
  52. package/components/ion-row.js +1 -1
  53. package/components/ion-searchbar.js +1 -1
  54. package/components/ion-segment-button.js +1 -1
  55. package/components/ion-segment-content.js +1 -1
  56. package/components/ion-segment-view.js +1 -1
  57. package/components/ion-segment.js +1 -1
  58. package/components/ion-select-modal.js +1 -1
  59. package/components/ion-select-option.js +1 -1
  60. package/components/ion-select-popover.js +1 -1
  61. package/components/ion-select.js +1 -1
  62. package/components/ion-skeleton-text.js +1 -1
  63. package/components/ion-spinner.js +1 -1
  64. package/components/ion-split-pane.js +1 -1
  65. package/components/ion-tab-bar.js +1 -1
  66. package/components/ion-tab-button.js +1 -1
  67. package/components/ion-tab.js +1 -1
  68. package/components/ion-tabs.js +1 -1
  69. package/components/ion-text.js +1 -1
  70. package/components/ion-textarea.js +1 -1
  71. package/components/ion-thumbnail.js +1 -1
  72. package/components/ion-title.js +1 -1
  73. package/components/ion-toast.js +1 -1
  74. package/components/ion-toggle.js +1 -1
  75. package/components/ion-toolbar.js +1 -1
  76. package/components/{p-B-oPDoNQ.js → p-BFbsici0.js} +1 -1
  77. package/components/{p-6_r-Odtt.js → p-BLCuPAtN.js} +1 -1
  78. package/components/{p-CSf_VKpz.js → p-BRWWcnBq.js} +1 -1
  79. package/components/{p-CvljGih0.js → p-BXcCGjEc.js} +1 -1
  80. package/components/{p-DZOqbnq2.js → p-BqImG3uk.js} +1 -1
  81. package/components/{p-D42P_qbe.js → p-C38HUpU5.js} +1 -1
  82. package/components/{p-Ddl4_R29.js → p-C4G6C9fP.js} +1 -1
  83. package/components/{p-C-Vjb84N.js → p-C8ktKu9j.js} +1 -1
  84. package/components/{p-J7srYGKf.js → p-CIoAIKEr.js} +1 -1
  85. package/components/{p-BhkRbo3L.js → p-CN-WzkJE.js} +1 -1
  86. package/components/p-CVRxImH6.js +4 -0
  87. package/components/{p-KF2RUDHO.js → p-CoFDGTFO.js} +1 -1
  88. package/components/{p-n94Bzx6_.js → p-CoFqDNc5.js} +1 -1
  89. package/components/{p-vGxjPSKT.js → p-CykCvfXQ.js} +1 -1
  90. package/components/p-DHTe6lDL.js +4 -0
  91. package/components/{p-C75do9pU.js → p-DH_9VCbD.js} +1 -1
  92. package/components/{p-Ct1_qpJ-.js → p-DTtRWhIZ.js} +1 -1
  93. package/components/{p-BdmDSErh.js → p-DXUyXgVL.js} +1 -1
  94. package/components/{p-BLHs-wsh.js → p-IMXp2Inn.js} +1 -1
  95. package/components/{p-lEYPO4ZC.js → p-TR4ubkPu.js} +1 -1
  96. package/components/{p-CieebRr6.js → p-qZr7hBPz.js} +1 -1
  97. package/dist/cjs/index.cjs.js +1 -1
  98. package/dist/cjs/ion-action-sheet.cjs.entry.js +1 -1
  99. package/dist/cjs/ion-alert.cjs.entry.js +1 -1
  100. package/dist/cjs/ion-app_8.cjs.entry.js +7 -7
  101. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  102. package/dist/cjs/ion-col_3.cjs.entry.js +4 -4
  103. package/dist/cjs/ion-datetime_3.cjs.entry.js +5 -5
  104. package/dist/cjs/ion-gallery.cjs.entry.js +8 -57
  105. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  106. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +3 -3
  107. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  108. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +3 -3
  109. package/dist/cjs/ion-input.cjs.entry.js +4 -4
  110. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  111. package/dist/cjs/ion-item_8.cjs.entry.js +12 -12
  112. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  113. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  114. package/dist/cjs/ion-modal.cjs.entry.js +5 -5
  115. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  116. package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
  117. package/dist/cjs/ion-popover.cjs.entry.js +3 -3
  118. package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
  119. package/dist/cjs/ion-radio_2.cjs.entry.js +5 -5
  120. package/dist/cjs/ion-range.cjs.entry.js +3 -3
  121. package/dist/cjs/ion-refresher_2.cjs.entry.js +3 -3
  122. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  123. package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
  124. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  125. package/dist/cjs/ion-searchbar.cjs.entry.js +4 -4
  126. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  127. package/dist/cjs/ion-segment-view.cjs.entry.js +2 -2
  128. package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
  129. package/dist/cjs/ion-select-modal.cjs.entry.js +2 -2
  130. package/dist/cjs/ion-select_3.cjs.entry.js +7 -7
  131. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  132. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  133. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  134. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  135. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  136. package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
  137. package/dist/cjs/ion-toast.cjs.entry.js +3 -3
  138. package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
  139. package/dist/cjs/ionic.cjs.js +1 -1
  140. package/dist/cjs/loader.cjs.js +1 -1
  141. package/dist/cjs/{overlays-Hci_7vw_.js → overlays-C54DhaTC.js} +187 -10
  142. package/dist/collection/collection-manifest.json +0 -1
  143. package/dist/collection/components/gallery/gallery.css +24 -0
  144. package/dist/collection/components/gallery/gallery.js +7 -56
  145. package/dist/collection/components/gallery/test/utils.js +13 -13
  146. package/dist/collection/components/grid/grid.js +2 -2
  147. package/dist/collection/components/header/header.js +2 -2
  148. package/dist/collection/components/img/img.js +2 -2
  149. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  150. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  151. package/dist/collection/components/input/input.js +4 -4
  152. package/dist/collection/components/input-otp/input-otp.js +3 -3
  153. package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
  154. package/dist/collection/components/item-divider/item-divider.js +2 -2
  155. package/dist/collection/components/item-group/item-group.js +1 -1
  156. package/dist/collection/components/item-option/item-option.js +2 -2
  157. package/dist/collection/components/item-options/item-options.js +1 -1
  158. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  159. package/dist/collection/components/label/label.js +2 -2
  160. package/dist/collection/components/list/list.js +1 -1
  161. package/dist/collection/components/list-header/list-header.js +2 -2
  162. package/dist/collection/components/loading/loading.js +2 -2
  163. package/dist/collection/components/menu/menu.js +2 -2
  164. package/dist/collection/components/menu-button/menu-button.js +2 -2
  165. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  166. package/dist/collection/components/modal/modal.js +4 -4
  167. package/dist/collection/components/nav/nav.js +1 -1
  168. package/dist/collection/components/nav-link/nav-link.js +1 -1
  169. package/dist/collection/components/note/note.js +2 -2
  170. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
  171. package/dist/collection/components/picker-legacy/picker.js +2 -2
  172. package/dist/collection/components/picker-legacy-column/picker-column.js +2 -2
  173. package/dist/collection/components/popover/popover.js +2 -2
  174. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  175. package/dist/collection/components/radio/radio.js +3 -3
  176. package/dist/collection/components/radio-group/radio-group.js +2 -2
  177. package/dist/collection/components/range/range.js +3 -3
  178. package/dist/collection/components/refresher/refresher.js +1 -1
  179. package/dist/collection/components/refresher-content/refresher-content.js +2 -2
  180. package/dist/collection/components/reorder/reorder.js +2 -2
  181. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  182. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  183. package/dist/collection/components/router-link/router-link.js +2 -2
  184. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  185. package/dist/collection/components/row/row.js +2 -2
  186. package/dist/collection/components/searchbar/searchbar.js +4 -4
  187. package/dist/collection/components/segment/segment.js +2 -2
  188. package/dist/collection/components/segment-button/segment-button.js +2 -2
  189. package/dist/collection/components/segment-content/segment-content.js +1 -1
  190. package/dist/collection/components/segment-view/segment-view.js +2 -2
  191. package/dist/collection/components/select/select.js +3 -3
  192. package/dist/collection/components/select-modal/select-modal.js +1 -1
  193. package/dist/collection/components/select-option/select-option.js +1 -1
  194. package/dist/collection/components/select-popover/select-popover.js +2 -2
  195. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  196. package/dist/collection/components/spinner/spinner.js +1 -1
  197. package/dist/collection/components/split-pane/split-pane.js +2 -2
  198. package/dist/collection/components/tab/tab.js +2 -2
  199. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  200. package/dist/collection/components/tab-button/tab-button.js +2 -2
  201. package/dist/collection/components/tabs/tabs.js +1 -1
  202. package/dist/collection/components/text/text.js +2 -2
  203. package/dist/collection/components/textarea/textarea.js +3 -3
  204. package/dist/collection/components/thumbnail/thumbnail.js +2 -2
  205. package/dist/collection/components/title/title.js +2 -2
  206. package/dist/collection/components/toast/toast.js +2 -2
  207. package/dist/collection/components/toggle/toggle.js +3 -3
  208. package/dist/collection/components/toolbar/toolbar.js +2 -2
  209. package/dist/collection/utils/overlays.js +187 -10
  210. package/dist/docs.json +1 -85
  211. package/dist/esm/index.js +1 -1
  212. package/dist/esm/ion-action-sheet.entry.js +1 -1
  213. package/dist/esm/ion-alert.entry.js +1 -1
  214. package/dist/esm/ion-app_8.entry.js +7 -7
  215. package/dist/esm/ion-avatar_3.entry.js +2 -2
  216. package/dist/esm/ion-col_3.entry.js +4 -4
  217. package/dist/esm/ion-datetime_3.entry.js +5 -5
  218. package/dist/esm/ion-gallery.entry.js +8 -57
  219. package/dist/esm/ion-img.entry.js +2 -2
  220. package/dist/esm/ion-infinite-scroll_2.entry.js +3 -3
  221. package/dist/esm/ion-input-otp.entry.js +3 -3
  222. package/dist/esm/ion-input-password-toggle.entry.js +3 -3
  223. package/dist/esm/ion-input.entry.js +4 -4
  224. package/dist/esm/ion-item-option_3.entry.js +4 -4
  225. package/dist/esm/ion-item_8.entry.js +12 -12
  226. package/dist/esm/ion-loading.entry.js +3 -3
  227. package/dist/esm/ion-menu_3.entry.js +7 -7
  228. package/dist/esm/ion-modal.entry.js +5 -5
  229. package/dist/esm/ion-nav_2.entry.js +2 -2
  230. package/dist/esm/ion-picker-column-option.entry.js +2 -2
  231. package/dist/esm/ion-popover.entry.js +3 -3
  232. package/dist/esm/ion-progress-bar.entry.js +1 -1
  233. package/dist/esm/ion-radio_2.entry.js +5 -5
  234. package/dist/esm/ion-range.entry.js +3 -3
  235. package/dist/esm/ion-refresher_2.entry.js +3 -3
  236. package/dist/esm/ion-reorder_2.entry.js +3 -3
  237. package/dist/esm/ion-ripple-effect.entry.js +1 -1
  238. package/dist/esm/ion-route_4.entry.js +2 -2
  239. package/dist/esm/ion-searchbar.entry.js +4 -4
  240. package/dist/esm/ion-segment-content.entry.js +1 -1
  241. package/dist/esm/ion-segment-view.entry.js +2 -2
  242. package/dist/esm/ion-segment_2.entry.js +4 -4
  243. package/dist/esm/ion-select-modal.entry.js +2 -2
  244. package/dist/esm/ion-select_3.entry.js +7 -7
  245. package/dist/esm/ion-spinner.entry.js +1 -1
  246. package/dist/esm/ion-split-pane.entry.js +2 -2
  247. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  248. package/dist/esm/ion-tab_2.entry.js +3 -3
  249. package/dist/esm/ion-text.entry.js +2 -2
  250. package/dist/esm/ion-textarea.entry.js +3 -3
  251. package/dist/esm/ion-toast.entry.js +3 -3
  252. package/dist/esm/ion-toggle.entry.js +3 -3
  253. package/dist/esm/ionic.js +1 -1
  254. package/dist/esm/loader.js +1 -1
  255. package/dist/esm/{overlays-rwDDzEs4.js → overlays-ttYCMKRp.js} +187 -10
  256. package/dist/html.html-data.json +0 -42
  257. package/dist/ionic/index.esm.js +1 -1
  258. package/dist/ionic/ionic.esm.js +1 -1
  259. package/dist/ionic/{p-6911beb3.entry.js → p-00c0bd38.entry.js} +1 -1
  260. package/dist/ionic/p-06bd033b.entry.js +4 -0
  261. package/dist/ionic/{p-b8f7e970.entry.js → p-1709b0aa.entry.js} +1 -1
  262. package/dist/ionic/{p-7761b69d.entry.js → p-1c2c1869.entry.js} +1 -1
  263. package/dist/ionic/{p-bd3ae730.entry.js → p-1c4de46b.entry.js} +1 -1
  264. package/dist/ionic/p-1e1c8d61.entry.js +4 -0
  265. package/dist/ionic/{p-fe073307.entry.js → p-1f74b8d4.entry.js} +1 -1
  266. package/dist/ionic/p-2aa7567e.entry.js +4 -0
  267. package/dist/ionic/{p-455ac83a.entry.js → p-2ad79c23.entry.js} +1 -1
  268. package/dist/ionic/{p-2c252788.entry.js → p-2f8aa0ac.entry.js} +1 -1
  269. package/dist/ionic/{p-3d939d55.entry.js → p-3331cfa9.entry.js} +1 -1
  270. package/dist/ionic/{p-dd1e95c5.entry.js → p-33c34361.entry.js} +1 -1
  271. package/dist/ionic/{p-636aa79b.entry.js → p-3f79f594.entry.js} +1 -1
  272. package/dist/ionic/{p-8291455b.entry.js → p-48026d15.entry.js} +1 -1
  273. package/dist/ionic/{p-e5976b28.entry.js → p-5061a8d4.entry.js} +1 -1
  274. package/dist/ionic/{p-fc01563c.entry.js → p-50b61fab.entry.js} +1 -1
  275. package/dist/ionic/{p-c55a5578.entry.js → p-50cd2d57.entry.js} +1 -1
  276. package/dist/ionic/{p-503219b5.entry.js → p-5274f999.entry.js} +1 -1
  277. package/dist/ionic/{p-c1d6501a.entry.js → p-586d4270.entry.js} +1 -1
  278. package/dist/ionic/{p-e342b205.entry.js → p-7054a1b9.entry.js} +1 -1
  279. package/dist/ionic/{p-cecceb9f.entry.js → p-72491468.entry.js} +1 -1
  280. package/dist/ionic/{p-02a1a45c.entry.js → p-76307d10.entry.js} +1 -1
  281. package/dist/ionic/{p-5b164421.entry.js → p-7d5057c4.entry.js} +1 -1
  282. package/dist/ionic/{p-bb2d2635.entry.js → p-83c693c4.entry.js} +1 -1
  283. package/dist/ionic/{p-fdf0e290.entry.js → p-8537b2fb.entry.js} +1 -1
  284. package/dist/ionic/{p-4a0260e6.entry.js → p-8f04bd89.entry.js} +1 -1
  285. package/dist/ionic/{p-0ef2fcda.entry.js → p-90e653e3.entry.js} +1 -1
  286. package/dist/ionic/p-967576f8.entry.js +4 -0
  287. package/dist/ionic/{p-d604defc.entry.js → p-9d789053.entry.js} +1 -1
  288. package/dist/ionic/p-DdyNaGpi.js +4 -0
  289. package/dist/ionic/{p-65159e09.entry.js → p-ae667493.entry.js} +1 -1
  290. package/dist/ionic/{p-e73a7fe2.entry.js → p-b2fe6c1c.entry.js} +1 -1
  291. package/dist/ionic/{p-92427c9d.entry.js → p-b3c9f19c.entry.js} +1 -1
  292. package/dist/ionic/{p-83c0eb9b.entry.js → p-b653f4c2.entry.js} +1 -1
  293. package/dist/ionic/{p-9f914d43.entry.js → p-bb898d47.entry.js} +1 -1
  294. package/dist/ionic/{p-0c3bf0a7.entry.js → p-bd71a4a7.entry.js} +1 -1
  295. package/dist/ionic/{p-3fd97ea9.entry.js → p-d4ed5710.entry.js} +1 -1
  296. package/dist/ionic/{p-874945f3.entry.js → p-d6299c37.entry.js} +1 -1
  297. package/dist/ionic/{p-229c8fb5.entry.js → p-dea52cb3.entry.js} +1 -1
  298. package/dist/ionic/{p-2a66b899.entry.js → p-e18d3fdb.entry.js} +1 -1
  299. package/dist/ionic/{p-6ec1e450.entry.js → p-fad05840.entry.js} +1 -1
  300. package/dist/ionic/{p-432c5888.entry.js → p-fc796d48.entry.js} +1 -1
  301. package/dist/types/components/gallery/gallery.d.ts +2 -10
  302. package/dist/types/components/gallery/test/utils.d.ts +1 -1
  303. package/dist/types/components.d.ts +0 -29
  304. package/hydrate/index.js +317 -269
  305. package/hydrate/index.mjs +317 -269
  306. package/package.json +1 -1
  307. package/components/ion-gallery-item.d.ts +0 -11
  308. package/components/ion-gallery-item.js +0 -4
  309. package/components/p-C4dDZdpz.js +0 -4
  310. package/components/p-CtiqM786.js +0 -4
  311. package/dist/cjs/ion-gallery-item.cjs.entry.js +0 -72
  312. package/dist/collection/components/gallery-item/gallery-item.css +0 -87
  313. package/dist/collection/components/gallery-item/gallery-item.js +0 -87
  314. package/dist/esm/ion-gallery-item.entry.js +0 -70
  315. package/dist/ionic/p-1ab01507.entry.js +0 -4
  316. package/dist/ionic/p-21ca5788.entry.js +0 -4
  317. package/dist/ionic/p-2981a0bd.entry.js +0 -4
  318. package/dist/ionic/p-2d5a2511.entry.js +0 -4
  319. package/dist/ionic/p-76de7898.entry.js +0 -4
  320. package/dist/ionic/p-C4uUM9DM.js +0 -4
  321. package/dist/types/components/gallery-item/gallery-item.d.ts +0 -25
@@ -104,8 +104,101 @@ const focusElementInContext = (hostToFocus, fallbackElement) => {
104
104
  let lastOverlayIndex = 0;
105
105
  let lastId = 0;
106
106
  const activeAnimations = new WeakMap();
107
+ const OVERLAY_FOCUS_TRAP_SELECTOR = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover';
108
+ const ION_SELECT_MODAL_SELECTOR = 'ion-select-modal';
109
+ const isSelectModalOptionControl = (el) => el.tagName === 'ION-RADIO' || el.tagName === 'ION-CHECKBOX';
107
110
  /**
108
- * Determines if the overlay's backdrop is always blocking (no background interaction).
111
+ * Returns the currently focused element for keyboard focus checks.
112
+ *
113
+ * Starts from `document.activeElement` (non-shadow / light DOM focus).
114
+ * If focus is inside one or more open shadow roots
115
+ * (e.g. native control inside `ion-radio`), walks through nested
116
+ * `shadowRoot.activeElement` values until the innermost focused node is reached.
117
+ */
118
+ const getActiveElement = (ownerDoc) => {
119
+ var _a;
120
+ let active = ownerDoc.activeElement;
121
+ if (!active) {
122
+ return null;
123
+ }
124
+ while ((_a = active.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) {
125
+ active = active.shadowRoot.activeElement;
126
+ }
127
+ return active;
128
+ };
129
+ /**
130
+ * Walks from a focused node (possibly deep inside shadow roots)
131
+ * up to the nearest `ion-radio` / `ion-checkbox` host.
132
+ */
133
+ const getOptionControlHost = (active) => {
134
+ let n = active;
135
+ while (n) {
136
+ if (isSelectModalOptionControl(n)) {
137
+ return n;
138
+ }
139
+ const root = n.getRootNode();
140
+ if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {
141
+ n = root.host;
142
+ }
143
+ else {
144
+ return null;
145
+ }
146
+ }
147
+ return null;
148
+ };
149
+ /**
150
+ * Sheet modals can have visual order that differs from DOM order.
151
+ * Without sorting, Tab can skip the handle after option traversal.
152
+ *
153
+ * Order: option controls (radio/checkbox) → sheet handle → end-slot
154
+ * header button. Any other focusables are appended after.
155
+ */
156
+ const sortSheetModalFocusables = (overlay, elements) => {
157
+ const optionControls = elements.filter((el) => {
158
+ return overlay.contains(el) && isSelectModalOptionControl(el) && el.tabIndex >= 0;
159
+ });
160
+ const cancelControl = elements.find((el) => overlay.contains(el) &&
161
+ el.tagName === 'ION-BUTTON' &&
162
+ el.closest('ion-header ion-buttons[slot="end"]') !== null);
163
+ const handleControl = elements.find((el) => el.classList.contains('modal-handle'));
164
+ const sortByGeometry = (els) => [...els].sort((a, b) => {
165
+ const ra = a.getBoundingClientRect();
166
+ const rb = b.getBoundingClientRect();
167
+ const topDiff = ra.top - rb.top;
168
+ if (Math.abs(topDiff) > 1) {
169
+ return topDiff;
170
+ }
171
+ return ra.left - rb.left;
172
+ });
173
+ const ordered = [];
174
+ ordered.push(...sortByGeometry(optionControls));
175
+ if (handleControl) {
176
+ ordered.push(handleControl);
177
+ }
178
+ if (cancelControl) {
179
+ ordered.push(cancelControl);
180
+ }
181
+ const used = new Set(ordered);
182
+ for (const el of elements) {
183
+ if (!used.has(el)) {
184
+ ordered.push(el);
185
+ }
186
+ }
187
+ return ordered;
188
+ };
189
+ /**
190
+ * Option controls in groups use a tabindex pattern where only one
191
+ * option is tabbable (`tabIndex="0"`) while the others are `-1`.
192
+ * This returns the index of that current tabbable option.
193
+ */
194
+ const getTabbableOptionControlIndex = (elements, overlay) => {
195
+ return elements.findIndex((el) => {
196
+ return overlay.contains(el) && isSelectModalOptionControl(el) && el.tabIndex >= 0;
197
+ });
198
+ };
199
+ /**
200
+ * Determines if the overlay's backdrop is always blocking
201
+ * (no background interaction).
109
202
  * Returns false if showBackdrop=false or backdropBreakpoint > 0.
110
203
  */
111
204
  const isBackdropAlwaysBlocking = (el) => {
@@ -226,7 +319,7 @@ const focusElementInOverlay = (hostToFocus, overlay) => {
226
319
  * Should NOT include: Toast
227
320
  */
228
321
  const trapKeyboardFocus = (ev, doc) => {
229
- const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover');
322
+ const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
230
323
  const target = ev.target;
231
324
  /**
232
325
  * If no active overlay, ignore this event.
@@ -409,6 +502,30 @@ const connectListeners = (doc) => {
409
502
  doc.addEventListener('focus', (ev) => {
410
503
  trapKeyboardFocus(ev, doc);
411
504
  }, true);
505
+ /**
506
+ * Remember which option control last received focus
507
+ * (arrows, click, or Tab). This pattern keeps `tabIndex=0` on the
508
+ * checked/first radio, so the Tab trap uses this when wrapping back
509
+ * into the list or focusing the option-group slot.
510
+ */
511
+ doc.addEventListener('focusin', (ev) => {
512
+ const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
513
+ if (!lastOverlay || lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS)) {
514
+ return;
515
+ }
516
+ const isSheetModal = lastOverlay.classList.contains('modal-sheet');
517
+ if (!isSheetModal) {
518
+ return;
519
+ }
520
+ const target = ev.target;
521
+ if (!(target instanceof HTMLElement)) {
522
+ return;
523
+ }
524
+ const optionHost = getOptionControlHost(target);
525
+ if (optionHost && lastOverlay.contains(optionHost)) {
526
+ lastOverlay.trapLastSheetOptionControl = optionHost;
527
+ }
528
+ }, true);
412
529
  // Listen for keydown events to intercept Tab navigation.
413
530
  // This is needed for Safari and Firefox which may skip focusable
414
531
  // elements or allow focus to escape the overlay.
@@ -418,10 +535,10 @@ const connectListeners = (doc) => {
418
535
  var _a, _b, _c;
419
536
  if (ev.key !== 'Tab' && ev.key !== 'Alt+Tab')
420
537
  return;
421
- const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover');
538
+ const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
422
539
  if (!lastOverlay || lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS))
423
540
  return;
424
- const activeElement = doc.activeElement;
541
+ const activeElement = getActiveElement(doc);
425
542
  if (activeElement === lastOverlay) {
426
543
  ev.preventDefault();
427
544
  focusFirstDescendant(lastOverlay);
@@ -437,16 +554,32 @@ const connectListeners = (doc) => {
437
554
  if (!isInsideOverlay)
438
555
  return;
439
556
  // Get all focusable elements from both light and shadow DOM
440
- const allFocusable = [
557
+ let allFocusable = [
441
558
  ...lastOverlay.querySelectorAll(focusableQueryString),
442
559
  ...(((_c = lastOverlay.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelectorAll(focusableQueryString)) || []),
443
560
  ];
561
+ const selectModalEl = lastOverlay.querySelector(ION_SELECT_MODAL_SELECTOR);
562
+ const isSheetModal = lastOverlay.classList.contains('modal-sheet');
563
+ /**
564
+ * Some sheet modal content, including ion-select-modal,
565
+ * renders option containers as `ion-item.select-interface-option`.
566
+ * These can match focusable selectors in some builds but
567
+ * are not intended tab stops. Keep only true interactive
568
+ * controls so Tab can move from options to header
569
+ * controls/handle.
570
+ */
571
+ if (selectModalEl) {
572
+ allFocusable = allFocusable.filter((el) => !el.matches('ion-item.select-interface-option'));
573
+ }
574
+ if (isSheetModal) {
575
+ allFocusable = sortSheetModalFocusables(lastOverlay, allFocusable);
576
+ }
444
577
  if (allFocusable.length === 0) {
445
578
  ev.preventDefault();
446
579
  return;
447
580
  }
448
581
  // Find current element's index (accounting for shadow DOM)
449
- const currentIndex = activeElement
582
+ let currentIndex = activeElement
450
583
  ? allFocusable.findIndex((el) => {
451
584
  var _a;
452
585
  if (el === activeElement)
@@ -457,6 +590,31 @@ const connectListeners = (doc) => {
457
590
  return rootNode instanceof ShadowRoot && rootNode.host === el;
458
591
  })
459
592
  : -1;
593
+ /**
594
+ * Radio/checkbox groups can move focus onto an option with
595
+ * `tabIndex=-1`, while another option still has `tabIndex=0`
596
+ * in the list. `findIndex` then yields -1 and Tab incorrectly
597
+ * wraps to `allFocusable[0]`.
598
+ * Treat focus on any option control inside the sheet modal
599
+ * as the same trap slot as the listed tabbable option
600
+ * (`tabIndex >= 0`) so Tab goes handle → Cancel, not back
601
+ * to the first radio.
602
+ */
603
+ if (currentIndex < 0 && isSheetModal && activeElement) {
604
+ const optionHost = getOptionControlHost(activeElement);
605
+ if (optionHost && lastOverlay.contains(optionHost)) {
606
+ const directIndex = allFocusable.indexOf(optionHost);
607
+ if (directIndex >= 0) {
608
+ currentIndex = directIndex;
609
+ }
610
+ else {
611
+ const tabbableOptionIndex = getTabbableOptionControlIndex(allFocusable, lastOverlay);
612
+ if (tabbableOptionIndex >= 0) {
613
+ currentIndex = tabbableOptionIndex;
614
+ }
615
+ }
616
+ }
617
+ }
460
618
  ev.preventDefault();
461
619
  // Helper to focus an element, handling shadow DOM properly
462
620
  const focusElement = (element) => {
@@ -470,24 +628,43 @@ const connectListeners = (doc) => {
470
628
  }
471
629
  helpers.focusVisibleElement(element);
472
630
  };
631
+ let nextIndex;
473
632
  if (ev.shiftKey) {
474
633
  // Shift+Tab: previous element, wrap to last if at first
475
634
  if (currentIndex <= 0) {
476
- focusLastDescendant(lastOverlay);
635
+ nextIndex = allFocusable.length - 1;
477
636
  }
478
637
  else {
479
- focusElement(allFocusable[currentIndex - 1]);
638
+ nextIndex = currentIndex - 1;
480
639
  }
481
640
  }
482
641
  else {
483
642
  // Tab: next element, wrap to first if at last
484
643
  if (currentIndex < 0 || currentIndex >= allFocusable.length - 1) {
485
- focusFirstDescendant(lastOverlay);
644
+ nextIndex = 0;
486
645
  }
487
646
  else {
488
- focusElement(allFocusable[currentIndex + 1]);
647
+ nextIndex = currentIndex + 1;
648
+ }
649
+ }
650
+ const nextEl = allFocusable[nextIndex];
651
+ const overlayTrap = lastOverlay;
652
+ const tabbableOptionIndex = isSheetModal ? getTabbableOptionControlIndex(allFocusable, lastOverlay) : -1;
653
+ /**
654
+ * The trap list only includes one tabbable option host
655
+ * (`tabIndex >= 0`), usually the checked/first radio.
656
+ * `focusin` tracks the real last-focused option; use it
657
+ * whenever Tab would focus that slot (wrap from Cancel,
658
+ * Shift+Tab from handle, etc.).
659
+ */
660
+ let focusTarget = nextEl;
661
+ if (isSheetModal && tabbableOptionIndex >= 0 && nextIndex === tabbableOptionIndex) {
662
+ const saved = overlayTrap.trapLastSheetOptionControl;
663
+ if ((saved === null || saved === void 0 ? void 0 : saved.isConnected) && lastOverlay.contains(saved) && saved !== nextEl) {
664
+ focusTarget = saved;
489
665
  }
490
666
  }
667
+ focusElement(focusTarget);
491
668
  }, true);
492
669
  // handle back-button click
493
670
  doc.addEventListener('ionBackButton', (ev) => {
@@ -33,7 +33,6 @@
33
33
  "components/fab-list/fab-list.js",
34
34
  "components/footer/footer.js",
35
35
  "components/gallery/gallery.js",
36
- "components/gallery-item/gallery-item.js",
37
36
  "components/grid/grid.js",
38
37
  "components/header/header.js",
39
38
  "components/img/img.js",
@@ -68,9 +68,33 @@
68
68
  gap: var(--internal-gallery-gap, 16px);
69
69
  }
70
70
 
71
+ :host(.gallery-layout-uniform) ::slotted(*) {
72
+ aspect-ratio: 1/1;
73
+ }
74
+
71
75
  :host(.gallery-layout-masonry) {
72
76
  align-items: start;
73
77
  column-gap: var(--internal-gallery-gap, 16px);
74
78
  row-gap: 0;
75
79
  grid-auto-rows: 2px;
80
+ }
81
+
82
+ :host(.gallery-layout-masonry) ::slotted(*) {
83
+ display: block;
84
+ min-height: unset;
85
+ margin-bottom: var(--internal-gallery-gap, 16px);
86
+ }
87
+
88
+ ::slotted(*) {
89
+ margin-left: 0;
90
+ margin-right: 0;
91
+ margin-top: 0;
92
+ margin-bottom: 0;
93
+ width: 100%;
94
+ }
95
+
96
+ ::slotted(img) {
97
+ display: block;
98
+ object-fit: cover;
99
+ object-position: center;
76
100
  }
@@ -17,7 +17,6 @@ const BREAKPOINTS = {
17
17
  xxl: 1400,
18
18
  };
19
19
  const BREAKPOINT_ORDER = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
20
- const GALLERY_ITEM_SELECTOR = 'ion-gallery-item';
21
20
  /**
22
21
  * @virtualProp {"ios" | "md"} mode - The mode determines the platform behaviors of the component.
23
22
  * @virtualProp {"ios" | "md" | "ionic"} theme - The theme determines the visual appearance of the component.
@@ -31,7 +30,6 @@ export class Gallery {
31
30
  this.hasWarnedInvalidColumns = false;
32
31
  this.hasWarnedInvalidGap = false;
33
32
  this.hasWarnedUnusedOrder = false;
34
- this.hasWarnedInvalidItems = false;
35
33
  /**
36
34
  * The visual layout of the gallery. When `uniform`, rows take up the height
37
35
  * of the tallest item and are spaced evenly across the gallery. Additionally,
@@ -81,9 +79,8 @@ export class Gallery {
81
79
  const styles = getComputedStyle(this.el);
82
80
  const rowHeight = parseFloat(styles.getPropertyValue('grid-auto-rows')) || 0;
83
81
  const rowGap = parseFloat(styles.getPropertyValue('row-gap')) || parseFloat(styles.getPropertyValue('gap')) || 0;
84
- const itemGap = parseFloat(styles.getPropertyValue('column-gap')) || parseFloat(styles.getPropertyValue('gap')) || 0;
85
82
  const items = this.getItems();
86
- this.layoutMasonry(items, rowHeight, rowGap, itemGap, columns);
83
+ this.layoutMasonry(items, rowHeight, rowGap, columns);
87
84
  };
88
85
  }
89
86
  onColumnsOrGapChanged() {
@@ -284,16 +281,6 @@ export class Gallery {
284
281
  printIonWarning(`[ion-gallery] - "order" has no effect when "layout" is "uniform". Set "layout" to "masonry" for "order" to apply.`, this.el);
285
282
  this.hasWarnedUnusedOrder = true;
286
283
  }
287
- /**
288
- * Warn when gallery content is missing required `ion-gallery-item` components.
289
- */
290
- warnInvalidItems() {
291
- if (this.hasWarnedInvalidItems) {
292
- return;
293
- }
294
- printIonWarning('[ion-gallery] - Gallery items must be wrapped in "ion-gallery-item" components. Non-item direct children are ignored unless they contain nested "ion-gallery-item" elements.', this.el);
295
- this.hasWarnedInvalidItems = true;
296
- }
297
284
  /**
298
285
  * Resolve the active columns value for the current width. Falls back to
299
286
  * the default responsive columns when the provided prop is invalid.
@@ -350,45 +337,12 @@ export class Gallery {
350
337
  const gap = this.getGapForWidth(width);
351
338
  this.el.style.setProperty('--internal-gallery-gap', `${gap}`);
352
339
  }
353
- isGalleryItemElement(element) {
354
- var _a;
355
- return typeof ((_a = element.style) === null || _a === void 0 ? void 0 : _a.setProperty) === 'function';
356
- }
357
340
  /**
358
- * Return all gallery items that can be grid items with inline placement styles.
359
- * Direct children that are not `ion-gallery-item` are treated as wrapper
360
- * containers and flattened to nested `ion-gallery-item` children. Direct
361
- * children without nested `ion-gallery-item` components are ignored.
341
+ * Return all directly slotted children of the gallery that can be grid items
342
+ * with inline placement styles (HTML elements and SVG elements).
362
343
  */
363
344
  getItems() {
364
- const directChildren = Array.from(this.el.children).filter((child) => this.isGalleryItemElement(child));
365
- const flattenedItems = [];
366
- // Expand an <ion-gallery-item> component into the actual gallery items
367
- // that should be used for grid placement.
368
- const pushWrappedItems = (galleryItemEl) => {
369
- const galleryItems = Array.from(galleryItemEl.children).filter((child) => this.isGalleryItemElement(child));
370
- flattenedItems.push(...galleryItems);
371
- };
372
- directChildren.forEach((directChildEl) => {
373
- // Standard path: <ion-gallery-item> is a direct child of <ion-gallery>.
374
- if (directChildEl.matches(GALLERY_ITEM_SELECTOR)) {
375
- pushWrappedItems(directChildEl);
376
- return;
377
- }
378
- // Compatibility path: a non-gallery-item direct child (e.g. wrapper <div>)
379
- // may contain nested <ion-gallery-item> components.
380
- const nestedGalleryItems = Array.from(directChildEl.querySelectorAll(GALLERY_ITEM_SELECTOR)).filter((child) => this.isGalleryItemElement(child));
381
- // Invalid children path: no <ion-gallery-item> components found.
382
- if (nestedGalleryItems.length === 0) {
383
- this.warnInvalidItems();
384
- return;
385
- }
386
- // Flatten gallery-item containers so nested <ion-gallery-item> children can
387
- // become the effective gallery items.
388
- directChildEl.style.display = 'contents';
389
- nestedGalleryItems.forEach((nestedGalleryItem) => pushWrappedItems(nestedGalleryItem));
390
- });
391
- return flattenedItems;
345
+ return Array.from(this.el.children).filter((child) => { var _a; return typeof ((_a = child.style) === null || _a === void 0 ? void 0 : _a.setProperty) === 'function'; });
392
346
  }
393
347
  /**
394
348
  * Clear the item styles for the given item element.
@@ -445,14 +399,11 @@ export class Gallery {
445
399
  /**
446
400
  * Apply masonry placement by assigning each item a column and row span.
447
401
  */
448
- layoutMasonry(items, rowHeight, rowGap, itemGap, columns) {
402
+ layoutMasonry(items, rowHeight, rowGap, columns) {
449
403
  const columnHeights = new Array(columns).fill(0);
450
404
  const lastItemsByColumn = new Array(columns).fill(undefined);
451
405
  items.forEach((itemEl, i) => {
452
406
  itemEl.style.marginBottom = '';
453
- if (itemEl.parentElement !== this.el) {
454
- itemEl.style.marginBottom = `${itemGap}px`;
455
- }
456
407
  const span = this.calculateRowSpan(itemEl, rowHeight, rowGap);
457
408
  if (span === undefined) {
458
409
  this.clearItemStyles(itemEl);
@@ -501,11 +452,11 @@ export class Gallery {
501
452
  const { layout } = this;
502
453
  const order = this.getOrder();
503
454
  const theme = getIonTheme(this);
504
- return (h(Host, { key: '0b6ef176032845b3df3b2335be90cb6ce5d791cc', class: {
455
+ return (h(Host, { key: '1bf2973d22835c0dbddf3214b602f8c08b95e421', class: {
505
456
  [theme]: true,
506
457
  [`gallery-layout-${layout}`]: true,
507
458
  [`gallery-order-${order}`]: layout === 'masonry' && order !== undefined,
508
- } }, h("slot", { key: '247df9bb58b6899da7db60cdd475ccff0872673e', onSlotchange: this.onSlotChange })));
459
+ } }, h("slot", { key: '0dea31f609f6afdb1d73ecb2d873909ffe49203f', onSlotchange: this.onSlotChange })));
509
460
  }
510
461
  static get is() { return "ion-gallery"; }
511
462
  static get encapsulation() { return "shadow"; }
@@ -6,57 +6,57 @@ export const sharedStyles = `
6
6
  width: 343px;
7
7
  }
8
8
 
9
- ion-gallery-item div {
9
+ div {
10
10
  color: #fff;
11
11
  height: 150px;
12
12
  }
13
13
 
14
- ion-gallery-item:nth-child(1) div {
14
+ div:nth-child(1) {
15
15
  background: #ff6b6b;
16
16
  }
17
17
 
18
- ion-gallery-item:nth-child(2) div {
18
+ div:nth-child(2) {
19
19
  background: #4ecdc4;
20
20
  }
21
21
 
22
- ion-gallery-item:nth-child(3) div {
22
+ div:nth-child(3) {
23
23
  background: #ffe66d;
24
24
  color: #333;
25
25
  }
26
26
 
27
- ion-gallery-item:nth-child(4) div {
27
+ div:nth-child(4) {
28
28
  background: #5f27cd;
29
29
  }
30
30
 
31
- ion-gallery-item:nth-child(5) div {
31
+ div:nth-child(5) {
32
32
  background: #7f8c8d;
33
33
  }
34
34
 
35
- ion-gallery-item:nth-child(6) div {
35
+ div:nth-child(6) {
36
36
  background: #ff9f43;
37
37
  }
38
38
 
39
- ion-gallery-item:nth-child(7) div {
39
+ div:nth-child(7) {
40
40
  background: #ff3f34;
41
41
  }
42
42
 
43
- ion-gallery-item:nth-child(8) div {
43
+ div:nth-child(8) {
44
44
  background: #2ecc71;
45
45
  }
46
46
 
47
- ion-gallery-item:nth-child(9) div {
47
+ div:nth-child(9) {
48
48
  background: #34495e;
49
49
  }
50
50
 
51
- ion-gallery-item:nth-child(10) div {
51
+ div:nth-child(10) {
52
52
  background: #1abc9c;
53
53
  }
54
54
 
55
- ion-gallery-item:nth-child(11) div {
55
+ div:nth-child(11) {
56
56
  background: #e67e22;
57
57
  }
58
58
 
59
- ion-gallery-item:nth-child(12) div {
59
+ div:nth-child(12) {
60
60
  background: #9b59b6;
61
61
  }
62
62
  `;
@@ -16,10 +16,10 @@ export class Grid {
16
16
  }
17
17
  render() {
18
18
  const theme = getIonTheme(this);
19
- return (h(Host, { key: 'e3320fc2fc5391d26898cc119505cd3be30dd48b', class: {
19
+ return (h(Host, { key: '43b4e05ef076160d901c70dc37e177f19b524349', class: {
20
20
  [theme]: true,
21
21
  'grid-fixed': this.fixed,
22
- } }, h("slot", { key: '2000e6b336c294aadf4585269c301d734d2fe478' })));
22
+ } }, h("slot", { key: 'f3805936034708e6783223ded72c0ecfd40e5fb0' })));
23
23
  }
24
24
  static get is() { return "ion-grid"; }
25
25
  static get encapsulation() { return "shadow"; }
@@ -156,7 +156,7 @@ export class Header {
156
156
  const isCondensed = collapse === 'condense';
157
157
  // banner role must be at top level, so remove role if inside a menu
158
158
  const roleType = getRoleType(hostContext('ion-menu', this.el), isCondensed, theme);
159
- return (h(Host, Object.assign({ key: '3395dedfd5165ba6e9f3ad1a25f0bb5b3678704a', role: roleType, class: {
159
+ return (h(Host, Object.assign({ key: 'b43e5f542bdcec5e94c299556183cf6d9d673438', role: roleType, class: {
160
160
  [theme]: true,
161
161
  // Used internally for styling
162
162
  [`header-${theme}`]: true,
@@ -164,7 +164,7 @@ export class Header {
164
164
  [`header-collapse-${collapse}`]: true,
165
165
  [`header-translucent-${theme}`]: this.translucent,
166
166
  ['header-divider']: divider,
167
- } }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'cafeb88b6e73d64b264514ea46590fd3477b3052', class: "header-background" }), h("slot", { key: 'ad681aaf866d7e7a5e5e731c0b5d6f5cc9fe94d2' })));
167
+ } }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'fd9938f02edd38e1afc83025373ec0aec5633711', class: "header-background" }), h("slot", { key: '900aaa7da5d6f08e6f94b128fa065348d595159e' })));
168
168
  }
169
169
  static get is() { return "ion-header"; }
170
170
  static get originalStyleUrls() {
@@ -80,9 +80,9 @@ export class Img {
80
80
  const { loadSrc, alt, onLoad, loadError, inheritedAttributes } = this;
81
81
  const { draggable } = inheritedAttributes;
82
82
  const theme = getIonTheme(this);
83
- return (h(Host, { key: 'ba84621055567b2a35387709d9d89b97ad853274', class: {
83
+ return (h(Host, { key: '91de170493b31d6260e975b440beceb6906b6d5a', class: {
84
84
  [theme]: true,
85
- } }, h("img", { key: '9d6118bbf69e2cccbb0603802c03b9a0d101e2c3', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
85
+ } }, h("img", { key: 'ac1f41afbece34a3e38e656733f3e55cce385b4c', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
86
86
  }
87
87
  static get is() { return "ion-img"; }
88
88
  static get encapsulation() { return "shadow"; }
@@ -264,7 +264,7 @@ export class InfiniteScroll {
264
264
  render() {
265
265
  const theme = getIonTheme(this);
266
266
  const disabled = this.disabled;
267
- return (h(Host, { key: 'e3a3cde079dfd6f07e565eb462765df757cbb128', class: {
267
+ return (h(Host, { key: '02beca21d668e4e605532ad5ca5a67a08c71eebb', class: {
268
268
  [theme]: true,
269
269
  'infinite-scroll-loading': this.isLoading,
270
270
  'infinite-scroll-enabled': !disabled,
@@ -29,11 +29,11 @@ export class InfiniteScrollContent {
29
29
  }
30
30
  render() {
31
31
  const theme = getIonTheme(this);
32
- return (h(Host, { key: '263a27297159ced042f7552a1e14b8c6aba62fa8', class: {
32
+ return (h(Host, { key: 'b51954f829eeafd5ec304b3e66e330776485ffc8', class: {
33
33
  [theme]: true,
34
34
  // Used internally for styling
35
35
  [`infinite-scroll-content-${theme}`]: true,
36
- } }, h("div", { key: 'ee38d3c52df9dc5de186406b3087f20917a17252', class: "infinite-loading" }, this.loadingSpinner && (h("div", { key: 'e2348727f79a26f52f42641d4334a0ba9d4aa03e', class: "infinite-loading-spinner" }, h("ion-spinner", { key: '41be6f2747f3af5f46c8738e2ef56083ecd95e99', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
36
+ } }, h("div", { key: '047da7f15fe38deed592dd66d1c97e12da4545bb', class: "infinite-loading" }, this.loadingSpinner && (h("div", { key: '1c05820f091052b8ee9e9ca20054495a676c21aa', class: "infinite-loading-spinner" }, h("ion-spinner", { key: 'ff801e3486f3c1a4605d2a2de9b47bd7bd536698', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
37
37
  }
38
38
  static get is() { return "ion-infinite-scroll-content"; }
39
39
  static get originalStyleUrls() {
@@ -617,7 +617,7 @@ export class Input {
617
617
  * TODO(FW-5592): Remove hasStartEndSlots condition
618
618
  */
619
619
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
620
- return (h(Host, { key: '3da29d837b5abe22de740ac96c8142422fce537a', class: createColorClasses(this.color, {
620
+ return (h(Host, { key: 'beeeca9939e7e416783425f67d3c9e2be6bbae99', class: createColorClasses(this.color, {
621
621
  [theme]: true,
622
622
  'has-value': hasValue,
623
623
  'has-focus': hasFocus,
@@ -630,7 +630,7 @@ export class Input {
630
630
  'in-item-color': hostContext('ion-item.ion-color', this.el),
631
631
  'input-disabled': disabled,
632
632
  'input-readonly': readonly,
633
- }) }, h("label", { key: '142a8230382a05938887e9c0790832218ac37697', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '953f247ea2f40545e01e0346549d9b7aa344b720', class: "native-wrapper", onClick: this.onLabelClick },
633
+ }) }, h("label", { key: 'f227df52a6ad60344f16261a82c0d0566bb8cd5b', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'ae6da554ce21f805361a7704139b776a9344dcb2', class: "native-wrapper", onClick: this.onLabelClick },
634
634
  /**
635
635
  * For the ionic theme, we render the outline container here
636
636
  * instead of higher up, so it can be positioned relative to
@@ -640,14 +640,14 @@ export class Input {
640
640
  * <label> element, ensuring that clicking the label text
641
641
  * focuses the input.
642
642
  */
643
- theme === 'ionic' && h("div", { key: 'fd09b37c6a798900c5074e7cbe2e790ea050c29d', class: "input-outline" }), h("slot", { key: '3eef4c4748104d8722f3254a04ff88e2b70c560e', name: "start" }), h("input", Object.assign({ key: '012a3fa52e19422d7fbc227845e9771c7d8fbe4a', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById() }, this.inheritedAttributes)), clearInput && !readonly && !disabled && (h("button", { key: 'b115494d9611aea57a976d3102026f3d9b430bfb', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
643
+ theme === 'ionic' && h("div", { key: '83aa5e7ad97b0c964e31966c1d2b8771d1ecfc53', class: "input-outline" }), h("slot", { key: '1931003f2b0d19508acaaffab58fee644d1f6158', name: "start" }), h("input", Object.assign({ key: '33a06efb4ce0b6e67c12e77f131effb113fba73f', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById() }, this.inheritedAttributes)), clearInput && !readonly && !disabled && (h("button", { key: 'd350f26cf6927ee089373ea8903db2479a0a404c', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
644
644
  /**
645
645
  * This prevents mobile browsers from
646
646
  * blurring the input when the clear
647
647
  * button is activated.
648
648
  */
649
649
  ev.preventDefault();
650
- }, onClick: this.clearTextInput }, h("ion-icon", { key: 'a259afa47a9914b2e0656364bed40644fa2c87c4', "aria-hidden": "true", icon: inputClearIcon }))), h("slot", { key: 'beec86eb500f6b335149c8734afc7c3945a10219', name: "end" })), shouldRenderHighlight && h("div", { key: '77a25d118934f369e09edbc2ffa6f90e3e760338', class: "input-highlight" })), this.renderBottomContent()));
650
+ }, onClick: this.clearTextInput }, h("ion-icon", { key: '972a2d94dcf599e63aac1d73e34873a9c3d0bf94', "aria-hidden": "true", icon: inputClearIcon }))), h("slot", { key: 'fac4dcaabb02f647e46276e92e3f341557170aec', name: "end" })), shouldRenderHighlight && h("div", { key: 'a10e519d8d1f0dcd81ffc43b8e4086797476f753', class: "input-highlight" })), this.renderBottomContent()));
651
651
  }
652
652
  static get is() { return "ion-input"; }
653
653
  static get encapsulation() { return "scoped"; }
@@ -680,7 +680,7 @@ export class InputOTP {
680
680
  const tabbableIndex = this.getTabbableIndex();
681
681
  const pattern = this.getPattern();
682
682
  const hasDescription = ((_b = (_a = el.querySelector('.input-otp-description')) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) !== '';
683
- return (h(Host, { key: 'f39e98cd24cbf50f7db4e891dda9499f6def7986', class: createColorClasses(color, {
683
+ return (h(Host, { key: '7a5c5dbb7e1880bd94d4b00e579af941366b1cb2', class: createColorClasses(color, {
684
684
  [mode]: true,
685
685
  'has-focus': hasFocus,
686
686
  [`input-otp-size-${size}`]: true,
@@ -688,10 +688,10 @@ export class InputOTP {
688
688
  [`input-otp-fill-${fill}`]: true,
689
689
  'input-otp-disabled': disabled,
690
690
  'input-otp-readonly': readonly,
691
- }) }, h("div", Object.assign({ key: '624adcd552947708162003353b331cd92df062ef', role: "group", "aria-label": "One-time password input", class: "input-otp-group", part: "group" }, inheritedAttributes), Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper", part: "container" }, h("input", { class: "native-input", part: "native", id: `${inputId}-${index}`, "aria-label": `Input ${index + 1} of ${length}`, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => (inputRefs[index] = el), onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator", part: "separator" }))))), h("div", { key: 'c518d83ab0236a3ebbe631582ce6f1c2edfbcd29', class: {
691
+ }) }, h("div", Object.assign({ key: 'a4427602ea1894d53e4d0f502dbb972c93a86bff', role: "group", "aria-label": "One-time password input", class: "input-otp-group", part: "group" }, inheritedAttributes), Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper", part: "container" }, h("input", { class: "native-input", part: "native", id: `${inputId}-${index}`, "aria-label": `Input ${index + 1} of ${length}`, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => (inputRefs[index] = el), onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator", part: "separator" }))))), h("div", { key: '7ee9d8dfd2e52875f1bfe3e3dea0494c18c12f4a', class: {
692
692
  'input-otp-description': true,
693
693
  'input-otp-description-hidden': !hasDescription,
694
- }, part: "description" }, h("slot", { key: '15c7c8549c1788748e1ae31bd227a7f918cb5eca' }))));
694
+ }, part: "description" }, h("slot", { key: '163c374e7ae5dbdb1dc12483161e5aca919a50d5' }))));
695
695
  }
696
696
  static get is() { return "ion-input-otp"; }
697
697
  static get encapsulation() { return "shadow"; }