voyager-ionic-core 8.8.12 → 9.0.1

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 (812) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion-group.js +1 -1
  3. package/components/ion-accordion.js +1 -1
  4. package/components/ion-action-sheet.js +1 -1
  5. package/components/ion-alert.js +1 -1
  6. package/components/ion-app.js +1 -1
  7. package/components/ion-avatar.js +1 -1
  8. package/components/ion-back-button.js +1 -1
  9. package/components/ion-backdrop.js +1 -1
  10. package/components/ion-badge.js +1 -1
  11. package/components/ion-breadcrumb.js +1 -1
  12. package/components/ion-breadcrumbs.js +1 -1
  13. package/components/ion-button.js +1 -1
  14. package/components/ion-buttons.js +1 -1
  15. package/components/ion-card-content.js +1 -1
  16. package/components/ion-card-header.js +1 -1
  17. package/components/ion-card-subtitle.js +1 -1
  18. package/components/ion-card-title.js +1 -1
  19. package/components/ion-card.js +1 -1
  20. package/components/ion-checkbox.js +1 -1
  21. package/components/ion-chip.js +1 -1
  22. package/components/ion-col.js +1 -1
  23. package/components/ion-content.js +1 -1
  24. package/components/ion-datetime-button.js +1 -1
  25. package/components/ion-datetime.js +1 -1
  26. package/components/ion-fab-button.js +1 -1
  27. package/components/ion-fab-list.js +1 -1
  28. package/components/ion-fab.js +1 -1
  29. package/components/ion-footer.js +1 -1
  30. package/components/ion-grid.js +1 -1
  31. package/components/ion-header.js +1 -1
  32. package/components/ion-icon.js +1 -1
  33. package/components/ion-img.js +1 -1
  34. package/components/ion-infinite-scroll-content.js +1 -1
  35. package/components/ion-infinite-scroll.js +1 -1
  36. package/components/ion-input-otp.js +1 -1
  37. package/components/ion-input-password-toggle.js +1 -1
  38. package/components/ion-input.js +1 -1
  39. package/components/ion-item-divider.js +1 -1
  40. package/components/ion-item-group.js +1 -1
  41. package/components/ion-item-option.js +1 -1
  42. package/components/ion-item-options.js +1 -1
  43. package/components/ion-item-sliding.js +1 -1
  44. package/components/ion-item.js +1 -1
  45. package/components/ion-label.js +1 -1
  46. package/components/ion-list-header.js +1 -1
  47. package/components/ion-list.js +1 -1
  48. package/components/ion-loading.js +1 -1
  49. package/components/ion-menu-button.js +1 -1
  50. package/components/ion-menu-toggle.js +1 -1
  51. package/components/ion-menu.js +1 -1
  52. package/components/ion-modal.js +1 -1
  53. package/components/ion-nav-link.js +1 -1
  54. package/components/ion-nav.js +1 -1
  55. package/components/ion-note.js +1 -1
  56. package/components/ion-picker-column-option.js +1 -1
  57. package/components/ion-picker-column.js +1 -1
  58. package/components/ion-picker.js +1 -1
  59. package/components/ion-popover.js +1 -1
  60. package/components/ion-progress-bar.js +1 -1
  61. package/components/ion-radio-group.js +1 -1
  62. package/components/ion-radio.js +1 -1
  63. package/components/ion-range.js +1 -1
  64. package/components/ion-refresher-content.js +1 -1
  65. package/components/ion-refresher.js +1 -1
  66. package/components/ion-reorder-group.js +1 -1
  67. package/components/ion-reorder.js +1 -1
  68. package/components/ion-ripple-effect.js +1 -1
  69. package/components/ion-route-redirect.js +1 -1
  70. package/components/ion-route.js +1 -1
  71. package/components/ion-router-link.js +1 -1
  72. package/components/ion-router-outlet.js +1 -1
  73. package/components/ion-router.js +1 -1
  74. package/components/ion-row.js +1 -1
  75. package/components/ion-searchbar.js +1 -1
  76. package/components/ion-segment-button.js +1 -1
  77. package/components/ion-segment-content.js +1 -1
  78. package/components/ion-segment-view.js +1 -1
  79. package/components/ion-segment.js +1 -1
  80. package/components/ion-select-modal.js +1 -1
  81. package/components/ion-select-option.js +1 -1
  82. package/components/ion-select-popover.js +1 -1
  83. package/components/ion-select.js +1 -1
  84. package/components/ion-skeleton-text.js +1 -1
  85. package/components/ion-spinner.js +1 -1
  86. package/components/ion-split-pane.js +1 -1
  87. package/components/ion-tab-bar.js +1 -1
  88. package/components/ion-tab-button.js +1 -1
  89. package/components/ion-tab.js +1 -1
  90. package/components/ion-tabs.js +1 -1
  91. package/components/ion-text.js +1 -1
  92. package/components/ion-textarea.js +1 -1
  93. package/components/ion-thumbnail.js +1 -1
  94. package/components/ion-title.js +1 -1
  95. package/components/ion-toast.js +1 -1
  96. package/components/ion-toggle.js +1 -1
  97. package/components/ion-toolbar.js +1 -1
  98. package/components/p-1sJ0ZDPe.js +4 -0
  99. package/components/p-5ldEpNdG.js +4 -0
  100. package/components/p-6ZLn6K5e.js +4 -0
  101. package/components/p-B4lxwJ8N.js +4 -0
  102. package/components/{p-rCa2eL0j.js → p-BF48Oc0v.js} +1 -1
  103. package/components/p-BJr2B5hZ.js +4 -0
  104. package/components/p-BMPN55of.js +4 -0
  105. package/components/p-BNBnVi_1.js +4 -0
  106. package/components/{p-C4t5ymfq.js → p-BQyuFxYc.js} +1 -1
  107. package/components/p-BSQPZ79H.js +4 -0
  108. package/components/p-BT9-hMMz.js +4 -0
  109. package/components/p-BWoa-cki.js +4 -0
  110. package/components/p-BYJRZKHa.js +4 -0
  111. package/components/p-B_gJaBk0.js +4 -0
  112. package/components/p-BgkOsq-d.js +4 -0
  113. package/components/p-BhamHSw3.js +4 -0
  114. package/components/p-Bi-it1EH.js +4 -0
  115. package/components/p-C-NbvXu4.js +4 -0
  116. package/components/p-C0493tbX.js +4 -0
  117. package/components/p-C09TXohi.js +4 -0
  118. package/components/p-C4VpVfrJ.js +4 -0
  119. package/components/p-CEW4RXZO.js +4 -0
  120. package/components/p-CG_zZq_I.js +4 -0
  121. package/components/{p-B9jFTlwE.js → p-CJgnoKcN.js} +1 -1
  122. package/components/p-CMRYD_yR.js +4 -0
  123. package/components/{p-lE_JGpHD.js → p-CNLioZ3B.js} +1 -1
  124. package/components/{p--JUspHvy.js → p-COO0eJOA.js} +1 -1
  125. package/components/p-CWAks_S_.js +4 -0
  126. package/{dist/ionic/p-KjNvRoEp.js → components/p-Cd1WaN-0.js} +1 -1
  127. package/components/p-CqbGBmqb.js +4 -0
  128. package/components/p-CrAKlX71.js +4 -0
  129. package/components/p-Cw6WocLJ.js +4 -0
  130. package/components/p-D0YpjgON.js +4 -0
  131. package/components/{p-BirPFsRD.js → p-D5w_FlVa.js} +1 -1
  132. package/components/p-D7-vHX0A.js +4 -0
  133. package/components/p-D7wDJdFn.js +4 -0
  134. package/components/p-DFLJvuRK.js +4 -0
  135. package/components/p-DGPjJNOU.js +4 -0
  136. package/components/p-DJR0R0e1.js +4 -0
  137. package/components/p-DL13ieTa.js +4 -0
  138. package/components/{p-DqLB8yFQ.js → p-DM1gJSMP.js} +1 -1
  139. package/components/p-DMBiAyOR.js +4 -0
  140. package/components/p-DWCzVL3Y.js +4 -0
  141. package/components/p-DZRZic9C.js +4 -0
  142. package/components/{p-DNQI6d-L.js → p-DhNuxvJH.js} +1 -1
  143. package/components/p-DiuOa1vw.js +4 -0
  144. package/components/p-Dj40C8gm.js +4 -0
  145. package/components/p-Djmz-ssp.js +4 -0
  146. package/components/p-DnBNYc7u.js +4 -0
  147. package/components/p-DngGb-NV.js +4 -0
  148. package/components/p-Dojwmvde.js +4 -0
  149. package/components/p-DwSXbQSz.js +4 -0
  150. package/components/p-DxhHlJln.js +4 -0
  151. package/components/{p-DqZAXv2t.js → p-GGbIHyEF.js} +1 -1
  152. package/components/{p-j5IxBIan.js → p-Hp8t4RMX.js} +1 -1
  153. package/components/p-M34T2gyX.js +4 -0
  154. package/components/p-TWw4e4sO.js +4 -0
  155. package/components/{p-Cfx4M1Bn.js → p-YjMkHuvH.js} +1 -1
  156. package/components/p-byZM6qHV.js +4 -0
  157. package/components/p-cEN43Ahr.js +4 -0
  158. package/components/p-qAXsfUff.js +4 -0
  159. package/dist/cjs/{animation-BJq0kcy2.js → animation-Kd1N7WTN.js} +4 -4
  160. package/dist/cjs/{app-globals-BlqrqKTN.js → app-globals-b1G4t26O.js} +1 -1
  161. package/dist/cjs/{button-active-0mPOKmV2.js → button-active-CQCFubJJ.js} +3 -3
  162. package/dist/cjs/config-CjUbvdPW.js +36 -0
  163. package/dist/cjs/dir-zwDPRE5K.js +30 -0
  164. package/dist/cjs/{data-DLTUw-KF.js → format-bHU8N1g5.js} +48 -562
  165. package/dist/cjs/{framework-delegate-BtICZDHr.js → framework-delegate-d-fWfeI6.js} +5 -7
  166. package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-CeJslptU.js} +1 -2
  167. package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
  168. package/dist/cjs/{hardware-back-button-iUuF_76h.js → hardware-back-button-Bu4Dzw8l.js} +4 -4
  169. package/dist/cjs/{helpers-Cv23MFHM.js → helpers-7wzdhdeg.js} +15 -11
  170. package/dist/cjs/index-BbqUBe2T.js +429 -0
  171. package/dist/cjs/{index-D81eLYUM.js → index-C74Q3t6a.js} +3 -2
  172. package/dist/cjs/{index-BERfRao3.js → index-CQfEIyLK.js} +5 -5
  173. package/dist/cjs/{index-aC4x3Fk3.js → index-DFNrCX7M.js} +6 -7
  174. package/dist/cjs/{index-CAvQ7Tka.js → index-DRPqwSvU.js} +13 -30
  175. package/dist/cjs/{index-Ct7gcRif.js → index-DXoo08JC.js} +321 -26
  176. package/dist/cjs/{index-CIrkNXqJ.js → index-DtvKGwdh.js} +34 -2
  177. package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
  178. package/dist/cjs/index.cjs.js +19 -18
  179. package/dist/cjs/{input-shims-CFLg7uzj.js → input-shims-VJIiKBKv.js} +10 -11
  180. package/dist/cjs/input.utils-EHVE2RK_.js +35 -0
  181. package/dist/cjs/ion-accordion_2.cjs.entry.js +12 -12
  182. package/dist/cjs/ion-action-sheet.cjs.entry.js +92 -44
  183. package/dist/cjs/ion-alert.cjs.entry.js +144 -65
  184. package/dist/cjs/ion-app_8.cjs.entry.js +112 -40
  185. package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -4
  186. package/dist/cjs/ion-back-button.cjs.entry.js +6 -5
  187. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  188. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +8 -7
  189. package/dist/cjs/ion-button_2.cjs.entry.js +18 -10
  190. package/dist/cjs/ion-card_5.cjs.entry.js +6 -5
  191. package/dist/cjs/ion-checkbox.cjs.entry.js +25 -12
  192. package/dist/cjs/ion-chip.cjs.entry.js +3 -3
  193. package/dist/cjs/ion-col_3.cjs.entry.js +10 -6
  194. package/dist/cjs/ion-datetime-button.cjs.entry.js +29 -30
  195. package/dist/cjs/{ion-datetime_3.cjs.entry.js → ion-datetime.cjs.entry.js} +773 -796
  196. package/dist/cjs/ion-fab_3.cjs.entry.js +93 -14
  197. package/dist/cjs/ion-img.cjs.entry.js +7 -4
  198. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +8 -6
  199. package/dist/cjs/ion-input-otp.cjs.entry.js +20 -29
  200. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +9 -10
  201. package/dist/cjs/ion-input.cjs.entry.js +58 -70
  202. package/dist/cjs/ion-item-option_3.cjs.entry.js +21 -24
  203. package/dist/cjs/ion-item_8.cjs.entry.js +117 -33
  204. package/dist/cjs/ion-loading.cjs.entry.js +29 -15
  205. package/dist/cjs/ion-menu_3.cjs.entry.js +23 -24
  206. package/dist/cjs/ion-modal.cjs.entry.js +307 -159
  207. package/dist/cjs/ion-nav_2.cjs.entry.js +30 -138
  208. package/dist/cjs/ion-picker-column-option.cjs.entry.js +8 -13
  209. package/dist/cjs/ion-picker-column.cjs.entry.js +218 -62
  210. package/dist/cjs/ion-picker.cjs.entry.js +4 -4
  211. package/dist/cjs/ion-popover.cjs.entry.js +50 -30
  212. package/dist/cjs/ion-progress-bar.cjs.entry.js +6 -5
  213. package/dist/cjs/ion-radio_2.cjs.entry.js +24 -14
  214. package/dist/cjs/ion-range.cjs.entry.js +30 -25
  215. package/dist/cjs/ion-refresher_2.cjs.entry.js +61 -26
  216. package/dist/cjs/ion-reorder_2.cjs.entry.js +10 -9
  217. package/dist/cjs/ion-ripple-effect.cjs.entry.js +3 -3
  218. package/dist/cjs/ion-route_4.cjs.entry.js +36 -30
  219. package/dist/cjs/ion-searchbar.cjs.entry.js +27 -22
  220. package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
  221. package/dist/cjs/ion-segment-view.cjs.entry.js +5 -6
  222. package/dist/cjs/ion-segment_2.cjs.entry.js +30 -26
  223. package/dist/cjs/ion-select-modal.cjs.entry.js +93 -38
  224. package/dist/cjs/ion-select_3.cjs.entry.js +495 -125
  225. package/dist/cjs/ion-spinner.cjs.entry.js +5 -6
  226. package/dist/cjs/ion-split-pane.cjs.entry.js +4 -4
  227. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +15 -12
  228. package/dist/cjs/ion-tab_2.cjs.entry.js +26 -19
  229. package/dist/cjs/ion-text.cjs.entry.js +5 -5
  230. package/dist/cjs/ion-textarea.cjs.entry.js +56 -65
  231. package/dist/cjs/ion-toast.cjs.entry.js +26 -21
  232. package/dist/cjs/ion-toggle.cjs.entry.js +36 -15
  233. package/dist/cjs/{ionic-global-B-cA6LkY.js → ionic-global-CYJNT-2P.js} +13 -8
  234. package/dist/cjs/ionic.cjs.js +5 -5
  235. package/dist/cjs/{ios.transition-BOSWOaiK.js → ios.transition-DYGiD6gM.js} +14 -17
  236. package/dist/cjs/item-multiple-inputs-Dv6qrMhm.js +38 -0
  237. package/dist/cjs/{keyboard-hHzlEQpk.js → keyboard-Cix5TVkD.js} +2 -2
  238. package/dist/cjs/{keyboard-UuAS4D_9.js → keyboard-cHxZlTyz.js} +2 -2
  239. package/dist/cjs/{keyboard-controller-GXBiBRKS.js → keyboard-controller-PtZoN2GS.js} +6 -6
  240. package/dist/cjs/loader.cjs.js +4 -4
  241. package/dist/cjs/{md.transition-B8-wBZqt.js → md.transition-CrSkaoz6.js} +8 -8
  242. package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
  243. package/dist/cjs/{overlays-TbKsuC-K.js → overlays-BR21NUIG.js} +120 -57
  244. package/dist/cjs/select-option-render-CrbLc-1j.js +123 -0
  245. package/dist/cjs/slot-mutation-controller-D6IjSEIh.js +397 -0
  246. package/dist/cjs/{status-tap-BXX8H8_Y.js → status-tap-CNP5eD1R.js} +4 -3
  247. package/dist/cjs/{swipe-back-CCMaNiP2.js → swipe-back-CSIJQfu5.js} +5 -5
  248. package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
  249. package/dist/collection/collection-manifest.json +7 -11
  250. package/dist/collection/components/accordion/accordion.js +5 -6
  251. package/dist/collection/components/accordion-group/accordion-group.js +2 -2
  252. package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
  253. package/dist/collection/components/action-sheet/action-sheet.js +77 -31
  254. package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
  255. package/dist/collection/components/alert/alert.ios.css +279 -10
  256. package/dist/collection/components/alert/alert.js +127 -50
  257. package/dist/collection/components/alert/alert.md.css +268 -20
  258. package/dist/collection/components/breadcrumb/breadcrumb.js +1 -1
  259. package/dist/collection/components/breadcrumbs/breadcrumbs.js +1 -1
  260. package/dist/collection/components/button/button.js +11 -4
  261. package/dist/collection/components/card/card.js +1 -1
  262. package/dist/collection/components/checkbox/checkbox.ios.css +18 -0
  263. package/dist/collection/components/checkbox/checkbox.js +19 -8
  264. package/dist/collection/components/checkbox/checkbox.md.css +18 -0
  265. package/dist/collection/components/col/col.js +7 -3
  266. package/dist/collection/components/content/content.js +56 -6
  267. package/dist/collection/components/datetime/datetime.ios.css +42 -2
  268. package/dist/collection/components/datetime/datetime.js +193 -79
  269. package/dist/collection/components/datetime/datetime.md.css +42 -1
  270. package/dist/collection/components/datetime/utils/data.js +13 -14
  271. package/dist/collection/components/datetime/utils/format.js +21 -11
  272. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  273. package/dist/collection/components/datetime/utils/parse.js +10 -10
  274. package/dist/collection/components/datetime/utils/state.js +8 -2
  275. package/dist/collection/components/datetime/utils/validate.js +4 -5
  276. package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
  277. package/dist/collection/components/datetime-button/datetime-button.js +21 -25
  278. package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
  279. package/dist/collection/components/fab-button/fab-button.js +114 -10
  280. package/dist/collection/components/footer/footer.js +1 -1
  281. package/dist/collection/components/header/header.js +2 -2
  282. package/dist/collection/components/img/img.js +6 -1
  283. package/dist/collection/components/input/input.ios.css +57 -26
  284. package/dist/collection/components/input/input.js +51 -64
  285. package/dist/collection/components/input/input.md.css +79 -43
  286. package/dist/collection/components/input-otp/input-otp.js +15 -24
  287. package/dist/collection/components/input-password-toggle/input-password-toggle.js +5 -6
  288. package/dist/collection/components/item/item.ios.css +11 -0
  289. package/dist/collection/components/item/item.js +99 -15
  290. package/dist/collection/components/item/item.md.css +11 -0
  291. package/dist/collection/components/item-divider/item-divider.js +2 -2
  292. package/dist/collection/components/item-group/item-group.js +1 -1
  293. package/dist/collection/components/item-option/item-option.js +2 -2
  294. package/dist/collection/components/item-options/item-options.js +1 -1
  295. package/dist/collection/components/item-sliding/item-sliding.js +12 -16
  296. package/dist/collection/components/label/label.js +2 -2
  297. package/dist/collection/components/list/list.js +2 -2
  298. package/dist/collection/components/list-header/list-header.js +2 -2
  299. package/dist/collection/components/loading/loading.js +17 -5
  300. package/dist/collection/components/menu/menu.js +6 -8
  301. package/dist/collection/components/menu-button/menu-button.js +2 -2
  302. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  303. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  304. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  305. package/dist/collection/components/modal/gestures/sheet.js +47 -32
  306. package/dist/collection/components/modal/gestures/swipe-to-close.js +23 -33
  307. package/dist/collection/components/modal/gestures/utils.js +17 -0
  308. package/dist/collection/components/modal/modal.ios.css +8 -0
  309. package/dist/collection/components/modal/modal.js +158 -65
  310. package/dist/collection/components/modal/modal.md.css +8 -0
  311. package/dist/collection/components/modal/safe-area-utils.js +39 -5
  312. package/dist/collection/components/nav/nav.js +24 -235
  313. package/dist/collection/components/nav-link/nav-link.js +1 -1
  314. package/dist/collection/components/note/note.js +2 -2
  315. package/dist/collection/components/picker/picker.js +1 -2
  316. package/dist/collection/components/picker-column/picker-column.css +3 -0
  317. package/dist/collection/components/picker-column/picker-column.js +212 -58
  318. package/dist/collection/components/picker-column-option/picker-column-option.js +3 -10
  319. package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
  320. package/dist/collection/components/popover/animations/ios.enter.js +1 -2
  321. package/dist/collection/components/popover/animations/md.enter.js +1 -2
  322. package/dist/collection/components/popover/popover.ios.css +15 -0
  323. package/dist/collection/components/popover/popover.js +32 -9
  324. package/dist/collection/components/popover/popover.md.css +15 -0
  325. package/dist/collection/components/popover/utils.js +4 -6
  326. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  327. package/dist/collection/components/radio/radio.ios.css +11 -15
  328. package/dist/collection/components/radio/radio.js +17 -9
  329. package/dist/collection/components/radio/radio.md.css +11 -11
  330. package/dist/collection/components/radio-group/radio-group.js +2 -2
  331. package/dist/collection/components/range/range.js +24 -19
  332. package/dist/collection/components/refresher/refresher.js +49 -16
  333. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  334. package/dist/collection/components/reorder/reorder.js +1 -1
  335. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  336. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  337. package/dist/collection/components/route/route.js +1 -1
  338. package/dist/collection/components/router/router.js +2 -6
  339. package/dist/collection/components/router/utils/dom.js +25 -7
  340. package/dist/collection/components/router/utils/matching.js +6 -9
  341. package/dist/collection/components/router/utils/parser.js +1 -1
  342. package/dist/collection/components/router/utils/path.js +0 -1
  343. package/dist/collection/components/router-link/router-link.js +2 -2
  344. package/dist/collection/components/router-outlet/router-outlet.js +49 -10
  345. package/dist/collection/components/row/row.js +1 -1
  346. package/dist/collection/components/searchbar/searchbar.js +25 -20
  347. package/dist/collection/components/segment/segment.js +9 -11
  348. package/dist/collection/components/segment-button/segment-button.js +15 -9
  349. package/dist/collection/components/segment-content/segment-content.js +1 -1
  350. package/dist/collection/components/segment-view/segment-view.js +3 -4
  351. package/dist/collection/components/select/select.ios.css +96 -69
  352. package/dist/collection/components/select/select.js +405 -91
  353. package/dist/collection/components/select/select.md.css +118 -85
  354. package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
  355. package/dist/collection/components/select-modal/select-modal.js +80 -27
  356. package/dist/collection/components/select-modal/select-modal.md.css +164 -0
  357. package/dist/collection/components/select-option/select-option.js +67 -3
  358. package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
  359. package/dist/collection/components/select-popover/select-popover.js +78 -26
  360. package/dist/collection/components/select-popover/select-popover.md.css +164 -0
  361. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  362. package/dist/collection/components/spinner/spinner.js +2 -3
  363. package/dist/collection/components/split-pane/split-pane.js +2 -2
  364. package/dist/collection/components/tab/tab.js +20 -13
  365. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  366. package/dist/collection/components/tab-button/tab-button.js +6 -4
  367. package/dist/collection/components/tabs/tabs.js +2 -3
  368. package/dist/collection/components/text/text.js +2 -2
  369. package/dist/collection/components/textarea/textarea.ios.css +94 -62
  370. package/dist/collection/components/textarea/textarea.js +47 -57
  371. package/dist/collection/components/textarea/textarea.md.css +103 -77
  372. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  373. package/dist/collection/components/title/title.js +2 -2
  374. package/dist/collection/components/toast/toast.js +12 -9
  375. package/dist/collection/components/toggle/toggle.ios.css +12 -4
  376. package/dist/collection/components/toggle/toggle.js +27 -7
  377. package/dist/collection/components/toggle/toggle.md.css +42 -5
  378. package/dist/collection/components/toolbar/toolbar.js +7 -4
  379. package/dist/collection/global/config.js +3 -3
  380. package/dist/collection/global/ionic-global.js +8 -2
  381. package/dist/collection/index.js +1 -1
  382. package/dist/collection/utils/animation/animation.js +3 -3
  383. package/dist/collection/utils/config.js +5 -4
  384. package/dist/collection/utils/content/index.js +30 -0
  385. package/dist/collection/utils/focus-controller/index.js +1 -1
  386. package/dist/collection/utils/focus-trap.js +3 -3
  387. package/dist/collection/utils/forms/index.js +2 -0
  388. package/dist/collection/utils/forms/item-multiple-inputs.js +33 -0
  389. package/dist/collection/utils/forms/start-container-controller.js +132 -0
  390. package/dist/collection/utils/framework-delegate.js +4 -6
  391. package/dist/collection/utils/gesture/gesture-controller.js +1 -2
  392. package/dist/collection/utils/gesture/index.js +10 -2
  393. package/dist/collection/utils/gesture/listener.js +4 -27
  394. package/dist/collection/utils/hardware-back-button.js +3 -3
  395. package/dist/collection/utils/helpers.js +14 -10
  396. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  397. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  398. package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
  399. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  400. package/dist/collection/utils/logging/index.js +23 -4
  401. package/dist/collection/utils/menu-controller/index.js +1 -2
  402. package/dist/collection/utils/native/haptic.js +2 -3
  403. package/dist/collection/utils/native/keyboard.js +2 -2
  404. package/dist/collection/utils/native/status-bar.js +1 -1
  405. package/dist/collection/utils/overlay-control-label.js +45 -0
  406. package/dist/collection/utils/overlays.js +109 -47
  407. package/dist/collection/utils/platform.js +4 -5
  408. package/dist/collection/utils/rtl/dir.js +17 -7
  409. package/dist/collection/utils/sanitization/index.js +275 -20
  410. package/dist/collection/utils/select-option-render.js +118 -0
  411. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  412. package/dist/collection/utils/test/late-props/late-props.js +69 -0
  413. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +25 -0
  414. package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
  415. package/dist/collection/utils/test/playwright/drag-element.js +14 -0
  416. package/dist/collection/utils/test/playwright/generator.js +3 -4
  417. package/dist/collection/utils/test/playwright/index.js +2 -0
  418. package/dist/collection/utils/test/playwright/page/event-spy.js +2 -4
  419. package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
  420. package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
  421. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  422. package/dist/collection/utils/test/press-keys.js +6 -16
  423. package/dist/collection/utils/theme.js +6 -1
  424. package/dist/collection/utils/transition/ios.transition.js +9 -13
  425. package/dist/collection/utils/transition/md.transition.js +3 -4
  426. package/dist/docs.json +972 -1402
  427. package/dist/esm/{animation-DLJpuoEz.js → animation-BFNVlYum.js} +4 -4
  428. package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-BgX0BGL1.js} +1 -1
  429. package/dist/esm/{button-active-BSpTQmS9.js → button-active-BfOvDr3b.js} +3 -3
  430. package/dist/esm/config-DWCzVL3Y.js +32 -0
  431. package/dist/esm/dir-Dojwmvde.js +28 -0
  432. package/dist/esm/{data-DZI70dKr.js → format-DDFE9jM5.js} +41 -554
  433. package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate-BwNhx9NR.js} +5 -7
  434. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-B_gJaBk0.js} +1 -2
  435. package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
  436. package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-DmkiRgOT.js} +4 -4
  437. package/dist/esm/{helpers-HEqiOzXb.js → helpers-BSmc0nst.js} +15 -11
  438. package/dist/esm/{index-CfgBF1SE.js → index-BmLuEdV7.js} +13 -30
  439. package/dist/esm/{index-Q6UPU0Ay.js → index-BuPaALjU.js} +6 -7
  440. package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
  441. package/dist/esm/{index-MEDq2S8l.js → index-C1b9CLFg.js} +33 -3
  442. package/dist/esm/{index-tcQvqkiX.js → index-C23AVPx9.js} +303 -26
  443. package/dist/esm/{index-BRHzoo00.js → index-CJln0gS3.js} +3 -2
  444. package/dist/esm/index-CqoUoxgG.js +423 -0
  445. package/dist/esm/{index-B_dQk_WE.js → index-DnA_7Bnx.js} +5 -5
  446. package/dist/esm/index.js +17 -15
  447. package/dist/esm/{input-shims-D10mwcw1.js → input-shims-Dqk-Ou25.js} +10 -11
  448. package/dist/esm/input.utils-rqoH22pW.js +33 -0
  449. package/dist/esm/ion-accordion_2.entry.js +12 -12
  450. package/dist/esm/ion-action-sheet.entry.js +92 -44
  451. package/dist/esm/ion-alert.entry.js +143 -64
  452. package/dist/esm/ion-app_8.entry.js +112 -40
  453. package/dist/esm/ion-avatar_3.entry.js +4 -4
  454. package/dist/esm/ion-back-button.entry.js +6 -5
  455. package/dist/esm/ion-backdrop.entry.js +2 -2
  456. package/dist/esm/ion-breadcrumb_2.entry.js +8 -7
  457. package/dist/esm/ion-button_2.entry.js +18 -10
  458. package/dist/esm/ion-card_5.entry.js +6 -5
  459. package/dist/esm/ion-checkbox.entry.js +25 -12
  460. package/dist/esm/ion-chip.entry.js +3 -3
  461. package/dist/esm/ion-col_3.entry.js +10 -6
  462. package/dist/esm/ion-datetime-button.entry.js +28 -29
  463. package/dist/esm/{ion-datetime_3.entry.js → ion-datetime.entry.js} +712 -733
  464. package/dist/esm/ion-fab_3.entry.js +93 -14
  465. package/dist/esm/ion-img.entry.js +7 -4
  466. package/dist/esm/ion-infinite-scroll_2.entry.js +7 -5
  467. package/dist/esm/ion-input-otp.entry.js +20 -29
  468. package/dist/esm/ion-input-password-toggle.entry.js +9 -10
  469. package/dist/esm/ion-input.entry.js +56 -68
  470. package/dist/esm/ion-item-option_3.entry.js +21 -24
  471. package/dist/esm/ion-item_8.entry.js +117 -33
  472. package/dist/esm/ion-loading.entry.js +28 -14
  473. package/dist/esm/ion-menu_3.entry.js +23 -24
  474. package/dist/esm/ion-modal.entry.js +295 -147
  475. package/dist/esm/ion-nav_2.entry.js +30 -138
  476. package/dist/esm/ion-picker-column-option.entry.js +8 -13
  477. package/dist/esm/ion-picker-column.entry.js +218 -62
  478. package/dist/esm/ion-picker.entry.js +4 -4
  479. package/dist/esm/ion-popover.entry.js +50 -30
  480. package/dist/esm/ion-progress-bar.entry.js +6 -5
  481. package/dist/esm/ion-radio_2.entry.js +24 -14
  482. package/dist/esm/ion-range.entry.js +30 -25
  483. package/dist/esm/ion-refresher_2.entry.js +59 -24
  484. package/dist/esm/ion-reorder_2.entry.js +10 -9
  485. package/dist/esm/ion-ripple-effect.entry.js +3 -3
  486. package/dist/esm/ion-route_4.entry.js +36 -30
  487. package/dist/esm/ion-searchbar.entry.js +27 -22
  488. package/dist/esm/ion-segment-content.entry.js +2 -2
  489. package/dist/esm/ion-segment-view.entry.js +5 -6
  490. package/dist/esm/ion-segment_2.entry.js +30 -26
  491. package/dist/esm/ion-select-modal.entry.js +93 -38
  492. package/dist/esm/ion-select_3.entry.js +495 -125
  493. package/dist/esm/ion-spinner.entry.js +5 -6
  494. package/dist/esm/ion-split-pane.entry.js +4 -4
  495. package/dist/esm/ion-tab-bar_2.entry.js +15 -12
  496. package/dist/esm/ion-tab_2.entry.js +26 -19
  497. package/dist/esm/ion-text.entry.js +5 -5
  498. package/dist/esm/ion-textarea.entry.js +55 -64
  499. package/dist/esm/ion-toast.entry.js +25 -20
  500. package/dist/esm/ion-toggle.entry.js +36 -15
  501. package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-ZXjCXKH0.js} +13 -8
  502. package/dist/esm/ionic.js +6 -6
  503. package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-CWAgfQ1r.js} +14 -17
  504. package/dist/esm/item-multiple-inputs-DZnIiOO_.js +36 -0
  505. package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
  506. package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
  507. package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
  508. package/dist/esm/loader.js +5 -5
  509. package/dist/esm/{md.transition-D0msQmzI.js → md.transition-ZuqDDdDW.js} +8 -8
  510. package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
  511. package/dist/esm/{overlays-TbiM4mdr.js → overlays-DKE0DgvE.js} +119 -57
  512. package/dist/esm/select-option-render-1W6W9pbC.js +121 -0
  513. package/dist/esm/slot-mutation-controller-B5NpUZ-N.js +393 -0
  514. package/dist/esm/{status-tap-Kan2W7sh.js → status-tap-Cv9gb3ja.js} +4 -3
  515. package/dist/esm/{swipe-back-ZUWwA-KF.js → swipe-back-De5HlmeM.js} +5 -5
  516. package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
  517. package/dist/html.html-data.json +58 -82
  518. package/dist/ionic/index.esm.js +1 -1
  519. package/dist/ionic/ionic.esm.js +1 -1
  520. package/dist/ionic/p-06c6b540.entry.js +4 -0
  521. package/dist/ionic/p-099b7f9f.entry.js +4 -0
  522. package/dist/ionic/p-0dcb7bb6.entry.js +4 -0
  523. package/dist/ionic/p-1347880c.entry.js +4 -0
  524. package/dist/ionic/p-191a651e.entry.js +4 -0
  525. package/dist/ionic/p-1f24cb24.entry.js +4 -0
  526. package/dist/ionic/p-271c3640.entry.js +4 -0
  527. package/dist/ionic/p-2c52fe3e.entry.js +4 -0
  528. package/dist/ionic/p-2ea4bb36.entry.js +4 -0
  529. package/dist/ionic/p-338a02e0.entry.js +4 -0
  530. package/dist/ionic/p-38b9375b.entry.js +4 -0
  531. package/dist/ionic/p-3bba83ee.entry.js +4 -0
  532. package/dist/ionic/p-4712a8a9.entry.js +4 -0
  533. package/dist/ionic/p-4c3e50f8.entry.js +4 -0
  534. package/dist/ionic/p-4e2fef42.entry.js +4 -0
  535. package/dist/ionic/p-54cbb0a7.entry.js +4 -0
  536. package/dist/ionic/{p-2bb2cb18.entry.js → p-561af487.entry.js} +1 -1
  537. package/dist/ionic/p-5906ea6f.entry.js +4 -0
  538. package/dist/ionic/p-5cc09b40.entry.js +4 -0
  539. package/dist/ionic/p-5d9094ac.entry.js +4 -0
  540. package/dist/ionic/p-612ea3b1.entry.js +4 -0
  541. package/dist/ionic/p-66f150ec.entry.js +4 -0
  542. package/dist/ionic/p-68cc89a6.entry.js +4 -0
  543. package/dist/ionic/{p-dfa8d673.entry.js → p-6e386853.entry.js} +1 -1
  544. package/dist/ionic/p-77c96e08.entry.js +4 -0
  545. package/dist/ionic/p-7bfeccb3.entry.js +4 -0
  546. package/dist/ionic/p-7e394cc3.entry.js +4 -0
  547. package/dist/ionic/{p-0fa9c382.entry.js → p-7fbb3319.entry.js} +1 -1
  548. package/dist/ionic/p-837db1b9.entry.js +4 -0
  549. package/dist/ionic/p-85599fe3.entry.js +4 -0
  550. package/dist/ionic/p-8b80d9f9.entry.js +4 -0
  551. package/dist/ionic/p-90f50a65.entry.js +4 -0
  552. package/dist/ionic/p-9595e305.entry.js +4 -0
  553. package/dist/ionic/p-9c5f2691.entry.js +4 -0
  554. package/dist/ionic/p-BMPN55of.js +4 -0
  555. package/dist/ionic/p-BSQPZ79H.js +4 -0
  556. package/dist/ionic/p-BY6BzzPF.js +4 -0
  557. package/dist/ionic/p-B_gJaBk0.js +4 -0
  558. package/dist/ionic/p-BaeKWZ-a.js +4 -0
  559. package/dist/ionic/p-Bd72UYI2.js +4 -0
  560. package/dist/ionic/p-BgOvhHy_.js +4 -0
  561. package/dist/ionic/p-BhamHSw3.js +4 -0
  562. package/dist/ionic/p-BijjLYjT.js +4 -0
  563. package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
  564. package/dist/ionic/p-C23AVPx9.js +6 -0
  565. package/dist/ionic/p-C8XilMh0.js +4 -0
  566. package/dist/ionic/p-CER8qW8Y.js +4 -0
  567. package/dist/ionic/p-CFuOr1Tu.js +4 -0
  568. package/dist/ionic/p-CM5OBjTW.js +4 -0
  569. package/dist/ionic/p-CMZYmFb4.js +4 -0
  570. package/dist/ionic/p-CkxVYPtX.js +4 -0
  571. package/dist/ionic/p-CmXuiRT6.js +4 -0
  572. package/dist/ionic/p-D0YpjgON.js +4 -0
  573. package/dist/ionic/p-D4OrdtJf.js +4 -0
  574. package/dist/ionic/p-D5t_-oMk.js +4 -0
  575. package/dist/ionic/p-D6rHcCvc.js +4 -0
  576. package/dist/ionic/p-DLM95R4x.js +4 -0
  577. package/dist/ionic/p-DTxBioUO.js +4 -0
  578. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  579. package/dist/ionic/p-DYUjHcuH.js +4 -0
  580. package/dist/ionic/p-DZ6Hmc-8.js +4 -0
  581. package/dist/ionic/p-D_gb-kdd.js +4 -0
  582. package/dist/ionic/p-DajLgJ4d.js +4 -0
  583. package/dist/ionic/p-Do3zTvCA.js +4 -0
  584. package/dist/ionic/p-Dojwmvde.js +4 -0
  585. package/dist/ionic/p-T71k3C35.js +4 -0
  586. package/dist/ionic/p-a1cc2861.entry.js +4 -0
  587. package/dist/ionic/p-a20a2ebe.entry.js +4 -0
  588. package/dist/ionic/p-a8ff2489.entry.js +4 -0
  589. package/dist/ionic/p-b3532b8d.entry.js +4 -0
  590. package/dist/ionic/p-b80c86c4.entry.js +4 -0
  591. package/dist/ionic/p-b9b4e85d.entry.js +4 -0
  592. package/dist/ionic/p-byZM6qHV.js +4 -0
  593. package/dist/ionic/p-c57fc396.entry.js +4 -0
  594. package/dist/ionic/{p-c6e49f3f.entry.js → p-ca1b8865.entry.js} +1 -1
  595. package/dist/ionic/p-cc4320d3.entry.js +4 -0
  596. package/dist/ionic/p-d6755739.entry.js +4 -0
  597. package/dist/ionic/p-d8c138d9.entry.js +4 -0
  598. package/dist/ionic/p-db449915.entry.js +4 -0
  599. package/dist/ionic/p-dd01be0a.entry.js +4 -0
  600. package/dist/ionic/p-ec00fd0d.entry.js +4 -0
  601. package/dist/ionic/p-ee09ac9d.entry.js +4 -0
  602. package/dist/ionic/{p-37e720da.entry.js → p-efc0cf82.entry.js} +1 -1
  603. package/dist/ionic/p-f0fb23c1.entry.js +4 -0
  604. package/dist/ionic/p-f83b3e0c.entry.js +4 -0
  605. package/dist/ionic/p-fU3rOYad.js +4 -0
  606. package/dist/ionic/p-zWf7R2xV.js +4 -0
  607. package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
  608. package/dist/types/components/alert/alert.d.ts +7 -0
  609. package/dist/types/components/checkbox/checkbox.d.ts +1 -0
  610. package/dist/types/components/content/content.d.ts +12 -0
  611. package/dist/types/components/datetime/datetime.d.ts +13 -1
  612. package/dist/types/components/fab-button/fab-button.d.ts +15 -0
  613. package/dist/types/components/img/img.d.ts +2 -0
  614. package/dist/types/components/input/input.d.ts +12 -6
  615. package/dist/types/components/item/item.d.ts +19 -0
  616. package/dist/types/components/modal/gestures/sheet.d.ts +1 -0
  617. package/dist/types/components/modal/gestures/utils.d.ts +11 -0
  618. package/dist/types/components/modal/modal-interface.d.ts +9 -0
  619. package/dist/types/components/modal/modal.d.ts +25 -7
  620. package/dist/types/components/modal/safe-area-utils.d.ts +6 -0
  621. package/dist/types/components/nav/nav-interface.d.ts +0 -1
  622. package/dist/types/components/nav/nav.d.ts +2 -22
  623. package/dist/types/components/picker-column/picker-column.d.ts +42 -0
  624. package/dist/types/components/radio/radio.d.ts +1 -0
  625. package/dist/types/components/range/range.d.ts +4 -1
  626. package/dist/types/components/refresher/refresher.d.ts +7 -0
  627. package/dist/types/components/route/route.d.ts +1 -1
  628. package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
  629. package/dist/types/components/searchbar/searchbar.d.ts +1 -1
  630. package/dist/types/components/select/select-interface.d.ts +31 -0
  631. package/dist/types/components/select/select.d.ts +30 -6
  632. package/dist/types/components/select-option/select-option.d.ts +42 -1
  633. package/dist/types/components/tab/tab.d.ts +1 -1
  634. package/dist/types/components/textarea/textarea.d.ts +12 -5
  635. package/dist/types/components/toggle/toggle.d.ts +1 -0
  636. package/dist/types/components.d.ts +94 -318
  637. package/dist/types/index.d.ts +1 -1
  638. package/dist/types/interface.d.ts +0 -1
  639. package/dist/types/stencil-public-runtime.d.ts +12 -0
  640. package/dist/types/utils/config.d.ts +1 -8
  641. package/dist/types/utils/content/index.d.ts +12 -0
  642. package/dist/types/utils/forms/index.d.ts +2 -0
  643. package/dist/types/utils/forms/item-multiple-inputs.d.ts +13 -0
  644. package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
  645. package/dist/types/utils/helpers.d.ts +8 -5
  646. package/dist/types/utils/logging/index.d.ts +2 -1
  647. package/dist/types/utils/overlay-control-label.d.ts +32 -0
  648. package/dist/types/utils/overlays.d.ts +20 -9
  649. package/dist/types/utils/rtl/dir.d.ts +10 -4
  650. package/dist/types/utils/sanitization/index.d.ts +58 -2
  651. package/dist/types/utils/select-option-render.d.ts +53 -0
  652. package/dist/types/utils/test/playwright/apply-keyboard-focus.d.ts +16 -0
  653. package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
  654. package/dist/types/utils/test/playwright/index.d.ts +2 -0
  655. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  656. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  657. package/hydrate/index.js +3341 -2197
  658. package/hydrate/index.mjs +3341 -2197
  659. package/loader/index.d.ts +1 -1
  660. package/package.json +61 -17
  661. package/components/ion-picker-legacy-column.d.ts +0 -11
  662. package/components/ion-picker-legacy-column.js +0 -4
  663. package/components/ion-picker-legacy.d.ts +0 -11
  664. package/components/ion-picker-legacy.js +0 -4
  665. package/components/p-0NRupjzW.js +0 -4
  666. package/components/p-5bE_Wz4Y.js +0 -4
  667. package/components/p-B60hm8Qv.js +0 -4
  668. package/components/p-BAYYcg3o.js +0 -4
  669. package/components/p-BLmJ0zRm.js +0 -4
  670. package/components/p-BSEgsdFI.js +0 -4
  671. package/components/p-BTEOs1at.js +0 -4
  672. package/components/p-BTPfOxsU.js +0 -4
  673. package/components/p-BT_5jSqG.js +0 -4
  674. package/components/p-Baq1XyAy.js +0 -4
  675. package/components/p-BjfgFSSR.js +0 -4
  676. package/components/p-BjoEPDW5.js +0 -4
  677. package/components/p-BnqQlm7c.js +0 -4
  678. package/components/p-BsPelv04.js +0 -4
  679. package/components/p-Bth-EzJ0.js +0 -4
  680. package/components/p-Bz0dSlXZ.js +0 -4
  681. package/components/p-C1aScSTo.js +0 -4
  682. package/components/p-C2lKgrXx.js +0 -4
  683. package/components/p-C53feagD.js +0 -4
  684. package/components/p-CHqRYvYm.js +0 -4
  685. package/components/p-CI3ncNZm.js +0 -4
  686. package/components/p-CSZf8_j0.js +0 -4
  687. package/components/p-CU5rbWAW.js +0 -4
  688. package/components/p-C_xFdyXe.js +0 -4
  689. package/components/p-Ciz1-FuE.js +0 -4
  690. package/components/p-Cl0B-RWe.js +0 -4
  691. package/components/p-CmR5uXej.js +0 -4
  692. package/components/p-CtWGkNnJ.js +0 -4
  693. package/components/p-CtukzcyX.js +0 -4
  694. package/components/p-D13Eaw-8.js +0 -4
  695. package/components/p-D5Ubpm7D.js +0 -4
  696. package/components/p-D6Ynv7Xh.js +0 -4
  697. package/components/p-D7bSXQD3.js +0 -4
  698. package/components/p-DDWp95gH.js +0 -4
  699. package/components/p-DIE4pXMl.js +0 -4
  700. package/components/p-DOFCbuQR.js +0 -4
  701. package/components/p-DiVJyqlX.js +0 -4
  702. package/components/p-DnL1c9_X.js +0 -4
  703. package/components/p-W5nO8mX_.js +0 -4
  704. package/components/p-W9CZ2mWX.js +0 -4
  705. package/components/p-XlSIJDJ-.js +0 -4
  706. package/components/p-cyNmxje6.js +0 -4
  707. package/components/p-dhLYXa7A.js +0 -4
  708. package/components/p-ijF0iCrA.js +0 -4
  709. package/components/p-k_E4tX5Z.js +0 -4
  710. package/components/p-nQi4oKcG.js +0 -4
  711. package/components/p-ryqmO0B-.js +0 -4
  712. package/dist/cjs/config-xninhj0J.js +0 -201
  713. package/dist/cjs/dir-Cn0z1rJH.js +0 -20
  714. package/dist/cjs/input.utils-DetjmtH2.js +0 -150
  715. package/dist/cjs/notch-controller-18PzRGXd.js +0 -155
  716. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  717. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  718. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  719. package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
  720. package/dist/collection/components/picker-legacy/picker.js +0 -890
  721. package/dist/collection/components/picker-legacy/picker.md.css +0 -287
  722. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
  723. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  724. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
  725. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  726. package/dist/esm/config-DQCONYYp.js +0 -195
  727. package/dist/esm/dir-C53feagD.js +0 -18
  728. package/dist/esm/input.utils-Y6NgW8bw.js +0 -147
  729. package/dist/esm/notch-controller-DKDjU_O7.js +0 -153
  730. package/dist/ionic/p-00dbb17e.entry.js +0 -4
  731. package/dist/ionic/p-01f81ea5.entry.js +0 -4
  732. package/dist/ionic/p-06c232a4.entry.js +0 -4
  733. package/dist/ionic/p-0d005398.entry.js +0 -4
  734. package/dist/ionic/p-1ae21e4c.entry.js +0 -4
  735. package/dist/ionic/p-20b1a044.entry.js +0 -4
  736. package/dist/ionic/p-21eb76d5.entry.js +0 -4
  737. package/dist/ionic/p-2394a9a6.entry.js +0 -4
  738. package/dist/ionic/p-27d30585.entry.js +0 -4
  739. package/dist/ionic/p-2f55dc1a.entry.js +0 -4
  740. package/dist/ionic/p-30bf9737.entry.js +0 -4
  741. package/dist/ionic/p-3353c229.entry.js +0 -4
  742. package/dist/ionic/p-33704f20.entry.js +0 -4
  743. package/dist/ionic/p-390ca786.entry.js +0 -4
  744. package/dist/ionic/p-3a126bca.entry.js +0 -4
  745. package/dist/ionic/p-3a541154.entry.js +0 -4
  746. package/dist/ionic/p-3a7d1e91.entry.js +0 -4
  747. package/dist/ionic/p-3ae5f277.entry.js +0 -4
  748. package/dist/ionic/p-4745f534.entry.js +0 -4
  749. package/dist/ionic/p-4858af1f.entry.js +0 -4
  750. package/dist/ionic/p-4baa5b82.entry.js +0 -4
  751. package/dist/ionic/p-4dc1c33c.entry.js +0 -4
  752. package/dist/ionic/p-4e92a11f.entry.js +0 -4
  753. package/dist/ionic/p-50e1194a.entry.js +0 -4
  754. package/dist/ionic/p-5d1da0a2.entry.js +0 -4
  755. package/dist/ionic/p-75dc25ba.entry.js +0 -4
  756. package/dist/ionic/p-81ea5652.entry.js +0 -4
  757. package/dist/ionic/p-84d5ce05.entry.js +0 -4
  758. package/dist/ionic/p-874b4bd8.entry.js +0 -4
  759. package/dist/ionic/p-8c8eee7d.entry.js +0 -4
  760. package/dist/ionic/p-8eb8ee76.entry.js +0 -4
  761. package/dist/ionic/p-8fce95d5.entry.js +0 -4
  762. package/dist/ionic/p-94f2a736.entry.js +0 -4
  763. package/dist/ionic/p-9a65ac7f.entry.js +0 -4
  764. package/dist/ionic/p-9eeaBrnk.js +0 -4
  765. package/dist/ionic/p-9f1103ce.entry.js +0 -4
  766. package/dist/ionic/p-BGqMS-oh.js +0 -4
  767. package/dist/ionic/p-BTEOs1at.js +0 -4
  768. package/dist/ionic/p-BUFIpxKM.js +0 -4
  769. package/dist/ionic/p-C53feagD.js +0 -4
  770. package/dist/ionic/p-CFlfIb2g.js +0 -4
  771. package/dist/ionic/p-CKvCXMs9.js +0 -4
  772. package/dist/ionic/p-Cl0B-RWe.js +0 -4
  773. package/dist/ionic/p-CtWGkNnJ.js +0 -4
  774. package/dist/ionic/p-CwdymDLH.js +0 -4
  775. package/dist/ionic/p-Cx3IXROA.js +0 -4
  776. package/dist/ionic/p-D13Eaw-8.js +0 -4
  777. package/dist/ionic/p-DAAFkPFT.js +0 -4
  778. package/dist/ionic/p-DC3RagnA.js +0 -4
  779. package/dist/ionic/p-DIuEbVLu.js +0 -4
  780. package/dist/ionic/p-DSG2s2Eb.js +0 -4
  781. package/dist/ionic/p-Dfbt-q2k.js +0 -4
  782. package/dist/ionic/p-DiVJyqlX.js +0 -4
  783. package/dist/ionic/p-DoJvtrbw.js +0 -4
  784. package/dist/ionic/p-DzWaWHGc.js +0 -4
  785. package/dist/ionic/p-Nqf6uvGh.js +0 -4
  786. package/dist/ionic/p-SNAkTDfm.js +0 -4
  787. package/dist/ionic/p-VAemlbDS.js +0 -4
  788. package/dist/ionic/p-Wk5HzclC.js +0 -4
  789. package/dist/ionic/p-a21add2f.entry.js +0 -4
  790. package/dist/ionic/p-a3bdcae6.entry.js +0 -4
  791. package/dist/ionic/p-aa5d6b8f.entry.js +0 -4
  792. package/dist/ionic/p-c0fb8edd.entry.js +0 -4
  793. package/dist/ionic/p-c4d8641b.entry.js +0 -4
  794. package/dist/ionic/p-e0be05c5.entry.js +0 -4
  795. package/dist/ionic/p-e847a888.entry.js +0 -4
  796. package/dist/ionic/p-ec090e0a.entry.js +0 -4
  797. package/dist/ionic/p-ef4c3bee.entry.js +0 -4
  798. package/dist/ionic/p-fabcce6c.entry.js +0 -4
  799. package/dist/ionic/p-facfde02.entry.js +0 -4
  800. package/dist/ionic/p-fd7eebc4.entry.js +0 -4
  801. package/dist/ionic/p-mjKAFv89.js +0 -4
  802. package/dist/ionic/p-tcQvqkiX.js +0 -5
  803. package/dist/ionic/p-viFHDgRs.js +0 -4
  804. package/dist/ionic/p-xOfi7-Zn.js +0 -4
  805. package/dist/ionic/p-xWb6fgfq.js +0 -4
  806. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  807. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  808. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  809. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  810. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  811. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  812. /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
