voyager-ionic-core 8.0.1 → 8.2.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 (601) hide show
  1. package/README.md +1 -1
  2. package/components/checkbox.js +5 -5
  3. package/components/index2.js +119 -1
  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 +8 -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 +5 -5
  43. package/components/ion-segment-button.js +3 -3
  44. package/components/ion-segment.js +10 -9
  45. package/components/ion-select-option.js +1 -1
  46. package/components/ion-select.js +20 -7
  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 +5 -5
  59. package/components/ion-toolbar.js +2 -2
  60. package/components/ionic-global.js +8 -1
  61. package/components/ios.transition.js +94 -67
  62. package/components/label.js +3 -3
  63. package/components/list-header.js +2 -2
  64. package/components/list.js +1 -1
  65. package/components/overlays.js +3 -2
  66. package/components/picker-column-option.js +2 -2
  67. package/components/picker-column.js +177 -6
  68. package/components/picker-column2.js +2 -2
  69. package/components/picker.js +2 -2
  70. package/components/popover.js +6 -4
  71. package/components/radio-group.js +1 -1
  72. package/components/radio.js +16 -5
  73. package/components/ripple-effect.js +1 -1
  74. package/components/select-popover.js +2 -2
  75. package/components/spinner.js +1 -1
  76. package/css/core.css +1 -1
  77. package/css/core.css.map +1 -1
  78. package/css/global.bundle.css.map +1 -1
  79. package/css/ionic.bundle.css +1 -1
  80. package/css/ionic.bundle.css.map +1 -1
  81. package/css/palettes/dark.always.css +1 -1
  82. package/css/palettes/dark.always.css.map +1 -1
  83. package/css/palettes/dark.class.css +1 -1
  84. package/css/palettes/dark.class.css.map +1 -1
  85. package/css/palettes/dark.system.css +1 -1
  86. package/css/palettes/dark.system.css.map +1 -1
  87. package/css/palettes/high-contrast-dark.always.css.map +1 -1
  88. package/css/palettes/high-contrast-dark.class.css.map +1 -1
  89. package/css/palettes/high-contrast-dark.system.css.map +1 -1
  90. package/css/palettes/high-contrast.always.css.map +1 -1
  91. package/css/palettes/high-contrast.class.css.map +1 -1
  92. package/css/palettes/high-contrast.system.css.map +1 -1
  93. package/css/typography.css.map +1 -1
  94. package/dist/cjs/{app-globals-542c4d91.js → app-globals-1c261a7f.js} +1 -1
  95. package/dist/cjs/{button-active-47528f4c.js → button-active-8da8d63e.js} +1 -1
  96. package/dist/cjs/{hardware-back-button-06ae4d9c.js → hardware-back-button-93f7a8f0.js} +2 -2
  97. package/dist/cjs/{index-57b504ac.js → index-93b3a556.js} +2 -2
  98. package/dist/cjs/index-ceeb4ff8.js +2259 -0
  99. package/dist/cjs/{index-c76a1d14.js → index-fa3cf6ba.js} +124 -6
  100. package/dist/cjs/index.cjs.js +9 -9
  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 +20 -19
  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 +7 -7
  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 +9 -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 +177 -8
  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 +19 -8
  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 +7 -7
  139. package/dist/cjs/ion-segment_2.cjs.entry.js +15 -14
  140. package/dist/cjs/ion-select_3.cjs.entry.js +27 -14
  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 +7 -7
  149. package/dist/cjs/{ionic-global-f3622afe.js → ionic-global-f401ca2e.js} +9 -2
  150. package/dist/cjs/ionic.cjs.js +5 -5
  151. package/dist/cjs/{ios.transition-288dfa83.js → ios.transition-ae54d131.js} +98 -69
  152. package/dist/cjs/loader.cjs.js +4 -4
  153. package/dist/cjs/{md.transition-6e5f6a8d.js → md.transition-dbc2d3f3.js} +4 -2
  154. package/dist/cjs/{overlays-32cfd236.js → overlays-d4afb0bd.js} +5 -3
  155. package/dist/cjs/{status-tap-c47ff5f5.js → status-tap-0a82a165.js} +1 -1
  156. package/dist/collection/collection-manifest.json +1 -1
  157. package/dist/collection/components/accordion/test/a11y/accordion.e2e.js +4 -3
  158. package/dist/collection/components/accordion-group/accordion-group.js +3 -3
  159. package/dist/collection/components/alert/test/a11y/alert.e2e.js +3 -1
  160. package/dist/collection/components/breadcrumbs/test/reactive/breadcrumbs.e2e.js +1 -1
  161. package/dist/collection/components/checkbox/checkbox.ios.css +1 -0
  162. package/dist/collection/components/checkbox/checkbox.js +4 -4
  163. package/dist/collection/components/checkbox/checkbox.md.css +1 -0
  164. package/dist/collection/components/content/content.js +23 -4
  165. package/dist/collection/components/content/test/content.spec.js +27 -0
  166. package/dist/collection/components/datetime/datetime.js +18 -15
  167. package/dist/collection/components/datetime/test/overlay-roles/datetime.e2e.js +34 -0
  168. package/dist/collection/components/datetime/test/position/datetime.e2e.js +1 -1
  169. package/dist/collection/components/datetime-button/datetime-button.js +2 -2
  170. package/dist/collection/components/fab/fab.js +2 -2
  171. package/dist/collection/components/fab-button/fab-button.js +2 -2
  172. package/dist/collection/components/fab-list/fab-list.js +2 -2
  173. package/dist/collection/components/footer/footer.js +2 -2
  174. package/dist/collection/components/grid/grid.js +2 -2
  175. package/dist/collection/components/header/header.js +2 -2
  176. package/dist/collection/components/img/img.js +1 -1
  177. package/dist/collection/components/infinite-scroll/infinite-scroll.js +1 -1
  178. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +2 -2
  179. package/dist/collection/components/input/input.js +25 -5
  180. package/dist/collection/components/input/test/input.spec.js +13 -0
  181. package/dist/collection/components/input-password-toggle/input-password-toggle.js +3 -3
  182. package/dist/collection/components/item/test/a11y/item.e2e.js +24 -4
  183. package/dist/collection/components/item/test/inputs/item.e2e.js +46 -0
  184. package/dist/collection/components/item/test/slotted-inputs/item.e2e.js +135 -0
  185. package/dist/collection/components/item-divider/item-divider.js +2 -2
  186. package/dist/collection/components/item-group/item-group.js +1 -1
  187. package/dist/collection/components/item-option/item-option.js +2 -2
  188. package/dist/collection/components/item-options/item-options.js +1 -1
  189. package/dist/collection/components/item-sliding/item-sliding.js +1 -1
  190. package/dist/collection/components/label/label.ios.css +1 -1
  191. package/dist/collection/components/label/label.js +2 -2
  192. package/dist/collection/components/list/list.js +1 -1
  193. package/dist/collection/components/list-header/list-header.js +2 -2
  194. package/dist/collection/components/loading/loading.js +2 -2
  195. package/dist/collection/components/loading/test/basic/loading.e2e.js +1 -1
  196. package/dist/collection/components/menu/menu.js +2 -2
  197. package/dist/collection/components/menu/test/basic/menu.e2e.js +1 -1
  198. package/dist/collection/components/menu-button/menu-button.js +2 -2
  199. package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
  200. package/dist/collection/components/modal/gestures/sheet.js +3 -2
  201. package/dist/collection/components/modal/modal.js +25 -6
  202. package/dist/collection/components/modal/test/basic/modal.spec.js +19 -0
  203. package/dist/collection/components/modal/test/trigger/modal.e2e.js +1 -1
  204. package/dist/collection/components/nav/nav.js +1 -1
  205. package/dist/collection/components/nav/test/basic/nav.e2e.js +5 -5
  206. package/dist/collection/components/nav/test/nested/nav.e2e.js +6 -6
  207. package/dist/collection/components/nav/test/routing/nav.e2e.js +7 -7
  208. package/dist/collection/components/nav-link/nav-link.js +1 -1
  209. package/dist/collection/components/note/note.js +2 -2
  210. package/dist/collection/components/picker/picker.js +2 -2
  211. package/dist/collection/components/picker-column/picker-column.css +19 -0
  212. package/dist/collection/components/picker-column/picker-column.js +180 -6
  213. package/dist/collection/components/picker-column/test/picker-column.spec.js +83 -0
  214. package/dist/collection/components/picker-column-option/picker-column-option.js +2 -2
  215. package/dist/collection/components/picker-legacy/picker.js +2 -2
  216. package/dist/collection/components/picker-legacy-column/picker-column.js +2 -2
  217. package/dist/collection/components/popover/popover.js +23 -4
  218. package/dist/collection/components/popover/test/basic/popover.spec.js +19 -0
  219. package/dist/collection/components/popover/test/trigger/popover.e2e.js +1 -1
  220. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  221. package/dist/collection/components/radio/radio.ios.css +1 -0
  222. package/dist/collection/components/radio/radio.js +14 -3
  223. package/dist/collection/components/radio/radio.md.css +1 -0
  224. package/dist/collection/components/radio-group/radio-group.js +2 -2
  225. package/dist/collection/components/range/range.js +4 -4
  226. package/dist/collection/components/refresher/refresher.js +1 -1
  227. package/dist/collection/components/refresher-content/refresher-content.js +1 -1
  228. package/dist/collection/components/reorder/reorder.js +1 -1
  229. package/dist/collection/components/reorder-group/reorder-group.js +1 -1
  230. package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
  231. package/dist/collection/components/router-link/router-link.js +2 -2
  232. package/dist/collection/components/router-outlet/router-outlet.js +1 -1
  233. package/dist/collection/components/row/row.js +1 -1
  234. package/dist/collection/components/searchbar/searchbar.js +6 -6
  235. package/dist/collection/components/segment/segment.js +11 -10
  236. package/dist/collection/components/segment-button/segment-button.js +3 -3
  237. package/dist/collection/components/select/select.ios.css +1 -0
  238. package/dist/collection/components/select/select.js +19 -6
  239. package/dist/collection/components/select/select.md.css +1 -0
  240. package/dist/collection/components/select/test/basic/select.e2e.js +1 -1
  241. package/dist/collection/components/select/test/disabled/select.e2e.js +1 -1
  242. package/dist/collection/components/select/test/fill/select.e2e.js +25 -0
  243. package/dist/collection/components/select-option/select-option.js +1 -1
  244. package/dist/collection/components/select-popover/select-popover.js +1 -1
  245. package/dist/collection/components/select-popover/select-popover.md.css +8 -1
  246. package/dist/collection/components/select-popover/test/basic/select-popover.e2e.js +2 -2
  247. package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
  248. package/dist/collection/components/spinner/spinner.js +1 -1
  249. package/dist/collection/components/split-pane/split-pane.js +2 -2
  250. package/dist/collection/components/tab/tab.js +2 -2
  251. package/dist/collection/components/tab-bar/tab-bar.js +2 -2
  252. package/dist/collection/components/tab-button/tab-button.js +2 -2
  253. package/dist/collection/components/tabs/tabs.js +1 -1
  254. package/dist/collection/components/text/text.js +2 -2
  255. package/dist/collection/components/textarea/textarea.js +3 -3
  256. package/dist/collection/components/thumbnail/thumbnail.js +1 -1
  257. package/dist/collection/components/title/title.js +2 -2
  258. package/dist/collection/components/toast/test/basic/toast.e2e.js +1 -0
  259. package/dist/collection/components/toast/toast.js +2 -2
  260. package/dist/collection/components/toggle/toggle.ios.css +1 -0
  261. package/dist/collection/components/toggle/toggle.js +4 -4
  262. package/dist/collection/components/toggle/toggle.md.css +1 -0
  263. package/dist/collection/components/toolbar/toolbar.js +2 -2
  264. package/dist/collection/global/config.js +8 -1
  265. package/dist/collection/global/test/config-controller.spec.js +9 -1
  266. package/dist/collection/utils/focus-controller/index.js +112 -0
  267. package/dist/collection/utils/focus-controller/test/generic/focus-controller.e2e.js +52 -0
  268. package/dist/collection/utils/focus-controller/test/ionic/focus-controller.e2e.js +52 -0
  269. package/dist/collection/utils/overlays.js +2 -1
  270. package/dist/collection/utils/transition/index.js +11 -1
  271. package/dist/collection/utils/transition/ios.transition.js +94 -67
  272. package/dist/docs.d.ts +34 -0
  273. package/dist/docs.json +3616 -497
  274. package/dist/esm/{app-globals-3cbaf9d9.js → app-globals-7c667c11.js} +1 -1
  275. package/dist/esm/{button-active-9e3c1f3b.js → button-active-7c57df95.js} +1 -1
  276. package/dist/esm/{hardware-back-button-804f43bb.js → hardware-back-button-63852d15.js} +2 -2
  277. package/dist/esm/{index-8dbae644.js → index-1e2f8425.js} +2 -2
  278. package/dist/esm/index-8d8c14b0.js +2221 -0
  279. package/dist/esm/{index-f7fbe1fb.js → index-91ed2172.js} +122 -4
  280. package/dist/esm/index.js +9 -9
  281. package/dist/esm/ion-accordion_2.entry.js +4 -4
  282. package/dist/esm/ion-action-sheet.entry.js +5 -5
  283. package/dist/esm/ion-alert.entry.js +5 -5
  284. package/dist/esm/ion-app_8.entry.js +20 -19
  285. package/dist/esm/ion-avatar_3.entry.js +3 -3
  286. package/dist/esm/ion-back-button.entry.js +2 -2
  287. package/dist/esm/ion-backdrop.entry.js +2 -2
  288. package/dist/esm/ion-breadcrumb_2.entry.js +2 -2
  289. package/dist/esm/ion-button_2.entry.js +2 -2
  290. package/dist/esm/ion-card_5.entry.js +2 -2
  291. package/dist/esm/ion-checkbox.entry.js +7 -7
  292. package/dist/esm/ion-chip.entry.js +2 -2
  293. package/dist/esm/ion-col_3.entry.js +5 -5
  294. package/dist/esm/ion-datetime-button.entry.js +4 -4
  295. package/dist/esm/ion-datetime_3.entry.js +25 -22
  296. package/dist/esm/ion-fab_3.entry.js +8 -8
  297. package/dist/esm/ion-img.entry.js +3 -3
  298. package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
  299. package/dist/esm/ion-input-password-toggle.entry.js +5 -5
  300. package/dist/esm/ion-input.entry.js +9 -6
  301. package/dist/esm/ion-item-option_3.entry.js +6 -6
  302. package/dist/esm/ion-item_8.entry.js +15 -15
  303. package/dist/esm/ion-loading.entry.js +6 -6
  304. package/dist/esm/ion-menu_3.entry.js +11 -11
  305. package/dist/esm/ion-modal.entry.js +13 -12
  306. package/dist/esm/ion-nav_2.entry.js +6 -5
  307. package/dist/esm/ion-picker-column-option.entry.js +4 -4
  308. package/dist/esm/ion-picker-column.entry.js +177 -8
  309. package/dist/esm/ion-picker.entry.js +3 -3
  310. package/dist/esm/ion-popover.entry.js +9 -8
  311. package/dist/esm/ion-progress-bar.entry.js +3 -3
  312. package/dist/esm/ion-radio_2.entry.js +19 -8
  313. package/dist/esm/ion-range.entry.js +5 -5
  314. package/dist/esm/ion-refresher_2.entry.js +4 -4
  315. package/dist/esm/ion-reorder_2.entry.js +4 -4
  316. package/dist/esm/ion-ripple-effect.entry.js +3 -3
  317. package/dist/esm/ion-route_4.entry.js +4 -4
  318. package/dist/esm/ion-searchbar.entry.js +7 -7
  319. package/dist/esm/ion-segment_2.entry.js +15 -14
  320. package/dist/esm/ion-select_3.entry.js +27 -14
  321. package/dist/esm/ion-spinner.entry.js +3 -3
  322. package/dist/esm/ion-split-pane.entry.js +4 -4
  323. package/dist/esm/ion-tab-bar_2.entry.js +6 -6
  324. package/dist/esm/ion-tab_2.entry.js +4 -4
  325. package/dist/esm/ion-text.entry.js +4 -4
  326. package/dist/esm/ion-textarea.entry.js +4 -4
  327. package/dist/esm/ion-toast.entry.js +6 -6
  328. package/dist/esm/ion-toggle.entry.js +7 -7
  329. package/dist/esm/{ionic-global-d2d8f882.js → ionic-global-8180d812.js} +9 -2
  330. package/dist/esm/ionic.js +6 -6
  331. package/dist/esm/{ios.transition-a0041e41.js → ios.transition-140cedc8.js} +98 -69
  332. package/dist/esm/loader.js +5 -5
  333. package/dist/esm/{md.transition-0c0602d9.js → md.transition-4961bea4.js} +4 -2
  334. package/dist/esm/{overlays-696d25f5.js → overlays-e8e5bd06.js} +5 -4
  335. package/dist/esm/{status-tap-37a74d1c.js → status-tap-0502d0fd.js} +1 -1
  336. package/dist/esm-es5/app-globals-7c667c11.js +4 -0
  337. package/dist/esm-es5/{button-active-9e3c1f3b.js → button-active-7c57df95.js} +1 -1
  338. package/dist/esm-es5/{hardware-back-button-804f43bb.js → hardware-back-button-63852d15.js} +1 -1
  339. package/dist/esm-es5/{index-8dbae644.js → index-1e2f8425.js} +1 -1
  340. package/dist/esm-es5/index-8d8c14b0.js +5 -0
  341. package/dist/esm-es5/index-91ed2172.js +4 -0
  342. package/dist/esm-es5/index.js +1 -1
  343. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  344. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  345. package/dist/esm-es5/ion-alert.entry.js +1 -1
  346. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  347. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  348. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  349. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  350. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  351. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  352. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  353. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  354. package/dist/esm-es5/ion-chip.entry.js +1 -1
  355. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  356. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  357. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  358. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  359. package/dist/esm-es5/ion-img.entry.js +1 -1
  360. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  361. package/dist/esm-es5/ion-input-password-toggle.entry.js +1 -1
  362. package/dist/esm-es5/ion-input.entry.js +1 -1
  363. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  364. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  365. package/dist/esm-es5/ion-loading.entry.js +1 -1
  366. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  367. package/dist/esm-es5/ion-modal.entry.js +1 -1
  368. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  369. package/dist/esm-es5/ion-picker-column-option.entry.js +1 -1
  370. package/dist/esm-es5/ion-picker-column.entry.js +1 -1
  371. package/dist/esm-es5/ion-picker.entry.js +1 -1
  372. package/dist/esm-es5/ion-popover.entry.js +1 -1
  373. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  374. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  375. package/dist/esm-es5/ion-range.entry.js +1 -1
  376. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  377. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  378. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  379. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  380. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  381. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  382. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  383. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  384. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  385. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  386. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  387. package/dist/esm-es5/ion-text.entry.js +1 -1
  388. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  389. package/dist/esm-es5/ion-toast.entry.js +1 -1
  390. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  391. package/dist/esm-es5/ionic-global-8180d812.js +4 -0
  392. package/dist/esm-es5/ionic.js +1 -1
  393. package/dist/esm-es5/ios.transition-140cedc8.js +4 -0
  394. package/dist/esm-es5/loader.js +1 -1
  395. package/dist/esm-es5/md.transition-4961bea4.js +4 -0
  396. package/dist/esm-es5/{overlays-696d25f5.js → overlays-e8e5bd06.js} +1 -1
  397. package/dist/esm-es5/{status-tap-37a74d1c.js → status-tap-0502d0fd.js} +1 -1
  398. package/dist/html.html-data.json +115 -91
  399. package/dist/ionic/index.esm.js +1 -1
  400. package/dist/ionic/ionic.esm.js +1 -1
  401. package/dist/ionic/ionic.js +1 -1
  402. package/dist/ionic/{p-e9ef13be.system.entry.js → p-00343522.system.entry.js} +1 -1
  403. package/dist/ionic/{p-bdd3053f.entry.js → p-00f85ca4.entry.js} +1 -1
  404. package/dist/ionic/p-0213e506.entry.js +4 -0
  405. package/dist/ionic/p-036382b2.system.entry.js +4 -0
  406. package/dist/ionic/{p-c7e0b81a.entry.js → p-0617a85d.entry.js} +1 -1
  407. package/dist/ionic/{p-5d3a8503.system.entry.js → p-06330374.system.entry.js} +2 -2
  408. package/dist/ionic/p-0973cae7.entry.js +4 -0
  409. package/dist/ionic/{p-e3005be4.system.entry.js → p-09bd8558.system.entry.js} +1 -1
  410. package/dist/ionic/{p-6e9bd6ba.system.entry.js → p-0a9c8c36.system.entry.js} +1 -1
  411. package/dist/ionic/p-0f89c47c.js +4 -0
  412. package/dist/ionic/{p-2f308f7f.system.entry.js → p-111b0e11.system.entry.js} +2 -2
  413. package/dist/ionic/{p-93e43f42.system.entry.js → p-11feccde.system.entry.js} +1 -1
  414. package/dist/ionic/p-13a736a9.entry.js +4 -0
  415. package/dist/ionic/{p-bbbe3138.system.entry.js → p-18657fab.system.entry.js} +1 -1
  416. package/dist/ionic/p-1ca3679b.entry.js +4 -0
  417. package/dist/ionic/{p-cdee3a44.system.entry.js → p-1dd59f8d.system.entry.js} +1 -1
  418. package/dist/ionic/p-1e5cabf8.entry.js +4 -0
  419. package/dist/ionic/{p-b799a007.entry.js → p-24b0ece0.entry.js} +1 -1
  420. package/dist/ionic/{p-4e5288de.system.js → p-27317f8f.system.js} +1 -1
  421. package/dist/ionic/p-30bbe61c.system.js +4 -0
  422. package/dist/ionic/{p-4e548bd7.system.entry.js → p-34827988.system.entry.js} +1 -1
  423. package/dist/ionic/p-370835b4.system.js +4 -0
  424. package/dist/ionic/p-39303199.system.js +4 -0
  425. package/dist/ionic/{p-aa0ed22b.system.entry.js → p-3b0711a0.system.entry.js} +1 -1
  426. package/dist/ionic/{p-94180ecc.entry.js → p-3d1951f5.entry.js} +1 -1
  427. package/dist/ionic/p-3fd68f4e.system.entry.js +4 -0
  428. package/dist/ionic/{p-b571cab1.entry.js → p-443cbfcb.entry.js} +1 -1
  429. package/dist/ionic/{p-3f5b86b4.entry.js → p-4455daad.entry.js} +1 -1
  430. package/dist/ionic/{p-aa0f60b2.system.js → p-45a51395.system.js} +1 -1
  431. package/dist/ionic/{p-c671b28e.js → p-4691dc8d.js} +1 -1
  432. package/dist/ionic/{p-7f59064a.entry.js → p-4713f5f0.entry.js} +1 -1
  433. package/dist/ionic/p-479e7655.system.js +5 -0
  434. package/dist/ionic/{p-283fd4e1.system.entry.js → p-47ab6574.system.entry.js} +1 -1
  435. package/dist/ionic/{p-c4676693.entry.js → p-4816d827.entry.js} +1 -1
  436. package/dist/ionic/{p-1930d8e7.entry.js → p-4927bd6e.entry.js} +1 -1
  437. package/dist/ionic/p-4fa57f1e.system.entry.js +4 -0
  438. package/dist/ionic/{p-26d33af2.system.entry.js → p-54b04ed1.system.entry.js} +1 -1
  439. package/dist/ionic/{p-c3ca0292.system.entry.js → p-5cd86cdb.system.entry.js} +1 -1
  440. package/dist/ionic/{p-63265e00.system.entry.js → p-5e1094ae.system.entry.js} +2 -2
  441. package/dist/ionic/{p-4c153abb.entry.js → p-5f610767.entry.js} +1 -1
  442. package/dist/ionic/p-65a8336f.entry.js +4 -0
  443. package/dist/ionic/p-66de062f.system.entry.js +4 -0
  444. package/dist/ionic/{p-5a3a3373.entry.js → p-69cc64ab.entry.js} +1 -1
  445. package/dist/ionic/p-6c16d0e8.js +4 -0
  446. package/dist/ionic/p-6e76ed16.entry.js +4 -0
  447. package/dist/ionic/p-7058dfda.entry.js +4 -0
  448. package/dist/ionic/{p-1980c728.system.js → p-7171dbf4.system.js} +1 -1
  449. package/dist/ionic/p-7198726e.entry.js +4 -0
  450. package/dist/ionic/{p-5d4d89e0.system.entry.js → p-71e2f283.system.entry.js} +1 -1
  451. package/dist/ionic/{p-d6229f05.system.entry.js → p-71f25447.system.entry.js} +1 -1
  452. package/dist/ionic/{p-5fbc2eae.system.entry.js → p-750e902d.system.entry.js} +1 -1
  453. package/dist/ionic/{p-53a3b33c.system.entry.js → p-764eb419.system.entry.js} +1 -1
  454. package/dist/ionic/p-76637161.system.entry.js +4 -0
  455. package/dist/ionic/{p-8627f783.system.entry.js → p-78bf8302.system.entry.js} +2 -2
  456. package/dist/ionic/p-79f4cb29.entry.js +4 -0
  457. package/dist/ionic/p-7a416af9.entry.js +4 -0
  458. package/dist/ionic/{p-e49099b0.entry.js → p-80aae5d7.entry.js} +1 -1
  459. package/dist/ionic/{p-819e8479.system.entry.js → p-8890e47f.system.entry.js} +1 -1
  460. package/dist/ionic/{p-8caca06c.system.entry.js → p-8c7490bc.system.entry.js} +1 -1
  461. package/dist/ionic/{p-051d2d23.js → p-8d0eb68d.js} +1 -1
  462. package/dist/ionic/{p-b76bcd9e.system.entry.js → p-935221f8.system.entry.js} +1 -1
  463. package/dist/ionic/{p-70181008.entry.js → p-941ecbba.entry.js} +1 -1
  464. package/dist/ionic/{p-0af79ebd.entry.js → p-94b46442.entry.js} +1 -1
  465. package/dist/ionic/p-967da5f2.system.js +4 -0
  466. package/dist/ionic/{p-1e4d7975.system.js → p-98125393.system.js} +1 -1
  467. package/dist/ionic/{p-08c4d048.entry.js → p-9b46f7e0.entry.js} +1 -1
  468. package/dist/ionic/{p-6730a2f1.entry.js → p-a00a5621.entry.js} +1 -1
  469. package/dist/ionic/{p-a592f1b8.system.entry.js → p-a055fdcf.system.entry.js} +1 -1
  470. package/dist/ionic/{p-2c3c7cb9.system.entry.js → p-a0abe7ab.system.entry.js} +2 -2
  471. package/dist/ionic/p-a4116282.entry.js +4 -0
  472. package/dist/ionic/p-a4a45ad9.system.js +4 -0
  473. package/dist/ionic/p-a5adb027.entry.js +4 -0
  474. package/dist/ionic/{p-8c4fc85f.system.js → p-a82d4913.system.js} +1 -1
  475. package/dist/ionic/{p-23e440b6.entry.js → p-a87b1500.entry.js} +1 -1
  476. package/dist/ionic/{p-2b1e669d.system.entry.js → p-a931cd3e.system.entry.js} +1 -1
  477. package/dist/ionic/{p-748e6b2b.system.entry.js → p-ae3be67f.system.entry.js} +1 -1
  478. package/dist/ionic/{p-9384565a.entry.js → p-aeb61b82.entry.js} +1 -1
  479. package/dist/ionic/{p-33d926c3.entry.js → p-aeef6ac4.entry.js} +1 -1
  480. package/dist/ionic/p-aef1c744.system.js +4 -0
  481. package/dist/ionic/p-b0ff8469.system.entry.js +4 -0
  482. package/dist/ionic/{p-5ff497dc.system.entry.js → p-b7299e38.system.entry.js} +1 -1
  483. package/dist/ionic/{p-c23627c3.entry.js → p-b7eecfa6.entry.js} +1 -1
  484. package/dist/ionic/{p-45034312.system.entry.js → p-b84d9005.system.entry.js} +1 -1
  485. package/dist/ionic/{p-48888af6.system.entry.js → p-bad2e0c8.system.entry.js} +1 -1
  486. package/dist/ionic/p-bd7ad51d.system.entry.js +4 -0
  487. package/dist/ionic/{p-d11c336d.js → p-bdc1b4e3.js} +1 -1
  488. package/dist/ionic/{p-42f00e72.system.entry.js → p-c1d7a187.system.entry.js} +1 -1
  489. package/dist/ionic/p-c4493e98.system.entry.js +4 -0
  490. package/dist/ionic/p-c44efdb8.entry.js +4 -0
  491. package/dist/ionic/p-c5543c41.system.entry.js +4 -0
  492. package/dist/ionic/p-c5c65bbe.js +4 -0
  493. package/dist/ionic/{p-5d80b741.entry.js → p-c6143912.entry.js} +1 -1
  494. package/dist/ionic/{p-bd6d9610.entry.js → p-c623f0d9.entry.js} +1 -1
  495. package/dist/ionic/p-c6d9d978.system.entry.js +4 -0
  496. package/dist/ionic/p-c7717147.js +4 -0
  497. package/dist/ionic/p-c7a015e4.entry.js +4 -0
  498. package/dist/ionic/{p-c07e7a5d.entry.js → p-c89af27e.entry.js} +1 -1
  499. package/dist/ionic/{p-d1a8f599.entry.js → p-cd681265.entry.js} +1 -1
  500. package/dist/ionic/{p-f5c42f72.entry.js → p-cf8ad0c3.entry.js} +1 -1
  501. package/dist/ionic/p-d6dbda17.js +5 -0
  502. package/dist/ionic/{p-e885f3c4.entry.js → p-d7e957e9.entry.js} +1 -1
  503. package/dist/ionic/p-d8a1f0e2.entry.js +4 -0
  504. package/dist/ionic/p-dba2da82.system.entry.js +4 -0
  505. package/dist/ionic/{p-77ce6034.js → p-ddde112a.js} +1 -1
  506. package/dist/ionic/{p-2ab5db0d.system.entry.js → p-e08d9edc.system.entry.js} +1 -1
  507. package/dist/ionic/{p-c9ba1908.entry.js → p-eaab79f3.entry.js} +1 -1
  508. package/dist/ionic/{p-0b12d1ee.system.entry.js → p-ee8bf348.system.entry.js} +1 -1
  509. package/dist/ionic/{p-9b31ebfa.entry.js → p-eea44228.entry.js} +1 -1
  510. package/dist/ionic/{p-c62571da.entry.js → p-eef82267.entry.js} +1 -1
  511. package/dist/ionic/{p-2a3e98fb.system.entry.js → p-f149e6c3.system.entry.js} +1 -1
  512. package/dist/ionic/{p-fd392e7f.system.entry.js → p-f1c090c5.system.entry.js} +1 -1
  513. package/dist/ionic/{p-ebe0aa6d.entry.js → p-f5efe527.entry.js} +1 -1
  514. package/dist/ionic/p-f6a419d2.js +4 -0
  515. package/dist/ionic/p-f896c857.system.entry.js +4 -0
  516. package/dist/ionic/{p-576786c0.system.entry.js → p-f9046353.system.entry.js} +1 -1
  517. package/dist/ionic/p-f9b3ffd6.system.entry.js +4 -0
  518. package/dist/ionic/{p-320cfcab.entry.js → p-fa7234ee.entry.js} +1 -1
  519. package/dist/ionic/{p-470f73c4.entry.js → p-fba8ea9e.entry.js} +1 -1
  520. package/dist/ionic/p-fc6f99be.js +4 -0
  521. package/dist/ionic/{p-b0093947.system.js → p-fcbd65bc.system.js} +1 -1
  522. package/dist/types/components/accordion-group/accordion-group.d.ts +3 -4
  523. package/dist/types/components/checkbox/checkbox.d.ts +3 -4
  524. package/dist/types/components/content/content.d.ts +8 -0
  525. package/dist/types/components/datetime/datetime.d.ts +2 -0
  526. package/dist/types/components/input/input.d.ts +6 -0
  527. package/dist/types/components/modal/modal-interface.d.ts +1 -0
  528. package/dist/types/components/modal/modal.d.ts +18 -0
  529. package/dist/types/components/picker-column/picker-column.d.ts +37 -0
  530. package/dist/types/components/popover/popover-interface.d.ts +1 -0
  531. package/dist/types/components/popover/popover.d.ts +18 -0
  532. package/dist/types/components/radio/radio.d.ts +1 -0
  533. package/dist/types/components/radio-group/radio-group.d.ts +2 -0
  534. package/dist/types/components/range/range.d.ts +1 -1
  535. package/dist/types/components/searchbar/searchbar.d.ts +2 -0
  536. package/dist/types/components/segment/segment.d.ts +4 -2
  537. package/dist/types/components/select/select.d.ts +4 -1
  538. package/dist/types/components/textarea/textarea.d.ts +2 -0
  539. package/dist/types/components/toggle/toggle.d.ts +3 -2
  540. package/dist/types/components.d.ts +44 -12
  541. package/dist/types/stencil-public-runtime.d.ts +1 -0
  542. package/dist/types/utils/config.d.ts +9 -0
  543. package/dist/types/utils/focus-controller/index.d.ts +13 -0
  544. package/dist/types/utils/overlays.d.ts +1 -0
  545. package/hydrate/index.js +43590 -39248
  546. package/loader/cdn.js +1 -1
  547. package/loader/index.cjs.js +1 -1
  548. package/loader/index.es2017.js +1 -1
  549. package/loader/index.js +1 -1
  550. package/package.json +7 -7
  551. package/dist/cjs/index-1437d080.js +0 -11980
  552. package/dist/esm/index-5dc2b88e.js +0 -11942
  553. package/dist/esm-es5/app-globals-3cbaf9d9.js +0 -4
  554. package/dist/esm-es5/index-5dc2b88e.js +0 -18
  555. package/dist/esm-es5/index-f7fbe1fb.js +0 -4
  556. package/dist/esm-es5/ionic-global-d2d8f882.js +0 -4
  557. package/dist/esm-es5/ios.transition-a0041e41.js +0 -4
  558. package/dist/esm-es5/md.transition-0c0602d9.js +0 -4
  559. package/dist/ionic/p-057b5866.entry.js +0 -4
  560. package/dist/ionic/p-06d5221c.js +0 -4
  561. package/dist/ionic/p-06fad524.system.js +0 -4
  562. package/dist/ionic/p-0d56dea9.entry.js +0 -4
  563. package/dist/ionic/p-0d960144.system.entry.js +0 -4
  564. package/dist/ionic/p-13bfcef4.system.entry.js +0 -4
  565. package/dist/ionic/p-16016625.system.js +0 -4
  566. package/dist/ionic/p-1a5227b3.system.entry.js +0 -4
  567. package/dist/ionic/p-20304962.js +0 -4
  568. package/dist/ionic/p-2dfdda15.system.entry.js +0 -4
  569. package/dist/ionic/p-2fa34b5c.entry.js +0 -4
  570. package/dist/ionic/p-32048e4c.system.js +0 -18
  571. package/dist/ionic/p-34511b1d.js +0 -4
  572. package/dist/ionic/p-385964e6.entry.js +0 -4
  573. package/dist/ionic/p-4324e8a4.entry.js +0 -4
  574. package/dist/ionic/p-45664cb9.system.js +0 -4
  575. package/dist/ionic/p-49cdc4f2.entry.js +0 -4
  576. package/dist/ionic/p-4ad48ec9.system.entry.js +0 -4
  577. package/dist/ionic/p-4af0b730.js +0 -8
  578. package/dist/ionic/p-4fcef939.entry.js +0 -4
  579. package/dist/ionic/p-567a21a2.system.entry.js +0 -4
  580. package/dist/ionic/p-583f8865.system.entry.js +0 -4
  581. package/dist/ionic/p-58f89707.js +0 -4
  582. package/dist/ionic/p-720927ad.entry.js +0 -4
  583. package/dist/ionic/p-7536b4b3.system.js +0 -4
  584. package/dist/ionic/p-7ef5bb32.entry.js +0 -4
  585. package/dist/ionic/p-806aad8f.system.js +0 -4
  586. package/dist/ionic/p-80f85095.system.entry.js +0 -4
  587. package/dist/ionic/p-8664c316.entry.js +0 -4
  588. package/dist/ionic/p-8e031d97.entry.js +0 -4
  589. package/dist/ionic/p-8f48c966.system.entry.js +0 -4
  590. package/dist/ionic/p-94731a92.system.entry.js +0 -4
  591. package/dist/ionic/p-a801da4b.system.entry.js +0 -4
  592. package/dist/ionic/p-adb896a0.entry.js +0 -4
  593. package/dist/ionic/p-cb4f96f3.system.js +0 -4
  594. package/dist/ionic/p-cc856712.entry.js +0 -4
  595. package/dist/ionic/p-cd1b9056.js +0 -4
  596. package/dist/ionic/p-d918e7ef.system.entry.js +0 -4
  597. package/dist/ionic/p-df062892.system.entry.js +0 -4
  598. package/dist/ionic/p-ee3bbaf2.entry.js +0 -4
  599. package/dist/ionic/p-f0be340f.entry.js +0 -4
  600. package/dist/ionic/p-fc94e18f.entry.js +0 -4
  601. package/dist/ionic/p-fdf40b09.js +0 -4
