@ionic/core 8.8.18 → 8.8.19-dev.11786730389.1a1927bf

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 (786) 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-0Pyit076.js +4 -0
  99. package/components/{p-C_hpsif8.js → p-30_sZS2V.js} +1 -1
  100. package/components/p-83oP9gzn.js +4 -0
  101. package/components/p-8FN7p701.js +4 -0
  102. package/components/p-B-FxiyeI.js +4 -0
  103. package/components/p-B6dUPQXq.js +4 -0
  104. package/components/p-BMPN55of.js +4 -0
  105. package/components/p-BMS4t-kJ.js +4 -0
  106. package/components/p-BO4sUqUv.js +4 -0
  107. package/components/p-BSQPZ79H.js +4 -0
  108. package/components/p-Bc4wROfM.js +4 -0
  109. package/components/p-BhamHSw3.js +4 -0
  110. package/components/{p-D3xo7hqU.js → p-BpG8kBfD.js} +1 -1
  111. package/components/p-BqPNzJf6.js +4 -0
  112. package/components/p-BsVxQGUT.js +4 -0
  113. package/components/p-BxUIQcD9.js +4 -0
  114. package/components/p-C1O9GEug.js +4 -0
  115. package/components/p-C5KYjZWD.js +4 -0
  116. package/components/p-C9BGR5fy.js +4 -0
  117. package/components/p-CD4fmpem.js +4 -0
  118. package/components/p-CEW4RXZO.js +4 -0
  119. package/components/p-CKhiNOEg.js +4 -0
  120. package/components/p-CO2zzh3W.js +4 -0
  121. package/components/p-CVnwvOBD.js +4 -0
  122. package/components/p-CbhUdtjf.js +4 -0
  123. package/components/p-CejmQs3h.js +4 -0
  124. package/components/p-CfnGxjv-.js +4 -0
  125. package/components/p-ClFYbgND.js +4 -0
  126. package/components/p-CmKf4pgI.js +4 -0
  127. package/components/p-Cs5f-uOS.js +4 -0
  128. package/components/p-D7-vHX0A.js +4 -0
  129. package/{dist/ionic/p-DC3RagnA.js → components/p-DIgGHN7D.js} +1 -1
  130. package/components/p-DRfgH82D.js +4 -0
  131. package/components/p-DTY4otpr.js +4 -0
  132. package/components/{p--JUspHvy.js → p-DV85C0e0.js} +1 -1
  133. package/components/p-DVKS-ovH.js +4 -0
  134. package/components/p-DWCzVL3Y.js +4 -0
  135. package/components/p-D_XD0pVT.js +4 -0
  136. package/components/p-Dd8ajo9a.js +4 -0
  137. package/components/p-DdnhY_oj.js +4 -0
  138. package/components/p-Dm7h4Nyv.js +4 -0
  139. package/components/{p-BkKAANMJ.js → p-DwpKZ6rl.js} +1 -1
  140. package/components/p-DyePCNGr.js +4 -0
  141. package/components/p-G0TxqHfe.js +4 -0
  142. package/components/{p-ChIZKXUu.js → p-J-p0EtHR.js} +1 -1
  143. package/components/p-LXu5-6Ti.js +4 -0
  144. package/components/p-MCJ7HjWe.js +4 -0
  145. package/components/p-Obm7si-x.js +4 -0
  146. package/components/p-TXPDHL13.js +4 -0
  147. package/components/p-UuPYCOZE.js +4 -0
  148. package/components/p-WeeS7GvC.js +4 -0
  149. package/components/{p-D7uN07a3.js → p-_0JhwClE.js} +1 -1
  150. package/components/p-_IKFD3ID.js +4 -0
  151. package/components/p-byZM6qHV.js +4 -0
  152. package/components/p-hh7qIC-X.js +4 -0
  153. package/components/p-idq4JFo2.js +4 -0
  154. package/components/{p-DqLB8yFQ.js → p-ryyf_ItD.js} +1 -1
  155. package/components/p-tYCT3JGl.js +4 -0
  156. package/components/p-wzAhIh03.js +4 -0
  157. package/components/p-xOjr4bwc.js +4 -0
  158. package/components/p-yuj4Nkm_.js +4 -0
  159. package/dist/cjs/{animation-Ch16T-Nb.js → animation-C0mOHzej.js} +4 -4
  160. package/dist/cjs/{app-globals-Dd89e0MR.js → app-globals-BREG4twP.js} +1 -1
  161. package/dist/cjs/{button-active-COnxOe4X.js → button-active-BKj1rdFx.js} +3 -3
  162. package/dist/cjs/config-CjUbvdPW.js +36 -0
  163. package/dist/cjs/{dir-Cn0z1rJH.js → dir-Brx7VkvP.js} +1 -1
  164. package/dist/cjs/{format-BUFWn4Bn.js → format-pp0Du3K-.js} +40 -30
  165. package/dist/cjs/{framework-delegate-BgU6U9Ez.js → framework-delegate-NTLQ5YzV.js} +5 -7
  166. package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-BDUH7687.js} +15 -8
  167. package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
  168. package/dist/cjs/{hardware-back-button-CXmUnTJC.js → hardware-back-button-fqpYh-kd.js} +4 -4
  169. package/dist/cjs/{helpers-gntk8bfm.js → helpers-CaLhEmTE.js} +3 -3
  170. package/dist/cjs/index-B7zJsYWS.js +429 -0
  171. package/dist/cjs/{index-BhhuJ1Yx.js → index-BlshL9ib.js} +2 -2
  172. package/dist/cjs/{index-BS2uhvhT.js → index-Ck9advCT.js} +5 -5
  173. package/dist/cjs/{index-ooS8B4p9.js → index-D2X6b92x.js} +6 -7
  174. package/dist/cjs/{index-BiRrzGDi.js → index-D48vawBq.js} +2 -2
  175. package/dist/cjs/{index-CAvQ7Tka.js → index-P1nQxrpZ.js} +10 -4
  176. package/dist/cjs/{index-BfaXsATC.js → index-uvry__L4.js} +31 -14
  177. package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
  178. package/dist/cjs/index.cjs.js +18 -18
  179. package/dist/cjs/{input-shims-Bn1cXfCM.js → input-shims-DvHAFqiP.js} +9 -11
  180. package/dist/cjs/{input.utils-BwhxZooW.js → input.utils-CP4fzrqk.js} +3 -4
  181. package/dist/cjs/ion-accordion_2.cjs.entry.js +368 -340
  182. package/dist/cjs/ion-action-sheet.cjs.entry.js +187 -76
  183. package/dist/cjs/ion-alert.cjs.entry.js +273 -111
  184. package/dist/cjs/ion-app_8.cjs.entry.js +307 -190
  185. package/dist/cjs/ion-avatar_3.cjs.entry.js +10 -4
  186. package/dist/cjs/ion-back-button.cjs.entry.js +47 -23
  187. package/dist/cjs/ion-backdrop.cjs.entry.js +18 -14
  188. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +199 -121
  189. package/dist/cjs/ion-button_2.cjs.entry.js +138 -66
  190. package/dist/cjs/ion-card_5.cjs.entry.js +82 -30
  191. package/dist/cjs/ion-checkbox.cjs.entry.js +152 -101
  192. package/dist/cjs/ion-chip.cjs.entry.js +17 -11
  193. package/dist/cjs/ion-col_3.cjs.entry.js +134 -10
  194. package/dist/cjs/ion-datetime-button.cjs.entry.js +253 -241
  195. package/dist/cjs/ion-datetime.cjs.entry.js +2770 -0
  196. package/dist/cjs/ion-fab_3.cjs.entry.js +139 -81
  197. package/dist/cjs/ion-img.cjs.entry.js +34 -12
  198. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +100 -72
  199. package/dist/cjs/ion-input-otp.cjs.entry.js +433 -370
  200. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +33 -19
  201. package/dist/cjs/ion-input.cjs.entry.js +314 -168
  202. package/dist/cjs/ion-item-option_3.cjs.entry.js +91 -51
  203. package/dist/cjs/ion-item_8.cjs.entry.js +181 -82
  204. package/dist/cjs/ion-loading.cjs.entry.js +146 -60
  205. package/dist/cjs/ion-menu_3.cjs.entry.js +163 -101
  206. package/dist/cjs/ion-modal.cjs.entry.js +455 -261
  207. package/dist/cjs/ion-nav_2.cjs.entry.js +100 -157
  208. package/dist/cjs/ion-picker-column-option.cjs.entry.js +37 -33
  209. package/dist/cjs/ion-picker-column.cjs.entry.js +417 -405
  210. package/dist/cjs/ion-picker.cjs.entry.js +401 -392
  211. package/dist/cjs/ion-popover.cjs.entry.js +319 -205
  212. package/dist/cjs/ion-progress-bar.cjs.entry.js +31 -25
  213. package/dist/cjs/ion-radio_2.cjs.entry.js +206 -133
  214. package/dist/cjs/ion-range.cjs.entry.js +302 -237
  215. package/dist/cjs/ion-refresher_2.cjs.entry.js +165 -93
  216. package/dist/cjs/ion-reorder_2.cjs.entry.js +53 -23
  217. package/dist/cjs/ion-ripple-effect.cjs.entry.js +14 -14
  218. package/dist/cjs/ion-route_4.cjs.entry.js +175 -71
  219. package/dist/cjs/ion-searchbar.cjs.entry.js +291 -200
  220. package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
  221. package/dist/cjs/ion-segment-view.cjs.entry.js +28 -17
  222. package/dist/cjs/ion-segment_2.cjs.entry.js +169 -126
  223. package/dist/cjs/ion-select-modal.cjs.entry.js +104 -48
  224. package/dist/cjs/ion-select_3.cjs.entry.js +759 -214
  225. package/dist/cjs/ion-spinner.cjs.entry.js +24 -10
  226. package/dist/cjs/ion-split-pane.cjs.entry.js +29 -16
  227. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +100 -41
  228. package/dist/cjs/ion-tab_2.cjs.entry.js +53 -27
  229. package/dist/cjs/ion-text.cjs.entry.js +11 -5
  230. package/dist/cjs/ion-textarea.cjs.entry.js +263 -144
  231. package/dist/cjs/ion-toast.cjs.entry.js +236 -117
  232. package/dist/cjs/ion-toggle.cjs.entry.js +175 -122
  233. package/dist/cjs/{ionic-global-BerQGEpE.js → ionic-global-k6hOWWpn.js} +13 -8
  234. package/dist/cjs/ionic.cjs.js +4 -4
  235. package/dist/cjs/{ios.transition-IMJRwn29.js → ios.transition-KvuRAe2W.js} +13 -17
  236. package/dist/cjs/{item-multiple-inputs-jOJZE_I0.js → item-multiple-inputs-BdYSbfKN.js} +1 -1
  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-CgQZxcoT.js → md.transition-Bjl5Ozph.js} +7 -8
  242. package/dist/cjs/{notch-controller-_SwR025y.js → notch-controller-BEUpEgb5.js} +1 -1
  243. package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
  244. package/dist/cjs/{overlays-DuSEMhIW.js → overlays-IlP4H2Gn.js} +48 -33
  245. package/dist/cjs/select-option-render-pULCGldr.js +123 -0
  246. package/dist/cjs/{status-tap-CSvBT7FV.js → status-tap-BR_ujYHg.js} +3 -3
  247. package/dist/cjs/{swipe-back-CuIiziaa.js → swipe-back-DzQKEl5g.js} +5 -5
  248. package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
  249. package/dist/collection/collection-manifest.json +6 -10
  250. package/dist/collection/components/accordion/accordion.js +315 -312
  251. package/dist/collection/components/accordion-group/accordion-group.js +48 -25
  252. package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
  253. package/dist/collection/components/action-sheet/action-sheet.js +173 -64
  254. package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
  255. package/dist/collection/components/action-sheet/test/basic/fixture.js +3 -0
  256. package/dist/collection/components/alert/alert.ios.css +279 -10
  257. package/dist/collection/components/alert/alert.js +257 -97
  258. package/dist/collection/components/alert/alert.md.css +268 -20
  259. package/dist/collection/components/app/app.js +3 -0
  260. package/dist/collection/components/back-button/back-button.js +42 -19
  261. package/dist/collection/components/backdrop/backdrop.js +16 -14
  262. package/dist/collection/components/badge/badge.js +6 -0
  263. package/dist/collection/components/breadcrumb/breadcrumb.js +91 -30
  264. package/dist/collection/components/breadcrumbs/breadcrumbs.js +103 -88
  265. package/dist/collection/components/button/button.js +132 -61
  266. package/dist/collection/components/buttons/buttons.js +13 -15
  267. package/dist/collection/components/card/card.js +54 -21
  268. package/dist/collection/components/card-header/card-header.js +12 -8
  269. package/dist/collection/components/card-subtitle/card-subtitle.js +6 -0
  270. package/dist/collection/components/card-title/card-title.js +6 -0
  271. package/dist/collection/components/checkbox/checkbox.js +147 -97
  272. package/dist/collection/components/chip/chip.js +14 -10
  273. package/dist/collection/components/col/col.js +127 -3
  274. package/dist/collection/components/content/content.js +93 -64
  275. package/dist/collection/components/datetime/datetime.ios.css +42 -2
  276. package/dist/collection/components/datetime/datetime.js +1042 -807
  277. package/dist/collection/components/datetime/datetime.md.css +42 -1
  278. package/dist/collection/components/datetime/utils/data.js +13 -14
  279. package/dist/collection/components/datetime/utils/format.js +21 -11
  280. package/dist/collection/components/datetime/utils/manipulation.js +8 -8
  281. package/dist/collection/components/datetime/utils/parse.js +10 -10
  282. package/dist/collection/components/datetime/utils/state.js +8 -2
  283. package/dist/collection/components/datetime/utils/validate.js +4 -5
  284. package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
  285. package/dist/collection/components/datetime-button/datetime-button.js +247 -237
  286. package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
  287. package/dist/collection/components/fab/fab.js +20 -13
  288. package/dist/collection/components/fab-button/fab-button.js +104 -55
  289. package/dist/collection/components/fab-list/fab-list.js +10 -11
  290. package/dist/collection/components/footer/footer.js +50 -44
  291. package/dist/collection/components/grid/grid.js +4 -6
  292. package/dist/collection/components/header/header.js +35 -25
  293. package/dist/collection/components/img/img.js +34 -10
  294. package/dist/collection/components/infinite-scroll/infinite-scroll.js +73 -66
  295. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +20 -3
  296. package/dist/collection/components/input/input.ios.css +1 -2
  297. package/dist/collection/components/input/input.js +309 -164
  298. package/dist/collection/components/input/input.md.css +1 -2
  299. package/dist/collection/components/input-otp/input-otp.js +428 -366
  300. package/dist/collection/components/input-password-toggle/input-password-toggle.js +29 -16
  301. package/dist/collection/components/item/item.js +99 -53
  302. package/dist/collection/components/item-divider/item-divider.js +15 -10
  303. package/dist/collection/components/item-option/item-option.js +49 -21
  304. package/dist/collection/components/item-options/item-options.js +10 -7
  305. package/dist/collection/components/item-sliding/item-sliding.js +26 -20
  306. package/dist/collection/components/label/label.js +24 -4
  307. package/dist/collection/components/list/list.js +10 -7
  308. package/dist/collection/components/list-header/list-header.js +10 -0
  309. package/dist/collection/components/loading/loading.js +135 -51
  310. package/dist/collection/components/menu/menu.js +101 -59
  311. package/dist/collection/components/menu-button/menu-button.js +29 -20
  312. package/dist/collection/components/menu-toggle/menu-toggle.js +20 -13
  313. package/dist/collection/components/modal/animations/ios.enter.js +1 -1
  314. package/dist/collection/components/modal/animations/md.enter.js +1 -1
  315. package/dist/collection/components/modal/gestures/sheet.js +22 -10
  316. package/dist/collection/components/modal/gestures/swipe-to-close.js +15 -3
  317. package/dist/collection/components/modal/modal.js +398 -228
  318. package/dist/collection/components/modal/safe-area-utils.js +6 -7
  319. package/dist/collection/components/modal/test/fixtures.js +3 -0
  320. package/dist/collection/components/nav/nav.js +69 -247
  321. package/dist/collection/components/nav/view-controller.js +7 -1
  322. package/dist/collection/components/nav-link/nav-link.js +20 -9
  323. package/dist/collection/components/note/note.js +6 -0
  324. package/dist/collection/components/picker/picker.js +398 -390
  325. package/dist/collection/components/picker-column/picker-column.css +3 -0
  326. package/dist/collection/components/picker-column/picker-column.js +414 -404
  327. package/dist/collection/components/picker-column-option/picker-column-option.js +33 -31
  328. package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
  329. package/dist/collection/components/popover/animations/ios.enter.js +1 -2
  330. package/dist/collection/components/popover/animations/md.enter.js +1 -2
  331. package/dist/collection/components/popover/popover.ios.css +15 -0
  332. package/dist/collection/components/popover/popover.js +302 -185
  333. package/dist/collection/components/popover/popover.md.css +15 -0
  334. package/dist/collection/components/popover/test/fixture.js +1 -0
  335. package/dist/collection/components/popover/utils.js +4 -6
  336. package/dist/collection/components/progress-bar/progress-bar.js +27 -23
  337. package/dist/collection/components/radio/radio.js +102 -66
  338. package/dist/collection/components/radio-group/radio-group.js +100 -65
  339. package/dist/collection/components/radio-group/test/fixtures.js +2 -0
  340. package/dist/collection/components/range/range.js +296 -232
  341. package/dist/collection/components/refresher/refresher.js +110 -78
  342. package/dist/collection/components/refresher-content/refresher-content.js +41 -4
  343. package/dist/collection/components/reorder/reorder.js +2 -1
  344. package/dist/collection/components/reorder-group/reorder-group.js +44 -15
  345. package/dist/collection/components/ripple-effect/ripple-effect.js +12 -13
  346. package/dist/collection/components/route/route.js +39 -10
  347. package/dist/collection/components/route-redirect/route-redirect.js +31 -0
  348. package/dist/collection/components/router/router.js +37 -33
  349. package/dist/collection/components/router/utils/dom.js +25 -7
  350. package/dist/collection/components/router/utils/matching.js +7 -9
  351. package/dist/collection/components/router/utils/parser.js +1 -1
  352. package/dist/collection/components/router/utils/path.js +0 -1
  353. package/dist/collection/components/router-link/router-link.js +37 -12
  354. package/dist/collection/components/router-outlet/router-outlet.js +82 -21
  355. package/dist/collection/components/row/row.js +1 -1
  356. package/dist/collection/components/searchbar/searchbar.js +289 -199
  357. package/dist/collection/components/segment/segment.js +120 -85
  358. package/dist/collection/components/segment-button/segment-button.js +43 -37
  359. package/dist/collection/components/segment-content/segment-content.js +1 -1
  360. package/dist/collection/components/segment-view/segment-view.js +26 -16
  361. package/dist/collection/components/select/select.ios.css +33 -0
  362. package/dist/collection/components/select/select.js +597 -166
  363. package/dist/collection/components/select/select.md.css +33 -0
  364. package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
  365. package/dist/collection/components/select-modal/select-modal.js +92 -38
  366. package/dist/collection/components/select-modal/select-modal.md.css +164 -0
  367. package/dist/collection/components/select-modal/test/fixtures.js +8 -1
  368. package/dist/collection/components/select-option/select-option.js +110 -9
  369. package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
  370. package/dist/collection/components/select-popover/select-popover.js +103 -36
  371. package/dist/collection/components/select-popover/select-popover.md.css +164 -0
  372. package/dist/collection/components/select-popover/test/fixtures.js +8 -1
  373. package/dist/collection/components/skeleton-text/skeleton-text.js +12 -8
  374. package/dist/collection/components/spinner/spinner.js +21 -9
  375. package/dist/collection/components/split-pane/split-pane.js +27 -15
  376. package/dist/collection/components/tab/tab.js +17 -6
  377. package/dist/collection/components/tab-bar/tab-bar.js +32 -14
  378. package/dist/collection/components/tab-button/tab-button.js +62 -23
  379. package/dist/collection/components/tabs/tabs.js +33 -20
  380. package/dist/collection/components/text/text.js +8 -2
  381. package/dist/collection/components/textarea/textarea.js +257 -139
  382. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  383. package/dist/collection/components/title/title.js +18 -2
  384. package/dist/collection/components/toast/toast.js +223 -106
  385. package/dist/collection/components/toggle/toggle.js +167 -115
  386. package/dist/collection/components/toolbar/toolbar.js +15 -7
  387. package/dist/collection/global/config.js +4 -6
  388. package/dist/collection/global/ionic-global.js +8 -2
  389. package/dist/collection/index.js +1 -1
  390. package/dist/collection/utils/animation/animation.js +3 -3
  391. package/dist/collection/utils/config.js +5 -4
  392. package/dist/collection/utils/focus-controller/index.js +1 -1
  393. package/dist/collection/utils/focus-trap.js +3 -3
  394. package/dist/collection/utils/framework-delegate.js +4 -6
  395. package/dist/collection/utils/gesture/gesture-controller.js +15 -8
  396. package/dist/collection/utils/gesture/index.js +10 -2
  397. package/dist/collection/utils/gesture/listener.js +1 -1
  398. package/dist/collection/utils/hardware-back-button.js +3 -3
  399. package/dist/collection/utils/helpers.js +2 -2
  400. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
  401. package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
  402. package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
  403. package/dist/collection/utils/keyboard/keyboard.js +1 -1
  404. package/dist/collection/utils/logging/index.js +23 -4
  405. package/dist/collection/utils/menu-controller/index.js +1 -2
  406. package/dist/collection/utils/native/haptic.js +2 -3
  407. package/dist/collection/utils/native/keyboard.js +2 -2
  408. package/dist/collection/utils/native/status-bar.js +1 -1
  409. package/dist/collection/utils/overlay-control-label.js +45 -0
  410. package/dist/collection/utils/overlays.js +38 -23
  411. package/dist/collection/utils/platform.js +4 -5
  412. package/dist/collection/utils/rtl/dir.js +1 -1
  413. package/dist/collection/utils/sanitization/index.js +276 -20
  414. package/dist/collection/utils/select-option-render.js +118 -0
  415. package/dist/collection/utils/slot-mutation-controller.js +1 -2
  416. package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
  417. package/dist/collection/utils/test/playwright/drag-element.js +2 -3
  418. package/dist/collection/utils/test/playwright/generator.js +3 -4
  419. package/dist/collection/utils/test/playwright/page/event-spy.js +11 -12
  420. package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
  421. package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
  422. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
  423. package/dist/collection/utils/test/press-keys.js +10 -17
  424. package/dist/collection/utils/theme.js +6 -1
  425. package/dist/collection/utils/transition/ios.transition.js +9 -13
  426. package/dist/collection/utils/transition/md.transition.js +3 -4
  427. package/dist/docs.json +557 -1273
  428. package/dist/esm/{animation-DLJpuoEz.js → animation-CGFdmGk9.js} +4 -4
  429. package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-CYmMeGdU.js} +1 -1
  430. package/dist/esm/{button-active-BSpTQmS9.js → button-active--80YqSHA.js} +3 -3
  431. package/dist/esm/config-DWCzVL3Y.js +32 -0
  432. package/dist/esm/{dir-C53feagD.js → dir-B-FxiyeI.js} +1 -1
  433. package/dist/esm/{format-CAmvpAez.js → format-Dcwga61t.js} +41 -31
  434. package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate--ajhSeKH.js} +5 -7
  435. package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-TXPDHL13.js} +15 -8
  436. package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
  437. package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-gLJHMX_F.js} +4 -4
  438. package/dist/esm/{helpers-HEqiOzXb.js → helpers-DexiPLIC.js} +3 -3
  439. package/dist/esm/{index-B_dQk_WE.js → index-8s8kZKJ7.js} +5 -5
  440. package/dist/esm/{index-BRHzoo00.js → index-BCgUwrV0.js} +2 -2
  441. package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
  442. package/dist/esm/index-CKM1DdGm.js +424 -0
  443. package/dist/esm/{index-tcQvqkiX.js → index-ChhhtsGZ.js} +32 -15
  444. package/dist/esm/{index-Q6UPU0Ay.js → index-CumkqGQF.js} +6 -7
  445. package/dist/esm/{index-CfgBF1SE.js → index-DppOcPFQ.js} +10 -4
  446. package/dist/esm/{index-Dw-wN0Ja.js → index-_Za5VB9w.js} +2 -2
  447. package/dist/esm/index.js +16 -15
  448. package/dist/esm/{input-shims-LXhI7LEx.js → input-shims-BB0AKb_k.js} +9 -11
  449. package/dist/esm/{input.utils-Y6NgW8bw.js → input.utils-J6HWocLA.js} +3 -4
  450. package/dist/esm/ion-accordion_2.entry.js +368 -340
  451. package/dist/esm/ion-action-sheet.entry.js +187 -76
  452. package/dist/esm/ion-alert.entry.js +272 -110
  453. package/dist/esm/ion-app_8.entry.js +307 -190
  454. package/dist/esm/ion-avatar_3.entry.js +10 -4
  455. package/dist/esm/ion-back-button.entry.js +47 -23
  456. package/dist/esm/ion-backdrop.entry.js +18 -14
  457. package/dist/esm/ion-breadcrumb_2.entry.js +199 -121
  458. package/dist/esm/ion-button_2.entry.js +138 -66
  459. package/dist/esm/ion-card_5.entry.js +82 -30
  460. package/dist/esm/ion-checkbox.entry.js +152 -101
  461. package/dist/esm/ion-chip.entry.js +17 -11
  462. package/dist/esm/ion-col_3.entry.js +134 -10
  463. package/dist/esm/ion-datetime-button.entry.js +253 -241
  464. package/dist/esm/ion-datetime.entry.js +2768 -0
  465. package/dist/esm/ion-fab_3.entry.js +139 -81
  466. package/dist/esm/ion-img.entry.js +34 -12
  467. package/dist/esm/ion-infinite-scroll_2.entry.js +99 -71
  468. package/dist/esm/ion-input-otp.entry.js +433 -370
  469. package/dist/esm/ion-input-password-toggle.entry.js +33 -19
  470. package/dist/esm/ion-input.entry.js +314 -168
  471. package/dist/esm/ion-item-option_3.entry.js +91 -51
  472. package/dist/esm/ion-item_8.entry.js +181 -82
  473. package/dist/esm/ion-loading.entry.js +145 -59
  474. package/dist/esm/ion-menu_3.entry.js +163 -101
  475. package/dist/esm/ion-modal.entry.js +455 -261
  476. package/dist/esm/ion-nav_2.entry.js +100 -157
  477. package/dist/esm/ion-picker-column-option.entry.js +37 -33
  478. package/dist/esm/ion-picker-column.entry.js +417 -405
  479. package/dist/esm/ion-picker.entry.js +401 -392
  480. package/dist/esm/ion-popover.entry.js +319 -205
  481. package/dist/esm/ion-progress-bar.entry.js +31 -25
  482. package/dist/esm/ion-radio_2.entry.js +206 -133
  483. package/dist/esm/ion-range.entry.js +302 -237
  484. package/dist/esm/ion-refresher_2.entry.js +163 -91
  485. package/dist/esm/ion-reorder_2.entry.js +53 -23
  486. package/dist/esm/ion-ripple-effect.entry.js +14 -14
  487. package/dist/esm/ion-route_4.entry.js +175 -71
  488. package/dist/esm/ion-searchbar.entry.js +291 -200
  489. package/dist/esm/ion-segment-content.entry.js +2 -2
  490. package/dist/esm/ion-segment-view.entry.js +28 -17
  491. package/dist/esm/ion-segment_2.entry.js +169 -126
  492. package/dist/esm/ion-select-modal.entry.js +104 -48
  493. package/dist/esm/ion-select_3.entry.js +760 -215
  494. package/dist/esm/ion-spinner.entry.js +24 -10
  495. package/dist/esm/ion-split-pane.entry.js +29 -16
  496. package/dist/esm/ion-tab-bar_2.entry.js +100 -41
  497. package/dist/esm/ion-tab_2.entry.js +53 -27
  498. package/dist/esm/ion-text.entry.js +11 -5
  499. package/dist/esm/ion-textarea.entry.js +263 -144
  500. package/dist/esm/ion-toast.entry.js +235 -116
  501. package/dist/esm/ion-toggle.entry.js +175 -122
  502. package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-BVB7BrLT.js} +13 -8
  503. package/dist/esm/ionic.js +5 -5
  504. package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-BdhybwLl.js} +13 -17
  505. package/dist/esm/{item-multiple-inputs-DlNuqNJm.js → item-multiple-inputs-rU8VaNNg.js} +1 -1
  506. package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
  507. package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
  508. package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
  509. package/dist/esm/loader.js +5 -5
  510. package/dist/esm/{md.transition-D0msQmzI.js → md.transition-B5lqKGCs.js} +7 -8
  511. package/dist/esm/{notch-controller-DKDjU_O7.js → notch-controller-CrUGyHYz.js} +1 -1
  512. package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
  513. package/dist/esm/{overlays-Dg0q2_tJ.js → overlays-CjWwtvf1.js} +48 -33
  514. package/dist/esm/select-option-render-C4m76VGH.js +121 -0
  515. package/dist/esm/{status-tap-vO-6s4Yp.js → status-tap-DpLhkDWs.js} +3 -3
  516. package/dist/esm/{swipe-back-DQ1q5MgD.js → swipe-back-cz4-lyG3.js} +5 -5
  517. package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
  518. package/dist/html.html-data.json +52 -80
  519. package/dist/ionic/index.esm.js +1 -1
  520. package/dist/ionic/ionic.esm.js +1 -1
  521. package/dist/ionic/p-0266b7e1.entry.js +4 -0
  522. package/dist/ionic/p-08443c08.entry.js +4 -0
  523. package/dist/ionic/p-08f1ed1c.entry.js +4 -0
  524. package/dist/ionic/p-09b47b7d.entry.js +4 -0
  525. package/dist/ionic/p-0FNc80PN.js +4 -0
  526. package/dist/ionic/p-12589d59.entry.js +4 -0
  527. package/dist/ionic/p-1d2e53e8.entry.js +4 -0
  528. package/dist/ionic/p-1edf0573.entry.js +4 -0
  529. package/dist/ionic/p-214e000a.entry.js +4 -0
  530. package/dist/ionic/p-21a7fb2a.entry.js +4 -0
  531. package/dist/ionic/p-2ce59395.entry.js +4 -0
  532. package/dist/ionic/p-33829e94.entry.js +4 -0
  533. package/dist/ionic/p-374b10cb.entry.js +4 -0
  534. package/dist/ionic/p-3835a020.entry.js +4 -0
  535. package/dist/ionic/p-3c5fdd27.entry.js +4 -0
  536. package/dist/ionic/{p-c6e49f3f.entry.js → p-40424a88.entry.js} +1 -1
  537. package/dist/ionic/p-48b6835f.entry.js +4 -0
  538. package/dist/ionic/p-4eOQC00Z.js +4 -0
  539. package/dist/ionic/p-5394e1d4.entry.js +4 -0
  540. package/dist/ionic/p-53bac1c9.entry.js +4 -0
  541. package/dist/ionic/p-5506caeb.entry.js +4 -0
  542. package/dist/ionic/p-5993a77f.entry.js +4 -0
  543. package/dist/ionic/p-6277efba.entry.js +4 -0
  544. package/dist/ionic/p-62e71297.entry.js +4 -0
  545. package/dist/ionic/p-6b286c5c.entry.js +4 -0
  546. package/dist/ionic/p-7116e558.entry.js +4 -0
  547. package/dist/ionic/p-74f30659.entry.js +4 -0
  548. package/dist/ionic/p-7bb3e957.entry.js +4 -0
  549. package/dist/ionic/p-82525fb0.entry.js +4 -0
  550. package/dist/ionic/p-865fa114.entry.js +4 -0
  551. package/dist/ionic/p-8a21bdbd.entry.js +4 -0
  552. package/dist/ionic/p-8e1d9e3a.entry.js +4 -0
  553. package/dist/ionic/p-8f3a1995.entry.js +4 -0
  554. package/dist/ionic/p-91c6faf1.entry.js +4 -0
  555. package/dist/ionic/{p-aaeedb6b.entry.js → p-9b865fe6.entry.js} +1 -1
  556. package/dist/ionic/p-9nmHvEvw.js +4 -0
  557. package/dist/ionic/p-B-FxiyeI.js +4 -0
  558. package/dist/ionic/p-BB0LlG4y.js +4 -0
  559. package/dist/ionic/p-BMPN55of.js +4 -0
  560. package/dist/ionic/p-BQ8oNV0v.js +4 -0
  561. package/dist/ionic/p-BSQPZ79H.js +4 -0
  562. package/dist/ionic/p-BhamHSw3.js +4 -0
  563. package/dist/ionic/p-BjvtSsVI.js +4 -0
  564. package/dist/ionic/p-BkfAWuv6.js +4 -0
  565. package/dist/ionic/p-BnMQxWON.js +4 -0
  566. package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
  567. package/dist/ionic/p-BwIp10KV.js +4 -0
  568. package/dist/ionic/p-C-94tAim.js +4 -0
  569. package/dist/ionic/p-C6eME8Ey.js +4 -0
  570. package/dist/ionic/{p-DIuEbVLu.js → p-CKUuSnDR.js} +1 -1
  571. package/dist/ionic/p-CMRtMbJc.js +4 -0
  572. package/dist/ionic/p-CPcPmkGv.js +4 -0
  573. package/dist/ionic/{p-biz8zWmJ.js → p-CQ_4TirR.js} +1 -1
  574. package/dist/ionic/p-CaRuIadB.js +4 -0
  575. package/dist/ionic/p-Cdjxf_yg.js +4 -0
  576. package/dist/ionic/p-ChhhtsGZ.js +5 -0
  577. package/dist/ionic/p-CmKf4pgI.js +4 -0
  578. package/dist/ionic/p-D5t_-oMk.js +4 -0
  579. package/dist/ionic/p-D94b61er.js +4 -0
  580. package/dist/ionic/p-DCI3rXQo.js +4 -0
  581. package/dist/ionic/p-DDhtUaaA.js +4 -0
  582. package/dist/ionic/p-DWCzVL3Y.js +4 -0
  583. package/dist/ionic/p-Dn0mqQ_R.js +4 -0
  584. package/dist/ionic/{p-KjNvRoEp.js → p-I3In7hMC.js} +1 -1
  585. package/dist/ionic/p-T71k3C35.js +4 -0
  586. package/dist/ionic/p-TXPDHL13.js +4 -0
  587. package/dist/ionic/p-a641d428.entry.js +4 -0
  588. package/dist/ionic/p-ac6ef997.entry.js +4 -0
  589. package/dist/ionic/p-acf0a6af.entry.js +4 -0
  590. package/dist/ionic/p-ad98e3ff.entry.js +4 -0
  591. package/dist/ionic/p-af5166f5.entry.js +4 -0
  592. package/dist/ionic/p-b24dc0a1.entry.js +4 -0
  593. package/dist/ionic/p-ba8a598f.entry.js +4 -0
  594. package/dist/ionic/p-bf7c1f05.entry.js +4 -0
  595. package/dist/ionic/p-byZM6qHV.js +4 -0
  596. package/dist/ionic/p-c3f65965.entry.js +4 -0
  597. package/dist/ionic/p-c8fbe544.entry.js +4 -0
  598. package/dist/ionic/p-cb12f6c3.entry.js +4 -0
  599. package/dist/ionic/p-cec87704.entry.js +4 -0
  600. package/dist/ionic/p-dbfd2d52.entry.js +4 -0
  601. package/dist/ionic/p-e1e5b507.entry.js +4 -0
  602. package/dist/ionic/p-ede019ef.entry.js +4 -0
  603. package/dist/ionic/p-efef6788.entry.js +4 -0
  604. package/dist/ionic/p-f046aa37.entry.js +4 -0
  605. package/dist/ionic/p-f402f5a4.entry.js +4 -0
  606. package/dist/ionic/p-f622796d.entry.js +4 -0
  607. package/{components/p-B-JJgYSG.js → dist/ionic/p-kJA95YWg.js} +1 -1
  608. package/dist/types/components/img/img.d.ts +2 -0
  609. package/dist/types/components/input/input.d.ts +1 -1
  610. package/dist/types/components/modal/modal-interface.d.ts +9 -0
  611. package/dist/types/components/modal/modal.d.ts +11 -4
  612. package/dist/types/components/nav/nav-interface.d.ts +0 -1
  613. package/dist/types/components/nav/nav.d.ts +2 -22
  614. package/dist/types/components/route/route.d.ts +1 -1
  615. package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
  616. package/dist/types/components/searchbar/searchbar.d.ts +1 -1
  617. package/dist/types/components/select/select-interface.d.ts +31 -0
  618. package/dist/types/components/select/select.d.ts +18 -0
  619. package/dist/types/components/select-option/select-option.d.ts +42 -1
  620. package/dist/types/components.d.ts +74 -311
  621. package/dist/types/index.d.ts +1 -1
  622. package/dist/types/interface.d.ts +0 -1
  623. package/dist/types/utils/config.d.ts +1 -8
  624. package/dist/types/utils/logging/index.d.ts +2 -1
  625. package/dist/types/utils/overlay-control-label.d.ts +32 -0
  626. package/dist/types/utils/overlays.d.ts +11 -9
  627. package/dist/types/utils/sanitization/index.d.ts +58 -2
  628. package/dist/types/utils/select-option-render.d.ts +53 -0
  629. package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
  630. package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
  631. package/hydrate/index.js +10343 -7070
  632. package/hydrate/index.mjs +10343 -7070
  633. package/package.json +55 -12
  634. package/components/ion-picker-legacy-column.d.ts +0 -11
  635. package/components/ion-picker-legacy-column.js +0 -4
  636. package/components/ion-picker-legacy.d.ts +0 -11
  637. package/components/ion-picker-legacy.js +0 -4
  638. package/components/p-A3O24YmY.js +0 -4
  639. package/components/p-ABkNVeU9.js +0 -4
  640. package/components/p-B9jFTlwE.js +0 -4
  641. package/components/p-BLmJ0zRm.js +0 -4
  642. package/components/p-BMI53wYL.js +0 -4
  643. package/components/p-BSEgsdFI.js +0 -4
  644. package/components/p-BTEOs1at.js +0 -4
  645. package/components/p-BlIAuGv2.js +0 -4
  646. package/components/p-Bnsn6KaP.js +0 -4
  647. package/components/p-BsBCoGa-.js +0 -4
  648. package/components/p-Bz0dSlXZ.js +0 -4
  649. package/components/p-C53feagD.js +0 -4
  650. package/components/p-CHqRYvYm.js +0 -4
  651. package/components/p-CQGnMY3n.js +0 -4
  652. package/components/p-CSZf8_j0.js +0 -4
  653. package/components/p-C_xFdyXe.js +0 -4
  654. package/components/p-Cf2jSDS8.js +0 -4
  655. package/components/p-Cfx4M1Bn.js +0 -4
  656. package/components/p-CkMSOsFF.js +0 -4
  657. package/components/p-Cl0B-RWe.js +0 -4
  658. package/components/p-CmR5uXej.js +0 -4
  659. package/components/p-Cp4GRDqq.js +0 -4
  660. package/components/p-CsNJ1ULL.js +0 -4
  661. package/components/p-CtWGkNnJ.js +0 -4
  662. package/components/p-CzCbeKys.js +0 -4
  663. package/components/p-D-aHdMxW.js +0 -4
  664. package/components/p-D0d8qTwj.js +0 -4
  665. package/components/p-D13Eaw-8.js +0 -4
  666. package/components/p-D6Ynv7Xh.js +0 -4
  667. package/components/p-DCnGU1fF.js +0 -4
  668. package/components/p-DGvrK8dD.js +0 -4
  669. package/components/p-DOFCbuQR.js +0 -4
  670. package/components/p-DRxvM2Ic.js +0 -4
  671. package/components/p-DV5mPYQS.js +0 -4
  672. package/components/p-DWkAgceV.js +0 -4
  673. package/components/p-DiVJyqlX.js +0 -4
  674. package/components/p-DqZAXv2t.js +0 -4
  675. package/components/p-Osve4qkc.js +0 -4
  676. package/components/p-R8zmRi4c.js +0 -4
  677. package/components/p-SLS1rDZM.js +0 -4
  678. package/components/p-aJ6PBUvj.js +0 -4
  679. package/components/p-cyNmxje6.js +0 -4
  680. package/components/p-gAg0kXZp.js +0 -4
  681. package/components/p-gYiraiT_.js +0 -4
  682. package/components/p-j5IxBIan.js +0 -4
  683. package/components/p-k_E4tX5Z.js +0 -4
  684. package/components/p-oD4kcBRX.js +0 -4
  685. package/components/p-rCa2eL0j.js +0 -4
  686. package/components/p-vRBNsYbs.js +0 -4
  687. package/components/p-yEQxMl70.js +0 -4
  688. package/components/p-yzCsOZE2.js +0 -4
  689. package/dist/cjs/config-D6C-KlA9.js +0 -201
  690. package/dist/cjs/ion-datetime_3.cjs.entry.js +0 -3167
  691. package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
  692. package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
  693. package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
  694. package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
  695. package/dist/collection/components/picker-legacy/picker.js +0 -890
  696. package/dist/collection/components/picker-legacy/picker.md.css +0 -287
  697. package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
  698. package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
  699. package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
  700. package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
  701. package/dist/esm/config-DQCONYYp.js +0 -195
  702. package/dist/esm/ion-datetime_3.entry.js +0 -3163
  703. package/dist/ionic/p-01f81ea5.entry.js +0 -4
  704. package/dist/ionic/p-06c232a4.entry.js +0 -4
  705. package/dist/ionic/p-0caa922c.entry.js +0 -4
  706. package/dist/ionic/p-0dc33652.entry.js +0 -4
  707. package/dist/ionic/p-0fa9c382.entry.js +0 -4
  708. package/dist/ionic/p-10e833ef.entry.js +0 -4
  709. package/dist/ionic/p-21eb76d5.entry.js +0 -4
  710. package/dist/ionic/p-27d30585.entry.js +0 -4
  711. package/dist/ionic/p-2a05aa64.entry.js +0 -4
  712. package/dist/ionic/p-2b204c59.entry.js +0 -4
  713. package/dist/ionic/p-2bb2cb18.entry.js +0 -4
  714. package/dist/ionic/p-2fa58e80.entry.js +0 -4
  715. package/dist/ionic/p-3353c229.entry.js +0 -4
  716. package/dist/ionic/p-34586ead.entry.js +0 -4
  717. package/dist/ionic/p-37e720da.entry.js +0 -4
  718. package/dist/ionic/p-390ca786.entry.js +0 -4
  719. package/dist/ionic/p-3ae5f277.entry.js +0 -4
  720. package/dist/ionic/p-4654ae1c.entry.js +0 -4
  721. package/dist/ionic/p-4745f534.entry.js +0 -4
  722. package/dist/ionic/p-4858af1f.entry.js +0 -4
  723. package/dist/ionic/p-4baa5b82.entry.js +0 -4
  724. package/dist/ionic/p-4e92a11f.entry.js +0 -4
  725. package/dist/ionic/p-50e1194a.entry.js +0 -4
  726. package/dist/ionic/p-5334df12.entry.js +0 -4
  727. package/dist/ionic/p-5d1da0a2.entry.js +0 -4
  728. package/dist/ionic/p-5e2f73ee.entry.js +0 -4
  729. package/dist/ionic/p-5eb8e86d.entry.js +0 -4
  730. package/dist/ionic/p-65ebdf1b.entry.js +0 -4
  731. package/dist/ionic/p-746fa988.entry.js +0 -4
  732. package/dist/ionic/p-75dc25ba.entry.js +0 -4
  733. package/dist/ionic/p-7c319341.entry.js +0 -4
  734. package/dist/ionic/p-829367ed.entry.js +0 -4
  735. package/dist/ionic/p-84d5ce05.entry.js +0 -4
  736. package/dist/ionic/p-874b4bd8.entry.js +0 -4
  737. package/dist/ionic/p-8eb8ee76.entry.js +0 -4
  738. package/dist/ionic/p-9eeaBrnk.js +0 -4
  739. package/dist/ionic/p-9f9db3a2.entry.js +0 -4
  740. package/dist/ionic/p-9fa3c405.entry.js +0 -4
  741. package/dist/ionic/p-BGqMS-oh.js +0 -4
  742. package/dist/ionic/p-BTEOs1at.js +0 -4
  743. package/dist/ionic/p-BUFIpxKM.js +0 -4
  744. package/dist/ionic/p-C0eMdTCW.js +0 -4
  745. package/dist/ionic/p-C53feagD.js +0 -4
  746. package/dist/ionic/p-CFlfIb2g.js +0 -4
  747. package/dist/ionic/p-CKvCXMs9.js +0 -4
  748. package/dist/ionic/p-Cl0B-RWe.js +0 -4
  749. package/dist/ionic/p-CmcFnK-B.js +0 -4
  750. package/dist/ionic/p-CtWGkNnJ.js +0 -4
  751. package/dist/ionic/p-Cx3IXROA.js +0 -4
  752. package/dist/ionic/p-D-3ycHmd.js +0 -4
  753. package/dist/ionic/p-D13Eaw-8.js +0 -4
  754. package/dist/ionic/p-D4uTWt4-.js +0 -4
  755. package/dist/ionic/p-DiVJyqlX.js +0 -4
  756. package/dist/ionic/p-DoJvtrbw.js +0 -4
  757. package/dist/ionic/p-DqN5EA2O.js +0 -4
  758. package/dist/ionic/p-DzWaWHGc.js +0 -4
  759. package/dist/ionic/p-Nqf6uvGh.js +0 -4
  760. package/dist/ionic/p-SNAkTDfm.js +0 -4
  761. package/dist/ionic/p-VAemlbDS.js +0 -4
  762. package/dist/ionic/p-a3bdcae6.entry.js +0 -4
  763. package/dist/ionic/p-af55a72f.entry.js +0 -4
  764. package/dist/ionic/p-b2020591.entry.js +0 -4
  765. package/dist/ionic/p-b9fadbfe.entry.js +0 -4
  766. package/dist/ionic/p-c0fb8edd.entry.js +0 -4
  767. package/dist/ionic/p-c38b648e.entry.js +0 -4
  768. package/dist/ionic/p-c4d8641b.entry.js +0 -4
  769. package/dist/ionic/p-ca2ab74d.entry.js +0 -4
  770. package/dist/ionic/p-d889ff6d.entry.js +0 -4
  771. package/dist/ionic/p-dfa8d673.entry.js +0 -4
  772. package/dist/ionic/p-ea56626d.entry.js +0 -4
  773. package/dist/ionic/p-ef4c3bee.entry.js +0 -4
  774. package/dist/ionic/p-f386f6ae.entry.js +0 -4
  775. package/dist/ionic/p-mjKAFv89.js +0 -4
  776. package/dist/ionic/p-tcQvqkiX.js +0 -5
  777. package/dist/ionic/p-uWtqTrG8.js +0 -4
  778. package/dist/ionic/p-viFHDgRs.js +0 -4
  779. package/dist/ionic/p-xWb6fgfq.js +0 -4
  780. package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
  781. package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
  782. package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
  783. package/dist/types/components/picker-legacy/picker.d.ts +0 -158
  784. package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
  785. package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
  786. /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
