@ionic/core 9.0.10-dev.11792788258.1f71cfee → 9.0.10-dev.11793383958.19a7d413

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 (376) hide show
  1. package/components/index.js +1 -1
  2. package/components/ion-accordion.js +1 -1
  3. package/components/ion-action-sheet.js +1 -1
  4. package/components/ion-alert.js +1 -1
  5. package/components/ion-app.js +1 -1
  6. package/components/ion-back-button.js +1 -1
  7. package/components/ion-breadcrumb.js +1 -1
  8. package/components/ion-button.js +1 -1
  9. package/components/ion-card.js +1 -1
  10. package/components/ion-checkbox.js +1 -1
  11. package/components/ion-col.js +1 -1
  12. package/components/ion-content.js +1 -1
  13. package/components/ion-datetime-button.js +1 -1
  14. package/components/ion-datetime.js +1 -1
  15. package/components/ion-fab-button.js +1 -1
  16. package/components/ion-footer.js +1 -1
  17. package/components/ion-header.js +1 -1
  18. package/components/ion-img.js +1 -1
  19. package/components/ion-infinite-scroll.js +1 -1
  20. package/components/ion-input-otp.js +1 -1
  21. package/components/ion-input-password-toggle.js +1 -1
  22. package/components/ion-input.js +1 -1
  23. package/components/ion-item-options.js +1 -1
  24. package/components/ion-item-sliding.js +1 -1
  25. package/components/ion-item.js +1 -1
  26. package/components/ion-label.js +1 -1
  27. package/components/ion-loading.js +1 -1
  28. package/components/ion-menu-button.js +1 -1
  29. package/components/ion-menu-toggle.js +1 -1
  30. package/components/ion-menu.js +1 -1
  31. package/components/ion-modal.js +1 -1
  32. package/components/ion-nav.js +1 -1
  33. package/components/ion-picker-column-option.js +1 -1
  34. package/components/ion-picker-column.js +1 -1
  35. package/components/ion-picker.js +1 -1
  36. package/components/ion-popover.js +1 -1
  37. package/components/ion-progress-bar.js +1 -1
  38. package/components/ion-radio-group.js +1 -1
  39. package/components/ion-radio.js +1 -1
  40. package/components/ion-range.js +1 -1
  41. package/components/ion-refresher-content.js +1 -1
  42. package/components/ion-refresher.js +1 -1
  43. package/components/ion-reorder-group.js +1 -1
  44. package/components/ion-router-outlet.js +1 -1
  45. package/components/ion-router.js +1 -1
  46. package/components/ion-searchbar.js +1 -1
  47. package/components/ion-segment-button.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-popover.js +1 -1
  52. package/components/ion-select.js +1 -1
  53. package/components/ion-tab-button.js +1 -1
  54. package/components/ion-tab.js +1 -1
  55. package/components/ion-textarea.js +1 -1
  56. package/components/ion-title.js +1 -1
  57. package/components/ion-toast.js +1 -1
  58. package/components/ion-toggle.js +1 -1
  59. package/components/{p-PkD1iLNN.js → p--cshUOAU.js} +1 -1
  60. package/components/{p-D8FyR2IB.js → p-B02CcbPD.js} +1 -1
  61. package/components/{p-CUQjkOdi.js → p-B4IBdPVJ.js} +1 -1
  62. package/components/p-BODcC-C0.js +4 -0
  63. package/components/p-BVNUhOOf.js +4 -0
  64. package/components/{p-BZ1k9WL7.js → p-Ba9_OzSY.js} +1 -1
  65. package/components/p-Bd8hg9FK.js +4 -0
  66. package/components/{p-3avHDbEF.js → p-BqyLLYLm.js} +1 -1
  67. package/components/p-C1AxSUnp.js +4 -0
  68. package/components/{p-DwTzX8Vi.js → p-CKTjkpAq.js} +1 -1
  69. package/components/{p-Dah8BCNg.js → p-CKiqp4Vl.js} +1 -1
  70. package/components/p-CONpe3oX.js +4 -0
  71. package/components/p-CVrOcN5N.js +4 -0
  72. package/components/p-CYctYy9B.js +4 -0
  73. package/components/{p-C-SO5kIs.js → p-C_gnmBt2.js} +1 -1
  74. package/components/{p-DnBabjgY.js → p-CxEV3Vwy.js} +1 -1
  75. package/components/p-Cyajikho.js +4 -0
  76. package/components/p-D0nwlsl_.js +4 -0
  77. package/components/{p-BT2InaHz.js → p-DBtFJlTi.js} +1 -1
  78. package/components/{p-BBsseItU.js → p-DD92Fw3n.js} +1 -1
  79. package/components/{p-kKGBuIkf.js → p-DDI6VLW9.js} +1 -1
  80. package/components/{p-LkEGRiq0.js → p-DfDIY2oP.js} +1 -1
  81. package/components/{p-Dj4J3LkD.js → p-Dojwmvde.js} +1 -1
  82. package/components/p-Drpw2dyl.js +4 -0
  83. package/components/{p-07wRJfkt.js → p-GpqwNbxf.js} +1 -1
  84. package/components/p-IQN1T5zw.js +4 -0
  85. package/components/{p-DTGCMApY.js → p-ODGeXc3M.js} +1 -1
  86. package/components/p-SHHIB5F0.js +4 -0
  87. package/components/{p-D5_mEbGJ.js → p-V1THdfzs.js} +1 -1
  88. package/components/p-YNnH1_Hs.js +4 -0
  89. package/components/{p-C8BAigo3.js → p-ZrYBjOcc.js} +1 -1
  90. package/components/p-_y7kwBO8.js +4 -0
  91. package/components/{p-BrrMFd9K.js → p-jsVMT15X.js} +1 -1
  92. package/components/{p-7NbIvzb4.js → p-r59A3wQk.js} +1 -1
  93. package/components/{p-Dy7x-KDF.js → p-yGD6MBgf.js} +1 -1
  94. package/dist/cjs/{animation-UiXhXV49.js → animation-DcgLg_PI.js} +1 -1
  95. package/dist/cjs/{attribute-controller-0-lwbVEj.js → attribute-controller-BjTE2TOf.js} +1 -1
  96. package/dist/cjs/{button-active-DzN1aPt-.js → button-active-FdsfRDY_.js} +1 -1
  97. package/dist/cjs/{capacitor-BTjfXFlK.js → capacitor-C6Pp4Z7A.js} +1 -1
  98. package/dist/cjs/{dir-Bma_9Lqh.js → dir-zwDPRE5K.js} +1 -1
  99. package/dist/cjs/{framework-delegate-hNMKEiQC.js → framework-delegate-JbKIVMzR.js} +1 -1
  100. package/dist/cjs/{haptic-BD5qPgy8.js → haptic--4QteuuM.js} +1 -1
  101. package/dist/cjs/{helpers-BrETKUUX.js → helpers-Cqr69qxA.js} +3 -2
  102. package/dist/cjs/{index-bwclzjks.js → index-BQpSekmz.js} +2 -2
  103. package/dist/cjs/{index-BTc0Jnhx.js → index-BhWiDK25.js} +3 -3
  104. package/dist/cjs/{index-DMz2Eyis.js → index-CNaZ6SYM.js} +1 -1
  105. package/dist/cjs/{index-DNBYnlrc.js → index-DCfr5hz-.js} +3 -3
  106. package/dist/cjs/index.cjs.js +9 -9
  107. package/dist/cjs/{input-shims-CRmdShL9.js → input-shims-2AsXPZ5m.js} +9 -8
  108. package/dist/cjs/ion-accordion_2.cjs.entry.js +2 -2
  109. package/dist/cjs/ion-action-sheet.cjs.entry.js +8 -8
  110. package/dist/cjs/ion-alert.cjs.entry.js +19 -19
  111. package/dist/cjs/ion-app_8.cjs.entry.js +18 -18
  112. package/dist/cjs/ion-back-button.cjs.entry.js +2 -2
  113. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
  114. package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
  115. package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
  116. package/dist/cjs/ion-checkbox.cjs.entry.js +2 -2
  117. package/dist/cjs/ion-col_3.cjs.entry.js +12 -14
  118. package/dist/cjs/ion-datetime-button.cjs.entry.js +2 -2
  119. package/dist/cjs/ion-datetime.cjs.entry.js +9 -8
  120. package/dist/cjs/ion-fab_3.cjs.entry.js +2 -2
  121. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  122. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +3 -3
  123. package/dist/cjs/ion-input-otp.cjs.entry.js +128 -12
  124. package/dist/cjs/ion-input.cjs.entry.js +3 -3
  125. package/dist/cjs/ion-item-option_3.cjs.entry.js +9 -9
  126. package/dist/cjs/ion-item_8.cjs.entry.js +10 -10
  127. package/dist/cjs/ion-loading.cjs.entry.js +5 -5
  128. package/dist/cjs/ion-menu_3.cjs.entry.js +6 -6
  129. package/dist/cjs/ion-modal.cjs.entry.js +10 -10
  130. package/dist/cjs/ion-nav_2.cjs.entry.js +5 -5
  131. package/dist/cjs/ion-picker-column-option.cjs.entry.js +2 -2
  132. package/dist/cjs/ion-picker-column.cjs.entry.js +4 -4
  133. package/dist/cjs/ion-picker.cjs.entry.js +2 -2
  134. package/dist/cjs/ion-popover.cjs.entry.js +14 -28
  135. package/dist/cjs/ion-progress-bar.cjs.entry.js +5 -6
  136. package/dist/cjs/ion-radio_2.cjs.entry.js +2 -2
  137. package/dist/cjs/ion-range.cjs.entry.js +3 -3
  138. package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
  139. package/dist/cjs/ion-reorder_2.cjs.entry.js +5 -5
  140. package/dist/cjs/ion-route_4.cjs.entry.js +124 -19
  141. package/dist/cjs/ion-searchbar.cjs.entry.js +2 -2
  142. package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
  143. package/dist/cjs/ion-segment_2.cjs.entry.js +2 -2
  144. package/dist/cjs/ion-select-modal.cjs.entry.js +4 -4
  145. package/dist/cjs/ion-select_3.cjs.entry.js +5 -5
  146. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +5 -5
  147. package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
  148. package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
  149. package/dist/cjs/ion-toast.cjs.entry.js +5 -5
  150. package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
  151. package/dist/cjs/ionic.cjs.js +1 -1
  152. package/dist/cjs/{ios.transition-CN092Fh6.js → ios.transition-Ca6XODo9.js} +15 -15
  153. package/dist/cjs/{keyboard-BMpscicm.js → keyboard-BlHp4a_c.js} +1 -1
  154. package/dist/cjs/{keyboard-4OBzkjOG.js → keyboard-c2_I35b-.js} +4 -4
  155. package/dist/cjs/{keyboard-controller-DZE97OtR.js → keyboard-controller-DHS0BgXp.js} +2 -2
  156. package/dist/cjs/loader.cjs.js +1 -1
  157. package/dist/cjs/{md.transition-B6961Ny9.js → md.transition-D8SfNYEp.js} +4 -4
  158. package/dist/cjs/{overlays-BbVQG3UT.js → overlays-CLld3axA.js} +2 -2
  159. package/dist/cjs/{slot-mutation-controller-CRa_cKOh.js → slot-mutation-controller-B2OfJEBH.js} +2 -2
  160. package/dist/cjs/{status-tap-hRIvObiJ.js → status-tap-CDA0Y3Ad.js} +3 -3
  161. package/dist/cjs/{swipe-back-C-aigThB.js → swipe-back-Idb4gqUk.js} +2 -2
  162. package/dist/collection/components/alert/alert.js +11 -11
  163. package/dist/collection/components/col/col.js +12 -14
  164. package/dist/collection/components/datetime/datetime.js +5 -4
  165. package/dist/collection/components/input-otp/input-otp.ios.css +30 -5
  166. package/dist/collection/components/input-otp/input-otp.js +191 -12
  167. package/dist/collection/components/input-otp/input-otp.md.css +30 -5
  168. package/dist/collection/components/item/item.js +4 -5
  169. package/dist/collection/components/item-options/item-options.js +2 -2
  170. package/dist/collection/components/item-sliding/item-sliding.js +4 -5
  171. package/dist/collection/components/label/label.js +3 -4
  172. package/dist/collection/components/popover/animations/ios.enter.js +3 -4
  173. package/dist/collection/components/popover/animations/md.enter.js +3 -4
  174. package/dist/collection/components/popover/popover.js +2 -17
  175. package/dist/collection/components/progress-bar/progress-bar.js +3 -5
  176. package/dist/collection/components/route/route.js +9 -1
  177. package/dist/collection/components/route-redirect/route-redirect.js +1 -1
  178. package/dist/collection/components/router/utils/constants.js +2 -0
  179. package/dist/collection/components/router/utils/matching.js +97 -14
  180. package/dist/collection/components/router/utils/path.js +17 -3
  181. package/dist/collection/components/title/title.js +3 -4
  182. package/dist/collection/utils/helpers.js +2 -1
  183. package/dist/collection/utils/input-shims/hacks/common.js +4 -4
  184. package/dist/collection/utils/rtl/dir.js +1 -1
  185. package/dist/collection/utils/transition/ios.transition.js +11 -12
  186. package/dist/docs.json +92 -3
  187. package/dist/esm/{animation-C_V9lXzL.js → animation-DmtJpz89.js} +1 -1
  188. package/dist/esm/{attribute-controller-ItNOXNp9.js → attribute-controller-DPMIcbef.js} +1 -1
  189. package/dist/esm/{button-active-rB-Ct9KZ.js → button-active-DVk40Sjl.js} +1 -1
  190. package/dist/esm/{capacitor-BY7l8HgR.js → capacitor-CHJaJ9aX.js} +1 -1
  191. package/dist/esm/{dir-Dj4J3LkD.js → dir-Dojwmvde.js} +1 -1
  192. package/dist/esm/{framework-delegate-CW5_kWfc.js → framework-delegate-CDjM1vRH.js} +1 -1
  193. package/dist/esm/{haptic-ES_sSPLn.js → haptic-WXfMCob9.js} +1 -1
  194. package/dist/esm/{helpers-p94IkmEA.js → helpers-BJqKF1pr.js} +3 -2
  195. package/dist/esm/{index-DLDbwWW7.js → index-Clv8QC5L.js} +2 -2
  196. package/dist/esm/{index-txcXIB3P.js → index-DIouXecD.js} +3 -3
  197. package/dist/esm/{index-CBkVO5D0.js → index-TkLga3ma.js} +1 -1
  198. package/dist/esm/{index-vgPixHgF.js → index-z9vdZN7I.js} +3 -3
  199. package/dist/esm/index.js +9 -9
  200. package/dist/esm/{input-shims-KNXj3DAv.js → input-shims-C1iYF5JK.js} +9 -8
  201. package/dist/esm/ion-accordion_2.entry.js +2 -2
  202. package/dist/esm/ion-action-sheet.entry.js +8 -8
  203. package/dist/esm/ion-alert.entry.js +19 -19
  204. package/dist/esm/ion-app_8.entry.js +18 -18
  205. package/dist/esm/ion-back-button.entry.js +2 -2
  206. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  207. package/dist/esm/ion-button_2.entry.js +3 -3
  208. package/dist/esm/ion-card_5.entry.js +3 -3
  209. package/dist/esm/ion-checkbox.entry.js +2 -2
  210. package/dist/esm/ion-col_3.entry.js +13 -15
  211. package/dist/esm/ion-datetime-button.entry.js +2 -2
  212. package/dist/esm/ion-datetime.entry.js +9 -8
  213. package/dist/esm/ion-fab_3.entry.js +2 -2
  214. package/dist/esm/ion-img.entry.js +2 -2
  215. package/dist/esm/ion-infinite-scroll_2.entry.js +3 -3
  216. package/dist/esm/ion-input-otp.entry.js +129 -13
  217. package/dist/esm/ion-input.entry.js +3 -3
  218. package/dist/esm/ion-item-option_3.entry.js +9 -9
  219. package/dist/esm/ion-item_8.entry.js +10 -10
  220. package/dist/esm/ion-loading.entry.js +5 -5
  221. package/dist/esm/ion-menu_3.entry.js +6 -6
  222. package/dist/esm/ion-modal.entry.js +10 -10
  223. package/dist/esm/ion-nav_2.entry.js +5 -5
  224. package/dist/esm/ion-picker-column-option.entry.js +2 -2
  225. package/dist/esm/ion-picker-column.entry.js +4 -4
  226. package/dist/esm/ion-picker.entry.js +2 -2
  227. package/dist/esm/ion-popover.entry.js +14 -28
  228. package/dist/esm/ion-progress-bar.entry.js +6 -7
  229. package/dist/esm/ion-radio_2.entry.js +2 -2
  230. package/dist/esm/ion-range.entry.js +3 -3
  231. package/dist/esm/ion-refresher_2.entry.js +6 -6
  232. package/dist/esm/ion-reorder_2.entry.js +5 -5
  233. package/dist/esm/ion-route_4.entry.js +124 -19
  234. package/dist/esm/ion-searchbar.entry.js +2 -2
  235. package/dist/esm/ion-segment-view.entry.js +1 -1
  236. package/dist/esm/ion-segment_2.entry.js +2 -2
  237. package/dist/esm/ion-select-modal.entry.js +4 -4
  238. package/dist/esm/ion-select_3.entry.js +5 -5
  239. package/dist/esm/ion-tab-bar_2.entry.js +5 -5
  240. package/dist/esm/ion-tab_2.entry.js +3 -3
  241. package/dist/esm/ion-textarea.entry.js +3 -3
  242. package/dist/esm/ion-toast.entry.js +5 -5
  243. package/dist/esm/ion-toggle.entry.js +4 -4
  244. package/dist/esm/ionic.js +1 -1
  245. package/dist/esm/{ios.transition-CW92wRDL.js → ios.transition-BkUGiDUz.js} +15 -15
  246. package/dist/esm/{keyboard-BumguZrM.js → keyboard-B4Y-Gph8.js} +4 -4
  247. package/dist/esm/{keyboard-CutS8BPd.js → keyboard-Cmqp5iZD.js} +1 -1
  248. package/dist/esm/{keyboard-controller-DqohyEsZ.js → keyboard-controller-B2NoF7bV.js} +2 -2
  249. package/dist/esm/loader.js +1 -1
  250. package/dist/esm/{md.transition-yhfkYX1P.js → md.transition-B6hlrWjR.js} +4 -4
  251. package/dist/esm/{overlays-BBgMM61s.js → overlays-DmDY-El7.js} +2 -2
  252. package/dist/esm/{slot-mutation-controller-uKdPbY9K.js → slot-mutation-controller-Btpr9-9O.js} +2 -2
  253. package/dist/esm/{status-tap-BskkGI4e.js → status-tap-VGRBYwiC.js} +3 -3
  254. package/dist/esm/{swipe-back-BZdyM2Q-.js → swipe-back-DV3UpWzz.js} +2 -2
  255. package/dist/html.html-data.json +10 -2
  256. package/dist/ionic/index.esm.js +1 -1
  257. package/dist/ionic/ionic.esm.js +1 -1
  258. package/dist/ionic/{p-013b9aba.entry.js → p-01b7e3f2.entry.js} +1 -1
  259. package/dist/ionic/{p-9515f840.entry.js → p-095da8ec.entry.js} +1 -1
  260. package/dist/ionic/{p-ec08a7e6.entry.js → p-0b09c60e.entry.js} +1 -1
  261. package/dist/ionic/{p-5b47b8d5.entry.js → p-0c32c626.entry.js} +1 -1
  262. package/dist/ionic/p-0f97175e.entry.js +4 -0
  263. package/dist/ionic/{p-b0faaae2.entry.js → p-107a81a6.entry.js} +1 -1
  264. package/dist/ionic/{p-27960f65.entry.js → p-293cb1d5.entry.js} +1 -1
  265. package/dist/ionic/{p-1ffa5577.entry.js → p-362dcd86.entry.js} +1 -1
  266. package/dist/ionic/{p-0562139b.entry.js → p-4bd80334.entry.js} +1 -1
  267. package/dist/ionic/{p-16de8fd9.entry.js → p-4f25b926.entry.js} +1 -1
  268. package/dist/ionic/{p-0f1613f2.entry.js → p-52a16f94.entry.js} +1 -1
  269. package/dist/ionic/{p-436d4ac8.entry.js → p-5bb24bce.entry.js} +1 -1
  270. package/dist/ionic/{p-9d7e5a0b.entry.js → p-60780b88.entry.js} +1 -1
  271. package/dist/ionic/{p-1f342c2d.entry.js → p-62c87f3d.entry.js} +1 -1
  272. package/dist/ionic/{p-7868eb92.entry.js → p-64ac3864.entry.js} +1 -1
  273. package/dist/ionic/{p-f37e6ed2.entry.js → p-67f004eb.entry.js} +1 -1
  274. package/dist/ionic/p-6c7b5930.entry.js +4 -0
  275. package/dist/ionic/p-705759fd.entry.js +4 -0
  276. package/dist/ionic/{p-a45caa30.entry.js → p-7db20410.entry.js} +1 -1
  277. package/dist/ionic/{p-694f3e78.entry.js → p-7e9c2a97.entry.js} +1 -1
  278. package/dist/ionic/p-7l6ENjIV.js +4 -0
  279. package/dist/ionic/{p-77540bcb.entry.js → p-82abf431.entry.js} +1 -1
  280. package/dist/ionic/p-8d2ccf0c.entry.js +4 -0
  281. package/dist/ionic/{p-87fb6d59.entry.js → p-8d651adb.entry.js} +1 -1
  282. package/dist/ionic/{p-51af4728.entry.js → p-8db08782.entry.js} +1 -1
  283. package/dist/ionic/{p-af15fc5d.entry.js → p-91f3cd8b.entry.js} +1 -1
  284. package/dist/ionic/{p-c7ea2647.entry.js → p-930c3538.entry.js} +1 -1
  285. package/dist/ionic/p-94f1f7df.entry.js +4 -0
  286. package/dist/ionic/p-99c518de.entry.js +4 -0
  287. package/dist/ionic/{p-014c3633.entry.js → p-9ffccbf1.entry.js} +1 -1
  288. package/dist/ionic/p-BNXIurCt.js +4 -0
  289. package/dist/ionic/p-BOLqP2-V.js +4 -0
  290. package/dist/ionic/{p-5a3UxQAh.js → p-BY4FwwBp.js} +1 -1
  291. package/dist/ionic/p-BZTgGzGK.js +4 -0
  292. package/dist/ionic/p-BdHBcCZF.js +4 -0
  293. package/dist/ionic/{p-8B39TMv-.js → p-BpED_ep_.js} +1 -1
  294. package/dist/ionic/p-BuLlVedw.js +4 -0
  295. package/dist/ionic/p-Bx5x5GJV.js +4 -0
  296. package/dist/ionic/{p-C4SpVvhx.js → p-C1WYZOZj.js} +1 -1
  297. package/dist/ionic/p-C2LaBx3E.js +4 -0
  298. package/dist/ionic/{p-BWKtcudz.js → p-CXs4J83x.js} +1 -1
  299. package/dist/ionic/p-CgcGX08t.js +4 -0
  300. package/dist/ionic/p-CngfKMRU.js +4 -0
  301. package/dist/ionic/p-Co7eql8D.js +4 -0
  302. package/dist/ionic/{p-DArnNWiu.js → p-D13gXhdC.js} +1 -1
  303. package/dist/ionic/p-D926OmIX.js +4 -0
  304. package/dist/ionic/{p-BBZQUbCq.js → p-DPNVo1nr.js} +1 -1
  305. package/dist/ionic/{p-B0afqOUt.js → p-DXXGkPA8.js} +1 -1
  306. package/dist/ionic/{p-CJmyfI8x.js → p-Dk4Mdaru.js} +1 -1
  307. package/dist/ionic/{p-Dj4J3LkD.js → p-Dojwmvde.js} +1 -1
  308. package/dist/ionic/p-a4389f13.entry.js +4 -0
  309. package/dist/ionic/p-af8fb360.entry.js +4 -0
  310. package/dist/ionic/{p-f6a1ab48.entry.js → p-b9ed3a52.entry.js} +1 -1
  311. package/dist/ionic/p-bfdbe24b.entry.js +4 -0
  312. package/dist/ionic/{p-77e7b612.entry.js → p-c250b6b0.entry.js} +1 -1
  313. package/dist/ionic/p-c83dbc12.entry.js +4 -0
  314. package/dist/ionic/{p-1bb1be7e.entry.js → p-d0e374f8.entry.js} +1 -1
  315. package/dist/ionic/{p-af4b4719.entry.js → p-d2406889.entry.js} +1 -1
  316. package/dist/ionic/{p-cbc73380.entry.js → p-d72accc4.entry.js} +1 -1
  317. package/dist/ionic/{p-1252621e.entry.js → p-e7ab4def.entry.js} +1 -1
  318. package/dist/ionic/{p-5dcddfd5.entry.js → p-e8e69c21.entry.js} +1 -1
  319. package/dist/ionic/{p-96d040b0.entry.js → p-eb989dc9.entry.js} +1 -1
  320. package/dist/ionic/{p-59e4b521.entry.js → p-ec259ac5.entry.js} +1 -1
  321. package/dist/ionic/p-f2116a54.entry.js +4 -0
  322. package/dist/ionic/{p-B2JD8_LP.js → p-nCAPr1Ah.js} +1 -1
  323. package/dist/types/components/alert/alert.d.ts +0 -4
  324. package/dist/types/components/col/col.d.ts +0 -1
  325. package/dist/types/components/input-otp/input-otp-interface.d.ts +1 -0
  326. package/dist/types/components/input-otp/input-otp.d.ts +40 -2
  327. package/dist/types/components/popover/popover.d.ts +0 -1
  328. package/dist/types/components/progress-bar/progress-bar.d.ts +0 -1
  329. package/dist/types/components/route/route.d.ts +8 -0
  330. package/dist/types/components/route-redirect/route-redirect.d.ts +3 -1
  331. package/dist/types/components/router/utils/constants.d.ts +2 -0
  332. package/dist/types/components/router/utils/matching.d.ts +10 -0
  333. package/dist/types/components/router/utils/path.d.ts +5 -1
  334. package/dist/types/components.d.ts +32 -6
  335. package/dist/types/utils/helpers.d.ts +3 -2
  336. package/dist/types/utils/rtl/dir.d.ts +1 -1
  337. package/hydrate/index.js +301 -109
  338. package/hydrate/index.mjs +301 -109
  339. package/package.json +1 -1
  340. package/components/p-B3dSuofL.js +0 -4
  341. package/components/p-BWbz71uB.js +0 -4
  342. package/components/p-C0TdbIVo.js +0 -4
  343. package/components/p-C6Y0cCH_.js +0 -4
  344. package/components/p-CCFj0kgH.js +0 -4
  345. package/components/p-CRb2xRCz.js +0 -4
  346. package/components/p-DLEJ61lJ.js +0 -4
  347. package/components/p-DRm4t-by.js +0 -4
  348. package/components/p-D_U0pDe5.js +0 -4
  349. package/components/p-DaW9OZ6S.js +0 -4
  350. package/components/p-DaojW_d_.js +0 -4
  351. package/components/p-Ds5vN3iu.js +0 -4
  352. package/components/p-RhI78AKb.js +0 -4
  353. package/components/p-z-EWo6r-.js +0 -4
  354. package/dist/ionic/p-129f7b95.entry.js +0 -4
  355. package/dist/ionic/p-210f906e.entry.js +0 -4
  356. package/dist/ionic/p-3c6fc2e8.entry.js +0 -4
  357. package/dist/ionic/p-43729675.entry.js +0 -4
  358. package/dist/ionic/p-4468e439.entry.js +0 -4
  359. package/dist/ionic/p-800ce1e0.entry.js +0 -4
  360. package/dist/ionic/p-84470714.entry.js +0 -4
  361. package/dist/ionic/p-8af85fa8.entry.js +0 -4
  362. package/dist/ionic/p-8dQB1sG_.js +0 -4
  363. package/dist/ionic/p-B2y1T0dN.js +0 -4
  364. package/dist/ionic/p-BHBb21Hp.js +0 -4
  365. package/dist/ionic/p-BgkRGRO3.js +0 -4
  366. package/dist/ionic/p-CNdt1FPc.js +0 -4
  367. package/dist/ionic/p-Cf6KtUnA.js +0 -4
  368. package/dist/ionic/p-CfccUand.js +0 -4
  369. package/dist/ionic/p-DBFcFCH5.js +0 -4
  370. package/dist/ionic/p-DCmOKz8e.js +0 -4
  371. package/dist/ionic/p-DFPZa_No.js +0 -4
  372. package/dist/ionic/p-DYKDWM2f.js +0 -4
  373. package/dist/ionic/p-DzQk7Lu8.js +0 -4
  374. package/dist/ionic/p-c56c23b6.entry.js +0 -4
  375. package/dist/ionic/p-c8c77f7b.entry.js +0 -4
  376. package/dist/ionic/p-d58e9da3.entry.js +0 -4
