@ionic/core 8.8.6-dev.11777559143.1d1ad1ad → 8.8.6-dev.11777569278.1613db2e

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 (304) hide show
  1. package/components/ion-action-sheet.js +1 -1
  2. package/components/ion-alert.js +1 -1
  3. package/components/ion-back-button.js +1 -1
  4. package/components/ion-button.js +1 -1
  5. package/components/ion-card.js +1 -1
  6. package/components/ion-chip.js +1 -1
  7. package/components/ion-col.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.d.ts +11 -0
  12. package/components/ion-gallery.js +4 -0
  13. package/components/ion-grid.js +1 -1
  14. package/components/ion-header.js +1 -1
  15. package/components/ion-img.js +1 -1
  16. package/components/ion-infinite-scroll-content.js +1 -1
  17. package/components/ion-infinite-scroll.js +1 -1
  18. package/components/ion-input-otp.js +1 -1
  19. package/components/ion-input-password-toggle.js +1 -1
  20. package/components/ion-input.js +1 -1
  21. package/components/ion-item-divider.js +1 -1
  22. package/components/ion-item-group.js +1 -1
  23. package/components/ion-item-option.js +1 -1
  24. package/components/ion-item-options.js +1 -1
  25. package/components/ion-item-sliding.js +1 -1
  26. package/components/ion-item.js +1 -1
  27. package/components/ion-label.js +1 -1
  28. package/components/ion-list-header.js +1 -1
  29. package/components/ion-list.js +1 -1
  30. package/components/ion-loading.js +1 -1
  31. package/components/ion-menu-button.js +1 -1
  32. package/components/ion-menu-toggle.js +1 -1
  33. package/components/ion-menu.js +1 -1
  34. package/components/ion-modal.js +1 -1
  35. package/components/ion-nav-link.js +1 -1
  36. package/components/ion-nav.js +1 -1
  37. package/components/ion-note.js +1 -1
  38. package/components/ion-picker-column-option.js +1 -1
  39. package/components/ion-picker-legacy-column.js +1 -1
  40. package/components/ion-picker-legacy.js +1 -1
  41. package/components/ion-popover.js +1 -1
  42. package/components/ion-progress-bar.js +1 -1
  43. package/components/ion-radio-group.js +1 -1
  44. package/components/ion-radio.js +1 -1
  45. package/components/ion-range.js +1 -1
  46. package/components/ion-refresher-content.js +1 -1
  47. package/components/ion-refresher.js +1 -1
  48. package/components/ion-reorder-group.js +1 -1
  49. package/components/ion-reorder.js +1 -1
  50. package/components/ion-ripple-effect.js +1 -1
  51. package/components/ion-router-link.js +1 -1
  52. package/components/ion-router-outlet.js +1 -1
  53. package/components/ion-row.js +1 -1
  54. package/components/ion-searchbar.js +1 -1
  55. package/components/ion-segment-button.js +1 -1
  56. package/components/ion-segment-content.js +1 -1
  57. package/components/ion-segment-view.js +1 -1
  58. package/components/ion-segment.js +1 -1
  59. package/components/ion-select-modal.js +1 -1
  60. package/components/ion-select-option.js +1 -1
  61. package/components/ion-select-popover.js +1 -1
  62. package/components/ion-select.js +1 -1
  63. package/components/ion-skeleton-text.js +1 -1
  64. package/components/ion-spinner.js +1 -1
  65. package/components/ion-split-pane.js +1 -1
  66. package/components/ion-tab-bar.js +1 -1
  67. package/components/ion-tab-button.js +1 -1
  68. package/components/ion-tab.js +1 -1
  69. package/components/ion-tabs.js +1 -1
  70. package/components/ion-text.js +1 -1
  71. package/components/ion-textarea.js +1 -1
  72. package/components/ion-thumbnail.js +1 -1
  73. package/components/ion-title.js +1 -1
  74. package/components/ion-toast.js +1 -1
  75. package/components/ion-toggle.js +1 -1
  76. package/components/ion-toolbar.js +1 -1
  77. package/components/p-B2rpt1JV.js +4 -0
  78. package/components/p-B6zr9RZN.js +4 -0
  79. package/components/{p-Brxa0j7O.js → p-B71c6yUH.js} +1 -1
  80. package/components/{p-ByuCfbYy.js → p-BCFZKMI6.js} +1 -1
  81. package/components/{p-C2cZvGcF.js → p-BFbsici0.js} +1 -1
  82. package/components/{p-CoarhFWH.js → p-BLCuPAtN.js} +1 -1
  83. package/components/{p-GnGGIfCd.js → p-BRWWcnBq.js} +1 -1
  84. package/components/{p-BfHB6wX_.js → p-BXcCGjEc.js} +1 -1
  85. package/components/{p-BU8N7ZrK.js → p-BqImG3uk.js} +1 -1
  86. package/components/{p-D5lMX0xt.js → p-C8ktKu9j.js} +1 -1
  87. package/components/{p-BhfW3d9j.js → p-CIoAIKEr.js} +1 -1
  88. package/components/p-CN-WzkJE.js +4 -0
  89. package/components/{p-CnwZE7CW.js → p-CoFqDNc5.js} +1 -1
  90. package/components/{p-TpZHKDyk.js → p-DAv9P_LE.js} +1 -1
  91. package/components/{p-CeYwuysM.js → p-DH_9VCbD.js} +1 -1
  92. package/components/{p-CdYTq34D.js → p-DTtRWhIZ.js} +1 -1
  93. package/components/{p-C-_EGKki.js → p-DXUyXgVL.js} +1 -1
  94. package/components/{p-BTYqyHph.js → p-Di5rHO3q.js} +1 -1
  95. package/components/{p-BtAlyZ0b.js → p-IMXp2Inn.js} +1 -1
  96. package/components/{p-DAeMHNER.js → p-TR4ubkPu.js} +1 -1
  97. package/dist/cjs/ion-app_8.cjs.entry.js +7 -7
  98. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  99. package/dist/cjs/ion-col_3.cjs.entry.js +8 -6
  100. package/dist/cjs/ion-datetime_3.cjs.entry.js +4 -4
  101. package/dist/cjs/ion-gallery.cjs.entry.js +330 -0
  102. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  103. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +3 -3
  104. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  105. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +3 -3
  106. package/dist/cjs/ion-input.cjs.entry.js +4 -4
  107. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  108. package/dist/cjs/ion-item_8.cjs.entry.js +12 -12
  109. package/dist/cjs/ion-loading.cjs.entry.js +2 -2
  110. package/dist/cjs/ion-menu_3.cjs.entry.js +6 -6
  111. package/dist/cjs/ion-modal.cjs.entry.js +4 -4
  112. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  113. package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
  114. package/dist/cjs/ion-popover.cjs.entry.js +2 -2
  115. package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
  116. package/dist/cjs/ion-radio_2.cjs.entry.js +5 -5
  117. package/dist/cjs/ion-range.cjs.entry.js +3 -3
  118. package/dist/cjs/ion-refresher_2.cjs.entry.js +3 -3
  119. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  120. package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
  121. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  122. package/dist/cjs/ion-searchbar.cjs.entry.js +4 -4
  123. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  124. package/dist/cjs/ion-segment-view.cjs.entry.js +2 -2
  125. package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
  126. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  127. package/dist/cjs/ion-select_3.cjs.entry.js +6 -6
  128. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  129. package/dist/cjs/ion-split-pane.cjs.entry.js +3 -2
  130. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  131. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  132. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  133. package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
  134. package/dist/cjs/ion-toast.cjs.entry.js +2 -2
  135. package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
  136. package/dist/cjs/ionic.cjs.js +1 -1
  137. package/dist/cjs/loader.cjs.js +1 -1
  138. package/dist/collection/collection-manifest.json +6 -0
  139. package/dist/collection/components/col/col.js +3 -2
  140. package/dist/collection/components/gallery/gallery-interface.js +1 -0
  141. package/dist/collection/components/gallery/gallery.css +103 -0
  142. package/dist/collection/components/gallery/gallery.js +421 -0
  143. package/dist/collection/components/gallery/test/utils.js +100 -0
  144. package/dist/collection/components/grid/grid.js +2 -2
  145. package/dist/collection/components/header/header.js +2 -2
  146. package/dist/collection/components/img/img.js +2 -2
  147. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  148. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  149. package/dist/collection/components/input/input.js +4 -4
  150. package/dist/collection/components/input-otp/input-otp.js +3 -3
  151. package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
  152. package/dist/collection/components/item-divider/item-divider.js +2 -2
  153. package/dist/collection/components/item-group/item-group.js +1 -1
  154. package/dist/collection/components/item-option/item-option.js +2 -2
  155. package/dist/collection/components/item-options/item-options.js +1 -1
  156. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  157. package/dist/collection/components/label/label.js +2 -2
  158. package/dist/collection/components/list/list.js +1 -1
  159. package/dist/collection/components/list-header/list-header.js +2 -2
  160. package/dist/collection/components/loading/loading.js +2 -2
  161. package/dist/collection/components/menu/menu.js +2 -2
  162. package/dist/collection/components/menu-button/menu-button.js +2 -2
  163. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  164. package/dist/collection/components/modal/modal.js +4 -4
  165. package/dist/collection/components/nav/nav.js +1 -1
  166. package/dist/collection/components/nav-link/nav-link.js +1 -1
  167. package/dist/collection/components/note/note.js +2 -2
  168. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
  169. package/dist/collection/components/picker-legacy/picker.js +2 -2
  170. package/dist/collection/components/picker-legacy-column/picker-column.js +2 -2
  171. package/dist/collection/components/popover/popover.js +2 -2
  172. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  173. package/dist/collection/components/radio/radio.js +3 -3
  174. package/dist/collection/components/radio-group/radio-group.js +2 -2
  175. package/dist/collection/components/range/range.js +3 -3
  176. package/dist/collection/components/refresher/refresher.js +1 -1
  177. package/dist/collection/components/refresher-content/refresher-content.js +2 -2
  178. package/dist/collection/components/reorder/reorder.js +2 -2
  179. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  180. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  181. package/dist/collection/components/router-link/router-link.js +2 -2
  182. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  183. package/dist/collection/components/row/row.js +2 -2
  184. package/dist/collection/components/searchbar/searchbar.js +4 -4
  185. package/dist/collection/components/segment/segment.js +2 -2
  186. package/dist/collection/components/segment-button/segment-button.js +2 -2
  187. package/dist/collection/components/segment-content/segment-content.js +1 -1
  188. package/dist/collection/components/segment-view/segment-view.js +2 -2
  189. package/dist/collection/components/select/select.js +3 -3
  190. package/dist/collection/components/select-modal/select-modal.js +1 -1
  191. package/dist/collection/components/select-option/select-option.js +1 -1
  192. package/dist/collection/components/select-popover/select-popover.js +2 -2
  193. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  194. package/dist/collection/components/spinner/spinner.js +1 -1
  195. package/dist/collection/components/split-pane/split-pane.js +3 -2
  196. package/dist/collection/components/tab/tab.js +2 -2
  197. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  198. package/dist/collection/components/tab-button/tab-button.js +2 -2
  199. package/dist/collection/components/tabs/tabs.js +1 -1
  200. package/dist/collection/components/text/text.js +2 -2
  201. package/dist/collection/components/textarea/textarea.js +3 -3
  202. package/dist/collection/components/thumbnail/thumbnail.js +2 -2
  203. package/dist/collection/components/title/title.js +2 -2
  204. package/dist/collection/components/toast/toast.js +2 -2
  205. package/dist/collection/components/toggle/toggle.js +3 -3
  206. package/dist/collection/components/toolbar/toolbar.js +2 -2
  207. package/dist/collection/utils/media.js +1 -0
  208. package/dist/docs.json +212 -1
  209. package/dist/esm/ion-app_8.entry.js +7 -7
  210. package/dist/esm/ion-avatar_3.entry.js +2 -2
  211. package/dist/esm/ion-col_3.entry.js +8 -6
  212. package/dist/esm/ion-datetime_3.entry.js +4 -4
  213. package/dist/esm/ion-gallery.entry.js +328 -0
  214. package/dist/esm/ion-img.entry.js +2 -2
  215. package/dist/esm/ion-infinite-scroll_2.entry.js +3 -3
  216. package/dist/esm/ion-input-otp.entry.js +3 -3
  217. package/dist/esm/ion-input-password-toggle.entry.js +3 -3
  218. package/dist/esm/ion-input.entry.js +4 -4
  219. package/dist/esm/ion-item-option_3.entry.js +4 -4
  220. package/dist/esm/ion-item_8.entry.js +12 -12
  221. package/dist/esm/ion-loading.entry.js +2 -2
  222. package/dist/esm/ion-menu_3.entry.js +6 -6
  223. package/dist/esm/ion-modal.entry.js +4 -4
  224. package/dist/esm/ion-nav_2.entry.js +2 -2
  225. package/dist/esm/ion-picker-column-option.entry.js +2 -2
  226. package/dist/esm/ion-popover.entry.js +2 -2
  227. package/dist/esm/ion-progress-bar.entry.js +1 -1
  228. package/dist/esm/ion-radio_2.entry.js +5 -5
  229. package/dist/esm/ion-range.entry.js +3 -3
  230. package/dist/esm/ion-refresher_2.entry.js +3 -3
  231. package/dist/esm/ion-reorder_2.entry.js +3 -3
  232. package/dist/esm/ion-ripple-effect.entry.js +1 -1
  233. package/dist/esm/ion-route_4.entry.js +2 -2
  234. package/dist/esm/ion-searchbar.entry.js +4 -4
  235. package/dist/esm/ion-segment-content.entry.js +1 -1
  236. package/dist/esm/ion-segment-view.entry.js +2 -2
  237. package/dist/esm/ion-segment_2.entry.js +4 -4
  238. package/dist/esm/ion-select-modal.entry.js +1 -1
  239. package/dist/esm/ion-select_3.entry.js +6 -6
  240. package/dist/esm/ion-spinner.entry.js +1 -1
  241. package/dist/esm/ion-split-pane.entry.js +3 -2
  242. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  243. package/dist/esm/ion-tab_2.entry.js +3 -3
  244. package/dist/esm/ion-text.entry.js +2 -2
  245. package/dist/esm/ion-textarea.entry.js +3 -3
  246. package/dist/esm/ion-toast.entry.js +2 -2
  247. package/dist/esm/ion-toggle.entry.js +3 -3
  248. package/dist/esm/ionic.js +1 -1
  249. package/dist/esm/loader.js +1 -1
  250. package/dist/html.html-data.json +70 -0
  251. package/dist/ionic/ionic.esm.js +1 -1
  252. package/dist/ionic/{p-96549175.entry.js → p-00c0bd38.entry.js} +1 -1
  253. package/dist/ionic/{p-79ae0425.entry.js → p-05a30032.entry.js} +1 -1
  254. package/dist/ionic/{p-192e7509.entry.js → p-15e3e8f5.entry.js} +1 -1
  255. package/dist/ionic/{p-5ac21be2.entry.js → p-1709b0aa.entry.js} +1 -1
  256. package/dist/ionic/{p-2bf931ae.entry.js → p-1c2c1869.entry.js} +1 -1
  257. package/dist/ionic/{p-3bf01c2c.entry.js → p-1c4de46b.entry.js} +1 -1
  258. package/dist/ionic/p-1e1c8d61.entry.js +4 -0
  259. package/dist/ionic/p-24b35f99.entry.js +4 -0
  260. package/dist/ionic/p-2aa7567e.entry.js +4 -0
  261. package/dist/ionic/{p-bc5713f7.entry.js → p-2ad79c23.entry.js} +1 -1
  262. package/dist/ionic/{p-5a3fc28e.entry.js → p-2f0073af.entry.js} +1 -1
  263. package/dist/ionic/{p-59b4f8d0.entry.js → p-3f79f594.entry.js} +1 -1
  264. package/dist/ionic/p-4079cee3.entry.js +4 -0
  265. package/dist/ionic/{p-f061fcb7.entry.js → p-48026d15.entry.js} +1 -1
  266. package/dist/ionic/{p-4091ad21.entry.js → p-50b61fab.entry.js} +1 -1
  267. package/dist/ionic/{p-8516eb69.entry.js → p-50cd2d57.entry.js} +1 -1
  268. package/dist/ionic/{p-50d90690.entry.js → p-5274f999.entry.js} +1 -1
  269. package/dist/ionic/{p-3093958a.entry.js → p-586d4270.entry.js} +1 -1
  270. package/dist/ionic/{p-b8b20b7e.entry.js → p-71b6014c.entry.js} +1 -1
  271. package/dist/ionic/{p-9b9b1450.entry.js → p-72491468.entry.js} +1 -1
  272. package/dist/ionic/{p-f740c359.entry.js → p-7d5057c4.entry.js} +1 -1
  273. package/dist/ionic/{p-091a95ea.entry.js → p-83c693c4.entry.js} +1 -1
  274. package/dist/ionic/{p-2aa44c65.entry.js → p-8537b2fb.entry.js} +1 -1
  275. package/dist/ionic/{p-a53a3ecc.entry.js → p-8f127a9c.entry.js} +1 -1
  276. package/dist/ionic/{p-98c34fd7.entry.js → p-9d789053.entry.js} +1 -1
  277. package/dist/ionic/{p-1faf270d.entry.js → p-a9fb086b.entry.js} +1 -1
  278. package/dist/ionic/{p-e7f216ae.entry.js → p-ae667493.entry.js} +1 -1
  279. package/dist/ionic/{p-edb0b0c8.entry.js → p-b2fe6c1c.entry.js} +1 -1
  280. package/dist/ionic/{p-2effd05d.entry.js → p-b3c9f19c.entry.js} +1 -1
  281. package/dist/ionic/{p-6c8c37c2.entry.js → p-b653f4c2.entry.js} +1 -1
  282. package/dist/ionic/{p-4e46439d.entry.js → p-bd71a4a7.entry.js} +1 -1
  283. package/dist/ionic/p-bf972309.entry.js +4 -0
  284. package/dist/ionic/{p-8180abe5.entry.js → p-c10fa162.entry.js} +1 -1
  285. package/dist/ionic/{p-d954cd19.entry.js → p-d4ed5710.entry.js} +1 -1
  286. package/dist/ionic/{p-228b6a9c.entry.js → p-d6299c37.entry.js} +1 -1
  287. package/dist/ionic/{p-b0c54b4c.entry.js → p-d976e777.entry.js} +1 -1
  288. package/dist/ionic/{p-4610e447.entry.js → p-e18d3fdb.entry.js} +1 -1
  289. package/dist/ionic/{p-1855fcb6.entry.js → p-e3abffbe.entry.js} +1 -1
  290. package/dist/ionic/{p-4c864eb2.entry.js → p-fad05840.entry.js} +1 -1
  291. package/dist/types/components/gallery/gallery-interface.d.ts +9 -0
  292. package/dist/types/components/gallery/gallery.d.ts +125 -0
  293. package/dist/types/components/gallery/test/utils.d.ts +2 -0
  294. package/dist/types/components.d.ts +66 -0
  295. package/hydrate/index.js +469 -126
  296. package/hydrate/index.mjs +469 -126
  297. package/package.json +1 -1
  298. package/components/p-CnOTQxHB.js +0 -4
  299. package/components/p-XFUFdPrc.js +0 -4
  300. package/components/p-tYh73xQe.js +0 -4
  301. package/dist/ionic/p-308beb71.entry.js +0 -4
  302. package/dist/ionic/p-64341e32.entry.js +0 -4
  303. package/dist/ionic/p-76d0e7ef.entry.js +0 -4
  304. package/dist/ionic/p-ae4ea663.entry.js +0 -4
