voyager-ionic-core 7.5.0 → 7.5.5

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 (594) hide show
  1. package/components/action-sheet.js +2 -2
  2. package/components/alert.js +2 -2
  3. package/components/animation.js +18 -3
  4. package/components/checkbox.js +2 -2
  5. package/components/form-controller.js +1 -5
  6. package/components/index8.js +0 -1
  7. package/components/input-shims.js +9 -1
  8. package/components/ion-accordion-group.js +11 -1
  9. package/components/ion-datetime.js +48 -23
  10. package/components/ion-fab-list.js +1 -1
  11. package/components/ion-fab.js +1 -1
  12. package/components/ion-header.js +1 -1
  13. package/components/ion-input.js +11 -4
  14. package/components/ion-item-divider.js +2 -2
  15. package/components/ion-item-option.js +2 -2
  16. package/components/ion-menu.js +17 -5
  17. package/components/ion-modal.js +8 -8
  18. package/components/ion-range.js +2 -2
  19. package/components/ion-refresher.js +8 -1
  20. package/components/ion-reorder.js +2 -2
  21. package/components/ion-searchbar.js +10 -3
  22. package/components/ion-segment.js +43 -17
  23. package/components/ion-select.js +2 -2
  24. package/components/ion-tab-bar.js +2 -2
  25. package/components/ion-tab-button.js +2 -2
  26. package/components/ion-textarea.js +11 -4
  27. package/components/ion-title.js +1 -1
  28. package/components/ion-toast.js +2 -2
  29. package/components/ion-toggle.js +2 -2
  30. package/components/ios.transition.js +209 -41
  31. package/components/item.js +2 -2
  32. package/components/list-header.js +2 -2
  33. package/components/list.js +2 -2
  34. package/components/picker-internal.js +2 -2
  35. package/components/popover.js +2 -2
  36. package/components/radio-group.js +10 -1
  37. package/components/radio.js +2 -3
  38. package/components/watch-options.js +14 -3
  39. package/css/core.css.map +1 -1
  40. package/css/display.css.map +1 -1
  41. package/css/float-elements.css.map +1 -1
  42. package/css/global.bundle.css.map +1 -1
  43. package/css/ionic.bundle.css.map +1 -1
  44. package/css/padding.css.map +1 -1
  45. package/css/structure.css.map +1 -1
  46. package/css/text-alignment.css.map +1 -1
  47. package/css/text-transformation.css.map +1 -1
  48. package/css/typography.css.map +1 -1
  49. package/css/utils.bundle.css.map +1 -1
  50. package/dist/cjs/{animation-c8bdd3c7.js → animation-1083855c.js} +18 -3
  51. package/dist/cjs/{app-globals-fe1ad535.js → app-globals-1d4c1dbf.js} +1 -1
  52. package/dist/cjs/{button-active-c0ff1915.js → button-active-af897e0e.js} +1 -1
  53. package/dist/cjs/{form-controller-5e223b54.js → form-controller-9343050c.js} +1 -5
  54. package/dist/cjs/{index-d93fb71d.js → index-573877f3.js} +3 -3
  55. package/dist/cjs/{index-305a23dc.js → index-c2940dc1.js} +127 -57
  56. package/dist/cjs/{index-5e7529f6.js → index-d7561763.js} +2 -2
  57. package/dist/cjs/{index-10873539.js → index-da2c7a37.js} +0 -1
  58. package/dist/cjs/index.cjs.js +8 -8
  59. package/dist/cjs/{input-shims-da7dc0de.js → input-shims-b0a75a01.js} +10 -2
  60. package/dist/cjs/ion-accordion_2.cjs.entry.js +13 -3
  61. package/dist/cjs/ion-action-sheet.cjs.entry.js +7 -7
  62. package/dist/cjs/ion-alert.cjs.entry.js +7 -7
  63. package/dist/cjs/ion-app_8.cjs.entry.js +8 -8
  64. package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
  65. package/dist/cjs/ion-back-button.cjs.entry.js +2 -2
  66. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  67. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
  68. package/dist/cjs/ion-button_2.cjs.entry.js +2 -2
  69. package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
  70. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -5
  71. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  72. package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
  73. package/dist/cjs/ion-datetime-button.cjs.entry.js +2 -2
  74. package/dist/cjs/ion-datetime_3.cjs.entry.js +52 -27
  75. package/dist/cjs/ion-fab_3.cjs.entry.js +4 -4
  76. package/dist/cjs/ion-img.cjs.entry.js +2 -2
  77. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +3 -3
  78. package/dist/cjs/ion-input.cjs.entry.js +13 -6
  79. package/dist/cjs/ion-item-option_3.cjs.entry.js +6 -6
  80. package/dist/cjs/ion-item_8.cjs.entry.js +10 -10
  81. package/dist/cjs/ion-loading.cjs.entry.js +4 -4
  82. package/dist/cjs/ion-menu_3.cjs.entry.js +22 -10
  83. package/dist/cjs/ion-modal.cjs.entry.js +14 -14
  84. package/dist/cjs/ion-nav_2.cjs.entry.js +3 -3
  85. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +2 -2
  86. package/dist/cjs/ion-picker-internal.cjs.entry.js +3 -3
  87. package/dist/cjs/ion-popover.cjs.entry.js +7 -7
  88. package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
  89. package/dist/cjs/ion-radio_2.cjs.entry.js +15 -7
  90. package/dist/cjs/ion-range.cjs.entry.js +6 -6
  91. package/dist/cjs/ion-refresher_2.cjs.entry.js +12 -5
  92. package/dist/cjs/ion-reorder_2.cjs.entry.js +5 -5
  93. package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
  94. package/dist/cjs/ion-route_4.cjs.entry.js +2 -2
  95. package/dist/cjs/ion-searchbar.cjs.entry.js +11 -4
  96. package/dist/cjs/ion-segment_2.cjs.entry.js +45 -19
  97. package/dist/cjs/ion-select_3.cjs.entry.js +7 -7
  98. package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
  99. package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
  100. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -6
  101. package/dist/cjs/ion-tab_2.cjs.entry.js +1 -1
  102. package/dist/cjs/ion-text.cjs.entry.js +2 -2
  103. package/dist/cjs/ion-textarea.cjs.entry.js +13 -6
  104. package/dist/cjs/ion-toast.cjs.entry.js +6 -6
  105. package/dist/cjs/ion-toggle.cjs.entry.js +5 -5
  106. package/dist/cjs/{ionic-global-fb752503.js → ionic-global-ea2901a3.js} +1 -1
  107. package/dist/cjs/ionic.cjs.js +4 -4
  108. package/dist/cjs/{ios.transition-a4d545dd.js → ios.transition-ac909bc8.js} +212 -44
  109. package/dist/cjs/loader.cjs.js +3 -3
  110. package/dist/cjs/{md.transition-80bb961b.js → md.transition-907af519.js} +3 -3
  111. package/dist/cjs/{overlays-1a734051.js → overlays-2ffc5f27.js} +1 -1
  112. package/dist/cjs/{status-tap-778e8054.js → status-tap-3fb2391a.js} +2 -2
  113. package/dist/cjs/{watch-options-f3f77e54.js → watch-options-53bbb124.js} +14 -3
  114. package/dist/collection/collection-manifest.json +1 -1
  115. package/dist/collection/components/accordion-group/accordion-group.js +10 -0
  116. package/dist/collection/components/accordion-group/accordion-group.md.css +2 -2
  117. package/dist/collection/components/action-sheet/action-sheet.ios.css +18 -5
  118. package/dist/collection/components/action-sheet/action-sheet.md.css +18 -5
  119. package/dist/collection/components/action-sheet/test/basic/action-sheet.e2e.js +59 -0
  120. package/dist/collection/components/alert/alert.ios.css +37 -4
  121. package/dist/collection/components/alert/alert.md.css +37 -4
  122. package/dist/collection/components/alert/test/a11y/alert.e2e.js +48 -0
  123. package/dist/collection/components/checkbox/checkbox.ios.css +3 -3
  124. package/dist/collection/components/checkbox/checkbox.md.css +3 -3
  125. package/dist/collection/components/datetime/datetime.ios.css +24 -4
  126. package/dist/collection/components/datetime/datetime.js +47 -22
  127. package/dist/collection/components/datetime/datetime.md.css +24 -8
  128. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +66 -0
  129. package/dist/collection/components/datetime/test/disabled/datetime.e2e.js +68 -0
  130. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +113 -0
  131. package/dist/collection/components/fab/fab.css +24 -36
  132. package/dist/collection/components/fab/test/safe-area/fab.e2e.js +63 -0
  133. package/dist/collection/components/fab-list/fab-list.css +2 -2
  134. package/dist/collection/components/header/header.ios.css +4 -1
  135. package/dist/collection/components/input/input.ios.css +15 -15
  136. package/dist/collection/components/input/input.js +9 -2
  137. package/dist/collection/components/input/input.md.css +22 -10
  138. package/dist/collection/components/item/item.ios.css +60 -12
  139. package/dist/collection/components/item/item.md.css +63 -15
  140. package/dist/collection/components/item/test/basic/item.e2e.js +26 -0
  141. package/dist/collection/components/item-divider/item-divider.ios.css +35 -8
  142. package/dist/collection/components/item-divider/item-divider.md.css +35 -8
  143. package/dist/collection/components/item-divider/test/basic/item-divider.e2e.js +22 -0
  144. package/dist/collection/components/item-option/item-option.ios.css +0 -10
  145. package/dist/collection/components/item-option/item-option.md.css +0 -10
  146. package/dist/collection/components/item-sliding/test/basic/item-sliding.e2e.js +77 -0
  147. package/dist/collection/components/label/label.ios.css +1 -1
  148. package/dist/collection/components/list/list.ios.css +15 -1
  149. package/dist/collection/components/list/list.md.css +41 -3
  150. package/dist/collection/components/list/test/lines/list.e2e.js +143 -0
  151. package/dist/collection/components/list-header/list-header.ios.css +15 -2
  152. package/dist/collection/components/list-header/list-header.md.css +15 -2
  153. package/dist/collection/components/list-header/test/basic/list-header.e2e.js +28 -0
  154. package/dist/collection/components/menu/menu.ios.css +4 -4
  155. package/dist/collection/components/menu/menu.js +15 -3
  156. package/dist/collection/components/menu/menu.md.css +4 -4
  157. package/dist/collection/components/modal/animations/ios.enter.js +3 -3
  158. package/dist/collection/components/modal/animations/ios.leave.js +4 -4
  159. package/dist/collection/components/modal/modal.ios.css +2 -2
  160. package/dist/collection/components/picker/picker.ios.css +1 -1
  161. package/dist/collection/components/picker/picker.md.css +1 -1
  162. package/dist/collection/components/picker-internal/picker-internal.ios.css +2 -2
  163. package/dist/collection/components/picker-internal/picker-internal.md.css +2 -2
  164. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +5 -0
  165. package/dist/collection/components/popover/popover.ios.css +4 -4
  166. package/dist/collection/components/popover/popover.md.css +2 -2
  167. package/dist/collection/components/radio/radio.ios.css +4 -4
  168. package/dist/collection/components/radio/radio.js +5 -2
  169. package/dist/collection/components/radio/radio.md.css +4 -4
  170. package/dist/collection/components/radio/test/legacy/a11y/radio.e2e.js +5 -5
  171. package/dist/collection/components/radio-group/radio-group.js +10 -1
  172. package/dist/collection/components/range/range.ios.css +1 -1
  173. package/dist/collection/components/range/range.md.css +1 -1
  174. package/dist/collection/components/refresher/refresher.utils.js +8 -1
  175. package/dist/collection/components/reorder/reorder.ios.css +1 -34
  176. package/dist/collection/components/reorder/reorder.md.css +1 -34
  177. package/dist/collection/components/searchbar/searchbar.js +9 -2
  178. package/dist/collection/components/searchbar/searchbar.md.css +12 -6
  179. package/dist/collection/components/searchbar/test/basic/searchbar.e2e.js +25 -0
  180. package/dist/collection/components/segment/segment.js +43 -17
  181. package/dist/collection/components/select/select.ios.css +12 -15
  182. package/dist/collection/components/select/select.md.css +16 -7
  183. package/dist/collection/components/split-pane/test/multiple/split-pane.e2e.js +31 -0
  184. package/dist/collection/components/tab-bar/tab-bar.ios.css +4 -4
  185. package/dist/collection/components/tab-bar/tab-bar.md.css +4 -4
  186. package/dist/collection/components/tab-bar/test/basic/tab-bar.e2e.js +43 -0
  187. package/dist/collection/components/tab-button/tab-button.ios.css +3 -3
  188. package/dist/collection/components/tab-button/tab-button.md.css +3 -3
  189. package/dist/collection/components/textarea/textarea.ios.css +19 -19
  190. package/dist/collection/components/textarea/textarea.js +9 -2
  191. package/dist/collection/components/textarea/textarea.md.css +26 -20
  192. package/dist/collection/components/title/title.ios.css +11 -2
  193. package/dist/collection/components/toast/toast.ios.css +1 -1
  194. package/dist/collection/components/toast/toast.md.css +1 -1
  195. package/dist/collection/components/toggle/toggle.ios.css +3 -3
  196. package/dist/collection/components/toggle/toggle.md.css +3 -3
  197. package/dist/collection/utils/animation/animation.js +18 -3
  198. package/dist/collection/utils/content/index.js +0 -1
  199. package/dist/collection/utils/forms/form-controller.js +1 -5
  200. package/dist/collection/utils/input-shims/hacks/common.js +9 -1
  201. package/dist/collection/utils/transition/ios.transition.js +209 -41
  202. package/dist/collection/utils/watch-options.js +14 -3
  203. package/dist/docs.json +3 -3
  204. package/dist/esm/{animation-92066c62.js → animation-8aa13916.js} +18 -3
  205. package/dist/esm/{app-globals-ec816a70.js → app-globals-2398e405.js} +1 -1
  206. package/dist/esm/{button-active-d926d4f4.js → button-active-ce5cba4c.js} +1 -1
  207. package/dist/esm/{form-controller-ed77647a.js → form-controller-64edeaad.js} +1 -5
  208. package/dist/esm/{index-df55802d.js → index-0aa6e61f.js} +2 -2
  209. package/dist/esm/{index-746a238e.js → index-4392efa5.js} +0 -1
  210. package/dist/esm/{index-7d2b2808.js → index-6a0ccabb.js} +3 -3
  211. package/dist/esm/{index-b49b173c.js → index-7c9b1bca.js} +127 -57
  212. package/dist/esm/index.js +8 -8
  213. package/dist/esm/{input-shims-d78a3c77.js → input-shims-d0c93e5d.js} +10 -2
  214. package/dist/esm/ion-accordion_2.entry.js +13 -3
  215. package/dist/esm/ion-action-sheet.entry.js +7 -7
  216. package/dist/esm/ion-alert.entry.js +7 -7
  217. package/dist/esm/ion-app_8.entry.js +8 -8
  218. package/dist/esm/ion-avatar_3.entry.js +2 -2
  219. package/dist/esm/ion-back-button.entry.js +2 -2
  220. package/dist/esm/ion-backdrop.entry.js +2 -2
  221. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  222. package/dist/esm/ion-button_2.entry.js +2 -2
  223. package/dist/esm/ion-card_5.entry.js +2 -2
  224. package/dist/esm/ion-checkbox.entry.js +5 -5
  225. package/dist/esm/ion-chip.entry.js +2 -2
  226. package/dist/esm/ion-col_3.entry.js +2 -2
  227. package/dist/esm/ion-datetime-button.entry.js +2 -2
  228. package/dist/esm/ion-datetime_3.entry.js +52 -27
  229. package/dist/esm/ion-fab_3.entry.js +4 -4
  230. package/dist/esm/ion-img.entry.js +2 -2
  231. package/dist/esm/ion-infinite-scroll_2.entry.js +3 -3
  232. package/dist/esm/ion-input.entry.js +14 -7
  233. package/dist/esm/ion-item-option_3.entry.js +6 -6
  234. package/dist/esm/ion-item_8.entry.js +10 -10
  235. package/dist/esm/ion-loading.entry.js +4 -4
  236. package/dist/esm/ion-menu_3.entry.js +22 -10
  237. package/dist/esm/ion-modal.entry.js +14 -14
  238. package/dist/esm/ion-nav_2.entry.js +3 -3
  239. package/dist/esm/ion-picker-column-internal.entry.js +2 -2
  240. package/dist/esm/ion-picker-internal.entry.js +3 -3
  241. package/dist/esm/ion-popover.entry.js +7 -7
  242. package/dist/esm/ion-progress-bar.entry.js +2 -2
  243. package/dist/esm/ion-radio_2.entry.js +15 -7
  244. package/dist/esm/ion-range.entry.js +6 -6
  245. package/dist/esm/ion-refresher_2.entry.js +12 -5
  246. package/dist/esm/ion-reorder_2.entry.js +5 -5
  247. package/dist/esm/ion-ripple-effect.entry.js +2 -2
  248. package/dist/esm/ion-route_4.entry.js +2 -2
  249. package/dist/esm/ion-searchbar.entry.js +12 -5
  250. package/dist/esm/ion-segment_2.entry.js +45 -19
  251. package/dist/esm/ion-select_3.entry.js +7 -7
  252. package/dist/esm/ion-spinner.entry.js +2 -2
  253. package/dist/esm/ion-split-pane.entry.js +2 -2
  254. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  255. package/dist/esm/ion-tab_2.entry.js +1 -1
  256. package/dist/esm/ion-text.entry.js +2 -2
  257. package/dist/esm/ion-textarea.entry.js +14 -7
  258. package/dist/esm/ion-toast.entry.js +6 -6
  259. package/dist/esm/ion-toggle.entry.js +5 -5
  260. package/dist/esm/{ionic-global-246ca78f.js → ionic-global-40e42e7f.js} +1 -1
  261. package/dist/esm/ionic.js +5 -5
  262. package/dist/esm/{ios.transition-a86d7bbe.js → ios.transition-1651c430.js} +212 -44
  263. package/dist/esm/loader.js +4 -4
  264. package/dist/esm/{md.transition-365ef6b6.js → md.transition-66f18369.js} +3 -3
  265. package/dist/esm/{overlays-cec6bac8.js → overlays-6c9feb7e.js} +1 -1
  266. package/dist/esm/{status-tap-9aeeaca5.js → status-tap-9ce68758.js} +2 -2
  267. package/dist/esm/{watch-options-355a920a.js → watch-options-02d8498b.js} +14 -3
  268. package/dist/esm-es5/animation-8aa13916.js +4 -0
  269. package/dist/esm-es5/app-globals-2398e405.js +4 -0
  270. package/dist/esm-es5/{button-active-d926d4f4.js → button-active-ce5cba4c.js} +1 -1
  271. package/dist/esm-es5/config-96c9ace3.js +1 -1
  272. package/dist/esm-es5/cubic-bezier-66542bc5.js +1 -1
  273. package/dist/esm-es5/data-44d9e816.js +1 -1
  274. package/dist/esm-es5/dir-912e3e13.js +1 -1
  275. package/dist/esm-es5/focus-visible-85493433.js +1 -1
  276. package/dist/esm-es5/form-controller-64edeaad.js +4 -0
  277. package/dist/esm-es5/framework-delegate-aa433dea.js +1 -1
  278. package/dist/esm-es5/gesture-controller-0fa396c4.js +1 -1
  279. package/dist/esm-es5/haptic-1243b917.js +1 -1
  280. package/dist/esm-es5/hardware-back-button-39299f84.js +1 -1
  281. package/dist/esm-es5/helpers-3379ba19.js +1 -1
  282. package/dist/esm-es5/index-0aa6e61f.js +4 -0
  283. package/dist/esm-es5/index-4392efa5.js +4 -0
  284. package/dist/esm-es5/index-6a0ccabb.js +4 -0
  285. package/dist/esm-es5/index-7c9b1bca.js +5 -0
  286. package/dist/esm-es5/index-f0cc4e14.js +1 -1
  287. package/dist/esm-es5/index-ff313b19.js +1 -1
  288. package/dist/esm-es5/index.js +1 -1
  289. package/dist/esm-es5/input-shims-d0c93e5d.js +4 -0
  290. package/dist/esm-es5/input.utils-ec063df4.js +1 -1
  291. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  292. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  293. package/dist/esm-es5/ion-alert.entry.js +1 -1
  294. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  295. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  296. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  297. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  298. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  299. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  300. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  301. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  302. package/dist/esm-es5/ion-chip.entry.js +1 -1
  303. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  304. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  305. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  306. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  307. package/dist/esm-es5/ion-img.entry.js +1 -1
  308. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  309. package/dist/esm-es5/ion-input.entry.js +1 -1
  310. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  311. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  312. package/dist/esm-es5/ion-loading.entry.js +1 -1
  313. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  314. package/dist/esm-es5/ion-modal.entry.js +1 -1
  315. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  316. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  317. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  318. package/dist/esm-es5/ion-popover.entry.js +1 -1
  319. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  320. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  321. package/dist/esm-es5/ion-range.entry.js +1 -1
  322. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  323. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  324. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  325. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  326. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  327. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  328. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  329. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  330. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  331. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  332. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  333. package/dist/esm-es5/ion-text.entry.js +1 -1
  334. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  335. package/dist/esm-es5/ion-toast.entry.js +1 -1
  336. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  337. package/dist/esm-es5/ionic-global-40e42e7f.js +4 -0
  338. package/dist/esm-es5/ionic.js +1 -1
  339. package/dist/esm-es5/ios.transition-1651c430.js +4 -0
  340. package/dist/esm-es5/keyboard-b551279d.js +1 -1
  341. package/dist/esm-es5/keyboard-controller-0c2dce71.js +1 -1
  342. package/dist/esm-es5/loader.js +1 -1
  343. package/dist/esm-es5/md.transition-66f18369.js +4 -0
  344. package/dist/esm-es5/notch-controller-8c9c0e54.js +1 -1
  345. package/dist/esm-es5/overlays-6c9feb7e.js +4 -0
  346. package/dist/esm-es5/spinner-configs-d09fbbbb.js +1 -1
  347. package/dist/esm-es5/status-tap-9ce68758.js +4 -0
  348. package/dist/esm-es5/swipe-back-cd4295f3.js +1 -1
  349. package/dist/esm-es5/watch-options-02d8498b.js +4 -0
  350. package/dist/html.html-data.json +1 -1
  351. package/dist/ionic/index.esm.js +1 -1
  352. package/dist/ionic/ionic.esm.js +1 -1
  353. package/dist/ionic/ionic.js +1 -1
  354. package/dist/ionic/p-0330f0a3.system.entry.js +4 -0
  355. package/dist/ionic/{p-a7f8dc42.entry.js → p-0492946a.entry.js} +1 -1
  356. package/dist/ionic/{p-78030c1f.system.entry.js → p-07d9e9cd.system.entry.js} +1 -1
  357. package/dist/ionic/{p-ced41304.system.js → p-09d142b3.system.js} +1 -1
  358. package/dist/ionic/{p-fcf47f80.entry.js → p-0a794e83.entry.js} +1 -1
  359. package/dist/ionic/p-0d8e9393.entry.js +4 -0
  360. package/dist/ionic/p-0dc0d9b5.entry.js +4 -0
  361. package/dist/ionic/p-0e23256e.system.entry.js +4 -0
  362. package/dist/ionic/p-14aca3fb.entry.js +4 -0
  363. package/dist/ionic/p-14b4348c.system.js +4 -0
  364. package/dist/ionic/{p-108f9d49.entry.js → p-174f3446.entry.js} +1 -1
  365. package/dist/ionic/p-18e01b30.system.entry.js +4 -0
  366. package/dist/ionic/p-1a8ae7a7.system.entry.js +4 -0
  367. package/dist/ionic/p-1cb5f2f8.system.entry.js +4 -0
  368. package/dist/ionic/{p-c42c86c0.system.entry.js → p-1d269117.system.entry.js} +1 -1
  369. package/dist/ionic/{p-0ac3fb2c.entry.js → p-1dc91702.entry.js} +1 -1
  370. package/dist/ionic/p-1e5165db.system.entry.js +4 -0
  371. package/dist/ionic/{p-0b00b937.entry.js → p-1e86a71b.entry.js} +1 -1
  372. package/dist/ionic/p-1f4f0d59.system.entry.js +4 -0
  373. package/dist/ionic/p-20cf4994.js +4 -0
  374. package/dist/ionic/p-236063ec.system.entry.js +4 -0
  375. package/dist/ionic/p-2b89ea1b.system.js +1 -1
  376. package/dist/ionic/p-2e8e0045.js +4 -0
  377. package/dist/ionic/{p-ce7d67a7.system.entry.js → p-34d2de14.system.entry.js} +2 -2
  378. package/dist/ionic/{p-303bf1e8.system.entry.js → p-352c0232.system.entry.js} +2 -2
  379. package/dist/ionic/p-3602001b.system.js +4 -0
  380. package/dist/ionic/p-3632220b.system.js +1 -1
  381. package/dist/ionic/p-377c636c.system.entry.js +4 -0
  382. package/dist/ionic/{p-f9fa802c.system.entry.js → p-39044fe6.system.entry.js} +2 -2
  383. package/dist/ionic/{p-38089641.entry.js → p-3ce8c3e3.entry.js} +1 -1
  384. package/dist/ionic/p-3d7fea9b.system.entry.js +4 -0
  385. package/dist/ionic/p-3de79805.entry.js +4 -0
  386. package/dist/ionic/{p-0bbede6a.system.entry.js → p-3fb57e1b.system.entry.js} +1 -1
  387. package/dist/ionic/{p-5c3e72a8.system.js → p-40903d34.system.js} +1 -1
  388. package/dist/ionic/p-41122cd6.system.js +4 -0
  389. package/dist/ionic/p-41477ad9.system.js +1 -1
  390. package/dist/ionic/p-44bc8b45.system.js +2 -2
  391. package/dist/ionic/p-4518e4c0.system.entry.js +4 -0
  392. package/dist/ionic/{p-eab10949.system.entry.js → p-45da1e68.system.entry.js} +1 -1
  393. package/dist/ionic/p-4794e0ac.system.entry.js +4 -0
  394. package/dist/ionic/p-479cdbf8.system.js +2 -2
  395. package/dist/ionic/{p-4e50b8d1.entry.js → p-48d9faa7.entry.js} +1 -1
  396. package/dist/ionic/{p-8d6728a1.system.entry.js → p-4a142496.system.entry.js} +1 -1
  397. package/dist/ionic/p-4c80afe1.system.entry.js +4 -0
  398. package/dist/ionic/p-4cd588b3.system.entry.js +4 -0
  399. package/dist/ionic/{p-afb6658f.entry.js → p-4dbac22d.entry.js} +1 -1
  400. package/dist/ionic/p-4e6a1efb.system.entry.js +4 -0
  401. package/dist/ionic/p-4ecb5692.entry.js +4 -0
  402. package/dist/ionic/p-5370e786.js +4 -0
  403. package/dist/ionic/p-55ed230e.system.js +4 -0
  404. package/dist/ionic/p-56dc022e.system.js +1 -1
  405. package/dist/ionic/p-5aac9314.system.js +4 -0
  406. package/dist/ionic/p-5bd4e009.entry.js +4 -0
  407. package/dist/ionic/{p-6f8a95a3.system.entry.js → p-5cfb3feb.system.entry.js} +2 -2
  408. package/dist/ionic/{p-181b7c2a.js → p-5d711127.js} +1 -1
  409. package/dist/ionic/p-5da0eb3e.system.entry.js +4 -0
  410. package/dist/ionic/p-5deff017.entry.js +4 -0
  411. package/dist/ionic/p-613d4042.system.js +2 -2
  412. package/dist/ionic/p-63d519fb.entry.js +4 -0
  413. package/dist/ionic/{p-8083aadb.entry.js → p-63f08fe3.entry.js} +1 -1
  414. package/dist/ionic/{p-35b26732.entry.js → p-64296b15.entry.js} +1 -1
  415. package/dist/ionic/p-64ed03a3.entry.js +4 -0
  416. package/dist/ionic/p-664d2b07.system.entry.js +4 -0
  417. package/dist/ionic/p-67aab78f.js +4 -0
  418. package/dist/ionic/{p-e0f52215.system.entry.js → p-67e18f02.system.entry.js} +1 -1
  419. package/dist/ionic/{p-572cce26.system.entry.js → p-67ed452a.system.entry.js} +2 -2
  420. package/dist/ionic/p-67eecef4.system.js +4 -0
  421. package/dist/ionic/{p-76378400.js → p-6c3d5383.js} +1 -1
  422. package/dist/ionic/{p-1289b3b5.system.entry.js → p-6e23777e.system.entry.js} +2 -2
  423. package/dist/ionic/p-702d85d8.system.js +4 -0
  424. package/dist/ionic/{p-1edb53a1.entry.js → p-7176cea3.entry.js} +1 -1
  425. package/dist/ionic/p-73411c1b.entry.js +4 -0
  426. package/dist/ionic/p-73420380.js +4 -0
  427. package/dist/ionic/{p-6ea2e653.entry.js → p-744973f3.entry.js} +1 -1
  428. package/dist/ionic/p-772f6c84.system.js +2 -2
  429. package/dist/ionic/p-77e7a9c8.entry.js +4 -0
  430. package/dist/ionic/p-7ab6fc5a.system.entry.js +4 -0
  431. package/dist/ionic/{p-31119a15.entry.js → p-7cee75c0.entry.js} +1 -1
  432. package/dist/ionic/{p-cf62e1c8.js → p-800ef057.js} +1 -1
  433. package/dist/ionic/p-815c2fba.system.js +2 -2
  434. package/dist/ionic/p-819ff3b9.system.js +1 -1
  435. package/dist/ionic/p-87411e39.system.js +1 -1
  436. package/dist/ionic/p-8a308596.system.js +4 -0
  437. package/dist/ionic/{p-3818f63f.entry.js → p-8ad82eb3.entry.js} +1 -1
  438. package/dist/ionic/{p-c4a5de01.entry.js → p-8b29691f.entry.js} +1 -1
  439. package/dist/ionic/p-8c15eda7.system.js +2 -2
  440. package/dist/ionic/p-8e1bded3.entry.js +4 -0
  441. package/dist/ionic/{p-15decbec.entry.js → p-9209d90c.entry.js} +1 -1
  442. package/dist/ionic/{p-96ba8eac.entry.js → p-92800752.entry.js} +1 -1
  443. package/dist/ionic/p-965677f1.entry.js +4 -0
  444. package/dist/ionic/{p-446230d7.js → p-97c65aa5.js} +1 -1
  445. package/dist/ionic/p-97e31c0a.system.js +4 -0
  446. package/dist/ionic/p-9ab6f3e6.system.js +1 -1
  447. package/dist/ionic/{p-62e7d4fa.js → p-9b89cbde.js} +1 -1
  448. package/dist/ionic/p-9e852ff1.system.js +1 -1
  449. package/dist/ionic/p-a0b6d438.js +4 -0
  450. package/dist/ionic/p-a545b4f1.system.js +4 -0
  451. package/dist/ionic/p-a5c1e6ce.entry.js +4 -0
  452. package/dist/ionic/p-a6d83a03.system.entry.js +4 -0
  453. package/dist/ionic/p-a8e68fd9.entry.js +4 -0
  454. package/dist/ionic/{p-aa377971.system.js → p-a936d224.system.js} +1 -1
  455. package/dist/ionic/{p-beb864e4.system.entry.js → p-a9c3699b.system.entry.js} +1 -1
  456. package/dist/ionic/p-ab4cff27.system.js +1 -1
  457. package/dist/ionic/{p-012952cd.system.entry.js → p-abacb44b.system.entry.js} +2 -2
  458. package/dist/ionic/{p-1f81b5be.entry.js → p-af016cd3.entry.js} +1 -1
  459. package/dist/ionic/{p-a9c32660.entry.js → p-b0cee324.entry.js} +1 -1
  460. package/dist/ionic/{p-f4309ac7.entry.js → p-b1142133.entry.js} +1 -1
  461. package/dist/ionic/p-b17b7c3c.system.entry.js +4 -0
  462. package/dist/ionic/p-b203659a.system.entry.js +4 -0
  463. package/dist/ionic/{p-c679fcb5.entry.js → p-b2a74a72.entry.js} +1 -1
  464. package/dist/ionic/p-b4b4bb29.system.js +1 -1
  465. package/dist/ionic/p-b6f8ee31.entry.js +4 -0
  466. package/dist/ionic/p-b8c3f071.system.js +1 -1
  467. package/dist/ionic/p-b906c5ca.entry.js +4 -0
  468. package/dist/ionic/p-b912e055.system.js +1 -1
  469. package/dist/ionic/{p-e42aaa8b.entry.js → p-b91fe549.entry.js} +1 -1
  470. package/dist/ionic/p-bba2ce59.system.js +1 -1
  471. package/dist/ionic/p-beb64be7.system.entry.js +4 -0
  472. package/dist/ionic/p-bed722c4.system.entry.js +4 -0
  473. package/dist/ionic/p-c0c81820.system.js +4 -0
  474. package/dist/ionic/p-c224b9a9.js +5 -0
  475. package/dist/ionic/p-c4042875.system.js +4 -0
  476. package/dist/ionic/p-c4f2dce7.system.js +1 -1
  477. package/dist/ionic/{p-6f6646bf.system.entry.js → p-c7b8c2ef.system.entry.js} +1 -1
  478. package/dist/ionic/{p-1ecba429.entry.js → p-c7d30db9.entry.js} +1 -1
  479. package/dist/ionic/{p-db1a1e00.entry.js → p-c919498d.entry.js} +1 -1
  480. package/dist/ionic/{p-54200074.entry.js → p-ca5219df.entry.js} +1 -1
  481. package/dist/ionic/p-ccdcb022.system.js +1 -1
  482. package/dist/ionic/p-cf425ec5.system.entry.js +4 -0
  483. package/dist/ionic/p-d2597b3e.system.js +5 -0
  484. package/dist/ionic/p-d3952bd5.system.entry.js +4 -0
  485. package/dist/ionic/{p-8c1805f4.system.entry.js → p-d7ea6a0d.system.entry.js} +1 -1
  486. package/dist/ionic/p-db5043df.system.entry.js +4 -0
  487. package/dist/ionic/p-dfa756ed.system.js +4 -0
  488. package/dist/ionic/{p-28ea45b9.js → p-e6b240a0.js} +1 -1
  489. package/dist/ionic/{p-cabd2c6d.entry.js → p-e76a4bc8.entry.js} +1 -1
  490. package/dist/ionic/{p-cf0c93e3.system.entry.js → p-e8400078.system.entry.js} +2 -2
  491. package/dist/ionic/{p-4e6e43c1.entry.js → p-ed636a74.entry.js} +1 -1
  492. package/dist/ionic/p-f10de93b.js +4 -0
  493. package/dist/ionic/{p-f919c026.entry.js → p-f4cc91f6.entry.js} +1 -1
  494. package/dist/ionic/p-f5a750e4.system.entry.js +4 -0
  495. package/dist/ionic/p-f8e620f1.entry.js +4 -0
  496. package/dist/ionic/p-fa8d4788.system.js +1 -1
  497. package/dist/ionic/{p-8a2801f1.system.entry.js → p-ff5144f3.system.entry.js} +1 -1
  498. package/dist/ionic/p-ff5a10f9.system.js +2 -2
  499. package/dist/ionic/{p-6129af0a.system.entry.js → p-ffb876b0.system.entry.js} +1 -1
  500. package/dist/types/components/datetime/datetime.d.ts +1 -1
  501. package/dist/types/components/menu/menu-interface.d.ts +15 -4
  502. package/dist/types/components/radio/radio.d.ts +1 -1
  503. package/dist/types/components.d.ts +627 -3
  504. package/dist/types/stencil-public-runtime.d.ts +21 -0
  505. package/dist/types/utils/content/index.d.ts +1 -1
  506. package/dist/types/utils/focus-visible.d.ts +3 -2
  507. package/dist/types/utils/menu-controller/index.d.ts +2 -21
  508. package/dist/types/utils/test/platform.utils.d.ts +9 -9
  509. package/dist/types/utils/watch-options.d.ts +9 -1
  510. package/hydrate/index.d.ts +1 -1
  511. package/hydrate/index.js +567 -238
  512. package/package.json +11 -14
  513. package/dist/esm-es5/animation-92066c62.js +0 -4
  514. package/dist/esm-es5/app-globals-ec816a70.js +0 -4
  515. package/dist/esm-es5/form-controller-ed77647a.js +0 -4
  516. package/dist/esm-es5/index-746a238e.js +0 -4
  517. package/dist/esm-es5/index-7d2b2808.js +0 -4
  518. package/dist/esm-es5/index-b49b173c.js +0 -5
  519. package/dist/esm-es5/index-df55802d.js +0 -4
  520. package/dist/esm-es5/input-shims-d78a3c77.js +0 -4
  521. package/dist/esm-es5/ionic-global-246ca78f.js +0 -4
  522. package/dist/esm-es5/ios.transition-a86d7bbe.js +0 -4
  523. package/dist/esm-es5/md.transition-365ef6b6.js +0 -4
  524. package/dist/esm-es5/overlays-cec6bac8.js +0 -4
  525. package/dist/esm-es5/status-tap-9aeeaca5.js +0 -4
  526. package/dist/esm-es5/watch-options-355a920a.js +0 -4
  527. package/dist/ionic/p-015187e5.system.js +0 -4
  528. package/dist/ionic/p-06ac429a.js +0 -5
  529. package/dist/ionic/p-0b7c25ee.system.entry.js +0 -4
  530. package/dist/ionic/p-0f1f59da.system.entry.js +0 -4
  531. package/dist/ionic/p-128a98e8.system.js +0 -4
  532. package/dist/ionic/p-16e44585.js +0 -4
  533. package/dist/ionic/p-19fba51c.entry.js +0 -4
  534. package/dist/ionic/p-1a463b1e.system.entry.js +0 -4
  535. package/dist/ionic/p-1f260a7b.entry.js +0 -4
  536. package/dist/ionic/p-29073efe.system.entry.js +0 -4
  537. package/dist/ionic/p-2bbf3ac4.system.entry.js +0 -4
  538. package/dist/ionic/p-33a8349a.system.entry.js +0 -4
  539. package/dist/ionic/p-34259245.system.entry.js +0 -4
  540. package/dist/ionic/p-35e399bd.entry.js +0 -4
  541. package/dist/ionic/p-38c5fe2b.system.entry.js +0 -4
  542. package/dist/ionic/p-3a58e3a4.system.entry.js +0 -4
  543. package/dist/ionic/p-3d726a67.system.js +0 -4
  544. package/dist/ionic/p-3f3da911.system.entry.js +0 -4
  545. package/dist/ionic/p-4215652f.system.entry.js +0 -4
  546. package/dist/ionic/p-4f97c112.entry.js +0 -4
  547. package/dist/ionic/p-54f6cd27.system.entry.js +0 -4
  548. package/dist/ionic/p-5b976d70.entry.js +0 -4
  549. package/dist/ionic/p-5bf16a18.js +0 -4
  550. package/dist/ionic/p-629aa3fd.system.js +0 -5
  551. package/dist/ionic/p-64475ab5.system.js +0 -4
  552. package/dist/ionic/p-673846f6.entry.js +0 -4
  553. package/dist/ionic/p-6ce0a709.system.entry.js +0 -4
  554. package/dist/ionic/p-818b2e75.entry.js +0 -4
  555. package/dist/ionic/p-81ef7437.system.entry.js +0 -4
  556. package/dist/ionic/p-8e24ebbc.js +0 -4
  557. package/dist/ionic/p-8f01a9a2.system.js +0 -4
  558. package/dist/ionic/p-939e0fa1.system.js +0 -4
  559. package/dist/ionic/p-95817276.system.entry.js +0 -4
  560. package/dist/ionic/p-9b9dcc3e.system.entry.js +0 -4
  561. package/dist/ionic/p-9dc85536.system.entry.js +0 -4
  562. package/dist/ionic/p-9f2e0db9.js +0 -4
  563. package/dist/ionic/p-a04bfada.entry.js +0 -4
  564. package/dist/ionic/p-a164e3ab.system.entry.js +0 -4
  565. package/dist/ionic/p-a200a7fc.entry.js +0 -4
  566. package/dist/ionic/p-a34fc12e.system.entry.js +0 -4
  567. package/dist/ionic/p-ad48dd13.system.js +0 -4
  568. package/dist/ionic/p-b132c2c0.system.js +0 -4
  569. package/dist/ionic/p-b3c68723.system.js +0 -4
  570. package/dist/ionic/p-b61a2fa0.system.entry.js +0 -4
  571. package/dist/ionic/p-b753ec0d.system.entry.js +0 -4
  572. package/dist/ionic/p-b9047b05.system.js +0 -4
  573. package/dist/ionic/p-c05315f5.system.entry.js +0 -4
  574. package/dist/ionic/p-c105bd36.entry.js +0 -4
  575. package/dist/ionic/p-c49672d8.system.js +0 -4
  576. package/dist/ionic/p-c87827ca.system.js +0 -4
  577. package/dist/ionic/p-c8c9d699.system.entry.js +0 -4
  578. package/dist/ionic/p-c92f0a6d.system.entry.js +0 -4
  579. package/dist/ionic/p-c956e82c.system.entry.js +0 -4
  580. package/dist/ionic/p-c994fff0.system.js +0 -4
  581. package/dist/ionic/p-ca5cf574.js +0 -4
  582. package/dist/ionic/p-cd2d17c3.system.entry.js +0 -4
  583. package/dist/ionic/p-d35217be.entry.js +0 -4
  584. package/dist/ionic/p-d6e53e66.entry.js +0 -4
  585. package/dist/ionic/p-e1d5752d.system.entry.js +0 -4
  586. package/dist/ionic/p-e2bb634f.js +0 -4
  587. package/dist/ionic/p-e38a5f77.js +0 -4
  588. package/dist/ionic/p-e65ebe96.entry.js +0 -4
  589. package/dist/ionic/p-e74faf2a.entry.js +0 -4
  590. package/dist/ionic/p-eac263dd.entry.js +0 -4
  591. package/dist/ionic/p-f34f001c.entry.js +0 -4
  592. package/dist/ionic/p-f5bf698b.entry.js +0 -4
  593. package/dist/ionic/p-f7566bad.entry.js +0 -4
  594. /package/dist/ionic/{p-b24aa895.js → p-114a36ed.js} +0 -0