@@ -1,17 +1,21 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { Fragment, Host, h } from "@stencil/core";
5
- import { inheritAriaAttributes } from "../../utils/helpers";
6
- import { printIonWarning } from "../../utils/logging/index";
4
+ import { Build, Fragment, Host, forceUpdate, h, } from "@stencil/core";
5
+ import { createAttributeController } from "../../utils/attribute-controller";
6
+ import { checkInvalidState } from "../../utils/forms/index";
7
+ import { ariaAttributes } from "../../utils/helpers";
8
+ import { printIonError, printIonWarning } from "../../utils/logging/index";
7
9
  import { isRTL } from "../../utils/rtl/index";
8
10
  import { createColorClasses } from "../../utils/theme";
9
11
  import { getIonMode } from "../../global/ionic-global";
10
12
  export class InputOTP {
11
13
  constructor() {
12
- this.inheritedAttributes = {};
13
14
  this.inputRefs = [];
14
15
  this.inputId = `ion-input-otp-${inputIds++}`;
16
+ this.helperTextId = `${this.inputId}-helper-text`;
17
+ this.errorTextId = `${this.inputId}-error-text`;
18
+ this.descriptionId = `${this.inputId}-description`;
15
19
  this.parsedSeparators = [];
16
20
  /**
17
21
  * Tracks whether the user is navigating through input boxes using keyboard navigation
@@ -27,6 +31,7 @@ export class InputOTP {
27
31
  this.inputValues = [];
28
32
  this.hasFocus = false;
29
33
  this.previousInputValues = [];
34
+ this.isInvalid = false;
30
35
  /**
31
36
  * Indicates whether and how the text value should be automatically capitalized as it is entered/edited by the user.
32
37
  * Available options: `"off"`, `"none"`, `"on"`, `"sentences"`, `"words"`, `"characters"`.
@@ -379,6 +384,10 @@ export class InputOTP {
379
384
  this.inputRefs[tabbableIndex]?.focus();
380
385
  }
381
386
  }
387
+ // The host keeps these (see `HOST_ARIA_ATTRIBUTES`), so re-render when they change
388
+ onHostAriaChange() {
389
+ forceUpdate(this);
390
+ }
382
391
  valueChanged() {
383
392
  this.initializeValues();
384
393
  this.updateTabIndexes();
@@ -435,13 +444,45 @@ export class InputOTP {
435
444
  }
436
445
  this.parsedSeparators = separatorValues.filter((pos) => pos <= length);
437
446
  }
447
+ connectedCallback() {
448
+ const { el } = this;
449
+ if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
450
+ this.validationObserver = new MutationObserver(() => {
451
+ const newIsInvalid = checkInvalidState(el);
452
+ if (this.isInvalid !== newIsInvalid) {
453
+ this.isInvalid = newIsInvalid;
454
+ // Force a re-render to update aria-describedby immediately
455
+ forceUpdate(this);
456
+ }
457
+ });
458
+ this.validationObserver.observe(el, {
459
+ attributes: true,
460
+ attributeFilter: ['class'],
461
+ });
462
+ }
463
+ this.isInvalid = checkInvalidState(el);
464
+ // Resumes watching after a move, since `componentWillLoad` only runs once
465
+ this.ariaController?.init();
466
+ }
467
+ disconnectedCallback() {
468
+ this.ariaController?.destroy();
469
+ if (this.validationObserver) {
470
+ this.validationObserver.disconnect();
471
+ this.validationObserver = undefined;
472
+ }
473
+ }
438
474
  componentWillLoad() {
439
- this.inheritedAttributes = inheritAriaAttributes(this.el);
475
+ // Only read `role` at load so a later host write isn't copied to the group
476
+ this.ariaController = createAttributeController(this.el, ariaAttributes.filter((attr) => !HOST_ARIA_ATTRIBUTES.includes(attr)), () => forceUpdate(this), ['role']);
440
477
  this.processSeparators();
441
478
  this.initializeValues();
442
479
  }
443
480
  componentDidLoad() {
444
481
  this.updateTabIndexes();
482
+ // The description only exists after the first render, so render again to reference it
483
+ if (this.getDescriptionText()) {
484
+ forceUpdate(this);
485
+ }
445
486
  }
446
487
  componentDidRender() {
447
488
  if (this.updateTabIndexesAfterRender) {
@@ -619,14 +660,77 @@ export class InputOTP {
619
660
  const { length } = this;
620
661
  return this.parsedSeparators.includes(index + 1) && index < length - 1;
621
662
  }
663
+ /**
664
+ * Returns `undefined` until the first render creates the description container.
665
+ */
666
+ getDescriptionText() {
667
+ return this.el.querySelector('.input-otp-description')?.textContent?.trim();
668
+ }
669
+ getHintTextId() {
670
+ const { isInvalid, helperText, errorText, helperTextId, errorTextId } = this;
671
+ if (isInvalid && errorText) {
672
+ return errorTextId;
673
+ }
674
+ if (helperText) {
675
+ return helperTextId;
676
+ }
677
+ return undefined;
678
+ }
679
+ renderHintText() {
680
+ const { helperText, errorText, helperTextId, errorTextId, isInvalid } = this;
681
+ return [
682
+ h("div", { id: helperTextId, class: "helper-text", "aria-live": "polite" }, !isInvalid ? helperText : null),
683
+ h("div", { id: errorTextId, class: "error-text", role: "alert" }, isInvalid ? errorText : null),
684
+ ];
685
+ }
686
+ renderBottomContent() {
687
+ const { helperText, errorText } = this;
688
+ if (!helperText && !errorText) {
689
+ return;
690
+ }
691
+ return h("div", { class: "input-otp-bottom" }, this.renderHintText());
692
+ }
693
+ /**
694
+ * A custom formatter is used as is so translators control the whole name.
695
+ * With a host `aria-labelledby`, each box also references itself so its
696
+ * position is still read.
697
+ */
698
+ getInputLabelAttributes(index, hostAttributes) {
699
+ const { inputId, inputLabelFormatter, length } = this;
700
+ const hostLabel = hostAttributes['aria-label'];
701
+ const hostLabelledBy = hostAttributes['aria-labelledby'];
702
+ const position = `${index + 1} of ${length}`;
703
+ if (inputLabelFormatter !== undefined) {
704
+ try {
705
+ return { 'aria-label': inputLabelFormatter(index, length) };
706
+ }
707
+ catch (e) {
708
+ printIonError('[ion-input-otp] - Exception in provided `inputLabelFormatter`:', e);
709
+ }
710
+ }
711
+ if (hostLabelledBy) {
712
+ return { 'aria-label': position, 'aria-labelledby': `${hostLabelledBy} ${inputId}-${index}` };
713
+ }
714
+ return { 'aria-label': hostLabel ? `${hostLabel}, ${position}` : `Input ${position}` };
715
+ }
622
716
  render() {
623
- const { autocapitalize, color, disabled, el, fill, hasFocus, inheritedAttributes, inputId, inputRefs, inputValues, length, readonly, shape, size, } = this;
717
+ const { ariaController, autocapitalize, color, descriptionId, disabled, el, fill, hasFocus, inputId, inputRefs, inputValues, isInvalid, length, readonly, shape, size, } = this;
624
718
  const mode = getIonMode(this);
625
719
  const inputmode = this.getInputmode();
626
720
  const tabbableIndex = this.getTabbableIndex();
627
721
  const pattern = this.getPattern();
628
- const hasDescription = el.querySelector('.input-otp-description')?.textContent?.trim() !== '';
629
- return (h(Host, { key: 'def9fbd4fa135e6f435380c6ea86ac1621b4a111', class: createColorClasses(color, {
722
+ const descriptionText = this.getDescriptionText();
723
+ // Keep the description visible until the first render can check it
724
+ const hasDescription = descriptionText !== '';
725
+ /**
726
+ * Screen readers only announce these from the focused input. The
727
+ * description stays on the group so it isn't repeated for every input.
728
+ */
729
+ const { 'aria-errormessage': ariaErrorMessage, 'aria-required': ariaRequired, ...groupAttributes } = ariaController?.attributes ?? {};
730
+ const hostDescribedBy = el.getAttribute('aria-describedby');
731
+ const hostInvalid = el.getAttribute('aria-invalid') ?? undefined;
732
+ const describedBy = [hostDescribedBy, this.getHintTextId()].filter(Boolean).join(' ');
733
+ return (h(Host, { key: '5b13c3bed3979e269cf4409895954edb171d68f3', class: createColorClasses(color, {
630
734
  [mode]: true,
631
735
  'has-focus': hasFocus,
632
736
  [`input-otp-size-${size}`]: true,
@@ -634,7 +738,7 @@ export class InputOTP {
634
738
  [`input-otp-fill-${fill}`]: true,
635
739
  'input-otp-disabled': disabled,
636
740
  'input-otp-readonly': readonly,
637
- }) }, h("div", { key: '5d3d7646a3d4fc856b7b2e1f53d29fca47b10baf', role: "group", "aria-label": "One-time password input", class: "input-otp-group", ...inheritedAttributes }, Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper" }, h("input", { class: "native-input", id: `${inputId}-${index}`, "aria-label": `Input ${index + 1} of ${length}`, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => {
741
+ }) }, h("div", { key: '6db010743f0eb5e059dc00de5822f117a264bb16', role: "group", class: "input-otp-group", ...groupAttributes, "aria-label": groupAttributes['aria-label'] || 'One-time password input', "aria-describedby": descriptionText ? descriptionId : undefined }, Array.from({ length }).map((_, index) => (h(Fragment, null, h("div", { class: "native-wrapper" }, h("input", { class: "native-input", id: `${inputId}-${index}`, ...this.getInputLabelAttributes(index, groupAttributes), "aria-describedby": describedBy || undefined, "aria-errormessage": ariaErrorMessage, "aria-invalid": isInvalid ? 'true' : hostInvalid, "aria-required": ariaRequired, type: "text", autoCapitalize: autocapitalize, inputmode: inputmode, pattern: pattern, disabled: disabled, readOnly: readonly, tabIndex: index === tabbableIndex ? 0 : -1, value: inputValues[index] || '', autocomplete: "one-time-code", ref: (el) => {
638
742
  if (el) {
639
743
  inputRefs[index] = el;
640
744
  }
@@ -642,10 +746,10 @@ export class InputOTP {
642
746
  // The input was removed, so drop its ref and any after it.
643
747
  inputRefs.splice(index);
644
748
  }
645
- }, onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator" }))))), h("div", { key: '9d72a4ab35b5fdd6bba9701050c385ed253b310f', class: {
749
+ }, onInput: this.onInput(index), onBlur: this.onBlur, onFocus: this.onFocus(index), onKeyDown: this.onKeyDown(index), onPaste: this.onPaste })), this.showSeparator(index) && h("div", { class: "input-otp-separator" }))))), h("div", { key: '4d55d7532dcc28fadcb2f860dd2fcd2aa45ccccc', id: descriptionId, class: {
646
750
  'input-otp-description': true,
647
751
  'input-otp-description-hidden': !hasDescription,
648
- } }, h("slot", { key: '7deb3373c0d4e5deac22fa51577d271b9bb3a6d2' }))));
752
+ } }, h("slot", { key: '5d6823f48a9786799c9d485ce0d6b9de2ae7f537' })), this.renderBottomContent()));
649
753
  }