@@ -48,6 +48,7 @@ export class Content {
48
48
  };
49
49
  this.color = undefined;
50
50
  this.fullscreen = false;
51
+ this.fixedSlotPlacement = 'after';
51
52
  this.forceOverscroll = undefined;
52
53
  this.scrollX = false;
53
54
  this.scrollY = true;
@@ -329,13 +330,13 @@ export class Content {
329
330
  }
330
331
  }
331
332
  render() {
332
- const { isMainContent, scrollX, scrollY, el } = this;
333
+ const { fixedSlotPlacement, isMainContent, scrollX, scrollY, el } = this;
333
334
  const rtl = isRTL(el) ? 'rtl' : 'ltr';
334
335
  const mode = getIonMode(this);
335
336
  const forceOverscroll = this.shouldForceOverscroll();
336
337
  const transitionShadow = mode === 'ios';
337
338
  this.resize();
338
- return (h(Host, { key: '98e9658e69c0bbe0113e4c1b89dd7b240334c039', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
339
+ return (h(Host, { key: 'f599a7da14969df38c20a6f650179d2a319fb58b', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
339
340
  [mode]: true,
340
341
  'content-sizing': hostContext('ion-popover', this.el),
341
342
  overscroll: forceOverscroll,
@@ -343,12 +344,12 @@ export class Content {
343
344
  }), style: {
344
345
  '--offset-top': `${this.cTop}px`,
345
346
  '--offset-bottom': `${this.cBottom}px`,
346
- } }, h("div", { key: 'e89aa6ea09625846db52d63bdbf06c3c279a5ba4', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), h("div", { key: '37925cf9d898ede58d5ac7b5a650c648033602a3', class: {
347
+ } }, h("div", { key: '7c545c3c95ea05abd036d0462936ac153d2a8fc6', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: 'a67ab7438466c99f74b7ba59964802c3ba86ac5b', class: {
347
348
  'inner-scroll': true,
348
349
  'scroll-x': scrollX,
349
350
  'scroll-y': scrollY,
350
351
  overscroll: (scrollX || scrollY) && forceOverscroll,
351
- }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: 'a40f964cacf0c2e2bdcf962791aaadb386d44323' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, h("slot", { key: 'd21886cff0bc417e1f5e3a436dddc079e967579b', name: "fixed" })));
352
+ }, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '6d10fcac2e40b4dd6c20d91a8957ac07251d2fa7' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
352
353
  }
353
354
  static get is() { return "ion-content"; }
354
355
  static get encapsulation() { return "shadow"; }
@@ -405,6 +406,24 @@ export class Content {
405
406
  "reflect": false,
406
407
  "defaultValue": "false"
407
408
  },
409
+ "fixedSlotPlacement": {
410
+ "type": "string",
411
+ "mutable": false,
412
+ "complexType": {
413
+ "original": "'after' | 'before'",
414
+ "resolved": "\"after\" | \"before\"",
415
+ "references": {}
416
+ },
417
+ "required": false,
418
+ "optional": false,
419
+ "docs": {
420
+ "tags": [],
421
+ "text": "Controls where the fixed content is placed relative to the main content\nin the DOM. This can be used to control the order in which fixed elements\nreceive keyboard focus.\nFor example, if a FAB in the fixed slot should receive keyboard focus before\nthe main page content, set this property to `'before'`."
422
+ },
423
+ "attribute": "fixed-slot-placement",
424
+ "reflect": false,
425
+ "defaultValue": "'after'"
426
+ },
408
427
  "forceOverscroll": {
409
428
  "type": "boolean",
410
429
  "mutable": true,
@@ -0,0 +1,27 @@
1
+ /*!
2
+ * (C) Ionic http://ionicframework.com - MIT License
3
+ */
4
+ import { newSpecPage } from "@stencil/core/testing";
5
+ import { Content } from "../content";
6
+ describe('content: fixed slot placement', () => {
7
+ it('should should fixed slot after content', async () => {
8
+ const page = await newSpecPage({
9
+ components: [Content],
10
+ html: '<ion-content></ion-content>',
11
+ });
12
+ const content = page.body.querySelector('ion-content');
13
+ const fixedSlot = content.shadowRoot.querySelector('slot[name="fixed"]');
14
+ const scrollEl = content.shadowRoot.querySelector('[part="scroll"]');
15
+ expect(fixedSlot.nextElementSibling).not.toBe(scrollEl);
16
+ });
17
+ it('should should fixed slot before content', async () => {
18
+ const page = await newSpecPage({
19
+ components: [Content],
20
+ html: `<ion-content fixed-slot-placement="before"></ion-content>`,
21
+ });
22
+ const content = page.body.querySelector('ion-content');
23
+ const fixedSlot = content.shadowRoot.querySelector('slot[name="fixed"]');
24
+ const scrollEl = content.shadowRoot.querySelector('[part="scroll"]');
25
+ expect(fixedSlot.nextElementSibling).toBe(scrollEl);
26
+ });
27
+ });
@@ -85,10 +85,10 @@ export class Datetime {
85
85
  const { activeParts } = this;
86
86
  return Array.isArray(activeParts) ? activeParts[0] : activeParts;
87
87
  };
88
- this.closeParentOverlay = () => {
88
+ this.closeParentOverlay = (role) => {
89
89
  const popoverOrModal = this.el.closest('ion-modal, ion-popover');
90
90
  if (popoverOrModal) {
91
- popoverOrModal.dismiss();
91
+ popoverOrModal.dismiss(undefined, role);
92
92
  }
93
93
  };
94
94
  this.setWorkingParts = (parts) => {
@@ -319,7 +319,8 @@ export class Datetime {
319
319
  * Check below the next line ensures that we did not
320
320
  * swipe and abort (i.e. we swiped but we are still on the current month).
321
321
  */
322
- const month = calendarBodyRef.scrollLeft <= 2 ? startMonth : endMonth;
322
+ const condition = isRTL(this.el) ? calendarBodyRef.scrollLeft >= -2 : calendarBodyRef.scrollLeft <= 2;
323
+ const month = condition ? startMonth : endMonth;
323
324
  /**
324
325
  * The edge of the month must be lined up with
325
326
  * the edge of the calendar body in order for
@@ -758,7 +759,7 @@ export class Datetime {
758
759
  }
759
760
  }
760
761
  if (closeOverlay) {
761
- this.closeParentOverlay();
762
+ this.closeParentOverlay(CONFIRM_ROLE);
762
763
  }
763
764
  }
764
765
  /**
@@ -778,7 +779,7 @@ export class Datetime {
778
779
  async cancel(closeOverlay = false) {
779
780
  this.ionCancel.emit();
780
781
  if (closeOverlay) {
781
- this.closeParentOverlay();
782
+ this.closeParentOverlay(CANCEL_ROLE);
782
783
  }
783
784
  }
784
785
  get isCalendarPicker() {
@@ -1090,7 +1091,7 @@ export class Datetime {
1090
1091
  const todayString = workingParts.day !== null
1091
1092
  ? `${workingParts.year}-${workingParts.month}-${workingParts.day}`
1092
1093
  : `${defaultParts.year}-${defaultParts.month}-${defaultParts.day}`;
1093
- return (h("ion-picker-column", { class: "date-column", color: this.color, disabled: disabled, value: todayString, onIonChange: (ev) => {
1094
+ return (h("ion-picker-column", { "aria-label": "Select a date", class: "date-column", color: this.color, disabled: disabled, value: todayString, onIonChange: (ev) => {
1094
1095
  const { value } = ev.detail;
1095
1096
  const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1096
1097
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
@@ -1165,7 +1166,7 @@ export class Datetime {
1165
1166
  const { disabled, workingParts } = this;
1166
1167
  const activePart = this.getActivePartsWithFallback();
1167
1168
  const pickerColumnValue = (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined;
1168
- return (h("ion-picker-column", { class: "day-column", color: this.color, disabled: disabled, value: pickerColumnValue, onIonChange: (ev) => {
1169
+ return (h("ion-picker-column", { "aria-label": "Select a day", class: "day-column", color: this.color, disabled: disabled, value: pickerColumnValue, onIonChange: (ev) => {
1169
1170
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1170
1171
  this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1171
1172
  ev.stopPropagation();
@@ -1177,7 +1178,7 @@ export class Datetime {
1177
1178
  }
1178
1179
  const { disabled, workingParts } = this;
1179
1180
  const activePart = this.getActivePartsWithFallback();
1180
- return (h("ion-picker-column", { class: "month-column", color: this.color, disabled: disabled, value: workingParts.month, onIonChange: (ev) => {
1181
+ return (h("ion-picker-column", { "aria-label": "Select a month", class: "month-column", color: this.color, disabled: disabled, value: workingParts.month, onIonChange: (ev) => {
1181
1182
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1182
1183
  this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1183
1184
  ev.stopPropagation();
@@ -1189,7 +1190,7 @@ export class Datetime {
1189
1190
  }
1190
1191
  const { disabled, workingParts } = this;
1191
1192
  const activePart = this.getActivePartsWithFallback();
1192
- return (h("ion-picker-column", { class: "year-column", color: this.color, disabled: disabled, value: workingParts.year, onIonChange: (ev) => {
1193
+ return (h("ion-picker-column", { "aria-label": "Select a year", class: "year-column", color: this.color, disabled: disabled, value: workingParts.year, onIonChange: (ev) => {
1193
1194
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1194
1195
  this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1195
1196
  ev.stopPropagation();
@@ -1222,7 +1223,7 @@ export class Datetime {
1222
1223
  if (hoursData.length === 0)
1223
1224
  return [];
1224
1225
  const activePart = this.getActivePartsWithFallback();
1225
- return (h("ion-picker-column", { color: this.color, disabled: disabled, value: activePart.hour, numericInput: true, onIonChange: (ev) => {
1226
+ return (h("ion-picker-column", { "aria-label": "Select an hour", color: this.color, disabled: disabled, value: activePart.hour, numericInput: true, onIonChange: (ev) => {
1226
1227
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1227
1228
  this.setActiveParts(Object.assign(Object.assign({}, activePart), { hour: ev.detail.value }));
1228
1229
  ev.stopPropagation();
@@ -1233,7 +1234,7 @@ export class Datetime {
1233
1234
  if (minutesData.length === 0)
1234
1235
  return [];
1235
1236
  const activePart = this.getActivePartsWithFallback();
1236
- return (h("ion-picker-column", { color: this.color, disabled: disabled, value: activePart.minute, numericInput: true, onIonChange: (ev) => {
1237
+ return (h("ion-picker-column", { "aria-label": "Select a minute", color: this.color, disabled: disabled, value: activePart.minute, numericInput: true, onIonChange: (ev) => {
1237
1238
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1238
1239
  this.setActiveParts(Object.assign(Object.assign({}, activePart), { minute: ev.detail.value }));
1239
1240
  ev.stopPropagation();
@@ -1246,7 +1247,7 @@ export class Datetime {
1246
1247
  }
1247
1248
  const activePart = this.getActivePartsWithFallback();
1248
1249
  const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1249
- return (h("ion-picker-column", { style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, disabled: disabled, value: activePart.ampm, onIonChange: (ev) => {
1250
+ return (h("ion-picker-column", { "aria-label": "Select a day period", style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, disabled: disabled, value: activePart.ampm, onIonChange: (ev) => {
1250
1251
  const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1251
1252
  this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1252
1253
  this.setActiveParts(Object.assign(Object.assign({}, activePart), { ampm: ev.detail.value, hour }));
@@ -1556,7 +1557,7 @@ export class Datetime {
1556
1557
  const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1557
1558
  const hasWheelVariant = hasDatePresentation && preferWheel;
1558
1559
  renderHiddenInput(true, el, name, formatValue(value), disabled);
1559
- return (h(Host, { key: 'f1f8ca52cdd9cfc8394b0365c89c0d30cd7316e7', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1560
+ return (h(Host, { key: '48313af4ec8e2a2666cd8c89932c5131dfa7b556', "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1560
1561
  [mode]: true,
1561
1562
  ['datetime-readonly']: readonly,
1562
1563
  ['datetime-disabled']: disabled,
@@ -1566,7 +1567,7 @@ export class Datetime {
1566
1567
  [`datetime-size-${size}`]: true,
1567
1568
  [`datetime-prefer-wheel`]: hasWheelVariant,
1568
1569
  [`datetime-grid`]: isGridStyle,
1569
- })) }, h("div", { key: '480068aa8072b60ac521646dfa82480c5f6ce6ef', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1570
+ })) }, h("div", { key: 'b72570048236415aed915488305046d987d51dcf', class: "intersection-tracker", ref: (el) => (this.intersectionTrackerRef = el) }), this.renderDatetime(mode)));
1570
1571
  }
1571
1572
  static get is() { return "ion-datetime"; }
1572
1573
  static get encapsulation() { return "shadow"; }
@@ -2179,7 +2180,7 @@ export class Datetime {
2179
2180
  "composed": true,
2180
2181
  "docs": {
2181
2182
  "tags": [],
2182
- "text": "Emitted when the value (selected date) has changed."
2183
+ "text": "Emitted when the value (selected date) has changed.\n\nThis event will not emit when programmatically setting the `value` property."
2183
2184
  },
2184
2185
  "complexType": {
2185
2186
  "original": "DatetimeChangeEventDetail",
@@ -2396,5 +2397,7 @@ export class Datetime {
2396
2397
  }
2397
2398
  }
2398
2399
  let datetimeIds = 0;
2400
+ const CANCEL_ROLE = 'datetime-cancel';
2401
+ const CONFIRM_ROLE = 'datetime-confirm';
2399
2402
  const WHEEL_ITEM_PART = 'wheel-item';
2400
2403
  const WHEEL_ITEM_ACTIVE_PART = `active`;
@@ -0,0 +1,34 @@
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
+ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ config, title }) => {
7
+ test.describe(title('datetime: overlay roles'), () => {
8
+ test.beforeEach(async ({ page }) => {
9
+ await page.setContent(`
10
+ <ion-modal>
11
+ <ion-datetime></ion-datetime>
12
+ </ion-modal>
13
+ `, config);
14
+ });
15
+ test('should pass role to overlay when calling confirm method', async ({ page }) => {
16
+ const ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss');
17
+ const modal = page.locator('ion-modal');
18
+ const datetime = page.locator('ion-datetime');
19
+ await modal.evaluate((el) => el.present());
20
+ await datetime.evaluate((el) => el.confirm(true));
21
+ await ionModalDidDismiss.next();
22
+ expect(ionModalDidDismiss).toHaveReceivedEventDetail({ data: undefined, role: 'datetime-confirm' });
23
+ });
24
+ test('should pass role to overlay when calling cancel method', async ({ page }) => {
25
+ const ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss');
26
+ const modal = page.locator('ion-modal');
27
+ const datetime = page.locator('ion-datetime');
28
+ await modal.evaluate((el) => el.present());
29
+ await datetime.evaluate((el) => el.cancel(true));
30
+ await ionModalDidDismiss.next();
31
+ expect(ionModalDidDismiss).toHaveReceivedEventDetail({ data: undefined, role: 'datetime-cancel' });
32
+ });
33
+ });
34
+ });
@@ -8,7 +8,7 @@ configs().forEach(({ title, screenshot, config }) => {
8
8
  test('should position the time picker relative to the click target', async ({ page }) => {
9
9
  await page.goto('/src/components/datetime/test/position', config);
10
10
  const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent');
11
- const openDateTimeBtn = page.locator('ion-button#open-datetime');
11
+ const openDateTimeBtn = page.locator('#open-datetime');
12
12
  await openDateTimeBtn.click();
13
13
  await ionPopoverDidPresent.next();
14
14
  await page.locator('.datetime-ready').waitFor();
@@ -337,11 +337,11 @@ export class DatetimeButton {
337
337
  render() {
338
338
  const { color, dateText, timeText, selectedButton, datetimeActive, disabled } = this;
339
339
  const mode = getIonMode(this);
340
- return (h(Host, { key: '26e606af6f067a5774db37ed41387ffebb941777', class: createColorClasses(color, {
340
+ return (h(Host, { key: '0be955404133adbb31ae16a6599014bb29765f19', class: createColorClasses(color, {
341
341
  [mode]: true,
342
342
  [`${selectedButton}-active`]: datetimeActive,
343
343
  ['datetime-button-disabled']: disabled,
344
- }) }, dateText && (h("button", { key: '6b7aa66a15b4a6d89d411e40586de28a2ac9f343', class: "ion-activatable", id: "date-button", "aria-expanded": datetimeActive ? 'true' : 'false', onClick: this.handleDateClick, disabled: disabled, part: "native", ref: (el) => (this.dateTargetEl = el) }, h("slot", { key: 'd42f34fd167be34386319e7ea788c2ab03c90b87', name: "date-target" }, dateText), mode === 'md' && h("ion-ripple-effect", { key: '47dd34f3c2799064cac7a5fe25440ecc043950f0' }))), timeText && (h("button", { key: 'd77424a20fae320654774c7bfc8a8e2369d3afe3', class: "ion-activatable", id: "time-button", "aria-expanded": datetimeActive ? 'true' : 'false', onClick: this.handleTimeClick, disabled: disabled, part: "native", ref: (el) => (this.timeTargetEl = el) }, h("slot", { key: 'ac088a78141bb53f2efd48dd7745f8954c92378b', name: "time-target" }, timeText), mode === 'md' && h("ion-ripple-effect", { key: 'b3a58ddfd28b9396e2518ffd62a045ec13d8b9d0' })))));
344
+ }) }, dateText && (h("button", { key: '812dcb50b17768cc13a5cfa0bcce8b113cee0f09', class: "ion-activatable", id: "date-button", "aria-expanded": datetimeActive ? 'true' : 'false', onClick: this.handleDateClick, disabled: disabled, part: "native", ref: (el) => (this.dateTargetEl = el) }, h("slot", { key: '46930c740a32a78502df9e651f9bd5914d6a9fea', name: "date-target" }, dateText), mode === 'md' && h("ion-ripple-effect", { key: '0602999cc8435dc37aa22da7f5531bc8cb71e1b4' }))), timeText && (h("button", { key: 'ecdd21da5181ecbdce03209f9f6673b7dcbc1f78', class: "ion-activatable", id: "time-button", "aria-expanded": datetimeActive ? 'true' : 'false', onClick: this.handleTimeClick, disabled: disabled, part: "native", ref: (el) => (this.timeTargetEl = el) }, h("slot", { key: 'b5b093b5166d12d11e27360788edaac916d44390', name: "time-target" }, timeText), mode === 'md' && h("ion-ripple-effect", { key: '70bb3a04f4748d13233eeb257503968dbd1161a9' })))));
345
345
  }
346
346
  static get is() { return "ion-datetime-button"; }
347
347
  static get encapsulation() { return "shadow"; }
@@ -47,12 +47,12 @@ export class Fab {
47
47
  render() {
48
48
  const { horizontal, vertical, edge } = this;
49
49
  const mode = getIonMode(this);
50
- return (h(Host, { key: '8a310806d0e748d7ebb0ed3d9a2652038e0f2960', class: {
50
+ return (h(Host, { key: 'cb44cf6486b0a6439b99da87c065b0b52e2514f4', class: {
51
51
  [mode]: true,
52
52
  [`fab-horizontal-${horizontal}`]: horizontal !== undefined,
53
53
  [`fab-vertical-${vertical}`]: vertical !== undefined,
54
54
  'fab-edge': edge,
55
- } }, h("slot", { key: '9394ef6d6e5b0410fa6ba212171f687fb178ce2d' })));
55
+ } }, h("slot", { key: '1ed484c7ecb10cd81fbca9a4f5c4049bf82f9f8a' })));
56
56
  }
57
57
  static get is() { return "ion-fab"; }
58
58
  static get encapsulation() { return "shadow"; }
@@ -63,7 +63,7 @@ export class FabButton {
63
63
  rel: this.rel,
64
64
  target: this.target,
65
65
  };
66
- return (h(Host, { key: '4eee204d20b0e2ffed49a88f6cb3e04b6697965c', onClick: this.onClick, "aria-disabled": disabled ? 'true' : null, class: createColorClasses(color, {
66
+ return (h(Host, { key: 'eb347f7d6749c40637540d84778eb8d1b667a947', onClick: this.onClick, "aria-disabled": disabled ? 'true' : null, class: createColorClasses(color, {
67
67
  [mode]: true,
68
68
  'fab-button-in-list': inList,
69
69
  'fab-button-translucent-in-list': inList && translucent,
@@ -74,7 +74,7 @@ export class FabButton {
74
74
  'ion-activatable': true,
75
75
  'ion-focusable': true,
76
76
  [`fab-button-${size}`]: size !== undefined,
77
- }) }, h(TagType, Object.assign({ key: '914561622c0c6bd41453e828a7d8a39f924875ac' }, attrs, { class: "button-native", part: "native", disabled: disabled, onFocus: this.onFocus, onBlur: this.onBlur, onClick: (ev) => openURL(href, ev, this.routerDirection, this.routerAnimation) }, inheritedAttributes), h("ion-icon", { key: '2c8090742a64c62a79243667027a195cca9d5912', "aria-hidden": "true", icon: this.closeIcon, part: "close-icon", class: "close-icon", lazy: false }), h("span", { key: 'c3e55291e4c4d306d34a4b95dd2e727e87bdf39c', class: "button-inner" }, h("slot", { key: 'f8e57f71d8f8878d9746cfece82f57f19ef9e988' })), mode === 'md' && h("ion-ripple-effect", { key: 'a5e94fa0bb9836072300617245ed0c1b4887bac6' }))));
77
+ }) }, h(TagType, Object.assign({ key: '83e853c8815f41543c848eb2e05ec2bb1716110a' }, attrs, { class: "button-native", part: "native", disabled: disabled, onFocus: this.onFocus, onBlur: this.onBlur, onClick: (ev) => openURL(href, ev, this.routerDirection, this.routerAnimation) }, inheritedAttributes), h("ion-icon", { key: '798deede94de658e4345acf7c2aafe2ab2567b0b', "aria-hidden": "true", icon: this.closeIcon, part: "close-icon", class: "close-icon", lazy: false }), h("span", { key: '99252fde6de1aca73fc240a6da7e29acac9acb18', class: "button-inner" }, h("slot", { key: 'dc73e9b41bf1f0e385e5784f975dfb81e37c8dfb' })), mode === 'md' && h("ion-ripple-effect", { key: '8413e162f44a0350f54dff06cff7aad101de3549' }))));
78
78
  }
79
79
  static get is() { return "ion-fab-button"; }
80
80
  static get encapsulation() { return "shadow"; }
@@ -18,11 +18,11 @@ export class FabList {
18
18
  }
19
19
  render() {
20
20
  const mode = getIonMode(this);
21
- return (h(Host, { key: '64b33366447f66c7f979cfac56307fbb1a6fac1c', class: {
21
+ return (h(Host, { key: 'fa1d195b9950654ba0e984bf61d981c977d05275', class: {
22
22
  [mode]: true,
23
23
  'fab-list-active': this.activated,
24
24
  [`fab-list-side-${this.side}`]: true,
25
- } }, h("slot", { key: 'd9f474f7f20fd7e813db358fddc720534ca05bb6' })));
25
+ } }, h("slot", { key: '2ec738c66c05112e1e2521155d6adfc36d2fd1db' })));
26
26
  }
27
27
  static get is() { return "ion-fab-list"; }
28
28
  static get encapsulation() { return "shadow"; }
@@ -80,7 +80,7 @@ export class Footer {
80
80
  const mode = getIonMode(this);
81
81
  const tabs = this.el.closest('ion-tabs');
82
82
  const tabBar = tabs === null || tabs === void 0 ? void 0 : tabs.querySelector(':scope > ion-tab-bar');
83
- return (h(Host, { key: 'ddc228f1a1e7fa4f707dccf74db2490ca3241137', role: "contentinfo", class: {
83
+ return (h(Host, { key: '5da19dc38ba73e1ddfd1bef3ebd485105d77c751', role: "contentinfo", class: {
84
84
  [mode]: true,
85
85
  // Used internally for styling
86
86
  [`footer-${mode}`]: true,
@@ -88,7 +88,7 @@ export class Footer {
88
88
  [`footer-translucent-${mode}`]: translucent,
89
89
  ['footer-toolbar-padding']: !this.keyboardVisible && (!tabBar || tabBar.slot !== 'bottom'),
90
90
  [`footer-collapse-${collapse}`]: collapse !== undefined,
91
- } }, mode === 'ios' && translucent && h("div", { key: 'e16ed4963ff94e06de77eb8038201820af73937c', class: "footer-background" }), h("slot", { key: 'f186934febf85d37133d9351a96c1a64b0a4b203' })));
91
+ } }, mode === 'ios' && translucent && h("div", { key: 'fafad08090a33d8c4e8a5b63d61929dcb89aab47', class: "footer-background" }), h("slot", { key: 'e0a443d346afa55e4317c0bc1263fdbe3c619559' })));
92
92
  }
93
93
  static get is() { return "ion-footer"; }
94
94
  static get originalStyleUrls() {
@@ -9,10 +9,10 @@ export class Grid {
9
9
  }
10
10
  render() {
11
11
  const mode = getIonMode(this);
12
- return (h(Host, { key: '617127ecfabf9bf615bef1dda1be3fed5a065949', class: {
12
+ return (h(Host, { key: '930ce78b02f8360fbca08a35d364d2c09128c6c8', class: {
13
13
  [mode]: true,
14
14
  'grid-fixed': this.fixed,
15
- } }, h("slot", { key: 'c781fff853b093d8f44bdb7943bbc4f17c903803' })));
15
+ } }, h("slot", { key: 'c47bf7ef2197f5ebc42d3e2c55044276fb0db393' })));
16
16
  }
17
17
  static get is() { return "ion-grid"; }
18
18
  static get encapsulation() { return "shadow"; }
@@ -140,14 +140,14 @@ export class Header {
140
140
  const collapse = this.collapse || 'none';
141
141
  // banner role must be at top level, so remove role if inside a menu
142
142
  const roleType = hostContext('ion-menu', this.el) ? 'none' : 'banner';
143
- return (h(Host, Object.assign({ key: 'b6cc27f0b08afc9fcc889683525da765d80ba672', role: roleType, class: {
143
+ return (h(Host, Object.assign({ key: 'c687314ef290793a9d633ad20cfc5eeb47621e31', role: roleType, class: {
144
144
  [mode]: true,
145
145
  // Used internally for styling
146
146
  [`header-${mode}`]: true,
147
147
  [`header-translucent`]: this.translucent,
148
148
  [`header-collapse-${collapse}`]: true,
149
149
  [`header-translucent-${mode}`]: this.translucent,
150
- } }, inheritedAttributes), mode === 'ios' && translucent && h("div", { key: '395766d4dcee3398bc91960db21f922095292f14', class: "header-background" }), h("slot", { key: '09a67ece27b258ff1248805d43d92a49b2c6859a' })));
150
+ } }, inheritedAttributes), mode === 'ios' && translucent && h("div", { key: 'b429996046082405a91e7c23f95516db0b736f12', class: "header-background" }), h("slot", { key: 'e17a8965f8d3a33c1bfcb056c153d8242e5229fa' })));
151
151
  }
152
152
  static get is() { return "ion-header"; }
153
153
  static get originalStyleUrls() {
@@ -71,7 +71,7 @@ export class Img {
71
71
  render() {
72
72
  const { loadSrc, alt, onLoad, loadError, inheritedAttributes } = this;
73
73
  const { draggable } = inheritedAttributes;
74
- return (h(Host, { key: 'da600442894427dee1974a28e545613afac69fca', class: getIonMode(this) }, h("img", { key: '16df0c7069af86c0fa7ce5af598bc0f63b4eb71a', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
74
+ return (h(Host, { key: '14d24d65ec8e5522192ca58035264971b1ab883b', class: getIonMode(this) }, h("img", { key: '345ba155a5fdce5e66c397a599b7333d37d9cb1d', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
75
75
  }
76
76
  static get is() { return "ion-img"; }
77
77
  static get encapsulation() { return "shadow"; }
@@ -167,7 +167,7 @@ export class InfiniteScroll {
167
167
  render() {
168
168
  const mode = getIonMode(this);
169
169
  const disabled = this.disabled;
170
- return (h(Host, { key: 'e844956795f69be33396ce4480aa7a54ad01b28c', class: {
170
+ return (h(Host, { key: '1444429a86950c449953cbf578436cc8cabf40ec', class: {
171
171
  [mode]: true,
172
172
  'infinite-scroll-loading': this.isLoading,
173
173
  'infinite-scroll-enabled': !disabled,
@@ -27,11 +27,11 @@ export class InfiniteScrollContent {
27
27
  }
28
28
  render() {
29
29
  const mode = getIonMode(this);
30
- return (h(Host, { key: '7c16060dcfe2a0b0fb3e2f8f4c449589a76f1baa', class: {
30
+ return (h(Host, { key: '060278bf9cb0321e182352f9613be4ebbb028259', class: {
31
31
  [mode]: true,
32
32
  // Used internally for styling
33
33
  [`infinite-scroll-content-${mode}`]: true,
34
- } }, h("div", { key: 'a94f4d8746e053dc718f97520bd7e48cb316443a', class: "infinite-loading" }, this.loadingSpinner && (h("div", { key: '10143d5d2a50a2a2bc5de1cee8e7ab51263bcf23', class: "infinite-loading-spinner" }, h("ion-spinner", { key: '8846e88191690d9c61a0b462889ed56fbfed8b0d', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
34
+ } }, h("div", { key: '07d3cada920145f979ad315bd187fb878e0c3da3', class: "infinite-loading" }, this.loadingSpinner && (h("div", { key: '6254f175d7543d09f3dd47cd0589a2809182cd8c', class: "infinite-loading-spinner" }, h("ion-spinner", { key: 'a6a816d1c65b60b786333b209b63492aa716a283', name: this.loadingSpinner }))), this.loadingText !== undefined && this.renderLoadingText())));
35
35
  }
36
36
  static get is() { return "ion-infinite-scroll-content"; }
37
37
  static get originalStyleUrls() {
@@ -81,6 +81,7 @@ export class Input {
81
81
  this.autocorrect = 'off';
82
82
  this.autofocus = false;
83
83
  this.clearInput = false;
84
+ this.clearInputIcon = undefined;
84
85
  this.clearOnEdit = undefined;
85
86
  this.counter = false;
86
87
  this.counterFormatter = undefined;
@@ -371,11 +372,13 @@ export class Input {
371
372
  return this.renderLabel();
372
373
  }
373
374
  render() {
374
- const { disabled, fill, readonly, shape, inputId, labelPlacement, el, hasFocus } = this;
375
+ const { disabled, fill, readonly, shape, inputId, labelPlacement, el, hasFocus, clearInputIcon } = this;
375
376
  const mode = getIonMode(this);
376
377
  const value = this.getValue();
377
378
  const inItem = hostContext('ion-item', this.el);
378
379
  const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
380
+ const defaultClearIcon = mode === 'ios' ? closeCircle : closeSharp;
381
+ const clearIconData = clearInputIcon !== null && clearInputIcon !== void 0 ? clearInputIcon : defaultClearIcon;
379
382
  const hasValue = this.hasValue();
380
383
  const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
381
384
  /**
@@ -396,7 +399,7 @@ export class Input {
396
399
  * TODO(FW-5592): Remove hasStartEndSlots condition
397
400
  */
398
401
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
399
- return (h(Host, { key: '083568e68a2970485e93a84ad3b837c117e03fed', class: createColorClasses(this.color, {
402
+ return (h(Host, { key: '907ce98a82b5cfae5a08504cd79e00a2330b7444', class: createColorClasses(this.color, {
400
403
  [mode]: true,
401
404
  'has-value': hasValue,
402
405
  'has-focus': hasFocus,
@@ -407,7 +410,7 @@ export class Input {
407
410
  'in-item': inItem,
408
411
  'in-item-color': hostContext('ion-item.ion-color', this.el),
409
412
  'input-disabled': disabled,
410
- }) }, h("label", { key: '5e6767a20b8ac61d5df69106f4ce11ecc46ae5bf', class: "input-wrapper", htmlFor: inputId }, this.renderLabelContainer(), h("div", { key: '4af8df127e8194b4eeb8b16936a36489aee17009', class: "native-wrapper" }, h("slot", { key: '90e925fa36a5c057a4ca5e03d5fcaf8e12e711ad', name: "start" }), h("input", Object.assign({ key: '0a5455e8c31beca48e08b97faa5e3e069822248f', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { key: 'b9eab01b390581d20c861ae6a4c49bde0841f14c', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
413
+ }) }, h("label", { key: '59d5bb45d2a5b828bba0ed8687a632a551e2f4d8', class: "input-wrapper", htmlFor: inputId }, this.renderLabelContainer(), h("div", { key: 'f93f129d08246d0e9a601c100d718534d6403853', class: "native-wrapper" }, h("slot", { key: '54eeb1a6bace662b7eb0d7e27180ea3d7e3a3729', name: "start" }), h("input", Object.assign({ key: 'b3e0be55bc1a4a539ae3b0fdcf7fc078723cca16', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { key: '5f6373504a6d0d074bfbf875c794d45ea2748175', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
411
414
  /**
412
415
  * This prevents mobile browsers from
413
416
  * blurring the input when the clear
@@ -422,7 +425,7 @@ export class Input {
422
425
  * for screen readers as it means users would be unable to swipe past the clear button.
423
426
  */
424
427
  ev.stopPropagation();
425
- }, onClick: this.clearTextInput }, h("ion-icon", { key: '8284ba60924a42fd6d352d23441524f8a027e0ce', "aria-hidden": "true", icon: mode === 'ios' ? closeCircle : closeSharp }))), h("slot", { key: '8f3c04ecc32cb04a06ebb916b79071414b2a5263', name: "end" })), shouldRenderHighlight && h("div", { key: '7e97782b292fd140b3fe7f13de05dfafb4b0fa28', class: "input-highlight" })), this.renderBottomContent()));
428
+ }, onClick: this.clearTextInput }, h("ion-icon", { key: '230d77973aa83458ceb32bf52e3abe9bc322cfe6', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: '9d69ac6e8a3c4b2b303dba2478f82695d5755ed2', name: "end" })), shouldRenderHighlight && h("div", { key: 'ac61f16237ce731e0745ab72d0fc3f066252464a', class: "input-highlight" })), this.renderBottomContent()));
426
429
  }
427
430
  static get is() { return "ion-input"; }
428
431
  static get encapsulation() { return "scoped"; }
@@ -559,6 +562,23 @@ export class Input {
559
562
  "reflect": false,
560
563
  "defaultValue": "false"
561
564
  },
565
+ "clearInputIcon": {
566
+ "type": "string",
567
+ "mutable": false,
568
+ "complexType": {
569
+ "original": "string",
570
+ "resolved": "string | undefined",
571
+ "references": {}
572
+ },
573
+ "required": false,
574
+ "optional": true,
575
+ "docs": {
576
+ "tags": [],
577
+ "text": "The icon to use for the clear button. Only applies when `clearInput` is set to `true`."
578
+ },
579
+ "attribute": "clear-input-icon",
580
+ "reflect": false
581
+ },
562
582
  "clearOnEdit": {
563
583
  "type": "boolean",
564
584
  "mutable": false,
@@ -1068,7 +1088,7 @@ export class Input {
1068
1088
  "composed": true,
1069
1089
  "docs": {
1070
1090
  "tags": [],
1071
- "text": "The `ionChange` event is fired when the user modifies the input's value.\nUnlike the `ionInput` event, the `ionChange` event is only fired when changes\nare committed, not as the user types.\n\nDepending on the way the users interacts with the element, the `ionChange`\nevent fires at a different moment:\n- When the user commits the change explicitly (e.g. by selecting a date\nfrom a date picker for `<ion-input type=\"date\">`, pressing the \"Enter\" key, etc.).\n- When the element loses focus after its value has changed: for elements\nwhere the user's interaction is typing."
1091
+ "text": "The `ionChange` event is fired when the user modifies the input's value.\nUnlike the `ionInput` event, the `ionChange` event is only fired when changes\nare committed, not as the user types.\n\nDepending on the way the users interacts with the element, the `ionChange`\nevent fires at a different moment:\n- When the user commits the change explicitly (e.g. by selecting a date\nfrom a date picker for `<ion-input type=\"date\">`, pressing the \"Enter\" key, etc.).\n- When the element loses focus after its value has changed: for elements\nwhere the user's interaction is typing.\n\nThis event will not emit when programmatically setting the `value` property."
1072
1092
  },
1073
1093
  "complexType": {
1074
1094
  "original": "InputChangeEventDetail",
@@ -83,3 +83,16 @@ describe('input: label rendering', () => {
83
83
  expect(labelText.textContent).toBe('Label Prop Text');
84
84
  });
85
85
  });
86
+ // https://github.com/ionic-team/ionic-framework/issues/26974
87
+ describe('input: clear icon', () => {
88
+ it('should render custom icon', async () => {
89
+ const page = await newSpecPage({
90
+ components: [Input],
91
+ html: `
92
+ <ion-input clear-input-icon="foo" clear-input="true"></ion-input>
93
+ `,
94
+ });
95
+ const icon = page.body.querySelector('ion-input ion-icon');
96
+ expect(icon.getAttribute('icon')).toBe('foo');
97
+ });
98
+ });
@@ -60,16 +60,16 @@ export class InputPasswordToggle {
60
60
  const showPasswordIcon = (_a = this.showIcon) !== null && _a !== void 0 ? _a : eye;
61
61
  const hidePasswordIcon = (_b = this.hideIcon) !== null && _b !== void 0 ? _b : eyeOff;
62
62
  const isPasswordVisible = type === 'text';
63
- return (h(Host, { key: 'd9811e25bfeb2aa197352bb9be852e9e420739d5', class: createColorClasses(color, {
63
+ return (h(Host, { key: 'ed1c29726ce0c91548f0e2ada61e3f8b5c813d2d', class: createColorClasses(color, {
64
64
  [mode]: true,
65
- }) }, h("ion-button", { key: '1eaea1442b248fb2b8d61538b27274e647a07804', mode: mode, color: color, fill: "clear", shape: "round", "aria-checked": isPasswordVisible ? 'true' : 'false', "aria-label": "show password", role: "switch", type: "button", onPointerDown: (ev) => {
65
+ }) }, h("ion-button", { key: '9698eccdaedb86cf12d20acc53660371b3af3c55', mode: mode, color: color, fill: "clear", shape: "round", "aria-checked": isPasswordVisible ? 'true' : 'false', "aria-label": "show password", role: "switch", type: "button", onPointerDown: (ev) => {
66
66
  /**
67
67
  * This prevents mobile browsers from
68
68
  * blurring the input when the password toggle
69
69
  * button is activated.
70
70
  */
71
71
  ev.preventDefault();
72
- }, onClick: this.togglePasswordVisibility }, h("ion-icon", { key: '9c88de8f4631d9bde222ce2edf6950d639e04773', slot: "icon-only", "aria-hidden": "true", icon: isPasswordVisible ? hidePasswordIcon : showPasswordIcon }))));
72
+ }, onClick: this.togglePasswordVisibility }, h("ion-icon", { key: '1f2119c30b56c800d9af44e6499445a0ebb466cf', slot: "icon-only", "aria-hidden": "true", icon: isPasswordVisible ? hidePasswordIcon : showPasswordIcon }))));
73
73
  }
74
74
  static get is() { return "ion-input-password-toggle"; }
75
75
  static get encapsulation() { return "shadow"; }
@@ -4,14 +4,34 @@
4
4
  import AxeBuilder from "@axe-core/playwright";
5
5
  import { expect } from "@playwright/test";
6
6
  import { configs, test } from "../../../../utils/test/playwright/index";
7
+ configs({ directions: ['ltr'], palettes: ['dark'] }).forEach(({ config, screenshot, title }) => {
8
+ test.describe(title('item: dark palette'), () => {
9
+ /**
10
+ * This test was originally created to ensure the item border has sufficient
11
+ * contrast. We don't use an Axe test here because Axe not warn about color
12
+ * contrast on the item borders.
13
+ */
14
+ test('borders should have sufficient contrast', async ({ page }) => {
15
+ test.info().annotations.push({
16
+ type: 'issue',
17
+ description: 'https://github.com/ionic-team/ionic-framework/issues/29386',
18
+ });
19
+ await page.setContent(`
20
+ <ion-list>
21
+ <ion-item>Item</ion-item>
22
+ <ion-item>Item</ion-item>
23
+ </ion-list>
24
+ `, config);
25
+ const list = page.locator('ion-list');
26
+ await expect(list).toHaveScreenshot(screenshot(`item-dark`));
27
+ });
28
+ });
29
+ });
7
30
  configs({ directions: ['ltr'] }).forEach(({ config, screenshot, title }) => {
8
31
  test.describe(title('item: axe'), () => {
9
32
  test('should not have accessibility violations', async ({ page }) => {
10
33
  await page.goto(`/src/components/item/test/a11y`, config);
11
- const results = await new AxeBuilder({ page })
12
- // TODO(FW-404): Re-enable rule once select is updated to avoid nested-interactive
13
- .disableRules('nested-interactive')
14
- .analyze();
34
+ const results = await new AxeBuilder({ page }).analyze();
15
35
  expect(results.violations).toEqual([]);
16
36
  });
17
37
  test('should reflect aria-label', async ({ page }) => {