@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
@@ -14,8 +14,101 @@ import { addEventListener, componentOnReady, focusVisibleElement, getElementRoot
14
14
  let lastOverlayIndex = 0;
15
15
  let lastId = 0;
16
16
  export const activeAnimations = new WeakMap();
17
+ const OVERLAY_FOCUS_TRAP_SELECTOR = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover';
18
+ const ION_SELECT_MODAL_SELECTOR = 'ion-select-modal';
19
+ const isSelectModalOptionControl = (el) => el.tagName === 'ION-RADIO' || el.tagName === 'ION-CHECKBOX';
17
20
  /**
18
- * Determines if the overlay's backdrop is always blocking (no background interaction).
21
+ * Returns the currently focused element for keyboard focus checks.
22
+ *
23
+ * Starts from `document.activeElement` (non-shadow / light DOM focus).
24
+ * If focus is inside one or more open shadow roots
25
+ * (e.g. native control inside `ion-radio`), walks through nested
26
+ * `shadowRoot.activeElement` values until the innermost focused node is reached.
27
+ */
28
+ const getActiveElement = (ownerDoc) => {
29
+ var _a;
30
+ let active = ownerDoc.activeElement;
31
+ if (!active) {
32
+ return null;
33
+ }
34
+ while ((_a = active.shadowRoot) === null || _a === void 0 ? void 0 : _a.activeElement) {
35
+ active = active.shadowRoot.activeElement;
36
+ }
37
+ return active;
38
+ };
39
+ /**
40
+ * Walks from a focused node (possibly deep inside shadow roots)
41
+ * up to the nearest `ion-radio` / `ion-checkbox` host.
42
+ */
43
+ const getOptionControlHost = (active) => {
44
+ let n = active;
45
+ while (n) {
46
+ if (isSelectModalOptionControl(n)) {
47
+ return n;
48
+ }
49
+ const root = n.getRootNode();
50
+ if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {
51
+ n = root.host;
52
+ }
53
+ else {
54
+ return null;
55
+ }
56
+ }
57
+ return null;
58
+ };
59
+ /**
60
+ * Sheet modals can have visual order that differs from DOM order.
61
+ * Without sorting, Tab can skip the handle after option traversal.
62
+ *
63
+ * Order: option controls (radio/checkbox) → sheet handle → end-slot
64
+ * header button. Any other focusables are appended after.
65
+ */
66
+ const sortSheetModalFocusables = (overlay, elements) => {
67
+ const optionControls = elements.filter((el) => {
68
+ return overlay.contains(el) && isSelectModalOptionControl(el) && el.tabIndex >= 0;
69
+ });
70
+ const cancelControl = elements.find((el) => overlay.contains(el) &&
71
+ el.tagName === 'ION-BUTTON' &&
72
+ el.closest('ion-header ion-buttons[slot="end"]') !== null);
73
+ const handleControl = elements.find((el) => el.classList.contains('modal-handle'));
74
+ const sortByGeometry = (els) => [...els].sort((a, b) => {
75
+ const ra = a.getBoundingClientRect();
76
+ const rb = b.getBoundingClientRect();
77
+ const topDiff = ra.top - rb.top;
78
+ if (Math.abs(topDiff) > 1) {
79
+ return topDiff;
80
+ }
81
+ return ra.left - rb.left;
82
+ });
83
+ const ordered = [];
84
+ ordered.push(...sortByGeometry(optionControls));
85
+ if (handleControl) {
86
+ ordered.push(handleControl);
87
+ }
88
+ if (cancelControl) {
89
+ ordered.push(cancelControl);
90
+ }
91
+ const used = new Set(ordered);
92
+ for (const el of elements) {
93
+ if (!used.has(el)) {
94
+ ordered.push(el);
95
+ }
96
+ }
97
+ return ordered;
98
+ };
99
+ /**
100
+ * Option controls in groups use a tabindex pattern where only one
101
+ * option is tabbable (`tabIndex="0"`) while the others are `-1`.
102
+ * This returns the index of that current tabbable option.
103
+ */
104
+ const getTabbableOptionControlIndex = (elements, overlay) => {
105
+ return elements.findIndex((el) => {
106
+ return overlay.contains(el) && isSelectModalOptionControl(el) && el.tabIndex >= 0;
107
+ });
108
+ };
109
+ /**
110
+ * Determines if the overlay's backdrop is always blocking
111
+ * (no background interaction).
19
112
  * Returns false if showBackdrop=false or backdropBreakpoint > 0.
20
113
  */
21
114
  const isBackdropAlwaysBlocking = (el) => {
@@ -136,7 +229,7 @@ const focusElementInOverlay = (hostToFocus, overlay) => {
136
229
  * Should NOT include: Toast
137
230
  */
138
231
  const trapKeyboardFocus = (ev, doc) => {
139
- const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover');
232
+ const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
140
233
  const target = ev.target;
141
234
  /**
142
235
  * If no active overlay, ignore this event.
@@ -319,6 +412,30 @@ const connectListeners = (doc) => {
319
412
  doc.addEventListener('focus', (ev) => {
320
413
  trapKeyboardFocus(ev, doc);
321
414
  }, true);
415
+ /**
416
+ * Remember which option control last received focus
417
+ * (arrows, click, or Tab). This pattern keeps `tabIndex=0` on the
418
+ * checked/first radio, so the Tab trap uses this when wrapping back
419
+ * into the list or focusing the option-group slot.
420
+ */
421
+ doc.addEventListener('focusin', (ev) => {
422
+ const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
423
+ if (!lastOverlay || lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS)) {
424
+ return;
425
+ }
426
+ const isSheetModal = lastOverlay.classList.contains('modal-sheet');
427
+ if (!isSheetModal) {
428
+ return;
429
+ }
430
+ const target = ev.target;
431
+ if (!(target instanceof HTMLElement)) {
432
+ return;
433
+ }
434
+ const optionHost = getOptionControlHost(target);
435
+ if (optionHost && lastOverlay.contains(optionHost)) {
436
+ lastOverlay.trapLastSheetOptionControl = optionHost;
437
+ }
438
+ }, true);
322
439
  // Listen for keydown events to intercept Tab navigation.
323
440
  // This is needed for Safari and Firefox which may skip focusable
324
441
  // elements or allow focus to escape the overlay.
@@ -328,10 +445,10 @@ const connectListeners = (doc) => {
328
445
  var _a, _b, _c;
329
446
  if (ev.key !== 'Tab' && ev.key !== 'Alt+Tab')
330
447
  return;
331
- const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover');
448
+ const lastOverlay = getPresentedOverlay(doc, OVERLAY_FOCUS_TRAP_SELECTOR);
332
449
  if (!lastOverlay || lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS))
333
450
  return;
334
- const activeElement = doc.activeElement;
451
+ const activeElement = getActiveElement(doc);
335
452
  if (activeElement === lastOverlay) {
336
453
  ev.preventDefault();
337
454
  focusFirstDescendant(lastOverlay);
@@ -347,16 +464,32 @@ const connectListeners = (doc) => {
347
464
  if (!isInsideOverlay)
348
465
  return;
349
466
  // Get all focusable elements from both light and shadow DOM
350
- const allFocusable = [
467
+ let allFocusable = [
351
468
  ...lastOverlay.querySelectorAll(focusableQueryString),
352
469
  ...(((_c = lastOverlay.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelectorAll(focusableQueryString)) || []),
353
470
  ];
471
+ const selectModalEl = lastOverlay.querySelector(ION_SELECT_MODAL_SELECTOR);
472
+ const isSheetModal = lastOverlay.classList.contains('modal-sheet');
473
+ /**
474
+ * Some sheet modal content, including ion-select-modal,
475
+ * renders option containers as `ion-item.select-interface-option`.
476
+ * These can match focusable selectors in some builds but
477
+ * are not intended tab stops. Keep only true interactive
478
+ * controls so Tab can move from options to header
479
+ * controls/handle.
480
+ */
481
+ if (selectModalEl) {
482
+ allFocusable = allFocusable.filter((el) => !el.matches('ion-item.select-interface-option'));
483
+ }
484
+ if (isSheetModal) {
485
+ allFocusable = sortSheetModalFocusables(lastOverlay, allFocusable);
486
+ }
354
487
  if (allFocusable.length === 0) {
355
488
  ev.preventDefault();
356
489
  return;
357
490
  }
358
491
  // Find current element's index (accounting for shadow DOM)
359
- const currentIndex = activeElement
492
+ let currentIndex = activeElement
360
493
  ? allFocusable.findIndex((el) => {
361
494
  var _a;
362
495
  if (el === activeElement)
@@ -367,6 +500,31 @@ const connectListeners = (doc) => {
367
500
  return rootNode instanceof ShadowRoot && rootNode.host === el;
368
501
  })
369
502
  : -1;
503
+ /**
504
+ * Radio/checkbox groups can move focus onto an option with
505
+ * `tabIndex=-1`, while another option still has `tabIndex=0`
506
+ * in the list. `findIndex` then yields -1 and Tab incorrectly
507
+ * wraps to `allFocusable[0]`.
508
+ * Treat focus on any option control inside the sheet modal
509
+ * as the same trap slot as the listed tabbable option
510
+ * (`tabIndex >= 0`) so Tab goes handle → Cancel, not back
511
+ * to the first radio.
512
+ */
513
+ if (currentIndex < 0 && isSheetModal && activeElement) {
514
+ const optionHost = getOptionControlHost(activeElement);
515
+ if (optionHost && lastOverlay.contains(optionHost)) {
516
+ const directIndex = allFocusable.indexOf(optionHost);
517
+ if (directIndex >= 0) {
518
+ currentIndex = directIndex;
519
+ }
520
+ else {
521
+ const tabbableOptionIndex = getTabbableOptionControlIndex(allFocusable, lastOverlay);
522
+ if (tabbableOptionIndex >= 0) {
523
+ currentIndex = tabbableOptionIndex;
524
+ }
525
+ }
526
+ }
527
+ }
370
528
  ev.preventDefault();
371
529
  // Helper to focus an element, handling shadow DOM properly
372
530
  const focusElement = (element) => {
@@ -380,24 +538,43 @@ const connectListeners = (doc) => {
380
538
  }
381
539
  focusVisibleElement(element);
382
540
  };
541
+ let nextIndex;
383
542
  if (ev.shiftKey) {
384
543
  // Shift+Tab: previous element, wrap to last if at first
385
544
  if (currentIndex <= 0) {
386
- focusLastDescendant(lastOverlay);
545
+ nextIndex = allFocusable.length - 1;
387
546
  }
388
547
  else {
389
- focusElement(allFocusable[currentIndex - 1]);
548
+ nextIndex = currentIndex - 1;
390
549
  }
391
550
  }
392
551
  else {
393
552
  // Tab: next element, wrap to first if at last
394
553
  if (currentIndex < 0 || currentIndex >= allFocusable.length - 1) {
395
- focusFirstDescendant(lastOverlay);
554
+ nextIndex = 0;
396
555
  }
397
556
  else {
398
- focusElement(allFocusable[currentIndex + 1]);
557
+ nextIndex = currentIndex + 1;
558
+ }
559
+ }
560
+ const nextEl = allFocusable[nextIndex];
561
+ const overlayTrap = lastOverlay;
562
+ const tabbableOptionIndex = isSheetModal ? getTabbableOptionControlIndex(allFocusable, lastOverlay) : -1;
563
+ /**
564
+ * The trap list only includes one tabbable option host
565
+ * (`tabIndex >= 0`), usually the checked/first radio.
566
+ * `focusin` tracks the real last-focused option; use it
567
+ * whenever Tab would focus that slot (wrap from Cancel,
568
+ * Shift+Tab from handle, etc.).
569
+ */
570
+ let focusTarget = nextEl;
571
+ if (isSheetModal && tabbableOptionIndex >= 0 && nextIndex === tabbableOptionIndex) {
572
+ const saved = overlayTrap.trapLastSheetOptionControl;
573
+ if ((saved === null || saved === void 0 ? void 0 : saved.isConnected) && lastOverlay.contains(saved) && saved !== nextEl) {
574
+ focusTarget = saved;
399
575
  }
400
576
  }
577
+ focusElement(focusTarget);
401
578
  }, true);
402
579
  // handle back-button click
403
580
  doc.addEventListener('ionBackButton', (ev) => {
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-05-21T21:54:43",
2
+ "timestamp": "2026-05-22T16:26:35",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.0",
@@ -14469,90 +14469,6 @@
14469
14469
  "dependencies": [],
14470
14470
  "dependencyGraph": {}
14471
14471
  },
14472
- {
14473
- "filePath": "src/components/gallery-item/gallery-item.tsx",
14474
- "encapsulation": "shadow",
14475
- "tag": "ion-gallery-item",
14476
- "docs": "",
14477
- "docsTags": [
14478
- {
14479
- "name": "virtualProp",
14480
- "text": "{\"ios\" | \"md\"} mode - The mode determines the platform behaviors of the component."
14481
- },
14482
- {
14483
- "name": "virtualProp",
14484
- "text": "{\"ios\" | \"md\" | \"ionic\"} theme - The theme determines the visual appearance of the component."
14485
- },
14486
- {
14487
- "name": "slot",
14488
- "text": "- Wrap elements that should be grouped in an `ion-gallery`."
14489
- }
14490
- ],
14491
- "usage": {},
14492
- "props": [
14493
- {
14494
- "name": "mode",
14495
- "type": "\"ios\" | \"md\"",
14496
- "mutable": false,
14497
- "attr": "mode",
14498
- "reflectToAttr": false,
14499
- "docs": "The mode determines the platform behaviors of the component.",
14500
- "docsTags": [],
14501
- "values": [
14502
- {
14503
- "value": "ios",
14504
- "type": "string"
14505
- },
14506
- {
14507
- "value": "md",
14508
- "type": "string"
14509
- }
14510
- ],
14511
- "optional": true,
14512
- "required": false
14513
- },
14514
- {
14515
- "name": "theme",
14516
- "type": "\"ios\" | \"md\" | \"ionic\"",
14517
- "mutable": false,
14518
- "attr": "theme",
14519
- "reflectToAttr": false,
14520
- "docs": "The theme determines the visual appearance of the component.",
14521
- "docsTags": [],
14522
- "values": [
14523
- {
14524
- "value": "ios",
14525
- "type": "string"
14526
- },
14527
- {
14528
- "value": "md",
14529
- "type": "string"
14530
- },
14531
- {
14532
- "value": "ionic",
14533
- "type": "string"
14534
- }
14535
- ],
14536
- "optional": true,
14537
- "required": false
14538
- }
14539
- ],
14540
- "methods": [],
14541
- "events": [],
14542
- "listeners": [],
14543
- "styles": [],
14544
- "slots": [
14545
- {
14546
- "name": "",
14547
- "docs": "Wrap elements that should be grouped in an `ion-gallery`."
14548
- }
14549
- ],
14550
- "parts": [],
14551
- "states": [],
14552
- "dependents": [],
14553
- "dependencies": [],
14554
- "dependencyGraph": {}
14555
- },
14556
14472
  {
14557
14473
  "filePath": "src/components/grid/grid.tsx",
14558
14474
  "encapsulation": "shadow",
package/dist/esm/index.js CHANGED
@@ -14,7 +14,7 @@ export { I as IonicSafeString } from './index-D4ugF_sT.js';
14
14
  export { g as getMode, s as setupConfig } from './config-BwKpO3Is.js';
15
15
  export { o as openURL } from './theme-DaJxRxSQ.js';
16
16
  export { m as menuController } from './index-hpH08p5s.js';
17
- export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as pickerController, c as popoverController, t as toastController } from './overlays-rwDDzEs4.js';
17
+ export { b as actionSheetController, a as alertController, l as loadingController, m as modalController, p as pickerController, c as popoverController, t as toastController } from './overlays-ttYCMKRp.js';
18
18
  import './gesture-controller-BTEOs1at.js';
19
19
  import './focus-visible-vXpMhGrs.js';
20
20
  import './framework-delegate-CjVwn_KZ.js';
@@ -5,7 +5,7 @@ import { r as registerInstance, c as createEvent, a as readTask, h, d as Host, g
5
5
  import { c as createButtonActiveGesture } from './button-active-g6ZnZzDZ.js';
6
6
  import { r as raf } from './helpers-Do7zwvM1.js';
7
7
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
8
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, f as present, g as dismiss, h as eventMethod, s as safeCall, j as prepareOverlay, k as setOverlayId } from './overlays-rwDDzEs4.js';
8
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, f as present, g as dismiss, h as eventMethod, s as safeCall, j as prepareOverlay, k as setOverlayId } from './overlays-ttYCMKRp.js';
9
9
  import { r as renderOptionLabel } from './select-option-render-B2qc5ZP7.js';
10
10
  import { g as getClassMap } from './theme-DaJxRxSQ.js';
11
11
  import { b as getIonMode, c as getIonTheme } from './ionic-global-CAZb-5i-.js';
@@ -6,7 +6,7 @@ import { E as ENABLE_HTML_CONTENT_DEFAULT } from './config-BwKpO3Is.js';
6
6
  import { c as createButtonActiveGesture } from './button-active-g6ZnZzDZ.js';
7
7
  import { r as raf } from './helpers-Do7zwvM1.js';
8
8
  import { c as createLockController } from './lock-controller-B-hirT0v.js';
9
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-rwDDzEs4.js';
9
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-ttYCMKRp.js';
10
10
  import { s as sanitizeDOMString } from './index-D4ugF_sT.js';
11
11
  import { r as renderOptionLabel } from './select-option-render-B2qc5ZP7.js';
12
12
  import { g as getClassMap } from './theme-DaJxRxSQ.js';
@@ -1066,7 +1066,7 @@ const Header = class {
1066
1066
  const isCondensed = collapse === 'condense';
1067
1067
  // banner role must be at top level, so remove role if inside a menu
1068
1068
  const roleType = getRoleType(hostContext('ion-menu', this.el), isCondensed, theme);
1069
- return (h(Host, Object.assign({ key: '3395dedfd5165ba6e9f3ad1a25f0bb5b3678704a', role: roleType, class: {
1069
+ return (h(Host, Object.assign({ key: 'b43e5f542bdcec5e94c299556183cf6d9d673438', role: roleType, class: {
1070
1070
  [theme]: true,
1071
1071
  // Used internally for styling
1072
1072
  [`header-${theme}`]: true,
@@ -1074,7 +1074,7 @@ const Header = class {
1074
1074
  [`header-collapse-${collapse}`]: true,
1075
1075
  [`header-translucent-${theme}`]: this.translucent,
1076
1076
  ['header-divider']: divider,
1077
- } }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'cafeb88b6e73d64b264514ea46590fd3477b3052', class: "header-background" }), h("slot", { key: 'ad681aaf866d7e7a5e5e731c0b5d6f5cc9fe94d2' })));
1077
+ } }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: 'fd9938f02edd38e1afc83025373ec0aec5633711', class: "header-background" }), h("slot", { key: '900aaa7da5d6f08e6f94b128fa065348d595159e' })));
1078
1078
  }
1079
1079
  get el() { return getElement(this); }
1080
1080
  };
@@ -1261,7 +1261,7 @@ const RouterOutlet = class {
1261
1261
  return true;
1262
1262
  }
1263
1263
  render() {
1264
- return h("slot", { key: '56e3d06ed939755796058e30ef19fbc7f7cb490d' });
1264
+ return h("slot", { key: 'f59dfdc11831ed91f5f7d8147cdc14f3c07bc289' });
1265
1265
  }
1266
1266
  get el() { return getElement(this); }
1267
1267
  static get watchers() { return {
@@ -1301,11 +1301,11 @@ const ToolbarTitle = class {
1301
1301
  render() {
1302
1302
  const theme = getIonTheme(this);
1303
1303
  const size = this.getSize();
1304
- return (h(Host, { key: 'd64e86bed418cba707d4a26c9274f18ed06c0e9e', class: createColorClasses(this.color, {
1304
+ return (h(Host, { key: '87bb5264f4c13d0d6eeef874ed114539d0b59062', class: createColorClasses(this.color, {
1305
1305
  [theme]: true,
1306
1306
  [`title-${size}`]: true,
1307
1307
  'title-rtl': document.dir === 'rtl',
1308
- }) }, h("div", { key: '386a71e974cde0bfbf5b655d69ed5f718de8ce48', class: "toolbar-title" }, h("slot", { key: '8aa804c9e1b11574a42268805d3117a085e699b4' }))));
1308
+ }) }, h("div", { key: '75f2ddfaf693ffdec13d909eefdb09b441d76e80', class: "toolbar-title" }, h("slot", { key: '00539af5e250bee78fdd1c55f2ecdc8e53bc18b0' }))));
1309
1309
  }
1310
1310
  get el() { return getElement(this); }
1311
1311
  static get watchers() { return {
@@ -1551,11 +1551,11 @@ const Toolbar = class {
1551
1551
  Object.assign(childStyles, style);
1552
1552
  });
1553
1553
  const titlePlacement = this.getTitlePlacement();
1554
- return (h(Host, { key: 'bcb621674157410d7eaeb006779bdd677346587e', class: Object.assign(Object.assign({}, createColorClasses(this.color, {
1554
+ return (h(Host, { key: '069913e9241b8e9a2dee8e7d088d181b6faeab5e', class: Object.assign(Object.assign({}, createColorClasses(this.color, {
1555
1555
  [theme]: true,
1556
1556
  'in-toolbar': hostContext('ion-toolbar', this.el),
1557
1557
  [`toolbar-title-placement-${titlePlacement}`]: true,
1558
- })), childStyles) }, h("div", { key: '0d31a98b2571b9a0ae142fbdfd83e2ebdcd8e069', class: "toolbar-background", part: "background" }), h("div", { key: 'de938534c487c6cb4060dac44b40c2d872130f50', class: "toolbar-container", part: "container" }, h("slot", { key: 'a337150d353e439eae67c31ff86e383ed51f3d8f', name: "start", onSlotchange: () => this.updateSlotClasses }), h("slot", { key: '02effd3ce0cdad5ec5645fa58ccb329321449190', name: "secondary", onSlotchange: () => this.updateSlotClasses }), h("div", { key: '3e22f5feda2aea02117bdea2fe8a4b8905ba82f6', class: "toolbar-content", part: "content" }, h("slot", { key: 'ebf828643ff05a8bf662a54715d21d0859168d31' })), h("slot", { key: 'a6940648dfe25a7aa8792a1bd9267437274f333c', name: "primary", onSlotchange: () => this.updateSlotClasses }), h("slot", { key: 'afb1d61aa0e430fcf483ba482af64762474e06fe', name: "end", onSlotchange: () => this.updateSlotClasses }))));
1558
+ })), childStyles) }, h("div", { key: '3255531be492b9afa7b47476a805f923beea09db', class: "toolbar-background", part: "background" }), h("div", { key: '8758189374c0a12f293c30ca7f8f049b732d2cab', class: "toolbar-container", part: "container" }, h("slot", { key: '74c3705f717968893bf94ea95c99cae313ce68f3', name: "start", onSlotchange: () => this.updateSlotClasses }), h("slot", { key: '298c78f93291442f140f8c52983871215f20ea87', name: "secondary", onSlotchange: () => this.updateSlotClasses }), h("div", { key: 'f7376320b704b8ce375fe2223ae30d51bfc05acb', class: "toolbar-content", part: "content" }, h("slot", { key: 'ddaec08b1fbd13384d834ba4c3b4441c4d749faf' })), h("slot", { key: '6d5bce85159859bb548e4d3fb6b22208dcb48987', name: "primary", onSlotchange: () => this.updateSlotClasses }), h("slot", { key: 'd1d21752ed3bcc7bf15c20de1c0a6fd956373450', name: "end", onSlotchange: () => this.updateSlotClasses }))));
1559
1559
  }
1560
1560
  get el() { return getElement(this); }
1561
1561
  static get watchers() { return {
@@ -159,9 +159,9 @@ const Thumbnail = class {
159
159
  }
160
160
  render() {
161
161
  const theme = getIonTheme(this);
162
- return (h(Host, { key: 'fdf9d92949a1e8cf6faded77ffed084f74fc040b', class: {
162
+ return (h(Host, { key: '2fb4e6f9f650badf2bc492fc4b1c43cad64141c0', class: {
163
163
  [theme]: true,
164
- } }, h("slot", { key: 'e1b1439c035d9a9503efd1c1a04aed9f4e8e0af7' })));
164
+ } }, h("slot", { key: 'ea18f4572b2b019af3470c6bdb7915d4a5dd84bb' })));
165
165
  }
166
166
  };
167
167
  Thumbnail.style = thumbnailCss();
@@ -126,10 +126,10 @@ const Grid = class {
126
126
  }
127
127
  render() {
128
128
  const theme = getIonTheme(this);
129
- return (h(Host, { key: 'e3320fc2fc5391d26898cc119505cd3be30dd48b', class: {
129
+ return (h(Host, { key: '43b4e05ef076160d901c70dc37e177f19b524349', class: {
130
130
  [theme]: true,
131
131
  'grid-fixed': this.fixed,
132
- } }, h("slot", { key: '2000e6b336c294aadf4585269c301d734d2fe478' })));
132
+ } }, h("slot", { key: 'f3805936034708e6783223ded72c0ecfd40e5fb0' })));
133
133
  }
134
134
  };
135
135
  Grid.style = gridCss();
@@ -142,9 +142,9 @@ const Row = class {
142
142
  }
143
143
  render() {
144
144
  const theme = getIonTheme(this);
145
- return (h(Host, { key: '3a3c40062d2d0487c61dedbb172215b87bb425b1', class: {
145
+ return (h(Host, { key: '64ff6346d95be8d99d6500a6263067081f3fe254', class: {
146
146
  [theme]: true,
147
- } }, h("slot", { key: '164f457f6f7853ed8f7279d20bc6ede6cf9d3e5c' })));
147
+ } }, h("slot", { key: 'e9b4c111f3a49515a721bf679ef2f1a039c9822a' })));
148
148
  }
149
149
  };
150
150
  Row.style = rowCss();
@@ -6,7 +6,7 @@ import { c as caretLeftSvg } from './caret-left-fIOYmaqA.js';
6
6
  import { c as caretRightSvg } from './caret-right-BYSs-jZz.js';
7
7
  import { startFocusVisible } from './focus-visible-vXpMhGrs.js';
8
8
  import { r as raf, g as getElementRoot, a as renderHiddenInput, e as clamp } from './helpers-Do7zwvM1.js';
9
- import { F as FOCUS_TRAP_DISABLE_CLASS, d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-rwDDzEs4.js';
9
+ import { F as FOCUS_TRAP_DISABLE_CLASS, d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-ttYCMKRp.js';
10
10
  import { i as isRTL } from './dir-C53feagD.js';
11
11
  import { c as createColorClasses, g as getClassMap } from './theme-DaJxRxSQ.js';
12
12
  import { o as chevronForward, c as chevronBack, p as caretDownSharp, q as caretUpSharp, l as chevronDown } from './index-D2tu5BUg.js';
@@ -2309,11 +2309,11 @@ const Picker = class {
2309
2309
  render() {
2310
2310
  const { htmlAttributes } = this;
2311
2311
  const theme = getIonTheme(this);
2312
- return (h(Host, Object.assign({ key: '681ad6d20efa16f1d6c6f9a7d03caec2b17ff36e', "aria-modal": "true", tabindex: "-1" }, htmlAttributes, { style: {
2312
+ return (h(Host, Object.assign({ key: 'b0c1fc8eee284f03c696f0c8aaa29f4a6d7be0be', "aria-modal": "true", tabindex: "-1" }, htmlAttributes, { style: {
2313
2313
  zIndex: `${20000 + this.overlayIndex}`,
2314
2314
  }, class: Object.assign({ [theme]: true,
2315
2315
  // Used internally for styling
2316
- [`picker-${theme}`]: true, 'overlay-hidden': true }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonPickerWillDismiss: this.dispatchCancelHandler }), h("ion-backdrop", { key: '6dc71805810955048479c2a6eddce2303161cb8f', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: '0e61724c261c9d69ba23d3cb9064018942755033', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'a6ca79c9a5fce42b5aad6808802535c723f27fb9', class: "picker-wrapper ion-overlay-wrapper", role: "dialog" }, h("div", { key: '7651cbe9d723bba032788d85711e0f7c1dc32c21', class: "picker-toolbar" }, this.buttons.map((b) => (h("div", { class: buttonWrapperClass(b) }, h("button", { type: "button", onClick: () => this.buttonClick(b), class: buttonClass(b) }, b.text))))), h("div", { key: 'd6b83aded670bc74515c337c038503e396ab42cc', class: "picker-columns" }, h("div", { key: '1dfef6ed386d7b327dc19397cc9f01c3938fbab9', class: "picker-above-highlight" }), this.presented && this.columns.map((c) => h("ion-picker-legacy-column", { col: c })), h("div", { key: 'ec8b2f4de073a245f8917a494a681adf5d1f94f6', class: "picker-below-highlight" }))), h("div", { key: '8557ce93083feefa5deb6097270d756424f89ab2', tabindex: "0", "aria-hidden": "true" })));
2316
+ [`picker-${theme}`]: true, 'overlay-hidden': true }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonPickerWillDismiss: this.dispatchCancelHandler }), h("ion-backdrop", { key: 'b56a9f94c7a95efc047d7be95e76ba3a2284801d', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: 'f134d49a3afcfd2a809147b55949cea43fc34462', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '9ae98dc10164e182a13eaef2105894a717a03cc4', class: "picker-wrapper ion-overlay-wrapper", role: "dialog" }, h("div", { key: '96acad60c1214e13098282182fa855b19f0a386c', class: "picker-toolbar" }, this.buttons.map((b) => (h("div", { class: buttonWrapperClass(b) }, h("button", { type: "button", onClick: () => this.buttonClick(b), class: buttonClass(b) }, b.text))))), h("div", { key: 'af26cd644ed9bb50c22f06624da3726e7e60426f', class: "picker-columns" }, h("div", { key: 'c0d8bf724f7dc081c314bef61fa08894a75c657b', class: "picker-above-highlight" }), this.presented && this.columns.map((c) => h("ion-picker-legacy-column", { col: c })), h("div", { key: '7315333742b5b0c9533f30e5ce3dfc6ec9112dc1', class: "picker-below-highlight" }))), h("div", { key: '454546aaf27319ae7973e74063c0a026cfc88834', tabindex: "0", "aria-hidden": "true" })));
2317
2317
  }
2318
2318
  get el() { return getElement(this); }
2319
2319
  static get watchers() { return {
@@ -2671,9 +2671,9 @@ const PickerColumnCmp = class {
2671
2671
  render() {
2672
2672
  const col = this.col;
2673
2673
  const theme = getIonTheme(this);
2674
- return (h(Host, { key: 'aed1c1a702e03765d704f6f563fe26df58e68bbf', class: Object.assign({ [theme]: true, 'picker-col': true, 'picker-opts-left': this.col.align === 'left', 'picker-opts-right': this.col.align === 'right' }, getClassMap(col.cssClass)), style: {
2674
+ return (h(Host, { key: '5751788e3b7ecd2fe269c096db883b0681646270', class: Object.assign({ [theme]: true, 'picker-col': true, 'picker-opts-left': this.col.align === 'left', 'picker-opts-right': this.col.align === 'right' }, getClassMap(col.cssClass)), style: {
2675
2675
  'max-width': this.col.columnWidth,
2676
- } }, col.prefix && (h("div", { key: 'a6fae778eec5d57dba4b36b3e448c5c12fe0688b', class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { key: '1b77354fe5eeeeb4db94fab035a9ef5e45d695ac', class: "picker-opts", style: { maxWidth: col.optionsWidth }, ref: (el) => (this.optsEl = el) }, col.options.map((o, index) => (h("button", { "aria-label": o.ariaLabel, class: { 'picker-opt': true, 'picker-opt-disabled': !!o.disabled }, "opt-index": index }, o.text)))), col.suffix && (h("div", { key: '105286ef7ba6eac0796f5af7d6f1daef7107444a', class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
2676
+ } }, col.prefix && (h("div", { key: '833f3309c8c77e1faa773f7eaa066516dfd51067', class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { key: 'a39f38e60938e70425e4d7674f5e481885b6b548', class: "picker-opts", style: { maxWidth: col.optionsWidth }, ref: (el) => (this.optsEl = el) }, col.options.map((o, index) => (h("button", { "aria-label": o.ariaLabel, class: { 'picker-opt': true, 'picker-opt-disabled': !!o.disabled }, "opt-index": index }, o.text)))), col.suffix && (h("div", { key: 'a2f1e0eab834c85e84cee0a716eb1083aa6c7741', class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
2677
2677
  }
2678
2678
  get el() { return getElement(this); }
2679
2679
  static get watchers() { return {