@ionic/core 8.4.4-dev.11741206641.18dd4e91 → 8.4.4-dev.11741289071.1e8e1c3f

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 (330) hide show
  1. package/components/checkbox.js +5 -37
  2. package/components/helpers.js +11 -1
  3. package/components/index9.js +1 -1
  4. package/components/ion-input.js +2 -2
  5. package/components/ion-segment-button.js +40 -9
  6. package/components/ion-select.js +84 -15
  7. package/components/ion-textarea.js +2 -2
  8. package/dist/cjs/{framework-delegate-55f5683a.js → framework-delegate-05579976.js} +1 -1
  9. package/dist/cjs/{helpers-afaa9001.js → helpers-4be3f90d.js} +11 -0
  10. package/dist/cjs/{index-3652c918.js → index-0ff61d0b.js} +1 -1
  11. package/dist/cjs/{index-e975c92b.js → index-26bb7e42.js} +3 -3
  12. package/dist/cjs/{index-0d762bba.js → index-6770fc00.js} +1 -1
  13. package/dist/cjs/{index-9509ecad.js → index-ad7a712e.js} +1 -1
  14. package/dist/cjs/index.cjs.js +7 -7
  15. package/dist/cjs/{input-shims-cd05268a.js → input-shims-fd997b01.js} +2 -2
  16. package/dist/cjs/{input.utils-ffb2f81b.js → input.utils-c15a1814.js} +1 -1
  17. package/dist/cjs/ion-accordion_2.cjs.entry.js +1 -1
  18. package/dist/cjs/ion-action-sheet.cjs.entry.js +3 -3
  19. package/dist/cjs/ion-alert.cjs.entry.js +3 -3
  20. package/dist/cjs/ion-app_8.cjs.entry.js +8 -8
  21. package/dist/cjs/ion-back-button.cjs.entry.js +1 -1
  22. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +1 -1
  23. package/dist/cjs/ion-button_2.cjs.entry.js +1 -1
  24. package/dist/cjs/ion-card_5.cjs.entry.js +1 -1
  25. package/dist/cjs/ion-checkbox.cjs.entry.js +6 -36
  26. package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
  27. package/dist/cjs/ion-datetime_3.cjs.entry.js +3 -3
  28. package/dist/cjs/ion-fab_3.cjs.entry.js +1 -1
  29. package/dist/cjs/ion-img.cjs.entry.js +1 -1
  30. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -2
  31. package/dist/cjs/ion-input.cjs.entry.js +5 -5
  32. package/dist/cjs/ion-item-option_3.cjs.entry.js +2 -2
  33. package/dist/cjs/ion-item_8.cjs.entry.js +1 -1
  34. package/dist/cjs/ion-loading.cjs.entry.js +3 -3
  35. package/dist/cjs/ion-menu_3.cjs.entry.js +4 -4
  36. package/dist/cjs/ion-modal.cjs.entry.js +5 -5
  37. package/dist/cjs/ion-nav_2.cjs.entry.js +4 -4
  38. package/dist/cjs/ion-picker-column-option.cjs.entry.js +1 -1
  39. package/dist/cjs/ion-picker-column.cjs.entry.js +1 -1
  40. package/dist/cjs/ion-picker.cjs.entry.js +1 -1
  41. package/dist/cjs/ion-popover.cjs.entry.js +4 -4
  42. package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
  43. package/dist/cjs/ion-radio_2.cjs.entry.js +1 -1
  44. package/dist/cjs/ion-range.cjs.entry.js +2 -2
  45. package/dist/cjs/ion-refresher_2.cjs.entry.js +2 -2
  46. package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
  47. package/dist/cjs/ion-route_4.cjs.entry.js +1 -1
  48. package/dist/cjs/ion-searchbar.cjs.entry.js +1 -1
  49. package/dist/cjs/ion-segment_2.cjs.entry.js +40 -9
  50. package/dist/cjs/ion-select-modal.cjs.entry.js +3 -3
  51. package/dist/cjs/ion-select_3.cjs.entry.js +85 -18
  52. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +1 -1
  53. package/dist/cjs/ion-tab_2.cjs.entry.js +2 -2
  54. package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
  55. package/dist/cjs/ion-toast.cjs.entry.js +3 -3
  56. package/dist/cjs/ion-toggle.cjs.entry.js +1 -1
  57. package/dist/cjs/ionic.cjs.js +1 -1
  58. package/dist/cjs/{ios.transition-0e664e88.js → ios.transition-a4f35c55.js} +2 -2
  59. package/dist/cjs/loader.cjs.js +1 -1
  60. package/dist/cjs/{md.transition-2e8aef2c.js → md.transition-cdf904e6.js} +2 -2
  61. package/dist/cjs/{notch-controller-d69150f5.js → notch-controller-a0c464d1.js} +1 -1
  62. package/dist/cjs/{overlays-65fdaff6.js → overlays-86695cf1.js} +2 -2
  63. package/dist/cjs/{status-tap-d74f1429.js → status-tap-1a2485c1.js} +2 -2
  64. package/dist/cjs/{swipe-back-0303a5e4.js → swipe-back-47a52b83.js} +1 -1
  65. package/dist/collection/components/checkbox/checkbox.ios.css +15 -52
  66. package/dist/collection/components/checkbox/checkbox.js +3 -70
  67. package/dist/collection/components/checkbox/checkbox.md.css +15 -52
  68. package/dist/collection/components/input/input.ios.css +3 -2
  69. package/dist/collection/components/input/input.md.css +7 -2
  70. package/dist/collection/components/segment-button/segment-button.js +40 -9
  71. package/dist/collection/components/select/select.ios.css +59 -0
  72. package/dist/collection/components/select/select.js +116 -12
  73. package/dist/collection/components/select/select.md.css +61 -0
  74. package/dist/collection/components/textarea/textarea.ios.css +3 -2
  75. package/dist/collection/components/textarea/textarea.md.css +7 -2
  76. package/dist/collection/utils/helpers.js +10 -0
  77. package/dist/docs.json +73 -73
  78. package/dist/esm/{framework-delegate-63d1a679.js → framework-delegate-f683816e.js} +1 -1
  79. package/dist/esm/{helpers-da915de8.js → helpers-9b49d7d2.js} +11 -1
  80. package/dist/esm/{index-79b30591.js → index-5a0f5fd0.js} +1 -1
  81. package/dist/esm/{index-2f7fde3d.js → index-6a5baab0.js} +3 -3
  82. package/dist/esm/{index-cb21eccb.js → index-7105cd59.js} +1 -1
  83. package/dist/esm/{index-efb8ecdf.js → index-dd0f7395.js} +1 -1
  84. package/dist/esm/index.js +7 -7
  85. package/dist/esm/{input-shims-2fd7c6ef.js → input-shims-dff819a9.js} +2 -2
  86. package/dist/esm/{input.utils-961c9f17.js → input.utils-2f1029cf.js} +1 -1
  87. package/dist/esm/ion-accordion_2.entry.js +1 -1
  88. package/dist/esm/ion-action-sheet.entry.js +3 -3
  89. package/dist/esm/ion-alert.entry.js +3 -3
  90. package/dist/esm/ion-app_8.entry.js +8 -8
  91. package/dist/esm/ion-back-button.entry.js +1 -1
  92. package/dist/esm/ion-breadcrumb_2.entry.js +1 -1
  93. package/dist/esm/ion-button_2.entry.js +1 -1
  94. package/dist/esm/ion-card_5.entry.js +1 -1
  95. package/dist/esm/ion-checkbox.entry.js +6 -36
  96. package/dist/esm/ion-datetime-button.entry.js +1 -1
  97. package/dist/esm/ion-datetime_3.entry.js +3 -3
  98. package/dist/esm/ion-fab_3.entry.js +1 -1
  99. package/dist/esm/ion-img.entry.js +1 -1
  100. package/dist/esm/ion-infinite-scroll_2.entry.js +2 -2
  101. package/dist/esm/ion-input.entry.js +5 -5
  102. package/dist/esm/ion-item-option_3.entry.js +2 -2
  103. package/dist/esm/ion-item_8.entry.js +1 -1
  104. package/dist/esm/ion-loading.entry.js +3 -3
  105. package/dist/esm/ion-menu_3.entry.js +4 -4
  106. package/dist/esm/ion-modal.entry.js +5 -5
  107. package/dist/esm/ion-nav_2.entry.js +4 -4
  108. package/dist/esm/ion-picker-column-option.entry.js +1 -1
  109. package/dist/esm/ion-picker-column.entry.js +1 -1
  110. package/dist/esm/ion-picker.entry.js +1 -1
  111. package/dist/esm/ion-popover.entry.js +4 -4
  112. package/dist/esm/ion-progress-bar.entry.js +1 -1
  113. package/dist/esm/ion-radio_2.entry.js +1 -1
  114. package/dist/esm/ion-range.entry.js +2 -2
  115. package/dist/esm/ion-refresher_2.entry.js +2 -2
  116. package/dist/esm/ion-reorder_2.entry.js +2 -2
  117. package/dist/esm/ion-route_4.entry.js +1 -1
  118. package/dist/esm/ion-searchbar.entry.js +1 -1
  119. package/dist/esm/ion-segment_2.entry.js +40 -9
  120. package/dist/esm/ion-select-modal.entry.js +3 -3
  121. package/dist/esm/ion-select_3.entry.js +85 -18
  122. package/dist/esm/ion-tab-bar_2.entry.js +1 -1
  123. package/dist/esm/ion-tab_2.entry.js +2 -2
  124. package/dist/esm/ion-textarea.entry.js +5 -5
  125. package/dist/esm/ion-toast.entry.js +3 -3
  126. package/dist/esm/ion-toggle.entry.js +1 -1
  127. package/dist/esm/ionic.js +1 -1
  128. package/dist/esm/{ios.transition-b1da3753.js → ios.transition-314468a2.js} +2 -2
  129. package/dist/esm/loader.js +1 -1
  130. package/dist/esm/{md.transition-571b3859.js → md.transition-a560e0e2.js} +2 -2
  131. package/dist/esm/{notch-controller-55b09e11.js → notch-controller-3dc61260.js} +1 -1
  132. package/dist/esm/{overlays-5deab4de.js → overlays-9a81f230.js} +2 -2
  133. package/dist/esm/{status-tap-79eac0ac.js → status-tap-d07dbc82.js} +2 -2
  134. package/dist/esm/{swipe-back-e5394307.js → swipe-back-23ee7ab1.js} +1 -1
  135. package/dist/esm-es5/{framework-delegate-63d1a679.js → framework-delegate-f683816e.js} +1 -1
  136. package/dist/esm-es5/{helpers-da915de8.js → helpers-9b49d7d2.js} +1 -1
  137. package/dist/esm-es5/{index-79b30591.js → index-5a0f5fd0.js} +1 -1
  138. package/dist/esm-es5/{index-2f7fde3d.js → index-6a5baab0.js} +1 -1
  139. package/dist/esm-es5/{index-cb21eccb.js → index-7105cd59.js} +1 -1
  140. package/dist/esm-es5/{index-efb8ecdf.js → index-dd0f7395.js} +1 -1
  141. package/dist/esm-es5/index.js +1 -1
  142. package/dist/esm-es5/{input-shims-2fd7c6ef.js → input-shims-dff819a9.js} +1 -1
  143. package/dist/esm-es5/{input.utils-961c9f17.js → input.utils-2f1029cf.js} +1 -1
  144. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  145. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  146. package/dist/esm-es5/ion-alert.entry.js +1 -1
  147. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  148. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  149. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  150. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  151. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  152. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  153. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  154. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  155. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  156. package/dist/esm-es5/ion-img.entry.js +1 -1
  157. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  158. package/dist/esm-es5/ion-input.entry.js +1 -1
  159. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  160. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  161. package/dist/esm-es5/ion-loading.entry.js +1 -1
  162. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  163. package/dist/esm-es5/ion-modal.entry.js +1 -1
  164. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  165. package/dist/esm-es5/ion-picker-column-option.entry.js +1 -1
  166. package/dist/esm-es5/ion-picker-column.entry.js +1 -1
  167. package/dist/esm-es5/ion-picker.entry.js +1 -1
  168. package/dist/esm-es5/ion-popover.entry.js +1 -1
  169. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  170. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  171. package/dist/esm-es5/ion-range.entry.js +1 -1
  172. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  173. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  174. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  175. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  176. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  177. package/dist/esm-es5/ion-select-modal.entry.js +1 -1
  178. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  179. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  180. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  181. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  182. package/dist/esm-es5/ion-toast.entry.js +1 -1
  183. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  184. package/dist/esm-es5/ionic.js +1 -1
  185. package/dist/esm-es5/{ios.transition-b1da3753.js → ios.transition-314468a2.js} +1 -1
  186. package/dist/esm-es5/loader.js +1 -1
  187. package/dist/esm-es5/md.transition-a560e0e2.js +4 -0
  188. package/dist/esm-es5/{notch-controller-55b09e11.js → notch-controller-3dc61260.js} +1 -1
  189. package/dist/esm-es5/{overlays-5deab4de.js → overlays-9a81f230.js} +1 -1
  190. package/dist/esm-es5/{status-tap-79eac0ac.js → status-tap-d07dbc82.js} +1 -1
  191. package/dist/esm-es5/{swipe-back-e5394307.js → swipe-back-23ee7ab1.js} +1 -1
  192. package/dist/html.html-data.json +8 -8
  193. package/dist/ionic/index.esm.js +1 -1
  194. package/dist/ionic/ionic.esm.js +1 -1
  195. package/dist/ionic/{p-937a7e21.entry.js → p-02e23f26.entry.js} +1 -1
  196. package/dist/ionic/{p-9b428d25.entry.js → p-037fc3f3.entry.js} +1 -1
  197. package/dist/ionic/p-04e08129.entry.js +4 -0
  198. package/dist/ionic/{p-b3c60433.system.js → p-058e61eb.system.js} +1 -1
  199. package/dist/ionic/{p-bdf2cb2e.system.entry.js → p-0bfffa34.system.entry.js} +1 -1
  200. package/dist/ionic/{p-7ed1657c.system.entry.js → p-0eb2553a.system.entry.js} +1 -1
  201. package/dist/ionic/{p-9b122e3c.system.entry.js → p-10327ad2.system.entry.js} +1 -1
  202. package/dist/ionic/{p-f63c2d12.entry.js → p-155c2bb0.entry.js} +1 -1
  203. package/dist/ionic/{p-a8f2c254.entry.js → p-155f4d90.entry.js} +1 -1
  204. package/dist/ionic/{p-2346ab53.system.entry.js → p-18e101b7.system.entry.js} +1 -1
  205. package/dist/ionic/p-1f405274.js +4 -0
  206. package/dist/ionic/p-21227121.js +4 -0
  207. package/dist/ionic/{p-7513b0c4.js → p-22149a4f.js} +1 -1
  208. package/dist/ionic/{p-2b838f86.system.entry.js → p-2515cb4d.system.entry.js} +1 -1
  209. package/dist/ionic/{p-de930745.entry.js → p-265939f0.entry.js} +1 -1
  210. package/dist/ionic/{p-34b11c24.js → p-2bc73fb5.js} +1 -1
  211. package/dist/ionic/p-2c9eb774.system.js +4 -0
  212. package/dist/ionic/{p-61db139d.entry.js → p-2cbe5399.entry.js} +1 -1
  213. package/dist/ionic/{p-2e46590d.system.entry.js → p-2ef3c7ee.system.entry.js} +1 -1
  214. package/dist/ionic/{p-cba1f9bc.system.entry.js → p-31a6efce.system.entry.js} +1 -1
  215. package/dist/ionic/p-322c5fb4.system.js +1 -1
  216. package/dist/ionic/{p-0430c2e0.entry.js → p-34479cfb.entry.js} +1 -1
  217. package/dist/ionic/p-346b2baf.js +4 -0
  218. package/dist/ionic/{p-b1eb86fd.entry.js → p-36c448fe.entry.js} +1 -1
  219. package/dist/ionic/{p-1ab13b2b.js → p-39dd4f62.js} +1 -1
  220. package/dist/ionic/p-4129228f.system.entry.js +4 -0
  221. package/dist/ionic/{p-9df2c6fb.entry.js → p-41780810.entry.js} +1 -1
  222. package/dist/ionic/{p-577bc414.entry.js → p-42c9deb1.entry.js} +1 -1
  223. package/dist/ionic/{p-a15ddedb.system.js → p-4452a8ac.system.js} +1 -1
  224. package/dist/ionic/{p-933727f9.system.entry.js → p-484d855b.system.entry.js} +2 -2
  225. package/dist/ionic/{p-52d7a191.entry.js → p-4ad78edc.entry.js} +1 -1
  226. package/dist/ionic/{p-28706c6f.js → p-4d3a5f86.js} +1 -1
  227. package/dist/ionic/{p-6933c482.system.entry.js → p-4d413973.system.entry.js} +1 -1
  228. package/dist/ionic/{p-74e3f0af.system.entry.js → p-5010643d.system.entry.js} +2 -2
  229. package/dist/ionic/{p-19ea7bff.system.js → p-5126cf1e.system.js} +1 -1
  230. package/dist/ionic/p-52245809.js +4 -0
  231. package/dist/ionic/p-56da53ad.system.entry.js +4 -0
  232. package/dist/ionic/{p-a88dec0d.system.js → p-578efda4.system.js} +1 -1
  233. package/dist/ionic/{p-a0eb506c.system.entry.js → p-5882bffa.system.entry.js} +1 -1
  234. package/dist/ionic/p-5c47ebbd.system.entry.js +4 -0
  235. package/dist/ionic/{p-a3db8ee3.js → p-5c9324c6.js} +1 -1
  236. package/dist/ionic/{p-6d6cedc5.entry.js → p-6190d0d6.entry.js} +1 -1
  237. package/dist/ionic/{p-ab674093.system.entry.js → p-63c09585.system.entry.js} +1 -1
  238. package/dist/ionic/{p-585b455c.system.entry.js → p-65346408.system.entry.js} +1 -1
  239. package/dist/ionic/{p-a4a2420e.system.entry.js → p-655723eb.system.entry.js} +1 -1
  240. package/dist/ionic/{p-120fb79a.entry.js → p-70af0afb.entry.js} +1 -1
  241. package/dist/ionic/{p-7ddc46c3.system.entry.js → p-70ccc275.system.entry.js} +1 -1
  242. package/dist/ionic/p-712fedc9.entry.js +4 -0
  243. package/dist/ionic/{p-5c9eb9af.entry.js → p-72ec9a26.entry.js} +1 -1
  244. package/dist/ionic/{p-0eb35a7f.system.js → p-73897169.system.js} +1 -1
  245. package/dist/ionic/{p-98ff6b32.entry.js → p-76446a85.entry.js} +1 -1
  246. package/dist/ionic/{p-98231c01.system.entry.js → p-77e7b7b6.system.entry.js} +1 -1
  247. package/dist/ionic/{p-72812e99.js → p-7a1766d6.js} +1 -1
  248. package/dist/ionic/{p-16188af7.entry.js → p-7b98cebe.entry.js} +1 -1
  249. package/dist/ionic/{p-fceec762.entry.js → p-80c6d619.entry.js} +1 -1
  250. package/dist/ionic/{p-1e67b266.system.entry.js → p-84d08aae.system.entry.js} +1 -1
  251. package/dist/ionic/{p-7de1e42c.system.js → p-860eb968.system.js} +1 -1
  252. package/dist/ionic/{p-7a02f476.entry.js → p-8818edd8.entry.js} +1 -1
  253. package/dist/ionic/{p-c4238c12.system.js → p-8e407469.system.js} +1 -1
  254. package/dist/ionic/{p-567de071.system.entry.js → p-92365bc1.system.entry.js} +1 -1
  255. package/dist/ionic/{p-f1120724.system.entry.js → p-93e3654c.system.entry.js} +1 -1
  256. package/dist/ionic/{p-d7aa6b00.entry.js → p-955c3eb8.entry.js} +1 -1
  257. package/dist/ionic/{p-8635f5e6.system.js → p-95da3ae2.system.js} +1 -1
  258. package/dist/ionic/{p-b6efeab8.js → p-990630ca.js} +1 -1
  259. package/dist/ionic/{p-92763d3d.entry.js → p-9962f63f.entry.js} +1 -1
  260. package/dist/ionic/p-9a100adc.entry.js +4 -0
  261. package/dist/ionic/{p-b9d7015f.entry.js → p-9b3bb24e.entry.js} +1 -1
  262. package/dist/ionic/{p-f1060cd8.entry.js → p-9de5c787.entry.js} +1 -1
  263. package/dist/ionic/{p-e3171ff3.entry.js → p-a18470c6.entry.js} +1 -1
  264. package/dist/ionic/{p-e06057c9.entry.js → p-a5b31c0f.entry.js} +1 -1
  265. package/dist/ionic/{p-01186920.system.entry.js → p-a9e24ae2.system.entry.js} +1 -1
  266. package/dist/ionic/{p-5c08627a.system.js → p-acb30a5c.system.js} +1 -1
  267. package/dist/ionic/p-acc8399c.system.entry.js +4 -0
  268. package/dist/ionic/p-af09741c.entry.js +4 -0
  269. package/dist/ionic/{p-d22e2a38.system.js → p-af452fa4.system.js} +1 -1
  270. package/dist/ionic/{p-e09d6392.system.entry.js → p-af744710.system.entry.js} +1 -1
  271. package/dist/ionic/{p-3ad285e3.system.js → p-b3680e2f.system.js} +1 -1
  272. package/dist/ionic/p-b936eb7e.system.entry.js +4 -0
  273. package/dist/ionic/{p-b51e4004.js → p-bb11d9fb.js} +1 -1
  274. package/dist/ionic/{p-081a4ce4.entry.js → p-bb2a6761.entry.js} +1 -1
  275. package/dist/ionic/{p-948e6c6a.entry.js → p-bc616455.entry.js} +1 -1
  276. package/dist/ionic/{p-bb0db172.entry.js → p-c32644d7.entry.js} +1 -1
  277. package/dist/ionic/{p-4c98e2cf.system.js → p-c3802319.system.js} +1 -1
  278. package/dist/ionic/{p-c41ac815.entry.js → p-c8d645b3.entry.js} +1 -1
  279. package/dist/ionic/{p-f1c4dcd4.js → p-c935cfc9.js} +1 -1
  280. package/dist/ionic/p-d0546368.entry.js +4 -0
  281. package/dist/ionic/{p-6dfb0f39.system.entry.js → p-d1172fe3.system.entry.js} +1 -1
  282. package/dist/ionic/{p-3cc276f4.js → p-d4ca0475.js} +1 -1
  283. package/dist/ionic/{p-7a6eaf9e.entry.js → p-d7bb5325.entry.js} +1 -1
  284. package/dist/ionic/{p-a090bce8.system.entry.js → p-d821466d.system.entry.js} +1 -1
  285. package/dist/ionic/{p-ada36597.system.js → p-d99e8644.system.js} +1 -1
  286. package/dist/ionic/{p-58d5df0c.system.entry.js → p-da8ef548.system.entry.js} +1 -1
  287. package/dist/ionic/{p-985a7e17.system.entry.js → p-dc146a2a.system.entry.js} +1 -1
  288. package/dist/ionic/{p-cac0e0b3.system.entry.js → p-dd0c9350.system.entry.js} +1 -1
  289. package/dist/ionic/p-df862603.entry.js +4 -0
  290. package/dist/ionic/{p-2172893e.system.entry.js → p-e2e19375.system.entry.js} +1 -1
  291. package/dist/ionic/{p-05b74e45.system.entry.js → p-e32557bb.system.entry.js} +1 -1
  292. package/dist/ionic/{p-2da9c8a7.entry.js → p-e5849f8d.entry.js} +1 -1
  293. package/dist/ionic/{p-15e76dd1.entry.js → p-e8f34871.entry.js} +1 -1
  294. package/dist/ionic/{p-d6eaffb1.system.entry.js → p-eeb5cb45.system.entry.js} +2 -2
  295. package/dist/ionic/{p-744c8672.system.entry.js → p-efbf5af5.system.entry.js} +1 -1
  296. package/dist/ionic/{p-e6376b93.system.entry.js → p-f2613334.system.entry.js} +1 -1
  297. package/dist/ionic/{p-e4ee80be.system.entry.js → p-f301a694.system.entry.js} +1 -1
  298. package/dist/ionic/{p-fbd41a7e.system.entry.js → p-f56752be.system.entry.js} +1 -1
  299. package/dist/ionic/{p-e76dae93.entry.js → p-f5d6624d.entry.js} +1 -1
  300. package/dist/ionic/{p-797eeea8.system.entry.js → p-f78af648.system.entry.js} +1 -1
  301. package/dist/ionic/{p-63b0abde.system.entry.js → p-f89cf011.system.entry.js} +1 -1
  302. package/dist/ionic/p-fbf86e62.system.js +4 -0
  303. package/dist/ionic/{p-7b9a2b23.entry.js → p-fca17935.entry.js} +1 -1
  304. package/dist/ionic/{p-eef505e8.entry.js → p-fec13c57.entry.js} +1 -1
  305. package/dist/types/components/checkbox/checkbox.d.ts +0 -19
  306. package/dist/types/components/segment-button/segment-button.d.ts +2 -1
  307. package/dist/types/components/select/select.d.ts +23 -0
  308. package/dist/types/components.d.ts +16 -16
  309. package/dist/types/utils/helpers.d.ts +1 -0
  310. package/hydrate/index.js +144 -66
  311. package/hydrate/index.mjs +144 -66
  312. package/package.json +2 -2
  313. package/dist/esm-es5/md.transition-571b3859.js +0 -4
  314. package/dist/ionic/p-0af823e1.js +0 -4
  315. package/dist/ionic/p-1132ffee.entry.js +0 -4
  316. package/dist/ionic/p-15d18206.entry.js +0 -4
  317. package/dist/ionic/p-248318e0.system.entry.js +0 -4
  318. package/dist/ionic/p-302b50bb.system.entry.js +0 -4
  319. package/dist/ionic/p-4c2d5b80.system.js +0 -4
  320. package/dist/ionic/p-4ec778aa.entry.js +0 -4
  321. package/dist/ionic/p-72bc8a1c.js +0 -4
  322. package/dist/ionic/p-8694928f.entry.js +0 -4
  323. package/dist/ionic/p-9343a445.js +0 -4
  324. package/dist/ionic/p-9f364443.system.entry.js +0 -4
  325. package/dist/ionic/p-c4b53b16.system.entry.js +0 -4
  326. package/dist/ionic/p-cb13696c.js +0 -4
  327. package/dist/ionic/p-cdc83025.entry.js +0 -4
  328. package/dist/ionic/p-d1c5b60e.system.js +0 -4
  329. package/dist/ionic/p-d7dd8fb1.entry.js +0 -4
  330. package/dist/ionic/p-e4fde4fb.system.entry.js +0 -4