@@ -0,0 +1,328 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { r as registerInstance, f as printIonWarning, h, d as Host, g as getElement } from './index-Omi_TcwW.js';
5
+ import { c as getIonTheme } from './ionic-global-CAZb-5i-.js';
6
+
7
+ const galleryCss = () => `:host{display:grid;grid-template-columns:repeat(var(--internal-gallery-columns, 2), minmax(0, 1fr))}:host(.gallery-layout-uniform){gap:var(--ion-gallery-gap, 16px)}:host(.gallery-layout-uniform) ::slotted(*){aspect-ratio:1/1}:host(.gallery-layout-masonry){-ms-flex-align:start;align-items:start;-webkit-column-gap:var(--ion-gallery-gap, 16px);-moz-column-gap:var(--ion-gallery-gap, 16px);column-gap:var(--ion-gallery-gap, 16px);row-gap:0;grid-auto-rows:2px}:host(.gallery-layout-masonry) ::slotted(*){display:block;min-height:unset;margin-bottom:var(--ion-gallery-gap, 16px)}::slotted(*){margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;width:100%}::slotted(img){display:block;-o-object-fit:cover;object-fit:cover;-o-object-position:center;object-position:center}`;
8
+
9
+ // TODO(FW-7285): Replace with global breakpoints
10
+ const BREAKPOINTS = {
11
+ xs: 0,
12
+ sm: 576,
13
+ md: 768,
14
+ lg: 992,
15
+ xl: 1200,
16
+ xxl: 1400,
17
+ };
18
+ const DEFAULT_COLUMNS = {
19
+ xs: 2,
20
+ sm: 3,
21
+ md: 4,
22
+ lg: 6,
23
+ xl: 8,
24
+ xxl: 10,
25
+ };
26
+ const BREAKPOINT_ORDER = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
27
+ const Gallery = class {
28
+ constructor(hostRef) {
29
+ registerInstance(this, hostRef);
30
+ // Keep track of whether we've warned about invalid columns to avoid
31
+ // duplicate warnings on screen resize.
32
+ this.hasWarnedInvalidColumns = false;
33
+ /**
34
+ * The visual layout of the gallery. When `uniform`, rows take up the height
35
+ * of the tallest item and are spaced evenly across the gallery. Additionally,
36
+ * items will have an aspect ratio of 1/1, forcing them to be square unless a
37
+ * height is explicitly set. When `masonry`, items will be positioned under each
38
+ * other with only the specified gap between them.
39
+ */
40
+ this.layout = 'uniform';
41
+ /**
42
+ * The order in which items are positioned. Only applies when layout is
43
+ * `masonry`. When `sequential`, items are positioned in the order they are
44
+ * placed in the DOM. When `best-fit`, items are positioned under the column
45
+ * with the most available space.
46
+ */
47
+ this.order = 'sequential';
48
+ /**
49
+ * The number of columns to display. Can be set as a number or an object of
50
+ * breakpoint values (e.g. `{ xs: 2, sm: 3, md: 4 }`).
51
+ */
52
+ this.columns = DEFAULT_COLUMNS;
53
+ /**
54
+ * Listen for the slotchange event on the slot.
55
+ * When the layout is `masonry`, this listener is used to schedule a resize
56
+ * of the masonry grid when the slot changes. This is useful for when items
57
+ * are added or removed from the gallery.
58
+ */
59
+ this.onSlotChange = () => {
60
+ this.scheduleMasonryResize();
61
+ };
62
+ /**
63
+ * Measure the host and children, then compute masonry placement.
64
+ */
65
+ this.resizeMasonryGrid = () => {
66
+ this.masonryRaf = undefined;
67
+ if (this.layout !== 'masonry') {
68
+ this.clearMasonryStyles();
69
+ return;
70
+ }
71
+ const styles = getComputedStyle(this.el);
72
+ const rowHeight = parseFloat(styles.getPropertyValue('grid-auto-rows')) || 0;
73
+ const rowGap = parseFloat(styles.getPropertyValue('row-gap')) || parseFloat(styles.getPropertyValue('gap')) || 0;
74
+ const columnsStr = styles.getPropertyValue('--internal-gallery-columns');
75
+ // Fallback to 2 columns for masonry calculations when the resolved
76
+ // --internal-gallery-columns CSS value is missing or unparsable.
77
+ const columns = parseInt(columnsStr, 10) || 2;
78
+ const items = this.getItems();
79
+ this.layoutMasonry(items, rowHeight, rowGap, columns);
80
+ };
81
+ }
82
+ layoutChanged() {
83
+ this.updateResponsiveColumns(true);
84
+ this.scheduleMasonryResize();
85
+ }
86
+ componentDidLoad() {
87
+ this.updateResponsiveColumns(true);
88
+ this.resizeObserver = new ResizeObserver(() => {
89
+ this.updateResponsiveColumns();
90
+ this.scheduleMasonryResize();
91
+ });
92
+ this.resizeObserver.observe(this.el);
93
+ this.scheduleMasonryResize();
94
+ }
95
+ disconnectedCallback() {
96
+ var _a;
97
+ if (this.masonryRaf !== undefined) {
98
+ cancelAnimationFrame(this.masonryRaf);
99
+ this.masonryRaf = undefined;
100
+ }
101
+ (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
102
+ this.resizeObserver = undefined;
103
+ }
104
+ /**
105
+ * Listen for the load event on child elements.
106
+ * When the layout is `masonry`, this listener is used to schedule a resize
107
+ * of the masonry grid when the child elements load. This is useful for when
108
+ * images take time to load.
109
+ */
110
+ onChildLoad(ev) {
111
+ if (this.layout !== 'masonry') {
112
+ return;
113
+ }
114
+ const target = ev.target;
115
+ if (target !== null && this.el.contains(target)) {
116
+ this.scheduleMasonryResize();
117
+ }
118
+ }
119
+ /**
120
+ * Batch masonry measurements to a single animation frame.
121
+ * This avoids repeated sync layouts during rapid resize/load/slot changes.
122
+ */
123
+ scheduleMasonryResize() {
124
+ if (this.layout !== 'masonry') {
125
+ this.clearMasonryStyles();
126
+ return;
127
+ }
128
+ if (this.masonryRaf !== undefined) {
129
+ cancelAnimationFrame(this.masonryRaf);
130
+ }
131
+ this.masonryRaf = requestAnimationFrame(this.resizeMasonryGrid);
132
+ }
133
+ /**
134
+ * Normalize a columns value to a positive integer.
135
+ * Returns undefined when the input cannot be interpreted as a finite number.
136
+ */
137
+ sanitizeColumns(columns) {
138
+ if (columns === undefined) {
139
+ return undefined;
140
+ }
141
+ const numericColumns = typeof columns === 'number' ? columns : Number(columns);
142
+ if (!Number.isFinite(numericColumns) || !Number.isInteger(numericColumns) || numericColumns <= 0) {
143
+ return undefined;
144
+ }
145
+ return numericColumns;
146
+ }
147
+ /**
148
+ * Check if the value is a breakpoint columns object.
149
+ */
150
+ isBreakpointColumns(value) {
151
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
152
+ }
153
+ /**
154
+ * Check if the breakpoint columns object has any invalid values.
155
+ * Returns true if any value is undefined or not a positive integer.
156
+ */
157
+ hasInvalidBreakpointColumns(breakpointColumns) {
158
+ for (const breakpoint of BREAKPOINT_ORDER) {
159
+ const value = breakpointColumns[breakpoint];
160
+ if (value !== undefined && this.sanitizeColumns(value) === undefined) {
161
+ return true;
162
+ }
163
+ }
164
+ return false;
165
+ }
166
+ /**
167
+ * Get the columns from a responsive breakpoint map.
168
+ * Returns the columns for the last matching breakpoint.
169
+ */
170
+ getColumnsFromBreakpointColumns(width, breakpointColumns) {
171
+ let columns;
172
+ for (const bp of BREAKPOINT_ORDER) {
173
+ const customValue = breakpointColumns[bp];
174
+ const parsedCustom = this.sanitizeColumns(customValue);
175
+ const parsedDefault = this.sanitizeColumns(DEFAULT_COLUMNS[bp]);
176
+ // Use valid custom values when present; otherwise fall back to defaults per breakpoint.
177
+ const resolved = customValue === undefined || parsedCustom === undefined ? parsedDefault : parsedCustom;
178
+ if (resolved !== undefined && width >= BREAKPOINTS[bp]) {
179
+ columns = resolved;
180
+ }
181
+ }
182
+ return columns;
183
+ }
184
+ /**
185
+ * Warn about an invalid columns value when it is set to a non-positive
186
+ * integer or a breakpoint map object with invalid values.
187
+ */
188
+ warnInvalidColumns(columns) {
189
+ printIonWarning(`[ion-gallery] - Invalid "columns" value (${JSON.stringify(columns)}). Expected a positive integer or breakpoint map object (e.g. { xs: 2, md: 4 }). Falling back to default responsive columns.`, this.el);
190
+ this.hasWarnedInvalidColumns = true;
191
+ }
192
+ /**
193
+ * Resolve the active columns value for the current width. Falls back to
194
+ * the default responsive columns when the provided prop is invalid.
195
+ */
196
+ getColumnsForWidth(width) {
197
+ const { columns, hasWarnedInvalidColumns } = this;
198
+ const isBreakpointColumns = this.isBreakpointColumns(columns);
199
+ const hasInvalidBreakpointColumns = isBreakpointColumns && this.hasInvalidBreakpointColumns(columns);
200
+ const sanitizedColumns = isBreakpointColumns
201
+ ? this.getColumnsFromBreakpointColumns(width, columns)
202
+ : this.sanitizeColumns(columns);
203
+ if (!hasWarnedInvalidColumns &&
204
+ (hasInvalidBreakpointColumns || (!isBreakpointColumns && sanitizedColumns === undefined))) {
205
+ this.warnInvalidColumns(columns);
206
+ }
207
+ if (sanitizedColumns !== undefined) {
208
+ return sanitizedColumns;
209
+ }
210
+ return this.getColumnsFromBreakpointColumns(width, DEFAULT_COLUMNS);
211
+ }
212
+ /**
213
+ * Update the responsive columns for the gallery.
214
+ * This is used to update the columns when the component width changes.
215
+ */
216
+ updateResponsiveColumns(force = false) {
217
+ const width = this.el.getBoundingClientRect().width;
218
+ // Only update the columns if the component width has changed by more than
219
+ // 1px or if the force flag is true. This prevents unnecessary re-renders
220
+ // when the component width has not changed.
221
+ if (!width || (!force && this.lastWidth !== undefined && Math.abs(this.lastWidth - width) < 1)) {
222
+ return;
223
+ }
224
+ this.lastWidth = width;
225
+ const columns = this.getColumnsForWidth(width);
226
+ this.el.style.setProperty('--internal-gallery-columns', `${columns}`);
227
+ }
228
+ /**
229
+ * Return all directly slotted HTMLElement children of the gallery.
230
+ */
231
+ getItems() {
232
+ return Array.from(this.el.children).filter((child) => child instanceof HTMLElement);
233
+ }
234
+ /**
235
+ * Clear the item styles for the given item element.
236
+ * This is used to switch between uniform and masonry layouts.
237
+ */
238
+ clearItemStyles(itemEl) {
239
+ itemEl.style.gridRowStart = '';
240
+ itemEl.style.gridRowEnd = '';
241
+ itemEl.style.gridColumn = '';
242
+ }
243
+ /**
244
+ * Clear placement styles for all items when leaving masonry mode.
245
+ */
246
+ clearMasonryStyles() {
247
+ this.getItems().forEach((itemEl) => this.clearItemStyles(itemEl));
248
+ }
249
+ /**
250
+ * Convert a rendered item height to the number of grid rows it should span.
251
+ * Returns undefined for images that are not fully loaded yet.
252
+ */
253
+ calculateRowSpan(itemEl, rowHeight, rowGap) {
254
+ if (itemEl instanceof HTMLImageElement && (!itemEl.complete || itemEl.naturalHeight === 0)) {
255
+ return undefined;
256
+ }
257
+ const height = itemEl.getBoundingClientRect().height;
258
+ const itemStyles = getComputedStyle(itemEl);
259
+ const marginBottom = parseFloat(itemStyles.getPropertyValue('margin-bottom')) || 0;
260
+ const denominator = rowHeight + rowGap;
261
+ if (!denominator || !Number.isFinite(denominator)) {
262
+ return 1;
263
+ }
264
+ return Math.ceil((height + marginBottom + rowGap) / denominator) || 1;
265
+ }
266
+ /**
267
+ * Get the index of the column to position the item in.
268
+ * When the order is `best-fit`, the column with the shortest height is
269
+ * returned. Otherwise, items are placed in the column that matches their
270
+ * natural DOM order.
271
+ */
272
+ getColumnIndex(index, columnHeights, columns) {
273
+ const { order } = this;
274
+ if (order === 'best-fit') {
275
+ let columnIndex = 0;
276
+ for (let i = 1; i < columns; i++) {
277
+ if (columnHeights[i] < columnHeights[columnIndex]) {
278
+ columnIndex = i;
279
+ }
280
+ }
281
+ return columnIndex;
282
+ }
283
+ return index % columns;
284
+ }
285
+ /**
286
+ * Apply masonry placement by assigning each item a column and row span.
287
+ */
288
+ layoutMasonry(items, rowHeight, rowGap, columns) {
289
+ const columnHeights = new Array(columns).fill(0);
290
+ items.forEach((itemEl, i) => {
291
+ const span = this.calculateRowSpan(itemEl, rowHeight, rowGap);
292
+ if (span === undefined) {
293
+ this.clearItemStyles(itemEl);
294
+ return;
295
+ }
296
+ const columnIndex = this.getColumnIndex(i, columnHeights, columns);
297
+ const start = columnHeights[columnIndex] + 1;
298
+ itemEl.style.gridColumn = `${columnIndex + 1}`;
299
+ itemEl.style.gridRowStart = `${start}`;
300
+ itemEl.style.gridRowEnd = `span ${span}`;
301
+ columnHeights[columnIndex] = start + span - 1;
302
+ });
303
+ }
304
+ render() {
305
+ const { layout, order } = this;
306
+ const theme = getIonTheme(this);
307
+ return (h(Host, { key: 'c8e3d332f3bf28671cd960571c7752bdacb503eb', class: {
308
+ [theme]: true,
309
+ [`gallery-layout-${layout}`]: true,
310
+ [`gallery-order-${order}`]: layout === 'masonry',
311
+ } }, h("slot", { key: 'ee0509845dfa77e0257bc01852f6b96cb78bee45', onSlotchange: this.onSlotChange })));
312
+ }
313
+ get el() { return getElement(this); }
314
+ static get watchers() { return {
315
+ "layout": [{
316
+ "layoutChanged": 0
317
+ }],
318
+ "order": [{
319
+ "layoutChanged": 0
320
+ }],
321
+ "columns": [{
322
+ "layoutChanged": 0
323
+ }]
324
+ }; }
325
+ };
326
+ Gallery.style = galleryCss();
327
+
328
+ export { Gallery as ion_gallery };
@@ -82,9 +82,9 @@ const Img = class {
82
82
  const { loadSrc, alt, onLoad, loadError, inheritedAttributes } = this;
83
83
  const { draggable } = inheritedAttributes;
84
84
  const theme = getIonTheme(this);
85
- return (h(Host, { key: '840d5b29d81222b061ac72168ef6551b5a061e3a', class: {
85
+ return (h(Host, { key: '91de170493b31d6260e975b440beceb6906b6d5a', class: {
86
86
  [theme]: true,
87
- } }, h("img", { key: 'e22e66ee4bb3a648b21c6080674e68eebf4a3feb', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
87
+ } }, h("img", { key: 'ac1f41afbece34a3e38e656733f3e55cce385b4c', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
88
88
  }
89
89
  get el() { return getElement(this); }
90
90
  static get watchers() { return {
@@ -269,7 +269,7 @@ const InfiniteScroll = class {
269
269
  render() {
270
270
  const theme = getIonTheme(this);
271
271
  const disabled = this.disabled;
272
- return (h(Host, { key: '22d99824cb589d9024666a3c1ed205f781858eed', class: {
272
+ return (h(Host, { key: '02beca21d668e4e605532ad5ca5a67a08c71eebb', class: {
273
273
  [theme]: true,
274
274
  'infinite-scroll-loading': this.isLoading,
275
275
  'infinite-scroll-enabled': !disabled,
@@ -313,11 +313,11 @@ const InfiniteScrollContent = class {
313
313
  }
314
314
  render() {
315
315
  const theme = getIonTheme(this);
316
- return (h(Host, { key: 'e94d19f17ef9d4d77786716152e3206366feb546', class: {
316
+ return (h(Host, { key: 'b51954f829eeafd5ec304b3e66e330776485ffc8', class: {
317
317
  [theme]: true,
318
318
  // Used internally for styling
319
319
  [`infinite-scroll-content-${theme}`]: true,
320
- } }, h("div", { key: '35fcc0572ad27a683aa55a704bd11b19fcdfd29c', class: "infinite-loading" }, this.loadingSpinner && (h("div", { key: 'fec3c13dbb2fa98699401147ce442b73e97e8bd8', class: "infinite-loading-spinner" }, h("ion-spinner", { key: '6cd6083255dacc891b4d201477e6bffccb1084bc', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
320
+ } }, 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())));
321
321
  }
322
322
  };
323
323
  InfiniteScrollContent.style = {
@@ -690,7 +690,7 @@ const InputOTP = class {
690
690
  const tabbableIndex = this.getTabbableIndex();
691
691
  const pattern = this.getPattern();
692
692
  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()) !== '';
693
- return (h(Host, { key: 'aee59cdba3f3c3783519cf114c668ae92f74fcef', class: createColorClasses(color, {
693
+ return (h(Host, { key: '7a5c5dbb7e1880bd94d4b00e579af941366b1cb2', class: createColorClasses(color, {
694
694
  [mode]: true,
695
695
  'has-focus': hasFocus,
696
696
  [`input-otp-size-${size}`]: true,
@@ -698,10 +698,10 @@ const InputOTP = class {
698
698
  [`input-otp-fill-${fill}`]: true,
699
699
  'input-otp-disabled': disabled,
700
700
  'input-otp-readonly': readonly,
701
- }) }, h("div", Object.assign({ key: 'a0b26b833a20807019114a78e4512a639b82a61f', 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: 'e525d1841bab5378b165ec1cca9fc45274c2c0ec', class: {
701
+ }) }, 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: {
702
702
  'input-otp-description': true,
703
703
  'input-otp-description-hidden': !hasDescription,
704
- }, part: "description" }, h("slot", { key: '9fd331ceff04ab93f8d4aec251565cc201f19294' }))));
704
+ }, part: "description" }, h("slot", { key: '163c374e7ae5dbdb1dc12483161e5aca919a50d5' }))));
705
705
  }
706
706
  static get formAssociated() { return true; }
707
707
  get el() { return getElement(this); }
@@ -99,16 +99,16 @@ const InputPasswordToggle = class {
99
99
  const { color, inputPasswordHideIcon, inputPasswordShowIcon, type } = this;
100
100
  const mode = getIonMode(this);
101
101
  const isPasswordVisible = type === 'text';
102
- return (h(Host, { key: 'e3c21d5bedebeadb57c0c9b7f065d15ab0d49e4a', class: createColorClasses(color, {
102
+ return (h(Host, { key: 'c7f0805958b284005806a0cb3ed0b5cba42cecd1', class: createColorClasses(color, {
103
103
  [mode]: true,
104
- }) }, h("ion-button", { key: '0a83d58e059bc3b7ef604270e92351d7fa5d129c', mode: mode, color: color, fill: "clear", shape: "round", "aria-label": isPasswordVisible ? 'Hide password' : 'Show password', "aria-pressed": isPasswordVisible ? 'true' : 'false', type: "button", onPointerDown: (ev) => {
104
+ }) }, h("ion-button", { key: 'dee2bdeb169d1fa4943c9a8b0164b8fbb4cdfe06', mode: mode, color: color, fill: "clear", shape: "round", "aria-label": isPasswordVisible ? 'Hide password' : 'Show password', "aria-pressed": isPasswordVisible ? 'true' : 'false', type: "button", onPointerDown: (ev) => {
105
105
  /**
106
106
  * This prevents mobile browsers from
107
107
  * blurring the input when the password toggle
108
108
  * button is activated.
109
109
  */
110
110
  ev.preventDefault();
111
- }, onClick: this.togglePasswordVisibility }, h("ion-icon", { key: 'af9a7e202fe0b3f75f10b3e13bf1e5fb653194d1', slot: "icon-only", "aria-hidden": "true", icon: isPasswordVisible ? inputPasswordHideIcon : inputPasswordShowIcon }))));
111
+ }, onClick: this.togglePasswordVisibility }, h("ion-icon", { key: 'be752db7186a7cd6fc033c7002fcb1683d93c162', slot: "icon-only", "aria-hidden": "true", icon: isPasswordVisible ? inputPasswordHideIcon : inputPasswordShowIcon }))));
112
112
  }
113
113
  get el() { return getElement(this); }
114
114
  static get watchers() { return {
@@ -620,7 +620,7 @@ const Input = class {
620
620
  * TODO(FW-5592): Remove hasStartEndSlots condition
621
621
  */
622
622
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
623
- return (h(Host, { key: 'd62741432c3e1421d69fdf2ed2e8058a1ce3544f', class: createColorClasses(this.color, {
623
+ return (h(Host, { key: 'beeeca9939e7e416783425f67d3c9e2be6bbae99', class: createColorClasses(this.color, {
624
624
  [theme]: true,
625
625
  'has-value': hasValue,
626
626
  'has-focus': hasFocus,
@@ -633,7 +633,7 @@ const Input = class {
633
633
  'in-item-color': hostContext('ion-item.ion-color', this.el),
634
634
  'input-disabled': disabled,
635
635
  'input-readonly': readonly,
636
- }) }, h("label", { key: '9707227d9eb977e0983c78757af20219eb1651c6', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '8bc5197ecb665e268668137844f122b74f69cc2d', class: "native-wrapper", onClick: this.onLabelClick },
636
+ }) }, h("label", { key: 'f227df52a6ad60344f16261a82c0d0566bb8cd5b', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'ae6da554ce21f805361a7704139b776a9344dcb2', class: "native-wrapper", onClick: this.onLabelClick },
637
637
  /**
638
638
  * For the ionic theme, we render the outline container here
639
639
  * instead of higher up, so it can be positioned relative to
@@ -643,14 +643,14 @@ const Input = class {
643
643
  * <label> element, ensuring that clicking the label text
644
644
  * focuses the input.
645
645
  */
646
- theme === 'ionic' && h("div", { key: '65383eeb6a876dbf103dd5358f041f45856e6e9d', class: "input-outline" }), h("slot", { key: '7d333894f2be13a4033a515ce3c8a4489cc4bfc3', name: "start" }), h("input", Object.assign({ key: '8221d445e4ee9e1d2946205893cbb6de93604c86', 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: '2fb77a78ecb32b46dc9641580c2c2f6125e9715d', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
646
+ 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) => {
647
647
  /**
648
648
  * This prevents mobile browsers from
649
649
  * blurring the input when the clear
650
650
  * button is activated.
651
651
  */
652
652
  ev.preventDefault();
653
- }, onClick: this.clearTextInput }, h("ion-icon", { key: 'a349dfb263a011fc10f01350f917c4020809f512', "aria-hidden": "true", icon: inputClearIcon }))), h("slot", { key: '6e02025608bd54cf36e21ed3bef00353921a7fb9', name: "end" })), shouldRenderHighlight && h("div", { key: '8bf1e516962d232a96a2fa701e10c8c909318f62', class: "input-highlight" })), this.renderBottomContent()));
653
+ }, 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()));
654
654
  }
655
655
  get el() { return getElement(this); }
656
656
  static get watchers() { return {
@@ -68,14 +68,14 @@ const ItemOption = class {
68
68
  href: this.href,
69
69
  target: this.target,
70
70
  };
71
- return (h(Host, { key: '810fe351aa83d6e88cb0e2ebee307b3050e65b45', onClick: this.onClick, class: createColorClasses(this.color, {
71
+ return (h(Host, { key: 'bfade0042108ff525077dfbdfd45169ccfd6b920', onClick: this.onClick, class: createColorClasses(this.color, {
72
72
  [theme]: true,
73
73
  [`item-option-${shape}`]: shape !== undefined,
74
74
  [`item-option-${hue}`]: hue !== undefined,
75
75
  'item-option-disabled': disabled,
76
76
  'item-option-expandable': expandable,
77
77
  'ion-activatable': true,
78
- }) }, h(TagType, Object.assign({ key: '6eb95c4f815e774d1b579a1fb2ddcad891966ca0' }, attrs, { class: "button-native", part: "native", disabled: disabled }), h("span", { key: '5630c1bd31910f46b0a08017a98f7935f17385bf', class: "button-inner", part: "inner" }, h("slot", { key: '081375e3b9683347008d08817ded21c61a374d93', name: "top" }), h("div", { key: '99d7dff311268ab4677397ab5a29b068f1cdf79b', class: "horizontal-wrapper", part: "container" }, h("slot", { key: 'b88858db83d847e3d49a84b75eb277500cb66fb3', name: "start" }), h("slot", { key: '8ca5149591a5e3285eff5078e1eb03554fb0713b', name: "icon-only" }), h("slot", { key: 'a8229a5e11bf41926745ab71f6dcd2d2ca63806c' }), h("slot", { key: '9a497c0cb92fe14ad6b9063fa0946fcd75fb8c08', name: "end" })), h("slot", { key: 'cae262fd2b7fad9e4bc9c02541fa17a6480ecf7f', name: "bottom" })), theme === 'md' && h("ion-ripple-effect", { key: '7114b927480e6a9261c7568e036ecf38ec1680ab' }))));
78
+ }) }, h(TagType, Object.assign({ key: '38466b511f4a20a3728f37dbf6779b852eba531a' }, attrs, { class: "button-native", part: "native", disabled: disabled }), h("span", { key: 'bb8f1b332afa2f575bcc69b340bd8f1faa5ca925', class: "button-inner", part: "inner" }, h("slot", { key: '41d627511e1615283956712e1b9519bae92460f6', name: "top" }), h("div", { key: 'bb949a43a586a8996933ee7528e5491beb647aa5', class: "horizontal-wrapper", part: "container" }, h("slot", { key: 'c0d6a73ef49082bfbdf0f542f7465d044ccb6521', name: "start" }), h("slot", { key: '79c6103e680983b2c1a17f1f11dbc41224cd4016', name: "icon-only" }), h("slot", { key: '6c7f17723544d3f6e8b9689b84ddf6196f1897a5' }), h("slot", { key: 'e15d0e02fde71bad8ff7bab0eded7d49508a926e', name: "end" })), h("slot", { key: 'c509d54d44ce33f5a34597b9d0ec29960bbcff62', name: "bottom" })), theme === 'md' && h("ion-ripple-effect", { key: '412d4dc645c941d0b4356cf982be3d5bc2686f13' }))));
79
79
  }
80
80
  get el() { return getElement(this); }
81
81
  };
@@ -110,7 +110,7 @@ const ItemOptions = class {
110
110
  render() {
111
111
  const theme = getIonTheme(this);
112
112
  const isEnd = isEndSide(this.side);
113
- return (h(Host, { key: 'cc55282505679d51fb90ebf30869e930c71afbd4', class: {
113
+ return (h(Host, { key: 'f3bb726a28c571101791d33d946df9017f47e5ec', class: {
114
114
  [theme]: true,
115
115
  // Used internally for styling
116
116
  [`item-options-${theme}`]: true,
@@ -658,7 +658,7 @@ const ItemSliding = class {
658
658
  }
659
659
  render() {
660
660
  const theme = getIonTheme(this);
661
- return (h(Host, { key: 'c945f30d9f7deb90d22064d4059e2b08f35614be', class: {
661
+ return (h(Host, { key: '321925e5582cc08b14031231603b1f1c49828b0a', class: {
662
662
  [theme]: true,
663
663
  'item-sliding-active-slide': this.state !== 2 /* SlidingState.Disabled */,
664
664
  'item-sliding-active-options-end': (this.state & 8 /* SlidingState.End */) !== 0,
@@ -308,11 +308,11 @@ const ItemDivider = class {
308
308
  }
309
309
  render() {
310
310
  const theme = getIonTheme(this);
311
- return (h(Host, { key: '4d481e6233a75f3c3042b5825d9c14fe77280f03', class: createColorClasses(this.color, {
311
+ return (h(Host, { key: 'ede65c17ec8e42e4096f8753116923d6b8d2cc14', class: createColorClasses(this.color, {
312
312
  [theme]: true,
313
313
  'item-divider-sticky': this.sticky,
314
314
  item: true,
315
- }) }, h("slot", { key: 'e10eeec38a39d7801b88f478c834beded30f1bb4', name: "start" }), h("div", { key: '3e88c2c1a5938ee2df3264d99f2c595d438a7557', class: "item-divider-inner", part: "inner" }, h("div", { key: 'e7bf5e3a985c59211bfac097e8a904627a9cc6f7', class: "item-divider-wrapper", part: "container" }, h("slot", { key: '0ec4f262411414bf44d9ab6e831dbc74672ba317' })), h("slot", { key: '9cd77653584fe95db1477149134af10e0d4053fa', name: "end" }))));
315
+ }) }, h("slot", { key: '4e16384a4481326490dab1ad31218c19eb9108db', name: "start" }), h("div", { key: '0bddbea071781e3372b5c7147c2fdd3ba0e29ffe', class: "item-divider-inner", part: "inner" }, h("div", { key: 'dfa603352f7cc58aaa717a32507b1dbbd7b79757', class: "item-divider-wrapper", part: "container" }, h("slot", { key: '4b1b67cfe72266645943f88ede9f8c61a344967d' })), h("slot", { key: '6ddd72a410c449e281f5344d02324e7461ba29e8', name: "end" }))));
316
316
  }
317
317
  get el() { return getElement(this); }
318
318
  };
@@ -334,7 +334,7 @@ const ItemGroup = class {
334
334
  }
335
335
  render() {
336
336
  const theme = getIonTheme(this);
337
- return (h(Host, { key: '3fb0784b321736344604e259cfb05c6307159bed', role: "group", class: {
337
+ return (h(Host, { key: '66ad8ce335cd97703e884538bdf6ea1927a30889', role: "group", class: {
338
338
  [theme]: true,
339
339
  // Used internally for styling
340
340
  [`item-group-${theme}`]: true,
@@ -408,13 +408,13 @@ const Label = class {
408
408
  render() {
409
409
  const position = this.position;
410
410
  const theme = getIonTheme(this);
411
- return (h(Host, { key: 'd730045c08ba576082563398ab51fc903577d214', class: createColorClasses(this.color, {
411
+ return (h(Host, { key: '7cbec4c1b8fe8925f44255e02cee78bc1873fd70', class: createColorClasses(this.color, {
412
412
  [theme]: true,
413
413
  'in-item-color': hostContext('ion-item.ion-color', this.el),
414
414
  [`label-${position}`]: position !== undefined,
415
415
  [`label-no-animate`]: this.noAnimate,
416
416
  'label-rtl': document.dir === 'rtl',
417
- }) }, h("slot", { key: '604289ef567339c83fb409371224906819a9d7cc' })));
417
+ }) }, h("slot", { key: '6d8b4a7ab396792d7a7c0b7e259c622840b7ef9b' })));
418
418
  }
419
419
  get el() { return getElement(this); }
420
420
  static get watchers() { return {
@@ -478,7 +478,7 @@ const List = class {
478
478
  const theme = getIonTheme(this);
479
479
  const shape = this.getShape();
480
480
  const { lines, inset } = this;
481
- return (h(Host, { key: 'dcdfb595a6b45307f9810e1ded25ba635c947940', role: "list", class: {
481
+ return (h(Host, { key: 'f17f7af20c567ea0098b362ea04d051b44aa151a', role: "list", class: {
482
482
  [theme]: true,
483
483
  // Used internally for styling
484
484
  [`list-${theme}`]: true,
@@ -509,10 +509,10 @@ const ListHeader = class {
509
509
  render() {
510
510
  const { lines } = this;
511
511
  const theme = getIonTheme(this);
512
- return (h(Host, { key: '0be4fb7d4f9cd6f50229cf7b361c74e94fbfce91', class: createColorClasses(this.color, {
512
+ return (h(Host, { key: '90c594b0290949b159f35bd36c86c3231a1b8e44', class: createColorClasses(this.color, {
513
513
  [theme]: true,
514
514
  [`list-header-lines-${lines}`]: lines !== undefined,
515
- }) }, h("div", { key: '4dcc3374685728ae9270d8d58b1ea1c08b0bbc08', class: "list-header-inner", part: "inner" }, h("slot", { key: '5658cc9185680bfa96328685d817b84b18e9ab5a' }))));
515
+ }) }, h("div", { key: '9d1bde129787263edb79bc921cdf0168a2935a27', class: "list-header-inner", part: "inner" }, h("slot", { key: 'fe157b5ff88355adfb09209ee92fd03c82e067ff' }))));
516
516
  }
517
517
  };
518
518
  ListHeader.style = {
@@ -533,9 +533,9 @@ const Note = class {
533
533
  }
534
534
  render() {
535
535
  const theme = getIonTheme(this);
536
- return (h(Host, { key: 'a8470df6b8fb8ca327a282fc23705bc230f13a40', class: createColorClasses(this.color, {
536
+ return (h(Host, { key: '34a74796fc2e41549100c6611a5900d60c8d688d', class: createColorClasses(this.color, {
537
537
  [theme]: true,
538
- }) }, h("slot", { key: '07cbdef68f010b06638f359f70dff3f1d659d899' })));
538
+ }) }, h("slot", { key: 'ea4c2e3b5666d10ca312e175db200134d8a30382' })));
539
539
  }
540
540
  };
541
541
  Note.style = {
@@ -571,11 +571,11 @@ const SkeletonText = class {
571
571
  const animated = this.animated && config.getBoolean('animated', true);
572
572
  const inMedia = hostContext('ion-avatar', this.el) || hostContext('ion-thumbnail', this.el);
573
573
  const theme = getIonTheme(this);
574
- return (h(Host, { key: '5014563646b6c5213750d503babce3013b66ec96', class: {
574
+ return (h(Host, { key: 'aa94213767105077047a369d4e4861027af96060', class: {
575
575
  [theme]: true,
576
576
  'skeleton-text-animated': animated,
577
577
  'in-media': inMedia,
578
- } }, h("span", { key: '4b816883b1c71bb1db66d8b2b084559f7cb489bd' }, "\u00A0")));
578
+ } }, h("span", { key: 'c5dab0fb89d524827936aef5345cc0c7eda9e274' }, "\u00A0")));
579
579
  }
580
580
  get el() { return getElement(this); }
581
581
  };
@@ -278,9 +278,9 @@ const Loading = class {
278
278
  * Otherwise, don't set aria-labelledby.
279
279
  */
280
280
  const ariaLabelledBy = message !== undefined ? msgId : null;
281
- return (h(Host, Object.assign({ key: '0c475f8e28e680e28e09317557795fc56e0835d8', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1" }, htmlAttributes, { style: {
281
+ return (h(Host, Object.assign({ key: 'b1e84a0d078fac04c0736a19d067d8d49e339323', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1" }, htmlAttributes, { style: {
282
282
  zIndex: `${40000 + this.overlayIndex}`,
283
- }, onIonBackdropTap: this.onBackdropTap, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [theme]: true, 'overlay-hidden': true, 'loading-translucent': this.translucent }) }), h("ion-backdrop", { key: 'd7e88feb6df8edbc326a84d07b294618f7ce6adc', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: 'f9622f45b2d9e913c325b228a1e6ed03cf2b98e8', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'f4dfdce70c4515878b247d0cc116b5cec2cf79a4', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (h("div", { key: '6d4475e00c444eb3d217813ae8cc1a02a97b969e', class: "loading-spinner" }, h("ion-spinner", { key: 'd9ad8dd56ec7677c18d06936c1a1b21a0a6a87a8', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), h("div", { key: 'bd3159e18f33ec25d3480d47ce33fa7dfd1f1460', tabindex: "0", "aria-hidden": "true" })));
283
+ }, onIonBackdropTap: this.onBackdropTap, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [theme]: true, 'overlay-hidden': true, 'loading-translucent': this.translucent }) }), h("ion-backdrop", { key: '19884fd6f8bf6f704bff388ecfa245d1cd98156c', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: 'ecd47d503a9805a5c18f1b0d48989e54b4cb8f78', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '231821576b812ffaa90ed9ced4437e456908ad53', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (h("div", { key: 'e18d21751a73f408bd058aa4270f245285cd57fa', class: "loading-spinner" }, h("ion-spinner", { key: '478761b8a000191951e9902138483b389e1b76c4', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), h("div", { key: '968be6c72872ce5bc8706fa37f242dcdc38efb33', tabindex: "0", "aria-hidden": "true" })));
284
284
  }
285
285
  get el() { return getElement(this); }
286
286
  static get watchers() { return {