650
754
  static get is() { return "ion-input-otp"; }
651
755
  static get encapsulation() { return "scoped"; }
@@ -729,6 +833,25 @@ export class InputOTP {
729
833
  "attribute": "disabled",
730
834
  "defaultValue": "false"
731
835
  },
836
+ "errorText": {
837
+ "type": "string",
838
+ "mutable": false,
839
+ "complexType": {
840
+ "original": "string",
841
+ "resolved": "string | undefined",
842
+ "references": {}
843
+ },
844
+ "required": false,
845
+ "optional": true,
846
+ "docs": {
847
+ "tags": [],
848
+ "text": "Text that is placed under the input boxes and displayed when an error is detected."
849
+ },
850
+ "getter": false,
851
+ "setter": false,
852
+ "reflect": false,
853
+ "attribute": "error-text"
854
+ },
732
855
  "fill": {
733
856
  "type": "string",
734
857
  "mutable": false,
@@ -749,6 +872,49 @@ export class InputOTP {
749
872
  "attribute": "fill",
750
873
  "defaultValue": "'outline'"
751
874
  },
875
+ "helperText": {
876
+ "type": "string",
877
+ "mutable": false,
878
+ "complexType": {
879
+ "original": "string",
880
+ "resolved": "string | undefined",
881
+ "references": {}
882
+ },
883
+ "required": false,
884
+ "optional": true,
885
+ "docs": {
886
+ "tags": [],
887
+ "text": "Text that is placed under the input boxes and displayed when no error is detected."
888
+ },
889
+ "getter": false,
890
+ "setter": false,
891
+ "reflect": false,
892
+ "attribute": "helper-text"
893
+ },
894
+ "inputLabelFormatter": {
895
+ "type": "unknown",
896
+ "mutable": false,
897
+ "complexType": {
898
+ "original": "InputOtpLabelFormatter",
899
+ "resolved": "((index: number, length: number) => string) | undefined",
900
+ "references": {
901
+ "InputOtpLabelFormatter": {
902
+ "location": "import",
903
+ "path": "./input-otp-interface",
904
+ "id": "src/components/input-otp/input-otp-interface.ts::InputOtpLabelFormatter",
905
+ "referenceLocation": "InputOtpLabelFormatter"
906
+ }
907
+ }
908
+ },
909
+ "required": false,
910
+ "optional": true,
911
+ "docs": {
912
+ "tags": [],
913
+ "text": "A callback used to format the accessible name of each input box. It\nreceives the 0-based `index` of the box and the total `length`. By default\nthe name is \"Input 1 of 4\", or \"PIN, 1 of 4\" with an `aria-label` of \"PIN\".\n\nSee https://ionicframework.com/docs/troubleshooting/runtime#accessing-this\nif you need to access `this` from within the callback."
914
+ },
915
+ "getter": false,
916
+ "setter": false
917
+ },
752
918
  "inputmode": {
753
919
  "type": "string",
754
920
  "mutable": false,
@@ -932,7 +1098,8 @@ export class InputOTP {
932
1098
  return {
933
1099
  "inputValues": {},
934
1100
  "hasFocus": {},
935
- "previousInputValues": {}
1101
+ "previousInputValues": {},
1102
+ "isInvalid": {}
936
1103
  };
937
1104
  }
938
1105
  static get events() {
@@ -1075,6 +1242,12 @@ export class InputOTP {
1075
1242
  static get elementRef() { return "el"; }
1076
1243
  static get watchers() {
1077
1244
  return [{
1245
+ "propName": "aria-describedby",
1246
+ "methodName": "onHostAriaChange"
1247
+ }, {
1248
+ "propName": "aria-invalid",
1249
+ "methodName": "onHostAriaChange"
1250
+ }, {
1078
1251
  "propName": "value",
1079
1252
  "methodName": "valueChanged"
1080
1253
  }, {
@@ -1090,3 +1263,9 @@ export class InputOTP {
1090
1263
  }
1091
1264
  }
1092
1265
  let inputIds = 0;
1266
+ /**
1267
+ * The attribute controller removes these from the host, so an app could never
1268
+ * clear them. They stay on the host instead, which only works for global
1269
+ * attributes since the host has no role.
1270
+ */
1271
+ const HOST_ARIA_ATTRIBUTES = ['aria-describedby', 'aria-invalid'];
@@ -111,6 +111,7 @@
111
111
  * different selectors for different fill variants.
112
112
  */
113
113
  --highlight-color: var(--highlight-color-focused);
114
+ --border-color: initial;
114
115
  display: block;
115
116
  position: relative;
116
117
  font-size: 0.875rem;
@@ -148,7 +149,7 @@
148
149
  height: var(--height);
149
150
  border-width: var(--border-width);
150
151
  border-style: solid;
151
- border-color: var(--border-color);
152
+ border-color: var(--border-color, var(--internal-border-color));
152
153
  background: var(--background);
153
154
  color: var(--color);
154
155
  font-size: inherit;
@@ -171,6 +172,30 @@
171
172
  display: none;
172
173
  }
173
174
 
175
+ .input-otp-bottom {
176
+ font-size: 0.75rem;
177
+ line-height: 1.25rem;
178
+ text-align: center;
179
+ }
180
+
181
+ .input-otp-bottom .error-text {
182
+ display: none;
183
+ color: var(--highlight-color-invalid);
184
+ }
185
+
186
+ .input-otp-bottom .helper-text {
187
+ display: block;
188
+ color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
189
+ }
190
+
191
+ :host(.ion-touched.ion-invalid) .input-otp-bottom .error-text {
192
+ display: block;
193
+ }
194
+
195
+ :host(.ion-touched.ion-invalid) .input-otp-bottom .helper-text {
196
+ display: none;
197
+ }
198
+
174
199
  .input-otp-separator {
175
200
  border-radius: var(--separator-border-radius);
176
201
  flex-shrink: 0;
@@ -220,7 +245,7 @@
220
245
  }
221
246
 
222
247
  :host(.input-otp-fill-solid) {
223
- --border-color: var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));
248
+ --internal-border-color: var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));
224
249
  --background: var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));
