@ionic/core 8.8.19-dev.11786730389.1a1927bf → 8.8.19-dev.11786735826.1fad7c0a

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 (289) hide show
  1. package/components/ion-action-sheet.js +1 -1
  2. package/components/ion-alert.js +1 -1
  3. package/components/ion-back-button.js +1 -1
  4. package/components/ion-button.js +1 -1
  5. package/components/ion-card.js +1 -1
  6. package/components/ion-chip.js +1 -1
  7. package/components/ion-datetime-button.js +1 -1
  8. package/components/ion-datetime.js +1 -1
  9. package/components/ion-fab-button.js +1 -1
  10. package/components/ion-infinite-scroll-content.js +1 -1
  11. package/components/ion-input-otp.js +1 -1
  12. package/components/ion-input-password-toggle.js +1 -1
  13. package/components/ion-input.js +1 -1
  14. package/components/ion-item-divider.js +1 -1
  15. package/components/ion-item-group.js +1 -1
  16. package/components/ion-item-option.js +1 -1
  17. package/components/ion-item-options.js +1 -1
  18. package/components/ion-item-sliding.js +1 -1
  19. package/components/ion-item.js +1 -1
  20. package/components/ion-label.js +1 -1
  21. package/components/ion-list-header.js +1 -1
  22. package/components/ion-list.js +1 -1
  23. package/components/ion-loading.js +1 -1
  24. package/components/ion-menu-button.js +1 -1
  25. package/components/ion-menu-toggle.js +1 -1
  26. package/components/ion-menu.js +1 -1
  27. package/components/ion-modal.js +1 -1
  28. package/components/ion-nav-link.js +1 -1
  29. package/components/ion-nav.js +1 -1
  30. package/components/ion-note.js +1 -1
  31. package/components/ion-picker-column-option.js +1 -1
  32. package/components/ion-popover.js +1 -1
  33. package/components/ion-progress-bar.js +1 -1
  34. package/components/ion-radio-group.js +1 -1
  35. package/components/ion-radio.js +1 -1
  36. package/components/ion-range.js +1 -1
  37. package/components/ion-refresher-content.js +1 -1
  38. package/components/ion-refresher.js +1 -1
  39. package/components/ion-reorder-group.js +1 -1
  40. package/components/ion-reorder.js +1 -1
  41. package/components/ion-ripple-effect.js +1 -1
  42. package/components/ion-router-link.js +1 -1
  43. package/components/ion-router-outlet.js +1 -1
  44. package/components/ion-row.js +1 -1
  45. package/components/ion-searchbar.js +1 -1
  46. package/components/ion-segment-button.js +1 -1
  47. package/components/ion-segment-content.js +1 -1
  48. package/components/ion-segment-view.js +1 -1
  49. package/components/ion-segment.js +1 -1
  50. package/components/ion-select-modal.js +1 -1
  51. package/components/ion-select-option.js +1 -1
  52. package/components/ion-select-popover.js +1 -1
  53. package/components/ion-select.js +1 -1
  54. package/components/ion-skeleton-text.js +1 -1
  55. package/components/ion-spinner.js +1 -1
  56. package/components/ion-split-pane.js +1 -1
  57. package/components/ion-tab-bar.js +1 -1
  58. package/components/ion-tab-button.js +1 -1
  59. package/components/ion-tab.js +1 -1
  60. package/components/ion-tabs.js +1 -1
  61. package/components/ion-text.js +1 -1
  62. package/components/ion-textarea.js +1 -1
  63. package/components/ion-thumbnail.js +1 -1
  64. package/components/ion-title.js +1 -1
  65. package/components/ion-toast.js +1 -1
  66. package/components/ion-toggle.js +1 -1
  67. package/components/ion-toolbar.js +1 -1
  68. package/components/{p-C1O9GEug.js → p--m5cCjbK.js} +1 -1
  69. package/components/{p-CfnGxjv-.js → p-B4uHHhPK.js} +1 -1
  70. package/components/{p-BxUIQcD9.js → p-BOvLNVKq.js} +1 -1
  71. package/components/{p-D_XD0pVT.js → p-BWBigMsI.js} +1 -1
  72. package/components/{p-xOjr4bwc.js → p-BZ4-QTes.js} +1 -1
  73. package/components/{p-tYCT3JGl.js → p-BjluhQMI.js} +1 -1
  74. package/components/{p-ClFYbgND.js → p-BlsIikdZ.js} +1 -1
  75. package/components/{p-Obm7si-x.js → p-Blug1Vxu.js} +1 -1
  76. package/components/{p-DTY4otpr.js → p-C91npEel.js} +1 -1
  77. package/components/{p-CVnwvOBD.js → p-CVb3x_r3.js} +1 -1
  78. package/components/{p-B6dUPQXq.js → p-CWLrHG8Y.js} +1 -1
  79. package/components/{p-0Pyit076.js → p-CfnNZz_d.js} +1 -1
  80. package/components/{p-DyePCNGr.js → p-DKrhJJV0.js} +1 -1
  81. package/components/p-DSzSbVP2.js +4 -0
  82. package/components/{p-BsVxQGUT.js → p-DgZOZQjJ.js} +1 -1
  83. package/components/{p-BO4sUqUv.js → p-Dmd2xqCe.js} +1 -1
  84. package/components/{p-83oP9gzn.js → p-GG5GhznE.js} +1 -1
  85. package/components/{p-Bc4wROfM.js → p-UQSiXX2Z.js} +1 -1
  86. package/components/{p-Dm7h4Nyv.js → p-qT1szVjw.js} +1 -1
  87. package/components/p-ypuYdSDB.js +4 -0
  88. package/dist/cjs/input.utils-BZdMWVrt.js +35 -0
  89. package/dist/cjs/ion-app_8.cjs.entry.js +5 -5
  90. package/dist/cjs/ion-avatar_3.cjs.entry.js +1 -1
  91. package/dist/cjs/ion-col_3.cjs.entry.js +1 -1
  92. package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
  93. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +3 -3
  94. package/dist/cjs/ion-input.cjs.entry.js +42 -56
  95. package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
  96. package/dist/cjs/ion-item_8.cjs.entry.js +12 -12
  97. package/dist/cjs/ion-loading.cjs.entry.js +2 -2
  98. package/dist/cjs/ion-menu_3.cjs.entry.js +6 -6
  99. package/dist/cjs/ion-modal.cjs.entry.js +4 -4
  100. package/dist/cjs/ion-nav_2.cjs.entry.js +2 -2
  101. package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
  102. package/dist/cjs/ion-popover.cjs.entry.js +2 -2
  103. package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
  104. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  105. package/dist/cjs/ion-range.cjs.entry.js +3 -3
  106. package/dist/cjs/ion-refresher_2.cjs.entry.js +2 -2
  107. package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
  108. package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
  109. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  110. package/dist/cjs/ion-searchbar.cjs.entry.js +4 -4
  111. package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
  112. package/dist/cjs/ion-segment-view.cjs.entry.js +2 -2
  113. package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
  114. package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
  115. package/dist/cjs/ion-select_3.cjs.entry.js +41 -59
  116. package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
  117. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  118. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  119. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  120. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  121. package/dist/cjs/ion-textarea.cjs.entry.js +44 -55
  122. package/dist/cjs/ion-toast.cjs.entry.js +2 -2
  123. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  124. package/dist/cjs/slot-mutation-controller-CgTGFqlW.js +397 -0
  125. package/dist/collection/components/input/input.ios.css +56 -24
  126. package/dist/collection/components/input/input.js +36 -51
  127. package/dist/collection/components/input/input.md.css +78 -41
  128. package/dist/collection/components/input-otp/input-otp.js +3 -3
  129. package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
  130. package/dist/collection/components/item-divider/item-divider.js +2 -2
  131. package/dist/collection/components/item-group/item-group.js +1 -1
  132. package/dist/collection/components/item-option/item-option.js +2 -2
  133. package/dist/collection/components/item-options/item-options.js +1 -1
  134. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  135. package/dist/collection/components/label/label.js +2 -2
  136. package/dist/collection/components/list/list.js +1 -1
  137. package/dist/collection/components/list-header/list-header.js +2 -2
  138. package/dist/collection/components/loading/loading.js +2 -2
  139. package/dist/collection/components/menu/menu.js +2 -2
  140. package/dist/collection/components/menu-button/menu-button.js +2 -2
  141. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  142. package/dist/collection/components/modal/modal.js +4 -4
  143. package/dist/collection/components/nav/nav.js +1 -1
  144. package/dist/collection/components/nav-link/nav-link.js +1 -1
  145. package/dist/collection/components/note/note.js +2 -2
  146. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
  147. package/dist/collection/components/popover/popover.js +2 -2
  148. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  149. package/dist/collection/components/radio/radio.js +3 -3
  150. package/dist/collection/components/radio-group/radio-group.js +1 -1
  151. package/dist/collection/components/range/range.js +3 -3
  152. package/dist/collection/components/refresher/refresher.js +1 -1
  153. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  154. package/dist/collection/components/reorder/reorder.js +1 -1
  155. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  156. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  157. package/dist/collection/components/router-link/router-link.js +2 -2
  158. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  159. package/dist/collection/components/row/row.js +1 -1
  160. package/dist/collection/components/searchbar/searchbar.js +4 -4
  161. package/dist/collection/components/segment/segment.js +2 -2
  162. package/dist/collection/components/segment-button/segment-button.js +2 -2
  163. package/dist/collection/components/segment-content/segment-content.js +1 -1
  164. package/dist/collection/components/segment-view/segment-view.js +2 -2
  165. package/dist/collection/components/select/select.ios.css +63 -69
  166. package/dist/collection/components/select/select.js +40 -55
  167. package/dist/collection/components/select/select.md.css +85 -85
  168. package/dist/collection/components/select-modal/select-modal.js +1 -1
  169. package/dist/collection/components/select-option/select-option.js +1 -1
  170. package/dist/collection/components/select-popover/select-popover.js +1 -1
  171. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  172. package/dist/collection/components/spinner/spinner.js +1 -1
  173. package/dist/collection/components/split-pane/split-pane.js +2 -2
  174. package/dist/collection/components/tab/tab.js +2 -2
  175. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  176. package/dist/collection/components/tab-button/tab-button.js +2 -2
  177. package/dist/collection/components/tabs/tabs.js +1 -1
  178. package/dist/collection/components/text/text.js +2 -2
  179. package/dist/collection/components/textarea/textarea.ios.css +94 -62
  180. package/dist/collection/components/textarea/textarea.js +39 -51
  181. package/dist/collection/components/textarea/textarea.md.css +103 -77
  182. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  183. package/dist/collection/components/title/title.js +2 -2
  184. package/dist/collection/components/toast/toast.js +2 -2
  185. package/dist/collection/components/toggle/toggle.js +3 -3
  186. package/dist/collection/components/toolbar/toolbar.js +2 -2
  187. package/dist/collection/utils/forms/index.js +1 -0
  188. package/dist/collection/utils/forms/start-container-controller.js +132 -0
  189. package/dist/docs.json +22 -6
  190. package/dist/esm/input.utils-B1ValN_N.js +33 -0
  191. package/dist/esm/ion-app_8.entry.js +5 -5
  192. package/dist/esm/ion-avatar_3.entry.js +1 -1
  193. package/dist/esm/ion-col_3.entry.js +1 -1
  194. package/dist/esm/ion-input-otp.entry.js +3 -3
  195. package/dist/esm/ion-input-password-toggle.entry.js +3 -3
  196. package/dist/esm/ion-input.entry.js +40 -54
  197. package/dist/esm/ion-item-option_3.entry.js +4 -4
  198. package/dist/esm/ion-item_8.entry.js +12 -12
  199. package/dist/esm/ion-loading.entry.js +2 -2
  200. package/dist/esm/ion-menu_3.entry.js +6 -6
  201. package/dist/esm/ion-modal.entry.js +4 -4
  202. package/dist/esm/ion-nav_2.entry.js +2 -2
  203. package/dist/esm/ion-picker-column-option.entry.js +2 -2
  204. package/dist/esm/ion-popover.entry.js +2 -2
  205. package/dist/esm/ion-progress-bar.entry.js +1 -1
  206. package/dist/esm/ion-radio_2.entry.js +4 -4
  207. package/dist/esm/ion-range.entry.js +3 -3
  208. package/dist/esm/ion-refresher_2.entry.js +2 -2
  209. package/dist/esm/ion-reorder_2.entry.js +2 -2
  210. package/dist/esm/ion-ripple-effect.entry.js +1 -1
  211. package/dist/esm/ion-route_4.entry.js +2 -2
  212. package/dist/esm/ion-searchbar.entry.js +4 -4
  213. package/dist/esm/ion-segment-content.entry.js +1 -1
  214. package/dist/esm/ion-segment-view.entry.js +2 -2
  215. package/dist/esm/ion-segment_2.entry.js +4 -4
  216. package/dist/esm/ion-select-modal.entry.js +1 -1
  217. package/dist/esm/ion-select_3.entry.js +40 -58
  218. package/dist/esm/ion-spinner.entry.js +1 -1
  219. package/dist/esm/ion-split-pane.entry.js +2 -2
  220. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  221. package/dist/esm/ion-tab_2.entry.js +3 -3
  222. package/dist/esm/ion-text.entry.js +2 -2
  223. package/dist/esm/ion-textarea.entry.js +43 -54
  224. package/dist/esm/ion-toast.entry.js +2 -2
  225. package/dist/esm/ion-toggle.entry.js +4 -4
  226. package/dist/esm/slot-mutation-controller-u741eD3Z.js +393 -0
  227. package/dist/ionic/ionic.esm.js +1 -1
  228. package/dist/ionic/{p-dbfd2d52.entry.js → p-06533d51.entry.js} +1 -1
  229. package/dist/ionic/{p-a641d428.entry.js → p-141f5b47.entry.js} +1 -1
  230. package/dist/ionic/p-14a5e8f5.entry.js +4 -0
  231. package/dist/ionic/{p-12589d59.entry.js → p-19269e04.entry.js} +1 -1
  232. package/dist/ionic/{p-efef6788.entry.js → p-19abbc33.entry.js} +1 -1
  233. package/dist/ionic/{p-5394e1d4.entry.js → p-4204184c.entry.js} +1 -1
  234. package/dist/ionic/p-4bc3ecdb.entry.js +4 -0
  235. package/dist/ionic/{p-21a7fb2a.entry.js → p-4eed9ca1.entry.js} +1 -1
  236. package/dist/ionic/p-5521dc1f.entry.js +4 -0
  237. package/dist/ionic/p-5c3626de.entry.js +4 -0
  238. package/dist/ionic/{p-374b10cb.entry.js → p-5d3b411c.entry.js} +1 -1
  239. package/dist/ionic/p-60576951.entry.js +4 -0
  240. package/dist/ionic/{p-1d2e53e8.entry.js → p-711a8319.entry.js} +1 -1
  241. package/dist/ionic/{p-48b6835f.entry.js → p-71419a55.entry.js} +1 -1
  242. package/dist/ionic/{p-ba8a598f.entry.js → p-79325ffe.entry.js} +1 -1
  243. package/dist/ionic/p-84a38904.entry.js +4 -0
  244. package/dist/ionic/{p-bf7c1f05.entry.js → p-8f204f1e.entry.js} +1 -1
  245. package/dist/ionic/p-9055e897.entry.js +4 -0
  246. package/dist/ionic/{p-6277efba.entry.js → p-9658e083.entry.js} +1 -1
  247. package/dist/ionic/{p-74f30659.entry.js → p-988baee1.entry.js} +1 -1
  248. package/dist/ionic/p-DAztxQR0.js +4 -0
  249. package/dist/ionic/p-DkUB-ROc.js +4 -0
  250. package/dist/ionic/{p-3835a020.entry.js → p-a71232d6.entry.js} +1 -1
  251. package/dist/ionic/{p-08f1ed1c.entry.js → p-a73d8742.entry.js} +1 -1
  252. package/dist/ionic/{p-8a21bdbd.entry.js → p-a8421d18.entry.js} +1 -1
  253. package/dist/ionic/{p-2ce59395.entry.js → p-a8c2c343.entry.js} +1 -1
  254. package/dist/ionic/{p-c3f65965.entry.js → p-bc2bad5f.entry.js} +1 -1
  255. package/dist/ionic/{p-f622796d.entry.js → p-be08d500.entry.js} +1 -1
  256. package/dist/ionic/p-be9a4f51.entry.js +4 -0
  257. package/dist/ionic/{p-33829e94.entry.js → p-ccc5044d.entry.js} +1 -1
  258. package/dist/ionic/{p-3c5fdd27.entry.js → p-ce32912b.entry.js} +1 -1
  259. package/dist/ionic/p-ded69ceb.entry.js +4 -0
  260. package/dist/ionic/{p-cec87704.entry.js → p-e0c6e31e.entry.js} +1 -1
  261. package/dist/ionic/{p-09b47b7d.entry.js → p-e8c3e08a.entry.js} +1 -1
  262. package/dist/ionic/{p-8f3a1995.entry.js → p-ed5d540d.entry.js} +1 -1
  263. package/dist/ionic/{p-6b286c5c.entry.js → p-f2802440.entry.js} +1 -1
  264. package/dist/ionic/{p-62e71297.entry.js → p-fe1bfbcf.entry.js} +1 -1
  265. package/dist/types/components/input/input.d.ts +11 -5
  266. package/dist/types/components/select/select.d.ts +12 -6
  267. package/dist/types/components/textarea/textarea.d.ts +12 -5
  268. package/dist/types/utils/forms/index.d.ts +1 -0
  269. package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
  270. package/hydrate/index.js +350 -267
  271. package/hydrate/index.mjs +350 -267
  272. package/package.json +4 -4
  273. package/components/p-DIgGHN7D.js +0 -4
  274. package/components/p-MCJ7HjWe.js +0 -4
  275. package/dist/cjs/input.utils-CP4fzrqk.js +0 -149
  276. package/dist/cjs/notch-controller-BEUpEgb5.js +0 -155
  277. package/dist/esm/input.utils-J6HWocLA.js +0 -146
  278. package/dist/esm/notch-controller-CrUGyHYz.js +0 -153
  279. package/dist/ionic/p-0266b7e1.entry.js +0 -4
  280. package/dist/ionic/p-214e000a.entry.js +0 -4
  281. package/dist/ionic/p-91c6faf1.entry.js +0 -4
  282. package/dist/ionic/p-9b865fe6.entry.js +0 -4
  283. package/dist/ionic/p-BnMQxWON.js +0 -4
  284. package/dist/ionic/p-ac6ef997.entry.js +0 -4
  285. package/dist/ionic/p-b24dc0a1.entry.js +0 -4
  286. package/dist/ionic/p-c8fbe544.entry.js +0 -4
  287. package/dist/ionic/p-cb12f6c3.entry.js +0 -4
  288. package/dist/ionic/p-ede019ef.entry.js +0 -4
  289. package/dist/ionic/p-kJA95YWg.js +0 -4
