voyager-ionic-core 8.0.0 → 8.1.0

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 (572) hide show
  1. package/components/checkbox.js +3 -3
  2. package/components/index2.js +119 -1
  3. package/components/input-shims.js +5 -5
  4. package/components/ion-accordion-group.js +2 -2
  5. package/components/ion-content.js +6 -4
  6. package/components/ion-datetime-button.js +2 -2
  7. package/components/ion-datetime.js +17 -14
  8. package/components/ion-fab-button.js +2 -2
  9. package/components/ion-fab-list.js +2 -2
  10. package/components/ion-fab.js +2 -2
  11. package/components/ion-footer.js +2 -2
  12. package/components/ion-grid.js +2 -2
  13. package/components/ion-header.js +2 -2
  14. package/components/ion-img.js +1 -1
  15. package/components/ion-infinite-scroll-content.js +2 -2
  16. package/components/ion-infinite-scroll.js +1 -1
  17. package/components/ion-input-password-toggle.js +3 -3
  18. package/components/ion-input.js +17 -4
  19. package/components/ion-item-divider.js +2 -2
  20. package/components/ion-item-group.js +1 -1
  21. package/components/ion-item-option.js +2 -2
  22. package/components/ion-item-options.js +1 -1
  23. package/components/ion-item-sliding.js +1 -1
  24. package/components/ion-loading.js +2 -2
  25. package/components/ion-menu-button.js +2 -2
  26. package/components/ion-menu-toggle.js +2 -2
  27. package/components/ion-menu.js +2 -2
  28. package/components/ion-modal.js +10 -8
  29. package/components/ion-nav-link.js +1 -1
  30. package/components/ion-nav.js +1 -1
  31. package/components/ion-note.js +2 -2
  32. package/components/ion-picker-legacy.js +2 -2
  33. package/components/ion-progress-bar.js +1 -1
  34. package/components/ion-range.js +3 -3
  35. package/components/ion-refresher-content.js +1 -1
  36. package/components/ion-refresher.js +1 -1
  37. package/components/ion-reorder-group.js +1 -1
  38. package/components/ion-reorder.js +1 -1
  39. package/components/ion-router-link.js +2 -2
  40. package/components/ion-router-outlet.js +1 -1
  41. package/components/ion-row.js +1 -1
  42. package/components/ion-searchbar.js +4 -4
  43. package/components/ion-segment-button.js +3 -3
  44. package/components/ion-segment.js +2 -2
  45. package/components/ion-select-option.js +1 -1
  46. package/components/ion-select.js +2 -2
  47. package/components/ion-skeleton-text.js +2 -2
  48. package/components/ion-split-pane.js +2 -2
  49. package/components/ion-tab-bar.js +2 -2
  50. package/components/ion-tab-button.js +2 -2
  51. package/components/ion-tab.js +2 -2
  52. package/components/ion-tabs.js +1 -1
  53. package/components/ion-text.js +2 -2
  54. package/components/ion-textarea.js +2 -2
  55. package/components/ion-thumbnail.js +1 -1
  56. package/components/ion-title.js +2 -2
  57. package/components/ion-toast.js +2 -2
  58. package/components/ion-toggle.js +3 -3
  59. package/components/ion-toolbar.js +2 -2
  60. package/components/ios.transition.js +94 -67
  61. package/components/label.js +3 -3
  62. package/components/list-header.js +2 -2
  63. package/components/list.js +1 -1
  64. package/components/overlays.js +3 -2
  65. package/components/picker-column-option.js +2 -2
  66. package/components/picker-column.js +156 -4
  67. package/components/picker-column2.js +2 -2
  68. package/components/picker.js +2 -2
  69. package/components/popover.js +6 -4
  70. package/components/radio-group.js +1 -1
  71. package/components/radio.js +3 -3
  72. package/components/ripple-effect.js +1 -1
  73. package/components/select-popover.js +2 -2
  74. package/components/spinner.js +1 -1
  75. package/css/core.css +1 -1
  76. package/css/core.css.map +1 -1
  77. package/css/global.bundle.css.map +1 -1
  78. package/css/ionic.bundle.css +1 -1
  79. package/css/ionic.bundle.css.map +1 -1
  80. package/css/palettes/dark.always.css +1 -1
  81. package/css/palettes/dark.always.css.map +1 -1
  82. package/css/palettes/dark.class.css +1 -1
  83. package/css/palettes/dark.class.css.map +1 -1
  84. package/css/palettes/dark.system.css +1 -1
  85. package/css/palettes/dark.system.css.map +1 -1
  86. package/css/palettes/high-contrast-dark.always.css.map +1 -1
  87. package/css/palettes/high-contrast-dark.class.css.map +1 -1
  88. package/css/palettes/high-contrast-dark.system.css.map +1 -1
  89. package/css/palettes/high-contrast.always.css.map +1 -1
  90. package/css/palettes/high-contrast.class.css.map +1 -1
  91. package/css/palettes/high-contrast.system.css.map +1 -1
  92. package/css/typography.css.map +1 -1
  93. package/dist/cjs/{app-globals-5bfa2d7f.js → app-globals-66b7dc06.js} +1 -1
  94. package/dist/cjs/{button-active-564be49f.js → button-active-9135c809.js} +1 -1
  95. package/dist/cjs/{hardware-back-button-44e7c052.js → hardware-back-button-ed931127.js} +2 -2
  96. package/dist/cjs/index-8709af32.js +2234 -0
  97. package/dist/cjs/{index-6d6ac424.js → index-c0b7f8f4.js} +124 -6
  98. package/dist/cjs/{index-defd575f.js → index-c54654c6.js} +2 -2
  99. package/dist/cjs/index.cjs.js +9 -9
  100. package/dist/cjs/{input-shims-20d639e6.js → input-shims-9e59ef62.js} +5 -5
  101. package/dist/cjs/ion-accordion_2.cjs.entry.js +4 -4
  102. package/dist/cjs/ion-action-sheet.cjs.entry.js +5 -5
  103. package/dist/cjs/ion-alert.cjs.entry.js +5 -5
  104. package/dist/cjs/ion-app_8.cjs.entry.js +21 -20
  105. package/dist/cjs/ion-avatar_3.cjs.entry.js +3 -3
  106. package/dist/cjs/ion-back-button.cjs.entry.js +2 -2
  107. package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
  108. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +2 -2
  109. package/dist/cjs/ion-button_2.cjs.entry.js +2 -2
  110. package/dist/cjs/ion-card_5.cjs.entry.js +2 -2
  111. package/dist/cjs/ion-checkbox.cjs.entry.js +5 -5
  112. package/dist/cjs/ion-chip.cjs.entry.js +2 -2
  113. package/dist/cjs/ion-col_3.cjs.entry.js +5 -5
  114. package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
  115. package/dist/cjs/ion-datetime_3.cjs.entry.js +25 -22
  116. package/dist/cjs/ion-fab_3.cjs.entry.js +8 -8
  117. package/dist/cjs/ion-img.cjs.entry.js +3 -3
  118. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
  119. package/dist/cjs/ion-input-password-toggle.cjs.entry.js +5 -5
  120. package/dist/cjs/ion-input.cjs.entry.js +18 -6
  121. package/dist/cjs/ion-item-option_3.cjs.entry.js +6 -6
  122. package/dist/cjs/ion-item_8.cjs.entry.js +15 -15
  123. package/dist/cjs/ion-loading.cjs.entry.js +6 -6
  124. package/dist/cjs/ion-menu_3.cjs.entry.js +11 -11
  125. package/dist/cjs/ion-modal.cjs.entry.js +13 -12
  126. package/dist/cjs/ion-nav_2.cjs.entry.js +6 -5
  127. package/dist/cjs/ion-picker-column-option.cjs.entry.js +4 -4
  128. package/dist/cjs/ion-picker-column.cjs.entry.js +156 -6
  129. package/dist/cjs/ion-picker.cjs.entry.js +3 -3
  130. package/dist/cjs/ion-popover.cjs.entry.js +9 -8
  131. package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
  132. package/dist/cjs/ion-radio_2.cjs.entry.js +6 -6
  133. package/dist/cjs/ion-range.cjs.entry.js +5 -5
  134. package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
  135. package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
  136. package/dist/cjs/ion-ripple-effect.cjs.entry.js +3 -3
  137. package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
  138. package/dist/cjs/ion-searchbar.cjs.entry.js +6 -6
  139. package/dist/cjs/ion-segment_2.cjs.entry.js +7 -7
  140. package/dist/cjs/ion-select_3.cjs.entry.js +9 -9
  141. package/dist/cjs/ion-spinner.cjs.entry.js +3 -3
  142. package/dist/cjs/ion-split-pane.cjs.entry.js +4 -4
  143. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -6
  144. package/dist/cjs/ion-tab_2.cjs.entry.js +4 -4
  145. package/dist/cjs/ion-text.cjs.entry.js +4 -4
  146. package/dist/cjs/ion-textarea.cjs.entry.js +4 -4
  147. package/dist/cjs/ion-toast.cjs.entry.js +6 -6
  148. package/dist/cjs/ion-toggle.cjs.entry.js +5 -5
  149. package/dist/cjs/{ionic-global-62487d02.js → ionic-global-35b86a09.js} +1 -1
  150. package/dist/cjs/ionic.cjs.js +31 -33
  151. package/dist/cjs/{ios.transition-d4f0ca4e.js → ios.transition-5ddf92f1.js} +98 -69
  152. package/dist/cjs/loader.cjs.js +4 -4
  153. package/dist/cjs/{md.transition-857328f3.js → md.transition-047c18c5.js} +4 -2
  154. package/dist/cjs/{overlays-10c452b2.js → overlays-cb04d075.js} +5 -3
  155. package/dist/cjs/{status-tap-81daddfa.js → status-tap-5b2775cd.js} +1 -1
  156. package/dist/collection/collection-manifest.json +2 -2
  157. package/dist/collection/components/accordion-group/accordion-group.js +3 -3
  158. package/dist/collection/components/checkbox/checkbox.js +4 -4
  159. package/dist/collection/components/content/content.js +23 -4
  160. package/dist/collection/components/content/test/content.spec.js +27 -0
  161. package/dist/collection/components/datetime/datetime.js +18 -15
  162. package/dist/collection/components/datetime/test/color/datetime.e2e.js +14 -7
  163. package/dist/collection/components/datetime/test/overlay-roles/datetime.e2e.js +34 -0
  164. package/dist/collection/components/datetime-button/datetime-button.js +2 -2
  165. package/dist/collection/components/fab/fab.js +2 -2
  166. package/dist/collection/components/fab-button/fab-button.js +2 -2
  167. package/dist/collection/components/fab-list/fab-list.js +2 -2
  168. package/dist/collection/components/footer/footer.js +2 -2
  169. package/dist/collection/components/grid/grid.js +2 -2
  170. package/dist/collection/components/header/header.js +2 -2
  171. package/dist/collection/components/img/img.js +1 -1
  172. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  173. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  174. package/dist/collection/components/input/input.js +34 -5
  175. package/dist/collection/components/input/test/input.spec.js +13 -0
  176. package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
  177. package/dist/collection/components/item/test/a11y/item.e2e.js +24 -4
  178. package/dist/collection/components/item-divider/item-divider.js +2 -2
  179. package/dist/collection/components/item-group/item-group.js +1 -1
  180. package/dist/collection/components/item-option/item-option.js +2 -2
  181. package/dist/collection/components/item-options/item-options.js +1 -1
  182. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  183. package/dist/collection/components/label/label.ios.css +1 -1
  184. package/dist/collection/components/label/label.js +2 -2
  185. package/dist/collection/components/list/list.js +1 -1
  186. package/dist/collection/components/list-header/list-header.js +2 -2
  187. package/dist/collection/components/loading/loading.js +2 -2
  188. package/dist/collection/components/menu/menu.js +2 -2
  189. package/dist/collection/components/menu-button/menu-button.js +2 -2
  190. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  191. package/dist/collection/components/modal/gestures/sheet.js +3 -2
  192. package/dist/collection/components/modal/modal.js +25 -6
  193. package/dist/collection/components/modal/test/basic/modal.spec.js +19 -0
  194. package/dist/collection/components/nav/nav.js +1 -1
  195. package/dist/collection/components/nav-link/nav-link.js +1 -1
  196. package/dist/collection/components/note/note.js +2 -2
  197. package/dist/collection/components/picker/picker.js +2 -2
  198. package/dist/collection/components/picker-column/picker-column.css +19 -0
  199. package/dist/collection/components/picker-column/picker-column.js +159 -4
  200. package/dist/collection/components/picker-column/test/picker-column.spec.js +83 -0
  201. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
  202. package/dist/collection/components/picker-legacy/picker.js +2 -2
  203. package/dist/collection/components/picker-legacy-column/picker-column.js +2 -2
  204. package/dist/collection/components/popover/popover.js +23 -4
  205. package/dist/collection/components/popover/test/basic/popover.spec.js +19 -0
  206. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  207. package/dist/collection/components/radio/radio.js +3 -3
  208. package/dist/collection/components/radio-group/radio-group.js +2 -2
  209. package/dist/collection/components/range/range.js +4 -4
  210. package/dist/collection/components/refresher/refresher.js +1 -1
  211. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  212. package/dist/collection/components/reorder/reorder.js +1 -1
  213. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  214. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  215. package/dist/collection/components/router-link/router-link.js +2 -2
  216. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  217. package/dist/collection/components/row/row.js +1 -1
  218. package/dist/collection/components/searchbar/searchbar.js +5 -5
  219. package/dist/collection/components/segment/segment.js +3 -3
  220. package/dist/collection/components/segment-button/segment-button.js +3 -3
  221. package/dist/collection/components/select/select.js +3 -3
  222. package/dist/collection/components/select/test/fill/select.e2e.js +25 -0
  223. package/dist/collection/components/select-option/select-option.js +1 -1
  224. package/dist/collection/components/select-popover/select-popover.js +1 -1
  225. package/dist/collection/components/select-popover/select-popover.md.css +8 -1
  226. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  227. package/dist/collection/components/spinner/spinner.js +1 -1
  228. package/dist/collection/components/split-pane/split-pane.js +2 -2
  229. package/dist/collection/components/tab/tab.js +2 -2
  230. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  231. package/dist/collection/components/tab-button/tab-button.js +2 -2
  232. package/dist/collection/components/tabs/tabs.js +1 -1
  233. package/dist/collection/components/text/text.js +2 -2
  234. package/dist/collection/components/textarea/textarea.js +3 -3
  235. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  236. package/dist/collection/components/title/title.js +2 -2
  237. package/dist/collection/components/toast/toast.js +2 -2
  238. package/dist/collection/components/toggle/test/enable-on-off-labels/toggle.e2e.js +51 -31
  239. package/dist/collection/components/toggle/toggle.js +4 -4
  240. package/dist/collection/components/toolbar/toolbar.js +2 -2
  241. package/dist/collection/utils/focus-controller/index.js +112 -0
  242. package/dist/collection/utils/focus-controller/test/generic/focus-controller.e2e.js +52 -0
  243. package/dist/collection/utils/focus-controller/test/ionic/focus-controller.e2e.js +52 -0
  244. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +5 -5
  245. package/dist/collection/utils/overlays.js +2 -1
  246. package/dist/collection/utils/test/playwright/page/utils/goto.js +12 -3
  247. package/dist/collection/utils/transition/index.js +11 -1
  248. package/dist/collection/utils/transition/ios.transition.js +94 -67
  249. package/dist/docs.json +110 -15
  250. package/dist/esm/{app-globals-49873df1.js → app-globals-b99e6d29.js} +1 -1
  251. package/dist/esm/{button-active-46df59c1.js → button-active-920addb8.js} +1 -1
  252. package/dist/esm/{hardware-back-button-ba8f64c2.js → hardware-back-button-2d9760b6.js} +2 -2
  253. package/dist/esm/{index-56d90da9.js → index-7ae7186a.js} +2 -2
  254. package/dist/esm/{index-f0d7371a.js → index-8e6b6a24.js} +122 -4
  255. package/dist/esm/index-9aab3bcf.js +2196 -0
  256. package/dist/esm/index.js +9 -9
  257. package/dist/esm/{input-shims-4530285e.js → input-shims-0314bbe5.js} +5 -5
  258. package/dist/esm/ion-accordion_2.entry.js +4 -4
  259. package/dist/esm/ion-action-sheet.entry.js +5 -5
  260. package/dist/esm/ion-alert.entry.js +5 -5
  261. package/dist/esm/ion-app_8.entry.js +21 -20
  262. package/dist/esm/ion-avatar_3.entry.js +3 -3
  263. package/dist/esm/ion-back-button.entry.js +2 -2
  264. package/dist/esm/ion-backdrop.entry.js +2 -2
  265. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  266. package/dist/esm/ion-button_2.entry.js +2 -2
  267. package/dist/esm/ion-card_5.entry.js +2 -2
  268. package/dist/esm/ion-checkbox.entry.js +5 -5
  269. package/dist/esm/ion-chip.entry.js +2 -2
  270. package/dist/esm/ion-col_3.entry.js +5 -5
  271. package/dist/esm/ion-datetime-button.entry.js +4 -4
  272. package/dist/esm/ion-datetime_3.entry.js +25 -22
  273. package/dist/esm/ion-fab_3.entry.js +8 -8
  274. package/dist/esm/ion-img.entry.js +3 -3
  275. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  276. package/dist/esm/ion-input-password-toggle.entry.js +5 -5
  277. package/dist/esm/ion-input.entry.js +18 -6
  278. package/dist/esm/ion-item-option_3.entry.js +6 -6
  279. package/dist/esm/ion-item_8.entry.js +15 -15
  280. package/dist/esm/ion-loading.entry.js +6 -6
  281. package/dist/esm/ion-menu_3.entry.js +11 -11
  282. package/dist/esm/ion-modal.entry.js +13 -12
  283. package/dist/esm/ion-nav_2.entry.js +6 -5
  284. package/dist/esm/ion-picker-column-option.entry.js +4 -4
  285. package/dist/esm/ion-picker-column.entry.js +156 -6
  286. package/dist/esm/ion-picker.entry.js +3 -3
  287. package/dist/esm/ion-popover.entry.js +9 -8
  288. package/dist/esm/ion-progress-bar.entry.js +3 -3
  289. package/dist/esm/ion-radio_2.entry.js +6 -6
  290. package/dist/esm/ion-range.entry.js +5 -5
  291. package/dist/esm/ion-refresher_2.entry.js +4 -4
  292. package/dist/esm/ion-reorder_2.entry.js +4 -4
  293. package/dist/esm/ion-ripple-effect.entry.js +3 -3
  294. package/dist/esm/ion-route_4.entry.js +4 -4
  295. package/dist/esm/ion-searchbar.entry.js +6 -6
  296. package/dist/esm/ion-segment_2.entry.js +7 -7
  297. package/dist/esm/ion-select_3.entry.js +9 -9
  298. package/dist/esm/ion-spinner.entry.js +3 -3
  299. package/dist/esm/ion-split-pane.entry.js +4 -4
  300. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  301. package/dist/esm/ion-tab_2.entry.js +4 -4
  302. package/dist/esm/ion-text.entry.js +4 -4
  303. package/dist/esm/ion-textarea.entry.js +4 -4
  304. package/dist/esm/ion-toast.entry.js +6 -6
  305. package/dist/esm/ion-toggle.entry.js +5 -5
  306. package/dist/esm/{ionic-global-e6c98cd0.js → ionic-global-4528d288.js} +1 -1
  307. package/dist/esm/ionic.js +32 -34
  308. package/dist/esm/{ios.transition-71bfa932.js → ios.transition-e35d0940.js} +98 -69
  309. package/dist/esm/loader.js +5 -5
  310. package/dist/esm/{md.transition-86aef3c0.js → md.transition-4b90a1f0.js} +4 -2
  311. package/dist/esm/{overlays-6fb4a2f2.js → overlays-df2c06b2.js} +5 -4
  312. package/dist/esm/{status-tap-299361cd.js → status-tap-12c27922.js} +1 -1
  313. package/dist/esm-es5/app-globals-b99e6d29.js +4 -0
  314. package/dist/esm-es5/{button-active-46df59c1.js → button-active-920addb8.js} +1 -1
  315. package/dist/esm-es5/{hardware-back-button-ba8f64c2.js → hardware-back-button-2d9760b6.js} +1 -1
  316. package/dist/esm-es5/{index-56d90da9.js → index-7ae7186a.js} +1 -1
  317. package/dist/esm-es5/index-8e6b6a24.js +4 -0
  318. package/dist/esm-es5/index-9aab3bcf.js +5 -0
  319. package/dist/esm-es5/index.js +1 -1
  320. package/dist/esm-es5/input-shims-0314bbe5.js +4 -0
  321. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  322. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  323. package/dist/esm-es5/ion-alert.entry.js +1 -1
  324. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  325. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  326. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  327. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  328. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  329. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  330. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  331. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  332. package/dist/esm-es5/ion-chip.entry.js +1 -1
  333. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  334. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  335. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  336. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  337. package/dist/esm-es5/ion-img.entry.js +1 -1
  338. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  339. package/dist/esm-es5/ion-input-password-toggle.entry.js +1 -1
  340. package/dist/esm-es5/ion-input.entry.js +1 -1
  341. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  342. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  343. package/dist/esm-es5/ion-loading.entry.js +1 -1
  344. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  345. package/dist/esm-es5/ion-modal.entry.js +1 -1
  346. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  347. package/dist/esm-es5/ion-picker-column-option.entry.js +1 -1
  348. package/dist/esm-es5/ion-picker-column.entry.js +1 -1
  349. package/dist/esm-es5/ion-picker.entry.js +1 -1
  350. package/dist/esm-es5/ion-popover.entry.js +1 -1
  351. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  352. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  353. package/dist/esm-es5/ion-range.entry.js +1 -1
  354. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  355. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  356. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  357. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  358. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  359. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  360. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  361. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  362. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  363. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  364. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  365. package/dist/esm-es5/ion-text.entry.js +1 -1
  366. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  367. package/dist/esm-es5/ion-toast.entry.js +1 -1
  368. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  369. package/dist/esm-es5/{ionic-global-e6c98cd0.js → ionic-global-4528d288.js} +1 -1
  370. package/dist/esm-es5/ionic.js +1 -1
  371. package/dist/esm-es5/ios.transition-e35d0940.js +4 -0
  372. package/dist/esm-es5/loader.js +1 -1
  373. package/dist/esm-es5/md.transition-4b90a1f0.js +4 -0
  374. package/dist/esm-es5/{overlays-6fb4a2f2.js → overlays-df2c06b2.js} +1 -1
  375. package/dist/esm-es5/{status-tap-299361cd.js → status-tap-12c27922.js} +1 -1
  376. package/dist/html.html-data.json +24 -0
  377. package/dist/ionic/index.esm.js +1 -1
  378. package/dist/ionic/ionic.esm.js +1 -1
  379. package/dist/ionic/ionic.js +1 -1
  380. package/dist/ionic/{p-4f77a080.system.entry.js → p-01a27023.system.entry.js} +1 -1
  381. package/dist/ionic/p-0395be73.entry.js +4 -0
  382. package/dist/ionic/p-03b86a5e.js +4 -0
  383. package/dist/ionic/{p-5ad55625.entry.js → p-049d43bd.entry.js} +1 -1
  384. package/dist/ionic/p-0536574e.entry.js +4 -0
  385. package/dist/ionic/{p-005deca1.system.entry.js → p-08ea3402.system.entry.js} +1 -1
  386. package/dist/ionic/{p-f956e38a.entry.js → p-09538818.entry.js} +1 -1
  387. package/dist/ionic/{p-4a01cec0.entry.js → p-09b4e9ec.entry.js} +1 -1
  388. package/dist/ionic/{p-4809ddae.system.entry.js → p-0a6d801e.system.entry.js} +1 -1
  389. package/dist/ionic/{p-c54b167f.system.entry.js → p-0b007acc.system.entry.js} +1 -1
  390. package/dist/ionic/{p-e292247e.system.entry.js → p-10feef7e.system.entry.js} +1 -1
  391. package/dist/ionic/p-130299c9.entry.js +4 -0
  392. package/dist/ionic/p-15d1ddba.js +4 -0
  393. package/dist/ionic/{p-f8f8c5a8.system.entry.js → p-199f826f.system.entry.js} +1 -1
  394. package/dist/ionic/p-1b435d20.entry.js +4 -0
  395. package/dist/ionic/{p-96a561dd.js → p-1cc0b31f.js} +1 -1
  396. package/dist/ionic/p-1eb63fa4.entry.js +4 -0
  397. package/dist/ionic/{p-1ba197b6.entry.js → p-207e11dc.entry.js} +1 -1
  398. package/dist/ionic/{p-46111310.js → p-2690b1de.js} +1 -1
  399. package/dist/ionic/p-26bb6bb8.entry.js +4 -0
  400. package/dist/ionic/{p-f13dc6bd.system.entry.js → p-279f3bac.system.entry.js} +1 -1
  401. package/dist/ionic/p-29de09dd.entry.js +4 -0
  402. package/dist/ionic/{p-6e4dac1a.entry.js → p-2c588aa2.entry.js} +1 -1
  403. package/dist/ionic/p-2ff0e0aa.system.js +4 -0
  404. package/dist/ionic/p-30baae57.system.js +4 -0
  405. package/dist/ionic/{p-7a7ff5e3.system.js → p-31d27232.system.js} +1 -1
  406. package/dist/ionic/p-33e10509.system.js +4 -0
  407. package/dist/ionic/{p-7f33a6e2.system.entry.js → p-380efbfa.system.entry.js} +2 -2
  408. package/dist/ionic/p-3c27be4a.entry.js +4 -0
  409. package/dist/ionic/p-3d015cdb.system.js +5 -0
  410. package/dist/ionic/{p-1c42ad90.entry.js → p-3f53a0b1.entry.js} +1 -1
  411. package/dist/ionic/p-433157a4.entry.js +4 -0
  412. package/dist/ionic/{p-53d37363.entry.js → p-4824398b.entry.js} +1 -1
  413. package/dist/ionic/p-498eb648.system.entry.js +4 -0
  414. package/dist/ionic/{p-7c93f00b.system.entry.js → p-4d8f408d.system.entry.js} +1 -1
  415. package/dist/ionic/{p-ad2b9596.entry.js → p-5091f63c.entry.js} +1 -1
  416. package/dist/ionic/{p-6ef17d86.system.entry.js → p-509620b8.system.entry.js} +1 -1
  417. package/dist/ionic/{p-48f60474.entry.js → p-5109a566.entry.js} +1 -1
  418. package/dist/ionic/{p-4f6ebc2b.entry.js → p-52ce473d.entry.js} +1 -1
  419. package/dist/ionic/{p-4fadf4b0.entry.js → p-52f53904.entry.js} +1 -1
  420. package/dist/ionic/{p-aa8a2f40.system.entry.js → p-55f99a39.system.entry.js} +1 -1
  421. package/dist/ionic/{p-6ac30fc3.system.js → p-5734ac17.system.js} +1 -1
  422. package/dist/ionic/{p-55bc2a11.system.entry.js → p-57bc32e2.system.entry.js} +1 -1
  423. package/dist/ionic/{p-8f9e2850.js → p-5cc6dcf5.js} +1 -1
  424. package/dist/ionic/p-5dc9f99a.entry.js +4 -0
  425. package/dist/ionic/p-5ec3bb70.system.entry.js +4 -0
  426. package/dist/ionic/{p-b6519a42.entry.js → p-606f069c.entry.js} +1 -1
  427. package/dist/ionic/{p-3de2aab8.system.entry.js → p-628967e3.system.entry.js} +1 -1
  428. package/dist/ionic/{p-c927dbe2.system.entry.js → p-62e44e4a.system.entry.js} +1 -1
  429. package/dist/ionic/p-66ed603b.js +4 -0
  430. package/dist/ionic/{p-e548fedf.system.entry.js → p-670c9f57.system.entry.js} +1 -1
  431. package/dist/ionic/{p-d061515d.system.entry.js → p-6a2cf398.system.entry.js} +1 -1
  432. package/dist/ionic/{p-7492572a.entry.js → p-6c3666d5.entry.js} +1 -1
  433. package/dist/ionic/{p-53d69c70.system.entry.js → p-6df12af0.system.entry.js} +1 -1
  434. package/dist/ionic/p-6ec88301.entry.js +4 -0
  435. package/dist/ionic/p-6f008ad2.js +4 -0
  436. package/dist/ionic/{p-814efd87.system.entry.js → p-700567ab.system.entry.js} +1 -1
  437. package/dist/ionic/p-712d54ae.js +4 -0
  438. package/dist/ionic/{p-e8a713b5.entry.js → p-7349de07.entry.js} +1 -1
  439. package/dist/ionic/p-7402fcdf.entry.js +4 -0
  440. package/dist/ionic/{p-e6d46b5d.system.entry.js → p-77731f19.system.entry.js} +1 -1
  441. package/dist/ionic/{p-90f8498c.entry.js → p-78405458.entry.js} +1 -1
  442. package/dist/ionic/{p-b4a7f856.system.entry.js → p-7d6fd45f.system.entry.js} +1 -1
  443. package/dist/ionic/{p-332aa81e.entry.js → p-7eb47906.entry.js} +1 -1
  444. package/dist/ionic/{p-8a5152e5.entry.js → p-80265a58.entry.js} +1 -1
  445. package/dist/ionic/{p-68afa357.system.entry.js → p-83d748f8.system.entry.js} +2 -2
  446. package/dist/ionic/{p-6c5c1bb5.system.js → p-842c9fca.system.js} +1 -1
  447. package/dist/ionic/{p-e781c893.entry.js → p-8a03fbee.entry.js} +1 -1
  448. package/dist/ionic/{p-cf8101a6.system.entry.js → p-8cb80f83.system.entry.js} +1 -1
  449. package/dist/ionic/{p-9fd3ca09.system.entry.js → p-8d14ee8c.system.entry.js} +2 -2
  450. package/dist/ionic/p-90dfc454.system.entry.js +4 -0
  451. package/dist/ionic/{p-c4eafa12.system.entry.js → p-9213681c.system.entry.js} +1 -1
  452. package/dist/ionic/p-92d7e99d.system.js +4 -0
  453. package/dist/ionic/{p-2b86020c.system.entry.js → p-9664a1a2.system.entry.js} +1 -1
  454. package/dist/ionic/{p-dbc3e90c.entry.js → p-9797f6eb.entry.js} +1 -1
  455. package/dist/ionic/{p-987e38ef.system.entry.js → p-9848d7be.system.entry.js} +1 -1
  456. package/dist/ionic/{p-fea11771.entry.js → p-98f6116f.entry.js} +1 -1
  457. package/dist/ionic/{p-cbd87df6.entry.js → p-99884813.entry.js} +1 -1
  458. package/dist/ionic/{p-904df2ee.system.entry.js → p-99ca9787.system.entry.js} +1 -1
  459. package/dist/ionic/{p-ca5bb110.system.entry.js → p-9bfd7cda.system.entry.js} +1 -1
  460. package/dist/ionic/p-9c6dcf78.system.entry.js +4 -0
  461. package/dist/ionic/p-9da86308.js +4 -0
  462. package/dist/ionic/{p-83b445c3.js → p-9ec42be0.js} +1 -1
  463. package/dist/ionic/{p-5c26fed5.system.entry.js → p-a2e94ade.system.entry.js} +1 -1
  464. package/dist/ionic/{p-7bbcce53.system.js → p-a39d3482.system.js} +1 -1
  465. package/dist/ionic/p-a488b7ab.system.js +4 -0
  466. package/dist/ionic/{p-e1ad8e76.entry.js → p-a4ab7449.entry.js} +1 -1
  467. package/dist/ionic/{p-3d977e09.system.entry.js → p-a50f23bf.system.entry.js} +2 -2
  468. package/dist/ionic/{p-275dd0ba.system.entry.js → p-a76ab3ea.system.entry.js} +1 -1
  469. package/dist/ionic/{p-67f5b57a.js → p-a953ef66.js} +1 -1
  470. package/dist/ionic/p-aaaaaea1.entry.js +4 -0
  471. package/dist/ionic/{p-151e8afd.entry.js → p-b02eda30.entry.js} +1 -1
  472. package/dist/ionic/{p-341b3f37.entry.js → p-b04c27d8.entry.js} +1 -1
  473. package/dist/ionic/{p-6cf780b6.system.entry.js → p-b07affd5.system.entry.js} +1 -1
  474. package/dist/ionic/{p-aa79cc0e.system.entry.js → p-b28d3ccb.system.entry.js} +2 -2
  475. package/dist/ionic/{p-e099a6f3.entry.js → p-b563b6ac.entry.js} +1 -1
  476. package/dist/ionic/p-b62ae60a.system.entry.js +4 -0
  477. package/dist/ionic/p-b9181033.system.entry.js +4 -0
  478. package/dist/ionic/{p-e93cd31c.entry.js → p-ba70039f.entry.js} +1 -1
  479. package/dist/ionic/{p-1fe1f512.entry.js → p-bbbe869e.entry.js} +1 -1
  480. package/dist/ionic/{p-aea5f293.system.entry.js → p-c41435e6.system.entry.js} +1 -1
  481. package/dist/ionic/p-cec8589b.system.js +4 -0
  482. package/dist/ionic/{p-3008ca4e.system.entry.js → p-d69b26d9.system.entry.js} +1 -1
  483. package/dist/ionic/p-d73a16e6.system.entry.js +4 -0
  484. package/dist/ionic/p-dba5cb84.js +5 -0
  485. package/dist/ionic/{p-df0d39c7.system.entry.js → p-dc0d9ff5.system.entry.js} +2 -2
  486. package/dist/ionic/p-dc1e363a.entry.js +4 -0
  487. package/dist/ionic/{p-405fd996.entry.js → p-df517d1f.entry.js} +1 -1
  488. package/dist/ionic/p-dfb78785.system.js +4 -0
  489. package/dist/ionic/{p-98af538a.system.entry.js → p-e0a8ffd0.system.entry.js} +1 -1
  490. package/dist/ionic/{p-50205ef9.system.entry.js → p-e6e197f5.system.entry.js} +1 -1
  491. package/dist/ionic/{p-530207f9.entry.js → p-e6e88ab9.entry.js} +1 -1
  492. package/dist/ionic/{p-ffbc80ae.system.js → p-e81f22e3.system.js} +1 -1
  493. package/dist/ionic/{p-07584ab4.system.js → p-eb3023c9.system.js} +1 -1
  494. package/dist/ionic/p-ecbdbf25.system.entry.js +4 -0
  495. package/dist/ionic/{p-91b568e2.system.entry.js → p-ed5aebaa.system.entry.js} +1 -1
  496. package/dist/ionic/p-f357707e.entry.js +4 -0
  497. package/dist/ionic/{p-ca6decbd.entry.js → p-f53bcebd.entry.js} +1 -1
  498. package/dist/ionic/p-f9baf25c.entry.js +4 -0
  499. package/dist/ionic/{p-1472c130.entry.js → p-fa8f2e62.entry.js} +1 -1
  500. package/dist/ionic/{p-e81c3ca2.system.entry.js → p-fb21fd1c.system.entry.js} +1 -1
  501. package/dist/ionic/{p-bc3d649d.entry.js → p-fcecca8f.entry.js} +1 -1
  502. package/dist/types/components/accordion-group/accordion-group.d.ts +3 -4
  503. package/dist/types/components/checkbox/checkbox.d.ts +3 -4
  504. package/dist/types/components/content/content.d.ts +8 -0
  505. package/dist/types/components/datetime/datetime.d.ts +2 -0
  506. package/dist/types/components/input/input.d.ts +6 -0
  507. package/dist/types/components/modal/modal-interface.d.ts +1 -0
  508. package/dist/types/components/modal/modal.d.ts +18 -0
  509. package/dist/types/components/picker-column/picker-column.d.ts +37 -0
  510. package/dist/types/components/popover/popover-interface.d.ts +1 -0
  511. package/dist/types/components/popover/popover.d.ts +18 -0
  512. package/dist/types/components/radio-group/radio-group.d.ts +2 -0
  513. package/dist/types/components/range/range.d.ts +1 -1
  514. package/dist/types/components/searchbar/searchbar.d.ts +2 -0
  515. package/dist/types/components/segment/segment.d.ts +3 -2
  516. package/dist/types/components/select/select.d.ts +2 -0
  517. package/dist/types/components/textarea/textarea.d.ts +2 -0
  518. package/dist/types/components/toggle/toggle.d.ts +3 -2
  519. package/dist/types/components.d.ts +44 -12
  520. package/dist/types/utils/config.d.ts +9 -0
  521. package/dist/types/utils/focus-controller/index.d.ts +13 -0
  522. package/dist/types/utils/overlays.d.ts +1 -0
  523. package/hydrate/index.d.ts +1 -1
  524. package/hydrate/index.js +44900 -35418
  525. package/package.json +6 -6
  526. package/dist/cjs/index-bbc6c29f.js +0 -3324
  527. package/dist/esm/index-bcd8859b.js +0 -3286
  528. package/dist/esm-es5/app-globals-49873df1.js +0 -4
  529. package/dist/esm-es5/index-bcd8859b.js +0 -5
  530. package/dist/esm-es5/index-f0d7371a.js +0 -4
  531. package/dist/esm-es5/input-shims-4530285e.js +0 -4
  532. package/dist/esm-es5/ios.transition-71bfa932.js +0 -4
  533. package/dist/esm-es5/md.transition-86aef3c0.js +0 -4
  534. package/dist/ionic/p-0bd47555.js +0 -4
  535. package/dist/ionic/p-0e713efe.js +0 -4
  536. package/dist/ionic/p-13cc6ee6.entry.js +0 -4
  537. package/dist/ionic/p-1b0f4e6c.entry.js +0 -4
  538. package/dist/ionic/p-1fa53d02.entry.js +0 -4
  539. package/dist/ionic/p-23fdee0e.entry.js +0 -4
  540. package/dist/ionic/p-2613c305.system.js +0 -4
  541. package/dist/ionic/p-46f407f0.system.js +0 -4
  542. package/dist/ionic/p-495ed1c3.entry.js +0 -4
  543. package/dist/ionic/p-4de53118.js +0 -4
  544. package/dist/ionic/p-4edce583.system.entry.js +0 -4
  545. package/dist/ionic/p-510cb8e6.system.js +0 -4
  546. package/dist/ionic/p-582db405.system.entry.js +0 -4
  547. package/dist/ionic/p-5f28cb75.js +0 -4
  548. package/dist/ionic/p-6dc81903.entry.js +0 -4
  549. package/dist/ionic/p-7372cf23.system.entry.js +0 -4
  550. package/dist/ionic/p-7596e24d.system.js +0 -5
  551. package/dist/ionic/p-76971b4f.entry.js +0 -4
  552. package/dist/ionic/p-91dabef7.system.js +0 -4
  553. package/dist/ionic/p-9ccc8035.system.entry.js +0 -4
  554. package/dist/ionic/p-9fa5ff32.system.js +0 -4
  555. package/dist/ionic/p-a28ea4d8.system.entry.js +0 -4
  556. package/dist/ionic/p-a39a73e3.entry.js +0 -4
  557. package/dist/ionic/p-a90201f2.js +0 -4
  558. package/dist/ionic/p-ac045dad.entry.js +0 -4
  559. package/dist/ionic/p-ae42c907.entry.js +0 -4
  560. package/dist/ionic/p-ba35f07f.entry.js +0 -4
  561. package/dist/ionic/p-c1c77386.js +0 -5
  562. package/dist/ionic/p-c2762c6a.system.entry.js +0 -4
  563. package/dist/ionic/p-c4e495a3.system.js +0 -4
  564. package/dist/ionic/p-cf45a5c7.system.entry.js +0 -4
  565. package/dist/ionic/p-d73f49d0.entry.js +0 -4
  566. package/dist/ionic/p-dc4406d7.system.entry.js +0 -4
  567. package/dist/ionic/p-dec86943.entry.js +0 -4
  568. package/dist/ionic/p-e5a3659f.system.js +0 -4
  569. package/dist/ionic/p-ec178f19.entry.js +0 -4
  570. package/dist/ionic/p-eda2459e.entry.js +0 -4
  571. package/dist/ionic/p-f6ca4d02.js +0 -4
  572. package/dist/ionic/p-f6fec6a0.entry.js +0 -4