225
250
  }
226
251
 
@@ -230,7 +255,7 @@
230
255
 
231
256
  :host(.input-otp-fill-outline.input-otp-disabled) {
232
257
  --background: var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));
233
- --border-color: var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));
258
+ --internal-border-color: var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));
234
259
  }
235
260
 
236
261
  :host(.input-otp-disabled),
@@ -249,7 +274,7 @@
249
274
 
250
275
  :host(.input-otp-fill-solid.input-otp-disabled),
251
276
  :host(.input-otp-fill-solid.input-otp-readonly) {
252
- --border-color: var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));
277
+ --internal-border-color: var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));
253
278
  --background: var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));
254
279
  }
255
280
 
@@ -377,5 +402,5 @@
377
402
  }
378
403
 
379
404
  :host(.input-otp-fill-outline) {
380
- --border-color: var(--ion-color-step-300, var(--ion-background-color-step-300, #b3b3b3));
405
+ --internal-border-color: var(--ion-color-step-300, var(--ion-background-color-step-300, #b3b3b3));
381
406
  }
@@ -4,7 +4,6 @@
4
4
  import { Build, Host, forceUpdate, h } from "@stencil/core";
5
5
  import { createAttributeController } from "../../utils/attribute-controller";
6
6
  import { raf } from "../../utils/helpers";
7
- import { isRTL } from "../../utils/rtl/index";
8
7
  import { createColorClasses, hostContext, openURL } from "../../utils/theme";
9
8
  import { chevronForward } from "ionicons/icons";
10
9
  import { getIonMode } from "../../global/ionic-global";
@@ -239,7 +238,7 @@ export class Item {
239
238
  return controls[0];
240
239
  }
241
240
  render() {
242
- const { detail, detailIcon, download, labelColorStyles, lines, disabled, href, rel, target, routerAnimation, routerDirection, multipleInputs, el, } = this;
241
+ const { detail, detailIcon, download, labelColorStyles, lines, disabled, href, rel, target, routerAnimation, routerDirection, multipleInputs, } = this;
243
242
  const inheritedAriaAttributes = this.ariaController?.attributes ?? {};
244
243
  const childStyles = {};
245
244
  const mode = getIonMode(this);
@@ -316,7 +315,7 @@ export class Item {
316
315
  * multi-input item, and in a clickable item, which is a second tab stop.
317
316
  */
318
317
  const slottedIndicatorNeedsRoom = this.hasSlottedIndicatorControl && (multipleInputs || this.isClickable());
319
- return (h(Host, { key: 'dedd4fbc4f9e4db557c6f8bd91299778af9aba1c', "aria-disabled": ariaDisabled, class: {
318
+ return (h(Host, { key: '7fe924642310c19f057ae1bfa29c1acdf5cc7ed6', "aria-disabled": ariaDisabled, class: {
320
319
  ...childStyles,
321
320
  ...labelColorStyles,
322
321
  ...createColorClasses(this.color, {
@@ -331,9 +330,9 @@ export class Item {
331
330
  'item-focus-indicator-room': slottedIndicatorNeedsRoom,
332
331
  'ion-activatable': canActivate,
333
332
  'ion-focusable': this.focusable,
334
- 'item-rtl': isRTL(el),
333
+ 'item-rtl': document.dir === 'rtl',
335
334
  }),
336
- }, role: inList ? 'listitem' : null }, h(TagType, { key: '949000f555bbc8b76a227d84a2442defc3577a4e', ...attrs, ...inheritedAriaAttributes, class: "item-native", part: "native", disabled: disabled, ...clickFn }, h("slot", { key: '9fde070c0f830cfed9c7e25ea4d1f1d7ab710d07', name: "start", onSlotchange: this.updateInteractivityOnSlotChange }), h("div", { key: 'd7ab19b4d7e5d4a7fec2d66e1cb865ff30c609f0', class: "item-inner", part: "inner" }, h("div", { key: 'fdf3f306b98ab6af536e320341985fb34d50ef35', class: "input-wrapper", part: "container" }, h("slot", { key: '06ecb3817c2bdf171f806e2b3e8701d3eb52897e', onSlotchange: this.updateInteractivityOnSlotChange })), h("slot", { key: '7e401db776cd19b0399004e77920b23e526c551a', name: "end", onSlotchange: this.updateInteractivityOnSlotChange }), showDetail && (h("ion-icon", { key: '1dac0a6d5a1ce811731fd5b81b92440de8725989', icon: detailIcon, lazy: false, class: "item-detail-icon", part: "detail-icon", "aria-hidden": "true", "flip-rtl": detailIcon === chevronForward }))), canActivate && mode === 'md' && h("ion-ripple-effect", { key: '7a782fa9c7e74e600191c41c7dd90a4a499de64e' }))));
335
+ }, role: inList ? 'listitem' : null }, h(TagType, { key: '8fddfb2a076b4b98e45ee8b23579d011dba12acb', ...attrs, ...inheritedAriaAttributes, class: "item-native", part: "native", disabled: disabled, ...clickFn }, h("slot", { key: '7f888b62b2023cf501fd308e32629e7a291c2d05', name: "start", onSlotchange: this.updateInteractivityOnSlotChange }), h("div", { key: '6d5cdde307caa65b131edb65cb0a5f8294cf151c', class: "item-inner", part: "inner" }, h("div", { key: '9fbfffdff4cf51adf1f02d573953cf8b145574b0', class: "input-wrapper", part: "container" }, h("slot", { key: '574c7e61cdaa3959a28bad7353105ef217a76ed9', onSlotchange: this.updateInteractivityOnSlotChange })), h("slot", { key: 'ed7e211960cd65ed17f865a6d50d5bdde069416b', name: "end", onSlotchange: this.updateInteractivityOnSlotChange }), showDetail && (h("ion-icon", { key: '2847bb21f42e9d5ab8ea86262b2bc1c3b3f7c902', icon: detailIcon, lazy: false, class: "item-detail-icon", part: "detail-icon", "aria-hidden": "true", "flip-rtl": detailIcon === chevronForward }))), canActivate && mode === 'md' && h("ion-ripple-effect", { key: '55502ef394db0953144387fa3baebf9fa6a976a9' }))));
337
336
  }
338
337
  static get is() { return "ion-item"; }
339
338
  static get encapsulation() { return "shadow"; }
@@ -20,8 +20,8 @@ export class ItemOptions {
20
20
  }
21
21
  render() {
22
22
  const mode = getIonMode(this);
23
- const isEnd = isEndSide(this.side, this.el);
24
- return (h(Host, { key: '47d4bf67ac04745ce2d4990844257320f27908dd', class: {
23
+ const isEnd = isEndSide(this.side);
24
+ return (h(Host, { key: '6e60ff004d48bf7701711e518ec0b21264496ae8', class: {
25
25
  [mode]: true,
26
26
  // Used internally for styling
27
27
  [`item-options-${mode}`]: true,
@@ -5,7 +5,6 @@ import { Host, h } from "@stencil/core";
5
5
  import { findClosestIonContent, disableContentScrollY, resetContentScrollY } from "../../utils/content/index";
6
6
  import { componentOnReady, isEndSide } from "../../utils/helpers";
7
7
  import { printIonWarning } from "../../utils/logging/index";
8
- import { isRTL } from "../../utils/rtl/index";
9
8
  import { watchForOptions } from "../../utils/watch-options";
10
9
  import { getIonMode } from "../../global/ionic-global";
11
10
  const SWIPE_MARGIN = 30;
@@ -121,7 +120,7 @@ export class ItemSliding {
121
120
  side = optionsToOpen === this.leftOptions ? 'start' : 'end';
122
121
  }
123
122
  // In RTL we want to switch the sides
124
- side = isEndSide(side, this.el) ? 'end' : 'start';
123
+ side = isEndSide(side) ? 'end' : 'start';
125
124
  const isStartOpen = this.openAmount < 0;
126
125
  const isEndOpen = this.openAmount > 0;
127
126
  /**
@@ -190,7 +189,7 @@ export class ItemSliding {
190
189
  // Reset left and right options in case they were removed
191
190
  this.leftOptions = this.rightOptions = undefined;
192
191
  for (const option of options) {
193
- const side = isEndSide(option.side ?? option.getAttribute('side'), option) ? 'end' : 'start';
192
+ const side = isEndSide(option.side ?? option.getAttribute('side')) ? 'end' : 'start';
194
193
  if (side === 'start') {
195
194
  this.leftOptions = option;
196
195
  sides |= 1 /* ItemSide.Start */;
@@ -209,7 +208,7 @@ export class ItemSliding {
209
208
  * do not open left side so swipe to go
210
209
  * back will still work.
211
210
  */
212
- const rtl = isRTL(this.el);
211
+ const rtl = document.dir === 'rtl';
213
212
  const atEdge = rtl ? window.innerWidth - gesture.startX < 15 : gesture.startX < 15;
214
213
  if (atEdge) {
215
214
  return false;
@@ -388,7 +387,7 @@ export class ItemSliding {
388
387
  }
389
388
  render() {
390
389
  const mode = getIonMode(this);
391
- return (h(Host, { key: '94e1e3ae3505bc821b4c806a1e99a0c707ffec64', class: {
390
+ return (h(Host, { key: '02174ca963753d3a51a4249068f3d436f8acb03d', class: {
392
391
  [mode]: true,
393
392
  'item-sliding-active-slide': this.state !== 2 /* SlidingState.Disabled */,
394
393
  'item-sliding-active-options-end': (this.state & 8 /* SlidingState.End */) !== 0,
@@ -2,7 +2,6 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { Host, h } from "@stencil/core";
5
- import { isRTL } from "../../utils/rtl/index";
6
5
  import { createColorClasses, hostContext } from "../../utils/theme";
7
6
  import { getIonMode } from "../../global/ionic-global";
8
7
  /**
@@ -59,13 +58,13 @@ export class Label {
59
58
  render() {
60
59
  const position = this.position;
61
60
  const mode = getIonMode(this);
62
- return (h(Host, { key: '5415f57fc93a0b2b82b6d327a8e635876ca5cbf5', class: createColorClasses(this.color, {
61
+ return (h(Host, { key: '461604c1887f322dc13d7df3d5cdbb7ee1361117', class: createColorClasses(this.color, {
63
62
  [mode]: true,
64
63
  'in-item-color': hostContext('ion-item.ion-color', this.el),
65
64
  [`label-${position}`]: position !== undefined,
66
65
  [`label-no-animate`]: this.noAnimate,
67
- 'label-rtl': isRTL(this.el),
68
- }) }, h("slot", { key: 'b6b65053228525c94a06c20abb0f03c659cdd7dc' })));
66
+ 'label-rtl': document.dir === 'rtl',
67
+ }) }, h("slot", { key: 'a7005d0a217641278aa8e95144e8e4b9ae87a1c5' })));
69
68
  }
70
69
  static get is() { return "ion-label"; }
71
70
  static get encapsulation() { return "scoped"; }
@@ -3,7 +3,6 @@
3
3
  */
4
4
  import { createAnimation } from "../../../utils/animation/animation";
5
5
  import { getElementRoot } from "../../../utils/helpers";
6
- import { isRTL } from "../../../utils/rtl/index";
7
6
  import { calculateWindowAdjustment, getArrowDimensions, getElementCSSZoom, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets, shouldShowArrow, } from "../utils";
8
7
  const POPOVER_IOS_BODY_PADDING = 5;
9
8
  /**
@@ -22,7 +21,7 @@ const POPOVER_IOS_MIN_EDGE_MARGIN = 25;
22
21
  export const iosEnterAnimation = (baseEl, opts) => {
23
22
  const { event: ev, size, trigger, reference, side, align } = opts;
24
23
  const doc = baseEl.ownerDocument;
25
- const rtl = isRTL(baseEl);
24
+ const isRTL = doc.dir === 'rtl';
26
25
  const root = getElementRoot(baseEl);
27
26
  const contentEl = root.querySelector('.popover-content');
28
27
  const arrowEl = root.querySelector('.popover-arrow');
@@ -48,10 +47,10 @@ export const iosEnterAnimation = (baseEl, opts) => {
48
47
  const defaultPosition = {
49
48
  top: bodyHeight / 2 - contentHeight / 2,
50
49
  left: bodyWidth / 2 - contentWidth / 2,
51
- originX: rtl ? 'right' : 'left',
50
+ originX: isRTL ? 'right' : 'left',
52
51
  originY: 'top',
53
52
  };
54
- const results = getPopoverPosition(rtl, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev, zoom);
53
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev, zoom);
55
54
  const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING;
56
55
  const rawSafeArea = getSafeAreaInsets(doc);
57
56
  const safeArea = size === 'cover'
@@ -3,7 +3,6 @@
3
3
  */
4
4
  import { createAnimation } from "../../../utils/animation/animation";
5
5
  import { getElementRoot } from "../../../utils/helpers";
6
- import { isRTL } from "../../../utils/rtl/index";
7
6
  import { calculateWindowAdjustment, getElementCSSZoom, getPopoverDimensions, getPopoverPosition, getSafeAreaInsets, } from "../utils";
8
7
  const POPOVER_MD_BODY_PADDING = 12;
9
8
  /**
@@ -13,7 +12,7 @@ const POPOVER_MD_BODY_PADDING = 12;
13
12
  export const mdEnterAnimation = (baseEl, opts) => {
14
13
  const { event: ev, size, trigger, reference, side, align } = opts;
15
14
  const doc = baseEl.ownerDocument;
16
- const rtl = isRTL(baseEl);
15
+ const isRTL = doc.dir === 'rtl';
17
16
  const root = getElementRoot(baseEl);
18
17
  const contentEl = root.querySelector('.popover-content');
19
18
  /**
@@ -37,10 +36,10 @@ export const mdEnterAnimation = (baseEl, opts) => {
37
36
  const defaultPosition = {
38
37
  top: bodyHeight / 2 - contentHeight / 2,
39
38
  left: bodyWidth / 2 - contentWidth / 2,
40
- originX: rtl ? 'right' : 'left',
39
+ originX: isRTL ? 'right' : 'left',
41
40
  originY: 'top',
42
41
  };
43
- const results = getPopoverPosition(rtl, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev, zoom);
42
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev, zoom);
44
43
  const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING;
45
44
  // MD mode now applies safe-area insets (previously passed 0, ignoring all safe areas).
46
45
  // This is needed for Android edge-to-edge (API 36+) where system bars overlap content.
@@ -9,7 +9,6 @@ import { createLockController } from "../../utils/lock-controller";
9
9
  import { printIonWarning } from "../../utils/logging/index";
10
10
  import { BACKDROP, cleanupRootFocusTrapAccessibility, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, prepareOverlay, present, restoreRootFocusTrapAccessibility, setOverlayId, } from "../../utils/overlays";
11
11
  import { isPlatform } from "../../utils/platform";
12
- import { isRTL } from "../../utils/rtl/index";
13
12
  import { getClassMap } from "../../utils/theme";
14
13
  import { deepReady, waitForMount } from "../../utils/transition/index";
15
14
  import { getIonMode } from "../../global/ionic-global";
@@ -35,7 +34,6 @@ export class Popover {
35
34
  this.lockController = createLockController();
36
35
  this.inline = false;
37
36
  this.focusDescendantOnPresent = false;
38
- this.dirSetOnPresent = false;
39
37
  this.presented = false;
40
38
  /** @internal */
41
39
  this.hasController = false;
@@ -336,15 +334,6 @@ export class Popover {
336
334
  }
337
335
  const { el } = this;
338
336
  const { inline, delegate } = this.getDelegate(true);
339
- /**
340
- * When presented, ion-popover is hoisted from its place in the element
341
- * hierarchy. Copy the current direction onto this element so that child
342
- * elements can match.
343
- */
344
- if (!el.hasAttribute('dir')) {
345
- el.setAttribute('dir', isRTL(el) ? 'rtl' : 'ltr');
346
- this.dirSetOnPresent = true;
347
- }
348
337
  /**
349
338
  * Emit ionMount so JS Frameworks have an opportunity
350
339
  * to add the child component to the DOM. The child
@@ -465,10 +454,6 @@ export class Popover {
465
454
  */
466
455
  const { delegate } = this.getDelegate();
467
456
  await detachComponent(delegate, this.usersElement);
468
- if (this.dirSetOnPresent) {
469
- this.el.removeAttribute('dir');
470
- this.dirSetOnPresent = false;
471
- }
472
457
  }
473
458
  unlock();
474
459
  return shouldDismiss;
@@ -496,7 +481,7 @@ export class Popover {
496
481
  const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
497
482
  const desktop = isPlatform('desktop');
498
483
  const enableArrow = arrow && !parentPopover;
499
- return (h(Host, { key: '083f06f04d2c2657e510b471fba81cc459e0e878', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
484
+ return (h(Host, { key: 'b5e9c788f58397203976d5f8302dfb89e916efe1', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
500
485
  zIndex: `${20000 + this.overlayIndex}`,
501
486
  }, class: {
502
487
  ...getClassMap(this.cssClass),
@@ -507,7 +492,7 @@ export class Popover {
507
492
  [`popover-side-${side}`]: true,
508
493
  [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
509
494
  'popover-nested': !!parentPopover,
510
- }, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && h("ion-backdrop", { key: 'afd9bfa3edfde061603acfc251eb8ac54c85ec6f', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '04314c9b510342f152027a6d62394b74d2888b88', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: 'e1bc715a4ca37012d109b512e2288c932485bf45', class: "popover-arrow", part: "arrow" }), h("div", { key: '5ab527ca65b483865954005239618de7daf2c621', class: "popover-content", part: "content" }, h("slot", { key: '4d3abb569347f6156d426f98b897e79ffd6b53bc' })))));
495
+ }, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && h("ion-backdrop", { key: 'f3977833c5b2c0087c286ee54363b478d69eb115', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '1059893d6fd2932ca8adcdf8d45a5d66f4794727', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '24d7988bdd95882ad77fcaa7112aeda55878bee4', class: "popover-arrow", part: "arrow" }), h("div", { key: '4d6992e0a9d629f11763045f9199f9a77fa521ab', class: "popover-content", part: "content" }, h("slot", { key: 'b29747419620a01a6c34e9e846cd529b0b210145' })))));
511
496
  }
512
497
  static get is() { return "ion-popover"; }
513
498
  static get encapsulation() { return "shadow"; }