@@ -2,14 +2,17 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Build, Host, h, forceUpdate } from "@stencil/core";
5
+ import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
5
6
  import { compareOptions, createNotchController, 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 { reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
10
12
  import { createColorClasses, hostContext } from "../../utils/theme";
11
13
  import { watchForOptions } from "../../utils/watch-options";
12
14
  import { caretDownSharp, chevronExpand } from "ionicons/icons";
15
+ import { config } from "../../global/config";
13
16
  import { getIonMode } from "../../global/ionic-global";
14
17
  // TODO(FW-2832): types
15
18
  /**
@@ -32,139 +35,225 @@ import { getIonMode } from "../../global/ionic-global";
32
35
  * @part inner - The inner element of the wrapper that manages the slots, selected values or placeholder, and toggle icons.
33
36
  */
34
37
  export class Select {
35
- constructor() {
36
- this.inputId = `ion-sel-${selectIds++}`;
37
- this.helperTextId = `${this.inputId}-helper-text`;
38
- this.errorTextId = `${this.inputId}-error-text`;
39
- this.inheritedAttributes = {};
40
- this.isExpanded = false;
41
- /**
42
- * The `hasFocus` state ensures the focus class is
43
- * added regardless of how the element is focused.
44
- * The `ion-focused` class only applies when focused
45
- * via tabbing, not by clicking.
46
- * The `has-focus` logic was added to ensure the class
47
- * is applied in both cases.
48
- */
49
- this.hasFocus = false;
50
- /**
51
- * Track validation state for proper aria-live announcements.
52
- */
53
- this.isInvalid = false;
54
- /**
55
- * The text to display on the cancel button.
56
- */
57
- this.cancelText = 'Cancel';
58
- /**
59
- * If `true`, the user cannot interact with the select.
60
- */
61
- this.disabled = false;
62
- /**
63
- * The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
64
- */
65
- this.interface = 'alert';
66
- /**
67
- * Any additional options that the `alert`, `action-sheet` or `popover` interface
68
- * can take. See the [ion-alert docs](./alert), the
69
- * [ion-action-sheet docs](./action-sheet), the
70
- * [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
71
- * create options for each interface.
72
- *
73
- * Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
74
- */
75
- this.interfaceOptions = {};
76
- /**
77
- * Where to place the label relative to the select.
78
- * `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
79
- * `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
80
- * `"floating"`: The label will appear smaller and above the select when the select is focused or it has a value. Otherwise it will appear on top of the select.
81
- * `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
82
- * `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
83
- * When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
84
- */
85
- this.labelPlacement = 'start';
86
- /**
87
- * If `true`, the select can accept multiple values.
88
- */
89
- this.multiple = false;
90
- /**
91
- * The name of the control, which is submitted with the form data.
92
- */
93
- this.name = this.inputId;
94
- /**
95
- * The text to display on the ok button.
96
- */
97
- this.okText = 'OK';
98
- /**
99
- * If true, screen readers will announce it as a required field. This property
100
- * works only for accessibility purposes, it will not prevent the form from
101
- * submitting if the value is invalid.
102
- */
103
- this.required = false;
104
- this.onClick = (ev) => {
105
- const target = ev.target;
106
- const closestSlot = target.closest('[slot="start"], [slot="end"]');
107
- if (target === this.el || closestSlot === null) {
108
- this.setFocus();
109
- this.open(ev);
110
- }
111
- else {
112
- /**
113
- * Prevent clicks to the start/end slots from opening the select.
114
- * We ensure the target isn't this element in case the select is slotted
115
- * in, for example, an item. This would prevent the select from ever
116
- * being opened since the element itself has slot="start"/"end".
117
- *
118
- * Clicking a slotted element also causes a click
119
- * on the <label> element (since it wraps the slots).
120
- * Clicking <label> dispatches another click event on
121
- * the native form control that then bubbles up to this
122
- * listener. This additional event targets the host
123
- * element, so the select overlay is opened.
124
- *
125
- * When the slotted elements are clicked (and therefore
126
- * the ancestor <label> element) we want to prevent the label
127
- * from dispatching another click event.
128
- *
129
- * Do not call stopPropagation() because this will cause
130
- * click handlers on the slotted elements to never fire in React.
131
- * When developers do onClick in React a native "click" listener
132
- * is added on the root element, not the slotted element. When that
133
- * native click listener fires, React then dispatches the synthetic
134
- * click event on the slotted element. However, if stopPropagation
135
- * is called then the native click event will never bubble up
136
- * to the root element.
137
- */
138
- ev.preventDefault();
139
- }
140
- };
141
- this.onFocus = () => {
142
- this.hasFocus = true;
143
- this.ionFocus.emit();
144
- };
145
- this.onBlur = () => {
146
- this.hasFocus = false;
147
- this.ionBlur.emit();
148
- };
149
- /**
150
- * Stops propagation when the label is clicked,
151
- * otherwise, two clicks will be triggered.
152
- */
153
- 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) {
157
- ev.stopPropagation();
158
- }
159
- };
160
- }
38
+ inputId = `ion-sel-${selectIds++}`;
39
+ helperTextId = `${this.inputId}-helper-text`;
40
+ errorTextId = `${this.inputId}-error-text`;
41
+ overlay;
42
+ focusEl;
43
+ mutationO;
44
+ inheritedAttributes = {};
45
+ nativeWrapperEl;
46
+ notchSpacerEl;
47
+ validationObserver;
48
+ notchController;
49
+ customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
50
+ el;
51
+ isExpanded = false;
52
+ /**
53
+ * The `hasFocus` state ensures the focus class is
54
+ * added regardless of how the element is focused.
55
+ * The `ion-focused` class only applies when focused
56
+ * via tabbing, not by clicking.
57
+ * The `has-focus` logic was added to ensure the class
58
+ * is applied in both cases.
59
+ */
60
+ hasFocus = false;
61
+ /**
62
+ * Track validation state for proper aria-live announcements.
63
+ */
64
+ isInvalid = false;
65
+ hintTextId;
66
+ /**
67
+ * The text to display on the cancel button.
68
+ */
69
+ cancelText = 'Cancel';
70
+ /**
71
+ * The color to use from your application's color palette.
72
+ * Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
73
+ * For more information on colors, see [theming](/docs/theming/basics).
74
+ *
75
+ * This property is only available when using the modern select syntax.
76
+ */
77
+ color;
78
+ /**
79
+ * This property allows developers to specify a custom function or property
80
+ * name for comparing objects when determining the selected option in the
81
+ * ion-select. When not specified, the default behavior will use strict
82
+ * equality (===) for comparison.
83
+ */
84
+ compareWith;
85
+ /**
86
+ * If `true`, the user cannot interact with the select.
87
+ */
88
+ disabled = false;
89
+ /**
90
+ * The fill for the item. If `"solid"` the item will have a background. If
91
+ * `"outline"` the item will be transparent with a border. Only available in `md` mode.
92
+ */
93
+ fill;
94
+ /**
95
+ * Text that is placed under the select and displayed when an error is detected.
96
+ */
97
+ errorText;
98
+ /**
99
+ * Text that is placed under the select and displayed when no error is detected.
100
+ */
101
+ helperText;
102
+ /**
103
+ * The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
104
+ */
105
+ interface = 'alert';
106
+ /**
107
+ * Any additional options that the `alert`, `action-sheet` or `popover` interface
108
+ * can take. See the [ion-alert docs](./alert), the
109
+ * [ion-action-sheet docs](./action-sheet), the
110
+ * [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
111
+ * create options for each interface.
112
+ *
113
+ * Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
114
+ */
115
+ interfaceOptions = {};
116
+ /**
117
+ * How to pack the label and select within a line.
118
+ * `justify` does not apply when the label and select
119
+ * are on different lines when `labelPlacement` is set to
120
+ * `"floating"` or `"stacked"`.
121
+ * `"start"`: The label and select will appear on the left in LTR and
122
+ * on the right in RTL.
123
+ * `"end"`: The label and select will appear on the right in LTR and
124
+ * on the left in RTL.
125
+ * `"space-between"`: The label and select will appear on opposite
126
+ * ends of the line with space between the two elements.
127
+ */
128
+ justify;
129
+ /**
130
+ * The visible label associated with the select.
131
+ *
132
+ * Use this if you need to render a plaintext label.
133
+ *
134
+ * The `label` property will take priority over the `label` slot if both are used.
135
+ */
136
+ label;
137
+ /**
138
+ * Where to place the label relative to the select.
139
+ * `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
140
+ * `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
141
+ * `"floating"`: The label will appear smaller and above the select when the select is focused or it has a value. Otherwise it will appear on top of the select.
142
+ * `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
143
+ * `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
144
+ * When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
145
+ */
146
+ labelPlacement = 'start';
147
+ /**
148
+ * If `true`, the select can accept multiple values.
149
+ */
150
+ multiple = false;
151
+ /**
152
+ * The name of the control, which is submitted with the form data.
153
+ */
154
+ name = this.inputId;
155
+ /**
156
+ * The text to display on the ok button.
157
+ */
158
+ okText = 'OK';
159
+ /**
160
+ * The text to display when the select is empty.
161
+ */
162
+ placeholder;
163
+ /**
164
+ * The text to display instead of the selected option's value.
165
+ */
166
+ selectedText;
167
+ /**
168
+ * The toggle icon to use. Defaults to `chevronExpand` for `ios` mode,
169
+ * or `caretDownSharp` for `md` mode.
170
+ */
171
+ toggleIcon;
172
+ /**
173
+ * The toggle icon to show when the select is open. If defined, the icon
174
+ * rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon`
175
+ * will be used for when the select is both open and closed.
176
+ */
177
+ expandedIcon;
178
+ /**
179
+ * The shape of the select. If "round" it will have an increased border radius.
180
+ */
181
+ shape;
182
+ /**
183
+ * The value of the select.
184
+ */
185
+ value;
186
+ /**
187
+ * If true, screen readers will announce it as a required field. This property
188
+ * works only for accessibility purposes, it will not prevent the form from
189
+ * submitting if the value is invalid.
190
+ */
191
+ required = false;
192
+ /**
193
+ * Emitted when the value has changed.
194
+ *
195
+ * This event will not emit when programmatically setting the `value` property.
196
+ */
197
+ ionChange;
198
+ /**
199
+ * Emitted when the selection is cancelled.
200
+ */
201
+ ionCancel;
202
+ /**
203
+ * Emitted when the overlay is dismissed.
204
+ */
205
+ ionDismiss;
206
+ /**
207
+ * Emitted when the select has focus.
208
+ */
209
+ ionFocus;
210
+ /**
211
+ * Emitted when the select loses focus.
212
+ */
213
+ ionBlur;
214
+ /**
215
+ * Emitted when the styles change.
216
+ * @internal
217
+ */
218
+ ionStyle;
161
219
  styleChanged() {
162
220
  this.emitStyle();
163
221
  }
164
222
  setValue(value) {
223
+ if (this.isValueEqual(this.value, value)) {
224
+ return;
225
+ }
165
226
  this.value = value;
166
227
  this.ionChange.emit({ value });
167
228
  }
229
+ isValueEqual(currentValue, newValue) {
230
+ if (this.multiple) {
231
+ const currentArr = Array.isArray(currentValue) ? currentValue : [];
232
+ const newArr = Array.isArray(newValue) ? newValue : [];
233
+ if (currentArr.length !== newArr.length) {
234
+ return false;
235
+ }
236
+ // Multiset compare: each new value must match a distinct current value.
237
+ // A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
238
+ // ['a','b'] when both 'a' and 'b' map to options whose values overlap.
239
+ const remaining = currentArr.slice();
240
+ return newArr.every((val) => {
241
+ const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
242
+ if (idx === -1) {
243
+ return false;
244
+ }
245
+ remaining.splice(idx, 1);
246
+ return true;
247
+ });
248
+ }
249
+ if (currentValue == null && newValue == null) {
250
+ return true;
251
+ }
252
+ if (currentValue == null || newValue == null) {
253
+ return false;
254
+ }
255
+ return compareOptions(currentValue, newValue, this.compareWith);
256
+ }
168
257
  async connectedCallback() {
169
258
  const { el } = this;
170
259
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
@@ -399,10 +488,11 @@ export class Select {
399
488
  .join(' ');
400
489
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
401
490
  const isSelected = isOptionSelected(selectValue, value, this.compareWith);
491
+ const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
402
492
  return {
403
- role: isSelected ? 'selected' : '',
404
- text: option.textContent,
493
+ text: content ?? '',
405
494
  cssClass: optClass,
495
+ disabled: option.disabled,
406
496
  handler: () => {
407
497
  this.setValue(value);
408
498
  },
@@ -410,6 +500,9 @@ export class Select {
410
500
  'aria-checked': isSelected ? 'true' : 'false',
411
501
  role: 'radio',
412
502
  },
503
+ startContent,
504
+ endContent,
505
+ description: option.description,
413
506
  };
414
507
  });
415
508
  // Add "cancel" button
@@ -430,13 +523,19 @@ export class Select {
430
523
  .filter((cls) => cls !== 'hydrated')
431
524
  .join(' ');
432
525
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
526
+ const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
433
527
  return {
434
528
  type: inputType,
435
529
  cssClass: optClass,
436
- label: option.textContent || '',
530
+ label: content ?? '',
437
531
  value,
438
532
  checked: isOptionSelected(selectValue, value, this.compareWith),
439
533
  disabled: option.disabled,
534
+ startContent,
535
+ endContent,
536
+ description: option.description,
537
+ labelPlacement: option.labelPlacement,
538
+ justify: option.justify,
440
539
  };
441
540
  });
