@ionic/core 7.5.8-dev.11703088210.14a72b83 → 7.5.8-dev.11704294569.1abc989d

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 (500) hide show
  1. package/components/action-sheet.js +1 -1
  2. package/components/alert.js +2 -2
  3. package/components/backdrop.js +0 -12
  4. package/components/button.js +2 -2
  5. package/components/checkbox.js +2 -2
  6. package/components/gesture-controller.js +1 -1
  7. package/components/ion-back-button.js +1 -1
  8. package/components/ion-badge.js +2 -2
  9. package/components/ion-content.js +3 -4
  10. package/components/ion-datetime.js +15 -48
  11. package/components/ion-fab-button.js +2 -2
  12. package/components/ion-input.js +4 -2
  13. package/components/ion-item-option.js +2 -2
  14. package/components/ion-loading.js +1 -1
  15. package/components/ion-menu-button.js +1 -1
  16. package/components/ion-picker.js +2 -2
  17. package/components/ion-progress-bar.js +2 -2
  18. package/components/ion-range.js +2 -2
  19. package/components/ion-refresher-content.js +4 -11
  20. package/components/ion-refresher.js +184 -5
  21. package/components/ion-router-link.js +1 -1
  22. package/components/ion-searchbar.js +3 -1
  23. package/components/ion-segment-button.js +1 -1
  24. package/components/ion-select.js +2 -2
  25. package/components/ion-tab-bar.js +2 -2
  26. package/components/ion-textarea.js +4 -2
  27. package/components/ion-toast.js +2 -2
  28. package/components/ion-toggle.js +2 -2
  29. package/components/item.js +2 -2
  30. package/components/label.js +1 -1
  31. package/components/overlays.js +5 -1
  32. package/components/picker-column.js +1 -1
  33. package/components/radio.js +2 -2
  34. package/components/select-popover.js +1 -1
  35. package/css/core.css +35 -34
  36. package/css/core.css.map +1 -1
  37. package/css/global.bundle.css +1 -1
  38. package/css/ionic.bundle.css +1 -1
  39. package/css/ionic.bundle.css.map +1 -1
  40. package/css/themes/dark.always.css +122 -0
  41. package/css/themes/dark.always.css.map +1 -0
  42. package/css/themes/dark.class.css +122 -0
  43. package/css/themes/dark.class.css.map +1 -0
  44. package/css/themes/dark.css +3 -0
  45. package/css/themes/dark.css.map +1 -0
  46. package/css/themes/dark.system.css +124 -0
  47. package/css/themes/dark.system.css.map +1 -0
  48. package/css/typography.css +1 -1
  49. package/dist/cjs/{app-globals-28656db1.js → app-globals-0af482c7.js} +1 -1
  50. package/dist/cjs/{button-active-75b38d77.js → button-active-9d7e0640.js} +2 -2
  51. package/dist/cjs/{gesture-controller-c40c045a.js → gesture-controller-9436f482.js} +1 -0
  52. package/dist/cjs/{index-097270a3.js → index-5cbb20f9.js} +1 -1
  53. package/dist/cjs/{index-b0102f48.js → index-bbb4336c.js} +39 -1
  54. package/dist/cjs/{index-cb3e0ab7.js → index-d4c2e02c.js} +3 -3
  55. package/dist/cjs/{index-d1b59ffa.js → index-ee07ed59.js} +1 -1
  56. package/dist/cjs/index.cjs.js +9 -9
  57. package/dist/cjs/ion-accordion_2.cjs.entry.js +2 -2
  58. package/dist/cjs/ion-action-sheet.cjs.entry.js +7 -7
  59. package/dist/cjs/ion-alert.cjs.entry.js +8 -8
  60. package/dist/cjs/ion-app_8.cjs.entry.js +8 -9
  61. package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -4
  62. package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
  63. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -14
  64. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
  65. package/dist/cjs/ion-button_2.cjs.entry.js +4 -4
  66. package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
  67. package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
  68. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  69. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  70. package/dist/cjs/ion-datetime-button.cjs.entry.js +2 -2
  71. package/dist/cjs/ion-datetime_3.cjs.entry.js +15 -29
  72. package/dist/cjs/ion-fab_3.cjs.entry.js +4 -4
  73. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  74. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -2
  75. package/dist/cjs/ion-input.cjs.entry.js +6 -4
  76. package/dist/cjs/ion-item-option_3.cjs.entry.js +5 -5
  77. package/dist/cjs/ion-item_8.cjs.entry.js +5 -5
  78. package/dist/cjs/ion-loading.cjs.entry.js +5 -4
  79. package/dist/cjs/ion-menu_3.cjs.entry.js +7 -7
  80. package/dist/cjs/ion-modal.cjs.entry.js +6 -6
  81. package/dist/cjs/ion-nav_2.cjs.entry.js +4 -4
  82. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +2 -2
  83. package/dist/cjs/ion-picker-internal.cjs.entry.js +1 -1
  84. package/dist/cjs/ion-popover.cjs.entry.js +5 -4
  85. package/dist/cjs/ion-progress-bar.cjs.entry.js +4 -4
  86. package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
  87. package/dist/cjs/ion-range.cjs.entry.js +5 -5
  88. package/dist/cjs/ion-refresher_2.cjs.entry.js +19 -34
  89. package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
  90. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  91. package/dist/cjs/ion-route_4.cjs.entry.js +3 -3
  92. package/dist/cjs/ion-searchbar.cjs.entry.js +5 -3
  93. package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
  94. package/dist/cjs/ion-select_3.cjs.entry.js +7 -6
  95. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  96. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  97. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
  98. package/dist/cjs/ion-tab_2.cjs.entry.js +1 -1
  99. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  100. package/dist/cjs/ion-textarea.cjs.entry.js +6 -4
  101. package/dist/cjs/ion-toast.cjs.entry.js +6 -5
  102. package/dist/cjs/ion-toggle.cjs.entry.js +5 -5
  103. package/dist/cjs/{ionic-global-62510d64.js → ionic-global-f4a2093b.js} +1 -1
  104. package/dist/cjs/ionic.cjs.js +5 -5
  105. package/dist/cjs/{ios.transition-d9c0e4fb.js → ios.transition-a4ffb5a2.js} +2 -2
  106. package/dist/cjs/loader.cjs.js +4 -4
  107. package/dist/cjs/{md.transition-4fac8a87.js → md.transition-292abe1c.js} +2 -2
  108. package/dist/cjs/{overlays-b1471172.js → overlays-2c6b1072.js} +6 -2
  109. package/dist/cjs/{status-tap-0aa8e1f2.js → status-tap-415acac6.js} +1 -1
  110. package/dist/cjs/{swipe-back-2a858bbd.js → swipe-back-b8f2330b.js} +2 -2
  111. package/dist/collection/collection-manifest.json +1 -1
  112. package/dist/collection/components/action-sheet/action-sheet.ios.css +3 -3
  113. package/dist/collection/components/action-sheet/test/a11y/action-sheet.e2e.js +23 -14
  114. package/dist/collection/components/alert/alert.ios.css +6 -6
  115. package/dist/collection/components/alert/alert.md.css +6 -6
  116. package/dist/collection/components/alert/test/a11y/alert.e2e.js +22 -9
  117. package/dist/collection/components/back-button/back-button.ios.css +1 -1
  118. package/dist/collection/components/back-button/test/a11y/back-button.e2e.js +21 -0
  119. package/dist/collection/components/backdrop/backdrop.js +0 -12
  120. package/dist/collection/components/badge/badge.ios.css +1 -1
  121. package/dist/collection/components/badge/badge.md.css +1 -1
  122. package/dist/collection/components/badge/test/a11y/badge.e2e.js +18 -0
  123. package/dist/collection/components/button/button.ios.css +10 -10
  124. package/dist/collection/components/button/button.md.css +8 -8
  125. package/dist/collection/components/button/test/a11y/button.e2e.js +48 -0
  126. package/dist/collection/components/checkbox/checkbox.ios.css +2 -2
  127. package/dist/collection/components/checkbox/checkbox.md.css +2 -2
  128. package/dist/collection/components/checkbox/test/a11y/checkbox.e2e.js +11 -2
  129. package/dist/collection/components/content/content.css +0 -4
  130. package/dist/collection/components/content/content.js +2 -3
  131. package/dist/collection/components/datetime/datetime.ios.css +83 -24
  132. package/dist/collection/components/datetime/datetime.js +5 -20
  133. package/dist/collection/components/datetime/datetime.md.css +88 -24
  134. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
  135. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +6 -9
  136. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +10 -0
  137. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
  138. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +2 -2
  139. package/dist/collection/components/fab-button/fab-button.ios.css +13 -13
  140. package/dist/collection/components/fab-button/fab-button.md.css +4 -4
  141. package/dist/collection/components/fab-button/test/a11y/fab-button.e2e.js +50 -0
  142. package/dist/collection/components/input/input.ios.css +3 -3
  143. package/dist/collection/components/input/input.js +4 -2
  144. package/dist/collection/components/input/input.md.css +3 -3
  145. package/dist/collection/components/input/test/a11y/input.e2e.js +35 -3
  146. package/dist/collection/components/item/item.ios.css +3 -3
  147. package/dist/collection/components/item/item.md.css +4 -4
  148. package/dist/collection/components/item-option/item-option.ios.css +2 -2
  149. package/dist/collection/components/item-option/item-option.md.css +1 -1
  150. package/dist/collection/components/item-sliding/test/a11y/item-sliding.e2e.js +28 -0
  151. package/dist/collection/components/label/label.md.css +1 -1
  152. package/dist/collection/components/label/test/a11y/label.e2e.js +20 -0
  153. package/dist/collection/components/loading/loading.md.css +1 -1
  154. package/dist/collection/components/loading/test/a11y/loading.e2e.js +21 -5
  155. package/dist/collection/components/menu-button/menu-button.ios.css +1 -1
  156. package/dist/collection/components/menu-button/test/a11y/menu-button.e2e.js +14 -0
  157. package/dist/collection/components/picker/picker.ios.css +1 -1
  158. package/dist/collection/components/picker/picker.md.css +1 -1
  159. package/dist/collection/components/picker-column/picker-column.md.css +1 -1
  160. package/dist/collection/components/picker-internal/test/a11y/picker-internal.e2e.js +18 -2
  161. package/dist/collection/components/progress-bar/progress-bar.ios.css +2 -2
  162. package/dist/collection/components/progress-bar/progress-bar.md.css +2 -2
  163. package/dist/collection/components/progress-bar/test/a11y/progress-bar.e2e.js +24 -0
  164. package/dist/collection/components/radio/radio.ios.css +2 -2
  165. package/dist/collection/components/radio/radio.md.css +2 -2
  166. package/dist/collection/components/radio/test/a11y/radio.e2e.js +44 -6
  167. package/dist/collection/components/range/range.ios.css +1 -1
  168. package/dist/collection/components/range/range.md.css +3 -3
  169. package/dist/collection/components/range/test/a11y/range.e2e.js +18 -8
  170. package/dist/collection/components/refresher/refresher.md.css +2 -2
  171. package/dist/collection/components/refresher/refresher.utils.js +11 -19
  172. package/dist/collection/components/refresher/test/a11y/refresher.e2e.js +25 -0
  173. package/dist/collection/components/refresher-content/refresher-content.js +4 -10
  174. package/dist/collection/components/router-link/router-link.css +1 -1
  175. package/dist/collection/components/router-link/test/a11y/router-link.e2e.js +23 -0
  176. package/dist/collection/components/searchbar/searchbar.ios.css +1 -1
  177. package/dist/collection/components/searchbar/searchbar.js +3 -1
  178. package/dist/collection/components/segment/test/a11y/segment.e2e.js +23 -0
  179. package/dist/collection/components/segment-button/segment-button.md.css +2 -2
  180. package/dist/collection/components/select/select.ios.css +3 -3
  181. package/dist/collection/components/select/select.md.css +3 -3
  182. package/dist/collection/components/select/test/a11y/select.e2e.js +59 -4
  183. package/dist/collection/components/select-popover/select-popover.md.css +4 -4
  184. package/dist/collection/components/select-popover/test/a11y/select-popover.e2e.js +32 -0
  185. package/dist/collection/components/tab-bar/tab-bar.ios.css +1 -1
  186. package/dist/collection/components/tab-bar/tab-bar.md.css +1 -1
  187. package/dist/collection/components/textarea/test/a11y/textarea.e2e.js +35 -3
  188. package/dist/collection/components/textarea/textarea.ios.css +3 -3
  189. package/dist/collection/components/textarea/textarea.js +4 -2
  190. package/dist/collection/components/textarea/textarea.md.css +3 -3
  191. package/dist/collection/components/toast/test/a11y/toast.e2e.js +56 -24
  192. package/dist/collection/components/toast/toast.ios.css +1 -1
  193. package/dist/collection/components/toast/toast.md.css +2 -2
  194. package/dist/collection/components/toggle/test/a11y/toggle.e2e.js +8 -2
  195. package/dist/collection/components/toggle/toggle.ios.css +1 -1
  196. package/dist/collection/components/toggle/toggle.md.css +2 -2
  197. package/dist/collection/css/test/a11y/typography.e2e.js +18 -0
  198. package/dist/collection/themes/test/colors/theme.e2e.js +114 -0
  199. package/dist/collection/utils/gesture/gesture-controller.js +1 -1
  200. package/dist/collection/utils/overlays.js +5 -1
  201. package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +65 -0
  202. package/dist/collection/utils/test/playwright/generator.js +1 -0
  203. package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
  204. package/dist/docs.json +13 -24
  205. package/dist/esm/{app-globals-c23144fc.js → app-globals-722340c4.js} +1 -1
  206. package/dist/esm/{button-active-7013b5a1.js → button-active-ed9d848c.js} +2 -2
  207. package/dist/esm/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
  208. package/dist/esm/{index-39329c6f.js → index-08d686eb.js} +39 -1
  209. package/dist/esm/{index-2cf77112.js → index-39782642.js} +2 -2
  210. package/dist/esm/{index-7a818ed3.js → index-80492ed3.js} +1 -1
  211. package/dist/esm/{index-bebaae5d.js → index-d8817fb0.js} +3 -3
  212. package/dist/esm/index.js +9 -9
  213. package/dist/esm/ion-accordion_2.entry.js +2 -2
  214. package/dist/esm/ion-action-sheet.entry.js +7 -7
  215. package/dist/esm/ion-alert.entry.js +8 -8
  216. package/dist/esm/ion-app_8.entry.js +8 -9
  217. package/dist/esm/ion-avatar_3.entry.js +4 -4
  218. package/dist/esm/ion-back-button.entry.js +3 -3
  219. package/dist/esm/ion-backdrop.entry.js +2 -14
  220. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  221. package/dist/esm/ion-button_2.entry.js +4 -4
  222. package/dist/esm/ion-card_5.entry.js +2 -2
  223. package/dist/esm/ion-checkbox.entry.js +4 -4
  224. package/dist/esm/ion-chip.entry.js +2 -2
  225. package/dist/esm/ion-col_3.entry.js +2 -2
  226. package/dist/esm/ion-datetime-button.entry.js +2 -2
  227. package/dist/esm/ion-datetime_3.entry.js +15 -29
  228. package/dist/esm/ion-fab_3.entry.js +4 -4
  229. package/dist/esm/ion-img.entry.js +2 -2
  230. package/dist/esm/ion-infinite-scroll_2.entry.js +2 -2
  231. package/dist/esm/ion-input.entry.js +6 -4
  232. package/dist/esm/ion-item-option_3.entry.js +5 -5
  233. package/dist/esm/ion-item_8.entry.js +5 -5
  234. package/dist/esm/ion-loading.entry.js +5 -4
  235. package/dist/esm/ion-menu_3.entry.js +7 -7
  236. package/dist/esm/ion-modal.entry.js +6 -6
  237. package/dist/esm/ion-nav_2.entry.js +4 -4
  238. package/dist/esm/ion-picker-column-internal.entry.js +2 -2
  239. package/dist/esm/ion-picker-internal.entry.js +1 -1
  240. package/dist/esm/ion-popover.entry.js +5 -4
  241. package/dist/esm/ion-progress-bar.entry.js +4 -4
  242. package/dist/esm/ion-radio_2.entry.js +4 -4
  243. package/dist/esm/ion-range.entry.js +5 -5
  244. package/dist/esm/ion-refresher_2.entry.js +19 -34
  245. package/dist/esm/ion-reorder_2.entry.js +3 -3
  246. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  247. package/dist/esm/ion-route_4.entry.js +3 -3
  248. package/dist/esm/ion-searchbar.entry.js +5 -3
  249. package/dist/esm/ion-segment_2.entry.js +4 -4
  250. package/dist/esm/ion-select_3.entry.js +7 -6
  251. package/dist/esm/ion-spinner.entry.js +2 -2
  252. package/dist/esm/ion-split-pane.entry.js +2 -2
  253. package/dist/esm/ion-tab-bar_2.entry.js +4 -4
  254. package/dist/esm/ion-tab_2.entry.js +1 -1
  255. package/dist/esm/ion-text.entry.js +2 -2
  256. package/dist/esm/ion-textarea.entry.js +6 -4
  257. package/dist/esm/ion-toast.entry.js +6 -5
  258. package/dist/esm/ion-toggle.entry.js +5 -5
  259. package/dist/esm/{ionic-global-6c78e871.js → ionic-global-c0cda98e.js} +1 -1
  260. package/dist/esm/ionic.js +6 -6
  261. package/dist/esm/{ios.transition-daa373e9.js → ios.transition-fd16bec1.js} +2 -2
  262. package/dist/esm/loader.js +5 -5
  263. package/dist/esm/{md.transition-91c3d3cc.js → md.transition-94ac93e1.js} +2 -2
  264. package/dist/esm/{overlays-64e67e2c.js → overlays-d23ea6e1.js} +6 -2
  265. package/dist/esm/{status-tap-9dd45200.js → status-tap-2b93b1b5.js} +1 -1
  266. package/dist/esm/{swipe-back-a6f386fc.js → swipe-back-a8ca7f93.js} +2 -2
  267. package/dist/esm-es5/app-globals-722340c4.js +4 -0
  268. package/dist/esm-es5/{button-active-7013b5a1.js → button-active-ed9d848c.js} +1 -1
  269. package/dist/esm-es5/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
  270. package/dist/esm-es5/{index-39329c6f.js → index-08d686eb.js} +1 -1
  271. package/dist/esm-es5/{index-2cf77112.js → index-39782642.js} +1 -1
  272. package/dist/esm-es5/{index-7a818ed3.js → index-80492ed3.js} +1 -1
  273. package/dist/esm-es5/{index-bebaae5d.js → index-d8817fb0.js} +1 -1
  274. package/dist/esm-es5/index.js +1 -1
  275. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  276. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  277. package/dist/esm-es5/ion-alert.entry.js +1 -1
  278. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  279. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  280. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  281. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  282. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  283. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  284. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  285. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  286. package/dist/esm-es5/ion-chip.entry.js +1 -1
  287. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  288. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  289. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  290. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  291. package/dist/esm-es5/ion-img.entry.js +1 -1
  292. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  293. package/dist/esm-es5/ion-input.entry.js +1 -1
  294. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  295. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  296. package/dist/esm-es5/ion-loading.entry.js +1 -1
  297. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  298. package/dist/esm-es5/ion-modal.entry.js +1 -1
  299. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  300. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  301. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  302. package/dist/esm-es5/ion-popover.entry.js +1 -1
  303. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  304. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  305. package/dist/esm-es5/ion-range.entry.js +1 -1
  306. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  307. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  308. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  309. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  310. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  311. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  312. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  313. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  314. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  315. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  316. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  317. package/dist/esm-es5/ion-text.entry.js +1 -1
  318. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  319. package/dist/esm-es5/ion-toast.entry.js +1 -1
  320. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  321. package/dist/esm-es5/{ionic-global-6c78e871.js → ionic-global-c0cda98e.js} +1 -1
  322. package/dist/esm-es5/ionic.js +1 -1
  323. package/dist/esm-es5/{ios.transition-daa373e9.js → ios.transition-fd16bec1.js} +1 -1
  324. package/dist/esm-es5/loader.js +1 -1
  325. package/dist/esm-es5/{md.transition-91c3d3cc.js → md.transition-94ac93e1.js} +1 -1
  326. package/dist/esm-es5/overlays-d23ea6e1.js +4 -0
  327. package/dist/esm-es5/{status-tap-9dd45200.js → status-tap-2b93b1b5.js} +1 -1
  328. package/dist/esm-es5/swipe-back-a8ca7f93.js +4 -0
  329. package/dist/html.html-data.json +2 -2
  330. package/dist/ionic/index.esm.js +1 -1
  331. package/dist/ionic/ionic.esm.js +1 -1
  332. package/dist/ionic/ionic.js +1 -1
  333. package/dist/ionic/{p-ee4a54e3.entry.js → p-023b1cf4.entry.js} +1 -1
  334. package/dist/ionic/{p-6744eca5.entry.js → p-02e066a0.entry.js} +1 -1
  335. package/dist/ionic/{p-23a27e78.system.entry.js → p-0339b688.system.entry.js} +1 -1
  336. package/dist/ionic/{p-70ecb18b.entry.js → p-0941a5d7.entry.js} +1 -1
  337. package/dist/ionic/{p-a843a90e.system.entry.js → p-098f4d12.system.entry.js} +1 -1
  338. package/dist/ionic/p-0afef6b9.entry.js +4 -0
  339. package/dist/ionic/{p-a0945c3a.system.entry.js → p-0e53f8ea.system.entry.js} +1 -1
  340. package/dist/ionic/{p-d3e123c0.entry.js → p-0ebcff25.entry.js} +1 -1
  341. package/dist/ionic/{p-161d0916.entry.js → p-1161a793.entry.js} +1 -1
  342. package/dist/ionic/{p-89026d53.entry.js → p-1208f939.entry.js} +1 -1
  343. package/dist/ionic/{p-18032a93.entry.js → p-1286049a.entry.js} +1 -1
  344. package/dist/ionic/{p-eef8d7e8.system.entry.js → p-12869199.system.entry.js} +1 -1
  345. package/dist/ionic/p-1786bc72.js +4 -0
  346. package/dist/ionic/{p-bc97b5cd.system.entry.js → p-193ff029.system.entry.js} +1 -1
  347. package/dist/ionic/{p-1631b52f.system.js → p-1d624e03.system.js} +1 -1
  348. package/dist/ionic/{p-2657f213.entry.js → p-1de103b7.entry.js} +1 -1
  349. package/dist/ionic/p-1e57bd24.entry.js +4 -0
  350. package/dist/ionic/{p-3f5ae764.entry.js → p-1fc72959.entry.js} +1 -1
  351. package/dist/ionic/{p-1ff22253.entry.js → p-2092f39f.entry.js} +1 -1
  352. package/dist/ionic/{p-c7c8429a.system.js → p-20d469d0.system.js} +1 -1
  353. package/dist/ionic/{p-b81a8111.system.entry.js → p-2938823a.system.entry.js} +1 -1
  354. package/dist/ionic/{p-46dbd723.entry.js → p-29bf41bd.entry.js} +1 -1
  355. package/dist/ionic/p-2dd0355d.system.entry.js +4 -0
  356. package/dist/ionic/{p-57c0d5bf.system.entry.js → p-2f2293da.system.entry.js} +1 -1
  357. package/dist/ionic/{p-0263eb49.system.js → p-30029cc2.system.js} +1 -1
  358. package/dist/ionic/{p-ac4a7fc0.js → p-31158892.js} +1 -1
  359. package/dist/ionic/p-31cf9613.entry.js +4 -0
  360. package/dist/ionic/p-350f7292.system.entry.js +4 -0
  361. package/dist/ionic/{p-86c2bbc8.entry.js → p-353b349d.entry.js} +1 -1
  362. package/dist/ionic/{p-27e6473f.entry.js → p-3b568d18.entry.js} +1 -1
  363. package/dist/ionic/p-3e13501a.system.entry.js +4 -0
  364. package/dist/ionic/{p-31b2326e.system.js → p-3e1e14d9.system.js} +1 -1
  365. package/dist/ionic/{p-3acad8ff.system.entry.js → p-3e625023.system.entry.js} +1 -1
  366. package/dist/ionic/{p-426bdba9.system.js → p-3fe96156.system.js} +1 -1
  367. package/dist/ionic/{p-e26030f8.system.js → p-4155f352.system.js} +1 -1
  368. package/dist/ionic/p-4890093d.js +4 -0
  369. package/dist/ionic/{p-2cd9cb80.system.entry.js → p-4fb51e61.system.entry.js} +1 -1
  370. package/dist/ionic/p-51abefb7.system.js +4 -0
  371. package/dist/ionic/{p-e8e530fc.entry.js → p-535d2a67.entry.js} +1 -1
  372. package/dist/ionic/{p-a3a145d3.entry.js → p-55a0cd33.entry.js} +1 -1
  373. package/dist/ionic/{p-aac289d2.system.entry.js → p-564af202.system.entry.js} +1 -1
  374. package/dist/ionic/{p-abab375b.system.js → p-57477107.system.js} +1 -1
  375. package/dist/ionic/p-57798ba6.entry.js +4 -0
  376. package/dist/ionic/p-588fdf40.entry.js +4 -0
  377. package/dist/ionic/{p-a5c81b99.entry.js → p-5a68960f.entry.js} +1 -1
  378. package/dist/ionic/{p-6cf08720.entry.js → p-5b20db28.entry.js} +1 -1
  379. package/dist/ionic/{p-34d6f520.system.js → p-5b365ca7.system.js} +1 -1
  380. package/dist/ionic/{p-a1b4dba7.entry.js → p-5b834053.entry.js} +1 -1
  381. package/dist/ionic/{p-21f015cf.js → p-5ecae037.js} +1 -1
  382. package/dist/ionic/{p-67598744.entry.js → p-5fbfa8c9.entry.js} +1 -1
  383. package/dist/ionic/p-5ff60387.system.entry.js +4 -0
  384. package/dist/ionic/p-60b386c9.system.entry.js +4 -0
  385. package/dist/ionic/{p-d0251fc4.entry.js → p-67da080d.entry.js} +1 -1
  386. package/dist/ionic/{p-df361680.system.entry.js → p-6f96f7b1.system.entry.js} +1 -1
  387. package/dist/ionic/{p-fcf49977.system.entry.js → p-73ea8f82.system.entry.js} +1 -1
  388. package/dist/ionic/{p-9f376964.system.entry.js → p-76c94634.system.entry.js} +1 -1
  389. package/dist/ionic/p-76d3765d.js +4 -0
  390. package/dist/ionic/{p-2ac9d078.system.entry.js → p-77965464.system.entry.js} +1 -1
  391. package/dist/ionic/{p-a99f14a7.system.entry.js → p-7828a27f.system.entry.js} +1 -1
  392. package/dist/ionic/{p-f34d6a49.entry.js → p-7a63e024.entry.js} +1 -1
  393. package/dist/ionic/{p-5f46d93e.entry.js → p-7c7e21a7.entry.js} +1 -1
  394. package/dist/ionic/{p-bbe3feee.entry.js → p-80fa068e.entry.js} +1 -1
  395. package/dist/ionic/p-8c97cdc0.entry.js +4 -0
  396. package/dist/ionic/p-8e086176.system.entry.js +4 -0
  397. package/dist/ionic/{p-f5d2dc9b.js → p-8ededb41.js} +1 -1
  398. package/dist/ionic/{p-41f7af3f.system.entry.js → p-90483001.system.entry.js} +1 -1
  399. package/dist/ionic/{p-5f127075.system.entry.js → p-93f25d0d.system.entry.js} +1 -1
  400. package/dist/ionic/p-9588396d.entry.js +4 -0
  401. package/dist/ionic/{p-a0db3de9.system.entry.js → p-9709ebd8.system.entry.js} +1 -1
  402. package/dist/ionic/{p-12cdcb59.js → p-9738fd82.js} +1 -1
  403. package/dist/ionic/{p-8c202d6e.system.entry.js → p-98c798de.system.entry.js} +1 -1
  404. package/dist/ionic/{p-a70b5d24.entry.js → p-98f3d827.entry.js} +1 -1
  405. package/dist/ionic/{p-bb3615f7.js → p-9b97df10.js} +1 -1
  406. package/dist/ionic/{p-89cfbc88.system.entry.js → p-9c229210.system.entry.js} +2 -2
  407. package/dist/ionic/p-9eae578e.system.entry.js +4 -0
  408. package/dist/ionic/{p-93dac17a.system.entry.js → p-9eec42cc.system.entry.js} +1 -1
  409. package/dist/ionic/{p-53a3283e.entry.js → p-a4afcc88.entry.js} +1 -1
  410. package/dist/ionic/p-a60a1ce5.js +4 -0
  411. package/dist/ionic/{p-315ad733.system.entry.js → p-a8e90d15.system.entry.js} +1 -1
  412. package/dist/ionic/{p-90db28f8.system.entry.js → p-a9e3b5be.system.entry.js} +1 -1
  413. package/dist/ionic/p-ab11130c.system.js +4 -0
  414. package/dist/ionic/{p-27a5f2c7.system.entry.js → p-ad8bed54.system.entry.js} +1 -1
  415. package/dist/ionic/p-b1a2a195.system.entry.js +4 -0
  416. package/dist/ionic/{p-98ac0e27.system.entry.js → p-b3b3efba.system.entry.js} +2 -2
  417. package/dist/ionic/{p-58ff9e5b.system.js → p-b4a51c42.system.js} +1 -1
  418. package/dist/ionic/{p-3cb5466e.entry.js → p-b5f9f14c.entry.js} +1 -1
  419. package/dist/ionic/{p-b0fcf130.system.entry.js → p-b6f5e4f2.system.entry.js} +1 -1
  420. package/dist/ionic/{p-99fe0543.entry.js → p-bcd073dd.entry.js} +1 -1
  421. package/dist/ionic/p-be6344dd.entry.js +4 -0
  422. package/dist/ionic/p-c14f8ac8.js +4 -0
  423. package/dist/ionic/{p-acdd8148.js → p-c3c3333a.js} +1 -1
  424. package/dist/ionic/p-c7c7c110.entry.js +4 -0
  425. package/dist/ionic/{p-8261be6c.system.entry.js → p-c847fb35.system.entry.js} +1 -1
  426. package/dist/ionic/{p-e3c44332.system.entry.js → p-c91ccbfa.system.entry.js} +1 -1
  427. package/dist/ionic/p-c9e07b2f.entry.js +4 -0
  428. package/dist/ionic/{p-ad953217.system.entry.js → p-caf21b46.system.entry.js} +1 -1
  429. package/dist/ionic/p-ccc2fb62.system.entry.js +4 -0
  430. package/dist/ionic/{p-19545a49.system.entry.js → p-cce9f61a.system.entry.js} +1 -1
  431. package/dist/ionic/{p-71d986ae.entry.js → p-cef8c5c2.entry.js} +1 -1
  432. package/dist/ionic/{p-1c6c6098.entry.js → p-cfe57b1b.entry.js} +1 -1
  433. package/dist/ionic/{p-64af4468.entry.js → p-d1025b3d.entry.js} +1 -1
  434. package/dist/ionic/p-d32188f3.system.entry.js +4 -0
  435. package/dist/ionic/{p-c04accad.entry.js → p-d37b441e.entry.js} +1 -1
  436. package/dist/ionic/{p-4f71a9cf.system.entry.js → p-d39db09e.system.entry.js} +1 -1
  437. package/dist/ionic/{p-f8c5a0dd.system.js → p-d3b030b8.system.js} +1 -1
  438. package/dist/ionic/{p-405f1a72.entry.js → p-d51019a8.entry.js} +1 -1
  439. package/dist/ionic/{p-91f9e81b.js → p-d662d908.js} +1 -1
  440. package/dist/ionic/p-d7e9a0ac.entry.js +4 -0
  441. package/dist/ionic/p-da15f571.system.entry.js +4 -0
  442. package/dist/ionic/{p-3535a36c.entry.js → p-ddb30596.entry.js} +1 -1
  443. package/dist/ionic/p-de74582b.system.entry.js +4 -0
  444. package/dist/ionic/{p-c5ae50be.system.js → p-e3584231.system.js} +1 -1
  445. package/dist/ionic/p-e4d90573.js +4 -0
  446. package/dist/ionic/p-ebcf6eca.entry.js +4 -0
  447. package/dist/ionic/{p-ca32685b.system.entry.js → p-ec040c06.system.entry.js} +1 -1
  448. package/dist/ionic/{p-2a7e6572.system.entry.js → p-ed25b7cc.system.entry.js} +1 -1
  449. package/dist/ionic/{p-7484b1d6.system.js → p-f7a36cd0.system.js} +1 -1
  450. package/dist/ionic/{p-e4045e04.entry.js → p-f8a5bb89.entry.js} +1 -1
  451. package/dist/ionic/{p-8a75f7bf.system.entry.js → p-f957d584.system.entry.js} +1 -1
  452. package/dist/ionic/{p-ad78c421.system.js → p-fff7a57e.system.js} +1 -1
  453. package/dist/types/components/backdrop/backdrop.d.ts +0 -3
  454. package/dist/types/components/datetime/datetime.d.ts +0 -1
  455. package/dist/types/components/input/input.d.ts +5 -1
  456. package/dist/types/components/menu/menu.d.ts +1 -1
  457. package/dist/types/components/refresher/refresher.utils.d.ts +0 -16
  458. package/dist/types/components/searchbar/searchbar.d.ts +2 -0
  459. package/dist/types/components/textarea/textarea.d.ts +5 -1
  460. package/dist/types/components.d.ts +7 -7
  461. package/dist/types/utils/gesture/gesture-controller.d.ts +1 -0
  462. package/hydrate/index.d.ts +1 -1
  463. package/hydrate/index.js +79 -112
  464. package/package.json +2 -2
  465. package/components/refresher.utils.js +0 -196
  466. package/dist/esm-es5/app-globals-c23144fc.js +0 -4
  467. package/dist/esm-es5/overlays-64e67e2c.js +0 -4
  468. package/dist/esm-es5/swipe-back-a6f386fc.js +0 -4
  469. package/dist/ionic/p-06600f70.js +0 -4
  470. package/dist/ionic/p-0827d00e.system.entry.js +0 -4
  471. package/dist/ionic/p-1cbc21e2.system.entry.js +0 -4
  472. package/dist/ionic/p-1e7daa1f.entry.js +0 -4
  473. package/dist/ionic/p-2507b0c0.entry.js +0 -4
  474. package/dist/ionic/p-312221db.entry.js +0 -4
  475. package/dist/ionic/p-33f3cd49.entry.js +0 -4
  476. package/dist/ionic/p-35ce400e.system.js +0 -4
  477. package/dist/ionic/p-45db7949.system.entry.js +0 -4
  478. package/dist/ionic/p-58dd7c15.entry.js +0 -4
  479. package/dist/ionic/p-5a7d5905.system.entry.js +0 -4
  480. package/dist/ionic/p-5c7f13cd.system.entry.js +0 -4
  481. package/dist/ionic/p-5fb707e0.entry.js +0 -4
  482. package/dist/ionic/p-6a6477b2.js +0 -4
  483. package/dist/ionic/p-742e11cf.system.entry.js +0 -4
  484. package/dist/ionic/p-78ebf1b6.system.entry.js +0 -4
  485. package/dist/ionic/p-7ae5ca1f.system.entry.js +0 -4
  486. package/dist/ionic/p-83fada9e.system.entry.js +0 -4
  487. package/dist/ionic/p-8a10752d.entry.js +0 -4
  488. package/dist/ionic/p-af959b5d.entry.js +0 -4
  489. package/dist/ionic/p-b11ceee2.entry.js +0 -4
  490. package/dist/ionic/p-b5e33ebc.system.entry.js +0 -4
  491. package/dist/ionic/p-b8f2134e.js +0 -4
  492. package/dist/ionic/p-cde72008.js +0 -4
  493. package/dist/ionic/p-d1530ea9.entry.js +0 -4
  494. package/dist/ionic/p-ddccf1f4.js +0 -4
  495. package/dist/ionic/p-e145b9f9.entry.js +0 -4
  496. package/dist/ionic/p-eab6401e.js +0 -4
  497. package/dist/ionic/p-edc5c693.system.entry.js +0 -4
  498. package/dist/ionic/p-f0384573.system.entry.js +0 -4
  499. package/dist/ionic/p-f10de9d5.system.js +0 -4
  500. package/dist/ionic/p-f444fea5.entry.js +0 -4