@@ -3,12 +3,13 @@
3
3
  */
4
4
  import { Build, Host, h, forceUpdate } from "@stencil/core";
5
5
  import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
6
- import { compareOptions, createNotchController, isOptionSelected, checkInvalidState } from "../../utils/forms/index";
6
+ import { compareOptions, createNotchController, createStartContainerController, isOptionSelected, checkInvalidState, } from "../../utils/forms/index";
7
7
  import { focusVisibleElement, renderHiddenInput, inheritAttributes } from "../../utils/helpers";
8
8
  import { printIonWarning } from "../../utils/logging/index";
9
9
  import { actionSheetController, alertController, popoverController, modalController } from "../../utils/overlays";
10
10
  import { isRTL } from "../../utils/rtl/index";
11
11
  import { reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
12
+ import { createSlotMutationController } from "../../utils/slot-mutation-controller";
12
13
  import { createColorClasses, hostContext } from "../../utils/theme";
13
14
  import { watchForOptions } from "../../utils/watch-options";
14
15
  import { caretDownSharp, chevronExpand } from "ionicons/icons";
@@ -32,7 +33,9 @@ import { getIonMode } from "../../global/ionic-global";
32
33
  * @part error-text - Supporting text displayed beneath the select when the select is invalid and touched.
33
34
  * @part bottom - The container element for helper text, error text, and counter.
34
35
  * @part wrapper - The clickable label element that wraps the entire form field (label text, slots, selected values or placeholder, and toggle icons).
35
- * @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.
36
39
  */
37
40
  export class Select {
38
41
  inputId = `ion-sel-${selectIds++}`;
@@ -42,10 +45,13 @@ export class Select {
42
45
  focusEl;
43
46
  mutationO;
44
47
  inheritedAttributes = {};
48
+ slotMutationController;
45
49
  nativeWrapperEl;
46
50
  notchSpacerEl;
47
51
  validationObserver;
48
52
  notchController;
53
+ startContainerController;
54
+ startContainerEl;
49
55
  customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
50
56
  el;
51
57
  isExpanded = false;
@@ -256,7 +262,15 @@ export class Select {
256
262
  }
257
263
  async connectedCallback() {
258
264
  const { el } = this;
265
+ this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
266
+ this.startContainerController?.calculateStartContainerWidth();
267
+ forceUpdate(this);
268
+ });
259
269
  this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
270
+ this.startContainerController = createStartContainerController(el, () => this.startContainerEl, () => {
271
+ return Build.isBrowser && getIonMode(this) === 'md' && this.fill === 'outline';
272
+ });
273
+ this.startContainerController.calculateStartContainerWidth();
260
274
  this.updateOverlayOptions();
261
275
  this.emitStyle();
262
276
  this.mutationO = watchForOptions(this.el, 'ion-select-option', async () => {
@@ -328,10 +342,18 @@ export class Select {
328
342
  this.mutationO.disconnect();
329
343
  this.mutationO = undefined;
330
344
  }
345
+ if (this.slotMutationController) {
346
+ this.slotMutationController.destroy();
347
+ this.slotMutationController = undefined;
348
+ }
331
349
  if (this.notchController) {
332
350
  this.notchController.destroy();
333
351
  this.notchController = undefined;
334
352
  }
353
+ if (this.startContainerController) {
354
+ this.startContainerController.destroy();
355
+ this.startContainerController = undefined;
356
+ }
335
357
  // Clean up validation observer to prevent memory leaks.
336
358
  if (this.validationObserver) {
337
359
  this.validationObserver.disconnect();
@@ -839,6 +861,7 @@ export class Select {
839
861
  }
840
862
  componentDidRender() {
841
863
  this.notchController?.calculateNotchWidth();
864
+ this.startContainerController?.calculateStartContainerWidth();
842
865
  }
843
866
  /**
844
867
  * Gets any content passed into the `label` slot,
@@ -857,44 +880,24 @@ export class Select {
857
880
  return this.label !== undefined || this.labelSlot !== null;
858
881
  }
859
882
  /**
860
- * Stops propagation when the label is clicked,
861
- * otherwise, two clicks will be triggered.
883
+ * Stops propagation for re-dispatched clicks (when already expanded) to
884
+ * prevent double-click events. Allows initial button clicks (from keyboard
885
+ * or mouse) and slotted content clicks to propagate so event delegation
886
+ * works for parent handlers.
862
887
  */
863
888
  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) {
889
+ if (ev.target === this.focusEl && this.isExpanded) {
867
890
  ev.stopPropagation();
868
891
  }
869
892
  };
870
893
  /**
871
- * Renders the border container
872
- * when fill="outline".
894
+ * Renders the outline border with a notch for the label.
873
895
  */
874
- renderLabelContainer() {
875
- const mode = getIonMode(this);
876
- const hasOutlineFill = mode === 'md' && this.fill === 'outline';
877
- if (hasOutlineFill) {
878
- /**
879
- * The outline fill has a special outline
880
- * that appears around the select and the label.
881
- * Certain stacked and floating label placements cause the
882
- * label to translate up and create a "cut out"
883
- * inside of that border by using the notch-spacer element.
884
- */
885
- return [
886
- h("div", { class: "select-outline-container" }, h("div", { class: "select-outline-start" }), h("div", { class: {
887
- 'select-outline-notch': true,
888
- 'select-outline-notch-hidden': !this.hasLabel,
889
- } }, h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), h("div", { class: "select-outline-end" })),
890
- this.renderLabel(),
891
- ];
892
- }
893
- /**
894
- * If not using the outline style,
895
- * we can render just the label.
896
- */
897
- return this.renderLabel();
896
+ renderOutlineContainer() {
897
+ return (h("div", { class: "select-outline-container" }, h("div", { class: "select-outline-start" }), h("div", { class: {
898
+ 'select-outline-notch': true,
899
+ 'select-outline-notch-hidden': !this.hasLabel,
900
+ } }, h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), h("div", { class: "select-outline-end" })));
898
901
  }
899
902
  /**
900
903
  * Wraps text nodes in the select text with span elements
@@ -1054,28 +1057,10 @@ export class Select {
1054
1057
  const inItem = hostContext('ion-item', this.el);
1055
1058
  const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
1056
1059
  const hasValue = this.hasValue();
1057
- const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
1060
+ const hasOutlineFill = mode === 'md' && fill === 'outline';
1058
1061
  renderHiddenInput(true, el, name, parseValue(value), disabled);
1059
- /**
1060
- * If the label is stacked, it should always sit above the select.
1061
- * For floating labels, the label should move above the select if
1062
- * the select has a value, is open, or has anything in either
1063
- * the start or end slot.
1064
- *
1065
- * If there is content in the start slot, the label would overlap
1066
- * it if not forced to float. This is also applied to the end slot
1067
- * because with the default or solid fills, the select is not
1068
- * vertically centered in the container, but the label is. This
1069
- * causes the slots and label to appear vertically offset from each
1070
- * other when the label isn't floating above the input. This doesn't
1071
- * apply to the outline fill, but this was not accounted for to keep
1072
- * things consistent.
1073
- *
1074
- * TODO(FW-5592): Remove hasStartEndSlots condition
1075
- */
1076
- const labelShouldFloat = labelPlacement === 'stacked' ||
1077
- (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded || hasStartEndSlots));
1078
- return (h(Host, { key: 'e693afee7852c89be122b785230ed8fc9be5ba61', onClick: this.onClick, class: createColorClasses(this.color, {
1062
+ const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
1063
+ return (h(Host, { key: '5d1e5bf46d0f204efdcb55cc42cfde52e6db304b', onClick: this.onClick, class: createColorClasses(this.color, {
1079
1064
  [mode]: true,
1080
1065
  'in-item': inItem,
1081
1066
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -1093,7 +1078,7 @@ export class Select {
1093
1078
  [`select-justify-${justify}`]: justifyEnabled,
1094
1079
  [`select-shape-${shape}`]: shape !== undefined,
1095
1080
  [`select-label-placement-${labelPlacement}`]: true,
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()));
1081
+ }) }, h("label", { key: '15fd1f8e06510ae8472c621cf8cf90e51172e0be', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '7964e3d9351671899793b117896acdda25ec24c4', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: 'aa309ef155c4025acfd7ed5739b5221c85097b36', name: "start" })), h("div", { key: '23d5a9dfea64a9d81b0b36d9426b15bed98901b9', class: "select-control", part: "control" }, this.renderLabel(), h("div", { key: '810da9fbfa8771e09b5fb768d64e5f04858b5833', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), h("div", { key: 'bf1c04704326ecfa14cf2e49bb76d3fb45beb08d', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), h("slot", { key: '76a8bcaeefdcaa908aebd820d93171b08165cee3', name: "end" })), shouldRenderHighlight && h("div", { key: '55a9c417a82323a44e16328fd62a634d9d7c558b', class: "select-highlight" })), this.renderBottomContent()));
1097
1082
  }
1098
1083
  static get is() { return "ion-select"; }
1099
1084
  static get encapsulation() { return "shadow"; }
@@ -202,33 +202,6 @@ button {
202
202
  color: inherit;
203
203
  }
204
204
 
205
- /**
206
- * The select icon should be centered with
207
- * the entire container not just the control
208
- * with floating/stacked labels.
209
- */
210
- :host(.select-label-placement-stacked) .select-icon,
211
- :host(.select-label-placement-floating) .select-icon {
212
- position: absolute;
213
- height: 100%;
214
- }
215
-
216
- /**
217
- * This positions the icon at the correct
218
- * edge of the component with LTR and RTL
219
- * text directions. The position mixin cannot be
220
- * used here because the icon is in the Shadow DOM.
221
- */
222
- :host(.select-ltr.select-label-placement-stacked) .select-icon,
223
- :host(.select-ltr.select-label-placement-floating) .select-icon {
224
- right: var(--padding-end, 0);
225
- }
226
-
227
- :host(.select-rtl.select-label-placement-stacked) .select-icon,
228
- :host(.select-rtl.select-label-placement-floating) .select-icon {
229
- left: var(--padding-start, 0);
230
- }
231
-
232
205
  .select-text {
233
206
  flex: 1;
234
207
  min-width: 16px;
@@ -271,7 +244,7 @@ button {
271
244
  display: flex;
272
245
  position: relative;
273
246
  flex-grow: 1;
274
- align-items: center;
247
+ align-items: stretch;
275
248
  justify-content: space-between;
276
249
  height: inherit;
277
250
  /**
@@ -297,21 +270,24 @@ button {
297
270
  transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
298
271
  }
299
272
 
300
- .select-wrapper-inner {
273
+ /**
274
+ * The control must inherit specific flex properties
275
+ * so that it will be placed properly when justify
276
+ * or label-placement are set on the host.
277
+ */
278
+ .select-control {
301
279
  display: flex;
280
+ flex: 1;
281
+ flex-direction: inherit;
302
282
  align-items: center;
303
- overflow: hidden;
304
- }
305
-
306
- :host(.select-label-placement-stacked) .select-wrapper-inner,
307
- :host(.select-label-placement-floating) .select-wrapper-inner {
283
+ justify-content: inherit;
308
284
  /**
309
- * When using a stacked/floating label, the inner wrapper is
310
- * stacked vertically under the label container. This line
311
- * ensures that the inner wrapper fills all the remaining height
312
- * of the component.
285
+ * The min-width is set to 0 to allow flex items to shrink below
286
+ * their content size. This enables the select text to collapse
287
+ * in width. We avoid overflow: hidden here because it will clip
288
+ * the floating label.
313
289
  */
314
- flex-grow: 1;
290
+ min-width: 0;
315
291
  }
316
292
 
317
293
  :host(.ion-touched.ion-invalid) {
@@ -399,6 +375,12 @@ button {
399
375
  */
400
376
  display: flex;
401
377
  align-items: center;
378
+ /**
379
+ * Allows the label to shrink below its intrinsic content width.
380
+ * Without this the label keeps its full width and can push the
381
+ * select and end slot outside the wrapper.
382
+ */
383
+ min-width: 0;
402
384
  /**
403
385
  * Label text should not extend
404
386
  * beyond the bounds of the select.
@@ -417,6 +399,18 @@ button {
417
399
  pointer-events: none;
418
400
  }
419
401
 
402
+ /**
403
+ * When start/end slots are added or removed, we temporarily
404
+ * disable the label transition to prevent the floating label
405
+ * from animating as its position is adjusted.
406
+ *
407
+ * This class is applied by the start container controller, so
408
+ * renaming it here requires renaming it there too.
409
+ */
410
+ :host(.skip-label-transition) .label-text-wrapper {
411
+ transition: none;
412
+ }
413
+
420
414
  /**
421
415
  * We need to use two elements instead of
422
416
  * one. The .label-text-wrapper is responsible
@@ -449,6 +443,13 @@ button {
449
443
 
450
444
  .native-wrapper {
451
445
  display: flex;
446
+ /**
447
+ * Give up space before the label does. Flexbox would otherwise take
448
+ * from both in proportion to their size and truncate the shorter
449
+ * label first. The factor is this large because the label truncates
450
+ * as soon as it loses any width at all, even a fraction of a pixel.
451
+ */
452
+ flex-shrink: 100000;
452
453
  align-items: center;
453
454
  /**
454
455
  * When the floating label appears on top of the
@@ -552,9 +553,16 @@ button {
552
553
  * down when the select is focused or has a value.
553
554
  *
554
555
  */
555
- :host(.select-label-placement-stacked) .select-wrapper,
556
- :host(.select-label-placement-floating) .select-wrapper {
556
+ :host(.select-label-placement-stacked) .select-control,
557
+ :host(.select-label-placement-floating) .select-control {
557
558
  flex-direction: column;
559
+ /**
560
+ * When using a stacked/floating label, the control is
561
+ * stacked vertically under the label container. This line
562
+ * ensures that the control fills all the remaining height
563
+ * of the component.
564
+ */
565
+ flex-grow: 1;
558
566
  align-items: start;
559
567
  }
560
568
 
@@ -579,17 +587,11 @@ button {
579
587
  }
580
588
 
581
589
  /**
582
- * Ensures the select does not
583
- * overlap the label.
584
- * Also ensure that the native wrapper
585
- * takes up the remaining available height and width.
590
+ * Ensures that the native wrapper takes up the
591
+ * remaining available height and width.
586
592
  */
587
593
  :host(.select-label-placement-stacked) .native-wrapper,
588
594
  :host(.select-label-placement-floating) .native-wrapper {
589
- margin-left: 0;
590
- margin-right: 0;
591
- margin-top: 1px;
592
- margin-bottom: 0;
593
595
  flex-grow: 1;
594
596
  width: 100%;
595
597
  }
@@ -613,27 +615,16 @@ button {
613
615
  * The placeholder should be hidden when the label
614
616
  * is on top of the select. This prevents the label
615
617
  * from overlapping any placeholder value.
616
- *
617
- * TODO(FW-5592): Remove :not(.label-floating) piece
618
618
  */
619
- :host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder {
619
+ :host(.select-label-placement-floating) .native-wrapper .select-placeholder {
620
620
  opacity: 0;
621
621
  }
622
622
 
623
623
  /**
624
- * We don't use .label-floating here because that would
625
- * also include the case where the label is floating due
626
- * to content in the start/end slot. We want the opacity
627
- * to remain at the default in this case, since the select
628
- * isn't being actively interacted with.
629
- *
630
- * TODO(FW-5592): Change entire selector to:
631
- * :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder
624
+ * Show the placeholder when the label is floating.
632
625
  */
633
- :host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,
634
- :host(.has-focus.select-label-placement-floating) .native-wrapper .select-placeholder,
635
- :host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder {
636
- opacity: 1;
626
+ :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder {
627
+ opacity: var(--placeholder-opacity);
637
628
  }
638
629
 
639
630
  /**
@@ -648,6 +639,14 @@ button {
648
639
  max-width: calc(100% / 0.75);
649
640
  }
650
641
 
642
+ .select-start,
643
+ .select-end {
644
+ display: flex;
645
+ position: relative;
646
+ flex-shrink: 0;
647
+ align-items: center;
648
+ }
649
+
651
650
  ::slotted([slot=start]), ::slotted([slot=end]) {
652
651
  /**
653
652
  * Prevent the slots from shrinking when the label and/or
@@ -980,6 +979,14 @@ button {
980
979
  --border-radius: 4px;
981
980
  --padding-start: 16px;
982
981
  --padding-end: 16px;
982
+ /**
983
+ * The measured width of the start container, as a negative offset
984
+ * in LTR and a positive one in RTL. Written to the host by the
985
+ * start container controller, so renaming it here requires renaming
986
+ * it there too. Declared with a default so the label is positioned
987
+ * correctly before the first measurement runs.
988
+ */
989
+ --internal-start-container-adjustment: 0px;
983
990
  min-height: 56px;
984
991
  }
985
992
 
@@ -1049,10 +1056,11 @@ button {
1049
1056
  :host(.select-fill-outline.select-label-placement-floating) .label-text-wrapper {
1050
1057
  position: absolute;
1051
1058
  /**
1052
- * Label text should not extend
1053
- * beyond the bounds of the select.
1059
+ * While resting this is the width of the select, which already
1060
+ * excludes the start and end slots. Once the label floats the
1061
+ * containing block becomes the wrapper and the rule below takes over.
1054
1062
  */
1055
- max-width: calc(100% - var(--padding-start) - var(--padding-end));
1063
+ max-width: 100%;
1056
1064
  }
1057
1065
 
1058
1066
  /**
@@ -1065,11 +1073,20 @@ button {
1065
1073
  z-index: 1;
1066
1074
  }
1067
1075
 
1076
+ /**
1077
+ * The resting label is positioned relative to the control so it can size to
1078
+ * the space between the start and end slots. When floating, the label needs
1079
+ * to escape the control and position itself relative to the wrapper instead.
1080
+ */
1081
+ :host(.select-fill-outline:not(.label-floating)) .select-control {
1082
+ position: relative;
1083
+ }
1084
+
1068
1085
  /**
1069
1086
  * This makes the label sit above the select.
1070
1087
  */
1071
1088
  :host(.label-floating.select-fill-outline) .label-text-wrapper {
1072
- transform: translateY(-32%) scale(0.75);
1089
+ transform: translate(var(--internal-start-container-adjustment, 0px), -32%) scale(0.75);
1073
1090
  margin-left: 0;
1074
1091
  margin-right: 0;
1075
1092
  margin-top: 0;
@@ -1164,16 +1181,10 @@ button {
1164
1181
  :host(.select-fill-outline) .select-outline-start {
1165
1182
  -webkit-border-start: var(--border-width) var(--border-style) var(--border-color);
1166
1183
  border-inline-start: var(--border-width) var(--border-style) var(--border-color);
1167
- }
1168
-
1169
- :host(.select-fill-outline) .select-outline-start {
1170
1184
  border-start-start-radius: var(--border-radius);
1171
1185
  border-start-end-radius: 0px;
1172
1186
  border-end-end-radius: 0px;
1173
1187
  border-end-start-radius: var(--border-radius);
1174
- }
1175
-
1176
- :host(.select-fill-outline) .select-outline-start {
1177
1188
  /**
1178
1189
  * There should be spacing between the translated text
1179
1190
  * and .select-outline-start. However, we can't add this
@@ -1188,16 +1199,10 @@ button {
1188
1199
  :host(.select-fill-outline) .select-outline-end {
1189
1200
  -webkit-border-end: var(--border-width) var(--border-style) var(--border-color);
1190
1201
  border-inline-end: var(--border-width) var(--border-style) var(--border-color);
1191
- }
1192
-
1193
- :host(.select-fill-outline) .select-outline-end {
1194
1202
  border-start-start-radius: 0px;
1195
1203
  border-start-end-radius: var(--border-radius);
1196
1204
  border-end-end-radius: var(--border-radius);
1197
1205
  border-end-start-radius: 0px;
1198
- }
1199
-
1200
- :host(.select-fill-outline) .select-outline-end {
1201
1206
  /**
1202
1207
  * The ending outline fragment
1203
1208
  * should take up the remaining free space.
@@ -1326,11 +1331,6 @@ button {
1326
1331
  --border-radius: 16px;
1327
1332
  }
1328
1333
 
1329
- :host(.select-label-placement-stacked) .select-wrapper-inner,
1330
- :host(.select-label-placement-floating) .select-wrapper-inner {
1331
- width: calc(100% - 0.8125rem - 4px);
1332
- }
1333
-
1334
1334
  :host(.select-disabled) {
1335
1335
  opacity: 0.38;
1336
1336
  }
@@ -144,7 +144,7 @@ export class SelectModal {
144
144
  });
145
145
  }
146
146
  render() {
147
- return (h(Host, { key: '2cb1ae057b7a66f5d12c926f618f6b945f019803', class: getIonMode(this) }, h("ion-header", { key: 'e41f1c4ad1c71dcc927d210502d6366cea894a14' }, h("ion-toolbar", { key: '1a191dfc8980541469ee4d8996ba4de52cac1ac5' }, this.header !== undefined && h("ion-title", { key: '14ab9cb7d41d15b982c6ccd8ba6cee0e9cb528d9' }, this.header), h("ion-buttons", { key: '80451a2ed3a82138eb1575135cf2ebbd5e8f6e60', slot: "end" }, h("ion-button", { key: '01a315cd739569f3c0b23a4d243d52b69b63dfa7', onClick: () => this.closeModal() }, this.cancelText)))), h("ion-content", { key: 'd953101bae9a91f8108f7a5e411bb1e34338655d' }, h("ion-list", { key: '171a5668afc67b03d2ee87e91cf400b17541bc7f' }, this.multiple === true ? this.renderCheckboxOptions() : this.renderRadioOptions()))));
147
+ return (h(Host, { key: '791e95b985dd4b135db17a25fc678e9f8b73c597', class: getIonMode(this) }, h("ion-header", { key: '697d18eef394c4c11c73afe69b9eadd1bad97d38' }, h("ion-toolbar", { key: '036968824ad8771020fe2b7604a6e72b73efc8ae' }, this.header !== undefined && h("ion-title", { key: '102e0346be83e879e733f9b410437b26216156aa' }, this.header), h("ion-buttons", { key: '436b997e990ce2f5e12e1651f8afc31ae231f7b0', slot: "end" }, h("ion-button", { key: 'ee4ddfd0612d33583aa0b93ebdb5257b10d4fda5', onClick: () => this.closeModal() }, this.cancelText)))), h("ion-content", { key: '38ea098f85ac69226e614e0a09f668e9209f7ea1' }, h("ion-list", { key: '20becc2537a1a027915fe0598203039ceb8ba4f3' }, this.multiple === true ? this.renderCheckboxOptions() : this.renderRadioOptions()))));
148
148
  }
149
149
  static get is() { return "ion-select-modal"; }
150
150
  static get encapsulation() { return "scoped"; }
@@ -56,7 +56,7 @@ export class SelectOption {
56
56
  */
57
57
  justify;
58
58
  render() {
59
- return h(Host, { key: '8b8bef0f5a55f18048708c34d3ea3ff0ff2f1d47', role: "option", id: this.inputId, class: getIonMode(this) });
59
+ return h(Host, { key: '01275b5a613c4b065b24e0d939f611f6ed1fc9ee', role: "option", id: this.inputId, class: getIonMode(this) });
60
60
  }
61
61
  static get is() { return "ion-select-option"; }
62
62
  static get encapsulation() { return "shadow"; }
@@ -179,7 +179,7 @@ export class SelectPopover {
179
179
  render() {
180
180
  const { header, message, options, subHeader } = this;
181
181
  const hasSubHeaderOrMessage = subHeader !== undefined || message !== undefined;
182
- return (h(Host, { key: 'd0c107e0ca78955a3cfcd9f098a527fb35eff14d', class: getIonMode(this) }, h("ion-list", { key: '1e103312e22bf78d2201a0f88cc4fed789f62a2b' }, header !== undefined && h("ion-list-header", { key: '657439905dc480112ed8d7f8d4a01464724de2bd' }, header), hasSubHeaderOrMessage && (h("ion-item", { key: 'e0eaa0250bf233cf846adba5ddc141bf3430c2a8' }, h("ion-label", { key: 'ad1cff877f9d582fbc64f9049603146fd1a1a6f9', class: "ion-text-wrap" }, subHeader !== undefined && h("h3", { key: 'ead921d395b614a99c89a8ffe2a102a620f80767' }, subHeader), message !== undefined && h("p", { key: '3a47e7091528930f33324ccd04d6734217155244' }, message)))), this.renderOptions(options))));
182
+ return (h(Host, { key: '4b4ac4a4b6523147e7c1f5e29dd8043867f2baea', class: getIonMode(this) }, h("ion-list", { key: 'f700d3dc3ce68c20a4d981164b29262564097fb4' }, header !== undefined && h("ion-list-header", { key: '196bcd7963f13ef8bc46231545eee4cb8d526f5e' }, header), hasSubHeaderOrMessage && (h("ion-item", { key: 'bb108e0aa2409997df35f52cb67e58e55e0fd630' }, h("ion-label", { key: '59e8d9196ff976f3835766662654c0f085e58ec3', class: "ion-text-wrap" }, subHeader !== undefined && h("h3", { key: '532f75d7c129ffadca4e6cbb619a4427aaede65c' }, subHeader), message !== undefined && h("p", { key: 'fc42c91594b9001e983cb5e4176fc4c9bff0f708' }, message)))), this.renderOptions(options))));
183
183
  }
184
184
  static get is() { return "ion-select-popover"; }
185
185
  static get encapsulation() { return "scoped"; }
@@ -32,11 +32,11 @@ export class SkeletonText {
32
32
  const animated = this.animated && config.getBoolean('animated', true);
33
33
  const inMedia = hostContext('ion-avatar', this.el) || hostContext('ion-thumbnail', this.el);
34
34
  const mode = getIonMode(this);
35
- return (h(Host, { key: '887d958d982345ce610730ab5c9ae35010430f75', class: {
35
+ return (h(Host, { key: '1114e5caf6419e9458db8256480b39e6989963b2', class: {
36
36
  [mode]: true,
37
37
  'skeleton-text-animated': animated,
38
38
  'in-media': inMedia,
39
- } }, h("span", { key: 'a184f4b9780a2aada0a16729109ac81436e9c9e1' }, "\u00A0")));
39
+ } }, h("span", { key: '9137cf837f163fc0653437fc003666cddac103b0' }, "\u00A0")));
40
40
  }
41
41
  static get is() { return "ion-skeleton-text"; }
42
42
  static get encapsulation() { return "shadow"; }
@@ -51,7 +51,7 @@ export class Spinner {
51
51
  svgs.push(buildLine(spinner, duration, i, spinner.lines));
52
52
  }
53
53
  }
54
- return (h(Host, { key: 'c35ebd01186e860acb9cac260193f0836424fdf4', class: createColorClasses(self.color, {
54
+ return (h(Host, { key: '87102ff9ea58b0ecde5d0978386374f7d0e9cf98', class: createColorClasses(self.color, {
55
55
  [mode]: true,
56
56
  [`spinner-${spinnerName}`]: true,
57
57
  'spinner-paused': self.paused || config.getBoolean('_testing'),
@@ -138,12 +138,12 @@ export class SplitPane {
138
138
  }
139
139
  render() {
140
140
  const mode = getIonMode(this);
141
- return (h(Host, { key: '694e989fafcfe2453e0a83b3cb736efaa1eb4fec', class: {
141
+ return (h(Host, { key: '652bc0965ae962dc36a67fd7129dacaa1ba8e551', class: {
142
142
  [mode]: true,
143
143
  // Used internally for styling
144
144
  [`split-pane-${mode}`]: true,
145
145
  'split-pane-visible': this.visible,
146
- } }, h("slot", { key: 'dde7e9382b62cc11971aa233cf98c2314ae4f720' })));
146
+ } }, h("slot", { key: '9eac85f4c4e33ec00e8e16e2679f5975d7652452' })));
147
147
  }
148
148
  static get is() { return "ion-split-pane"; }
149
149
  static get encapsulation() { return "shadow"; }
@@ -65,10 +65,10 @@ export class Tab {
65
65
  }
66
66
  render() {
67
67
  const { tab, active, component } = this;
68
- return (h(Host, { key: 'b0c7c9eeb322d1c8a4b3e07a331b603a8028fa2f', role: "tabpanel", "aria-hidden": !active ? 'true' : null, "aria-labelledby": `tab-button-${tab}`, class: {
68
+ return (h(Host, { key: '8ecbd7a85d3370ed8ed40561cd8134e71584d6aa', role: "tabpanel", "aria-hidden": !active ? 'true' : null, "aria-labelledby": `tab-button-${tab}`, class: {
69
69
  'ion-page': component === undefined,
70
70
  'tab-hidden': !active,
71
- } }, h("slot", { key: 'd22fc996eff4976c4b37405ed1dd7bcd90e32f2a' })));
71
+ } }, h("slot", { key: '8d6326d75812888e33fd09665b7e588e1e270df1' })));
72
72
  }
73
73
  static get is() { return "ion-tab"; }
74
74
  static get encapsulation() { return "shadow"; }
@@ -105,11 +105,11 @@ export class TabBar {
105
105
  const { color, translucent, keyboardVisible } = this;
106
106
  const mode = getIonMode(this);
107
107
  const shouldHide = keyboardVisible && this.el.getAttribute('slot') !== 'top';
108
- return (h(Host, { key: '148f65df0818e9d220a9b46db74cb89ab94e62d2', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: createColorClasses(color, {
108
+ return (h(Host, { key: '5c56cffd380df7720f3309af7cfca71500817678', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: createColorClasses(color, {
109
109
  [mode]: true,
110
110
  'tab-bar-translucent': translucent,
111
111
  'tab-bar-hidden': shouldHide,
112
- }) }, h("slot", { key: 'a64e235f3703662e2dd7a834f752cc5b1490adbc' })));
112
+ }) }, h("slot", { key: 'a98d3298320f864578e30e0fb79a2cc0cccb46d9' })));
113
113
  }
114
114
  static get is() { return "ion-tab-bar"; }
115
115
  static get encapsulation() { return "shadow"; }
@@ -109,7 +109,7 @@ export class TabButton {
109
109
  rel,
110
110
  target,
111
111
  };
112
- return (h(Host, { key: '1034b5a928ecec49bd8efec3730ea1b11a579cf3', onClick: this.onClick, onKeyup: this.onKeyUp, id: tab !== undefined ? `tab-button-${tab}` : null, class: {
112
+ return (h(Host, { key: '45bb7ffa6d8764202adc2c5c393748d4003e86fe', onClick: this.onClick, onKeyup: this.onKeyUp, id: tab !== undefined ? `tab-button-${tab}` : null, class: {
113
113
  [mode]: true,
114
114
  'tab-selected': selected,
115
115
  'tab-disabled': disabled,
@@ -121,7 +121,7 @@ export class TabButton {
121
121
  'ion-activatable': true,
122
122
  'ion-selectable': true,
123
123
  'ion-focusable': true,
124
- } }, h("a", { key: '4cc8e695425956ffc7622af27c1b88a45f8a0c68', ...attrs, class: "button-native", part: "native", role: "tab", "aria-selected": selected ? 'true' : null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? '-1' : undefined, ...inheritedAttributes }, h("span", { key: 'c529c166f557e1a5c744873c075b564c49786a2c', class: "button-inner" }, h("slot", { key: 'f832355934d80267cd6e81e58b9c5afce0b42907' })), mode === 'md' && h("ion-ripple-effect", { key: '90e79bdf38ba1cd89fca9ce63465e26a29b49316', type: "unbounded" }))));
124
+ } }, h("a", { key: '78c416609a2b86a6e7c5f217ffd2a6b9f80a5103', ...attrs, class: "button-native", part: "native", role: "tab", "aria-selected": selected ? 'true' : null, "aria-disabled": disabled ? 'true' : null, tabindex: disabled ? '-1' : undefined, ...inheritedAttributes }, h("span", { key: '62934156439ffd0ab86674b9cf89d9cfa0d3589c', class: "button-inner" }, h("slot", { key: '293ba8f5ef50373c4e6e492dcaa55b3d2aae8d2f' })), mode === 'md' && h("ion-ripple-effect", { key: '360b010afedcf17fc1f3ab6d192f0f8c7b1cf112', type: "unbounded" }))));
125
125
  }
126
126
  static get is() { return "ion-tab-button"; }
127
127
  static get encapsulation() { return "shadow"; }
@@ -175,7 +175,7 @@ export class Tabs {
175
175
  }
176
176
  };
177
177
  render() {
178
- return (h(Host, { key: 'ba04a29fdd02d7c758cbaa98cfc589949872d832', onIonTabButtonClick: this.onTabClicked }, h("slot", { key: 'd5794140152e2c251e567eeb06afc392af74749d', name: "top" }), h("div", { key: '26fb83786637fe7288901fbbdb3694b8bc94329f', class: "tabs-inner" }, h("slot", { key: '60c663a8647e684455b533eaf5fa3908f9333ae9' })), h("slot", { key: '2d9f7d07c8cdc72f5df200fa71fa56a9dd822c4c', name: "bottom" })));
178
+ return (h(Host, { key: '7b8c6455e0673e343d0c759ed85e0d9970de3bb8', onIonTabButtonClick: this.onTabClicked }, h("slot", { key: '7d0d840ae03312ca22bcb694ffca738d6648218e', name: "top" }), h("div", { key: 'f336d903800af34af0d36adfc94223b940111e6a', class: "tabs-inner" }, h("slot", { key: '14656154959a24ae176eff20f6463043180d2eae' })), h("slot", { key: '2be4d114f058d24b0e70fb12cfb0eccd3d6e6a74', name: "bottom" })));
179
179
  }
180
180
  static get is() { return "ion-tabs"; }
181
181
  static get encapsulation() { return "shadow"; }
@@ -16,9 +16,9 @@ export class Text {
16
16
  color;
17
17
  render() {
18
18
  const mode = getIonMode(this);
19
- return (h(Host, { key: '41ed8da617ed0e07bbfe96e32a000e1c6503e24e', class: createColorClasses(this.color, {
19
+ return (h(Host, { key: 'b6f604df1b7aa5705a5b9a458e669a6a921c02a1', class: createColorClasses(this.color, {
20
20
  [mode]: true,
21
- }) }, h("slot", { key: 'db8de04a2493537b3037f276b03abd92dfa56847' })));
21
+ }) }, h("slot", { key: '055d07b024a6554dfcf959fc8ed7b405e2730af2' })));
22
22
  }
23
23
  static get is() { return "ion-text"; }
24
24
  static get encapsulation() { return "shadow"; }