442
541
  return alertInputs;
@@ -449,8 +548,9 @@ export class Select {
449
548
  .filter((cls) => cls !== 'hydrated')
450
549
  .join(' ');
451
550
  const optClass = `${OPTION_CLASS} ${copyClasses}`;
551
+ const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
452
552
  return {
453
- text: option.textContent || '',
553
+ text: content ?? '',
454
554
  cssClass: optClass,
455
555
  value,
456
556
  checked: isOptionSelected(selectValue, value, this.compareWith),
@@ -461,6 +561,11 @@ export class Select {
461
561
  this.close();
462
562
  }
463
563
  },
564
+ startContent,
565
+ endContent,
566
+ description: option.description,
567
+ labelPlacement: option.labelPlacement,
568
+ justify: option.justify,
464
569
  };
465
570
  });
466
571
  return popoverOptions;
@@ -489,28 +594,43 @@ export class Select {
489
594
  */
490
595
  }
491
596
  else {
492
- event = Object.assign(Object.assign({}, ev), { detail: {
597
+ event = {
598
+ ...ev,
599
+ detail: {
493
600
  ionShadowTarget: this.nativeWrapperEl,
494
- } });
601
+ },
602
+ };
495
603
  }
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: {
604
+ const options = this.createOverlaySelectOptions(this.childOpts, value);
605
+ const hasRichContent = options.some((opt) => Boolean(opt.startContent) || Boolean(opt.endContent) || Boolean(opt.description));
606
+ const popoverOpts = {
607
+ mode,
608
+ event,
609
+ alignment: 'center',
610
+ size,
611
+ showBackdrop,
612
+ ...interfaceOptions,
613
+ component: 'ion-select-popover',
614
+ cssClass: [
615
+ 'select-popover',
616
+ hasRichContent ? 'select-popover-rich-content' : undefined,
617
+ interfaceOptions.cssClass,
618
+ ],
619
+ componentProps: {
499
620
  header: interfaceOptions.header,
500
621
  subHeader: interfaceOptions.subHeader,
501
622
  message: interfaceOptions.message,
502
623
  multiple,
503
624
  value,
504
- options: this.createOverlaySelectOptions(this.childOpts, value),
505
- } });
625
+ options,
626
+ },
627
+ };
506
628
  /**
507
629
  * Workaround for Stencil to autodefine
508
630
  * ion-select-popover and ion-popover when
509
631
  * using Custom Elements build.
510
632
  */