@@ -94,7 +94,7 @@ ion-picker-column-internal {
94
94
  }
95
95
 
96
96
  /**
97
- * This ensures that the picker is apppropriately
97
+ * This ensures that the picker is appropriately
98
98
  * sized and never truncates the text.
99
99
  */
100
100
  :host(.datetime-size-fixed.datetime-prefer-wheel) {
@@ -317,23 +317,8 @@ ion-picker-column-internal {
317
317
  justify-content: space-between;
318
318
  }
319
319
 
320
- :host .calendar-action-buttons ion-item,
321
320
  :host .calendar-action-buttons ion-button {
322
- --background: translucent;
323
- }
324
-
325
- :host .calendar-action-buttons ion-item ion-label {
326
- display: flex;
327
- align-items: center;
328
- }
329
-
330
- :host .calendar-action-buttons ion-item ion-icon {
331
- -webkit-padding-start: 4px;
332
- padding-inline-start: 4px;
333
- -webkit-padding-end: 0;
334
- padding-inline-end: 0;
335
- padding-top: 0;
336
- padding-bottom: 0;
321
+ --background: transparent;
337
322
  }
338
323
 
339
324
  :host .calendar-days-of-week {
@@ -515,8 +500,66 @@ ion-picker-column-internal {
515
500
  position: static;
516
501
  }
517
502
 
518
- :host(.show-month-and-year) .calendar-action-buttons ion-item {
519
- --color: var(--ion-color-base);
503
+ :host(.show-month-and-year) .calendar-action-buttons .calendar-month-year-toggle {
504
+ color: var(--ion-color-base);
505
+ }
506
+
507
+ .calendar-month-year {
508
+ min-width: 0;
509
+ }
510
+
511
+ .calendar-month-year-toggle {
512
+ font-family: inherit;
513
+ font-size: inherit;
514
+ font-style: inherit;
515
+ font-weight: inherit;
516
+ letter-spacing: inherit;
517
+ text-decoration: inherit;
518
+ text-indent: inherit;
519
+ text-overflow: inherit;
520
+ text-transform: inherit;
521
+ text-align: inherit;
522
+ white-space: inherit;
523
+ color: inherit;
524
+ position: relative;
525
+ border: 0;
526
+ outline: none;
527
+ background: transparent;
528
+ cursor: pointer;
529
+ z-index: 1;
530
+ }
531
+ .calendar-month-year-toggle::after {
532
+ left: 0;
533
+ right: 0;
534
+ top: 0;
535
+ bottom: 0;
536
+ position: absolute;
537
+ content: "";
538
+ opacity: 0;
539
+ transition: opacity 15ms linear, background-color 15ms linear;
540
+ z-index: -1;
541
+ }
542
+ .calendar-month-year-toggle.ion-focused::after {
543
+ background: currentColor;
544
+ }
545
+ .calendar-month-year-toggle:disabled {
546
+ opacity: 0.3;
547
+ pointer-events: none;
548
+ }
549
+
550
+ .calendar-month-year-toggle ion-icon {
551
+ -webkit-padding-start: 4px;
552
+ padding-inline-start: 4px;
553
+ -webkit-padding-end: 0;
554
+ padding-inline-end: 0;
555
+ padding-top: 0;
556
+ padding-bottom: 0;
557
+ flex-shrink: 0;
558
+ }
559
+
560
+ .calendar-month-year-toggle #toggle-wrapper {
561
+ display: inline-flex;
562
+ align-items: center;
520
563
  }
521
564
 
522
565
  /**
@@ -600,15 +643,36 @@ ion-picker-column-internal {
600
643
  font-size: 2.125rem;
601
644
  }
602
645
 
603
- :host .datetime-calendar .calendar-action-buttons ion-item {
604
- --padding-start: 20px;
605
- }
606
-
607
- :host .calendar-action-buttons ion-item,
608
646
  :host .calendar-action-buttons ion-button {
609
647
  --color: var(--ion-color-step-650, #595959);
610
648
  }
611
649
 
650
+ .calendar-month-year-toggle {
651
+ -webkit-padding-start: 20px;
652
+ padding-inline-start: 20px;
653
+ -webkit-padding-end: 16px;
654
+ padding-inline-end: 16px;
655
+ padding-top: 12px;
656
+ padding-bottom: 12px;
657
+ min-height: 48px;
658
+ background: transparent;
659
+ color: var(--ion-color-step-650, #595959);
660
+ z-index: 1;
661
+ }
662
+ .calendar-month-year-toggle.ion-focused::after {
663
+ opacity: 0.04;
664
+ }
665
+
666
+ .calendar-month-year-toggle ion-ripple-effect {
667
+ color: currentColor;
668
+ }
669
+
670
+ @media (any-hover: hover) {
671
+ .calendar-month-year-toggle.ion-activatable:not(.ion-focused):hover::after {
672
+ background: currentColor;
673
+ opacity: 0.04;
674
+ }
675
+ }
612
676
  :host .calendar-days-of-week {
613
677
  -webkit-padding-start: 10px;
614
678
  padding-inline-start: 10px;
@@ -38,7 +38,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
38
38
  `, config);
39
39
  const tabKey = browserName === 'webkit' ? 'Alt+Tab' : 'Tab';
40
40
  const datetime = page.locator('ion-datetime');
41
- const monthYearButton = page.locator('.calendar-month-year ion-item');
41
+ const monthYearButton = page.locator('.calendar-month-year-toggle');
42
42
  const prevButton = page.locator('.calendar-next-prev ion-button:nth-child(1)');
43
43
  const nextButton = page.locator('.calendar-next-prev ion-button:nth-child(2)');
44
44
  await page.keyboard.press(tabKey);
@@ -2,7 +2,6 @@
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
4
  import { newSpecPage } from "@stencil/core/testing";
5
- import { Item } from "../../../item/item";
6
5
  import { Datetime } from "../../datetime";
7
6
  describe('datetime', () => {
8
7
  beforeEach(() => {
@@ -18,25 +17,23 @@ describe('datetime', () => {
18
17
  let page;
19
18
  beforeEach(async () => {
20
19
  page = await newSpecPage({
21
- components: [Datetime, Item],
20
+ components: [Datetime],
22
21
  html: `<ion-datetime></ion-datetime>`,
23
22
  });
24
23
  });
25
24
  it('should have aria-label "Show year picker" when collapsed', async () => {
26
25
  const datetime = page.body.querySelector('ion-datetime');
27
- const item = datetime.shadowRoot.querySelector('.calendar-month-year ion-item');
28
- const monthYearToggleBtn = item.shadowRoot.querySelector('button');
26
+ const monthYearToggleBtn = datetime.shadowRoot.querySelector('.calendar-month-year .calendar-month-year-toggle');
29
27
  const ariaLabel = monthYearToggleBtn.getAttribute('aria-label');
30
28
  expect(ariaLabel).toContain('Show year picker');
31
29
  });
32
30
  it('should have aria-label "Hide year picker" when expanded', async () => {
33
31
  const datetime = page.body.querySelector('ion-datetime');
34
- const item = datetime.shadowRoot.querySelector('.calendar-month-year ion-item');
35
- item.click();
32
+ const monthYearToggleBtn = datetime.shadowRoot.querySelector('.calendar-month-year .calendar-month-year-toggle');
33
+ monthYearToggleBtn.click();
36
34
  await page.waitForChanges();
37
- const itemAfter = datetime.shadowRoot.querySelector('.calendar-month-year ion-item');
38
- const monthYearToggleBtn = itemAfter.shadowRoot.querySelector('button');
39
- const ariaLabel = monthYearToggleBtn.getAttribute('aria-label');
35
+ const monthYearToggleBtnAfter = datetime.shadowRoot.querySelector('.calendar-month-year .calendar-month-year-toggle');
36
+ const ariaLabel = monthYearToggleBtnAfter.getAttribute('aria-label');
40
37
  expect(ariaLabel).toContain('Hide year picker');
41
38
  });
42
39
  });
@@ -372,4 +372,14 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
372
372
  await expect(datetime).toHaveScreenshot(screenshot(`datetime-focus-calendar-day`));
373
373
  });
374
374
  });
375
+ test.describe(title('datetime: calendar month toggle'), () => {
376
+ test('should have focus styles', async ({ page }) => {
377
+ await page.setContent('<ion-datetime value="2021-01-01"></ion-datetime>', config);
378
+ const datetime = page.locator('ion-datetime');
379
+ await page.waitForSelector('.datetime-ready');
380
+ const monthYearToggle = datetime.locator('.calendar-month-year-toggle');
381
+ monthYearToggle.evaluate((el) => el.classList.add('ion-focused'));
382
+ await expect(datetime).toHaveScreenshot(screenshot(`date-month-toggle-focused`));
383
+ });
384
+ });
375
385
  });
@@ -16,7 +16,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) =>
16
16
  test('should hide the footer when picker is open', async ({ page }) => {
17
17
  const datetimeFooter = page.locator('#date-time .datetime-footer');
18
18
  await expect(datetimeFooter).toBeVisible();
19
- const pickerButton = page.locator('#date-time .calendar-month-year > ion-item');
19
+ const pickerButton = page.locator('#date-time .calendar-month-year > .calendar-month-year-toggle');
20
20
  await pickerButton.click();
21
21
  await page.waitForChanges();
22
22
  await expect(datetimeFooter).not.toBeVisible();
@@ -46,7 +46,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config, scree
46
46
  const tabKey = browserName === 'webkit' ? 'Alt+Tab' : 'Tab';
47
47
  await page.waitForSelector('.datetime-ready');
48
48
  const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
49
- const monthYearButton = page.locator('.calendar-month-year ion-item');
49
+ const monthYearButton = page.locator('.calendar-month-year-toggle');
50
50
  await expect(calendarMonthYear).toHaveText('February 2022');
51
51
  await page.keyboard.press(tabKey);
52
52
  await expect(monthYearButton).toBeFocused();
@@ -75,7 +75,7 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config, scree
75
75
  `, config);
76
76
  const tabKey = browserName === 'webkit' ? 'Alt+Tab' : 'Tab';
77
77
  const datetime = page.locator('ion-datetime');
78
- const monthYearButton = page.locator('.calendar-month-year ion-item');
78
+ const monthYearButton = page.locator('.calendar-month-year-toggle');
79
79
  const prevButton = page.locator('.calendar-next-prev ion-button:nth-child(1)');
80
80
  const nextButton = page.locator('.calendar-next-prev ion-button:nth-child(2)');
81
81
  const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
@@ -334,10 +334,10 @@ ion-ripple-effect {
334
334
  * }
335
335
  */
336
336
  :host {
337
- --background: var(--ion-color-primary, #3880ff);
338
- --background-activated: var(--ion-color-primary-shade, #3171e0);
339
- --background-focused: var(--ion-color-primary-shade, #3171e0);
340
- --background-hover: var(--ion-color-primary-tint, #4c8dff);
337
+ --background: var(--ion-color-primary, #0054e9);
338
+ --background-activated: var(--ion-color-primary-shade, #004acd);
339
+ --background-focused: var(--ion-color-primary-shade, #004acd);
340
+ --background-hover: var(--ion-color-primary-tint, #1a65eb);
341
341
  --background-activated-opacity: 1;
342
342
  --background-focused-opacity: 1;
343
343
  --background-hover-opacity: 1;
@@ -358,10 +358,10 @@ ion-ripple-effect {
358
358
  }
359
359
 
360
360
  :host(.fab-button-in-list) {
361
- --background: var(--ion-color-light, #f4f5f8);
362
- --background-activated: var(--ion-color-light-shade, #d7d8da);
361
+ --background: var(--ion-color-light, #f6f8fc);
362
+ --background-activated: var(--ion-color-light-shade, #d8dade);
363
363
  --background-focused: var(--background-activated);
364
- --background-hover: var(--ion-color-light-tint, #f5f6f9);
364
+ --background-hover: var(--ion-color-light-tint, #f7f9fc);
365
365
  --color: var(--ion-color-light-contrast, #000);
366
366
  --color-activated: var(--ion-color-light-contrast, #000);
367
367
  --color-focused: var(--color-activated);
@@ -395,15 +395,15 @@ ion-ripple-effect {
395
395
  }
396
396
  @supports (backdrop-filter: blur(0)) {
397
397
  :host(.fab-button-translucent) {
398
- --background: rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.9);
399
- --background-hover: rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.8);
400
- --background-focused: rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.82);
398
+ --background: rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.9);
399
+ --background-hover: rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.8);
400
+ --background-focused: rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.82);
401
401
  --backdrop-filter: saturate(180%) blur(20px);
402
402
  }
403
403
  :host(.fab-button-translucent-in-list) {
404
- --background: rgba(var(--ion-color-light-rgb, 244, 245, 248), 0.9);
405
- --background-hover: rgba(var(--ion-color-light-rgb, 244, 245, 248), 0.8);
406
- --background-focused: rgba(var(--ion-color-light-rgb, 244, 245, 248), 0.82);
404
+ --background: rgba(var(--ion-color-light-rgb, 246, 248, 252), 0.9);
405
+ --background-hover: rgba(var(--ion-color-light-rgb, 246, 248, 252), 0.8);
406
+ --background-focused: rgba(var(--ion-color-light-rgb, 246, 248, 252), 0.82);
407
407
  }
408
408
  }
409
409
  @supports (backdrop-filter: blur(0)) {
@@ -334,7 +334,7 @@ ion-ripple-effect {
334
334
  * }
335
335
  */
336
336
  :host {
337
- --background: var(--ion-color-primary, #3880ff);
337
+ --background: var(--ion-color-primary, #0054e9);
338
338
  --background-activated: transparent;
339
339
  --background-focused: currentColor;
340
340
  --background-hover: currentColor;
@@ -359,10 +359,10 @@ ion-ripple-effect {
359
359
  --color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.54);
360
360
  --color-activated: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.54);
361
361
  --color-focused: var(--color-activated);
362
- --background: var(--ion-color-light, #f4f5f8);
362
+ --background: var(--ion-color-light, #f6f8fc);
363
363
  --background-activated: transparent;
364
- --background-focused: var(--ion-color-light-shade, #d7d8da);
365
- --background-hover: var(--ion-color-light-tint, #f5f6f9);
364
+ --background-focused: var(--ion-color-light-shade, #d8dade);
365
+ --background-hover: var(--ion-color-light-tint, #f7f9fc);
366
366
  }
367
367
 
368
368
  :host(.fab-button-in-list) ::slotted(ion-icon) {
@@ -1,8 +1,58 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import AxeBuilder from "@axe-core/playwright";
4
5
  import { expect } from "@playwright/test";
5
6
  import { configs, test } from "../../../../utils/test/playwright/index";
7
+ configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
8
+ test.describe(title('fab-button: a11y'), () => {
9
+ test('should not have accessibility violations', async ({ page }) => {
10
+ await page.setContent(`
11
+ <ion-fab-button>FAB</ion-fab-button>
12
+ <ion-fab-button class="ion-activated">FAB</ion-fab-button>
13
+ `, config);
14
+ const results = await new AxeBuilder({ page }).analyze();
15
+ expect(results.violations).toEqual([]);
16
+ });
17
+ });
18
+ test.describe(title('fab-list: contrast'), () => {
19
+ test('should not have accessibility violations', async ({ page }) => {
20
+ await page.setContent(`
21
+ <ion-fab activated="true">
22
+ <ion-fab-button>
23
+ Open
24
+ </ion-fab-button>
25
+ <ion-fab-list side="bottom">
26
+ <ion-fab-button>Down</ion-fab-button>
27
+ <ion-fab-button class="ion-activated">Down</ion-fab-button>
28
+ <ion-fab-button class="ion-focused">Down</ion-fab-button>
29
+ </ion-fab-list>
30
+ </ion-fab>
31
+ `, config);
32
+ const results = await new AxeBuilder({ page }).analyze();
33
+ expect(results.violations).toEqual([]);
34
+ });
35
+ });
36
+ test.describe(title('fab: translucent contrast'), () => {
37
+ test('should not have accessibility violations', async ({ page }) => {
38
+ await page.setContent(`
39
+ <ion-fab-button translucent="true">FAB</ion-fab-button>
40
+ <ion-fab-button class="ion-focused" translucent="true">FAB</ion-fab-button>
41
+ <ion-fab activated="true">
42
+ <ion-fab-button>
43
+ Open
44
+ </ion-fab-button>
45
+ <ion-fab-list side="bottom">
46
+ <ion-fab-button translucent="true">Down</ion-fab-button>
47
+ <ion-fab-button class="ion-focused" translucent="true">Down</ion-fab-button>
48
+ </ion-fab-list>
49
+ </ion-fab>
50
+ `, config);
51
+ const results = await new AxeBuilder({ page }).analyze();
52
+ expect(results.violations).toEqual([]);
53
+ });
54
+ });
55
+ });
6
56
  configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
7
57
  test.describe(title('fab-button: aria attributes'), () => {
8
58
  test('should inherit aria attributes to inner button', async ({ page }) => {
@@ -89,9 +89,9 @@
89
89
  --background: transparent;
90
90
  --color: initial;
91
91
  --border-style: solid;
92
- --highlight-color-focused: var(--ion-color-primary, #3880ff);
93
- --highlight-color-valid: var(--ion-color-success, #2dd36f);
94
- --highlight-color-invalid: var(--ion-color-danger, #eb445a);
92
+ --highlight-color-focused: var(--ion-color-primary, #0054e9);
93
+ --highlight-color-valid: var(--ion-color-success, #2dd55b);
94
+ --highlight-color-invalid: var(--ion-color-danger, #c5000f);
95
95
  /**
96
96
  * This is a private API that is used to switch
97
97
  * out the highlight color based on the state
@@ -198,6 +198,8 @@ export class Input {
198
198
  *
199
199
  * Developers who wish to focus an input when an overlay is presented
200
200
  * should call `setFocus` after `didPresent` has resolved.
201
+ *
202
+ * See [managing focus](/docs/developing/managing-focus) for more information.
201
203
  */
202
204
  async setFocus() {
203
205
  if (this.nativeInput) {
@@ -560,7 +562,7 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
560
562
  "optional": false,
561
563
  "docs": {
562
564
  "tags": [],
563
- "text": "This Boolean attribute lets you specify that a form control should have input focus when the page loads."
565
+ "text": "Sets the [`autofocus` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus) on the native input element.\n\nThis may not be sufficient for the element to be focused on page load. See [managing focus](/docs/developing/managing-focus) for more information."
564
566
  },
565
567
  "attribute": "autofocus",
566
568
  "reflect": false,
@@ -1221,7 +1223,7 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
1221
1223
  "return": "Promise<void>"
1222
1224
  },
1223
1225
  "docs": {
1224
- "text": "Sets focus on the native `input` in `ion-input`. Use this method instead of the global\n`input.focus()`.\n\nDevelopers who wish to focus an input when a page enters\nshould call `setFocus()` in the `ionViewDidEnter()` lifecycle method.\n\nDevelopers who wish to focus an input when an overlay is presented\nshould call `setFocus` after `didPresent` has resolved.",
1226
+ "text": "Sets focus on the native `input` in `ion-input`. Use this method instead of the global\n`input.focus()`.\n\nDevelopers who wish to focus an input when a page enters\nshould call `setFocus()` in the `ionViewDidEnter()` lifecycle method.\n\nDevelopers who wish to focus an input when an overlay is presented\nshould call `setFocus` after `didPresent` has resolved.\n\nSee [managing focus](/docs/developing/managing-focus) for more information.",
1225
1227
  "tags": []
1226
1228
  }
1227
1229
  },
@@ -89,9 +89,9 @@
89
89
  --background: transparent;
90
90
  --color: initial;
91
91
  --border-style: solid;
92
- --highlight-color-focused: var(--ion-color-primary, #3880ff);
93
- --highlight-color-valid: var(--ion-color-success, #2dd36f);
94
- --highlight-color-invalid: var(--ion-color-danger, #eb445a);
92
+ --highlight-color-focused: var(--ion-color-primary, #0054e9);
93
+ --highlight-color-valid: var(--ion-color-success, #2dd55b);
94
+ --highlight-color-invalid: var(--ion-color-danger, #c5000f);
95
95
  /**
96
96
  * This is a private API that is used to switch
97
97
  * out the highlight color based on the state
@@ -4,14 +4,46 @@
4
4
  import AxeBuilder from "@axe-core/playwright";
5
5
  import { expect } from "@playwright/test";
6
6
  import { configs, test } from "../../../../utils/test/playwright/index";
7
- configs({ directions: ['ltr'] }).forEach(({ title, config, screenshot }) => {
7
+ configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
8
8
  test.describe(title('input: a11y'), () => {
9
- test('should not have accessibility violations', async ({ page }) => {
10
- await page.goto(`/src/components/input/test/a11y`, config);
9
+ test('default layout should not have accessibility violations', async ({ page }) => {
10
+ await page.setContent(`
11
+ <main>
12
+ <ion-input label="Label" placeholder="Placeholder"></ion-input>
13
+ <ion-input placeholder="Placeholder">
14
+ <div slot="label">Label"></div>
15
+ </ion-input>
16
+ <ion-input label="Label" value="My Text"></ion-input>
17
+ <ion-input aria-label="Label"></ion-input>
18
+ </main>
19
+ `, config);
20
+ const results = await new AxeBuilder({ page }).analyze();
21
+ expect(results.violations).toEqual([]);
22
+ });
23
+ test('focused state should not have accessibility violations', async ({ page }) => {
24
+ /**
25
+ * The primary color against the focus background
26
+ * when using fill="solid" does not meet AA
27
+ * contrast guidelines so it excluded from the test.
28
+ * The contrast here is a significant improvement
29
+ * over what Ionic has had in the past, so the team
30
+ * has decided that this tradeoff is acceptable since
31
+ * the scope of the problem is limited to the focus
32
+ * state with the primary color when fill="solid".
33
+ */
34
+ await page.setContent(`
35
+ <main>
36
+ <ion-input class="has-focus" label="Label" value="My Text"></ion-input>
37
+ <ion-input class="has-focus" label-placement="floating" label="Label" value="My Text"></ion-input>
38
+ <ion-input class="has-focus" fill="outline" label-placement="floating" label="Label" value="My Text"></ion-input>
39
+ </main>
40
+ `, config);
11
41
  const results = await new AxeBuilder({ page }).analyze();
12
42
  expect(results.violations).toEqual([]);
13
43
  });
14
44
  });
45
+ });
46
+ configs({ directions: ['ltr'] }).forEach(({ title, config, screenshot }) => {
15
47
  test.describe(title('input: font scaling'), () => {
16
48
  test('should scale text on larger font sizes', async ({ page }) => {
17
49
  await page.setContent(`
@@ -656,9 +656,9 @@ ion-ripple-effect {
656
656
  --border-color: var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-250, #c8c7cc)));
657
657
  --color: var(--ion-item-color, var(--ion-text-color, #000));
658
658
  --highlight-height: 0px;
659
- --highlight-color-focused: var(--ion-color-primary, #3880ff);
660
- --highlight-color-valid: var(--ion-color-success, #2dd36f);
661
- --highlight-color-invalid: var(--ion-color-danger, #eb445a);
659
+ --highlight-color-focused: var(--ion-color-primary, #0054e9);
660
+ --highlight-color-valid: var(--ion-color-success, #2dd55b);
661
+ --highlight-color-invalid: var(--ion-color-danger, #c5000f);
662
662
  --bottom-padding-start: 0px;
663
663
  font-size: 1rem;
664
664
  }
@@ -756,9 +756,9 @@ ion-ripple-effect {
756
756
  --inner-padding-end: 16px;
757
757
  --inner-border-width: 0 0 1px 0;
758
758
  --highlight-height: 1px;
759
- --highlight-color-focused: var(--ion-color-primary, #3880ff);
760
- --highlight-color-valid: var(--ion-color-success, #2dd36f);
761
- --highlight-color-invalid: var(--ion-color-danger, #eb445a);
759
+ --highlight-color-focused: var(--ion-color-primary, #0054e9);
760
+ --highlight-color-valid: var(--ion-color-success, #2dd55b);
761
+ --highlight-color-invalid: var(--ion-color-danger, #c5000f);
762
762
  font-size: 1rem;
763
763
  font-weight: normal;
764
764
  text-transform: none;
@@ -1056,7 +1056,7 @@ ion-ripple-effect {
1056
1056
  :host(.ion-focused:not(.ion-color)) ::slotted(.label-floating),
1057
1057
  :host(.item-has-focus:not(.ion-color)) ::slotted(.label-stacked),
1058
1058
  :host(.item-has-focus:not(.ion-color)) ::slotted(.label-floating) {
1059
- color: var(--ion-color-primary, #3880ff);
1059
+ color: var(--ion-color-primary, #0054e9);
1060
1060
  }
1061
1061
 
1062
1062
  :host(.ion-color) {
@@ -58,7 +58,7 @@
58
58
  * @prop --background: Background of the item option
59
59
  * @prop --color: Color of the item option
60
60
  */
61
- --background: var(--ion-color-primary, #3880ff);
61
+ --background: var(--ion-color-primary, #0054e9);
62
62
  --color: var(--ion-color-primary-contrast, #fff);
63
63
  background: var(--background);
64
64
  color: var(--color);
@@ -234,7 +234,7 @@
234
234
  }
235
235
 
236
236
  :host(.ion-activated) {
237
- background: var(--ion-color-primary-shade, #3171e0);
237
+ background: var(--ion-color-primary-shade, #004acd);
238
238
  }
239
239
 
240
240
  :host(.ion-color.ion-activated) {
@@ -58,7 +58,7 @@
58
58
  * @prop --background: Background of the item option
59
59
  * @prop --color: Color of the item option
60
60
  */
61
- --background: var(--ion-color-primary, #3880ff);
61
+ --background: var(--ion-color-primary, #0054e9);
62
62
  --color: var(--ion-color-primary-contrast, #fff);
63
63
  background: var(--background);
64
64
  color: var(--color);
@@ -1,8 +1,36 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import AxeBuilder from "@axe-core/playwright";
5
+ import { expect } from "@playwright/test";
4
6
  import { configs, test } from "../../../../utils/test/playwright/index";
5
7
  import { testSlidingItem } from "../test.utils";
8
+ configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
9
+ test.describe(title('item-sliding: a11y for ion-color()'), () => {
10
+ test('should not have accessibility violations', async ({ page }) => {
11
+ await page.setContent(`
12
+ <main>
13
+ <ion-item-sliding id="axe">
14
+ <ion-item>
15
+ <ion-label>Sliding Item with End Options</ion-label>
16
+ </ion-item>
17
+
18
+ <ion-item-options>
19
+ <ion-item-option>Favorite</ion-item-option>
20
+ <ion-item-option class="ion-activated">Activated</ion-item-option>
21
+ </ion-item-options>
22
+ </ion-item-sliding>
23
+ </main>
24
+ `, config);
25
+ await page.locator(`#axe`).evaluate(async (el) => {
26
+ await el.open('end');
27
+ });
28
+ await page.waitForChanges();
29
+ const results = await new AxeBuilder({ page }).analyze();
30
+ expect(results.violations).toEqual([]);
31
+ });
32
+ });
33
+ });
6
34
  /**
7
35
  * This behavior does not vary across directions
8
36
  */
@@ -337,7 +337,7 @@
337
337
  :host-context(.ion-focused).label-floating:not(.ion-color),
338
338
  :host-context(.item-has-focus).label-stacked:not(.ion-color),
339
339
  :host-context(.item-has-focus).label-floating:not(.ion-color) {
340
- color: var(--ion-color-primary, #3880ff);
340
+ color: var(--ion-color-primary, #0054e9);
341
341
  }
342
342
 
343
343
  :host-context(.ion-focused.ion-color).label-stacked:not(.ion-color),
@@ -1,6 +1,7 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import AxeBuilder from "@axe-core/playwright";
4
5
  import { expect } from "@playwright/test";
5
6
  import { configs, test } from "../../../../utils/test/playwright/index";
6
7
  configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
@@ -64,3 +65,22 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
64
65
  });
65
66
  });
66
67
  });
68
+ configs({ directions: ['ltr'], modes: ['md'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
69
+ test.describe(title('label: a11y for ion-color()'), () => {
70
+ test('should not have accessibility violations when focused', async ({ page }) => {
71
+ /**
72
+ * All page content should be contained by landmarks (main, nav, etc.)
73
+ * By containing the badge in a main element, we can avoid this violation.
74
+ */
75
+ await page.setContent(`
76
+ <main>
77
+ <div class="ion-focused">
78
+ <ion-label position="stacked">Default Label</ion-label>
79
+ </div>
80
+ </main>
81
+ `, config);
82
+ const results = await new AxeBuilder({ page }).analyze();
83
+ expect(results.violations).toEqual([]);
84
+ });
85
+ });
86
+ });
@@ -173,7 +173,7 @@ ion-spinner {
173
173
  --background: var(--ion-color-step-50, #f2f2f2);
174
174
  --max-width: 280px;
175
175
  --max-height: 90%;
176
- --spinner-color: var(--ion-color-primary, #3880ff);
176
+ --spinner-color: var(--ion-color-primary, #0054e9);
177
177
  --backdrop-opacity: var(--ion-backdrop-opacity, 0.32);
178
178
  color: var(--ion-color-step-850, #262626);
179
179
  font-size: 0.875rem;