@@ -2,14 +2,18 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Build, Host, h, forceUpdate } from "@stencil/core";
5
- import { compareOptions, createNotchController, isOptionSelected, checkInvalidState } from "../../utils/forms/index";
5
+ import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
6
+ import { compareOptions, createNotchController, createStartContainerController, isOptionSelected, checkInvalidState, } from "../../utils/forms/index";
6
7
  import { focusVisibleElement, renderHiddenInput, inheritAttributes } from "../../utils/helpers";
7
8
  import { printIonWarning } from "../../utils/logging/index";
8
9
  import { actionSheetController, alertController, popoverController, modalController } from "../../utils/overlays";
9
10
  import { isRTL } from "../../utils/rtl/index";
11
+ import { blockedTags, reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
12
+ import { createSlotMutationController } from "../../utils/slot-mutation-controller";
10
13
  import { createColorClasses, hostContext } from "../../utils/theme";
11
14
  import { watchForOptions } from "../../utils/watch-options";
12
15
  import { caretDownSharp, chevronExpand } from "ionicons/icons";
16
+ import { config } from "../../global/config";
13
17
  import { getIonMode } from "../../global/ionic-global";
14
18
  // TODO(FW-2832): types
15
19
  /**
@@ -29,7 +33,9 @@ import { getIonMode } from "../../global/ionic-global";
29
33
  * @part error-text - Supporting text displayed beneath the select when the select is invalid and touched.
30
34
  * @part bottom - The container element for helper text, error text, and counter.
31
35
  * @part wrapper - The clickable label element that wraps the entire form field (label text, slots, selected values or placeholder, and toggle icons).
32
- * @part inner - The inner element of the wrapper that manages the slots, selected values or placeholder, and toggle icons.
36
+ * @part start - The wrapper element for the content in the start slot.
37
+ * @part control - The wrapper element containing the label and native select control. When the label is not floating or stacked, this part also contains the dropdown icon.
38
+ * @part end - The wrapper element for the content in the end slot. When the label is floating or stacked, this part also contains the dropdown icon.
33
39
  */
34
40
  export class Select {
35
41
  constructor() {
@@ -37,6 +43,7 @@ export class Select {
37
43
  this.helperTextId = `${this.inputId}-helper-text`;
38
44
  this.errorTextId = `${this.inputId}-error-text`;
39
45
  this.inheritedAttributes = {};
46
+ this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
40
47
  this.isExpanded = false;
41
48
  /**
42
49
  * The `hasFocus` state ensures the focus class is
@@ -147,13 +154,13 @@ export class Select {
147
154
  this.ionBlur.emit();
148
155
  };
149
156
  /**
150
- * Stops propagation when the label is clicked,
151
- * otherwise, two clicks will be triggered.
157
+ * Stops propagation for re-dispatched clicks (when already expanded) to
158
+ * prevent double-click events. Allows initial button clicks (from keyboard
159
+ * or mouse) and slotted content clicks to propagate so event delegation
160
+ * works for parent handlers.
152
161
  */
153
162
  this.onLabelClick = (ev) => {
154
- // Only stop propagation if the click was directly on the label
155
- // and not on the input or other child elements
156
- if (ev.target === ev.currentTarget) {
163
+ if (ev.target === this.focusEl && this.isExpanded) {
157
164
  ev.stopPropagation();
158
165
  }
159
166
  };
@@ -162,12 +169,51 @@ export class Select {
162
169
  this.emitStyle();
163
170
  }
164
171
  setValue(value) {
172
+ if (this.isValueEqual(this.value, value)) {
173
+ return;
174
+ }
165
175
  this.value = value;
166
176
  this.ionChange.emit({ value });
167
177
  }
178
+ isValueEqual(currentValue, newValue) {
179
+ if (this.multiple) {
180
+ const currentArr = Array.isArray(currentValue) ? currentValue : [];
181
+ const newArr = Array.isArray(newValue) ? newValue : [];
182
+ if (currentArr.length !== newArr.length) {
183
+ return false;
184
+ }
185
+ // Multiset compare: each new value must match a distinct current value.
186
+ // A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
187
+ // ['a','b'] when both 'a' and 'b' map to options whose values overlap.
188
+ const remaining = currentArr.slice();
189
+ return newArr.every((val) => {
190
+ const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
191
+ if (idx === -1) {
192
+ return false;
193
+ }
194
+ remaining.splice(idx, 1);
195
+ return true;
196
+ });
197
+ }
198
+ if (currentValue == null && newValue == null) {
199
+ return true;
200
+ }
201
+ if (currentValue == null || newValue == null) {
202
+ return false;
203
+ }
204
+ return compareOptions(currentValue, newValue, this.compareWith);
205
+ }
168
206
  async connectedCallback() {
169
207
  const { el } = this;
208
+ this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
209
+ this.startContainerController?.calculateStartContainerWidth();
210
+ forceUpdate(this);
211
+ });
170
212
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
213
+ this.startContainerController = createStartContainerController(el, () => this.startContainerEl, () => {
214
+ return Build.isBrowser && getIonMode(this) === 'md' && this.fill === 'outline';
215
+ });
216
+ this.startContainerController.calculateStartContainerWidth();
171
217
  this.updateOverlayOptions();
172
218
  this.emitStyle();
173
219
  this.mutationO = watchForOptions(this.el, 'ion-select-option', async () => {
@@ -239,10 +285,18 @@ export class Select {
239
285
  this.mutationO.disconnect();
240
286
  this.mutationO = undefined;
241
287
  }
288
+ if (this.slotMutationController) {
289
+ this.slotMutationController.destroy();
290
+ this.slotMutationController = undefined;
291
+ }
242
292
  if (this.notchController) {
243
293
  this.notchController.destroy();
244
294
  this.notchController = undefined;
245
295
  }
296
+ if (this.startContainerController) {
297
+ this.startContainerController.destroy();
298
+ this.startContainerController = undefined;
299
+ }
246
300
  // Clean up validation observer to prevent memory leaks.
247
301
  if (this.validationObserver) {
248
302
  this.validationObserver.disconnect();
@@ -399,10 +453,11 @@ export class Select {
399
453
  .join(' ');
400
454
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
401
455
  const isSelected = isOptionSelected(selectValue, value, this.compareWith);
456
+ const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
402
457
  return {
403
- role: isSelected ? 'selected' : '',
404
- text: option.textContent,
458
+ text: content ?? '',
405
459
  cssClass: optClass,
460
+ disabled: option.disabled,
406
461
  handler: () => {
407
462
  this.setValue(value);
408
463
  },
@@ -410,6 +465,9 @@ export class Select {
410
465
  'aria-checked': isSelected ? 'true' : 'false',
411
466
  role: 'radio',
412
467
  },
468
+ startContent,
469
+ endContent,
470
+ description: option.description,
413
471
  };
414
472
  });
415
473
  // Add "cancel" button
@@ -430,13 +488,19 @@ export class Select {
430
488
  .filter((cls) => cls !== 'hydrated')
431
489
  .join(' ');
432
490
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
491
+ const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
433
492
  return {
434
493
  type: inputType,
435
494
  cssClass: optClass,
436
- label: option.textContent || '',
495
+ label: content ?? '',
437
496
  value,
438
497
  checked: isOptionSelected(selectValue, value, this.compareWith),
439
498
  disabled: option.disabled,
499
+ startContent,
500
+ endContent,
501
+ description: option.description,
502
+ labelPlacement: option.labelPlacement,
503
+ justify: option.justify,
440
504
  };
441
505
  });
442
506
  return alertInputs;
@@ -449,8 +513,9 @@ export class Select {
449
513
  .filter((cls) => cls !== 'hydrated')
450
514
  .join(' ');
451
515
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
516
+ const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
452
517
  return {
453
- text: option.textContent || '',
518
+ text: content ?? '',
454
519
  cssClass: optClass,
455
520
  value,
456
521
  checked: isOptionSelected(selectValue, value, this.compareWith),
@@ -461,6 +526,11 @@ export class Select {
461
526
  this.close();
462
527
  }
463
528
  },
529
+ startContent,
530
+ endContent,
531
+ description: option.description,
532
+ labelPlacement: option.labelPlacement,
533
+ justify: option.justify,
464
534
  };
465
535
  });
466
536
  return popoverOptions;
@@ -489,28 +559,43 @@ export class Select {
489
559
  */
490
560
  }
491
561
  else {
492
- event = Object.assign(Object.assign({}, ev), { detail: {
562
+ event = {
563
+ ...ev,
564
+ detail: {
493
565
  ionShadowTarget: this.nativeWrapperEl,
494
- } });
566
+ },
567
+ };
495
568
  }
496
- const popoverOpts = Object.assign(Object.assign({ mode,
497
- event, alignment: 'center', size,
498
- showBackdrop }, interfaceOptions), { component: 'ion-select-popover', cssClass: ['select-popover', interfaceOptions.cssClass], componentProps: {
569
+ const options = this.createOverlaySelectOptions(this.childOpts, value);
570
+ const hasRichContent = options.some((opt) => Boolean(opt.startContent) || Boolean(opt.endContent) || Boolean(opt.description));
571
+ const popoverOpts = {
572
+ mode,
573
+ event,
574
+ alignment: 'center',
575
+ size,
576
+ showBackdrop,
577
+ ...interfaceOptions,
578
+ component: 'ion-select-popover',
579
+ cssClass: [
580
+ 'select-popover',
581
+ hasRichContent ? 'select-popover-rich-content' : undefined,
582
+ interfaceOptions.cssClass,
583
+ ],
584
+ componentProps: {
499
585
  header: interfaceOptions.header,
500
586
  subHeader: interfaceOptions.subHeader,
501
587
  message: interfaceOptions.message,
502
588
  multiple,
503
589
  value,
504
- options: this.createOverlaySelectOptions(this.childOpts, value),
505
- } });
590
+ options,
591
+ },
592
+ };
506
593
  /**
507
594
  * Workaround for Stencil to autodefine
508
595
  * ion-select-popover and ion-popover when
509
596
  * using Custom Elements build.
510
597
  */
511
- // eslint-disable-next-line
512
598
  if (false) {
513
- // eslint-disable-next-line
514
599
  // @ts-ignore
515
600
  document.createElement('ion-select-popover');
516
601
  document.createElement('ion-popover');
@@ -520,15 +605,18 @@ export class Select {
520
605
  async openActionSheet() {
521
606
  const mode = getIonMode(this);
522
607
  const interfaceOptions = this.interfaceOptions;
523
- const actionSheetOpts = Object.assign(Object.assign({ mode }, interfaceOptions), { buttons: this.createActionSheetButtons(this.childOpts, this.value), cssClass: ['select-action-sheet', interfaceOptions.cssClass] });
608
+ const actionSheetOpts = {
609
+ mode,
610
+ ...interfaceOptions,
611
+ buttons: this.createActionSheetButtons(this.childOpts, this.value),
612
+ cssClass: ['select-action-sheet', interfaceOptions.cssClass],
613
+ };
524
614
  /**
525
615
  * Workaround for Stencil to autodefine
526
616
  * ion-action-sheet when
527
617
  * using Custom Elements build.
528
618
  */
529
- // eslint-disable-next-line
530
619
  if (false) {
531
- // eslint-disable-next-line
532
620
  // @ts-ignore
533
621
  document.createElement('ion-action-sheet');
534
622
  }
@@ -538,7 +626,12 @@ export class Select {
538
626
  const interfaceOptions = this.interfaceOptions;
539
627
  const inputType = this.multiple ? 'checkbox' : 'radio';
540
628
  const mode = getIonMode(this);
541
- const alertOpts = Object.assign(Object.assign({ mode }, interfaceOptions), { header: interfaceOptions.header ? interfaceOptions.header : this.labelText, inputs: this.createAlertInputs(this.childOpts, inputType, this.value), buttons: [
629
+ const alertOpts = {
630
+ mode,
631
+ ...interfaceOptions,
632
+ header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
633
+ inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
634
+ buttons: [
542
635
  {
543
636
  text: this.cancelText,
544
637
  role: 'cancel',
@@ -552,19 +645,19 @@ export class Select {
552
645
  this.setValue(selectedValues);
553
646
  },
554
647
  },
555
- ], cssClass: [
648
+ ],
649
+ cssClass: [
556
650
  'select-alert',
557
651
  interfaceOptions.cssClass,
558
652
  this.multiple ? 'multiple-select-alert' : 'single-select-alert',
559
- ] });
653
+ ],
654
+ };
560
655
  /**
561
656
  * Workaround for Stencil to autodefine
562
657
  * ion-alert when
563
658
  * using Custom Elements build.
564
659
  */
565
- // eslint-disable-next-line
566
660
  if (false) {
567
- // eslint-disable-next-line
568
661
  // @ts-ignore
569
662
  document.createElement('ion-alert');
570
663
  }
@@ -573,21 +666,25 @@ export class Select {
573
666
  openModal() {
574
667
  const { multiple, value, interfaceOptions } = this;
575
668
  const mode = getIonMode(this);
576
- const modalOpts = Object.assign(Object.assign({}, interfaceOptions), { mode, cssClass: ['select-modal', interfaceOptions.cssClass], component: 'ion-select-modal', componentProps: {
669
+ const modalOpts = {
670
+ ...interfaceOptions,
671
+ mode,
672
+ cssClass: ['select-modal', interfaceOptions.cssClass],
673
+ component: 'ion-select-modal',
674
+ componentProps: {
577
675
  header: interfaceOptions.header,
578
676
  cancelText: this.cancelText,
579
677
  multiple,
580
678
  value,
581
679
  options: this.createOverlaySelectOptions(this.childOpts, value),
582
- } });
680
+ },
681
+ };
583
682
  /**
584
683
  * Workaround for Stencil to autodefine
585
684
  * ion-select-modal and ion-modal when
586
685
  * using Custom Elements build.
587
686
  */
588
- // eslint-disable-next-line
589
687
  if (false) {
590
- // eslint-disable-next-line
591
688
  // @ts-ignore
592
689
  document.createElement('ion-select-modal');
593
690
  document.createElement('ion-modal');
@@ -628,12 +725,18 @@ export class Select {
628
725
  }
629
726
  return;
630
727
  }
631
- getText() {
728
+ /**
729
+ * Returns the text to display in the select based on the selected value.
730
+ *
731
+ * @param useHTML If `true`, the returned text will include any custom HTML content from the selected option. If `false`, the returned text will be plain text without any HTML. Defaults to `false`.
732
+ * @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
733
+ */
734
+ getText(useHTML = false) {
632
735
  const selectedText = this.selectedText;
633
736
  if (selectedText != null && selectedText !== '') {
634
737
  return selectedText;
635
738
  }
636
- return generateText(this.childOpts, this.value, this.compareWith);
739
+ return generateText(this.childOpts, this.value, this.compareWith, useHTML);
637
740
  }
638
741
  setFocus() {
639
742
  if (this.focusEl) {
@@ -655,8 +758,8 @@ export class Select {
655
758
  }, part: "label" }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
656
759
  }
657
760
  componentDidRender() {
658
- var _a;
659
- (_a = this.notchController) === null || _a === void 0 ? void 0 : _a.calculateNotchWidth();
761
+ this.notchController?.calculateNotchWidth();
762
+ this.startContainerController?.calculateStartContainerWidth();
660
763
  }
661
764
  /**
662
765
  * Gets any content passed into the `label` slot,
@@ -675,33 +778,53 @@ export class Select {
675
778
  return this.label !== undefined || this.labelSlot !== null;
676
779
  }
677
780
  /**
678
- * Renders the border container
679
- * when fill="outline".
781
+ * Renders the outline border with a notch for the label.
680
782
  */
681
- renderLabelContainer() {
682
- const mode = getIonMode(this);
683
- const hasOutlineFill = mode === 'md' && this.fill === 'outline';
684
- if (hasOutlineFill) {
685
- /**
686
- * The outline fill has a special outline
687
- * that appears around the select and the label.
688
- * Certain stacked and floating label placements cause the
689
- * label to translate up and create a "cut out"
690
- * inside of that border by using the notch-spacer element.
691
- */
692
- return [
693
- h("div", { class: "select-outline-container" }, h("div", { class: "select-outline-start" }), h("div", { class: {
694
- 'select-outline-notch': true,
695
- 'select-outline-notch-hidden': !this.hasLabel,
696
- } }, h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), h("div", { class: "select-outline-end" })),
697
- this.renderLabel(),
698
- ];
783
+ renderOutlineContainer() {
784
+ return (h("div", { class: "select-outline-container" }, h("div", { class: "select-outline-start" }), h("div", { class: {
785
+ 'select-outline-notch': true,
786
+ 'select-outline-notch-hidden': !this.hasLabel,
787
+ } }, h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), h("div", { class: "select-outline-end" })));
788
+ }
789
+ /**
790
+ * Wraps text nodes in the select text with span elements
791
+ * so spacing can be added between elements without
792
+ * changing the display to prevent losing the ellipses
793
+ * behavior.
794
+ *
795
+ * Only wraps when the string contains HTML elements
796
+ * alongside text.
797
+ */
798
+ wrapSelectTextNodes(html) {
799
+ const temp = document.createElement('div');
800
+ temp.innerHTML = html;
801
+ const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
802
+ // Return the plain text
803
+ if (!hasElements) {
804
+ return html;
699
805
  }
700
- /**
701
- * If not using the outline style,
702
- * we can render just the label.
703
- */
704
- return this.renderLabel();
806
+ Array.from(temp.childNodes).forEach((node) => {
807
+ if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
808
+ const text = node.textContent;
809
+ /**
810
+ * Split comma separator from the text content
811
+ * e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
812
+ */
813
+ const commaMatch = text.match(/^(,\s*)(.*)/);
814
+ if (commaMatch) {
815
+ const commaNode = document.createTextNode(commaMatch[1]);
816
+ const wrapper = document.createElement('span');
817
+ wrapper.textContent = commaMatch[2];
818
+ node.parentNode?.replaceChild(wrapper, node);
819
+ wrapper.parentNode?.insertBefore(commaNode, wrapper);
820
+ return;
821
+ }
822
+ const wrapper = document.createElement('span');
823
+ node.parentNode?.replaceChild(wrapper, node);
824
+ wrapper.appendChild(node);
825
+ }
826
+ });
827
+ return temp.innerHTML;
705
828
  }
706
829
  /**
707
830
  * Renders either the placeholder
@@ -710,7 +833,7 @@ export class Select {
710
833
  */
711
834
  renderSelectText() {
712
835
  const { placeholder } = this;
713
- const displayValue = this.getText();
836
+ const displayValue = this.getText(true);
714
837
  let addPlaceholderClass = false;
715
838
  let selectText = displayValue;
716
839
  if (selectText === '' && placeholder !== undefined) {
@@ -722,6 +845,10 @@ export class Select {
722
845
  'select-placeholder': addPlaceholderClass,
723
846
  };
724
847
  const textPart = addPlaceholderClass ? 'placeholder' : 'text';
848
+ if (this.customHTMLEnabled) {
849
+ const wrapped = this.wrapSelectTextNodes(selectText);
850
+ return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
851
+ }
725
852
  return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
726
853
  }
727
854
  /**
@@ -737,16 +864,16 @@ export class Select {
737
864
  }
738
865
  else {
739
866
  const defaultIcon = mode === 'ios' ? chevronExpand : caretDownSharp;
740
- icon = toggleIcon !== null && toggleIcon !== void 0 ? toggleIcon : defaultIcon;
867
+ icon = toggleIcon ?? defaultIcon;
741
868
  }
742
869
  return h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
743
870
  }
744
871
  get ariaLabel() {
745
- var _a;
746
872
  const { placeholder, inheritedAttributes } = this;
873
+ // Get the plain text from the selected text
747
874
  const displayValue = this.getText();
748
875
  // The aria label should be preferred over visible text if both are specified
749
- const definedLabel = (_a = inheritedAttributes['aria-label']) !== null && _a !== void 0 ? _a : this.labelText;
876
+ const definedLabel = inheritedAttributes['aria-label'] ?? this.labelText;
750
877
  /**
751
878
  * If developer has specified a placeholder
752
879
  * and there is nothing selected, the selectText
@@ -817,27 +944,10 @@ export class Select {
817
944
  const inItem = hostContext('ion-item', this.el);
818
945
  const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
819
946
  const hasValue = this.hasValue();
820
- const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
947
+ const hasOutlineFill = mode === 'md' && fill === 'outline';
821
948
  renderHiddenInput(true, el, name, parseValue(value), disabled);
822
- /**
823
- * If the label is stacked, it should always sit above the select.
824
- * For floating labels, the label should move above the select if
825
- * the select has a value, is open, or has anything in either
826
- * the start or end slot.
827
- *
828
- * If there is content in the start slot, the label would overlap
829
- * it if not forced to float. This is also applied to the end slot
830
- * because with the default or solid fills, the select is not
831
- * vertically centered in the container, but the label is. This
832
- * causes the slots and label to appear vertically offset from each
833
- * other when the label isn't floating above the input. This doesn't
834
- * apply to the outline fill, but this was not accounted for to keep
835
- * things consistent.
836
- *
837
- * TODO(FW-5592): Remove hasStartEndSlots condition
838
- */
839
- const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
840
- return (h(Host, { key: '5f4ee901b65554eacc9fa52230d06b1a5ff1247c', onClick: this.onClick, class: createColorClasses(this.color, {
949
+ const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
950
+ return (h(Host, { key: 'b2f161e3706e139e61440cd13e162714b1b75d72', onClick: this.onClick, class: createColorClasses(this.color, {
841
951
  [mode]: true,
842
952
  'in-item': inItem,
843
953
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -855,7 +965,7 @@ export class Select {
855
965
  [`select-justify-${justify}`]: justifyEnabled,
856
966
  [`select-shape-${shape}`]: shape !== undefined,
857
967
  [`select-label-placement-${labelPlacement}`]: true,
858
- }) }, h("label", { key: 'd56d89b5b58da2b5eaebada9d1be58ca45c67806', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, this.renderLabelContainer(), h("div", { key: 'bc8bf089c693781ad5b3a5db76a12223867d748e', class: "select-wrapper-inner", part: "inner" }, h("slot", { key: 'e1c12b96f1573eb192608c458ed1f3463174cd89', name: "start" }), h("div", { key: '6ee5e3900d8e462f175649b502ac6faa2f2b9909', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: 'faeaea34aad412e1458beab95d4b1b9ca7b87c41', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: 'aeff51e51c990844869eff9940575ce6b2223135', class: "select-highlight" })), this.renderBottomContent()));
968
+ }) }, h("label", { key: '944a2eb468154a21260d181fdaf67828a71eb902', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '927200c53548b1bb4f52d6a167605b724a7b7d0d', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: '6e14b95e9b95c116b16744d630600e90977782bc', name: "start" })), h("div", { key: '8451ed4300ac005963075be36a04ea8763bc0fdd', class: "select-control", part: "control" }, this.renderLabel(), h("div", { key: '207e7b63f3224a4870579365ac992da6784fb31f', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), h("div", { key: '5c17367d488db4d570f31b25e33560efa9011500', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), h("slot", { key: '21fd8c0d9bee8cffef9ef6984cacd31e8f38211c', name: "end" })), shouldRenderHighlight && h("div", { key: '1fff767db9a1ec07b274ef65ff7ae8fb976e6ad2', class: "select-highlight" })), this.renderBottomContent()));
859
969
  }
860
970
  static get is() { return "ion-select"; }
861
971
  static get encapsulation() { return "shadow"; }
@@ -1515,25 +1625,229 @@ const parseValue = (value) => {
1515
1625
  }
1516
1626
  return value.toString();
1517
1627
  };
1518
- const generateText = (opts, value, compareWith) => {
1628
+ const generateText = (opts, value, compareWith, useHTML = false) => {
1519
1629
  if (value === undefined) {
1520
1630
  return '';
1521
1631
  }
1522
1632
  if (Array.isArray(value)) {
1523
1633
  return value
1524
- .map((v) => textForValue(opts, v, compareWith))
1634
+ .map((v) => textForValue(opts, v, compareWith, useHTML))
1525
1635
  .filter((opt) => opt !== null)
1526
1636
  .join(', ');
1527
1637
  }
1528
1638
  else {
1529
- return textForValue(opts, value, compareWith) || '';
1639
+ return textForValue(opts, value, compareWith, useHTML) || '';
1530
1640
  }
1531
1641
  };
1532
- const textForValue = (opts, value, compareWith) => {
1642
+ /**
1643
+ * Returns the display text for a given value from the list of options.
1644
+ * When `useHTML` is true, returns sanitized HTML for the select text.
1645
+ * When `useHTML` is false, returns plain text for aria-label and other
1646
+ * text-only contexts.
1647
+ *
1648
+ * @param opts - The list of ion-select-option elements.
1649
+ * @param value - The value to find the matching option for.
1650
+ * @param compareWith - Custom comparison function or property name.
1651
+ * @param useHTML - If true, returns HTML string. If false, returns plain text.
1652
+ */
1653
+ const textForValue = (opts, value, compareWith, useHTML = false) => {
1533
1654
  const selectOpt = opts.find((opt) => {
1534
1655
  return compareOptions(value, getOptionValue(opt), compareWith);
1535
1656
  });
1536
- return selectOpt ? selectOpt.textContent : null;
1657
+ const customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
1658
+ if (!selectOpt) {
1659
+ return null;
1660
+ }
1661
+ // Return sanitized HTML for the select text
1662
+ if (customHTMLEnabled && useHTML) {
1663
+ return getOptionContent(selectOpt, undefined, true);
1664
+ }
1665
+ /**
1666
+ * Every text-only context reads only the default slot, so the start
1667
+ * and end slots stay out of the `aria-label` and the overlay labels.
1668
+ * Both config paths derive that text through the same helper, so they
1669
+ * cannot disagree about what an option's text is. `null` marks an
1670
+ * option with no text, which is dropped from the joined text of a
1671
+ * `multiple` select rather than joined in as an empty entry.
1672
+ */
1673
+ return getDefaultSlotPlainText(selectOpt) || null;
1674
+ };
1675
+ /**
1676
+ * Trims whitespace from all text nodes within a DOM tree.
1677
+ * This prevents invisible layout shifts and unwanted gaps between
1678
+ * elements when HTML content is injected via innerHTML or cloneNode,
1679
+ * as browsers preserve whitespace (tabs, newlines, spaces) from
1680
+ * the original source markup.
1681
+ *
1682
+ * @param node The root node to start trimming text nodes from.
1683
+ */
1684
+ const trimTextNodes = (node) => {
1685
+ node.childNodes.forEach((child) => {
1686
+ if (child.nodeType === Node.TEXT_NODE) {
1687
+ child.textContent = child.textContent?.trim() || '';
1688
+ }
1689
+ else if (child.nodeType === Node.ELEMENT_NODE) {
1690
+ trimTextNodes(child);
1691
+ }
1692
+ });
1693
+ };
1694
+ /**
1695
+ * Extracts and clones content from an `ion-select-option` element
1696
+ * for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
1697
+ *
1698
+ * @param option - The `ion-select-option` element to extract content from.
1699
+ * @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
1700
+ * @param useHTML - If `true`, the returned string will include any custom HTML content. If `false`, the returned string will be plain text without any HTML.
1701
+ * @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
1702
+ * div element containing cloned child nodes. Returns `null` if no matching
1703
+ * content is found.
1704
+ */
1705
+ const getOptionContent = (option, slotName, useHTML = false) => {
1706
+ let nodes;
1707
+ if (slotName) {
1708
+ // Named slot: get elements with matching slot attribute
1709
+ nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
1710
+ }
1711
+ else {
1712
+ // Default slot: get nodes without a slot attribute
1713
+ const defaultSlot = getOptionDefaultSlot(option) || [];
1714
+ nodes = defaultSlot.filter((node) => {
1715
+ /**
1716
+ * Exclude whitespace-only text nodes (newline noise between
1717
+ * markup elements). Element nodes are always kept, even when
1718
+ * their textContent is empty (e.g. <svg>, <img>).
1719
+ */
1720
+ if (node.nodeType === Node.TEXT_NODE) {
1721
+ return node.textContent?.trim().length !== 0;
1722
+ }
1723
+ return true;
1724
+ });
1725
+ }
1726
+ if (nodes.length === 0) {
1727
+ return null;
1728
+ }
1729
+ /**
1730
+ * Return plain text if no elements are found. This reads the option the
1731
+ * same way the non-custom-HTML path does, so the two do not disagree
1732
+ * about what an option's text is.
1733
+ */
1734
+ if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
1735
+ return getDefaultSlotPlainText(option) || null;
1736
+ }
1737
+ /**
1738
+ * Mirror known custom-element properties (e.g. ion-icon's `icon`)
1739
+ * onto attributes before cloning. Frameworks like Vue set these as
1740
+ * DOM properties, which `cloneNode` doesn't copy, so without this
1741
+ * step the cloned overlay copy renders without the prop's value.
1742
+ */
1743
+ nodes.forEach((n) => {
1744
+ if (n.nodeType === Node.ELEMENT_NODE) {
1745
+ reflectPropertiesToAttributes(n);
1746
+ }
1747
+ });
1748
+ // Clone each node into a temporary container
1749
+ const container = document.createElement('div');
1750
+ nodes.forEach((n) => {
1751
+ const clone = n.cloneNode(true);
1752
+ if (clone.nodeType === Node.TEXT_NODE) {
1753
+ clone.textContent = clone.textContent?.trim() || '';
1754
+ }
1755
+ else {
1756
+ trimTextNodes(clone);
1757
+ }
1758
+ container.appendChild(clone);
1759
+ });
1760
+ /**
1761
+ * Sanitize the cloned DOM in place. Trusted attributes (size, color,
1762
+ * shape, etc.) are preserved; event handlers, javascript: URLs, and
1763
+ * blocked tags are stripped.
1764
+ */
1765
+ sanitizeDOMTree(container);
1766
+ if (useHTML) {
1767
+ return container.innerHTML.trim() || null;
1768
+ }
1769
+ return container;
1770
+ };
1771
+ /**
1772
+ * Returns the child nodes that belong to the default slot of an
1773
+ * option element, excluding any nodes that are assigned to named
1774
+ * slots.
1775
+ *
1776
+ * @param option - The `ion-select-option` element to extract default-slot nodes from.
1777
+ * @returns An array of default slot nodes, or `null` if none are found.
1778
+ */
1779
+ const getOptionDefaultSlot = (option) => {
1780
+ const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
1781
+ if (node.nodeType === Node.ELEMENT_NODE) {
1782
+ return !node.hasAttribute('slot');
1783
+ }
1784
+ return node.nodeType === Node.TEXT_NODE;
1785
+ });
1786
+ if (defaultSlotNodes.length === 0) {
1787
+ return null;
1788
+ }
1789
+ return defaultSlotNodes;
1790
+ };
1791
+ /**
1792
+ * Concatenates the text a node renders, skipping the subtrees of tags
1793
+ * whose contents the browser never paints (`script`, `style`, and the
1794
+ * rest of `blockedTags`). `textContent` includes those, so reading it
1795
+ * directly would put stylesheet or script source into the select text
1796
+ * and the `aria-label`.
1797
+ *
1798
+ * @param node - The node to read text from.
1799
+ * @returns The node's rendered text.
1800
+ */
1801
+ const getRenderedTextContent = (node) => {
1802
+ if (node.nodeType === Node.TEXT_NODE) {
1803
+ return node.textContent ?? '';
1804
+ }
1805
+ if (node.nodeType !== Node.ELEMENT_NODE) {
1806
+ return '';
1807
+ }
1808
+ if (blockedTags.includes(node.tagName.toLowerCase())) {
1809
+ return '';
1810
+ }
1811
+ return Array.from(node.childNodes)
1812
+ .map((child) => getRenderedTextContent(child))
1813
+ .join('');
1814
+ };
1815
+ /**
1816
+ * Extracts plain text from only the default slot of an option,
1817
+ * excluding content assigned to named slots (start/end). Text is
1818
+ * concatenated with no separator and collapsible whitespace is
1819
+ * collapsed, approximating how the browser renders the option.
1820
+ * NBSP is not collapsible, so it is preserved.
1821
+ *
1822
+ * @param option - The `ion-select-option` element to read text from.
1823
+ * @returns The option's default slot text.
1824
+ */
1825
+ const getDefaultSlotPlainText = (option) => {
1826
+ const text = (getOptionDefaultSlot(option) ?? []).map((node) => getRenderedTextContent(node)).join('');
1827
+ return text.replace(/[ \t\n\r\f]+/g, ' ').replace(/^[ \t\n\r\f]+|[ \t\n\r\f]+$/g, '');
1828
+ };
1829
+ /**
1830
+ * Extracts the rich content from an `ion-select-option`.
1831
+ * When `customHTMLEnabled` is `false`, only the plain text from the
1832
+ * default slot is read and the start and end slots are skipped.
1833
+ *
1834
+ * @param option - The `ion-select-option` element to extract content from.
1835
+ * @param customHTMLEnabled - Whether custom HTML rendering is enabled
1836
+ * via the `innerHTMLTemplatesEnabled` config.
1837
+ */
1838
+ const extractOptionContent = (option, customHTMLEnabled) => {
1839
+ if (!customHTMLEnabled) {
1840
+ return {
1841
+ content: getDefaultSlotPlainText(option),
1842
+ startContent: undefined,
1843
+ endContent: undefined,
1844
+ };
1845
+ }
1846
+ return {
1847
+ content: getOptionContent(option),
1848
+ startContent: getOptionContent(option, 'start') ?? undefined,
1849
+ endContent: getOptionContent(option, 'end') ?? undefined,
1850
+ };
1537
1851
  };
1538
1852
  let selectIds = 0;
1539
1853
  const OPTION_CLASS = 'select-interface-option';