@@ -388,9 +388,9 @@ export class Toast {
388
388
  if (layout === 'stacked' && startButtons.length > 0 && endButtons.length > 0) {
389
389
  printIonWarning('This toast is using start and end buttons with the stacked toast layout. We recommend following the best practice of using either start or end buttons with the stacked toast layout.', el);
390
390
  }
391
- return (h(Host, Object.assign({ key: 'f3555e5e093ce5dc5114df2e7ed298afa79eee02', tabindex: "-1" }, this.htmlAttributes, { style: {
391
+ return (h(Host, Object.assign({ key: 'da148788489146a20b42023fdc6401e53c044767', tabindex: "-1" }, this.htmlAttributes, { style: {
392
392
  zIndex: `${60000 + this.overlayIndex}`,
393
- }, class: createColorClasses(this.color, Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'toast-translucent': this.translucent })), onIonToastWillDismiss: this.dispatchCancelHandler }), h("div", { key: '3a98853e3b9c4c015a0e4035ad34f7fe02ec3b1c', class: wrapperClass }, h("div", { key: '3c3447ce2a1fd4aecc3f7da1c1bb0c504fb6fcf7', class: "toast-container", part: "container" }, this.renderButtons(startButtons, 'start'), this.icon !== undefined && (h("ion-icon", { key: '40bb8c55ac8bf7ce283bf2cdeb5902e76ad911ca', class: "toast-icon", part: "icon", icon: this.icon, lazy: false, "aria-hidden": "true" })), h("div", { key: 'bfe843cce24b0205cdce48a544b294dcb0946eb4', class: "toast-content", role: "status", "aria-atomic": "true", "aria-live": "polite" }, !revealContentToScreenReader && header !== undefined && this.renderHeader('oldHeader', 'true'), !revealContentToScreenReader && message !== undefined && this.renderToastMessage('oldMessage', 'true'), revealContentToScreenReader && header !== undefined && this.renderHeader('header'), revealContentToScreenReader && message !== undefined && this.renderToastMessage('header')), this.renderButtons(endButtons, 'end')))));
393
+ }, class: createColorClasses(this.color, Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'toast-translucent': this.translucent })), onIonToastWillDismiss: this.dispatchCancelHandler }), h("div", { key: 'ab0a4d783aa43ba961492b3eb8beb60a38153057', class: wrapperClass }, h("div", { key: '83e49027fd1ca6553d6910ff91befeea43576f3c', class: "toast-container", part: "container" }, this.renderButtons(startButtons, 'start'), this.icon !== undefined && (h("ion-icon", { key: '025cb4b6b170a89548969a25bcce4ab7a3817898', class: "toast-icon", part: "icon", icon: this.icon, lazy: false, "aria-hidden": "true" })), h("div", { key: 'b811b4e1cbc1528c2cfb57898f5615692120f840', class: "toast-content", role: "status", "aria-atomic": "true", "aria-live": "polite" }, !revealContentToScreenReader && header !== undefined && this.renderHeader('oldHeader', 'true'), !revealContentToScreenReader && message !== undefined && this.renderToastMessage('oldMessage', 'true'), revealContentToScreenReader && header !== undefined && this.renderHeader('header'), revealContentToScreenReader && message !== undefined && this.renderToastMessage('header')), this.renderButtons(endButtons, 'end')))));
394
394
  }