@@ -122,12 +122,45 @@
122
122
  overscroll-behavior-y: contain;
123
123
  }
124
124
 
125
- .alert-checkbox-group::-webkit-scrollbar,
126
- .alert-radio-group::-webkit-scrollbar,
127
- .alert-message::-webkit-scrollbar {
128
- display: none;
125
+ .alert-checkbox-label,
126
+ .alert-radio-label {
127
+ /**
128
+ * This allows long words to wrap to the next line
129
+ * instead of flowing outside of the container.
130
+ *
131
+ * The "anywhere" keyword should be used instead
132
+ * of the "break-word" keyword since the parent
133
+ * container is using flexbox. Flex relies on min-content and
134
+ * max-content intrinsic sizes to structure the layout. Flex will
135
+ * wrap content only until it reaches its min-content intrinsic size
136
+ * which in this case is equal to the longest word in this container.
137
+ * "break-word" does not shrink the min-content intrinsic size
138
+ * of the flex item which causes the long word to still overflow.
139
+ * "anywhere" on the other hand does shrink the min-content
140
+ * intrinsic size which allows the long word to wrap to the next line.
141
+ */
142
+ overflow-wrap: anywhere;
129
143
  }
130
144
 
145
+ /**
146
+ * Scrollbars on mobile devices will be hidden.
147
+ * Users can still scroll the content by swiping.
148
+ * If a user has a fine pointing device, such as a
149
+ * mouse or trackpad, then scrollbars will be
150
+ * visible. This allows users to scroll the
151
+ * content with their pointing device.
152
+ * Otherwise, the user would have to use the
153
+ * keyboard to navigate through the options.
154
+ * This may not be intuitive for users who
155
+ * are not familiar with keyboard navigation.
156
+ */
157
+ @media (any-pointer: coarse) {
158
+ .alert-checkbox-group::-webkit-scrollbar,
159
+ .alert-radio-group::-webkit-scrollbar,
160
+ .alert-message::-webkit-scrollbar {
161
+ display: none;
162
+ }
163
+ }
131
164
  .alert-input {
132
165
  padding-left: 0;
133
166
  padding-right: 0;
@@ -19,6 +19,54 @@ const testAria = async (page, buttonID, expectedAriaLabelledBy, expectedAriaDesc
19
19
  expect(ariaLabelledBy).toBe(expectedAriaLabelledBy);
20
20
  expect(ariaDescribedBy).toBe(expectedAriaDescribedBy);
21
21
  };
22
+ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
23
+ test.describe(title('alert: text wrapping'), () => {
24
+ test('should break on words and white spaces for radios', async ({ page }, testInfo) => {
25
+ testInfo.annotations.push({
26
+ type: 'issue',
27
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28406',
28
+ });
29
+ await page.setContent(`
30
+ <ion-alert header='Text Wrapping'></ion-alert>
31
+
32
+ <script>
33
+ const alert = document.querySelector('ion-alert');
34
+ alert.inputs = [
35
+ { type: 'radio', value: 'a', label: 'ThisIsAllOneReallyLongWordThatShouldWrap' },
36
+ { type: 'radio', value: 'b', label: 'These are separate words that should wrap' }
37
+ ];
38
+ </script>
39
+ `, config);
40
+ const ionAlertDidPresent = await page.spyOnEvent('ionAlertDidPresent');
41
+ const alert = page.locator('ion-alert');
42
+ await alert.evaluate((el) => el.present());
43
+ await ionAlertDidPresent.next();
44
+ await expect(page).toHaveScreenshot(screenshot(`alert-radio-text-wrap`));
45
+ });
46
+ test('should break on words and white spaces for checkboxes', async ({ page }, testInfo) => {
47
+ testInfo.annotations.push({
48
+ type: 'issue',
49
+ description: 'https://github.com/ionic-team/ionic-framework/issues/28406',
50
+ });
51
+ await page.setContent(`
52
+ <ion-alert header='Text Wrapping'></ion-alert>
53
+
54
+ <script>
55
+ const alert = document.querySelector('ion-alert');
56
+ alert.inputs = [
57
+ { type: 'checkbox', value: 'a', label: 'ThisIsAllOneReallyLongWordThatShouldWrap' },
58
+ { type: 'checkbox', value: 'b', label: 'These are separate words that should wrap' }
59
+ ];
60
+ </script>
61
+ `, config);
62
+ const ionAlertDidPresent = await page.spyOnEvent('ionAlertDidPresent');
63
+ const alert = page.locator('ion-alert');
64
+ await alert.evaluate((el) => el.present());
65
+ await ionAlertDidPresent.next();
66
+ await expect(page).toHaveScreenshot(screenshot(`alert-checkbox-text-wrap`));
67
+ });
68
+ });
69
+ });
22
70
  configs({ directions: ['ltr'] }).forEach(({ config, title }) => {
23
71
  test.describe(title('alert: a11y'), () => {
24
72
  test.beforeEach(async ({ page }) => {
@@ -121,7 +121,7 @@
121
121
  right: 0;
122
122
  }
123
123
  @supports selector(:dir(rtl)) {
124
- :host(.legacy-checkbox) label:dir(rtl) {
124
+ :host(.legacy-checkbox:dir(rtl)) label {
125
125
  left: unset;
126
126
  right: unset;
127
127
  right: 0;
@@ -343,7 +343,7 @@ input {
343
343
  }
344
344
 
345
345
  @supports selector(:dir(rtl)) {
346
- :host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper:dir(rtl) {
346
+ :host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper {
347
347
  transform-origin: right top;
348
348
  }
349
349
  }
@@ -356,7 +356,7 @@ input {
356
356
  }
357
357
 
358
358
  @supports selector(:dir(rtl)) {
359
- :host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper:dir(rtl) {
359
+ :host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper {
360
360
  transform-origin: calc(100% - center) top;
361
361
  }
362
362
  }
@@ -121,7 +121,7 @@
121
121
  right: 0;
122
122
  }
123
123
  @supports selector(:dir(rtl)) {
124
- :host(.legacy-checkbox) label:dir(rtl) {
124
+ :host(.legacy-checkbox:dir(rtl)) label {
125
125
  left: unset;
126
126
  right: unset;
127
127
  right: 0;
@@ -343,7 +343,7 @@ input {
343
343
  }
344
344
 
345
345
  @supports selector(:dir(rtl)) {
346
- :host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper:dir(rtl) {
346
+ :host(.checkbox-label-placement-stacked.checkbox-alignment-start:dir(rtl)) .label-text-wrapper {
347
347
  transform-origin: right top;
348
348
  }
349
349
  }
@@ -356,7 +356,7 @@ input {
356
356
  }
357
357
 
358
358
  @supports selector(:dir(rtl)) {
359
- :host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper:dir(rtl) {
359
+ :host(.checkbox-label-placement-stacked.checkbox-alignment-center:dir(rtl)) .label-text-wrapper {
360
360
  transform-origin: calc(100% - center) top;
361
361
  }
362
362
  }
@@ -196,7 +196,7 @@ ion-picker-column-internal {
196
196
  right: -99999px;
197
197
  }
198
198
  @supports selector(:dir(rtl)) {
199
- :host(.show-month-and-year) .calendar-next-prev:dir(rtl), :host(.show-month-and-year) .calendar-days-of-week:dir(rtl), :host(.show-month-and-year) .calendar-body:dir(rtl), :host(.show-month-and-year) .datetime-time:dir(rtl) {
199
+ :host(.show-month-and-year:dir(rtl)) .calendar-next-prev, :host(.show-month-and-year:dir(rtl)) .calendar-days-of-week, :host(.show-month-and-year:dir(rtl)) .calendar-body, :host(.show-month-and-year:dir(rtl)) .datetime-time {
200
200
  left: unset;
201
201
  right: unset;
202
202
  right: -99999px;
@@ -224,15 +224,35 @@ ion-picker-column-internal {
224
224
  display: none;
225
225
  }
226
226
 
227
- :host(.datetime-readonly),
228
227
  :host(.datetime-disabled) {
229
228
  pointer-events: none;
230
229
  }
231
-
232
- :host(.datetime-disabled) {
230
+ :host(.datetime-disabled) .calendar-days-of-week,
231
+ :host(.datetime-disabled) .datetime-time {
233
232
  opacity: 0.4;
234
233
  }
235
234
 
235
+ :host(.datetime-readonly) {
236
+ pointer-events: none;
237
+ /**
238
+ * Allow user to navigate months
239
+ * while in readonly mode
240
+ */
241
+ /**
242
+ * Disabled buttons should have full opacity
243
+ * in readonly mode
244
+ */
245
+ }
246
+ :host(.datetime-readonly) .calendar-action-buttons,
247
+ :host(.datetime-readonly) .calendar-body,
248
+ :host(.datetime-readonly) .datetime-year {
249
+ pointer-events: initial;
250
+ }
251
+ :host(.datetime-readonly) .calendar-day[disabled]:not(.calendar-day-constrained),
252
+ :host(.datetime-readonly) .datetime-action-buttons ion-button[disabled] {
253
+ opacity: 1;
254
+ }
255
+
236
256
  /**
237
257
  * Title should not wrap
238
258
  * to the next line and should
@@ -94,6 +94,13 @@ export class Datetime {
94
94
  this.workingParts = Object.assign({}, parts);
95
95
  };
96
96
  this.setActiveParts = (parts, removeDate = false) => {
97
+ /** if the datetime component is in readonly mode,
98
+ * allow browsing of the calendar without changing
99
+ * the set value
100
+ */
101
+ if (this.readonly) {
102
+ return;
103
+ }
97
104
  const { multiple, minParts, maxParts, activeParts } = this;
98
105
  /**
99
106
  * When setting the active parts, it is possible
@@ -914,7 +921,13 @@ export class Datetime {
914
921
  * are rendered independently of presentation.
915
922
  */
916
923
  renderFooter() {
917
- const { showDefaultButtons, showClearButton } = this;
924
+ const { disabled, readonly, showDefaultButtons, showClearButton } = this;
925
+ /**
926
+ * The cancel, clear, and confirm buttons
927
+ * should not be interactive if the datetime
928
+ * is disabled or readonly.
929
+ */
930
+ const isButtonDisabled = disabled || readonly;
918
931
  const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
919
932
  if (!hasSlottedButtons && !showDefaultButtons && !showClearButton) {
920
933
  return;
@@ -933,7 +946,7 @@ export class Datetime {
933
946
  return (h("div", { class: "datetime-footer" }, h("div", { class: "datetime-buttons" }, h("div", { class: {
934
947
  ['datetime-action-buttons']: true,
935
948
  ['has-clear-button']: this.showClearButton,
936
- } }, h("slot", { name: "buttons" }, h("ion-buttons", null, showDefaultButtons && (h("ion-button", { id: "cancel-button", color: this.color, onClick: () => this.cancel(true) }, this.cancelText)), h("div", { class: "datetime-action-buttons-container" }, showClearButton && (h("ion-button", { id: "clear-button", color: this.color, onClick: () => clearButtonClick() }, this.clearText)), showDefaultButtons && (h("ion-button", { id: "confirm-button", color: this.color, onClick: () => this.confirm(true) }, this.doneText)))))))));
949
+ } }, h("slot", { name: "buttons" }, h("ion-buttons", null, showDefaultButtons && (h("ion-button", { id: "cancel-button", color: this.color, onClick: () => this.cancel(true), disabled: isButtonDisabled }, this.cancelText)), h("div", { class: "datetime-action-buttons-container" }, showClearButton && (h("ion-button", { id: "clear-button", color: this.color, onClick: () => clearButtonClick(), disabled: isButtonDisabled }, this.clearText)), showDefaultButtons && (h("ion-button", { id: "confirm-button", color: this.color, onClick: () => this.confirm(true), disabled: isButtonDisabled }, this.doneText)))))))));
937
950
  }
938
951
  /**
939
952
  * Wheel picker render methods
@@ -1224,13 +1237,14 @@ export class Datetime {
1224
1237
  * Grid Render Methods
1225
1238
  */
1226
1239
  renderCalendarHeader(mode) {
1240
+ const { disabled } = this;
1227
1241
  const expandedIcon = mode === 'ios' ? chevronDown : caretUpSharp;
1228
1242
  const collapsedIcon = mode === 'ios' ? chevronForward : caretDownSharp;
1229
- const prevMonthDisabled = isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1230
- const nextMonthDisabled = isNextMonthDisabled(this.workingParts, this.maxParts);
1243
+ const prevMonthDisabled = disabled || isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1244
+ const nextMonthDisabled = disabled || isNextMonthDisabled(this.workingParts, this.maxParts);
1231
1245
  // don't use the inheritAttributes util because it removes dir from the host, and we still need that
1232
1246
  const hostDir = this.el.getAttribute('dir') || undefined;
1233
- return (h("div", { class: "calendar-header" }, h("div", { class: "calendar-action-buttons" }, h("div", { class: "calendar-month-year" }, h("ion-item", { part: "month-year-button", ref: (el) => (this.monthYearToggleItemRef = el), button: true, "aria-label": "Show year picker", detail: false, lines: "none", onClick: () => {
1247
+ return (h("div", { class: "calendar-header" }, h("div", { class: "calendar-action-buttons" }, h("div", { class: "calendar-month-year" }, h("ion-item", { part: "month-year-button", ref: (el) => (this.monthYearToggleItemRef = el), button: true, "aria-label": "Show year picker", detail: false, lines: "none", disabled: disabled, onClick: () => {
1234
1248
  var _a;
1235
1249
  this.toggleMonthAndYearView();
1236
1250
  /**
@@ -1254,20 +1268,23 @@ export class Datetime {
1254
1268
  }))));
1255
1269
  }
1256
1270
  renderMonth(month, year) {
1271
+ const { disabled, readonly } = this;
1257
1272
  const yearAllowed = this.parsedYearValues === undefined || this.parsedYearValues.includes(year);
1258
1273
  const monthAllowed = this.parsedMonthValues === undefined || this.parsedMonthValues.includes(month);
1259
1274
  const isCalMonthDisabled = !yearAllowed || !monthAllowed;
1260
- const swipeDisabled = isMonthDisabled({
1261
- month,
1262
- year,
1263
- day: null,
1264
- }, {
1265
- // The day is not used when checking if a month is disabled.
1266
- // Users should be able to access the min or max month, even if the
1267
- // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1268
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1269
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1270
- });
1275
+ const isDatetimeDisabled = disabled || readonly;
1276
+ const swipeDisabled = disabled ||
1277
+ isMonthDisabled({
1278
+ month,
1279
+ year,
1280
+ day: null,
1281
+ }, {
1282
+ // The day is not used when checking if a month is disabled.
1283
+ // Users should be able to access the min or max month, even if the
1284
+ // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1285
+ minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1286
+ maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1287
+ });
1271
1288
  // The working month should never have swipe disabled.
1272
1289
  // Otherwise the CSS scroll snap will not work and the user
1273
1290
  // can free-scroll the calendar.
@@ -1282,9 +1299,9 @@ export class Datetime {
1282
1299
  const { el, highlightedDates, isDateEnabled, multiple } = this;
1283
1300
  const referenceParts = { month, day, year };
1284
1301
  const isCalendarPadding = day === null;
1285
- const { isActive, isToday, ariaLabel, ariaSelected, disabled, text } = getCalendarDayState(this.locale, referenceParts, this.activeParts, this.todayParts, this.minParts, this.maxParts, this.parsedDayValues);
1302
+ const { isActive, isToday, ariaLabel, ariaSelected, disabled: isDayDisabled, text, } = getCalendarDayState(this.locale, referenceParts, this.activeParts, this.todayParts, this.minParts, this.maxParts, this.parsedDayValues);
1286
1303
  const dateIsoString = convertDataToISO(referenceParts);
1287
- let isCalDayDisabled = isCalMonthDisabled || disabled;
1304
+ let isCalDayDisabled = isCalMonthDisabled || isDayDisabled;
1288
1305
  if (!isCalDayDisabled && isDateEnabled !== undefined) {
1289
1306
  try {
1290
1307
  /**
@@ -1298,6 +1315,13 @@ export class Datetime {
1298
1315
  printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', el, e);
1299
1316
  }
1300
1317
  }
1318
+ /**
1319
+ * Some days are constrained through max & min or allowed dates
1320
+ * and also disabled because the component is readonly or disabled.
1321
+ * These need to be displayed differently.
1322
+ */
1323
+ const isCalDayConstrained = isCalDayDisabled && isDatetimeDisabled;
1324
+ const isButtonDisabled = isCalDayDisabled || isDatetimeDisabled;
1301
1325
  let dateStyle = undefined;
1302
1326
  /**
1303
1327
  * Custom highlight styles should not override the style for selected dates,
@@ -1324,10 +1348,11 @@ export class Datetime {
1324
1348
  el.style.setProperty('color', `${dateStyle ? dateStyle.textColor : ''}`, 'important');
1325
1349
  el.style.setProperty('background-color', `${dateStyle ? dateStyle.backgroundColor : ''}`, 'important');
1326
1350
  }
1327
- }, tabindex: "-1", "data-day": day, "data-month": month, "data-year": year, "data-index": index, "data-day-of-week": dayOfWeek, disabled: isCalDayDisabled, class: {
1351
+ }, tabindex: "-1", "data-day": day, "data-month": month, "data-year": year, "data-index": index, "data-day-of-week": dayOfWeek, disabled: isButtonDisabled, class: {
1328
1352
  'calendar-day-padding': isCalendarPadding,
1329
1353
  'calendar-day': true,
1330
1354
  'calendar-day-active': isActive,
1355
+ 'calendar-day-constrained': isCalDayConstrained,
1331
1356
  'calendar-day-today': isToday,
1332
1357
  }, part: dateParts, "aria-hidden": isCalendarPadding ? 'true' : null, "aria-selected": ariaSelected, "aria-label": ariaLabel, onClick: () => {
1333
1358
  if (isCalendarPadding) {
@@ -1369,7 +1394,7 @@ export class Datetime {
1369
1394
  return h("slot", { name: "time-label" }, "Time");
1370
1395
  }
1371
1396
  renderTimeOverlay() {
1372
- const { hourCycle, isTimePopoverOpen, locale } = this;
1397
+ const { disabled, hourCycle, isTimePopoverOpen, locale } = this;
1373
1398
  const computedHourCycle = getHourCycle(locale, hourCycle);
1374
1399
  const activePart = this.getActivePartsWithFallback();
1375
1400
  return [
@@ -1377,7 +1402,7 @@ export class Datetime {
1377
1402
  h("button", { class: {
1378
1403
  'time-body': true,
1379
1404
  'time-body-active': isTimePopoverOpen,
1380
- }, part: `time-button${isTimePopoverOpen ? ' active' : ''}`, "aria-expanded": "false", "aria-haspopup": "true", onClick: async (ev) => {
1405
+ }, part: `time-button${isTimePopoverOpen ? ' active' : ''}`, "aria-expanded": "false", "aria-haspopup": "true", disabled: disabled, onClick: async (ev) => {
1381
1406
  const { popoverRef } = this;
1382
1407
  if (popoverRef) {
1383
1408
  this.isTimePopoverOpen = true;
@@ -1617,7 +1642,7 @@ export class Datetime {
1617
1642
  "optional": false,
1618
1643
  "docs": {
1619
1644
  "tags": [],
1620
- "text": "If `true`, the datetime appears normal but is not interactive."
1645
+ "text": "If `true`, the datetime appears normal but the selected date cannot be changed."
1621
1646
  },
1622
1647
  "attribute": "readonly",
1623
1648
  "reflect": false,
@@ -196,7 +196,7 @@ ion-picker-column-internal {
196
196
  right: -99999px;
197
197
  }
198
198
  @supports selector(:dir(rtl)) {
199
- :host(.show-month-and-year) .calendar-next-prev:dir(rtl), :host(.show-month-and-year) .calendar-days-of-week:dir(rtl), :host(.show-month-and-year) .calendar-body:dir(rtl), :host(.show-month-and-year) .datetime-time:dir(rtl) {
199
+ :host(.show-month-and-year:dir(rtl)) .calendar-next-prev, :host(.show-month-and-year:dir(rtl)) .calendar-days-of-week, :host(.show-month-and-year:dir(rtl)) .calendar-body, :host(.show-month-and-year:dir(rtl)) .datetime-time {
200
200
  left: unset;
201
201
  right: unset;
202
202
  right: -99999px;
@@ -224,15 +224,35 @@ ion-picker-column-internal {
224
224
  display: none;
225
225
  }
226
226
 
227
- :host(.datetime-readonly),
228
227
  :host(.datetime-disabled) {
229
228
  pointer-events: none;
230
229
  }
231
-
232
- :host(.datetime-disabled) {
230
+ :host(.datetime-disabled) .calendar-days-of-week,
231
+ :host(.datetime-disabled) .datetime-time {
233
232
  opacity: 0.4;
234
233
  }
235
234
 
235
+ :host(.datetime-readonly) {
236
+ pointer-events: none;
237
+ /**
238
+ * Allow user to navigate months
239
+ * while in readonly mode
240
+ */
241
+ /**
242
+ * Disabled buttons should have full opacity
243
+ * in readonly mode
244
+ */
245
+ }
246
+ :host(.datetime-readonly) .calendar-action-buttons,
247
+ :host(.datetime-readonly) .calendar-body,
248
+ :host(.datetime-readonly) .datetime-year {
249
+ pointer-events: initial;
250
+ }
251
+ :host(.datetime-readonly) .calendar-day[disabled]:not(.calendar-day-constrained),
252
+ :host(.datetime-readonly) .datetime-action-buttons ion-button[disabled] {
253
+ opacity: 1;
254
+ }
255
+
236
256
  /**
237
257
  * Title should not wrap
238
258
  * to the next line and should
@@ -638,8 +658,4 @@ ion-picker-column-internal {
638
658
  display: flex;
639
659
  align-items: center;
640
660
  justify-content: flex-end;
641
- }
642
-
643
- :host .datetime-view-buttons ion-button {
644
- color: var(--ion-color-step-800, #333333);
645
661
  }
@@ -26,3 +26,69 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
26
26
  });
27
27
  });
28
28
  });
29
+ /**
30
+ * This behavior does not differ across
31
+ * modes/directions.
32
+ */
33
+ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
34
+ test.describe(title('datetime: a11y'), () => {
35
+ test('datetime should be keyboard navigable', async ({ page, browserName }) => {
36
+ await page.setContent(`
37
+ <ion-datetime value="2022-02-22T16:30:00"></ion-datetime>
38
+ `, config);
39
+ const tabKey = browserName === 'webkit' ? 'Alt+Tab' : 'Tab';
40
+ const datetime = page.locator('ion-datetime');
41
+ const monthYearButton = page.locator('.calendar-month-year ion-item');
42
+ const prevButton = page.locator('.calendar-next-prev ion-button:nth-child(1)');
43
+ const nextButton = page.locator('.calendar-next-prev ion-button:nth-child(2)');
44
+ await page.keyboard.press(tabKey);
45
+ await expect(monthYearButton).toBeFocused();
46
+ await page.keyboard.press(tabKey);
47
+ await expect(prevButton).toBeFocused();
48
+ await page.keyboard.press(tabKey);
49
+ await expect(nextButton).toBeFocused();
50
+ // check value before & after selecting via keyboard
51
+ const initialValue = await datetime.evaluate((el) => el.value);
52
+ expect(initialValue).toBe('2022-02-22T16:30:00');
53
+ await page.keyboard.press(tabKey);
54
+ await page.waitForChanges();
55
+ await page.keyboard.press('ArrowLeft');
56
+ await page.waitForChanges();
57
+ await page.keyboard.press('Enter');
58
+ await page.waitForChanges();
59
+ const newValue = await datetime.evaluate((el) => el.value);
60
+ expect(newValue).not.toBe('2022-02-22T16:30:00');
61
+ });
62
+ test('buttons should be keyboard navigable', async ({ page }) => {
63
+ await page.setContent(`
64
+
65
+ <ion-datetime value="2022-02-22T16:30:00" show-default-buttons="true" show-clear-button="true"></ion-datetime>
66
+ `, config);
67
+ await page.waitForSelector('.datetime-ready');
68
+ const clearButton = page.locator('#clear-button button');
69
+ const selectedDay = page.locator('.calendar-day-active');
70
+ await expect(selectedDay).toHaveText('22');
71
+ await clearButton.focus();
72
+ await page.waitForChanges();
73
+ await expect(clearButton).toBeFocused();
74
+ await page.keyboard.press('Enter');
75
+ await page.waitForChanges();
76
+ await expect(selectedDay).toHaveCount(0);
77
+ });
78
+ test('should navigate through months via right arrow key', async ({ page }) => {
79
+ await page.setContent(`
80
+
81
+ <ion-datetime value="2022-02-28"></ion-datetime>
82
+ `, config);
83
+ await page.waitForSelector('.datetime-ready');
84
+ const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
85
+ const calendarBody = page.locator('.calendar-body');
86
+ await expect(calendarMonthYear).toHaveText('February 2022');
87
+ await calendarBody.focus();
88
+ await page.waitForChanges();
89
+ await page.keyboard.press('ArrowRight');
90
+ await page.waitForChanges();
91
+ await expect(calendarMonthYear).toHaveText('March 2022');
92
+ });
93
+ });
94
+ });
@@ -0,0 +1,68 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { expect } from "@playwright/test";
5
+ import { configs, test } from "../../../../utils/test/playwright/index";
6
+ /**
7
+ * This behavior does not differ across
8
+ * modes/directions.
9
+ */
10
+ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config, screenshot }) => {
11
+ test.describe(title('datetime: disabled'), () => {
12
+ test('should not have visual regressions', async ({ page }) => {
13
+ await page.setContent(`
14
+ <ion-datetime value="2022-02-05T00:00:00" min="2022-01-01T00:00:00" max="2022-02-20T23:59:59" day-values="5,6,10,11,15,16,20" show-default-buttons disabled></ion-datetime>
15
+ `, config);
16
+ const datetime = page.locator('ion-datetime');
17
+ await expect(datetime).toHaveScreenshot(screenshot(`datetime-disabled`));
18
+ });
19
+ test('date should be disabled', async ({ page }) => {
20
+ await page.setContent(`
21
+ <ion-datetime value="2022-02-28" disabled></ion-datetime>
22
+ `, config);
23
+ await page.waitForSelector('.datetime-ready');
24
+ const febFirstButton = page.locator(`.calendar-day[data-day='1'][data-month='2']`);
25
+ await expect(febFirstButton).toBeDisabled();
26
+ });
27
+ test('month-year button should be disabled', async ({ page }) => {
28
+ await page.setContent(`
29
+ <ion-datetime value="2022-02-28" disabled></ion-datetime>
30
+ `, config);
31
+ await page.waitForSelector('.datetime-ready');
32
+ const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
33
+ await expect(calendarMonthYear.locator('button')).toBeDisabled();
34
+ });
35
+ test('next and prev buttons should be disabled', async ({ page }) => {
36
+ await page.setContent(`
37
+ <ion-datetime value="2022-02-28" disabled></ion-datetime>
38
+ `, config);
39
+ const prevMonthButton = page.locator('ion-datetime .calendar-next-prev ion-button:first-of-type button');
40
+ const nextMonthButton = page.locator('ion-datetime .calendar-next-prev ion-button:last-of-type button');
41
+ await expect(prevMonthButton).toBeDisabled();
42
+ await expect(nextMonthButton).toBeDisabled();
43
+ });
44
+ test('clear button should be disabled', async ({ page }) => {
45
+ await page.setContent(`
46
+
47
+ <ion-datetime value="2022-02-22T16:30:00" show-default-buttons="true" show-clear-button="true" disabled></ion-datetime>
48
+ `, config);
49
+ await page.waitForSelector('.datetime-ready');
50
+ const clearButton = page.locator('#clear-button button');
51
+ await expect(clearButton).toBeDisabled();
52
+ });
53
+ test('should not navigate through months via right arrow key', async ({ page }) => {
54
+ await page.setContent(`
55
+ <ion-datetime value="2022-02-28" disabled></ion-datetime>
56
+ `, config);
57
+ await page.waitForSelector('.datetime-ready');
58
+ const calendarMonthYear = page.locator('ion-datetime .calendar-month-year');
59
+ const calendarBody = page.locator('.calendar-body');
60
+ await expect(calendarMonthYear).toHaveText('February 2022');
61
+ await calendarBody.focus();
62
+ await page.waitForChanges();
63
+ await page.keyboard.press('ArrowRight');
64
+ await page.waitForChanges();
65
+ await expect(calendarMonthYear).toHaveText('February 2022');
66
+ });
67
+ });
68
+ });