@@ -2,7 +2,7 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Host, forceUpdate, h } from "@stencil/core";
5
- import { addEventListener, removeEventListener, inheritAttributes } from "../../utils/helpers";
5
+ import { addEventListener, removeEventListener, inheritAttributes, getNextSiblingOfType } from "../../utils/helpers";
6
6
  import { hostContext } from "../../utils/theme";
7
7
  import { getIonMode } from "../../global/ionic-global";
8
8
  let ids = 0;
@@ -39,7 +39,35 @@ export class SegmentButton {
39
39
  valueChanged() {
40
40
  this.updateState();
41
41
  }
42
- connectedCallback() {
42
+ waitForSegmentContent(ionSegment, contentId) {
43
+ return new Promise((resolve, reject) => {
44
+ let timeoutId = undefined;
45
+ let animationFrameId;
46
+ const check = () => {
47
+ if (!ionSegment) {
48
+ reject(new Error(`Segment not found when looking for Segment Content`));
49
+ return;
50
+ }
51
+ const segmentView = getNextSiblingOfType(ionSegment); // Skip the text nodes
52
+ const segmentContent = segmentView === null || segmentView === void 0 ? void 0 : segmentView.querySelector(`ion-segment-content[id="${contentId}"]`);
53
+ if (segmentContent && timeoutId) {
54
+ clearTimeout(timeoutId); // Clear the timeout if the segmentContent is found
55
+ cancelAnimationFrame(animationFrameId);
56
+ resolve(segmentContent);
57
+ }
58
+ else {
59
+ animationFrameId = requestAnimationFrame(check); // Keep checking on the next animation frame
60
+ }
61
+ };
62
+ check();
63
+ // Set a timeout to reject the promise
64
+ timeoutId = setTimeout(() => {
65
+ cancelAnimationFrame(animationFrameId);
66
+ reject(new Error(`Unable to find Segment Content with id="${contentId} within 1000 ms`));
67
+ }, 1000);
68
+ });
69
+ }
70
+ async connectedCallback() {
43
71
  const segmentEl = (this.segmentEl = this.el.closest('ion-segment'));
44
72
  if (segmentEl) {
45
73
  this.updateState();
@@ -49,11 +77,14 @@ export class SegmentButton {
49
77
  // Return if there is no contentId defined
50
78
  if (!this.contentId)
51
79
  return;
52
- // Attempt to find the Segment Content by its contentId
53
- const segmentContent = document.getElementById(this.contentId);
54
- // If no associated Segment Content exists, log an error and return
55
- if (!segmentContent) {
56
- console.error(`Segment Button: Unable to find Segment Content with id="${this.contentId}".`);
80
+ let segmentContent;
81
+ try {
82
+ // Attempt to find the Segment Content by its contentId
83
+ segmentContent = await this.waitForSegmentContent(segmentEl, this.contentId);
84
+ }
85
+ catch (error) {
86
+ // If no associated Segment Content exists, log an error and return
87
+ console.error('Segment Button: ', error.message);
57
88
  return;
58
89
  }
59
90
  // Ensure the found element is a valid ION-SEGMENT-CONTENT
@@ -99,7 +130,7 @@ export class SegmentButton {
99
130
  const { checked, type, disabled, hasIcon, hasLabel, layout, segmentEl } = this;
100
131
  const mode = getIonMode(this);
101
132
  const hasSegmentColor = () => (segmentEl === null || segmentEl === void 0 ? void 0 : segmentEl.color) !== undefined;
102
- return (h(Host, { key: 'd50a5d5e2f6206e8523598f258d8217d2903f69b', class: {
133
+ return (h(Host, { key: 'f9da656c8eccb80e4ef30e3fa977f2dbbefbc988', class: {
103
134
  [mode]: true,
104
135
  'in-toolbar': hostContext('ion-toolbar', this.el),
105
136
  'in-toolbar-color': hostContext('ion-toolbar[color]', this.el),
@@ -115,7 +146,7 @@ export class SegmentButton {
115
146
  'ion-activatable': true,
116
147
  'ion-activatable-instant': true,
117
148
  'ion-focusable': true,
118
- } }, h("button", Object.assign({ key: 'b4f6f145286ba8ab79669e11035b906daa85ae7e', "aria-selected": checked ? 'true' : 'false', role: "tab", ref: (el) => (this.nativeEl = el), type: type, class: "button-native", part: "native", disabled: disabled }, this.inheritedAttributes), h("span", { key: '67965996c9ffe70553875e00d3da0ae5b2b1d814', class: "button-inner" }, h("slot", { key: '5087988fe45a8fdf388ec44c395d0b745b207806' })), mode === 'md' && h("ion-ripple-effect", { key: 'b24858de0750bbc769b3183fac0077dfe817ba27' })), h("div", { key: '97b4359432acd1c9da0816360cd1df9472e183f7', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, h("div", { key: '0561738ea15b0986f4ed3d8276d5e6f2d13f7e51', part: "indicator-background", class: "segment-button-indicator-background" }))));
149
+ } }, h("button", Object.assign({ key: '00dbcdbd81cd74abdd39803f6840a6e477cc7b0c', "aria-selected": checked ? 'true' : 'false', role: "tab", ref: (el) => (this.nativeEl = el), type: type, class: "button-native", part: "native", disabled: disabled }, this.inheritedAttributes), h("span", { key: '5200c082a9c4788010c4fc33fe75e2b2ad28364a', class: "button-inner" }, h("slot", { key: 'cf3fce2b5d22436b84cd4367a5885df7d6a2715f' })), mode === 'md' && h("ion-ripple-effect", { key: 'f1a2816465f4c2c06644be07315bff2da77e2342' })), h("div", { key: 'aaf31c0ed39641fca698ee98d0773131f4eea6bd', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, h("div", { key: 'fc556651361b7ac305aaedd25ea4afe3173abd20', part: "indicator-background", class: "segment-button-indicator-background" }))));
119
150
  }
120
151
  static get is() { return "ion-segment-button"; }
121
152
  static get encapsulation() { return "shadow"; }
@@ -299,6 +299,63 @@ button {
299
299
  --highlight-color: var(--highlight-color-valid);
300
300
  }
301
301
 
302
+ .select-bottom {
303
+ /**
304
+ * The bottom content should take on the start and end
305
+ * padding so it is always aligned with either the label
306
+ * or the start of the text select.
307
+ */
308
+ -webkit-padding-start: var(--padding-start);
309
+ padding-inline-start: var(--padding-start);
310
+ -webkit-padding-end: var(--padding-end);
311
+ padding-inline-end: var(--padding-end);
312
+ padding-top: 5px;
313
+ padding-bottom: 0;
314
+ display: flex;
315
+ justify-content: space-between;
316
+ border-top: var(--border-width) var(--border-style) var(--border-color);
317
+ font-size: 0.75rem;
318
+ white-space: normal;
319
+ }
320
+
321
+ /**
322
+ * If the select has a validity state, the
323
+ * border and label should reflect that as a color.
324
+ * The invalid state should show if the select is
325
+ * invalid and has already been touched.
326
+ * The valid state should show if the select
327
+ * is valid, has already been touched, and
328
+ * is currently focused. Do not show the valid
329
+ * highlight when the select is blurred.
330
+ */
331
+ :host(.has-focus.ion-valid),
332
+ :host(.ion-touched.ion-invalid) {
333
+ --border-color: var(--highlight-color);
334
+ }
335
+
336
+ /**
337
+ * Error text should only be shown when .ion-invalid is
338
+ * present on the select. Otherwise the helper text should
339
+ * be shown.
340
+ */
341
+ .select-bottom .error-text {
342
+ display: none;
343
+ color: var(--highlight-color-invalid);
344
+ }
345
+
346
+ .select-bottom .helper-text {
347
+ display: block;
348
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
349
+ }
350
+
351
+ :host(.ion-touched.ion-invalid) .select-bottom .error-text {
352
+ display: block;
353
+ }
354
+
355
+ :host(.ion-touched.ion-invalid) .select-bottom .helper-text {
356
+ display: none;
357
+ }
358
+
302
359
  .label-text-wrapper {
303
360
  /**
304
361
  * This causes the label to take up
@@ -686,6 +743,8 @@ button {
686
743
  * }
687
744
  */
688
745
  :host {
746
+ --border-width: 0.55px;
747
+ --border-color: var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-250, var(--ion-background-color-step-250, #c8c7cc))));
689
748
  --highlight-height: 0px;
690
749
  }
691
750
 
@@ -23,10 +23,15 @@ import { getIonMode } from "../../global/ionic-global";
23
23
  * @part icon - The select icon container.
24
24
  * @part container - The container for the selected text or placeholder.
25
25
  * @part label - The label text describing the select.
26
+ * @part supporting-text - Supporting text displayed beneath the select.
27
+ * @part helper-text - Supporting text displayed beneath the select when the select is valid.
28
+ * @part error-text - Supporting text displayed beneath the select when the select is invalid and touched.
26
29
  */
27
30
  export class Select {
28
31
  constructor() {
29
32
  this.inputId = `ion-sel-${selectIds++}`;
33
+ this.helperTextId = `${this.inputId}-helper-text`;
34
+ this.errorTextId = `${this.inputId}-error-text`;
30
35
  this.inheritedAttributes = {};
31
36
  this.onClick = (ev) => {
32
37
  const target = ev.target;
@@ -77,6 +82,8 @@ export class Select {
77
82
  this.compareWith = undefined;
78
83
  this.disabled = false;
79
84
  this.fill = undefined;
85
+ this.errorText = undefined;
86
+ this.helperText = undefined;
80
87
  this.interface = 'alert';
81
88
  this.interfaceOptions = {};
82
89
  this.justify = undefined;
@@ -154,15 +161,8 @@ export class Select {
154
161
  }
155
162
  this.isExpanded = true;
156
163
  const overlay = (this.overlay = await this.createOverlay(event));
157
- overlay.onDidDismiss().then(() => {
158
- this.overlay = undefined;
159
- this.isExpanded = false;
160
- this.ionDismiss.emit();
161
- this.setFocus();
162
- });
163
- await overlay.present();
164
- // focus selected option for popovers and modals
165
- if (this.interface === 'popover' || this.interface === 'modal') {
164
+ // Add logic to scroll selected item into view before presenting
165
+ const scrollSelectedIntoView = () => {
166
166
  const indexOfSelected = this.childOpts.findIndex((o) => o.value === this.value);
167
167
  if (indexOfSelected > -1) {
168
168
  const selectedItem = overlay.querySelector(`.select-interface-option:nth-child(${indexOfSelected + 1})`);
@@ -180,6 +180,7 @@ export class Select {
180
180
  */
181
181
  const interactiveEl = selectedItem.querySelector('ion-radio, ion-checkbox');
182
182
  if (interactiveEl) {
183
+ selectedItem.scrollIntoView({ block: 'nearest' });
183
184
  // Needs to be called before `focusVisibleElement` to prevent issue with focus event bubbling
184
185
  // and removing `ion-focused` style
185
186
  interactiveEl.setFocus();
@@ -203,7 +204,40 @@ export class Select {
203
204
  focusVisibleElement(firstEnabledOption.closest('ion-item'));
204
205
  }
205
206
  }
207
+ };
208
+ // For modals and popovers, we can scroll before they're visible
209
+ if (this.interface === 'modal') {
210
+ overlay.addEventListener('ionModalWillPresent', scrollSelectedIntoView, { once: true });
211
+ }
212
+ else if (this.interface === 'popover') {
213
+ overlay.addEventListener('ionPopoverWillPresent', scrollSelectedIntoView, { once: true });
206
214
  }
215
+ else {
216
+ /**
217
+ * For alerts and action sheets, we need to wait a frame after willPresent
218
+ * because these overlays don't have their content in the DOM immediately
219
+ * when willPresent fires. By waiting a frame, we ensure the content is
220
+ * rendered and can be properly scrolled into view.
221
+ */
222
+ const scrollAfterRender = () => {
223
+ requestAnimationFrame(() => {
224
+ scrollSelectedIntoView();
225
+ });
226
+ };
227
+ if (this.interface === 'alert') {
228
+ overlay.addEventListener('ionAlertWillPresent', scrollAfterRender, { once: true });
229
+ }
230
+ else if (this.interface === 'action-sheet') {
231
+ overlay.addEventListener('ionActionSheetWillPresent', scrollAfterRender, { once: true });
232
+ }
233
+ }
234
+ overlay.onDidDismiss().then(() => {
235
+ this.overlay = undefined;
236
+ this.isExpanded = false;
237
+ this.ionDismiss.emit();
238
+ this.setFocus();
239
+ });
240
+ await overlay.present();
207
241
  return overlay;
208
242
  }
209
243
  createOverlay(ev) {
@@ -630,7 +664,43 @@ export class Select {
630
664
  }
631
665
  renderListbox() {
632
666
  const { disabled, inputId, isExpanded, required } = this;
633
- return (h("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
667
+ return (h("button", { disabled: disabled, id: inputId, "aria-label": this.ariaLabel, "aria-haspopup": "dialog", "aria-expanded": `${isExpanded}`, "aria-describedby": this.getHintTextID(), "aria-invalid": this.getHintTextID() === this.errorTextId, "aria-required": `${required}`, onFocus: this.onFocus, onBlur: this.onBlur, ref: (focusEl) => (this.focusEl = focusEl) }));
668
+ }
669
+ getHintTextID() {
670
+ const { el, helperText, errorText, helperTextId, errorTextId } = this;
671
+ if (el.classList.contains('ion-touched') && el.classList.contains('ion-invalid') && errorText) {
672
+ return errorTextId;
673
+ }
674
+ if (helperText) {
675
+ return helperTextId;
676
+ }
677
+ return undefined;
678
+ }
679
+ /**
680
+ * Renders the helper text or error text values
681
+ */
682
+ renderHintText() {
683
+ const { helperText, errorText, helperTextId, errorTextId } = this;
684
+ return [
685
+ h("div", { id: helperTextId, class: "helper-text", part: "supporting-text helper-text" }, helperText),
686
+ h("div", { id: errorTextId, class: "error-text", part: "supporting-text error-text" }, errorText),
687
+ ];
688
+ }
689
+ /**
690
+ * Responsible for rendering helper text, and error text. This element
691
+ * should only be rendered if hint text is set.
692
+ */
693
+ renderBottomContent() {
694
+ const { helperText, errorText } = this;
695
+ /**
696
+ * undefined and empty string values should
697
+ * be treated as not having helper/error text.
698
+ */
699
+ const hasHintText = !!helperText || !!errorText;
700
+ if (!hasHintText) {
701
+ return;
702
+ }
703
+ return h("div", { class: "select-bottom" }, this.renderHintText());
634
704
  }
635
705
  render() {
636
706
  const { disabled, el, isExpanded, expandedIcon, labelPlacement, justify, placeholder, fill, shape, name, value } = this;
@@ -661,7 +731,7 @@ export class Select {
661
731
  * TODO(FW-5592): Remove hasStartEndSlots condition
662
732
  */
663
733
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
664
- return (h(Host, { key: '491cf1b0e3aa31e7c9cfad3e87d83eb54272312a', onClick: this.onClick, class: createColorClasses(this.color, {
734
+ return (h(Host, { key: '6c0141f40087a1793516882641e4473a6a82a0b2', onClick: this.onClick, class: createColorClasses(this.color, {
665
735
  [mode]: true,
666
736
  'in-item': inItem,
667
737
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -677,7 +747,7 @@ export class Select {
677
747
  [`select-justify-${justify}`]: justifyEnabled,
678
748
  [`select-shape-${shape}`]: shape !== undefined,
679
749
  [`select-label-placement-${labelPlacement}`]: true,
680
- }) }, h("label", { key: '07bf3cb57bd1121383d8c746e3ac49da38300082', class: "select-wrapper", id: "select-label" }, this.renderLabelContainer(), h("div", { key: '884facd18342797576bbacc761d18d83c52762e3', class: "select-wrapper-inner" }, h("slot", { key: 'c4f2a2a7a76f52db15f9a0b806017caea443c47a', name: "start" }), h("div", { key: '235cf383f268cc74412722cd31e246cbd4c2abe5', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '1481302e11c494d49dfd80a7aaf743f7e851558f', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '8a45ea9280651695c8e5435f266c286f3e3f6a18', class: "select-highlight" }))));
750
+ }) }, h("label", { key: 'a0d70c7cfb6c784f200e9b0893ddcbd25b59b167', class: "select-wrapper", id: "select-label" }, this.renderLabelContainer(), h("div", { key: 'd398f85e1c3af2758cf0672ce8eab1ffa1e3e6a8', class: "select-wrapper-inner" }, h("slot", { key: 'b2ba9dbc8b944c04981b5f97975231a4b1c18768', name: "start" }), h("div", { key: '625c1029456701694f521a9b3e2199a8fd6c3331', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '54bee045845d773e11f8952b9278c97082534488', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: 'cf70509d4140259a41367333ca3815a427f9ad66', class: "select-highlight" })), this.renderBottomContent()));
681
751
  }
682
752
  static get is() { return "ion-select"; }
683
753
  static get encapsulation() { return "shadow"; }
@@ -794,6 +864,40 @@ export class Select {
794
864
  "attribute": "fill",
795
865
  "reflect": false
796
866
  },
867
+ "errorText": {
868
+ "type": "string",
869
+ "mutable": false,
870
+ "complexType": {
871
+ "original": "string",
872
+ "resolved": "string | undefined",
873
+ "references": {}
874
+ },
875
+ "required": false,
876
+ "optional": true,
877
+ "docs": {
878
+ "tags": [],
879
+ "text": "Text that is placed under the select and displayed when an error is detected."
880
+ },
881
+ "attribute": "error-text",
882
+ "reflect": false
883
+ },
884
+ "helperText": {
885
+ "type": "string",
886
+ "mutable": false,
887
+ "complexType": {
888
+ "original": "string",
889
+ "resolved": "string | undefined",
890
+ "references": {}
891
+ },
892
+ "required": false,
893
+ "optional": true,
894
+ "docs": {
895
+ "tags": [],
896
+ "text": "Text that is placed under the select and displayed when no error is detected."
897
+ },
898
+ "attribute": "helper-text",
899
+ "reflect": false
900
+ },
797
901
  "interface": {
798
902
  "type": "string",
799
903
  "mutable": false,
@@ -299,6 +299,63 @@ button {
299
299
  --highlight-color: var(--highlight-color-valid);
300
300
  }
301
301
 
302
+ .select-bottom {
303
+ /**
304
+ * The bottom content should take on the start and end
305
+ * padding so it is always aligned with either the label
306
+ * or the start of the text select.
307
+ */
308
+ -webkit-padding-start: var(--padding-start);
309
+ padding-inline-start: var(--padding-start);
310
+ -webkit-padding-end: var(--padding-end);
311
+ padding-inline-end: var(--padding-end);
312
+ padding-top: 5px;
313
+ padding-bottom: 0;
314
+ display: flex;
315
+ justify-content: space-between;
316
+ border-top: var(--border-width) var(--border-style) var(--border-color);
317
+ font-size: 0.75rem;
318
+ white-space: normal;
319
+ }
320
+
321
+ /**
322
+ * If the select has a validity state, the
323
+ * border and label should reflect that as a color.
324
+ * The invalid state should show if the select is
325
+ * invalid and has already been touched.
326
+ * The valid state should show if the select
327
+ * is valid, has already been touched, and
328
+ * is currently focused. Do not show the valid
329
+ * highlight when the select is blurred.
330
+ */
331
+ :host(.has-focus.ion-valid),
332
+ :host(.ion-touched.ion-invalid) {
333
+ --border-color: var(--highlight-color);
334
+ }
335
+
336
+ /**
337
+ * Error text should only be shown when .ion-invalid is
338
+ * present on the select. Otherwise the helper text should
339
+ * be shown.
340
+ */
341
+ .select-bottom .error-text {
342
+ display: none;
343
+ color: var(--highlight-color-invalid);
344
+ }
345
+
346
+ .select-bottom .helper-text {
347
+ display: block;
348
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
349
+ }
350
+
351
+ :host(.ion-touched.ion-invalid) .select-bottom .error-text {
352
+ display: block;
353
+ }
354
+
355
+ :host(.ion-touched.ion-invalid) .select-bottom .helper-text {
356
+ display: none;
357
+ }
358
+
302
359
  .label-text-wrapper {
303
360
  /**
304
361
  * This causes the label to take up
@@ -768,6 +825,10 @@ button {
768
825
  --border-color: var(--highlight-color);
769
826
  }
770
827
 
828
+ /**
829
+ * The bottom content should never have
830
+ * a border with the solid style.
831
+ */
771
832
  :host(.select-fill-solid) .select-bottom {
772
833
  border-top: none;
773
834
  }
@@ -373,6 +373,7 @@
373
373
  justify-content: space-between;
374
374
  border-top: var(--border-width) var(--border-style) var(--border-color);
375
375
  font-size: 0.75rem;
376
+ white-space: normal;
376
377
  }
377
378
 
378
379
  /**
@@ -396,7 +397,7 @@
396
397
 
397
398
  .textarea-bottom .helper-text {
398
399
  display: block;
399
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
400
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
400
401
  }
401
402
 
402
403
  :host(.ion-touched.ion-invalid) .textarea-bottom .error-text {
@@ -415,7 +416,7 @@
415
416
  */
416
417
  -webkit-margin-start: auto;
417
418
  margin-inline-start: auto;
418
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
419
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
419
420
  white-space: nowrap;
420
421
  padding-inline-start: 16px;
421
422
  }
@@ -373,6 +373,7 @@
373
373
  justify-content: space-between;
374
374
  border-top: var(--border-width) var(--border-style) var(--border-color);
375
375
  font-size: 0.75rem;
376
+ white-space: normal;
376
377
  }
377
378
 
378
379
  /**
@@ -396,7 +397,7 @@
396
397
 
397
398
  .textarea-bottom .helper-text {
398
399
  display: block;
399
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
400
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
400
401
  }
401
402
 
402
403
  :host(.ion-touched.ion-invalid) .textarea-bottom .error-text {
@@ -415,7 +416,7 @@
415
416
  */
416
417
  -webkit-margin-start: auto;
417
418
  margin-inline-start: auto;
418
- color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
419
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
419
420
  white-space: nowrap;
420
421
  padding-inline-start: 16px;
421
422
  }
@@ -928,6 +929,10 @@
928
929
  --border-color: var(--highlight-color);
929
930
  }
930
931
 
932
+ /**
933
+ * The bottom content should never have
934
+ * a border with the solid style.
935
+ */
931
936
  :host(.textarea-fill-solid) .textarea-bottom {
932
937
  border-top: none;
933
938
  }
@@ -364,3 +364,13 @@ export const shallowEqualStringMap = (map1, map2) => {
364
364
  }
365
365
  return true;
366
366
  };
367
+ export const getNextSiblingOfType = (element) => {
368
+ let sibling = element.nextSibling;
369
+ while (sibling) {
370
+ if (sibling.nodeType === Node.ELEMENT_NODE && sibling !== null) {
371
+ return sibling;
372
+ }
373
+ sibling = sibling.nextSibling;
374
+ }
375
+ return null;
376
+ };