395
395
  static get is() { return "ion-toast"; }
396
396
  static get encapsulation() { return "shadow"; }
@@ -3,39 +3,59 @@
3
3
  */
4
4
  import { expect } from "@playwright/test";
5
5
  import { configs, test } from "../../../../utils/test/playwright/index";
6
- configs().forEach(({ title, screenshot, config }) => {
7
- test.describe(title('toggle: enableOnOffLabels'), () => {
8
- test.beforeEach(async ({ page }) => {
9
- await page.goto(`/src/components/toggle/test/enable-on-off-labels`, config);
10
- });
6
+ configs({ palettes: ['light', 'dark'] }).forEach(({ title, screenshot, config }) => {
7
+ test.describe(title('toggle: enable-on-off-labels'), () => {
11
8
  test('should not have visual regressions', async ({ page }) => {
12
- await page.setIonViewport();
13
- await expect(page).toHaveScreenshot(screenshot(`toggle-on-off-labels-diff`));
14
- });
15
- });
16
- });
17
- /**
18
- * This behavior does not vary across directions
19
- */
20
- configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
21
- test.describe(title('toggle: dark mode'), () => {
22
- test.beforeEach(async ({ page }) => {
23
- await page.goto(`/src/components/toggle/test/enable-on-off-labels`, config);
9
+ await page.setContent(`
10
+ <style>
11
+ #container {
12
+ display: grid;
13
+ grid-template-columns: repeat(2, auto);
14
+ justify-content: space-evenly;
15
+ gap: 8px;
16
+ padding: 16px 0;
17
+ }
18
+ </style>
19
+
20
+ <div id="container">
21
+ <ion-toggle enable-on-off-labels="true">Unchecked</ion-toggle>
22
+ <ion-toggle enable-on-off-labels="true" checked>Checked</ion-toggle>
23
+ </div>
24
+ `, config);
25
+ const container = page.locator('#container');
26
+ await expect(container).toHaveScreenshot(screenshot(`toggle-on-off-labels`));
24
27
  });
25
- test('should not have visual regressions', async ({ page }) => {
26
- const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent');
27
- const ionPopoverDidDismiss = await page.spyOnEvent('ionPopoverDidDismiss');
28
- await page.click('#popover-trigger');
29
- await ionPopoverDidPresent.next();
30
- await page.click('#dark-mode');
31
- await page.evaluate(() => {
32
- const popover = document.querySelector('ion-popover');
33
- return popover === null || popover === void 0 ? void 0 : popover.dismiss();
34
- });
35
- await ionPopoverDidDismiss.next();
36
- await page.waitForChanges();
37
- await page.setIonViewport();
38
- await expect(page).toHaveScreenshot(screenshot(`toggle-on-off-labels-dark-mode-diff`));
28
+ test('should not have visual regressions with color', async ({ page }) => {
29
+ await page.setContent(`
30
+ <style>
31
+ #container {
32
+ display: grid;
33
+ grid-template-columns: repeat(2, auto);
34
+ justify-content: space-evenly;
35
+ gap: 8px;
36
+ padding: 16px 0;
37
+ }
38
+ </style>
39
+
40
+ <div id="container">
41
+ <ion-toggle color="secondary" enable-on-off-labels="true">Unchecked</ion-toggle>
42
+ <ion-toggle color="secondary" enable-on-off-labels="true" checked>Checked</ion-toggle>
43
+ <ion-toggle color="success" enable-on-off-labels="true">Unchecked</ion-toggle>
44
+ <ion-toggle color="success" enable-on-off-labels="true" checked>Checked</ion-toggle>
45
+ <ion-toggle color="danger" enable-on-off-labels="true">Unchecked</ion-toggle>
46
+ <ion-toggle color="danger" enable-on-off-labels="true" checked>Checked</ion-toggle>
47
+ <ion-toggle color="tertiary" enable-on-off-labels="true">Unchecked</ion-toggle>
48
+ <ion-toggle color="tertiary" enable-on-off-labels="true" checked>Checked</ion-toggle>
49
+ <ion-toggle color="light" enable-on-off-labels="true">Unchecked</ion-toggle>
50
+ <ion-toggle color="light" enable-on-off-labels="true" checked>Checked</ion-toggle>
51
+ <ion-toggle color="medium" enable-on-off-labels="true">Unchecked</ion-toggle>
52
+ <ion-toggle color="medium" enable-on-off-labels="true" checked>Checked</ion-toggle>
53
+ <ion-toggle color="dark" enable-on-off-labels="true">Unchecked</ion-toggle>
54
+ <ion-toggle color="dark" enable-on-off-labels="true" checked>Checked</ion-toggle>
55
+ </div>
56
+ `, config);
57
+ const container = page.locator('#container');
58
+ await expect(container).toHaveScreenshot(screenshot(`toggle-on-off-labels-color`));
39
59
  });
40
60
  });
41
61
  });
@@ -157,7 +157,7 @@ export class Toggle {
157
157
  const value = this.getValue();
158
158
  const rtl = isRTL(el) ? 'rtl' : 'ltr';
159
159
  renderHiddenInput(true, el, name, checked ? value : '', disabled);
160
- return (h(Host, { key: 'c945ab955306b2fcb7833f7ff771ac943d73d27d', onClick: this.onClick, class: createColorClasses(color, {
160
+ return (h(Host, { key: 'b0d648e071bc8095998b519ce4dcdd0ea91575c0', onClick: this.onClick, class: createColorClasses(color, {
161
161
  [mode]: true,
162
162
  'in-item': hostContext('ion-item', el),
163
163
  'toggle-activated': activated,
@@ -167,10 +167,10 @@ export class Toggle {
167
167
  [`toggle-alignment-${alignment}`]: true,
168
168
  [`toggle-label-placement-${labelPlacement}`]: true,
169
169
  [`toggle-${rtl}`]: true,
170
- }) }, h("label", { key: '71fb6976e877639ca9f28c2103f6290917cdb6ce', class: "toggle-wrapper" }, h("input", Object.assign({ key: 'ed2495568197928ef1f17fc60470f4d9754a6244', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl) }, this.inheritedAttributes)), h("div", { key: '953ab9a29c432de4b869aeac296007e703bcdf27', class: {
170
+ }) }, h("label", { key: '9a2fe1d16dba66a9dfef450efebf2e5cbe3dcd00', class: "toggle-wrapper" }, h("input", Object.assign({ key: '4358d18cb86da768155c17f9da3aac641296c256', type: "checkbox", role: "switch", "aria-checked": `${checked}`, checked: checked, disabled: disabled, id: inputId, onFocus: () => this.onFocus(), onBlur: () => this.onBlur(), ref: (focusEl) => (this.focusEl = focusEl) }, this.inheritedAttributes)), h("div", { key: '0ec99e452164d7059cc4f93d09e5b918f82c022a', class: {
171
171
  'label-text-wrapper': true,
172
172
  'label-text-wrapper-hidden': !this.hasLabel,
173
- }, part: "label" }, h("slot", { key: '718b24b4d59b979c11edfb1d90fa0270ac248b2f' })), h("div", { key: '293595f9dc291df38a54e23f81797b89428ff2c5', class: "native-wrapper" }, this.renderToggleControl()))));
173
+ }, part: "label" }, h("slot", { key: '1c5cbc99905a79e842e9487eb3ca654e1bab3c66' })), h("div", { key: 'ca8196423b429899febd11c7337d768ff05df6f4', class: "native-wrapper" }, this.renderToggleControl()))));
174
174
  }
175
175
  static get is() { return "ion-toggle"; }
176
176
  static get encapsulation() { return "shadow"; }
@@ -371,7 +371,7 @@ export class Toggle {
371
371
  "composed": true,
372
372
  "docs": {
373
373
  "tags": [],
374
- "text": "Emitted when the user switches the toggle on or off. Does not emit\nwhen programmatically changing the value of the `checked` property."
374
+ "text": "Emitted when the user switches the toggle on or off.\n\nThis event will not emit when programmatically setting the `checked` property."
375
375
  },
376
376
  "complexType": {
377
377
  "original": "ToggleChangeEventDetail",
@@ -62,10 +62,10 @@ export class Toolbar {
62
62
  this.childrenStyles.forEach((value) => {
63
63
  Object.assign(childStyles, value);
64
64
  });
65
- return (h(Host, { key: 'af016bf9981a2d6182783c6643e2d460245ecc2f', class: Object.assign(Object.assign({}, childStyles), createColorClasses(this.color, {
65
+ return (h(Host, { key: '4bb3a55001408a3bdf033af76b9196cb96c07c09', class: Object.assign(Object.assign({}, childStyles), createColorClasses(this.color, {
66
66
  [mode]: true,
67
67
  'in-toolbar': hostContext('ion-toolbar', this.el),
68
- })) }, h("div", { key: '437debb5b7c561b315d887ae8d47186cba5521ce', class: "toolbar-background" }), h("div", { key: '4c2429fa3e8526fedf456e4658be92d5dce8ca34', class: "toolbar-container" }, h("slot", { key: '4c07db12cfc48b4836b566449b854c24db308e3a', name: "start" }), h("slot", { key: '12855ec04622c09cc404f9b4f07f57a73e5770a0', name: "secondary" }), h("div", { key: '56f37d52c91de2b76910defbc9e5b7c1def3861c', class: "toolbar-content" }, h("slot", { key: 'c10ec3fdbea10a6388f4f510d45188f7fda1a371' })), h("slot", { key: 'c8ed49c6888faf35e71f2a8f4f6bf98fb0c34a25', name: "primary" }), h("slot", { key: '0251f3980082a092304f95cbc002bc8c633c5739', name: "end" }))));
68
+ })) }, h("div", { key: '0891db157d6e028c6d03696f13fb510ea91b0296', class: "toolbar-background" }), h("div", { key: '95fbc870d808f74af4bb18cd8f8ec8c7828a9e0b', class: "toolbar-container" }, h("slot", { key: '84d4a9644660fe00ca085055ca8d12f3647531ad', name: "start" }), h("slot", { key: 'fd361dc9c9979f59aed2fedcf94629506fae62b0', name: "secondary" }), h("div", { key: '54d2b28616a4627c55766f66dc453707752758a6', class: "toolbar-content" }, h("slot", { key: '8f65e0830cce7135640b90eb694e282cb7e5efd2' })), h("slot", { key: 'c78be11a207c8674f222543646398636956087e6', name: "primary" }), h("slot", { key: 'ab25e1601ccaa8cb0d81921b849bcb7402aa7826', name: "end" }))));
69
69
  }
70
70
  static get is() { return "ion-toolbar"; }
71
71
  static get encapsulation() { return "shadow"; }
@@ -0,0 +1,112 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { config } from "../../global/config";
5
+ import { printIonWarning } from "../logging/index";
6
+ /**
7
+ * Moves focus to a specified element. Note that we do not remove the tabindex
8
+ * because that can result in an unintentional blur. Non-focusables can't be
9
+ * focused, so the body will get focused again.
10
+ */
11
+ const moveFocus = (el) => {
12
+ el.tabIndex = -1;
13
+ el.focus();
14
+ };
15
+ /**
16
+ * Elements that are hidden using `display: none` should not be focused even if
17
+ * they are present in the DOM.
18
+ */
19
+ const isVisible = (el) => {
20
+ return el.offsetParent !== null;
21
+ };
22
+ /**
23
+ * The focus controller allows us to manage focus within a view so assistive
24
+ * technologies can inform users of changes to the navigation state. Traditional
25
+ * native apps have a way of informing assistive technology about a navigation
26
+ * state change. Mobile browsers have this too, but only when doing a full page
27
+ * load. In a single page app we do not do that, so we need to build this
28
+ * integration ourselves.
29
+ */
30
+ export const createFocusController = () => {
31
+ const saveViewFocus = (referenceEl) => {
32
+ const focusManagerEnabled = config.get('focusManagerPriority', false);
33
+ /**
34
+ * When going back to a previously visited page focus should typically be moved
35
+ * back to the element that was last focused when the user was on this view.
36
+ */
37
+ if (focusManagerEnabled) {
38
+ const activeEl = document.activeElement;
39
+ if (activeEl !== null && (referenceEl === null || referenceEl === void 0 ? void 0 : referenceEl.contains(activeEl))) {
40
+ activeEl.setAttribute(LAST_FOCUS, 'true');
41
+ }
42
+ }
43
+ };
44
+ const setViewFocus = (referenceEl) => {
45
+ const focusManagerPriorities = config.get('focusManagerPriority', false);
46
+ /**
47
+ * If the focused element is a descendant of the referenceEl then it's possible
48
+ * that the app developer manually moved focus, so we do not want to override that.
49
+ * This can happen with inputs the are focused when a view transitions in.
50
+ */
51
+ if (Array.isArray(focusManagerPriorities) && !referenceEl.contains(document.activeElement)) {
52
+ /**
53
+ * When going back to a previously visited view focus should always be moved back
54
+ * to the element that the user was last focused on when they were on this view.
55
+ */
56
+ const lastFocus = referenceEl.querySelector(`[${LAST_FOCUS}]`);
57
+ if (lastFocus && isVisible(lastFocus)) {
58
+ moveFocus(lastFocus);
59
+ return;
60
+ }
61
+ for (const priority of focusManagerPriorities) {
62
+ /**
63
+ * For each recognized case (excluding the default case) make sure to return
64
+ * so that the fallback focus behavior does not run.
65
+ *
66
+ * We intentionally query for specific roles/semantic elements so that the
67
+ * transition manager can work with both Ionic and non-Ionic UI components.
68
+ *
69
+ * If new selectors are added, be sure to remove the outline ring by adding
70
+ * new selectors to rule in core.scss.
71
+ */
72
+ switch (priority) {
73
+ case 'content':
74
+ const content = referenceEl.querySelector('main, [role="main"]');
75
+ if (content && isVisible(content)) {
76
+ moveFocus(content);
77
+ return;
78
+ }
79
+ break;
80
+ case 'heading':
81
+ const headingOne = referenceEl.querySelector('h1, [role="heading"][aria-level="1"]');
82
+ if (headingOne && isVisible(headingOne)) {
83
+ moveFocus(headingOne);
84
+ return;
85
+ }
86
+ break;
87
+ case 'banner':
88
+ const header = referenceEl.querySelector('header, [role="banner"]');
89
+ if (header && isVisible(header)) {
90
+ moveFocus(header);
91
+ return;
92
+ }
93
+ break;
94
+ default:
95
+ printIonWarning(`Unrecognized focus manager priority value ${priority}`);
96
+ break;
97
+ }
98
+ }
99
+ /**
100
+ * If there is nothing to focus then focus the page so focus at least moves to
101
+ * the correct view. The browser will then determine where within the page to
102
+ * move focus to.
103
+ */
104
+ moveFocus(referenceEl);
105
+ }
106
+ };
107
+ return {
108
+ saveViewFocus,
109
+ setViewFocus,
110
+ };
111
+ };
112
+ const LAST_FOCUS = 'ion-last-focus';
@@ -0,0 +1,52 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { expect } from "@playwright/test";
5
+ import { configs, test } from "../../../test/playwright/index";
6
+ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
7
+ test.describe(title('focus controller: generic components'), () => {
8
+ test.beforeEach(async ({ page }) => {
9
+ await page.goto('/src/utils/focus-controller/test/generic', config);
10
+ });
11
+ test('should focus heading', async ({ page }) => {
12
+ const goToPageOneButton = page.locator('page-root button.page-one');
13
+ const nav = page.locator('ion-nav');
14
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
15
+ // Focus heading on Page One
16
+ await goToPageOneButton.click();
17
+ await ionNavDidChange.next();
18
+ const pageOneTitle = page.locator('page-one h1');
19
+ await expect(pageOneTitle).toBeFocused();
20
+ });
21
+ test('should focus banner', async ({ page }) => {
22
+ const goToPageThreeButton = page.locator('page-root button.page-three');
23
+ const nav = page.locator('ion-nav');
24
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
25
+ const pageThreeHeader = page.locator('page-three header');
26
+ await goToPageThreeButton.click();
27
+ await ionNavDidChange.next();
28
+ await expect(pageThreeHeader).toBeFocused();
29
+ });
30
+ test('should focus content', async ({ page }) => {
31
+ const goToPageTwoButton = page.locator('page-root button.page-two');
32
+ const nav = page.locator('ion-nav');
33
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
34
+ const pageTwoContent = page.locator('page-two main');
35
+ await goToPageTwoButton.click();
36
+ await ionNavDidChange.next();
37
+ await expect(pageTwoContent).toBeFocused();
38
+ });
39
+ test('should return focus when going back', async ({ page, browserName }) => {
40
+ test.skip(browserName === 'webkit', 'Desktop Safari does not consider buttons to be focusable');
41
+ const goToPageOneButton = page.locator('page-root button.page-one');
42
+ const nav = page.locator('ion-nav');
43
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
44
+ const pageOneBackButton = page.locator('page-one ion-back-button');
45
+ await goToPageOneButton.click();
46
+ await ionNavDidChange.next();
47
+ await pageOneBackButton.click();
48
+ await ionNavDidChange.next();
49
+ await expect(goToPageOneButton).toBeFocused();
50
+ });
51
+ });
52
+ });
@@ -0,0 +1,52 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { expect } from "@playwright/test";
5
+ import { configs, test } from "../../../test/playwright/index";
6
+ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
7
+ test.describe(title('focus controller: ionic components'), () => {
8
+ test.beforeEach(async ({ page }) => {
9
+ await page.goto('/src/utils/focus-controller/test/ionic', config);
10
+ });
11
+ test('should focus heading', async ({ page }) => {
12
+ const goToPageOneButton = page.locator('page-root ion-button.page-one');
13
+ const nav = page.locator('ion-nav');
14
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
15
+ // Focus heading on Page One
16
+ await goToPageOneButton.click();
17
+ await ionNavDidChange.next();
18
+ const pageOneTitle = page.locator('page-one ion-title');
19
+ await expect(pageOneTitle).toBeFocused();
20
+ });
21
+ test('should focus banner', async ({ page }) => {
22
+ const goToPageThreeButton = page.locator('page-root ion-button.page-three');
23
+ const nav = page.locator('ion-nav');
24
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
25
+ const pageThreeHeader = page.locator('page-three ion-header');
26
+ await goToPageThreeButton.click();
27
+ await ionNavDidChange.next();
28
+ await expect(pageThreeHeader).toBeFocused();
29
+ });
30
+ test('should focus content', async ({ page }) => {
31
+ const goToPageTwoButton = page.locator('page-root ion-button.page-two');
32
+ const nav = page.locator('ion-nav');
33
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
34
+ const pageTwoContent = page.locator('page-two ion-content');
35
+ await goToPageTwoButton.click();
36
+ await ionNavDidChange.next();
37
+ await expect(pageTwoContent).toBeFocused();
38
+ });
39
+ test('should return focus when going back', async ({ page, browserName }) => {
40
+ test.skip(browserName === 'webkit', 'Desktop Safari does not consider buttons to be focusable');
41
+ const goToPageOneButton = page.locator('page-root ion-button.page-one');
42
+ const nav = page.locator('ion-nav');
43
+ const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange');
44
+ const pageOneBackButton = page.locator('page-one ion-back-button');
45
+ await goToPageOneButton.click();
46
+ await ionNavDidChange.next();
47
+ await pageOneBackButton.click();
48
+ await ionNavDidChange.next();
49
+ await expect(goToPageOneButton).toBeFocused();
50
+ });
51
+ });
52
+ });
@@ -96,7 +96,7 @@ export const enableScrollAssist = (componentEl, inputEl, contentEl, footerEl, ke
96
96
  const focusOut = () => {
97
97
  hasKeyboardBeenPresentedForTextField = false;
98
98
  win === null || win === void 0 ? void 0 : win.removeEventListener('ionKeyboardDidShow', keyboardShow);
99
- componentEl.removeEventListener('focusout', focusOut, true);
99
+ componentEl.removeEventListener('focusout', focusOut);
100
100
  };
101
101
  /**
102
102
  * When the input is about to receive
@@ -116,13 +116,13 @@ export const enableScrollAssist = (componentEl, inputEl, contentEl, footerEl, ke
116
116
  }
117
117
  jsSetFocus(componentEl, inputEl, contentEl, footerEl, keyboardHeight, addScrollPadding, disableClonedInput, platformHeight);
118
118
  win === null || win === void 0 ? void 0 : win.addEventListener('ionKeyboardDidShow', keyboardShow);
119
- componentEl.addEventListener('focusout', focusOut, true);
119
+ componentEl.addEventListener('focusout', focusOut);
120
120
  };
121
- componentEl.addEventListener('focusin', focusIn, true);
121
+ componentEl.addEventListener('focusin', focusIn);
122
122
  return () => {
123
- componentEl.removeEventListener('focusin', focusIn, true);
123
+ componentEl.removeEventListener('focusin', focusIn);
124
124
  win === null || win === void 0 ? void 0 : win.removeEventListener('ionKeyboardDidShow', keyboardShow);
125
- componentEl.removeEventListener('focusout', focusOut, true);
125
+ componentEl.removeEventListener('focusout', focusOut);
126
126
  };
127
127
  };
128
128
  /**
@@ -152,7 +152,7 @@ const trapKeyboardFocus = (ev, doc) => {
152
152
  * behind the sheet should be focusable until
153
153
  * the backdrop is enabled.
154
154
  */
155
- if (lastOverlay.classList.contains('ion-disable-focus-trap')) {
155
+ if (lastOverlay.classList.contains(FOCUS_TRAP_DISABLE_CLASS)) {
156
156
  return;
157
157
  }
158
158
  const trapScopedFocus = () => {
@@ -827,3 +827,4 @@ const revealOverlaysToScreenReaders = () => {
827
827
  }
828
828
  }
829
829
  };
830
+ export const FOCUS_TRAP_DISABLE_CLASS = 'ion-disable-focus-trap';
@@ -9,7 +9,7 @@
9
9
  * to be hydrated before proceeding with the test.
10
10
  */
11
11
  export const goto = async (page, url, testInfo, originalFn, options) => {
12
- var _a, _b, _c;
12
+ var _a, _b, _c, _d;
13
13
  if (options === undefined && testInfo.project.metadata.mode === undefined) {
14
14
  throw new Error(`
15
15
  A config must be passed to page.goto to use a generator test:
@@ -22,13 +22,16 @@ configs().forEach(({ config, title }) => {
22
22
  }
23
23
  let mode;
24
24
  let direction;
25
+ let palette;
25
26
  if (options == undefined) {
26
27
  mode = testInfo.project.metadata.mode;
27
28
  direction = testInfo.project.metadata.rtl ? 'rtl' : 'ltr';
29
+ palette = testInfo.project.metadata.palette;
28
30
  }
29
31
  else {
30
32
  mode = options.mode;
31
33
  direction = options.direction;
34
+ palette = options.palette;
32
35
  }
33
36
  const rtlString = direction === 'rtl' ? 'true' : undefined;
34
37
  const splitUrl = url.split('?');
@@ -40,12 +43,14 @@ configs().forEach(({ config, title }) => {
40
43
  const urlToParams = new URLSearchParams(paramsString);
41
44
  const formattedMode = (_a = urlToParams.get('ionic:mode')) !== null && _a !== void 0 ? _a : mode;
42
45
  const formattedRtl = (_b = urlToParams.get('rtl')) !== null && _b !== void 0 ? _b : rtlString;
43
- const ionicTesting = (_c = urlToParams.get('ionic:_testing')) !== null && _c !== void 0 ? _c : true;
46
+ const formattedPalette = (_c = urlToParams.get('palette')) !== null && _c !== void 0 ? _c : palette;
47
+ const ionicTesting = (_d = urlToParams.get('ionic:_testing')) !== null && _d !== void 0 ? _d : true;
44
48
  /**
45
49
  * Pass through other custom query params
46
50
  */
47
51
  urlToParams.delete('ionic:mode');
48
52
  urlToParams.delete('rtl');
53
+ urlToParams.delete('palette');
49
54
  urlToParams.delete('ionic:_testing');
50
55
  /**
51
56
  * Convert remaining query params to a string.
@@ -54,7 +59,7 @@ configs().forEach(({ config, title }) => {
54
59
  */
55
60
  const remainingQueryParams = decodeURIComponent(urlToParams.toString());
56
61
  const remainingQueryParamsString = remainingQueryParams == '' ? '' : `&${remainingQueryParams}`;
57
- const formattedUrl = `${splitUrl[0]}?ionic:_testing=${ionicTesting}&ionic:mode=${formattedMode}&rtl=${formattedRtl}${remainingQueryParamsString}`;
62
+ const formattedUrl = `${splitUrl[0]}?ionic:_testing=${ionicTesting}&ionic:mode=${formattedMode}&rtl=${formattedRtl}&palette=${formattedPalette}${remainingQueryParamsString}`;
58
63
  testInfo.annotations.push({
59
64
  type: 'mode',
60
65
  description: formattedMode,
@@ -63,6 +68,10 @@ configs().forEach(({ config, title }) => {
63
68
  type: 'direction',
64
69
  description: formattedRtl === 'true' ? 'rtl' : 'ltr',
65
70
  });
71
+ testInfo.annotations.push({
72
+ type: 'palette',
73
+ description: formattedPalette,
74
+ });
66
75
  const result = await Promise.all([
67
76
  page.waitForFunction(() => window.testAppLoaded === true, { timeout: 4750 }),
68
77
  originalFn(formattedUrl, options),
@@ -1,11 +1,14 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
+ import { config } from "../../global/config";
4
5
  import { Build, writeTask } from "@stencil/core";
5
6
  import { LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE, } from "../../components/nav/constants";
7
+ import { createFocusController } from "../focus-controller";
6
8
  import { raf } from "../helpers";
7
9
  const iosTransitionAnimation = () => import('./ios.transition');
8
10
  const mdTransitionAnimation = () => import('./md.transition');
11
+ const focusController = createFocusController();
9
12
  // TODO(FW-2832): types
10
13
  export const transition = (opts) => {
11
14
  return new Promise((resolve, reject) => {
@@ -27,6 +30,7 @@ export const transition = (opts) => {
27
30
  const beforeTransition = (opts) => {
28
31
  const enteringEl = opts.enteringEl;
29
32
  const leavingEl = opts.leavingEl;
33
+ focusController.saveViewFocus(leavingEl);
30
34
  setZIndex(enteringEl, leavingEl, opts.direction);
31
35
  if (opts.showGoBack) {
32
36
  enteringEl.classList.add('can-go-back');
@@ -61,6 +65,7 @@ const afterTransition = (opts) => {
61
65
  leavingEl.classList.remove('ion-page-invisible');
62
66
  leavingEl.style.removeProperty('pointer-events');
63
67
  }
68
+ focusController.setViewFocus(enteringEl);
64
69
  };
65
70
  const getAnimationBuilder = async (opts) => {
66
71
  if (!opts.leavingEl || !opts.animated || opts.duration === 0) {
@@ -93,7 +98,12 @@ const animation = async (animationBuilder, opts) => {
93
98
  const noAnimation = async (opts) => {
94
99
  const enteringEl = opts.enteringEl;
95
100
  const leavingEl = opts.leavingEl;
96
- await waitForReady(opts, false);
101
+ const focusManagerEnabled = config.get('focusManagerPriority', false);
102
+ /**
103
+ * If the focus manager is enabled then we need to wait for Ionic components to be
104
+ * rendered otherwise the component to focus may not be focused because it is hidden.
105
+ */
106
+ await waitForReady(opts, focusManagerEnabled);
97
107
  fireWillEvents(enteringEl, leavingEl);
98
108
  fireDidEvents(enteringEl, leavingEl);
99
109
  return {