511
- // eslint-disable-next-line
512
633
  if (false) {
513
- // eslint-disable-next-line
514
634
  // @ts-ignore
515
635
  document.createElement('ion-select-popover');
516
636
  document.createElement('ion-popover');
@@ -520,15 +640,18 @@ export class Select {
520
640
  async openActionSheet() {
521
641
  const mode = getIonMode(this);
522
642
  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] });
643
+ const actionSheetOpts = {
644
+ mode,
645
+ ...interfaceOptions,
646
+ buttons: this.createActionSheetButtons(this.childOpts, this.value),
647
+ cssClass: ['select-action-sheet', interfaceOptions.cssClass],
648
+ };
524
649
  /**
525
650
  * Workaround for Stencil to autodefine
526
651
  * ion-action-sheet when
527
652
  * using Custom Elements build.
528
653
  */
529
- // eslint-disable-next-line
530
654
  if (false) {
531
- // eslint-disable-next-line
532
655
  // @ts-ignore
533
656
  document.createElement('ion-action-sheet');
534
657
  }
@@ -538,7 +661,12 @@ export class Select {
538
661
  const interfaceOptions = this.interfaceOptions;
539
662
  const inputType = this.multiple ? 'checkbox' : 'radio';
540
663
  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: [
664
+ const alertOpts = {
665
+ mode,
666
+ ...interfaceOptions,
667
+ header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
668
+ inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
669
+ buttons: [
542
670
  {
543
671
  text: this.cancelText,
544
672
  role: 'cancel',
@@ -552,19 +680,19 @@ export class Select {
552
680
  this.setValue(selectedValues);
553
681
  },
554
682
  },
555
- ], cssClass: [
683
+ ],
684
+ cssClass: [
556
685
  'select-alert',
557
686
  interfaceOptions.cssClass,
558
687
  this.multiple ? 'multiple-select-alert' : 'single-select-alert',
559
- ] });
688
+ ],
689
+ };
560
690
  /**
561
691
  * Workaround for Stencil to autodefine
562
692
  * ion-alert when
563
693
  * using Custom Elements build.
564
694
  */
565
- // eslint-disable-next-line
566
695
  if (false) {
567
- // eslint-disable-next-line
568
696
  // @ts-ignore
569
697
  document.createElement('ion-alert');
570
698
  }
@@ -573,21 +701,25 @@ export class Select {
573
701
  openModal() {
574
702
  const { multiple, value, interfaceOptions } = this;
575
703
  const mode = getIonMode(this);
576
- const modalOpts = Object.assign(Object.assign({}, interfaceOptions), { mode, cssClass: ['select-modal', interfaceOptions.cssClass], component: 'ion-select-modal', componentProps: {
704
+ const modalOpts = {
705
+ ...interfaceOptions,
706
+ mode,
707
+ cssClass: ['select-modal', interfaceOptions.cssClass],
708
+ component: 'ion-select-modal',
709
+ componentProps: {
577
710
  header: interfaceOptions.header,
578
711
  cancelText: this.cancelText,
579
712
  multiple,
580
713
  value,
581
714
  options: this.createOverlaySelectOptions(this.childOpts, value),
582
- } });
715
+ },
716
+ };
583
717
  /**
584
718
  * Workaround for Stencil to autodefine
585
719
  * ion-select-modal and ion-modal when
586
720
  * using Custom Elements build.
587
721
  */
588
- // eslint-disable-next-line
589
722
  if (false) {
590
- // eslint-disable-next-line
591
723
  // @ts-ignore
592
724
  document.createElement('ion-select-modal');
593
725
  document.createElement('ion-modal');
@@ -628,12 +760,18 @@ export class Select {
628
760
  }
629
761
  return;
630
762
  }
631
- getText() {
763
+ /**
764
+ * Returns the text to display in the select based on the selected value.
765
+ *
766
+ * @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`.
767
+ * @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
768
+ */
769
+ getText(useHTML = false) {
632
770
  const selectedText = this.selectedText;
633
771
  if (selectedText != null && selectedText !== '') {
634
772
  return selectedText;
635
773
  }
636
- return generateText(this.childOpts, this.value, this.compareWith);
774
+ return generateText(this.childOpts, this.value, this.compareWith, useHTML);
637
775
  }
638
776
  setFocus() {
639
777
  if (this.focusEl) {
@@ -647,6 +785,51 @@ export class Select {
647
785
  };
648
786
  this.ionStyle.emit(style);
649
787
  }
788
+ onClick = (ev) => {
789
+ const target = ev.target;
790
+ const closestSlot = target.closest('[slot="start"], [slot="end"]');
791
+ if (target === this.el || closestSlot === null) {
792
+ this.setFocus();
793
+ this.open(ev);
794
+ }
795
+ else {
796
+ /**
797
+ * Prevent clicks to the start/end slots from opening the select.
798
+ * We ensure the target isn't this element in case the select is slotted
799
+ * in, for example, an item. This would prevent the select from ever
800
+ * being opened since the element itself has slot="start"/"end".
801
+ *
802
+ * Clicking a slotted element also causes a click
803
+ * on the <label> element (since it wraps the slots).
804
+ * Clicking <label> dispatches another click event on
805
+ * the native form control that then bubbles up to this
806
+ * listener. This additional event targets the host
807
+ * element, so the select overlay is opened.
808
+ *
809
+ * When the slotted elements are clicked (and therefore
810
+ * the ancestor <label> element) we want to prevent the label
811
+ * from dispatching another click event.
812
+ *
813
+ * Do not call stopPropagation() because this will cause
814
+ * click handlers on the slotted elements to never fire in React.
815
+ * When developers do onClick in React a native "click" listener
816
+ * is added on the root element, not the slotted element. When that
817
+ * native click listener fires, React then dispatches the synthetic
818
+ * click event on the slotted element. However, if stopPropagation
819
+ * is called then the native click event will never bubble up
820
+ * to the root element.
821
+ */
822
+ ev.preventDefault();
823
+ }
824
+ };
825
+ onFocus = () => {
826
+ this.hasFocus = true;
827
+ this.ionFocus.emit();
828
+ };
829
+ onBlur = () => {
830
+ this.hasFocus = false;
831
+ this.ionBlur.emit();
832
+ };
650
833
  renderLabel() {
651
834
  const { label } = this;
652
835
  return (h("div", { class: {
@@ -655,8 +838,7 @@ export class Select {
655
838
  }, part: "label" }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
656
839
  }
657
840
  componentDidRender() {
658
- var _a;
659
- (_a = this.notchController) === null || _a === void 0 ? void 0 : _a.calculateNotchWidth();
841
+ this.notchController?.calculateNotchWidth();
660
842
  }
661
843
  /**
662
844
  * Gets any content passed into the `label` slot,
@@ -674,6 +856,17 @@ export class Select {
674
856
  get hasLabel() {
675
857
  return this.label !== undefined || this.labelSlot !== null;
676
858
  }
859
+ /**
860
+ * Stops propagation when the label is clicked,
861
+ * otherwise, two clicks will be triggered.
862
+ */
863
+ onLabelClick = (ev) => {
864
+ // Only stop propagation if the click was directly on the label
865
+ // and not on the input or other child elements
866
+ if (ev.target === ev.currentTarget) {
867
+ ev.stopPropagation();
868
+ }
869
+ };
677
870
  /**
678
871
  * Renders the border container
679
872
  * when fill="outline".
@@ -703,6 +896,46 @@ export class Select {
703
896
  */
704
897
  return this.renderLabel();
705
898
  }
899
+ /**
900
+ * Wraps text nodes in the select text with span elements
901
+ * so spacing can be added between elements without
902
+ * changing the display to prevent losing the ellipses
903
+ * behavior.
904
+ *
905
+ * Only wraps when the string contains HTML elements
906
+ * alongside text.
907
+ */
908
+ wrapSelectTextNodes(html) {
909
+ const temp = document.createElement('div');
910
+ temp.innerHTML = html;
911
+ const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
912
+ // Return the plain text
913
+ if (!hasElements) {
914
+ return html;
915
+ }
916
+ Array.from(temp.childNodes).forEach((node) => {
917
+ if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
918
+ const text = node.textContent;
919
+ /**
920
+ * Split comma separator from the text content
921
+ * e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
922
+ */
923
+ const commaMatch = text.match(/^(,\s*)(.*)/);
924
+ if (commaMatch) {
925
+ const commaNode = document.createTextNode(commaMatch[1]);
926
+ const wrapper = document.createElement('span');
927
+ wrapper.textContent = commaMatch[2];
928
+ node.parentNode?.replaceChild(wrapper, node);
929
+ wrapper.parentNode?.insertBefore(commaNode, wrapper);
930
+ return;
931
+ }
932
+ const wrapper = document.createElement('span');
933
+ node.parentNode?.replaceChild(wrapper, node);
934
+ wrapper.appendChild(node);
935
+ }
936
+ });
937
+ return temp.innerHTML;
938
+ }
706
939
  /**
707
940
  * Renders either the placeholder
708
941
  * or the selected values based on
@@ -710,7 +943,7 @@ export class Select {
710
943
  */
711
944
  renderSelectText() {
712
945
  const { placeholder } = this;
713
- const displayValue = this.getText();
946
+ const displayValue = this.getText(true);
714
947
  let addPlaceholderClass = false;
715
948
  let selectText = displayValue;
716
949
  if (selectText === '' && placeholder !== undefined) {
@@ -722,6 +955,10 @@ export class Select {
722
955
  'select-placeholder': addPlaceholderClass,
723
956
  };
724
957
  const textPart = addPlaceholderClass ? 'placeholder' : 'text';
958
+ if (this.customHTMLEnabled) {
959
+ const wrapped = this.wrapSelectTextNodes(selectText);
960
+ return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
961
+ }
725
962
  return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
726
963
  }
727
964
  /**
@@ -737,16 +974,16 @@ export class Select {
737
974
  }
738
975
  else {
739
976
  const defaultIcon = mode === 'ios' ? chevronExpand : caretDownSharp;
740
- icon = toggleIcon !== null && toggleIcon !== void 0 ? toggleIcon : defaultIcon;
977
+ icon = toggleIcon ?? defaultIcon;
741
978
  }
742
979
  return h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
743
980
  }
744
981
  get ariaLabel() {
745
- var _a;
746
982
  const { placeholder, inheritedAttributes } = this;
983
+ // Get the plain text from the selected text
747
984
  const displayValue = this.getText();
748
985
  // 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;
986
+ const definedLabel = inheritedAttributes['aria-label'] ?? this.labelText;
750
987
  /**
751
988
  * If developer has specified a placeholder
752
989
  * and there is nothing selected, the selectText
@@ -838,7 +1075,7 @@ export class Select {
838
1075
  */
839
1076
  const labelShouldFloat = labelPlacement === 'stacked' ||
840
1077
  (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded || hasStartEndSlots));
841
- return (h(Host, { key: 'f16327d6866ffee76e1618fcd3281590ca0fd56d', onClick: this.onClick, class: createColorClasses(this.color, {
1078
+ return (h(Host, { key: 'e693afee7852c89be122b785230ed8fc9be5ba61', onClick: this.onClick, class: createColorClasses(this.color, {
842
1079
  [mode]: true,
843
1080
  'in-item': inItem,
844
1081
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -856,7 +1093,7 @@ export class Select {
856
1093
  [`select-justify-${justify}`]: justifyEnabled,
857
1094
  [`select-shape-${shape}`]: shape !== undefined,
858
1095
  [`select-label-placement-${labelPlacement}`]: true,
859
- }) }, h("label", { key: 'db13f76b384a7a7461c1ad752108eadf9c0213be', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, this.renderLabelContainer(), h("div", { key: '2fb0e57bd596c0f525be79293b7da4aca55a9385', class: "select-wrapper-inner", part: "inner" }, h("slot", { key: 'cd694c36242789a89461ed3412af9891ad68411b', name: "start" }), h("div", { key: 'fdf62911be54f4ab29eb3c2eb153f082e76a8f49', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: 'a32f5c4b101d4d6ad45870f4c4446960009377f5', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '61f792024a5f221ef4f28a3c249bd3a0de5edeab', class: "select-highlight" })), this.renderBottomContent()));
1096
+ }) }, h("label", { key: 'd79647bd83cab506f01a4588f631b3982fa1c011', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, this.renderLabelContainer(), h("div", { key: 'fa8d78b9ea041dc9e897643f22f33f38e645ce69', class: "select-wrapper-inner", part: "inner" }, h("slot", { key: '45666226a6898a538849bd3d3b89510bf689656f', name: "start" }), h("div", { key: '59f1f08109c4cda699cb2a9f2a6bce00a7fc4301', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '79b18fd4ca2af9528ff89c609ea20b3e727701e1', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '0149f4ddb4ca1d1d2e2ca91b6cbec721d5c8aa9b', class: "select-highlight" })), this.renderBottomContent()));
860
1097
  }
861
1098
  static get is() { return "ion-select"; }
862
1099
  static get encapsulation() { return "shadow"; }
@@ -1516,25 +1753,219 @@ const parseValue = (value) => {
1516
1753
  }
1517
1754
  return value.toString();
1518
1755
  };
1519
- const generateText = (opts, value, compareWith) => {
1756
+ const generateText = (opts, value, compareWith, useHTML = false) => {
1520
1757
  if (value === undefined) {
1521
1758
  return '';
1522
1759
  }
1523
1760
  if (Array.isArray(value)) {
1524
1761
  return value
1525
- .map((v) => textForValue(opts, v, compareWith))
1762
+ .map((v) => textForValue(opts, v, compareWith, useHTML))
1526
1763
  .filter((opt) => opt !== null)
1527
1764
  .join(', ');
1528
1765
  }
1529
1766
  else {
1530
- return textForValue(opts, value, compareWith) || '';
1767
+ return textForValue(opts, value, compareWith, useHTML) || '';
1531
1768
  }
1532
1769
  };
1533
- const textForValue = (opts, value, compareWith) => {
1770
+ /**
1771
+ * Returns the display text for a given value from the list of options.
1772
+ * When `useHTML` is true, returns sanitized HTML for the select text.
1773
+ * When `useHTML` is false, returns plain text for aria-label and other
1774
+ * text-only contexts.
1775
+ *
1776
+ * @param opts - The list of ion-select-option elements.
1777
+ * @param value - The value to find the matching option for.
1778
+ * @param compareWith - Custom comparison function or property name.
1779
+ * @param useHTML - If true, returns HTML string. If false, returns plain text.
1780
+ */
1781
+ const textForValue = (opts, value, compareWith, useHTML = false) => {
1534
1782
  const selectOpt = opts.find((opt) => {
1535
1783
  return compareOptions(value, getOptionValue(opt), compareWith);
1536
1784
  });
1537
- return selectOpt ? selectOpt.textContent : null;
1785
+ const customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
1786
+ if (!selectOpt) {
1787
+ return null;
1788
+ }
1789
+ // Return sanitized HTML for the select text
1790
+ if (customHTMLEnabled && useHTML) {
1791
+ return getOptionContent(selectOpt, undefined, true);
1792
+ }
1793
+ /**
1794
+ * When custom HTML is enabled, extract only the default slot content.
1795
+ * This ensures aria-label and other text-only contexts read only
1796
+ * the relevant option text.
1797
+ */
1798
+ if (customHTMLEnabled) {
1799
+ const content = getOptionContent(selectOpt);
1800
+ if (typeof content === 'string') {
1801
+ return content;
1802
+ }
1803
+ /**
1804
+ * Elements were found in the default slot, extract and concatenate
1805
+ * their text content while trimming whitespace.
1806
+ */
1807
+ if (content) {
1808
+ const texts = Array.from(content.childNodes)
1809
+ .map((n) => n.textContent?.trim())
1810
+ .filter((t) => t);
1811
+ return texts.join(' ') || null;
1812
+ }
1813
+ // Empty option
1814
+ return null;
1815
+ }
1816
+ return getDefaultSlotPlainText(selectOpt);
1817
+ };
1818
+ /**
1819
+ * Trims whitespace from all text nodes within a DOM tree.
1820
+ * This prevents invisible layout shifts and unwanted gaps between
1821
+ * elements when HTML content is injected via innerHTML or cloneNode,
1822
+ * as browsers preserve whitespace (tabs, newlines, spaces) from
1823
+ * the original source markup.
1824
+ *
1825
+ * @param node The root node to start trimming text nodes from.
1826
+ */
1827
+ const trimTextNodes = (node) => {
1828
+ node.childNodes.forEach((child) => {
1829
+ if (child.nodeType === Node.TEXT_NODE) {
1830
+ child.textContent = child.textContent?.trim() || '';
1831
+ }
1832
+ else if (child.nodeType === Node.ELEMENT_NODE) {
1833
+ trimTextNodes(child);
1834
+ }
1835
+ });
1836
+ };
1837
+ /**
1838
+ * Extracts and clones content from an `ion-select-option` element
1839
+ * for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
1840
+ *
1841
+ * @param option - The `ion-select-option` element to extract content from.
1842
+ * @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
1843
+ * @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.
1844
+ * @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
1845
+ * div element containing cloned child nodes. Returns `null` if no matching
1846
+ * content is found.
1847
+ */
1848
+ const getOptionContent = (option, slotName, useHTML = false) => {
1849
+ let nodes;
1850
+ if (slotName) {
1851
+ // Named slot: get elements with matching slot attribute
1852
+ nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
1853
+ }
1854
+ else {
1855
+ // Default slot: get nodes without a slot attribute
1856
+ const defaultSlot = getOptionDefaultSlot(option) || [];
1857
+ nodes = defaultSlot.filter((node) => {
1858
+ /**
1859
+ * Exclude whitespace-only text nodes (newline noise between
1860
+ * markup elements). Element nodes are always kept, even when
1861
+ * their textContent is empty (e.g. <svg>, <img>).
1862
+ */
1863
+ if (node.nodeType === Node.TEXT_NODE) {
1864
+ return node.textContent?.trim().length !== 0;
1865
+ }
1866
+ return true;
1867
+ });
1868
+ }
1869
+ if (nodes.length === 0) {
1870
+ return null;
1871
+ }
1872
+ // Return plain text if no elements are found
1873
+ if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
1874
+ return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
1875
+ }
1876
+ /**
1877
+ * Mirror known custom-element properties (e.g. ion-icon's `icon`)
1878
+ * onto attributes before cloning. Frameworks like Vue set these as
1879
+ * DOM properties, which `cloneNode` doesn't copy, so without this
1880
+ * step the cloned overlay copy renders without the prop's value.
1881
+ */
1882
+ nodes.forEach((n) => {
1883
+ if (n.nodeType === Node.ELEMENT_NODE) {
1884
+ reflectPropertiesToAttributes(n);
1885
+ }
1886
+ });
1887
+ // Clone each node into a temporary container
1888
+ const container = document.createElement('div');
1889
+ nodes.forEach((n) => {
1890
+ const clone = n.cloneNode(true);
1891
+ if (clone.nodeType === Node.TEXT_NODE) {
1892
+ clone.textContent = clone.textContent?.trim() || '';
1893
+ }
1894
+ else {
1895
+ trimTextNodes(clone);
1896
+ }
1897
+ container.appendChild(clone);
1898
+ });
1899
+ /**
1900
+ * Sanitize the cloned DOM in place. Trusted attributes (size, color,
1901
+ * shape, etc.) are preserved; event handlers, javascript: URLs, and
1902
+ * blocked tags are stripped.
1903
+ */
1904
+ sanitizeDOMTree(container);
1905
+ if (useHTML) {
1906
+ return container.innerHTML.trim() || null;
1907
+ }
1908
+ return container;
1909
+ };
1910
+ /**
1911
+ * Returns the child nodes that belong to the default slot of an
1912
+ * option element, excluding any nodes that are assigned to named
1913
+ * slots.
1914
+ *
1915
+ * @param option - The `ion-select-option` element to extract default-slot nodes from.
1916
+ * @returns An array of default slot nodes, or `null` if none are found.
1917
+ */
1918
+ const getOptionDefaultSlot = (option) => {
1919
+ const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
1920
+ if (node.nodeType === Node.ELEMENT_NODE) {
1921
+ return !node.hasAttribute('slot');
1922
+ }
1923
+ return node.nodeType === Node.TEXT_NODE;
1924
+ });
1925
+ if (defaultSlotNodes.length === 0) {
1926
+ return null;
1927
+ }
1928
+ return defaultSlotNodes;
1929
+ };
1930
+ /**
1931
+ * Extracts plain text from only the default slot of an option,
1932
+ * excluding content assigned to named slots (start/end).
1933
+ */
1934
+ const getDefaultSlotPlainText = (option) => {
1935
+ const texts = Array.from(option.childNodes)
1936
+ .filter((node) => {
1937
+ if (node.nodeType === Node.ELEMENT_NODE) {
1938
+ return !node.hasAttribute('slot');
1939
+ }
1940
+ return node.nodeType === Node.TEXT_NODE;
1941
+ })
1942
+ .filter((node) => node.nodeType === Node.TEXT_NODE)
1943
+ .map((n) => n.textContent?.trim())
1944
+ .filter((t) => t);
1945
+ return texts.join(' ');
1946
+ };
1947
+ /**
1948
+ * Extracts the rich content from an `ion-select-option`.
1949
+ * When `customHTMLEnabled` is `false`, only the plain text from the
1950
+ * default slot is read and the start and end slots are skipped.
1951
+ *
1952
+ * @param option - The `ion-select-option` element to extract content from.
1953
+ * @param customHTMLEnabled - Whether custom HTML rendering is enabled
1954
+ * via the `innerHTMLTemplatesEnabled` config.
1955
+ */
1956
+ const extractOptionContent = (option, customHTMLEnabled) => {
1957
+ if (!customHTMLEnabled) {
1958
+ return {
1959
+ content: getDefaultSlotPlainText(option),
1960
+ startContent: undefined,
1961
+ endContent: undefined,
1962
+ };
1963
+ }
1964
+ return {
1965
+ content: getOptionContent(option),
1966
+ startContent: getOptionContent(option, 'start') ?? undefined,
1967
+ endContent: getOptionContent(option, 'end') ?? undefined,
1968
+ };
1538
1969
  };
1539
1970
  let selectIds = 0;
1540
1971
  const OPTION_CLASS = 'select-interface-option';