voyager-ionic-core 7.5.5 → 7.6.1

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 (1858) hide show
  1. package/components/action-sheet.js +297 -287
  2. package/components/alert.js +477 -467
  3. package/components/animation.js +991 -990
  4. package/components/backdrop.js +56 -56
  5. package/components/button-active.js +56 -56
  6. package/components/button.js +236 -236
  7. package/components/buttons.js +29 -29
  8. package/components/capacitor.js +4 -4
  9. package/components/checkbox.js +172 -170
  10. package/components/config.js +142 -142
  11. package/components/cubic-bezier.js +49 -49
  12. package/components/data.js +1112 -1062
  13. package/components/dir.js +5 -5
  14. package/components/focus-visible.js +63 -63
  15. package/components/form-controller.js +45 -45
  16. package/components/framework-delegate.js +121 -121
  17. package/components/gesture-controller.js +182 -182
  18. package/components/haptic.js +150 -150
  19. package/components/hardware-back-button.js +48 -48
  20. package/components/helpers.js +257 -257
  21. package/components/icon.js +133 -133
  22. package/components/index.js +95 -95
  23. package/components/index2.js +163 -163
  24. package/components/index3.js +417 -417
  25. package/components/index4.js +257 -259
  26. package/components/index5.js +0 -22
  27. package/components/index6.js +3 -3
  28. package/components/index8.js +58 -58
  29. package/components/index9.js +171 -171
  30. package/components/input-shims.js +488 -483
  31. package/components/input.utils.js +107 -106
  32. package/components/ion-accordion-group.d.ts +2 -2
  33. package/components/ion-accordion-group.js +220 -220
  34. package/components/ion-accordion.d.ts +2 -2
  35. package/components/ion-accordion.js +326 -326
  36. package/components/ion-action-sheet.d.ts +2 -2
  37. package/components/ion-alert.d.ts +2 -2
  38. package/components/ion-app.d.ts +2 -2
  39. package/components/ion-app.js +93 -93
  40. package/components/ion-avatar.d.ts +2 -2
  41. package/components/ion-avatar.js +23 -23
  42. package/components/ion-back-button.d.ts +2 -2
  43. package/components/ion-back-button.js +102 -102
  44. package/components/ion-backdrop.d.ts +2 -2
  45. package/components/ion-badge.d.ts +2 -2
  46. package/components/ion-badge.js +29 -29
  47. package/components/ion-breadcrumb.d.ts +2 -2
  48. package/components/ion-breadcrumb.js +111 -111
  49. package/components/ion-breadcrumbs.d.ts +2 -2
  50. package/components/ion-breadcrumbs.js +139 -139
  51. package/components/ion-button.d.ts +2 -2
  52. package/components/ion-buttons.d.ts +2 -2
  53. package/components/ion-card-content.d.ts +2 -2
  54. package/components/ion-card-content.js +27 -27
  55. package/components/ion-card-header.d.ts +2 -2
  56. package/components/ion-card-header.js +33 -33
  57. package/components/ion-card-subtitle.d.ts +2 -2
  58. package/components/ion-card-subtitle.js +30 -30
  59. package/components/ion-card-title.d.ts +2 -2
  60. package/components/ion-card-title.js +30 -30
  61. package/components/ion-card.d.ts +2 -2
  62. package/components/ion-card.js +78 -78
  63. package/components/ion-checkbox.d.ts +2 -2
  64. package/components/ion-chip.d.ts +2 -2
  65. package/components/ion-chip.js +41 -41
  66. package/components/ion-col.d.ts +2 -2
  67. package/components/ion-col.js +156 -156
  68. package/components/ion-content.d.ts +2 -2
  69. package/components/ion-content.js +394 -394
  70. package/components/ion-datetime-button.d.ts +2 -2
  71. package/components/ion-datetime-button.js +348 -348
  72. package/components/ion-datetime.d.ts +2 -2
  73. package/components/ion-datetime.js +1741 -1709
  74. package/components/ion-fab-button.d.ts +2 -2
  75. package/components/ion-fab-button.js +109 -109
  76. package/components/ion-fab-list.d.ts +2 -2
  77. package/components/ion-fab-list.js +44 -44
  78. package/components/ion-fab.d.ts +2 -2
  79. package/components/ion-fab.js +75 -75
  80. package/components/ion-footer.d.ts +2 -2
  81. package/components/ion-footer.js +124 -124
  82. package/components/ion-grid.d.ts +2 -2
  83. package/components/ion-grid.js +27 -27
  84. package/components/ion-header.d.ts +2 -2
  85. package/components/ion-header.js +298 -298
  86. package/components/ion-img.d.ts +2 -2
  87. package/components/ion-img.js +97 -97
  88. package/components/ion-infinite-scroll-content.d.ts +2 -2
  89. package/components/ion-infinite-scroll-content.js +49 -49
  90. package/components/ion-infinite-scroll.d.ts +2 -2
  91. package/components/ion-infinite-scroll.js +187 -179
  92. package/components/ion-input.d.ts +2 -2
  93. package/components/ion-input.js +498 -454
  94. package/components/ion-item-divider.d.ts +2 -2
  95. package/components/ion-item-divider.js +34 -34
  96. package/components/ion-item-group.d.ts +2 -2
  97. package/components/ion-item-group.js +28 -28
  98. package/components/ion-item-option.d.ts +2 -2
  99. package/components/ion-item-option.js +67 -67
  100. package/components/ion-item-options.d.ts +2 -2
  101. package/components/ion-item-options.js +50 -50
  102. package/components/ion-item-sliding.d.ts +2 -2
  103. package/components/ion-item-sliding.js +404 -404
  104. package/components/ion-item.d.ts +2 -2
  105. package/components/ion-label.d.ts +2 -2
  106. package/components/ion-list-header.d.ts +2 -2
  107. package/components/ion-list.d.ts +2 -2
  108. package/components/ion-loading.d.ts +2 -2
  109. package/components/ion-loading.js +257 -247
  110. package/components/ion-menu-button.d.ts +2 -2
  111. package/components/ion-menu-button.js +77 -77
  112. package/components/ion-menu-toggle.d.ts +2 -2
  113. package/components/ion-menu-toggle.js +41 -41
  114. package/components/ion-menu.d.ts +2 -2
  115. package/components/ion-menu.js +631 -631
  116. package/components/ion-modal.d.ts +2 -2
  117. package/components/ion-modal.js +1451 -1441
  118. package/components/ion-nav-link.d.ts +2 -2
  119. package/components/ion-nav-link.js +47 -47
  120. package/components/ion-nav.d.ts +2 -2
  121. package/components/ion-nav.js +910 -910
  122. package/components/ion-note.d.ts +2 -2
  123. package/components/ion-picker-column-internal.d.ts +2 -2
  124. package/components/ion-picker-column.d.ts +2 -2
  125. package/components/ion-picker-internal.d.ts +2 -2
  126. package/components/ion-picker.d.ts +2 -2
  127. package/components/ion-picker.js +263 -253
  128. package/components/ion-popover.d.ts +2 -2
  129. package/components/ion-progress-bar.d.ts +2 -2
  130. package/components/ion-progress-bar.js +57 -57
  131. package/components/ion-radio-group.d.ts +2 -2
  132. package/components/ion-radio.d.ts +2 -2
  133. package/components/ion-range.d.ts +2 -2
  134. package/components/ion-range.js +593 -591
  135. package/components/ion-refresher-content.d.ts +2 -2
  136. package/components/ion-refresher-content.js +63 -63
  137. package/components/ion-refresher.d.ts +2 -2
  138. package/components/ion-refresher.js +747 -747
  139. package/components/ion-reorder-group.d.ts +2 -2
  140. package/components/ion-reorder-group.js +259 -259
  141. package/components/ion-reorder.d.ts +2 -2
  142. package/components/ion-reorder.js +39 -39
  143. package/components/ion-ripple-effect.d.ts +2 -2
  144. package/components/ion-route-redirect.d.ts +2 -2
  145. package/components/ion-route-redirect.js +34 -34
  146. package/components/ion-route.d.ts +2 -2
  147. package/components/ion-route.js +56 -56
  148. package/components/ion-router-link.d.ts +2 -2
  149. package/components/ion-router-link.js +45 -45
  150. package/components/ion-router-outlet.d.ts +2 -2
  151. package/components/ion-router-outlet.js +193 -193
  152. package/components/ion-router.d.ts +2 -2
  153. package/components/ion-router.js +632 -632
  154. package/components/ion-row.d.ts +2 -2
  155. package/components/ion-row.js +20 -20
  156. package/components/ion-searchbar.d.ts +2 -2
  157. package/components/ion-searchbar.js +402 -400
  158. package/components/ion-segment-button.d.ts +2 -2
  159. package/components/ion-segment-button.js +117 -117
  160. package/components/ion-segment.d.ts +2 -2
  161. package/components/ion-segment.js +427 -427
  162. package/components/ion-select-option.d.ts +2 -2
  163. package/components/ion-select-option.js +27 -27
  164. package/components/ion-select-popover.d.ts +2 -2
  165. package/components/ion-select.d.ts +2 -2
  166. package/components/ion-select.js +778 -763
  167. package/components/ion-skeleton-text.d.ts +2 -2
  168. package/components/ion-skeleton-text.js +45 -32
  169. package/components/ion-spinner.d.ts +2 -2
  170. package/components/ion-split-pane.d.ts +2 -2
  171. package/components/ion-split-pane.js +147 -147
  172. package/components/ion-tab-bar.d.ts +2 -2
  173. package/components/ion-tab-bar.js +77 -77
  174. package/components/ion-tab-button.d.ts +2 -2
  175. package/components/ion-tab-button.js +104 -104
  176. package/components/ion-tab.d.ts +2 -2
  177. package/components/ion-tab.js +72 -72
  178. package/components/ion-tabs.d.ts +2 -2
  179. package/components/ion-tabs.js +160 -160
  180. package/components/ion-text.d.ts +2 -2
  181. package/components/ion-text.js +26 -26
  182. package/components/ion-textarea.d.ts +2 -2
  183. package/components/ion-textarea.js +443 -395
  184. package/components/ion-thumbnail.d.ts +2 -2
  185. package/components/ion-thumbnail.js +20 -20
  186. package/components/ion-title.d.ts +2 -2
  187. package/components/ion-title.js +56 -56
  188. package/components/ion-toast.d.ts +2 -2
  189. package/components/ion-toast.js +819 -464
  190. package/components/ion-toggle.d.ts +2 -2
  191. package/components/ion-toggle.js +243 -241
  192. package/components/ion-toolbar.d.ts +2 -2
  193. package/components/ion-toolbar.js +71 -71
  194. package/components/ionic-global.js +163 -163
  195. package/components/ios.transition.js +598 -598
  196. package/components/item.js +301 -301
  197. package/components/keyboard-controller.js +128 -128
  198. package/components/keyboard.js +62 -62
  199. package/components/keyboard2.js +59 -59
  200. package/components/label.js +85 -85
  201. package/components/list-header.js +33 -33
  202. package/components/list.js +50 -50
  203. package/components/lock-controller.js +24 -24
  204. package/components/md.transition.js +44 -44
  205. package/components/menu-toggle-util.js +2 -2
  206. package/components/notch-controller.js +120 -120
  207. package/components/note.js +29 -29
  208. package/components/overlays.js +496 -495
  209. package/components/picker-column-internal.js +350 -345
  210. package/components/picker-column.js +334 -334
  211. package/components/picker-internal.js +468 -468
  212. package/components/popover.js +1154 -1144
  213. package/components/radio-group.js +161 -159
  214. package/components/radio.js +248 -208
  215. package/components/ripple-effect.js +81 -81
  216. package/components/select-popover.js +163 -163
  217. package/components/spinner.js +182 -182
  218. package/components/status-tap.js +26 -26
  219. package/components/swipe-back.js +65 -65
  220. package/components/theme.js +23 -23
  221. package/components/watch-options.js +30 -30
  222. package/css/core.css +66 -8
  223. package/css/core.css.map +1 -1
  224. package/css/display.css +44 -0
  225. package/css/display.css.map +1 -1
  226. package/css/float-elements.css +44 -0
  227. package/css/float-elements.css.map +1 -1
  228. package/css/global.bundle.css +88 -0
  229. package/css/global.bundle.css.map +1 -1
  230. package/css/ionic-swiper.css +22 -0
  231. package/css/ionic-swiper.css.map +1 -1
  232. package/css/ionic.bundle.css +1 -1
  233. package/css/ionic.bundle.css.map +1 -1
  234. package/css/padding.css +44 -0
  235. package/css/padding.css.map +1 -1
  236. package/css/structure.css +44 -0
  237. package/css/structure.css.map +1 -1
  238. package/css/text-alignment.css +44 -0
  239. package/css/text-alignment.css.map +1 -1
  240. package/css/text-transformation.css +44 -0
  241. package/css/text-transformation.css.map +1 -1
  242. package/css/typography.css +44 -0
  243. package/css/typography.css.map +1 -1
  244. package/css/utils.bundle.css +220 -0
  245. package/css/utils.bundle.css.map +1 -1
  246. package/dist/cjs/animation-9b401d39.js +1062 -0
  247. package/dist/cjs/{app-globals-1d4c1dbf.js → app-globals-7def22c8.js} +1 -1
  248. package/dist/cjs/button-active-962fe442.js +69 -0
  249. package/dist/cjs/{capacitor-2ffba62a.js → capacitor-c04564bf.js} +5 -5
  250. package/dist/cjs/compare-with-utils-df1001d7.js +44 -0
  251. package/dist/cjs/config-4f60b98a.js +199 -0
  252. package/dist/cjs/cubic-bezier-f2dccc53.js +92 -0
  253. package/dist/cjs/data-a5109f09.js +1672 -0
  254. package/dist/cjs/{dir-f1e0ca26.js → dir-94c21456.js} +5 -5
  255. package/dist/cjs/focus-visible-7a0ce04f.js +77 -0
  256. package/dist/cjs/form-controller-7d42a722.js +66 -0
  257. package/dist/cjs/framework-delegate-1c29b14a.js +144 -0
  258. package/dist/cjs/gesture-controller-c40c045a.js +197 -0
  259. package/dist/cjs/haptic-b882e0bb.js +212 -0
  260. package/dist/cjs/hardware-back-button-76833cac.js +76 -0
  261. package/dist/cjs/helpers-76bb7efb.js +441 -0
  262. package/dist/cjs/index-17ab7794.js +243 -0
  263. package/dist/cjs/index-3b012034.js +308 -0
  264. package/dist/cjs/{index-c2940dc1.js → index-50dcfe2f.js} +79 -15
  265. package/dist/cjs/{index-cc7dfb7c.js → index-5915f9b3.js} +3 -3
  266. package/dist/cjs/index-b4f986cd.js +198 -0
  267. package/dist/cjs/index-c8d52405.js +10 -0
  268. package/dist/cjs/index-d1b59ffa.js +459 -0
  269. package/dist/cjs/{index-da2c7a37.js → index-da15e99c.js} +60 -60
  270. package/dist/cjs/index.cjs.js +113 -113
  271. package/dist/cjs/input-shims-a23bb0f4.js +601 -0
  272. package/dist/cjs/input.utils-3d0166a2.js +138 -0
  273. package/dist/cjs/ion-accordion_2.cjs.entry.js +488 -488
  274. package/dist/cjs/ion-action-sheet.cjs.entry.js +260 -250
  275. package/dist/cjs/ion-alert.cjs.entry.js +442 -432
  276. package/dist/cjs/ion-app_8.cjs.entry.js +1151 -1151
  277. package/dist/cjs/ion-avatar_3.cjs.entry.js +29 -29
  278. package/dist/cjs/ion-back-button.cjs.entry.js +73 -73
  279. package/dist/cjs/ion-backdrop.cjs.entry.js +40 -40
  280. package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +194 -194
  281. package/dist/cjs/ion-button_2.cjs.entry.js +303 -303
  282. package/dist/cjs/ion-card_5.cjs.entry.js +105 -105
  283. package/dist/cjs/ion-checkbox.cjs.entry.js +149 -147
  284. package/dist/cjs/ion-chip.cjs.entry.js +20 -20
  285. package/dist/cjs/ion-col_3.cjs.entry.js +136 -136
  286. package/dist/cjs/ion-datetime-button.cjs.entry.js +325 -325
  287. package/dist/cjs/ion-datetime_3.cjs.entry.js +2204 -2162
  288. package/dist/cjs/ion-fab_3.cjs.entry.js +150 -150
  289. package/dist/cjs/ion-img.cjs.entry.js +79 -79
  290. package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +198 -190
  291. package/dist/cjs/ion-input.cjs.entry.js +443 -399
  292. package/dist/cjs/ion-item-option_3.cjs.entry.js +457 -457
  293. package/dist/cjs/ion-item_8.cjs.entry.js +441 -428
  294. package/dist/cjs/ion-loading.cjs.entry.js +220 -210
  295. package/dist/cjs/ion-menu_3.cjs.entry.js +670 -670
  296. package/dist/cjs/ion-modal.cjs.entry.js +1415 -1405
  297. package/dist/cjs/ion-nav_2.cjs.entry.js +904 -904
  298. package/dist/cjs/ion-picker-column-internal.cjs.entry.js +331 -327
  299. package/dist/cjs/ion-picker-internal.cjs.entry.js +453 -453
  300. package/dist/cjs/ion-popover.cjs.entry.js +1108 -1098
  301. package/dist/cjs/ion-progress-bar.cjs.entry.js +40 -40
  302. package/dist/cjs/ion-radio_2.cjs.entry.js +321 -316
  303. package/dist/cjs/ion-range.cjs.entry.js +558 -556
  304. package/dist/cjs/ion-refresher_2.cjs.entry.js +786 -786
  305. package/dist/cjs/ion-reorder_2.cjs.entry.js +267 -267
  306. package/dist/cjs/ion-ripple-effect.cjs.entry.js +66 -66
  307. package/dist/cjs/ion-route_4.cjs.entry.js +693 -693
  308. package/dist/cjs/ion-searchbar.cjs.entry.js +360 -358
  309. package/dist/cjs/ion-segment_2.cjs.entry.js +507 -507
  310. package/dist/cjs/ion-select_3.cjs.entry.js +784 -768
  311. package/dist/cjs/ion-spinner.cjs.entry.js +46 -46
  312. package/dist/cjs/ion-split-pane.cjs.entry.js +119 -119
  313. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +138 -138
  314. package/dist/cjs/ion-tab_2.cjs.entry.js +187 -187
  315. package/dist/cjs/ion-text.cjs.entry.js +13 -13
  316. package/dist/cjs/ion-textarea.cjs.entry.js +401 -353
  317. package/dist/cjs/ion-toast.cjs.entry.js +771 -419
  318. package/dist/cjs/ion-toggle.cjs.entry.js +227 -225
  319. package/dist/cjs/ionic-global-a4edbf03.js +230 -0
  320. package/dist/cjs/ionic.cjs.js +5 -5
  321. package/dist/cjs/ios.transition-b5353f3e.js +654 -0
  322. package/dist/cjs/keyboard-0272231f.js +81 -0
  323. package/dist/cjs/{keyboard-38f2bb7b.js → keyboard-af1bb365.js} +62 -62
  324. package/dist/cjs/keyboard-controller-c05e747a.js +167 -0
  325. package/dist/cjs/loader.cjs.js +4 -4
  326. package/dist/cjs/lock-controller-6585a42a.js +40 -0
  327. package/dist/cjs/md.transition-67157dd9.js +59 -0
  328. package/dist/cjs/notch-controller-9735e7ac.js +155 -0
  329. package/dist/cjs/overlays-e77cc023.js +716 -0
  330. package/dist/cjs/spinner-configs-282fd50a.js +147 -0
  331. package/dist/cjs/status-tap-b5d77c08.js +42 -0
  332. package/dist/cjs/swipe-back-e37a1a5c.js +81 -0
  333. package/dist/cjs/theme-d1c573d2.js +48 -0
  334. package/dist/cjs/watch-options-f5f3e158.js +49 -0
  335. package/dist/collection/collection-manifest.json +7 -7
  336. package/dist/collection/components/accordion/accordion.ios.css +44 -0
  337. package/dist/collection/components/accordion/accordion.js +410 -410
  338. package/dist/collection/components/accordion/accordion.md.css +22 -0
  339. package/dist/collection/components/accordion/test/a11y/accordion.e2e.js +31 -31
  340. package/dist/collection/components/accordion/test/accordion.e2e.js +24 -24
  341. package/dist/collection/components/accordion/test/accordion.spec.js +195 -0
  342. package/dist/collection/components/accordion/test/basic/accordion.e2e.js +26 -26
  343. package/dist/collection/components/accordion/test/multiple/accordion.e2e.js +18 -18
  344. package/dist/collection/components/accordion/test/nested/accordion.e2e.js +16 -16
  345. package/dist/collection/components/accordion/test/standalone/accordion.e2e.js +6 -6
  346. package/dist/collection/components/accordion-group/accordion-group.ios.css +44 -0
  347. package/dist/collection/components/accordion-group/accordion-group.js +421 -421
  348. package/dist/collection/components/accordion-group/accordion-group.md.css +66 -0
  349. package/dist/collection/components/action-sheet/action-sheet.ios.css +44 -0
  350. package/dist/collection/components/action-sheet/action-sheet.js +739 -729
  351. package/dist/collection/components/action-sheet/action-sheet.md.css +44 -0
  352. package/dist/collection/components/action-sheet/animations/ios.enter.js +18 -18
  353. package/dist/collection/components/action-sheet/animations/ios.leave.js +12 -12
  354. package/dist/collection/components/action-sheet/animations/md.enter.js +18 -18
  355. package/dist/collection/components/action-sheet/animations/md.leave.js +12 -12
  356. package/dist/collection/components/action-sheet/test/a11y/action-sheet.e2e.js +59 -59
  357. package/dist/collection/components/action-sheet/test/action-sheet-id.spec.js +32 -0
  358. package/dist/collection/components/action-sheet/test/basic/action-sheet-rendering.e2e.js +33 -33
  359. package/dist/collection/components/action-sheet/test/basic/action-sheet.e2e.js +74 -74
  360. package/dist/collection/components/action-sheet/test/basic/action-sheet.spec.js +18 -0
  361. package/dist/collection/components/action-sheet/test/basic/fixture.js +23 -23
  362. package/dist/collection/components/action-sheet/test/is-open/action-sheet.e2e.js +25 -25
  363. package/dist/collection/components/action-sheet/test/translucent/action-sheet.e2e.js +10 -10
  364. package/dist/collection/components/action-sheet/test/trigger/action-sheet.e2e.js +21 -21
  365. package/dist/collection/components/alert/alert.ios.css +85 -1
  366. package/dist/collection/components/alert/alert.js +977 -967
  367. package/dist/collection/components/alert/alert.md.css +115 -3
  368. package/dist/collection/components/alert/animations/ios.enter.js +19 -19
  369. package/dist/collection/components/alert/animations/ios.leave.js +13 -13
  370. package/dist/collection/components/alert/animations/md.enter.js +19 -19
  371. package/dist/collection/components/alert/animations/md.leave.js +10 -10
  372. package/dist/collection/components/alert/test/a11y/alert.e2e.js +116 -116
  373. package/dist/collection/components/alert/test/alert-id.spec.js +32 -0
  374. package/dist/collection/components/alert/test/alert.spec.js +37 -0
  375. package/dist/collection/components/alert/test/basic/alert-tablet.e2e.js +40 -0
  376. package/dist/collection/components/alert/test/basic/alert.e2e.js +96 -96
  377. package/dist/collection/components/alert/test/is-open/alert.e2e.js +25 -25
  378. package/dist/collection/components/alert/test/standalone/alert.e2e.js +9 -9
  379. package/dist/collection/components/alert/test/trigger/alert.e2e.js +21 -21
  380. package/dist/collection/components/app/app.js +116 -116
  381. package/dist/collection/components/app/test/safe-area/app.e2e.js +24 -24
  382. package/dist/collection/components/avatar/avatar.ios.css +44 -0
  383. package/dist/collection/components/avatar/avatar.js +17 -17
  384. package/dist/collection/components/avatar/avatar.md.css +44 -0
  385. package/dist/collection/components/avatar/test/basic/avatar.e2e.js +12 -12
  386. package/dist/collection/components/back-button/back-button.ios.css +44 -0
  387. package/dist/collection/components/back-button/back-button.js +214 -214
  388. package/dist/collection/components/back-button/back-button.md.css +44 -0
  389. package/dist/collection/components/back-button/test/a11y/back-button.e2e.js +6 -6
  390. package/dist/collection/components/back-button/test/back-button.spec.js +86 -0
  391. package/dist/collection/components/back-button/test/basic/back-button.e2e.js +6 -6
  392. package/dist/collection/components/back-button/test/toolbar/back-button.e2e.js +6 -6
  393. package/dist/collection/components/backdrop/backdrop.ios.css +44 -0
  394. package/dist/collection/components/backdrop/backdrop.js +131 -131
  395. package/dist/collection/components/backdrop/backdrop.md.css +44 -0
  396. package/dist/collection/components/badge/badge.ios.css +44 -0
  397. package/dist/collection/components/badge/badge.js +49 -49
  398. package/dist/collection/components/badge/badge.md.css +44 -0
  399. package/dist/collection/components/badge/test/a11y/badge.e2e.js +6 -6
  400. package/dist/collection/components/badge/test/basic/badge.e2e.js +6 -6
  401. package/dist/collection/components/breadcrumb/breadcrumb.ios.css +44 -0
  402. package/dist/collection/components/breadcrumb/breadcrumb.js +395 -395
  403. package/dist/collection/components/breadcrumb/breadcrumb.md.css +44 -0
  404. package/dist/collection/components/breadcrumb/test/aria.spec.js +22 -0
  405. package/dist/collection/components/breadcrumbs/breadcrumbs.ios.css +22 -0
  406. package/dist/collection/components/breadcrumbs/breadcrumbs.js +247 -247
  407. package/dist/collection/components/breadcrumbs/breadcrumbs.md.css +22 -0
  408. package/dist/collection/components/breadcrumbs/test/a11y/breadcrumbs.e2e.js +12 -12
  409. package/dist/collection/components/breadcrumbs/test/basic/breadcrumbs.e2e.js +6 -6
  410. package/dist/collection/components/breadcrumbs/test/breadcrumbs.spec.js +58 -0
  411. package/dist/collection/components/breadcrumbs/test/collapsed/breadcrumbs.e2e.js +6 -6
  412. package/dist/collection/components/breadcrumbs/test/reactive/breadcrumbs.e2e.js +43 -43
  413. package/dist/collection/components/button/button.ios.css +66 -0
  414. package/dist/collection/components/button/button.js +541 -541
  415. package/dist/collection/components/button/button.md.css +44 -0
  416. package/dist/collection/components/button/test/a11y/button.e2e.js +21 -21
  417. package/dist/collection/components/button/test/basic/button.e2e.js +32 -32
  418. package/dist/collection/components/button/test/clear/button.e2e.js +6 -6
  419. package/dist/collection/components/button/test/expand/button.e2e.js +6 -6
  420. package/dist/collection/components/button/test/form-reference/button.e2e.js +84 -84
  421. package/dist/collection/components/button/test/form-reference/button.spec.js +26 -0
  422. package/dist/collection/components/button/test/icon/button.e2e.js +6 -6
  423. package/dist/collection/components/button/test/outline/button.e2e.js +6 -6
  424. package/dist/collection/components/button/test/round/button.e2e.js +6 -6
  425. package/dist/collection/components/button/test/size/button.e2e.js +22 -22
  426. package/dist/collection/components/button/test/strong/button.e2e.js +22 -22
  427. package/dist/collection/components/button/test/wrap/button.e2e.js +73 -73
  428. package/dist/collection/components/buttons/buttons.ios.css +66 -0
  429. package/dist/collection/components/buttons/buttons.js +46 -46
  430. package/dist/collection/components/buttons/buttons.md.css +66 -0
  431. package/dist/collection/components/buttons/test/a11y/buttons.e2e.js +21 -21
  432. package/dist/collection/components/card/card.ios.css +44 -0
  433. package/dist/collection/components/card/card.js +251 -251
  434. package/dist/collection/components/card/card.md.css +44 -0
  435. package/dist/collection/components/card/test/a11y/card.e2e.js +6 -6
  436. package/dist/collection/components/card/test/aria.spec.js +16 -0
  437. package/dist/collection/components/card/test/basic/card.e2e.js +38 -38
  438. package/dist/collection/components/card-content/card-content.ios.css +44 -0
  439. package/dist/collection/components/card-content/card-content.js +21 -21
  440. package/dist/collection/components/card-content/card-content.md.css +44 -0
  441. package/dist/collection/components/card-header/card-header.ios.css +44 -0
  442. package/dist/collection/components/card-header/card-header.js +70 -70
  443. package/dist/collection/components/card-header/card-header.md.css +44 -0
  444. package/dist/collection/components/card-header/test/basic/card-header.e2e.js +6 -6
  445. package/dist/collection/components/card-subtitle/card-subtitle.ios.css +44 -0
  446. package/dist/collection/components/card-subtitle/card-subtitle.js +50 -50
  447. package/dist/collection/components/card-subtitle/card-subtitle.md.css +44 -0
  448. package/dist/collection/components/card-title/card-title.ios.css +44 -0
  449. package/dist/collection/components/card-title/card-title.js +50 -50
  450. package/dist/collection/components/card-title/card-title.md.css +44 -0
  451. package/dist/collection/components/checkbox/checkbox.ios.css +66 -6
  452. package/dist/collection/components/checkbox/checkbox.js +418 -415
  453. package/dist/collection/components/checkbox/checkbox.md.css +66 -6
  454. package/dist/collection/components/checkbox/test/a11y/checkbox.e2e.js +14 -14
  455. package/dist/collection/components/checkbox/test/basic/checkbox.e2e.js +50 -50
  456. package/dist/collection/components/checkbox/test/checkbox.spec.js +34 -0
  457. package/dist/collection/components/checkbox/test/color/checkbox.e2e.js +11 -11
  458. package/dist/collection/components/checkbox/test/indeterminate/checkbox.e2e.js +6 -6
  459. package/dist/collection/components/checkbox/test/item/checkbox.e2e.js +29 -29
  460. package/dist/collection/components/checkbox/test/label/checkbox.e2e.js +75 -75
  461. package/dist/collection/components/checkbox/test/legacy/basic/checkbox.e2e.js +45 -45
  462. package/dist/collection/components/checkbox/test/legacy/indeterminate/checkbox.e2e.js +6 -6
  463. package/dist/collection/components/checkbox/test/states/checkbox.e2e.js +21 -21
  464. package/dist/collection/components/chip/chip.ios.css +22 -0
  465. package/dist/collection/components/chip/chip.js +90 -90
  466. package/dist/collection/components/chip/chip.md.css +22 -0
  467. package/dist/collection/components/chip/test/a11y/chip.e2e.js +19 -19
  468. package/dist/collection/components/chip/test/basic/chip.e2e.js +42 -42
  469. package/dist/collection/components/chip/test/states/chip.e2e.js +14 -14
  470. package/dist/collection/components/col/col.css +66 -0
  471. package/dist/collection/components/col/col.js +536 -536
  472. package/dist/collection/components/content/content.css +22 -0
  473. package/dist/collection/components/content/content.js +745 -745
  474. package/dist/collection/components/content/test/basic/content.e2e.js +6 -6
  475. package/dist/collection/components/content/test/fixed/content.e2e.js +6 -6
  476. package/dist/collection/components/content/test/fullscreen/content.e2e.js +6 -6
  477. package/dist/collection/components/content/test/standalone/content.e2e.js +5 -5
  478. package/dist/collection/components/datetime/datetime.ios.css +45 -0
  479. package/dist/collection/components/datetime/datetime.js +2264 -2232
  480. package/dist/collection/components/datetime/datetime.md.css +45 -0
  481. package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +58 -58
  482. package/dist/collection/components/datetime/test/a11y/datetime.spec.js +43 -0
  483. package/dist/collection/components/datetime/test/basic/datetime.e2e.js +241 -241
  484. package/dist/collection/components/datetime/test/color/datetime.e2e.js +9 -9
  485. package/dist/collection/components/datetime/test/comparison.spec.js +43 -0
  486. package/dist/collection/components/datetime/test/custom/datetime.e2e.js +37 -37
  487. package/dist/collection/components/datetime/test/data.spec.js +456 -0
  488. package/dist/collection/components/datetime/test/datetime.e2e.js +29 -29
  489. package/dist/collection/components/datetime/test/disable-dates/datetime.e2e.js +119 -119
  490. package/dist/collection/components/datetime/test/disabled/datetime.e2e.js +43 -43
  491. package/dist/collection/components/datetime/test/disabled/datetime.spec.js +33 -0
  492. package/dist/collection/components/datetime/test/display/datetime.e2e.js +86 -86
  493. package/dist/collection/components/datetime/test/first-day-of-week/datetime.e2e.js +6 -6
  494. package/dist/collection/components/datetime/test/format.spec.js +124 -0
  495. package/dist/collection/components/datetime/test/helpers.spec.js +72 -0
  496. package/dist/collection/components/datetime/test/highlighted-dates/datetime.e2e.js +76 -76
  497. package/dist/collection/components/datetime/test/hour-cycle/datetime.e2e.js +21 -21
  498. package/dist/collection/components/datetime/test/locale/datetime.e2e.js +98 -98
  499. package/dist/collection/components/datetime/test/manipulation.spec.js +565 -0
  500. package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +178 -178
  501. package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +17 -17
  502. package/dist/collection/components/datetime/test/multiple/datetime.e2e.js +170 -170
  503. package/dist/collection/components/datetime/test/parse.spec.js +222 -0
  504. package/dist/collection/components/datetime/test/position/datetime.e2e.js +14 -14
  505. package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +263 -263
  506. package/dist/collection/components/datetime/test/prefer-wheel/datetime.spec.js +27 -0
  507. package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +137 -137
  508. package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +86 -86
  509. package/dist/collection/components/datetime/test/set-value/datetime.e2e.js +40 -40
  510. package/dist/collection/components/datetime/test/state.spec.js +114 -0
  511. package/dist/collection/components/datetime/test/time-label/datetime.e2e.js +13 -13
  512. package/dist/collection/components/datetime/test/values/datetime.e2e.js +77 -77
  513. package/dist/collection/components/datetime/utils/comparison.js +22 -22
  514. package/dist/collection/components/datetime/utils/data.js +394 -394
  515. package/dist/collection/components/datetime/utils/format.js +143 -143
  516. package/dist/collection/components/datetime/utils/helpers.js +74 -74
  517. package/dist/collection/components/datetime/utils/manipulation.js +332 -282
  518. package/dist/collection/components/datetime/utils/parse.js +139 -139
  519. package/dist/collection/components/datetime/utils/state.js +123 -123
  520. package/dist/collection/components/datetime-button/datetime-button.css +22 -0
  521. package/dist/collection/components/datetime-button/datetime-button.js +399 -399
  522. package/dist/collection/components/datetime-button/test/a11y/datetime-button.e2e.js +11 -11
  523. package/dist/collection/components/datetime-button/test/basic/datetime-button.e2e.js +123 -123
  524. package/dist/collection/components/datetime-button/test/disabled/datetime-button.e2e.js +13 -13
  525. package/dist/collection/components/datetime-button/test/multiple/datetime-button.e2e.js +38 -38
  526. package/dist/collection/components/datetime-button/test/overlays/datetime-button.e2e.js +102 -102
  527. package/dist/collection/components/fab/fab.css +88 -0
  528. package/dist/collection/components/fab/fab.js +179 -179
  529. package/dist/collection/components/fab/test/basic/fab.e2e.js +50 -50
  530. package/dist/collection/components/fab/test/custom-size/fab.e2e.js +6 -6
  531. package/dist/collection/components/fab/test/safe-area/fab.e2e.js +25 -25
  532. package/dist/collection/components/fab/test/states/fab.e2e.js +6 -6
  533. package/dist/collection/components/fab/test/translucent/fab.e2e.js +17 -17
  534. package/dist/collection/components/fab-button/fab-button.ios.css +44 -0
  535. package/dist/collection/components/fab-button/fab-button.js +374 -374
  536. package/dist/collection/components/fab-button/fab-button.md.css +44 -0
  537. package/dist/collection/components/fab-button/test/a11y/fab-button.e2e.js +6 -6
  538. package/dist/collection/components/fab-list/fab-list.css +44 -0
  539. package/dist/collection/components/fab-list/fab-list.js +79 -79
  540. package/dist/collection/components/footer/footer.ios.css +44 -0
  541. package/dist/collection/components/footer/footer.js +135 -135
  542. package/dist/collection/components/footer/footer.md.css +44 -0
  543. package/dist/collection/components/footer/footer.utils.js +25 -25
  544. package/dist/collection/components/footer/test/basic/footer.e2e.js +18 -18
  545. package/dist/collection/components/footer/test/fade/footer.e2e.js +10 -10
  546. package/dist/collection/components/footer/test/scroll-target/footer.e2e.js +15 -15
  547. package/dist/collection/components/footer/test/with-tabs/footer.e2e.js +6 -6
  548. package/dist/collection/components/grid/grid.css +66 -0
  549. package/dist/collection/components/grid/grid.js +44 -44
  550. package/dist/collection/components/grid/test/basic/grid.e2e.js +6 -6
  551. package/dist/collection/components/grid/test/offsets/grid.e2e.js +6 -6
  552. package/dist/collection/components/grid/test/padding/grid.e2e.js +6 -6
  553. package/dist/collection/components/grid/test/sizes/grid.e2e.js +6 -6
  554. package/dist/collection/components/header/header.ios.css +44 -0
  555. package/dist/collection/components/header/header.js +181 -181
  556. package/dist/collection/components/header/header.md.css +44 -0
  557. package/dist/collection/components/header/header.utils.js +148 -148
  558. package/dist/collection/components/header/test/a11y/header.e2e.js +18 -18
  559. package/dist/collection/components/header/test/basic/header.e2e.js +23 -23
  560. package/dist/collection/components/header/test/condense/header.e2e.js +25 -25
  561. package/dist/collection/components/header/test/fade/header.e2e.js +10 -10
  562. package/dist/collection/components/header/test/scroll-target/header.e2e.js +15 -15
  563. package/dist/collection/components/icon/test/basic/icon.e2e.js +6 -6
  564. package/dist/collection/components/icon/test/dir/icon.e2e.js +11 -11
  565. package/dist/collection/components/img/img.js +177 -177
  566. package/dist/collection/components/img/test/basic/img.e2e.js +62 -62
  567. package/dist/collection/components/img/test/draggable/img.e2e.js +10 -10
  568. package/dist/collection/components/infinite-scroll/infinite-scroll.js +279 -271
  569. package/dist/collection/components/infinite-scroll/test/basic/infinite-scroll.e2e.js +11 -11
  570. package/dist/collection/components/infinite-scroll/test/scroll-target/infinite-scroll.e2e.js +11 -11
  571. package/dist/collection/components/infinite-scroll/test/small-dom-update/infinite-scroll.e2e.js +31 -0
  572. package/dist/collection/components/infinite-scroll/test/top/infinite-scroll.e2e.js +11 -11
  573. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.ios.css +44 -0
  574. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +86 -86
  575. package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.md.css +44 -0
  576. package/dist/collection/components/infinite-scroll-content/test/infinite-scroll-content.spec.js +37 -0
  577. package/dist/collection/components/input/input.ios.css +76 -3
  578. package/dist/collection/components/input/input.js +1250 -1204
  579. package/dist/collection/components/input/input.md.css +145 -12
  580. package/dist/collection/components/input/input.utils.js +22 -22
  581. package/dist/collection/components/input/test/a11y/input.e2e.js +12 -12
  582. package/dist/collection/components/input/test/basic/input.e2e.js +63 -63
  583. package/dist/collection/components/input/test/bottom-content/input.e2e.js +89 -89
  584. package/dist/collection/components/input/test/card/input.e2e.js +6 -6
  585. package/dist/collection/components/input/test/clear-on-edit/input.e2e.js +45 -25
  586. package/dist/collection/components/input/test/color/input.e2e.js +88 -88
  587. package/dist/collection/components/input/test/fill/input.e2e.js +63 -63
  588. package/dist/collection/components/input/test/highlight/input.e2e.js +52 -52
  589. package/dist/collection/components/input/test/input.e2e.js +6 -6
  590. package/dist/collection/components/input/test/input.spec.js +85 -0
  591. package/dist/collection/components/input/test/item/input.e2e.js +11 -11
  592. package/dist/collection/components/input/test/item/input.spec.js +24 -0
  593. package/dist/collection/components/input/test/label-placement/input.e2e.js +104 -104
  594. package/dist/collection/components/input/test/legacy/a11y/input.e2e.js +15 -15
  595. package/dist/collection/components/input/test/legacy/basic/input.e2e.js +102 -102
  596. package/dist/collection/components/input/test/legacy/clear-on-edit/input.e2e.js +44 -44
  597. package/dist/collection/components/input/test/legacy/input-events.e2e.js +56 -56
  598. package/dist/collection/components/input/test/legacy/masking/input.e2e.js +15 -15
  599. package/dist/collection/components/input/test/legacy/spec/input.e2e.js +8 -8
  600. package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
  601. package/dist/collection/components/input/test/states/input.e2e.js +11 -11
  602. package/dist/collection/components/item/item.ios.css +85 -3
  603. package/dist/collection/components/item/item.js +614 -614
  604. package/dist/collection/components/item/item.md.css +129 -3
  605. package/dist/collection/components/item/test/a11y/item.e2e.js +47 -47
  606. package/dist/collection/components/item/test/a11y/item.spec.js +48 -0
  607. package/dist/collection/components/item/test/alignment/item.e2e.js +6 -6
  608. package/dist/collection/components/item/test/basic/item.e2e.js +16 -16
  609. package/dist/collection/components/item/test/buttons/item.e2e.js +18 -18
  610. package/dist/collection/components/item/test/colors/item.e2e.js +6 -6
  611. package/dist/collection/components/item/test/counter/item.e2e.js +34 -34
  612. package/dist/collection/components/item/test/css-variables/item.e2e.js +6 -6
  613. package/dist/collection/components/item/test/disabled/item.e2e.js +6 -7
  614. package/dist/collection/components/item/test/dividers/item.e2e.js +6 -6
  615. package/dist/collection/components/item/test/groups/item.e2e.js +8 -8
  616. package/dist/collection/components/item/test/highlight/item.e2e.js +6 -6
  617. package/dist/collection/components/item/test/icons/item.e2e.js +6 -6
  618. package/dist/collection/components/item/test/images/item.e2e.js +6 -6
  619. package/dist/collection/components/item/test/inputs/item.e2e.js +139 -139
  620. package/dist/collection/components/item/test/legacy/alignment/item.e2e.js +6 -6
  621. package/dist/collection/components/item/test/legacy/disabled/item.e2e.js +6 -6
  622. package/dist/collection/components/item/test/legacy/fill/item.e2e.js +6 -6
  623. package/dist/collection/components/item/test/legacy/form/item.e2e.js +6 -6
  624. package/dist/collection/components/item/test/lines/item.e2e.js +6 -6
  625. package/dist/collection/components/item/test/media/item.e2e.js +6 -6
  626. package/dist/collection/components/item/test/reorder/item.e2e.js +8 -8
  627. package/dist/collection/components/item/test/slotted-inputs/item.e2e.js +6 -6
  628. package/dist/collection/components/item/test/states/item.e2e.js +6 -6
  629. package/dist/collection/components/item-divider/item-divider.ios.css +66 -0
  630. package/dist/collection/components/item-divider/item-divider.js +71 -71
  631. package/dist/collection/components/item-divider/item-divider.md.css +66 -0
  632. package/dist/collection/components/item-divider/test/a11y/item-divider.e2e.js +11 -11
  633. package/dist/collection/components/item-divider/test/basic/item-divider.e2e.js +25 -25
  634. package/dist/collection/components/item-divider/test/spec/item-divider.e2e.js +8 -8
  635. package/dist/collection/components/item-group/item-group.ios.css +44 -0
  636. package/dist/collection/components/item-group/item-group.js +22 -22
  637. package/dist/collection/components/item-group/item-group.md.css +44 -0
  638. package/dist/collection/components/item-option/item-option.ios.css +44 -0
  639. package/dist/collection/components/item-option/item-option.js +197 -197
  640. package/dist/collection/components/item-option/item-option.md.css +44 -0
  641. package/dist/collection/components/item-options/item-options.ios.css +66 -0
  642. package/dist/collection/components/item-options/item-options.js +110 -110
  643. package/dist/collection/components/item-options/item-options.md.css +66 -0
  644. package/dist/collection/components/item-sliding/item-sliding.css +22 -0
  645. package/dist/collection/components/item-sliding/item-sliding.js +538 -538
  646. package/dist/collection/components/item-sliding/test/a11y/item-sliding.e2e.js +5 -5
  647. package/dist/collection/components/item-sliding/test/async/item-sliding.e2e.js +25 -25
  648. package/dist/collection/components/item-sliding/test/basic/item-sliding.e2e.js +87 -87
  649. package/dist/collection/components/item-sliding/test/icons/item-sliding.e2e.js +20 -20
  650. package/dist/collection/components/item-sliding/test/scroll-target/item-sliding.e2e.js +18 -18
  651. package/dist/collection/components/item-sliding/test/test.utils.js +20 -20
  652. package/dist/collection/components/label/label.ios.css +80 -3
  653. package/dist/collection/components/label/label.js +174 -174
  654. package/dist/collection/components/label/label.md.css +80 -3
  655. package/dist/collection/components/label/test/a11y/label.e2e.js +21 -21
  656. package/dist/collection/components/label/test/basic/label.e2e.js +21 -21
  657. package/dist/collection/components/label/test/color/label.e2e.js +21 -21
  658. package/dist/collection/components/label/test/headings/label.e2e.js +5 -5
  659. package/dist/collection/components/list/list.ios.css +66 -0
  660. package/dist/collection/components/list/list.js +101 -101
  661. package/dist/collection/components/list/list.md.css +66 -0
  662. package/dist/collection/components/list/test/a11y/list.e2e.js +6 -6
  663. package/dist/collection/components/list/test/basic/list.e2e.js +6 -6
  664. package/dist/collection/components/list/test/inset/list.e2e.js +16 -16
  665. package/dist/collection/components/list/test/lines/list.e2e.js +40 -40
  666. package/dist/collection/components/list-header/list-header.ios.css +66 -0
  667. package/dist/collection/components/list-header/list-header.js +69 -69
  668. package/dist/collection/components/list-header/list-header.md.css +66 -0
  669. package/dist/collection/components/list-header/test/a11y/list-header.e2e.js +6 -6
  670. package/dist/collection/components/list-header/test/basic/list-header.e2e.js +14 -14
  671. package/dist/collection/components/loading/animations/ios.enter.js +19 -19
  672. package/dist/collection/components/loading/animations/ios.leave.js +13 -13
  673. package/dist/collection/components/loading/animations/md.enter.js +19 -19
  674. package/dist/collection/components/loading/animations/md.leave.js +13 -13
  675. package/dist/collection/components/loading/loading.ios.css +44 -0
  676. package/dist/collection/components/loading/loading.js +730 -720
  677. package/dist/collection/components/loading/loading.md.css +44 -0
  678. package/dist/collection/components/loading/test/a11y/loading.e2e.js +26 -26
  679. package/dist/collection/components/loading/test/basic/loading.e2e.js +60 -60
  680. package/dist/collection/components/loading/test/basic/loading.spec.js +16 -0
  681. package/dist/collection/components/loading/test/is-open/loading.e2e.js +17 -17
  682. package/dist/collection/components/loading/test/loading-id.spec.js +32 -0
  683. package/dist/collection/components/loading/test/loading.spec.js +37 -0
  684. package/dist/collection/components/loading/test/standalone/loading.e2e.js +13 -13
  685. package/dist/collection/components/loading/test/trigger/loading.e2e.js +21 -21
  686. package/dist/collection/components/menu/menu.ios.css +47 -4
  687. package/dist/collection/components/menu/menu.js +956 -956
  688. package/dist/collection/components/menu/menu.md.css +47 -4
  689. package/dist/collection/components/menu/test/a11y/menu.e2e.js +13 -13
  690. package/dist/collection/components/menu/test/basic/menu.e2e.js +102 -102
  691. package/dist/collection/components/menu/test/custom/menu.e2e.js +61 -0
  692. package/dist/collection/components/menu/test/disable/menu.e2e.js +44 -44
  693. package/dist/collection/components/menu/test/focus-trap/menu.e2e.js +61 -61
  694. package/dist/collection/components/menu/test/multiple/menu.e2e.js +49 -49
  695. package/dist/collection/components/menu/test/safe-area/menu.e2e.js +54 -54
  696. package/dist/collection/components/menu-button/menu-button.ios.css +44 -0
  697. package/dist/collection/components/menu-button/menu-button.js +173 -173
  698. package/dist/collection/components/menu-button/menu-button.md.css +44 -0
  699. package/dist/collection/components/menu-button/test/a11y/menu-button.e2e.js +12 -12
  700. package/dist/collection/components/menu-button/test/async/menu-button.e2e.js +12 -12
  701. package/dist/collection/components/menu-button/test/basic/menu-button.e2e.js +6 -6
  702. package/dist/collection/components/menu-toggle/menu-toggle-util.js +2 -2
  703. package/dist/collection/components/menu-toggle/menu-toggle.js +93 -93
  704. package/dist/collection/components/menu-toggle/test/basic/menu-toggle.e2e.js +33 -33
  705. package/dist/collection/components/modal/animations/ios.enter.js +81 -81
  706. package/dist/collection/components/modal/animations/ios.leave.js +74 -74
  707. package/dist/collection/components/modal/animations/md.enter.js +21 -21
  708. package/dist/collection/components/modal/animations/md.leave.js +15 -15
  709. package/dist/collection/components/modal/animations/sheet.js +43 -43
  710. package/dist/collection/components/modal/gestures/sheet.js +289 -289
  711. package/dist/collection/components/modal/gestures/swipe-to-close.js +248 -247
  712. package/dist/collection/components/modal/gestures/utils.js +39 -39
  713. package/dist/collection/components/modal/modal.ios.css +44 -0
  714. package/dist/collection/components/modal/modal.js +1290 -1280
  715. package/dist/collection/components/modal/modal.md.css +44 -0
  716. package/dist/collection/components/modal/test/a11y/modal.e2e.js +12 -12
  717. package/dist/collection/components/modal/test/a11y/modal.spec.js +22 -0
  718. package/dist/collection/components/modal/test/basic/modal.e2e.js +110 -110
  719. package/dist/collection/components/modal/test/basic/modal.spec.js +16 -0
  720. package/dist/collection/components/modal/test/can-dismiss/modal-card.e2e.js +44 -44
  721. package/dist/collection/components/modal/test/can-dismiss/modal-sheet.e2e.js +62 -62
  722. package/dist/collection/components/modal/test/can-dismiss/modal.e2e.js +16 -16
  723. package/dist/collection/components/modal/test/can-dismiss/modal.spec.js +191 -0
  724. package/dist/collection/components/modal/test/card/modal-card.e2e.js +69 -69
  725. package/dist/collection/components/modal/test/card/modal-tablet.e2e.js +67 -67
  726. package/dist/collection/components/modal/test/card-nav/modal.e2e.js +26 -26
  727. package/dist/collection/components/modal/test/card-refresher/modal.e2e.js +14 -14
  728. package/dist/collection/components/modal/test/card-scroll-target/modal.e2e.js +34 -34
  729. package/dist/collection/components/modal/test/custom/modal.e2e.js +16 -16
  730. package/dist/collection/components/modal/test/custom-dialog/modal.e2e.js +12 -12
  731. package/dist/collection/components/modal/test/dark-mode/model.e2e.js +12 -12
  732. package/dist/collection/components/modal/test/fixtures.js +21 -21
  733. package/dist/collection/components/modal/test/inline/modal.e2e.js +34 -34
  734. package/dist/collection/components/modal/test/is-open/modal.e2e.js +17 -17
  735. package/dist/collection/components/modal/test/modal-id.spec.js +32 -0
  736. package/dist/collection/components/modal/test/sheet/modal.e2e.js +178 -178
  737. package/dist/collection/components/modal/test/standalone/modal.e2e.js +12 -12
  738. package/dist/collection/components/modal/test/trigger/modal.e2e.js +23 -23
  739. package/dist/collection/components/modal/utils.js +55 -55
  740. package/dist/collection/components/modal/utils.spec.js +7 -7
  741. package/dist/collection/components/nav/nav.css +22 -0
  742. package/dist/collection/components/nav/nav.js +1748 -1748
  743. package/dist/collection/components/nav/test/basic/nav.e2e.js +58 -58
  744. package/dist/collection/components/nav/test/modal-navigation/nav.e2e.js +52 -52
  745. package/dist/collection/components/nav/test/nav-controller.spec.js +749 -0
  746. package/dist/collection/components/nav/test/nested/nav.e2e.js +54 -54
  747. package/dist/collection/components/nav/test/routing/nav.e2e.js +75 -75
  748. package/dist/collection/components/nav/view-controller.js +52 -52
  749. package/dist/collection/components/nav-link/nav-link-utils.js +16 -16
  750. package/dist/collection/components/nav-link/nav-link.js +106 -106
  751. package/dist/collection/components/note/note.ios.css +44 -0
  752. package/dist/collection/components/note/note.js +49 -49
  753. package/dist/collection/components/note/note.md.css +44 -0
  754. package/dist/collection/components/note/test/a11y/note.e2e.js +59 -16
  755. package/dist/collection/components/note/test/basic/note.e2e.js +33 -33
  756. package/dist/collection/components/picker/animations/ios.enter.js +18 -18
  757. package/dist/collection/components/picker/animations/ios.leave.js +14 -14
  758. package/dist/collection/components/picker/picker.ios.css +44 -0
  759. package/dist/collection/components/picker/picker.js +782 -772
  760. package/dist/collection/components/picker/picker.md.css +44 -0
  761. package/dist/collection/components/picker/test/basic/picker.e2e.js +17 -17
  762. package/dist/collection/components/picker/test/is-open/picker.e2e.js +17 -17
  763. package/dist/collection/components/picker/test/picker-id.spec.js +32 -0
  764. package/dist/collection/components/picker/test/trigger/picker.e2e.js +21 -21
  765. package/dist/collection/components/picker-column/picker-column.ios.css +44 -0
  766. package/dist/collection/components/picker-column/picker-column.js +377 -377
  767. package/dist/collection/components/picker-column/picker-column.md.css +44 -0
  768. package/dist/collection/components/picker-column/test/picker-column-aria.spec.js +35 -0
  769. package/dist/collection/components/picker-column/test/picker-column-dynamic.spec.js +29 -0
  770. package/dist/collection/components/picker-column/test/picker-column.spec.js +17 -0
  771. package/dist/collection/components/picker-column/test/standalone/picker-column.e2e.js +27 -27
  772. package/dist/collection/components/picker-column/test/test.utils.js +29 -29
  773. package/dist/collection/components/picker-column-internal/picker-column-internal.ios.css +33 -3
  774. package/dist/collection/components/picker-column-internal/picker-column-internal.js +523 -501
  775. package/dist/collection/components/picker-column-internal/picker-column-internal.md.css +55 -3
  776. package/dist/collection/components/picker-column-internal/test/basic/picker-column-internal.e2e.js +53 -53
  777. package/dist/collection/components/picker-column-internal/test/disabled/picker-column-internal.e2e.js +66 -37
  778. package/dist/collection/components/picker-internal/picker-internal.ios.css +44 -0
  779. package/dist/collection/components/picker-internal/picker-internal.js +517 -517
  780. package/dist/collection/components/picker-internal/picker-internal.md.css +44 -0
  781. package/dist/collection/components/picker-internal/test/a11y/picker-internal.e2e.js +6 -6
  782. package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +76 -76
  783. package/dist/collection/components/picker-internal/test/keyboard-entry/picker-internal.e2e.js +39 -39
  784. package/dist/collection/components/popover/animations/ios.enter.js +79 -79
  785. package/dist/collection/components/popover/animations/ios.leave.js +28 -28
  786. package/dist/collection/components/popover/animations/md.enter.js +58 -58
  787. package/dist/collection/components/popover/animations/md.leave.js +19 -19
  788. package/dist/collection/components/popover/popover.ios.css +44 -0
  789. package/dist/collection/components/popover/popover.js +1189 -1179
  790. package/dist/collection/components/popover/popover.md.css +44 -0
  791. package/dist/collection/components/popover/test/adjustment/popover.e2e.js +22 -22
  792. package/dist/collection/components/popover/test/arrow/popover.e2e.js +15 -15
  793. package/dist/collection/components/popover/test/async/popover.e2e.js +29 -29
  794. package/dist/collection/components/popover/test/basic/popover.e2e.js +108 -108
  795. package/dist/collection/components/popover/test/basic/popover.spec.js +16 -0
  796. package/dist/collection/components/popover/test/dismiss-on-select/popover.e2e.js +26 -26
  797. package/dist/collection/components/popover/test/fixture.js +16 -16
  798. package/dist/collection/components/popover/test/inline/popover.e2e.js +18 -18
  799. package/dist/collection/components/popover/test/is-open/popover.e2e.js +5 -5
  800. package/dist/collection/components/popover/test/nested/popover.e2e.js +81 -81
  801. package/dist/collection/components/popover/test/popover-id.spec.js +32 -0
  802. package/dist/collection/components/popover/test/position/popover.e2e.js +18 -18
  803. package/dist/collection/components/popover/test/reference/popover.e2e.js +14 -14
  804. package/dist/collection/components/popover/test/size/popover.e2e.js +29 -29
  805. package/dist/collection/components/popover/test/standalone/popover.e2e.js +7 -7
  806. package/dist/collection/components/popover/test/test.utils.js +23 -23
  807. package/dist/collection/components/popover/test/trigger/popover.e2e.js +35 -35
  808. package/dist/collection/components/popover/test/util.spec.js +53 -0
  809. package/dist/collection/components/popover/utils.js +606 -606
  810. package/dist/collection/components/progress-bar/progress-bar.ios.css +22 -0
  811. package/dist/collection/components/progress-bar/progress-bar.js +145 -145
  812. package/dist/collection/components/progress-bar/progress-bar.md.css +22 -0
  813. package/dist/collection/components/progress-bar/test/basic/progress-bar.e2e.js +6 -6
  814. package/dist/collection/components/progress-bar/test/buffer/progress-bar.e2e.js +10 -10
  815. package/dist/collection/components/progress-bar/test/determinate/progress-bar.e2e.js +10 -10
  816. package/dist/collection/components/radio/radio.ios.css +66 -6
  817. package/dist/collection/components/radio/radio.js +453 -449
  818. package/dist/collection/components/radio/radio.md.css +66 -6
  819. package/dist/collection/components/radio/test/a11y/radio.e2e.js +41 -40
  820. package/dist/collection/components/radio/test/color/radio.e2e.js +11 -11
  821. package/dist/collection/components/radio/test/item/radio.e2e.js +37 -37
  822. package/dist/collection/components/radio/test/label-placement/radio.e2e.js +70 -70
  823. package/dist/collection/components/radio/test/legacy/a11y/radio.e2e.js +29 -29
  824. package/dist/collection/components/radio/test/legacy/basic/radio.e2e.js +43 -43
  825. package/dist/collection/components/radio/test/radio.spec.js +60 -0
  826. package/dist/collection/components/radio/test/states/radio.e2e.js +21 -21
  827. package/dist/collection/components/radio-group/radio-group.js +279 -255
  828. package/dist/collection/components/radio-group/test/basic/radio-group.e2e.js +35 -35
  829. package/dist/collection/components/radio-group/test/fixtures.js +22 -22
  830. package/dist/collection/components/radio-group/test/form/radio-group.e2e.js +39 -39
  831. package/dist/collection/components/radio-group/test/legacy/basic/radio-group.e2e.js +59 -59
  832. package/dist/collection/components/radio-group/test/legacy/form/radio-group.e2e.js +22 -22
  833. package/dist/collection/components/radio-group/test/legacy/search/radio-group.e2e.js +27 -27
  834. package/dist/collection/components/radio-group/test/radio-group-events.e2e.js +42 -42
  835. package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
  836. package/dist/collection/components/radio-group/test/search/radio-group.e2e.js +23 -23
  837. package/dist/collection/components/range/range.ios.css +44 -6
  838. package/dist/collection/components/range/range.js +1001 -998
  839. package/dist/collection/components/range/range.md.css +44 -6
  840. package/dist/collection/components/range/test/a11y/range.e2e.js +46 -46
  841. package/dist/collection/components/range/test/active-bar-start/range.e2e.js +6 -6
  842. package/dist/collection/components/range/test/basic/range.e2e.js +23 -23
  843. package/dist/collection/components/range/test/color/range.e2e.js +6 -6
  844. package/dist/collection/components/range/test/custom/range.e2e.js +6 -6
  845. package/dist/collection/components/range/test/item/range.e2e.js +28 -28
  846. package/dist/collection/components/range/test/label/range.e2e.js +99 -99
  847. package/dist/collection/components/range/test/label/range.spec.js +23 -0
  848. package/dist/collection/components/range/test/legacy/a11y/range.e2e.js +25 -25
  849. package/dist/collection/components/range/test/legacy/active-bar-start/range.e2e.js +6 -6
  850. package/dist/collection/components/range/test/legacy/basic/range.e2e.js +61 -61
  851. package/dist/collection/components/range/test/legacy/range-events.e2e.js +80 -80
  852. package/dist/collection/components/range/test/legacy/scroll-target/range.e2e.js +23 -23
  853. package/dist/collection/components/range/test/range-events.e2e.js +135 -135
  854. package/dist/collection/components/range/test/range.spec.js +221 -0
  855. package/dist/collection/components/range/test/scroll-target/range.e2e.js +23 -23
  856. package/dist/collection/components/range/test/states/range.e2e.js +21 -21
  857. package/dist/collection/components/refresher/refresher.ios.css +44 -0
  858. package/dist/collection/components/refresher/refresher.js +806 -806
  859. package/dist/collection/components/refresher/refresher.md.css +44 -0
  860. package/dist/collection/components/refresher/refresher.utils.js +148 -148
  861. package/dist/collection/components/refresher/test/basic/refresher.e2e.js +25 -25
  862. package/dist/collection/components/refresher/test/scroll-target/refresher.e2e.js +25 -25
  863. package/dist/collection/components/refresher/test/test.utils.js +5 -5
  864. package/dist/collection/components/refresher-content/refresher-content.js +131 -131
  865. package/dist/collection/components/refresher-content/test/refresher-content.spec.js +46 -0
  866. package/dist/collection/components/reorder/reorder.ios.css +22 -0
  867. package/dist/collection/components/reorder/reorder.js +37 -37
  868. package/dist/collection/components/reorder/reorder.md.css +22 -0
  869. package/dist/collection/components/reorder-group/reorder-group.css +22 -0
  870. package/dist/collection/components/reorder-group/reorder-group.js +327 -327
  871. package/dist/collection/components/reorder-group/test/a11y/reorder-group.e2e.js +6 -6
  872. package/dist/collection/components/reorder-group/test/basic/reorder-group.e2e.js +11 -11
  873. package/dist/collection/components/reorder-group/test/interactive/reorder-group.e2e.js +21 -21
  874. package/dist/collection/components/reorder-group/test/nested/reorder-group.e2e.js +21 -21
  875. package/dist/collection/components/reorder-group/test/scroll-target/reorder-group.e2e.js +21 -21
  876. package/dist/collection/components/ripple-effect/ripple-effect.css +22 -0
  877. package/dist/collection/components/ripple-effect/ripple-effect.js +135 -135
  878. package/dist/collection/components/ripple-effect/test/basic/ripple-effect.e2e.js +48 -48
  879. package/dist/collection/components/route/route.js +151 -151
  880. package/dist/collection/components/route-redirect/route-redirect.js +76 -76
  881. package/dist/collection/components/router/router.js +472 -472
  882. package/dist/collection/components/router/test/basic/router.e2e.js +55 -55
  883. package/dist/collection/components/router/test/guards/href/router.e2e.js +51 -51
  884. package/dist/collection/components/router/test/guards/link/router.e2e.js +51 -51
  885. package/dist/collection/components/router/test/guards/push/router.e2e.js +51 -51
  886. package/dist/collection/components/router/test/guards/router.e2e.js +5 -5
  887. package/dist/collection/components/router/test/guards/test.utils.js +2 -2
  888. package/dist/collection/components/router/test/matching.spec.js +250 -0
  889. package/dist/collection/components/router/test/parser.spec.js +133 -0
  890. package/dist/collection/components/router/test/path.spec.js +218 -0
  891. package/dist/collection/components/router/test/router.spec.js +55 -0
  892. package/dist/collection/components/router/utils/debug.js +14 -14
  893. package/dist/collection/components/router/utils/dom.js +56 -56
  894. package/dist/collection/components/router/utils/matching.js +150 -150
  895. package/dist/collection/components/router/utils/parser.js +52 -52
  896. package/dist/collection/components/router/utils/path.js +66 -66
  897. package/dist/collection/components/router-link/router-link.css +22 -0
  898. package/dist/collection/components/router-link/router-link.js +157 -157
  899. package/dist/collection/components/router-outlet/router-outlet.css +22 -0
  900. package/dist/collection/components/router-outlet/router-outlet.js +459 -459
  901. package/dist/collection/components/router-outlet/test/basic/router-outlet.e2e.js +31 -31
  902. package/dist/collection/components/row/row.css +66 -0
  903. package/dist/collection/components/row/row.js +15 -15
  904. package/dist/collection/components/searchbar/searchbar.ios.css +44 -0
  905. package/dist/collection/components/searchbar/searchbar.js +891 -889
  906. package/dist/collection/components/searchbar/searchbar.md.css +44 -0
  907. package/dist/collection/components/searchbar/test/a11y/searchbar.e2e.js +11 -11
  908. package/dist/collection/components/searchbar/test/basic/searchbar.e2e.js +101 -101
  909. package/dist/collection/components/searchbar/test/events/searchbar.e2e.js +55 -55
  910. package/dist/collection/components/searchbar/test/searchbar.spec.js +15 -0
  911. package/dist/collection/components/segment/segment.ios.css +66 -0
  912. package/dist/collection/components/segment/segment.js +631 -631
  913. package/dist/collection/components/segment/segment.md.css +66 -0
  914. package/dist/collection/components/segment/test/a11y/segment.e2e.js +37 -37
  915. package/dist/collection/components/segment/test/basic/segment.e2e.js +22 -22
  916. package/dist/collection/components/segment/test/custom/segment.e2e.js +6 -6
  917. package/dist/collection/components/segment/test/icon/segment.e2e.js +6 -6
  918. package/dist/collection/components/segment/test/modes/segment.e2e.js +15 -15
  919. package/dist/collection/components/segment/test/scrollable/segment.e2e.js +12 -12
  920. package/dist/collection/components/segment/test/segment-events.e2e.js +97 -97
  921. package/dist/collection/components/segment/test/segment.spec.js +37 -0
  922. package/dist/collection/components/segment/test/toolbar/segment.e2e.js +21 -21
  923. package/dist/collection/components/segment/test/wrap/segment.e2e.js +21 -21
  924. package/dist/collection/components/segment-button/segment-button.ios.css +44 -0
  925. package/dist/collection/components/segment-button/segment-button.js +217 -217
  926. package/dist/collection/components/segment-button/segment-button.md.css +44 -0
  927. package/dist/collection/components/select/select.ios.css +126 -7
  928. package/dist/collection/components/select/select.js +1201 -1184
  929. package/dist/collection/components/select/select.md.css +173 -19
  930. package/dist/collection/components/select/test/a11y/select.e2e.js +14 -14
  931. package/dist/collection/components/select/test/async/select.e2e.js +14 -14
  932. package/dist/collection/components/select/test/basic/select.e2e.js +140 -140
  933. package/dist/collection/components/select/test/card/select.e2e.js +6 -6
  934. package/dist/collection/components/select/test/color/select.e2e.js +22 -22
  935. package/dist/collection/components/select/test/compare-with/select.e2e.js +33 -33
  936. package/dist/collection/components/select/test/custom/select.e2e.js +19 -19
  937. package/dist/collection/components/select/test/disabled/select.e2e.js +17 -17
  938. package/dist/collection/components/select/test/fill/select.e2e.js +63 -63
  939. package/dist/collection/components/select/test/highlight/select.e2e.js +74 -74
  940. package/dist/collection/components/select/test/item/select.e2e.js +26 -11
  941. package/dist/collection/components/select/test/label/select.e2e.js +141 -141
  942. package/dist/collection/components/select/test/legacy/async/select.e2e.js +8 -8
  943. package/dist/collection/components/select/test/legacy/basic/select.e2e.js +108 -108
  944. package/dist/collection/components/select/test/legacy/compare-with/select.e2e.js +33 -33
  945. package/dist/collection/components/select/test/legacy/custom/custom.e2e.js +5 -5
  946. package/dist/collection/components/select/test/legacy/single-value/select.e2e.js +8 -8
  947. package/dist/collection/components/select/test/legacy/spec/select.e2e.js +6 -6
  948. package/dist/collection/components/select/test/legacy/standalone/select.e2e.js +11 -11
  949. package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +17 -17
  950. package/dist/collection/components/select/test/popover-size/select.e2e.js +63 -63
  951. package/dist/collection/components/select/test/select.spec.js +59 -0
  952. package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
  953. package/dist/collection/components/select/test/states/select.e2e.js +21 -21
  954. package/dist/collection/components/select/test/toggle-icon/select.e2e.js +14 -14
  955. package/dist/collection/components/select/test/wrapping/select.e2e.js +16 -16
  956. package/dist/collection/components/select-option/select-option.js +60 -60
  957. package/dist/collection/components/select-popover/select-popover.ios.css +66 -0
  958. package/dist/collection/components/select-popover/select-popover.js +197 -197
  959. package/dist/collection/components/select-popover/select-popover.md.css +66 -0
  960. package/dist/collection/components/select-popover/test/basic/select-popover.e2e.js +52 -52
  961. package/dist/collection/components/select-popover/test/fixtures.js +33 -33
  962. package/dist/collection/components/skeleton-text/skeleton-text.css +22 -0
  963. package/dist/collection/components/skeleton-text/skeleton-text.js +87 -48
  964. package/dist/collection/components/skeleton-text/test/basic/skeleton-text.e2e.js +6 -6
  965. package/dist/collection/components/skeleton-text/test/custom/skeleton-text.e2e.js +6 -6
  966. package/dist/collection/components/slides/IonicSlides.js +95 -95
  967. package/dist/collection/components/spinner/spinner-configs.js +121 -121
  968. package/dist/collection/components/spinner/spinner.css +22 -0
  969. package/dist/collection/components/spinner/spinner.js +137 -137
  970. package/dist/collection/components/spinner/test/basic/spinner.e2e.js +10 -10
  971. package/dist/collection/components/spinner/test/color/spinner.e2e.js +10 -10
  972. package/dist/collection/components/spinner/test/resize/spinner.e2e.js +8 -8
  973. package/dist/collection/components/split-pane/split-pane.ios.css +67 -2
  974. package/dist/collection/components/split-pane/split-pane.js +225 -225
  975. package/dist/collection/components/split-pane/split-pane.md.css +67 -2
  976. package/dist/collection/components/split-pane/test/basic/split-pane.e2e.js +18 -18
  977. package/dist/collection/components/split-pane/test/multiple/split-pane.e2e.js +23 -23
  978. package/dist/collection/components/tab/tab.js +170 -170
  979. package/dist/collection/components/tab-bar/tab-bar.ios.css +66 -0
  980. package/dist/collection/components/tab-bar/tab-bar.js +177 -177
  981. package/dist/collection/components/tab-bar/tab-bar.md.css +66 -0
  982. package/dist/collection/components/tab-bar/test/basic/tab-bar.e2e.js +8 -8
  983. package/dist/collection/components/tab-bar/test/custom/tab-bar.e2e.js +6 -6
  984. package/dist/collection/components/tab-bar/test/translucent/tab-bar.e2e.js +14 -14
  985. package/dist/collection/components/tab-button/tab-button.ios.css +44 -0
  986. package/dist/collection/components/tab-button/tab-button.js +267 -267
  987. package/dist/collection/components/tab-button/tab-button.md.css +44 -0
  988. package/dist/collection/components/tab-button/test/a11y/tab-button.e2e.js +6 -6
  989. package/dist/collection/components/tab-button/test/basic/tab-button.e2e.js +16 -16
  990. package/dist/collection/components/tab-button/test/layout/tab-button.e2e.js +26 -26
  991. package/dist/collection/components/tab-button/test/states/tab-button.e2e.js +26 -26
  992. package/dist/collection/components/tabs/tabs.css +22 -0
  993. package/dist/collection/components/tabs/tabs.js +344 -344
  994. package/dist/collection/components/tabs/test/basic/tabs.e2e.js +24 -24
  995. package/dist/collection/components/tabs/test/placements/tabs.e2e.js +17 -17
  996. package/dist/collection/components/text/test/basic/text.e2e.js +11 -11
  997. package/dist/collection/components/text/text.css +22 -0
  998. package/dist/collection/components/text/text.js +47 -47
  999. package/dist/collection/components/textarea/test/a11y/textarea.e2e.js +12 -12
  1000. package/dist/collection/components/textarea/test/autogrow/textarea.e2e.js +31 -31
  1001. package/dist/collection/components/textarea/test/bottom-content/textarea.e2e.js +82 -82
  1002. package/dist/collection/components/textarea/test/card/textarea.e2e.js +6 -6
  1003. package/dist/collection/components/textarea/test/clear-on-edit/textarea.e2e.js +53 -17
  1004. package/dist/collection/components/textarea/test/color/textarea.e2e.js +88 -88
  1005. package/dist/collection/components/textarea/test/cols/textarea.e2e.js +11 -11
  1006. package/dist/collection/components/textarea/test/fill/textarea.e2e.js +63 -63
  1007. package/dist/collection/components/textarea/test/highlight/textarea.e2e.js +52 -52
  1008. package/dist/collection/components/textarea/test/item/textarea.e2e.js +11 -11
  1009. package/dist/collection/components/textarea/test/label-placement/textarea.e2e.js +150 -150
  1010. package/dist/collection/components/textarea/test/legacy/a11y/textarea.e2e.js +15 -15
  1011. package/dist/collection/components/textarea/test/legacy/autogrow/textarea.e2e.js +31 -31
  1012. package/dist/collection/components/textarea/test/legacy/basic/textarea.e2e.js +30 -30
  1013. package/dist/collection/components/textarea/test/legacy/clear-on-edit/textarea.e2e.js +17 -17
  1014. package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
  1015. package/dist/collection/components/textarea/test/states/textarea.e2e.js +11 -11
  1016. package/dist/collection/components/textarea/test/textarea-events.e2e.js +57 -57
  1017. package/dist/collection/components/textarea/test/textarea.spec.js +59 -0
  1018. package/dist/collection/components/textarea/textarea.ios.css +125 -5
  1019. package/dist/collection/components/textarea/textarea.js +1069 -1019
  1020. package/dist/collection/components/textarea/textarea.md.css +179 -14
  1021. package/dist/collection/components/thumbnail/test/basic/thumbnail.e2e.js +28 -28
  1022. package/dist/collection/components/thumbnail/thumbnail.css +22 -0
  1023. package/dist/collection/components/thumbnail/thumbnail.js +15 -15
  1024. package/dist/collection/components/title/test/a11y/title.e2e.js +17 -17
  1025. package/dist/collection/components/title/test/basic/title.e2e.js +13 -13
  1026. package/dist/collection/components/title/title.ios.css +22 -0
  1027. package/dist/collection/components/title/title.js +119 -119
  1028. package/dist/collection/components/title/title.md.css +22 -0
  1029. package/dist/collection/components/toast/animations/ios.enter.js +21 -20
  1030. package/dist/collection/components/toast/animations/ios.leave.js +18 -18
  1031. package/dist/collection/components/toast/animations/md.enter.js +23 -22
  1032. package/dist/collection/components/toast/animations/md.leave.js +6 -6
  1033. package/dist/collection/components/toast/animations/utils.js +62 -56
  1034. package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
  1035. package/dist/collection/components/toast/test/a11y/toast.e2e.js +92 -92
  1036. package/dist/collection/components/toast/test/basic/toast.e2e.js +101 -101
  1037. package/dist/collection/components/toast/test/is-open/toast.e2e.js +17 -17
  1038. package/dist/collection/components/toast/test/layout/toast.e2e.js +9 -9
  1039. package/dist/collection/components/toast/test/position-anchor/toast.e2e.js +37 -37
  1040. package/dist/collection/components/toast/test/standalone/toast.e2e.js +10 -10
  1041. package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
  1042. package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
  1043. package/dist/collection/components/toast/test/toast-id.spec.js +32 -0
  1044. package/dist/collection/components/toast/test/toast.spec.js +200 -0
  1045. package/dist/collection/components/toast/test/trigger/toast.e2e.js +21 -21
  1046. package/dist/collection/components/toast/toast.ios.css +54 -10
  1047. package/dist/collection/components/toast/toast.js +1065 -952
  1048. package/dist/collection/components/toast/toast.md.css +54 -0
  1049. package/dist/collection/components/toggle/test/a11y/toggle.e2e.js +6 -6
  1050. package/dist/collection/components/toggle/test/color/toggle.e2e.js +11 -11
  1051. package/dist/collection/components/toggle/test/enable-on-off-labels/toggle.e2e.js +27 -27
  1052. package/dist/collection/components/toggle/test/item/toggle.e2e.js +52 -52
  1053. package/dist/collection/components/toggle/test/label/toggle.e2e.js +65 -65
  1054. package/dist/collection/components/toggle/test/legacy/basic/toggle.e2e.js +69 -69
  1055. package/dist/collection/components/toggle/test/legacy/enable-on-off-labels/toggle.e2e.js +23 -23
  1056. package/dist/collection/components/toggle/test/legacy/sizes/toggle.e2e.js +6 -6
  1057. package/dist/collection/components/toggle/test/sizes/toggle.e2e.js +6 -6
  1058. package/dist/collection/components/toggle/test/states/toggle.e2e.js +16 -16
  1059. package/dist/collection/components/toggle/test/toggle.spec.js +67 -0
  1060. package/dist/collection/components/toggle/toggle.ios.css +66 -6
  1061. package/dist/collection/components/toggle/toggle.js +487 -484
  1062. package/dist/collection/components/toggle/toggle.md.css +66 -6
  1063. package/dist/collection/components/toolbar/test/basic/toolbar.e2e.js +7 -7
  1064. package/dist/collection/components/toolbar/test/colors/toolbar.e2e.js +6 -6
  1065. package/dist/collection/components/toolbar/toolbar.ios.css +44 -0
  1066. package/dist/collection/components/toolbar/toolbar.js +100 -100
  1067. package/dist/collection/components/toolbar/toolbar.md.css +44 -0
  1068. package/dist/collection/css/test/a11y/typography.e2e.js +6 -6
  1069. package/dist/collection/global/config.js +51 -51
  1070. package/dist/collection/global/ionic-global.js +54 -54
  1071. package/dist/collection/global/test/config-controller.spec.js +77 -0
  1072. package/dist/collection/utils/animation/animation-utils.js +91 -91
  1073. package/dist/collection/utils/animation/animation.js +905 -904
  1074. package/dist/collection/utils/animation/cubic-bezier.js +49 -49
  1075. package/dist/collection/utils/animation/test/animation.spec.js +447 -0
  1076. package/dist/collection/utils/animation/test/animationbuilder/animation.e2e.js +26 -26
  1077. package/dist/collection/utils/animation/test/basic/animation.e2e.js +12 -12
  1078. package/dist/collection/utils/animation/test/display/animation.e2e.js +18 -18
  1079. package/dist/collection/utils/animation/test/hooks/animation.e2e.js +39 -39
  1080. package/dist/collection/utils/animation/test/multiple/animation.e2e.js +27 -27
  1081. package/dist/collection/utils/browser/index.js +0 -22
  1082. package/dist/collection/utils/config.js +20 -20
  1083. package/dist/collection/utils/content/content.utils.spec.js +121 -121
  1084. package/dist/collection/utils/content/index.js +58 -58
  1085. package/dist/collection/utils/floating-point/floating-point.spec.js +14 -14
  1086. package/dist/collection/utils/floating-point/index.js +5 -5
  1087. package/dist/collection/utils/focus-visible.js +63 -63
  1088. package/dist/collection/utils/forms/compare-with-utils.js +39 -0
  1089. package/dist/collection/utils/forms/form-controller.js +45 -45
  1090. package/dist/collection/utils/forms/index.js +1 -0
  1091. package/dist/collection/utils/forms/notch-controller.js +120 -120
  1092. package/dist/collection/utils/framework-delegate.js +121 -121
  1093. package/dist/collection/utils/gesture/button-active.js +56 -56
  1094. package/dist/collection/utils/gesture/gesture-controller.js +182 -182
  1095. package/dist/collection/utils/gesture/index.js +222 -222
  1096. package/dist/collection/utils/gesture/listener.js +36 -36
  1097. package/dist/collection/utils/gesture/pointer-events.js +113 -113
  1098. package/dist/collection/utils/gesture/recognizers.js +46 -46
  1099. package/dist/collection/utils/gesture/swipe-back.js +65 -65
  1100. package/dist/collection/utils/hardware-back-button.js +48 -48
  1101. package/dist/collection/utils/helpers.js +258 -258
  1102. package/dist/collection/utils/helpers.spec.js +28 -28
  1103. package/dist/collection/utils/input-shims/hacks/common.js +61 -61
  1104. package/dist/collection/utils/input-shims/hacks/hide-caret.js +19 -19
  1105. package/dist/collection/utils/input-shims/hacks/input-blurring.js +47 -47
  1106. package/dist/collection/utils/input-shims/hacks/scroll-assist.js +225 -225
  1107. package/dist/collection/utils/input-shims/hacks/scroll-data.js +29 -29
  1108. package/dist/collection/utils/input-shims/hacks/scroll-padding.js +21 -21
  1109. package/dist/collection/utils/input-shims/hacks/test/scroll-assist.e2e.js +97 -97
  1110. package/dist/collection/utils/input-shims/input-shims.js +87 -81
  1111. package/dist/collection/utils/keyboard/keyboard-controller.js +128 -128
  1112. package/dist/collection/utils/keyboard/keyboard.js +59 -59
  1113. package/dist/collection/utils/keyboard/test/keyboard-controller.spec.js +21 -0
  1114. package/dist/collection/utils/keyboard/test/keyboard.spec.js +214 -0
  1115. package/dist/collection/utils/lock-controller.js +24 -24
  1116. package/dist/collection/utils/logging/index.js +3 -3
  1117. package/dist/collection/utils/media.js +13 -13
  1118. package/dist/collection/utils/menu-controller/animations/base.js +8 -8
  1119. package/dist/collection/utils/menu-controller/animations/overlay.js +21 -21
  1120. package/dist/collection/utils/menu-controller/animations/push.js +20 -20
  1121. package/dist/collection/utils/menu-controller/animations/reveal.js +6 -6
  1122. package/dist/collection/utils/menu-controller/index.js +204 -206
  1123. package/dist/collection/utils/native/capacitor.js +4 -4
  1124. package/dist/collection/utils/native/haptic.js +151 -151
  1125. package/dist/collection/utils/native/keyboard.js +47 -47
  1126. package/dist/collection/utils/native/native-interface.js +15 -15
  1127. package/dist/collection/utils/native/status-bar.js +36 -36
  1128. package/dist/collection/utils/overlays.js +495 -494
  1129. package/dist/collection/utils/platform.js +56 -56
  1130. package/dist/collection/utils/rtl/dir.js +5 -5
  1131. package/dist/collection/utils/rtl/dir.spec.js +17 -17
  1132. package/dist/collection/utils/sanitization/index.js +122 -122
  1133. package/dist/collection/utils/sanitization/test/sanitization.spec.js +43 -0
  1134. package/dist/collection/utils/slot-mutation-controller.js +86 -85
  1135. package/dist/collection/utils/status-tap.js +26 -26
  1136. package/dist/collection/utils/tap-click/index.js +171 -171
  1137. package/dist/collection/utils/tap-click/test/tap-click.e2e.js +12 -12
  1138. package/dist/collection/utils/test/aria.spec.js +79 -0
  1139. package/dist/collection/utils/test/attributes.spec.js +53 -0
  1140. package/dist/collection/utils/test/framework-delegate/framework-delegate.e2e.js +25 -25
  1141. package/dist/collection/utils/test/hardware-back-button.spec.js +53 -0
  1142. package/dist/collection/utils/test/overlays/overlays.e2e.js +137 -137
  1143. package/dist/collection/utils/test/overlays/overlays.spec.js +102 -0
  1144. package/dist/collection/utils/test/platform.spec.js +132 -0
  1145. package/dist/collection/utils/test/platform.utils.js +77 -77
  1146. package/dist/collection/utils/test/playwright/drag-element.js +69 -69
  1147. package/dist/collection/utils/test/playwright/generator.js +48 -25
  1148. package/dist/collection/utils/test/playwright/matchers/index.js +3 -3
  1149. package/dist/collection/utils/test/playwright/matchers/toHaveReceivedEvent.js +21 -21
  1150. package/dist/collection/utils/test/playwright/matchers/toHaveReceivedEventDetail.js +28 -28
  1151. package/dist/collection/utils/test/playwright/matchers/toHaveReceivedEventTimes.js +22 -22
  1152. package/dist/collection/utils/test/playwright/page/event-spy.js +110 -110
  1153. package/dist/collection/utils/test/playwright/page/utils/goto.js +52 -52
  1154. package/dist/collection/utils/test/playwright/page/utils/locator.js +8 -8
  1155. package/dist/collection/utils/test/playwright/page/utils/set-content.js +44 -35
  1156. package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +19 -19
  1157. package/dist/collection/utils/test/playwright/page/utils/spy-on-event.js +4 -4
  1158. package/dist/collection/utils/test/playwright/page/utils/wait-for-changes.js +48 -48
  1159. package/dist/collection/utils/test/playwright/playwright-page.js +35 -35
  1160. package/dist/collection/utils/test/playwright/viewports/index.js +13 -13
  1161. package/dist/collection/utils/test/press-keys.js +77 -77
  1162. package/dist/collection/utils/test/ready.spec.js +39 -0
  1163. package/dist/collection/utils/test/theme.spec.js +56 -0
  1164. package/dist/collection/utils/theme.js +23 -23
  1165. package/dist/collection/utils/transition/index.js +163 -163
  1166. package/dist/collection/utils/transition/ios.transition.js +598 -598
  1167. package/dist/collection/utils/transition/md.transition.js +44 -44
  1168. package/dist/collection/utils/watch-options.js +30 -30
  1169. package/dist/docs.json +195 -38
  1170. package/dist/esm/animation-dde8cc0d.js +1060 -0
  1171. package/dist/esm/{app-globals-2398e405.js → app-globals-8c62bec2.js} +1 -1
  1172. package/dist/esm/button-active-308d3edd.js +67 -0
  1173. package/dist/esm/capacitor-59395cbd.js +13 -0
  1174. package/dist/esm/compare-with-utils-a96ff2ea.js +41 -0
  1175. package/dist/esm/config-49c88215.js +193 -0
  1176. package/dist/esm/cubic-bezier-fe2083dc.js +90 -0
  1177. package/dist/esm/data-775093f5.js +1625 -0
  1178. package/dist/esm/{dir-912e3e13.js → dir-babeabeb.js} +5 -5
  1179. package/dist/esm/focus-visible-dd40d69f.js +75 -0
  1180. package/dist/esm/form-controller-548aa79c.js +64 -0
  1181. package/dist/esm/framework-delegate-bc1fd82a.js +140 -0
  1182. package/dist/esm/gesture-controller-1bf57181.js +195 -0
  1183. package/dist/esm/haptic-554688a5.js +206 -0
  1184. package/dist/esm/hardware-back-button-b2bc76db.js +71 -0
  1185. package/dist/esm/helpers-ae653409.js +418 -0
  1186. package/dist/esm/index-1193f005.js +306 -0
  1187. package/dist/esm/index-2cf77112.js +457 -0
  1188. package/dist/esm/index-4743453d.js +231 -0
  1189. package/dist/esm/index-82eeb47f.js +196 -0
  1190. package/dist/esm/{index-595d62c9.js → index-9b0d46f4.js} +3 -3
  1191. package/dist/esm/index-a5d50daf.js +7 -0
  1192. package/dist/esm/{index-7c9b1bca.js → index-b7d870cf.js} +79 -15
  1193. package/dist/esm/{index-4392efa5.js → index-b9e742e5.js} +60 -60
  1194. package/dist/esm/index.js +113 -113
  1195. package/dist/esm/input-shims-6539ce13.js +599 -0
  1196. package/dist/esm/input.utils-a5a2d164.js +135 -0
  1197. package/dist/esm/ion-accordion_2.entry.js +488 -488
  1198. package/dist/esm/ion-action-sheet.entry.js +260 -250
  1199. package/dist/esm/ion-alert.entry.js +442 -432
  1200. package/dist/esm/ion-app_8.entry.js +1151 -1151
  1201. package/dist/esm/ion-avatar_3.entry.js +29 -29
  1202. package/dist/esm/ion-back-button.entry.js +73 -73
  1203. package/dist/esm/ion-backdrop.entry.js +40 -40
  1204. package/dist/esm/ion-breadcrumb_2.entry.js +194 -194
  1205. package/dist/esm/ion-button_2.entry.js +303 -303
  1206. package/dist/esm/ion-card_5.entry.js +105 -105
  1207. package/dist/esm/ion-checkbox.entry.js +149 -147
  1208. package/dist/esm/ion-chip.entry.js +20 -20
  1209. package/dist/esm/ion-col_3.entry.js +136 -136
  1210. package/dist/esm/ion-datetime-button.entry.js +325 -325
  1211. package/dist/esm/ion-datetime_3.entry.js +2204 -2162
  1212. package/dist/esm/ion-fab_3.entry.js +150 -150
  1213. package/dist/esm/ion-img.entry.js +79 -79
  1214. package/dist/esm/ion-infinite-scroll_2.entry.js +198 -190
  1215. package/dist/esm/ion-input.entry.js +443 -399
  1216. package/dist/esm/ion-item-option_3.entry.js +457 -457
  1217. package/dist/esm/ion-item_8.entry.js +441 -428
  1218. package/dist/esm/ion-loading.entry.js +220 -210
  1219. package/dist/esm/ion-menu_3.entry.js +670 -670
  1220. package/dist/esm/ion-modal.entry.js +1415 -1405
  1221. package/dist/esm/ion-nav_2.entry.js +904 -904
  1222. package/dist/esm/ion-picker-column-internal.entry.js +331 -327
  1223. package/dist/esm/ion-picker-internal.entry.js +453 -453
  1224. package/dist/esm/ion-popover.entry.js +1108 -1098
  1225. package/dist/esm/ion-progress-bar.entry.js +40 -40
  1226. package/dist/esm/ion-radio_2.entry.js +321 -316
  1227. package/dist/esm/ion-range.entry.js +558 -556
  1228. package/dist/esm/ion-refresher_2.entry.js +786 -786
  1229. package/dist/esm/ion-reorder_2.entry.js +267 -267
  1230. package/dist/esm/ion-ripple-effect.entry.js +66 -66
  1231. package/dist/esm/ion-route_4.entry.js +693 -693
  1232. package/dist/esm/ion-searchbar.entry.js +360 -358
  1233. package/dist/esm/ion-segment_2.entry.js +507 -507
  1234. package/dist/esm/ion-select_3.entry.js +784 -768
  1235. package/dist/esm/ion-spinner.entry.js +46 -46
  1236. package/dist/esm/ion-split-pane.entry.js +119 -119
  1237. package/dist/esm/ion-tab-bar_2.entry.js +138 -138
  1238. package/dist/esm/ion-tab_2.entry.js +187 -187
  1239. package/dist/esm/ion-text.entry.js +13 -13
  1240. package/dist/esm/ion-textarea.entry.js +401 -353
  1241. package/dist/esm/ion-toast.entry.js +771 -419
  1242. package/dist/esm/ion-toggle.entry.js +227 -225
  1243. package/dist/esm/ionic-global-1f99b929.js +224 -0
  1244. package/dist/esm/ionic.js +6 -6
  1245. package/dist/esm/ios.transition-3376ccb2.js +651 -0
  1246. package/dist/esm/keyboard-52278bd7.js +146 -0
  1247. package/dist/esm/keyboard-73175e24.js +79 -0
  1248. package/dist/esm/keyboard-controller-ec5c2bfa.js +165 -0
  1249. package/dist/esm/loader.js +5 -5
  1250. package/dist/esm/lock-controller-316928be.js +38 -0
  1251. package/dist/esm/md.transition-f992779f.js +57 -0
  1252. package/dist/esm/notch-controller-fea7f9c5.js +153 -0
  1253. package/dist/esm/overlays-b33f6bca.js +693 -0
  1254. package/dist/esm/spinner-configs-964f7cf3.js +145 -0
  1255. package/dist/esm/status-tap-16fd8f3d.js +40 -0
  1256. package/dist/esm/swipe-back-18cb49f7.js +79 -0
  1257. package/dist/esm/theme-01f3f29c.js +43 -0
  1258. package/dist/esm/watch-options-c2911ace.js +47 -0
  1259. package/dist/esm-es5/{animation-8aa13916.js → animation-dde8cc0d.js} +1 -1
  1260. package/dist/esm-es5/app-globals-8c62bec2.js +4 -0
  1261. package/dist/esm-es5/{button-active-ce5cba4c.js → button-active-308d3edd.js} +1 -1
  1262. package/dist/esm-es5/{capacitor-b4979570.js → capacitor-59395cbd.js} +1 -1
  1263. package/dist/esm-es5/compare-with-utils-a96ff2ea.js +4 -0
  1264. package/dist/esm-es5/data-775093f5.js +4 -0
  1265. package/dist/esm-es5/{form-controller-64edeaad.js → form-controller-548aa79c.js} +1 -1
  1266. package/dist/esm-es5/{framework-delegate-aa433dea.js → framework-delegate-bc1fd82a.js} +1 -1
  1267. package/dist/esm-es5/{haptic-1243b917.js → haptic-554688a5.js} +1 -1
  1268. package/dist/esm-es5/index-1193f005.js +4 -0
  1269. package/dist/esm-es5/{index-ff313b19.js → index-2cf77112.js} +1 -1
  1270. package/dist/esm-es5/{index-6a0ccabb.js → index-4743453d.js} +1 -1
  1271. package/dist/esm-es5/{index-f0cc4e14.js → index-82eeb47f.js} +1 -1
  1272. package/dist/esm-es5/index-b7d870cf.js +5 -0
  1273. package/dist/esm-es5/{index-4392efa5.js → index-b9e742e5.js} +1 -1
  1274. package/dist/esm-es5/index.js +1 -1
  1275. package/dist/esm-es5/input-shims-6539ce13.js +4 -0
  1276. package/dist/esm-es5/input.utils-a5a2d164.js +4 -0
  1277. package/dist/esm-es5/ion-accordion_2.entry.js +1 -1
  1278. package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
  1279. package/dist/esm-es5/ion-alert.entry.js +1 -1
  1280. package/dist/esm-es5/ion-app_8.entry.js +1 -1
  1281. package/dist/esm-es5/ion-avatar_3.entry.js +1 -1
  1282. package/dist/esm-es5/ion-back-button.entry.js +1 -1
  1283. package/dist/esm-es5/ion-backdrop.entry.js +1 -1
  1284. package/dist/esm-es5/ion-breadcrumb_2.entry.js +1 -1
  1285. package/dist/esm-es5/ion-button_2.entry.js +1 -1
  1286. package/dist/esm-es5/ion-card_5.entry.js +1 -1
  1287. package/dist/esm-es5/ion-checkbox.entry.js +1 -1
  1288. package/dist/esm-es5/ion-chip.entry.js +1 -1
  1289. package/dist/esm-es5/ion-col_3.entry.js +1 -1
  1290. package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
  1291. package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
  1292. package/dist/esm-es5/ion-fab_3.entry.js +1 -1
  1293. package/dist/esm-es5/ion-img.entry.js +1 -1
  1294. package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
  1295. package/dist/esm-es5/ion-input.entry.js +1 -1
  1296. package/dist/esm-es5/ion-item-option_3.entry.js +1 -1
  1297. package/dist/esm-es5/ion-item_8.entry.js +1 -1
  1298. package/dist/esm-es5/ion-loading.entry.js +1 -1
  1299. package/dist/esm-es5/ion-menu_3.entry.js +1 -1
  1300. package/dist/esm-es5/ion-modal.entry.js +1 -1
  1301. package/dist/esm-es5/ion-nav_2.entry.js +1 -1
  1302. package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
  1303. package/dist/esm-es5/ion-picker-internal.entry.js +1 -1
  1304. package/dist/esm-es5/ion-popover.entry.js +1 -1
  1305. package/dist/esm-es5/ion-progress-bar.entry.js +1 -1
  1306. package/dist/esm-es5/ion-radio_2.entry.js +1 -1
  1307. package/dist/esm-es5/ion-range.entry.js +1 -1
  1308. package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
  1309. package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
  1310. package/dist/esm-es5/ion-ripple-effect.entry.js +1 -1
  1311. package/dist/esm-es5/ion-route_4.entry.js +1 -1
  1312. package/dist/esm-es5/ion-searchbar.entry.js +1 -1
  1313. package/dist/esm-es5/ion-segment_2.entry.js +1 -1
  1314. package/dist/esm-es5/ion-select_3.entry.js +1 -1
  1315. package/dist/esm-es5/ion-spinner.entry.js +1 -1
  1316. package/dist/esm-es5/ion-split-pane.entry.js +1 -1
  1317. package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
  1318. package/dist/esm-es5/ion-tab_2.entry.js +1 -1
  1319. package/dist/esm-es5/ion-text.entry.js +1 -1
  1320. package/dist/esm-es5/ion-textarea.entry.js +1 -1
  1321. package/dist/esm-es5/ion-toast.entry.js +1 -1
  1322. package/dist/esm-es5/ion-toggle.entry.js +1 -1
  1323. package/dist/esm-es5/{ionic-global-40e42e7f.js → ionic-global-1f99b929.js} +1 -1
  1324. package/dist/esm-es5/ionic.js +1 -1
  1325. package/dist/esm-es5/{ios.transition-1651c430.js → ios.transition-3376ccb2.js} +1 -1
  1326. package/dist/esm-es5/{keyboard-b551279d.js → keyboard-52278bd7.js} +1 -1
  1327. package/dist/esm-es5/{keyboard-b063f012.js → keyboard-73175e24.js} +1 -1
  1328. package/dist/esm-es5/{keyboard-controller-0c2dce71.js → keyboard-controller-ec5c2bfa.js} +1 -1
  1329. package/dist/esm-es5/loader.js +1 -1
  1330. package/dist/esm-es5/md.transition-f992779f.js +4 -0
  1331. package/dist/esm-es5/{notch-controller-8c9c0e54.js → notch-controller-fea7f9c5.js} +1 -1
  1332. package/dist/esm-es5/{overlays-6c9feb7e.js → overlays-b33f6bca.js} +1 -1
  1333. package/dist/esm-es5/{status-tap-9ce68758.js → status-tap-16fd8f3d.js} +1 -1
  1334. package/dist/esm-es5/{swipe-back-cd4295f3.js → swipe-back-18cb49f7.js} +1 -1
  1335. package/dist/html.html-data.json +16 -3
  1336. package/dist/ionic/index.esm.js +1 -1
  1337. package/dist/ionic/ionic.esm.js +1 -1
  1338. package/dist/ionic/ionic.js +15 -15
  1339. package/dist/ionic/p-013013a3.js +4 -0
  1340. package/dist/ionic/p-0235067a.js +4 -0
  1341. package/dist/ionic/{p-a0b6d438.js → p-04377cfa.js} +1 -1
  1342. package/dist/ionic/p-043aa6cc.system.entry.js +4 -0
  1343. package/dist/ionic/{p-5d711127.js → p-0509fd34.js} +1 -1
  1344. package/dist/ionic/p-0550f802.entry.js +4 -0
  1345. package/dist/ionic/p-06abe918.system.entry.js +4 -0
  1346. package/dist/ionic/{p-702d85d8.system.js → p-0aa78a8d.system.js} +1 -1
  1347. package/dist/ionic/{p-41477ad9.system.js → p-0bd51c34.system.js} +1 -1
  1348. package/dist/ionic/p-0dfa4ab4.system.entry.js +4 -0
  1349. package/dist/ionic/p-0ebc87b7.system.entry.js +4 -0
  1350. package/dist/ionic/{p-bed722c4.system.entry.js → p-10ec9af7.system.entry.js} +1 -1
  1351. package/dist/ionic/{p-f4cc91f6.entry.js → p-11786dc7.entry.js} +1 -1
  1352. package/dist/ionic/{p-0dc0d9b5.entry.js → p-11a3973f.entry.js} +1 -1
  1353. package/dist/ionic/{p-a545b4f1.system.js → p-1501b945.system.js} +1 -1
  1354. package/dist/ionic/{p-4e6a1efb.system.entry.js → p-158efe8d.system.entry.js} +1 -1
  1355. package/dist/ionic/p-164aa69c.entry.js +4 -0
  1356. package/dist/ionic/p-17d283b9.system.entry.js +4 -0
  1357. package/dist/ionic/p-18cae04f.js +4 -0
  1358. package/dist/ionic/{p-abacb44b.system.entry.js → p-19c379da.system.entry.js} +1 -1
  1359. package/dist/ionic/p-19d9ceb8.system.js +4 -0
  1360. package/dist/ionic/p-1b27ac67.entry.js +4 -0
  1361. package/dist/ionic/{p-b91fe549.entry.js → p-1c249831.entry.js} +1 -1
  1362. package/dist/ionic/{p-b4b4bb29.system.js → p-1cca10d6.system.js} +1 -1
  1363. package/dist/ionic/p-1e4371bd.js +4 -0
  1364. package/dist/ionic/{p-c7b8c2ef.system.entry.js → p-20e0e75d.system.entry.js} +1 -1
  1365. package/dist/ionic/{p-34d2de14.system.entry.js → p-22827063.system.entry.js} +1 -1
  1366. package/dist/ionic/{p-64ed03a3.entry.js → p-26c4bf85.entry.js} +1 -1
  1367. package/dist/ionic/{p-419eb426.js → p-27281edd.js} +1 -1
  1368. package/dist/ionic/{p-965677f1.entry.js → p-2894d5f6.entry.js} +1 -1
  1369. package/dist/ionic/p-290d3fe9.js +5 -0
  1370. package/dist/ionic/p-29d03b3a.js +4 -0
  1371. package/dist/ionic/p-2a583966.entry.js +4 -0
  1372. package/dist/ionic/p-2b7827c7.js +4 -0
  1373. package/dist/ionic/{p-3d7fea9b.system.entry.js → p-2ba9a9bd.system.entry.js} +1 -1
  1374. package/dist/ionic/p-2cf21a15.system.entry.js +4 -0
  1375. package/dist/ionic/p-2df97906.system.entry.js +4 -0
  1376. package/dist/ionic/{p-fa8d4788.system.js → p-31b2326e.system.js} +1 -1
  1377. package/dist/ionic/{p-744973f3.entry.js → p-3313c481.entry.js} +1 -1
  1378. package/dist/ionic/{p-ffb876b0.system.entry.js → p-332ea4d3.system.entry.js} +1 -1
  1379. package/dist/ionic/{p-97e31c0a.system.js → p-3671f1b9.system.js} +1 -1
  1380. package/dist/ionic/p-36d187af.js +4 -0
  1381. package/dist/ionic/p-376a6063.js +4 -0
  1382. package/dist/ionic/p-38531958.system.entry.js +4 -0
  1383. package/dist/ionic/{p-55ed230e.system.js → p-38c337e7.system.js} +1 -1
  1384. package/dist/ionic/p-38f2c6bb.system.js +4 -0
  1385. package/dist/ionic/{p-3bad5c1a.js → p-3a75d7fd.js} +1 -1
  1386. package/dist/ionic/{p-8b29691f.entry.js → p-3dfc522b.entry.js} +1 -1
  1387. package/dist/ionic/{p-3de79805.entry.js → p-3e8d5e53.entry.js} +1 -1
  1388. package/dist/ionic/p-40f68333.system.js +4 -0
  1389. package/dist/ionic/{p-a6d83a03.system.entry.js → p-41208f54.system.entry.js} +1 -1
  1390. package/dist/ionic/{p-b287ab05.js → p-4180a747.js} +1 -1
  1391. package/dist/ionic/{p-b923f3d7.js → p-42f189f4.js} +1 -1
  1392. package/dist/ionic/{p-d7ea6a0d.system.entry.js → p-4489dd20.system.entry.js} +1 -1
  1393. package/dist/ionic/p-44a56556.js +4 -0
  1394. package/dist/ionic/{p-e76a4bc8.entry.js → p-44dc52e5.entry.js} +1 -1
  1395. package/dist/ionic/{p-f5a750e4.system.entry.js → p-4685218a.system.entry.js} +1 -1
  1396. package/dist/ionic/p-469dd571.system.entry.js +4 -0
  1397. package/dist/ionic/{p-5bd4e009.entry.js → p-47bb15a1.entry.js} +1 -1
  1398. package/dist/ionic/{p-664d2b07.system.entry.js → p-4981ea0a.system.entry.js} +1 -1
  1399. package/dist/ionic/{p-cf425ec5.system.entry.js → p-507ddbfe.system.entry.js} +1 -1
  1400. package/dist/ionic/{p-14aca3fb.entry.js → p-529b24fb.entry.js} +1 -1
  1401. package/dist/ionic/p-52cfafe9.system.js +5 -0
  1402. package/dist/ionic/p-53ec4f1c.system.js +4 -0
  1403. package/dist/ionic/{p-c0c81820.system.js → p-5ad1fe3b.system.js} +1 -1
  1404. package/dist/ionic/{p-7cee75c0.entry.js → p-60959b71.entry.js} +1 -1
  1405. package/dist/ionic/p-61e4d3ec.entry.js +4 -0
  1406. package/dist/ionic/{p-1cb5f2f8.system.entry.js → p-648ad047.system.entry.js} +1 -1
  1407. package/dist/ionic/p-66d633fb.js +4 -0
  1408. package/dist/ionic/{p-63f08fe3.entry.js → p-6855f26a.entry.js} +1 -1
  1409. package/dist/ionic/{p-1a8ae7a7.system.entry.js → p-69641343.system.entry.js} +1 -1
  1410. package/dist/ionic/{p-800ef057.js → p-6ab03751.js} +1 -1
  1411. package/dist/ionic/{p-18e01b30.system.entry.js → p-6c277fa2.system.entry.js} +1 -1
  1412. package/dist/ionic/{p-0e23256e.system.entry.js → p-6e0539ea.system.entry.js} +1 -1
  1413. package/dist/ionic/p-6fba0ce1.system.entry.js +4 -0
  1414. package/dist/ionic/{p-4c80afe1.system.entry.js → p-745e3339.system.entry.js} +1 -1
  1415. package/dist/ionic/p-767f1a92.entry.js +4 -0
  1416. package/dist/ionic/{p-8a308596.system.js → p-7798c78a.system.js} +2 -2
  1417. package/dist/ionic/p-7dc892f8.entry.js +4 -0
  1418. package/dist/ionic/{p-6c3d5383.js → p-7fae5c36.js} +1 -1
  1419. package/dist/ionic/{p-48d9faa7.entry.js → p-803efb5d.entry.js} +1 -1
  1420. package/dist/ionic/{p-a8e68fd9.entry.js → p-806a9810.entry.js} +1 -1
  1421. package/dist/ionic/p-84b567a6.entry.js +4 -0
  1422. package/dist/ionic/p-85f48531.entry.js +4 -0
  1423. package/dist/ionic/p-87bb3735.system.js +4 -0
  1424. package/dist/ionic/{p-613d4042.system.js → p-888db766.system.js} +1 -1
  1425. package/dist/ionic/p-88d5fbd3.js +4 -0
  1426. package/dist/ionic/{p-ccdcb022.system.js → p-8985cdb6.system.js} +1 -1
  1427. package/dist/ionic/p-8aa1d0b7.system.js +4 -0
  1428. package/dist/ionic/{p-a9c3699b.system.entry.js → p-8f301ac5.system.entry.js} +1 -1
  1429. package/dist/ionic/{p-174f3446.entry.js → p-928ee57a.entry.js} +1 -1
  1430. package/dist/ionic/p-932f2259.system.entry.js +4 -0
  1431. package/dist/ionic/p-93390f78.entry.js +4 -0
  1432. package/dist/ionic/p-950c05ad.entry.js +4 -0
  1433. package/dist/ionic/{p-3fb57e1b.system.entry.js → p-96d4814f.system.entry.js} +1 -1
  1434. package/dist/ionic/p-97174c1e.js +4 -0
  1435. package/dist/ionic/p-979d4f5c.system.js +4 -0
  1436. package/dist/ionic/p-98f35d98.js +4 -0
  1437. package/dist/ionic/{p-14b4348c.system.js → p-9a68d8ef.system.js} +1 -1
  1438. package/dist/ionic/p-9ba72fdb.system.entry.js +4 -0
  1439. package/dist/ionic/{p-41122cd6.system.js → p-9f94c72e.system.js} +1 -1
  1440. package/dist/ionic/{p-92800752.entry.js → p-9fb45814.entry.js} +1 -1
  1441. package/dist/ionic/p-9fda6824.system.entry.js +4 -0
  1442. package/dist/ionic/{p-1dc91702.entry.js → p-a06501e3.entry.js} +1 -1
  1443. package/dist/ionic/{p-c4042875.system.js → p-a074be82.system.js} +1 -1
  1444. package/dist/ionic/{p-c7d30db9.entry.js → p-a3013394.entry.js} +1 -1
  1445. package/dist/ionic/p-a42ef163.system.entry.js +4 -0
  1446. package/dist/ionic/p-a49931aa.system.js +4 -0
  1447. package/dist/ionic/{p-db5043df.system.entry.js → p-a821750c.system.entry.js} +1 -1
  1448. package/dist/ionic/{p-1d269117.system.entry.js → p-abd5d0d5.system.entry.js} +1 -1
  1449. package/dist/ionic/{p-9209d90c.entry.js → p-ade3cf46.entry.js} +1 -1
  1450. package/dist/ionic/{p-1e86a71b.entry.js → p-ae4b7df8.entry.js} +1 -1
  1451. package/dist/ionic/p-aee39e06.entry.js +4 -0
  1452. package/dist/ionic/{p-09d142b3.system.js → p-afa9f205.system.js} +1 -1
  1453. package/dist/ionic/{p-67e18f02.system.entry.js → p-b7058a0e.system.entry.js} +1 -1
  1454. package/dist/ionic/p-b78e6a44.entry.js +4 -0
  1455. package/dist/ionic/{p-beb64be7.system.entry.js → p-b7a2ffc9.system.entry.js} +1 -1
  1456. package/dist/ionic/{p-0330f0a3.system.entry.js → p-b8a9e195.system.entry.js} +1 -1
  1457. package/dist/ionic/{p-8ad82eb3.entry.js → p-b964aba3.entry.js} +1 -1
  1458. package/dist/ionic/{p-ff5144f3.system.entry.js → p-beeed22c.system.entry.js} +1 -1
  1459. package/dist/ionic/{p-5deff017.entry.js → p-c08fe2c0.entry.js} +1 -1
  1460. package/dist/ionic/p-c1701827.entry.js +4 -0
  1461. package/dist/ionic/{p-b2a74a72.entry.js → p-c5acfeb1.entry.js} +1 -1
  1462. package/dist/ionic/p-c61cc894.js +4 -0
  1463. package/dist/ionic/{p-ab4cff27.system.js → p-cabad15b.system.js} +1 -1
  1464. package/dist/ionic/{p-07d9e9cd.system.entry.js → p-cb8dff22.system.entry.js} +1 -1
  1465. package/dist/ionic/p-cd1b920b.entry.js +4 -0
  1466. package/dist/ionic/p-cd574dfa.js +4 -0
  1467. package/dist/ionic/{p-0492946a.entry.js → p-cf235986.entry.js} +1 -1
  1468. package/dist/ionic/p-cf53213c.entry.js +4 -0
  1469. package/dist/ionic/p-d51674c5.system.js +4 -0
  1470. package/dist/ionic/{p-45da1e68.system.entry.js → p-d93eed83.system.entry.js} +1 -1
  1471. package/dist/ionic/{p-c919498d.entry.js → p-da5e2652.entry.js} +1 -1
  1472. package/dist/ionic/p-dc6d8647.entry.js +4 -0
  1473. package/dist/ionic/p-dc71e4ef.system.entry.js +4 -0
  1474. package/dist/ionic/{p-bba2ce59.system.js → p-ddbb2d5b.system.js} +1 -1
  1475. package/dist/ionic/{p-6e23777e.system.entry.js → p-ddd48faf.system.entry.js} +1 -1
  1476. package/dist/ionic/p-de6f8b28.system.js +4 -0
  1477. package/dist/ionic/p-de756e5c.js +4 -0
  1478. package/dist/ionic/{p-7ab6fc5a.system.entry.js → p-e2903cdc.system.entry.js} +1 -1
  1479. package/dist/ionic/{p-0a794e83.entry.js → p-e33d1ebc.entry.js} +1 -1
  1480. package/dist/ionic/p-ebe8bd8a.entry.js +4 -0
  1481. package/dist/ionic/p-eef72e06.js +4 -0
  1482. package/dist/ionic/{p-5da0eb3e.system.entry.js → p-f0504446.system.entry.js} +1 -1
  1483. package/dist/ionic/p-f434bcf3.system.entry.js +4 -0
  1484. package/dist/ionic/p-f5d2dc9b.js +4 -0
  1485. package/dist/ionic/{p-a936d224.system.js → p-f6e9c227.system.js} +1 -1
  1486. package/dist/ionic/p-f894e0ad.entry.js +4 -0
  1487. package/dist/types/components/accordion/accordion.d.ts +62 -62
  1488. package/dist/types/components/accordion-group/accordion-group-interface.d.ts +3 -3
  1489. package/dist/types/components/accordion-group/accordion-group.d.ts +76 -76
  1490. package/dist/types/components/action-sheet/action-sheet-interface.d.ts +25 -25
  1491. package/dist/types/components/action-sheet/action-sheet.d.ts +149 -149
  1492. package/dist/types/components/action-sheet/test/basic/fixture.d.ts +7 -7
  1493. package/dist/types/components/alert/alert-interface.d.ts +45 -45
  1494. package/dist/types/components/alert/alert.d.ts +181 -181
  1495. package/dist/types/components/app/app.d.ts +15 -15
  1496. package/dist/types/components/avatar/avatar.d.ts +1 -1
  1497. package/dist/types/components/back-button/back-button.d.ts +41 -41
  1498. package/dist/types/components/backdrop/backdrop.d.ts +22 -22
  1499. package/dist/types/components/badge/badge.d.ts +7 -7
  1500. package/dist/types/components/breadcrumb/breadcrumb-interface.d.ts +4 -4
  1501. package/dist/types/components/breadcrumb/breadcrumb.d.ts +87 -87
  1502. package/dist/types/components/breadcrumbs/breadcrumbs.d.ts +39 -39
  1503. package/dist/types/components/button/button.d.ts +121 -121
  1504. package/dist/types/components/buttons/buttons.d.ts +14 -14
  1505. package/dist/types/components/card/card.d.ts +57 -57
  1506. package/dist/types/components/card-content/card-content.d.ts +1 -1
  1507. package/dist/types/components/card-header/card-header.d.ts +13 -13
  1508. package/dist/types/components/card-subtitle/card-subtitle.d.ts +7 -7
  1509. package/dist/types/components/card-title/card-title.d.ts +7 -7
  1510. package/dist/types/components/checkbox/checkbox-interface.d.ts +4 -4
  1511. package/dist/types/components/checkbox/checkbox.d.ts +112 -111
  1512. package/dist/types/components/chip/chip.d.ts +15 -15
  1513. package/dist/types/components/col/col.d.ts +128 -128
  1514. package/dist/types/components/content/content-interface.d.ts +6 -6
  1515. package/dist/types/components/content/content.d.ts +129 -129
  1516. package/dist/types/components/datetime/datetime-interface.d.ts +15 -15
  1517. package/dist/types/components/datetime/datetime.d.ts +407 -407
  1518. package/dist/types/components/datetime/utils/data.d.ts +11 -11
  1519. package/dist/types/components/datetime/utils/manipulation.d.ts +59 -32
  1520. package/dist/types/components/datetime/utils/state.d.ts +8 -8
  1521. package/dist/types/components/datetime-button/datetime-button.d.ts +59 -59
  1522. package/dist/types/components/fab/fab.d.ts +33 -33
  1523. package/dist/types/components/fab-button/fab-button.d.ts +88 -88
  1524. package/dist/types/components/fab-list/fab-list.d.ts +11 -11
  1525. package/dist/types/components/footer/footer.d.ts +27 -27
  1526. package/dist/types/components/grid/grid.d.ts +5 -5
  1527. package/dist/types/components/header/header.d.ts +31 -31
  1528. package/dist/types/components/header/header.utils.d.ts +7 -7
  1529. package/dist/types/components/img/img.d.ts +30 -30
  1530. package/dist/types/components/infinite-scroll/infinite-scroll-interface.d.ts +1 -1
  1531. package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +65 -58
  1532. package/dist/types/components/infinite-scroll-content/infinite-scroll-content.d.ts +23 -23
  1533. package/dist/types/components/input/input-interface.d.ts +6 -6
  1534. package/dist/types/components/input/input.d.ts +321 -315
  1535. package/dist/types/components/item/item.d.ts +111 -111
  1536. package/dist/types/components/item-divider/item-divider.d.ts +16 -16
  1537. package/dist/types/components/item-group/item-group.d.ts +1 -1
  1538. package/dist/types/components/item-option/item-option.d.ts +44 -44
  1539. package/dist/types/components/item-options/item-options.d.ts +13 -13
  1540. package/dist/types/components/item-sliding/item-sliding-interface.d.ts +1 -1
  1541. package/dist/types/components/item-sliding/item-sliding.d.ts +75 -75
  1542. package/dist/types/components/label/label.d.ts +30 -30
  1543. package/dist/types/components/list/list.d.ts +17 -17
  1544. package/dist/types/components/list-header/list-header.d.ts +11 -11
  1545. package/dist/types/components/loading/loading-interface.d.ts +16 -16
  1546. package/dist/types/components/loading/loading.d.ts +152 -152
  1547. package/dist/types/components/menu/menu-interface.d.ts +39 -39
  1548. package/dist/types/components/menu/menu.d.ts +140 -140
  1549. package/dist/types/components/menu-button/menu-button.d.ts +30 -30
  1550. package/dist/types/components/menu-toggle/menu-toggle.d.ts +21 -21
  1551. package/dist/types/components/modal/animations/sheet.d.ts +4 -4
  1552. package/dist/types/components/modal/gestures/sheet.d.ts +30 -30
  1553. package/dist/types/components/modal/gestures/swipe-to-close.d.ts +1 -1
  1554. package/dist/types/components/modal/modal-interface.d.ts +27 -27
  1555. package/dist/types/components/modal/modal.d.ts +265 -265
  1556. package/dist/types/components/modal/test/fixtures.d.ts +7 -7
  1557. package/dist/types/components/nav/nav-interface.d.ts +40 -40
  1558. package/dist/types/components/nav/nav.d.ts +247 -247
  1559. package/dist/types/components/nav/view-controller.d.ts +13 -13
  1560. package/dist/types/components/nav-link/nav-link.d.ts +19 -19
  1561. package/dist/types/components/note/note.d.ts +7 -7
  1562. package/dist/types/components/picker/picker-interface.d.ts +43 -43
  1563. package/dist/types/components/picker/picker.d.ts +149 -149
  1564. package/dist/types/components/picker-column/picker-column.d.ts +39 -39
  1565. package/dist/types/components/picker-column-internal/picker-column-internal-interfaces.d.ts +3 -3
  1566. package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +93 -89
  1567. package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +4 -4
  1568. package/dist/types/components/picker-internal/picker-internal.d.ts +94 -94
  1569. package/dist/types/components/popover/popover-interface.d.ts +26 -26
  1570. package/dist/types/components/popover/popover.d.ts +279 -279
  1571. package/dist/types/components/popover/test/fixture.d.ts +5 -5
  1572. package/dist/types/components/popover/utils.d.ts +25 -25
  1573. package/dist/types/components/progress-bar/progress-bar.d.ts +27 -27
  1574. package/dist/types/components/radio/radio.d.ts +100 -99
  1575. package/dist/types/components/radio-group/radio-group-interface.d.ts +5 -4
  1576. package/dist/types/components/radio-group/radio-group.d.ts +51 -44
  1577. package/dist/types/components/radio-group/test/fixtures.d.ts +5 -5
  1578. package/dist/types/components/range/range-interface.d.ts +7 -7
  1579. package/dist/types/components/range/range.d.ts +193 -192
  1580. package/dist/types/components/refresher/refresher-interface.d.ts +3 -3
  1581. package/dist/types/components/refresher/refresher.d.ts +132 -132
  1582. package/dist/types/components/refresher-content/refresher-content.d.ts +44 -44
  1583. package/dist/types/components/reorder/reorder.d.ts +3 -3
  1584. package/dist/types/components/reorder-group/reorder-group-interface.d.ts +5 -5
  1585. package/dist/types/components/reorder-group/reorder-group.d.ts +53 -53
  1586. package/dist/types/components/ripple-effect/ripple-effect.d.ts +20 -20
  1587. package/dist/types/components/route/route-interface.d.ts +1 -1
  1588. package/dist/types/components/route/route.d.ts +43 -43
  1589. package/dist/types/components/route-redirect/route-redirect.d.ts +33 -33
  1590. package/dist/types/components/router/router.d.ts +74 -73
  1591. package/dist/types/components/router/utils/dom.d.ts +2 -2
  1592. package/dist/types/components/router/utils/interface.d.ts +31 -31
  1593. package/dist/types/components/router/utils/matching.d.ts +6 -6
  1594. package/dist/types/components/router-link/router-link.d.ts +34 -34
  1595. package/dist/types/components/router-outlet/router-outlet.d.ts +41 -41
  1596. package/dist/types/components/row/row.d.ts +1 -1
  1597. package/dist/types/components/searchbar/searchbar-interface.d.ts +6 -6
  1598. package/dist/types/components/searchbar/searchbar.d.ts +235 -233
  1599. package/dist/types/components/segment/segment-interface.d.ts +3 -3
  1600. package/dist/types/components/segment/segment.d.ts +82 -82
  1601. package/dist/types/components/segment-button/segment-button.d.ts +36 -36
  1602. package/dist/types/components/select/select-interface.d.ts +3 -3
  1603. package/dist/types/components/select/select.d.ts +238 -233
  1604. package/dist/types/components/select-option/select-option.d.ts +11 -11
  1605. package/dist/types/components/select-popover/select-popover-interface.d.ts +8 -8
  1606. package/dist/types/components/select-popover/select-popover.d.ts +39 -39
  1607. package/dist/types/components/select-popover/test/fixtures.d.ts +12 -12
  1608. package/dist/types/components/skeleton-text/skeleton-text.d.ts +15 -7
  1609. package/dist/types/components/spinner/spinner-configs.d.ts +96 -96
  1610. package/dist/types/components/spinner/spinner-interface.d.ts +14 -14
  1611. package/dist/types/components/spinner/spinner.d.ts +21 -21
  1612. package/dist/types/components/split-pane/split-pane.d.ts +33 -33
  1613. package/dist/types/components/tab/tab.d.ts +21 -21
  1614. package/dist/types/components/tab-bar/tab-bar-interface.d.ts +4 -4
  1615. package/dist/types/components/tab-bar/tab-bar.d.ts +34 -34
  1616. package/dist/types/components/tab-button/tab-button.d.ts +56 -56
  1617. package/dist/types/components/tabs/tabs-interface.d.ts +4 -4
  1618. package/dist/types/components/tabs/tabs.d.ts +52 -52
  1619. package/dist/types/components/text/text.d.ts +7 -7
  1620. package/dist/types/components/textarea/textarea-interface.d.ts +6 -6
  1621. package/dist/types/components/textarea/textarea.d.ts +275 -269
  1622. package/dist/types/components/thumbnail/thumbnail.d.ts +1 -1
  1623. package/dist/types/components/title/title.d.ts +21 -21
  1624. package/dist/types/components/toast/animations/utils.d.ts +15 -4
  1625. package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
  1626. package/dist/types/components/toast/toast-interface.d.ts +37 -35
  1627. package/dist/types/components/toast/toast.d.ts +241 -214
  1628. package/dist/types/components/toggle/toggle-interface.d.ts +4 -4
  1629. package/dist/types/components/toggle/toggle.d.ts +117 -116
  1630. package/dist/types/components/toolbar/toolbar.d.ts +11 -11
  1631. package/dist/types/components.d.ts +52 -13
  1632. package/dist/types/global/config.d.ts +6 -6
  1633. package/dist/types/interface.d.ts +1 -5
  1634. package/dist/types/jest.d.ts +5 -0
  1635. package/dist/types/stencil-public-runtime.d.ts +8 -0
  1636. package/dist/types/utils/animation/animation-interface.d.ts +205 -205
  1637. package/dist/types/utils/browser/index.d.ts +17 -8
  1638. package/dist/types/utils/config.d.ts +175 -175
  1639. package/dist/types/utils/element-interface.d.ts +6 -6
  1640. package/dist/types/utils/focus-visible.d.ts +2 -2
  1641. package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
  1642. package/dist/types/utils/forms/form-controller.d.ts +3 -3
  1643. package/dist/types/utils/forms/index.d.ts +1 -0
  1644. package/dist/types/utils/forms/notch-controller.d.ts +2 -2
  1645. package/dist/types/utils/framework-delegate.d.ts +3 -3
  1646. package/dist/types/utils/gesture/gesture-controller.d.ts +49 -49
  1647. package/dist/types/utils/gesture/index.d.ts +31 -31
  1648. package/dist/types/utils/gesture/listener.d.ts +2 -2
  1649. package/dist/types/utils/gesture/pointer-events.d.ts +12 -12
  1650. package/dist/types/utils/gesture/recognizers.d.ts +4 -4
  1651. package/dist/types/utils/hardware-back-button.d.ts +4 -0
  1652. package/dist/types/utils/helpers.d.ts +8 -8
  1653. package/dist/types/utils/input-shims/hacks/scroll-data.d.ts +4 -4
  1654. package/dist/types/utils/keyboard/keyboard-controller.d.ts +3 -3
  1655. package/dist/types/utils/lock-controller.d.ts +1 -1
  1656. package/dist/types/utils/native/haptic.d.ts +38 -38
  1657. package/dist/types/utils/native/keyboard.d.ts +29 -29
  1658. package/dist/types/utils/native/native-interface.d.ts +15 -15
  1659. package/dist/types/utils/native/status-bar.d.ts +8 -8
  1660. package/dist/types/utils/overlays-interface.d.ts +27 -27
  1661. package/dist/types/utils/overlays.d.ts +29 -28
  1662. package/dist/types/utils/platform.d.ts +16 -16
  1663. package/dist/types/utils/sanitization/index.d.ts +2 -2
  1664. package/dist/types/utils/slot-mutation-controller.d.ts +3 -3
  1665. package/dist/types/utils/test/platform.utils.d.ts +66 -66
  1666. package/dist/types/utils/test/playwright/generator.d.ts +16 -7
  1667. package/dist/types/utils/test/playwright/matchers/index.d.ts +3 -3
  1668. package/dist/types/utils/test/playwright/matchers/toHaveReceivedEvent.d.ts +2 -2
  1669. package/dist/types/utils/test/playwright/matchers/toHaveReceivedEventDetail.d.ts +2 -2
  1670. package/dist/types/utils/test/playwright/matchers/toHaveReceivedEventTimes.d.ts +2 -2
  1671. package/dist/types/utils/test/playwright/page/event-spy.d.ts +15 -15
  1672. package/dist/types/utils/test/playwright/page/utils/goto.d.ts +3 -3
  1673. package/dist/types/utils/test/playwright/page/utils/locator.d.ts +15 -15
  1674. package/dist/types/utils/test/playwright/playwright-declarations.d.ts +92 -92
  1675. package/dist/types/utils/test/playwright/playwright-page.d.ts +3 -3
  1676. package/dist/types/utils/test/playwright/viewports/index.d.ts +12 -12
  1677. package/dist/types/utils/test/press-keys.d.ts +14 -14
  1678. package/dist/types/utils/transition/index.d.ts +6 -6
  1679. package/dist/types/utils/watch-options.d.ts +1 -1
  1680. package/hydrate/index.d.ts +1 -1
  1681. package/hydrate/index.js +30685 -30001
  1682. package/package.json +4 -3
  1683. package/dist/cjs/animation-1083855c.js +0 -1061
  1684. package/dist/cjs/button-active-af897e0e.js +0 -69
  1685. package/dist/cjs/config-d5882735.js +0 -199
  1686. package/dist/cjs/cubic-bezier-6b9222ad.js +0 -92
  1687. package/dist/cjs/data-c8d21093.js +0 -1622
  1688. package/dist/cjs/focus-visible-a7545600.js +0 -77
  1689. package/dist/cjs/form-controller-9343050c.js +0 -66
  1690. package/dist/cjs/framework-delegate-c0873a6f.js +0 -144
  1691. package/dist/cjs/gesture-controller-b46721be.js +0 -197
  1692. package/dist/cjs/haptic-678abc9f.js +0 -212
  1693. package/dist/cjs/hardware-back-button-b67c8e75.js +0 -76
  1694. package/dist/cjs/helpers-ea4ccbcb.js +0 -441
  1695. package/dist/cjs/index-0ee995e4.js +0 -459
  1696. package/dist/cjs/index-306a7476.js +0 -32
  1697. package/dist/cjs/index-573877f3.js +0 -243
  1698. package/dist/cjs/index-9f379eaa.js +0 -198
  1699. package/dist/cjs/index-d7561763.js +0 -310
  1700. package/dist/cjs/input-shims-b0a75a01.js +0 -596
  1701. package/dist/cjs/input.utils-0fe3097c.js +0 -137
  1702. package/dist/cjs/ionic-global-ea2901a3.js +0 -230
  1703. package/dist/cjs/ios.transition-ac909bc8.js +0 -654
  1704. package/dist/cjs/keyboard-controller-50beb83a.js +0 -167
  1705. package/dist/cjs/keyboard-fd7db491.js +0 -81
  1706. package/dist/cjs/lock-controller-4ae2eb59.js +0 -40
  1707. package/dist/cjs/md.transition-907af519.js +0 -59
  1708. package/dist/cjs/notch-controller-f4f6af5d.js +0 -155
  1709. package/dist/cjs/overlays-2ffc5f27.js +0 -714
  1710. package/dist/cjs/spinner-configs-f7b5105b.js +0 -147
  1711. package/dist/cjs/status-tap-3fb2391a.js +0 -42
  1712. package/dist/cjs/swipe-back-7e843e77.js +0 -81
  1713. package/dist/cjs/theme-fbc56b3b.js +0 -48
  1714. package/dist/cjs/watch-options-53bbb124.js +0 -49
  1715. package/dist/collection/components/item/test/text/item.e2e.js +0 -14
  1716. package/dist/esm/animation-8aa13916.js +0 -1059
  1717. package/dist/esm/button-active-ce5cba4c.js +0 -67
  1718. package/dist/esm/capacitor-b4979570.js +0 -13
  1719. package/dist/esm/config-96c9ace3.js +0 -193
  1720. package/dist/esm/cubic-bezier-66542bc5.js +0 -90
  1721. package/dist/esm/data-44d9e816.js +0 -1575
  1722. package/dist/esm/focus-visible-85493433.js +0 -75
  1723. package/dist/esm/form-controller-64edeaad.js +0 -64
  1724. package/dist/esm/framework-delegate-aa433dea.js +0 -140
  1725. package/dist/esm/gesture-controller-0fa396c4.js +0 -195
  1726. package/dist/esm/haptic-1243b917.js +0 -206
  1727. package/dist/esm/hardware-back-button-39299f84.js +0 -71
  1728. package/dist/esm/helpers-3379ba19.js +0 -418
  1729. package/dist/esm/index-0aa6e61f.js +0 -308
  1730. package/dist/esm/index-6a0ccabb.js +0 -231
  1731. package/dist/esm/index-7a14ecec.js +0 -29
  1732. package/dist/esm/index-f0cc4e14.js +0 -196
  1733. package/dist/esm/index-ff313b19.js +0 -457
  1734. package/dist/esm/input-shims-d0c93e5d.js +0 -594
  1735. package/dist/esm/input.utils-ec063df4.js +0 -134
  1736. package/dist/esm/ionic-global-40e42e7f.js +0 -224
  1737. package/dist/esm/ios.transition-1651c430.js +0 -651
  1738. package/dist/esm/keyboard-b063f012.js +0 -79
  1739. package/dist/esm/keyboard-b551279d.js +0 -146
  1740. package/dist/esm/keyboard-controller-0c2dce71.js +0 -165
  1741. package/dist/esm/lock-controller-e8c6c051.js +0 -38
  1742. package/dist/esm/md.transition-66f18369.js +0 -57
  1743. package/dist/esm/notch-controller-8c9c0e54.js +0 -153
  1744. package/dist/esm/overlays-6c9feb7e.js +0 -692
  1745. package/dist/esm/spinner-configs-d09fbbbb.js +0 -145
  1746. package/dist/esm/status-tap-9ce68758.js +0 -40
  1747. package/dist/esm/swipe-back-cd4295f3.js +0 -79
  1748. package/dist/esm/theme-17531cdf.js +0 -43
  1749. package/dist/esm/watch-options-02d8498b.js +0 -47
  1750. package/dist/esm-es5/app-globals-2398e405.js +0 -4
  1751. package/dist/esm-es5/data-44d9e816.js +0 -4
  1752. package/dist/esm-es5/index-0aa6e61f.js +0 -4
  1753. package/dist/esm-es5/index-7c9b1bca.js +0 -5
  1754. package/dist/esm-es5/input-shims-d0c93e5d.js +0 -4
  1755. package/dist/esm-es5/input.utils-ec063df4.js +0 -4
  1756. package/dist/esm-es5/md.transition-66f18369.js +0 -4
  1757. package/dist/ionic/p-0d8e9393.entry.js +0 -4
  1758. package/dist/ionic/p-114a36ed.js +0 -4
  1759. package/dist/ionic/p-17240d90.js +0 -4
  1760. package/dist/ionic/p-1e5165db.system.entry.js +0 -4
  1761. package/dist/ionic/p-1f4f0d59.system.entry.js +0 -4
  1762. package/dist/ionic/p-20cf4994.js +0 -4
  1763. package/dist/ionic/p-236063ec.system.entry.js +0 -4
  1764. package/dist/ionic/p-276afddd.js +0 -4
  1765. package/dist/ionic/p-2e8e0045.js +0 -4
  1766. package/dist/ionic/p-32083c2d.js +0 -4
  1767. package/dist/ionic/p-352c0232.system.entry.js +0 -4
  1768. package/dist/ionic/p-3602001b.system.js +0 -4
  1769. package/dist/ionic/p-3632220b.system.js +0 -4
  1770. package/dist/ionic/p-377c636c.system.entry.js +0 -4
  1771. package/dist/ionic/p-39044fe6.system.entry.js +0 -4
  1772. package/dist/ionic/p-3ce8c3e3.entry.js +0 -4
  1773. package/dist/ionic/p-40903d34.system.js +0 -4
  1774. package/dist/ionic/p-4518e4c0.system.entry.js +0 -4
  1775. package/dist/ionic/p-4794e0ac.system.entry.js +0 -4
  1776. package/dist/ionic/p-4a142496.system.entry.js +0 -4
  1777. package/dist/ionic/p-4cd588b3.system.entry.js +0 -4
  1778. package/dist/ionic/p-4dbac22d.entry.js +0 -4
  1779. package/dist/ionic/p-4ecb5692.entry.js +0 -4
  1780. package/dist/ionic/p-5370e786.js +0 -4
  1781. package/dist/ionic/p-5cfb3feb.system.entry.js +0 -4
  1782. package/dist/ionic/p-63d519fb.entry.js +0 -4
  1783. package/dist/ionic/p-64296b15.entry.js +0 -4
  1784. package/dist/ionic/p-67aab78f.js +0 -4
  1785. package/dist/ionic/p-67ed452a.system.entry.js +0 -4
  1786. package/dist/ionic/p-67eecef4.system.js +0 -4
  1787. package/dist/ionic/p-7176cea3.entry.js +0 -4
  1788. package/dist/ionic/p-73411c1b.entry.js +0 -4
  1789. package/dist/ionic/p-73420380.js +0 -4
  1790. package/dist/ionic/p-77e7a9c8.entry.js +0 -4
  1791. package/dist/ionic/p-81c818e7.js +0 -4
  1792. package/dist/ionic/p-8b1be026.js +0 -4
  1793. package/dist/ionic/p-8cf94fc1.js +0 -4
  1794. package/dist/ionic/p-8e1bded3.entry.js +0 -4
  1795. package/dist/ionic/p-97c65aa5.js +0 -4
  1796. package/dist/ionic/p-9ab6f3e6.system.js +0 -4
  1797. package/dist/ionic/p-9b89cbde.js +0 -4
  1798. package/dist/ionic/p-a5c1e6ce.entry.js +0 -4
  1799. package/dist/ionic/p-af016cd3.entry.js +0 -4
  1800. package/dist/ionic/p-b0cee324.entry.js +0 -4
  1801. package/dist/ionic/p-b1142133.entry.js +0 -4
  1802. package/dist/ionic/p-b17b7c3c.system.entry.js +0 -4
  1803. package/dist/ionic/p-b203659a.system.entry.js +0 -4
  1804. package/dist/ionic/p-b6f8ee31.entry.js +0 -4
  1805. package/dist/ionic/p-b8c3f071.system.js +0 -4
  1806. package/dist/ionic/p-b906c5ca.entry.js +0 -4
  1807. package/dist/ionic/p-b912e055.system.js +0 -4
  1808. package/dist/ionic/p-c224b9a9.js +0 -5
  1809. package/dist/ionic/p-ca5219df.entry.js +0 -4
  1810. package/dist/ionic/p-cc196b34.js +0 -4
  1811. package/dist/ionic/p-d1de1188.js +0 -4
  1812. package/dist/ionic/p-d2597b3e.system.js +0 -5
  1813. package/dist/ionic/p-d3952bd5.system.entry.js +0 -4
  1814. package/dist/ionic/p-dfa756ed.system.js +0 -4
  1815. package/dist/ionic/p-e6b240a0.js +0 -4
  1816. package/dist/ionic/p-e8400078.system.entry.js +0 -4
  1817. package/dist/ionic/p-ed636a74.entry.js +0 -4
  1818. package/dist/ionic/p-f8e620f1.entry.js +0 -4
  1819. package/dist/ionic/p-ff5a10f9.system.js +0 -4
  1820. /package/dist/esm-es5/{config-96c9ace3.js → config-49c88215.js} +0 -0
  1821. /package/dist/esm-es5/{cubic-bezier-66542bc5.js → cubic-bezier-fe2083dc.js} +0 -0
  1822. /package/dist/esm-es5/{dir-912e3e13.js → dir-babeabeb.js} +0 -0
  1823. /package/dist/esm-es5/{focus-visible-85493433.js → focus-visible-dd40d69f.js} +0 -0
  1824. /package/dist/esm-es5/{gesture-controller-0fa396c4.js → gesture-controller-1bf57181.js} +0 -0
  1825. /package/dist/esm-es5/{hardware-back-button-39299f84.js → hardware-back-button-b2bc76db.js} +0 -0
  1826. /package/dist/esm-es5/{helpers-3379ba19.js → helpers-ae653409.js} +0 -0
  1827. /package/dist/esm-es5/{index-595d62c9.js → index-9b0d46f4.js} +0 -0
  1828. /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
  1829. /package/dist/esm-es5/{lock-controller-e8c6c051.js → lock-controller-316928be.js} +0 -0
  1830. /package/dist/esm-es5/{spinner-configs-d09fbbbb.js → spinner-configs-964f7cf3.js} +0 -0
  1831. /package/dist/esm-es5/{theme-17531cdf.js → theme-01f3f29c.js} +0 -0
  1832. /package/dist/esm-es5/{watch-options-02d8498b.js → watch-options-c2911ace.js} +0 -0
  1833. /package/dist/ionic/{p-5aac9314.system.js → p-012c3ceb.system.js} +0 -0
  1834. /package/dist/ionic/{p-1b8e1d03.js → p-06fee233.js} +0 -0
  1835. /package/dist/ionic/{p-819ff3b9.system.js → p-08e01816.system.js} +0 -0
  1836. /package/dist/ionic/{p-63eb0acd.js → p-23a9d086.js} +0 -0
  1837. /package/dist/ionic/{p-7c2bac85.js → p-2408c236.js} +0 -0
  1838. /package/dist/ionic/{p-815c2fba.system.js → p-32ad210f.system.js} +0 -0
  1839. /package/dist/ionic/{p-7b021525.js → p-41d5544e.js} +0 -0
  1840. /package/dist/ionic/{p-f10de93b.js → p-459d13d5.js} +0 -0
  1841. /package/dist/ionic/{p-44bc8b45.system.js → p-4609d030.system.js} +0 -0
  1842. /package/dist/ionic/{p-1d072d3d.js → p-47794def.js} +0 -0
  1843. /package/dist/ionic/{p-185e427e.js → p-4b3623da.js} +0 -0
  1844. /package/dist/ionic/{p-772f6c84.system.js → p-4f255d5a.system.js} +0 -0
  1845. /package/dist/ionic/{p-8c15eda7.system.js → p-790220fd.system.js} +0 -0
  1846. /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
  1847. /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
  1848. /package/dist/ionic/{p-e0b06b65.js → p-bb3615f7.js} +0 -0
  1849. /package/dist/ionic/{p-87411e39.system.js → p-c468af8a.system.js} +0 -0
  1850. /package/dist/ionic/{p-9e852ff1.system.js → p-c7c8429a.system.js} +0 -0
  1851. /package/dist/ionic/{p-53b2a46f.js → p-ccd02320.js} +0 -0
  1852. /package/dist/ionic/{p-76fce40e.js → p-d47265c8.js} +0 -0
  1853. /package/dist/ionic/{p-56dc022e.system.js → p-d8d84afa.system.js} +0 -0
  1854. /package/dist/ionic/{p-c4f2dce7.system.js → p-e673a0a2.system.js} +0 -0
  1855. /package/dist/ionic/{p-c18d6eac.js → p-f0c2a614.js} +0 -0
  1856. /package/dist/ionic/{p-2b89ea1b.system.js → p-f233f1e0.system.js} +0 -0
  1857. /package/dist/ionic/{p-6dbfe5d4.js → p-fb813dab.js} +0 -0
  1858. /package/dist/ionic/{p-479cdbf8.system.js → p-ff4b7e40.system.js} +0 -0
@@ -1,32 +1,32 @@
1
1
  /*!
2
2
  * (C) Ionic http://ionicframework.com - MIT License
3
3
  */
4
- import { r as registerInstance, d as createEvent, w as writeTask, h, H as Host, f as getElement } from './index-7c9b1bca.js';
5
- import { startFocusVisible } from './focus-visible-85493433.js';
6
- import { r as raf, d as renderHiddenInput, g as getElementRoot, l as clamp } from './helpers-3379ba19.js';
7
- import { a as printIonError, p as printIonWarning } from './index-595d62c9.js';
8
- import { i as isRTL } from './dir-912e3e13.js';
9
- import { c as createColorClasses, g as getClassMap } from './theme-17531cdf.js';
4
+ import { r as registerInstance, d as createEvent, w as writeTask, h, H as Host, f as getElement } from './index-b7d870cf.js';
5
+ import { startFocusVisible } from './focus-visible-dd40d69f.js';
6
+ import { r as raf, d as renderHiddenInput, g as getElementRoot, l as clamp } from './helpers-ae653409.js';
7
+ import { a as printIonError, p as printIonWarning } from './index-9b0d46f4.js';
8
+ import { i as isRTL } from './dir-babeabeb.js';
9
+ import { c as createColorClasses, g as getClassMap } from './theme-01f3f29c.js';
10
10
  import { c as chevronBack, o as chevronForward, l as chevronDown, p as caretUpSharp, q as caretDownSharp } from './index-c132c5f1.js';
11
- import { b as getIonMode } from './ionic-global-40e42e7f.js';
12
- import { g as generateDayAriaLabel, a as getDay, i as isBefore, b as isAfter, c as isSameDay, d as getPreviousMonth, e as getNextMonth, v as validateParts, f as getPartsFromCalendarDay, h as getEndOfWeek, j as getStartOfWeek, k as getPreviousDay, l as getNextDay, m as getPreviousWeek, n as getNextWeek, p as parseMinParts, o as parseMaxParts, q as parseDate, w as warnIfValueOutOfBounds, r as convertToArrayOfNumbers, s as convertDataToISO, t as getToday, u as getClosestValidDate, x as getNumDaysInMonth, y as getCombinedDateColumnData, z as getMonthColumnData, A as getDayColumnData, B as getYearColumnData, C as isMonthFirstLocale, D as getTimeColumnsData, E as isLocaleDayPeriodRTL, F as getDaysOfWeek, G as getMonthAndYear, H as getDaysOfMonth, I as generateMonths, J as getHourCycle, K as getLocalizedTime, L as getMonthAndDay, M as formatValue, N as getNextYear, O as getPreviousYear, P as clampDate, Q as parseAmPm, R as calculateHourFromAMPM } from './data-44d9e816.js';
13
- import { c as createLockController } from './lock-controller-e8c6c051.js';
14
- import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-6c9feb7e.js';
15
- import { c as createAnimation } from './animation-8aa13916.js';
16
- import { b as hapticSelectionChanged, h as hapticSelectionEnd, a as hapticSelectionStart } from './haptic-1243b917.js';
17
- import './index-7a14ecec.js';
18
- import './framework-delegate-aa433dea.js';
19
- import './hardware-back-button-39299f84.js';
20
- import './capacitor-b4979570.js';
11
+ import { b as getIonMode } from './ionic-global-1f99b929.js';
12
+ import { g as generateDayAriaLabel, a as getDay, i as isBefore, b as isAfter, c as isSameDay, d as getPreviousMonth, e as getNextMonth, v as validateParts, f as getPartsFromCalendarDay, h as getEndOfWeek, j as getStartOfWeek, k as getPreviousDay, l as getNextDay, m as getPreviousWeek, n as getNextWeek, p as parseMinParts, o as parseMaxParts, q as parseDate, w as warnIfValueOutOfBounds, r as convertToArrayOfNumbers, s as convertDataToISO, t as getToday, u as getClosestValidDate, x as getNumDaysInMonth, y as getCombinedDateColumnData, z as getMonthColumnData, A as getDayColumnData, B as getYearColumnData, C as isMonthFirstLocale, D as getTimeColumnsData, E as isLocaleDayPeriodRTL, F as getDaysOfWeek, G as getMonthAndYear, H as getDaysOfMonth, I as generateMonths, J as getHourCycle, K as getLocalizedTime, L as getMonthAndDay, M as formatValue, N as getNextYear, O as getPreviousYear, P as clampDate, Q as parseAmPm, R as calculateHourFromAMPM } from './data-775093f5.js';
13
+ import { c as createLockController } from './lock-controller-316928be.js';
14
+ import { d as createDelegateController, e as createTriggerController, B as BACKDROP, i as isCancel, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod, s as safeCall } from './overlays-b33f6bca.js';
15
+ import { c as createAnimation } from './animation-dde8cc0d.js';
16
+ import { b as hapticSelectionChanged, h as hapticSelectionEnd, a as hapticSelectionStart } from './haptic-554688a5.js';
17
+ import './index-a5d50daf.js';
18
+ import './framework-delegate-bc1fd82a.js';
19
+ import './hardware-back-button-b2bc76db.js';
20
+ import './capacitor-59395cbd.js';
21
21
 
22
22
  const isYearDisabled = (refYear, minParts, maxParts) => {
23
- if (minParts && minParts.year > refYear) {
24
- return true;
25
- }
26
- if (maxParts && maxParts.year < refYear) {
27
- return true;
28
- }
29
- return false;
23
+ if (minParts && minParts.year > refYear) {
24
+ return true;
25
+ }
26
+ if (maxParts && maxParts.year < refYear) {
27
+ return true;
28
+ }
29
+ return false;
30
30
  };
31
31
  /**
32
32
  * Returns true if a given day should
@@ -34,104 +34,104 @@ const isYearDisabled = (refYear, minParts, maxParts) => {
34
34
  * or the max/min dates.
35
35
  */
36
36
  const isDayDisabled = (refParts, minParts, maxParts, dayValues) => {
37
- /**
38
- * If this is a filler date (i.e. padding)
39
- * then the date is disabled.
40
- */
41
- if (refParts.day === null) {
42
- return true;
43
- }
44
- /**
45
- * If user passed in a list of acceptable day values
46
- * check to make sure that the date we are looking
47
- * at is in this array.
48
- */
49
- if (dayValues !== undefined && !dayValues.includes(refParts.day)) {
50
- return true;
51
- }
52
- /**
53
- * Given a min date, perform the following
54
- * checks. If any of them are true, then the
55
- * day should be disabled:
56
- * 1. Is the current year < the min allowed year?
57
- * 2. Is the current year === min allowed year,
58
- * but the current month < the min allowed month?
59
- * 3. Is the current year === min allowed year, the
60
- * current month === min allow month, but the current
61
- * day < the min allowed day?
62
- */
63
- if (minParts && isBefore(refParts, minParts)) {
64
- return true;
65
- }
66
- /**
67
- * Given a max date, perform the following
68
- * checks. If any of them are true, then the
69
- * day should be disabled:
70
- * 1. Is the current year > the max allowed year?
71
- * 2. Is the current year === max allowed year,
72
- * but the current month > the max allowed month?
73
- * 3. Is the current year === max allowed year, the
74
- * current month === max allow month, but the current
75
- * day > the max allowed day?
76
- */
77
- if (maxParts && isAfter(refParts, maxParts)) {
78
- return true;
79
- }
80
- /**
81
- * If none of these checks
82
- * passed then the date should
83
- * be interactive.
84
- */
85
- return false;
37
+ /**
38
+ * If this is a filler date (i.e. padding)
39
+ * then the date is disabled.
40
+ */
41
+ if (refParts.day === null) {
42
+ return true;
43
+ }
44
+ /**
45
+ * If user passed in a list of acceptable day values
46
+ * check to make sure that the date we are looking
47
+ * at is in this array.
48
+ */
49
+ if (dayValues !== undefined && !dayValues.includes(refParts.day)) {
50
+ return true;
51
+ }
52
+ /**
53
+ * Given a min date, perform the following
54
+ * checks. If any of them are true, then the
55
+ * day should be disabled:
56
+ * 1. Is the current year < the min allowed year?
57
+ * 2. Is the current year === min allowed year,
58
+ * but the current month < the min allowed month?
59
+ * 3. Is the current year === min allowed year, the
60
+ * current month === min allow month, but the current
61
+ * day < the min allowed day?
62
+ */
63
+ if (minParts && isBefore(refParts, minParts)) {
64
+ return true;
65
+ }
66
+ /**
67
+ * Given a max date, perform the following
68
+ * checks. If any of them are true, then the
69
+ * day should be disabled:
70
+ * 1. Is the current year > the max allowed year?
71
+ * 2. Is the current year === max allowed year,
72
+ * but the current month > the max allowed month?
73
+ * 3. Is the current year === max allowed year, the
74
+ * current month === max allow month, but the current
75
+ * day > the max allowed day?
76
+ */
77
+ if (maxParts && isAfter(refParts, maxParts)) {
78
+ return true;
79
+ }
80
+ /**
81
+ * If none of these checks
82
+ * passed then the date should
83
+ * be interactive.
84
+ */
85
+ return false;
86
86
  };
87
87
  /**
88
88
  * Given a locale, a date, the selected date(s), and today's date,
89
89
  * generate the state for a given calendar day button.
90
90
  */
91
91
  const getCalendarDayState = (locale, refParts, activeParts, todayParts, minParts, maxParts, dayValues) => {
92
- /**
93
- * activeParts signals what day(s) are currently selected in the datetime.
94
- * If multiple="true", this will be an array, but the logic in this util
95
- * is the same whether we have one selected day or many because we're only
96
- * calculating the state for one button. So, we treat a single activeParts value
97
- * the same as an array of length one.
98
- */
99
- const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
100
- /**
101
- * The day button is active if it is selected, or in other words, if refParts
102
- * matches at least one selected date.
103
- */
104
- const isActive = activePartsArray.find((parts) => isSameDay(refParts, parts)) !== undefined;
105
- const isToday = isSameDay(refParts, todayParts);
106
- const disabled = isDayDisabled(refParts, minParts, maxParts, dayValues);
107
- /**
108
- * Note that we always return one object regardless of whether activeParts
109
- * was an array, since we pare down to one value for isActive.
110
- */
111
- return {
112
- disabled,
113
- isActive,
114
- isToday,
115
- ariaSelected: isActive ? 'true' : null,
116
- ariaLabel: generateDayAriaLabel(locale, isToday, refParts),
117
- text: refParts.day != null ? getDay(locale, refParts) : null,
118
- };
92
+ /**
93
+ * activeParts signals what day(s) are currently selected in the datetime.
94
+ * If multiple="true", this will be an array, but the logic in this util
95
+ * is the same whether we have one selected day or many because we're only
96
+ * calculating the state for one button. So, we treat a single activeParts value
97
+ * the same as an array of length one.
98
+ */
99
+ const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
100
+ /**
101
+ * The day button is active if it is selected, or in other words, if refParts
102
+ * matches at least one selected date.
103
+ */
104
+ const isActive = activePartsArray.find((parts) => isSameDay(refParts, parts)) !== undefined;
105
+ const isToday = isSameDay(refParts, todayParts);
106
+ const disabled = isDayDisabled(refParts, minParts, maxParts, dayValues);
107
+ /**
108
+ * Note that we always return one object regardless of whether activeParts
109
+ * was an array, since we pare down to one value for isActive.
110
+ */
111
+ return {
112
+ disabled,
113
+ isActive,
114
+ isToday,
115
+ ariaSelected: isActive ? 'true' : null,
116
+ ariaLabel: generateDayAriaLabel(locale, isToday, refParts),
117
+ text: refParts.day != null ? getDay(locale, refParts) : null,
118
+ };
119
119
  };
120
120
  /**
121
121
  * Returns `true` if the month is disabled given the
122
122
  * current date value and min/max date constraints.
123
123
  */
124
124
  const isMonthDisabled = (refParts, { minParts, maxParts, }) => {
125
- // If the year is disabled then the month is disabled.
126
- if (isYearDisabled(refParts.year, minParts, maxParts)) {
127
- return true;
128
- }
129
- // If the date value is before the min date, then the month is disabled.
130
- // If the date value is after the max date, then the month is disabled.
131
- if ((minParts && isBefore(refParts, minParts)) || (maxParts && isAfter(refParts, maxParts))) {
132
- return true;
133
- }
134
- return false;
125
+ // If the year is disabled then the month is disabled.
126
+ if (isYearDisabled(refParts.year, minParts, maxParts)) {
127
+ return true;
128
+ }
129
+ // If the date value is before the min date, then the month is disabled.
130
+ // If the date value is after the max date, then the month is disabled.
131
+ if ((minParts && isBefore(refParts, minParts)) || (maxParts && isAfter(refParts, maxParts))) {
132
+ return true;
133
+ }
134
+ return false;
135
135
  };
136
136
  /**
137
137
  * Given a working date, an optional minimum date range,
@@ -139,21 +139,21 @@ const isMonthDisabled = (refParts, { minParts, maxParts, }) => {
139
139
  * previous navigation button is disabled.
140
140
  */
141
141
  const isPrevMonthDisabled = (refParts, minParts, maxParts) => {
142
- const prevMonth = Object.assign(Object.assign({}, getPreviousMonth(refParts)), { day: null });
143
- return isMonthDisabled(prevMonth, {
144
- minParts,
145
- maxParts,
146
- });
142
+ const prevMonth = Object.assign(Object.assign({}, getPreviousMonth(refParts)), { day: null });
143
+ return isMonthDisabled(prevMonth, {
144
+ minParts,
145
+ maxParts,
146
+ });
147
147
  };
148
148
  /**
149
149
  * Given a working date and a maximum date range,
150
150
  * determine if the next navigation button is disabled.
151
151
  */
152
152
  const isNextMonthDisabled = (refParts, maxParts) => {
153
- const nextMonth = Object.assign(Object.assign({}, getNextMonth(refParts)), { day: null });
154
- return isMonthDisabled(nextMonth, {
155
- maxParts,
156
- });
153
+ const nextMonth = Object.assign(Object.assign({}, getNextMonth(refParts)), { day: null });
154
+ return isMonthDisabled(nextMonth, {
155
+ maxParts,
156
+ });
157
157
  };
158
158
  /**
159
159
  * Given the value of the highlightedDates property
@@ -161,1618 +161,1650 @@ const isNextMonthDisabled = (refParts, maxParts) => {
161
161
  * that date, or undefined if none are found.
162
162
  */
163
163
  const getHighlightStyles = (highlightedDates, dateIsoString, el) => {
164
- if (Array.isArray(highlightedDates)) {
165
- const dateStringWithoutTime = dateIsoString.split('T')[0];
166
- const matchingHighlight = highlightedDates.find((hd) => hd.date === dateStringWithoutTime);
167
- if (matchingHighlight) {
168
- return {
169
- textColor: matchingHighlight.textColor,
170
- backgroundColor: matchingHighlight.backgroundColor,
171
- };
172
- }
173
- }
174
- else {
175
- /**
176
- * Wrap in a try-catch to prevent exceptions in the user's function
177
- * from interrupting the calendar's rendering.
178
- */
179
- try {
180
- return highlightedDates(dateIsoString);
164
+ if (Array.isArray(highlightedDates)) {
165
+ const dateStringWithoutTime = dateIsoString.split('T')[0];
166
+ const matchingHighlight = highlightedDates.find((hd) => hd.date === dateStringWithoutTime);
167
+ if (matchingHighlight) {
168
+ return {
169
+ textColor: matchingHighlight.textColor,
170
+ backgroundColor: matchingHighlight.backgroundColor,
171
+ };
172
+ }
181
173
  }
182
- catch (e) {
183
- printIonError('Exception thrown from provided `highlightedDates` callback. Please check your function and try again.', el, e);
174
+ else {
175
+ /**
176
+ * Wrap in a try-catch to prevent exceptions in the user's function
177
+ * from interrupting the calendar's rendering.
178
+ */
179
+ try {
180
+ return highlightedDates(dateIsoString);
181
+ }
182
+ catch (e) {
183
+ printIonError('Exception thrown from provided `highlightedDates` callback. Please check your function and try again.', el, e);
184
+ }
184
185
  }
185
- }
186
- return undefined;
186
+ return undefined;
187
187
  };
188
188
 
189
- const datetimeIosCss = ":host{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;background:var(--background);overflow:hidden}ion-picker-column-internal{min-width:26px}:host(.datetime-size-fixed){width:auto;height:auto}:host(.datetime-size-fixed:not(.datetime-prefer-wheel)){max-width:350px}:host(.datetime-size-fixed.datetime-prefer-wheel){min-width:350px;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}:host(.datetime-size-cover){width:100%}:host .calendar-body,:host .datetime-year{opacity:0}:host(:not(.datetime-ready)) .datetime-year{position:absolute;pointer-events:none}:host(.datetime-ready) .calendar-body{opacity:1}:host(.datetime-ready) .datetime-year{display:none;opacity:1}:host .wheel-order-year-first .day-column{-ms-flex-order:3;order:3;text-align:end}:host .wheel-order-year-first .month-column{-ms-flex-order:2;order:2;text-align:end}:host .wheel-order-year-first .year-column{-ms-flex-order:1;order:1;text-align:start}:host .datetime-calendar,:host .datetime-year{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-flow:column;flex-flow:column}:host(.show-month-and-year) .datetime-year{display:-ms-flexbox;display:flex}@supports (background: -webkit-named-image(apple-pay-logo-black)) and (not (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{position:absolute;visibility:hidden;pointer-events:none}@supports (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{inset-inline-start:-99999px}}@supports not (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{left:-99999px}:host-context([dir=rtl]):host(.show-month-and-year) .calendar-next-prev,:host-context([dir=rtl]).show-month-and-year .calendar-next-prev,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-days-of-week,:host-context([dir=rtl]).show-month-and-year .calendar-days-of-week,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-body,:host-context([dir=rtl]).show-month-and-year .calendar-body,:host-context([dir=rtl]):host(.show-month-and-year) .datetime-time,:host-context([dir=rtl]).show-month-and-year .datetime-time{left:unset;right:unset;right:-99999px}@supports selector(:dir(rtl)){:host(.show-month-and-year:dir(rtl)) .calendar-next-prev,:host(.show-month-and-year:dir(rtl)) .calendar-days-of-week,:host(.show-month-and-year:dir(rtl)) .calendar-body,:host(.show-month-and-year:dir(rtl)) .datetime-time{left:unset;right:unset;right:-99999px}}}}@supports (not (background: -webkit-named-image(apple-pay-logo-black))) or ((background: -webkit-named-image(apple-pay-logo-black)) and (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{display:none}}:host(.month-year-picker-open) .datetime-footer{display:none}:host(.datetime-disabled){pointer-events:none}:host(.datetime-disabled) .calendar-days-of-week,:host(.datetime-disabled) .datetime-time{opacity:0.4}:host(.datetime-readonly){pointer-events:none;}:host(.datetime-readonly) .calendar-action-buttons,:host(.datetime-readonly) .calendar-body,:host(.datetime-readonly) .datetime-year{pointer-events:initial}:host(.datetime-readonly) .calendar-day[disabled]:not(.calendar-day-constrained),:host(.datetime-readonly) .datetime-action-buttons ion-button[disabled]{opacity:1}:host .datetime-header .datetime-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host .datetime-action-buttons.has-clear-button{width:100%}:host .datetime-action-buttons ion-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.datetime-action-buttons .datetime-action-buttons-container{display:-ms-flexbox;display:flex}:host .calendar-action-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host .calendar-action-buttons ion-item,:host .calendar-action-buttons ion-button{--background:translucent}:host .calendar-action-buttons ion-item ion-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}:host .calendar-action-buttons ion-item ion-icon{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:0;padding-inline-end:0;padding-top:0;padding-bottom:0}:host .calendar-days-of-week{display:grid;grid-template-columns:repeat(7, 1fr);text-align:center}.calendar-days-of-week .day-of-week{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:0;margin-bottom:0}:host .calendar-body{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-webkit-scroll-snap-type:x mandatory;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none;outline:none}:host .calendar-body .calendar-month{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;scroll-snap-align:start;scroll-snap-stop:always;-ms-flex-negative:0;flex-shrink:0;width:100%}:host .calendar-body .calendar-month-disabled{scroll-snap-align:none}:host .calendar-body::-webkit-scrollbar{display:none}:host .calendar-body .calendar-month-grid{display:grid;grid-template-columns:repeat(7, 1fr)}:host .calendar-day-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;min-width:0;min-height:0;overflow:visible}.calendar-day{border-radius:50%;-webkit-padding-start:0px;padding-inline-start:0px;-webkit-padding-end:0px;padding-inline-end:0px;padding-top:0px;padding-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-top:0px;margin-bottom:0px;display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border:none;outline:none;background:none;color:currentColor;font-family:var(--ion-font-family, inherit);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;z-index:0}:host .calendar-day[disabled]{pointer-events:none;opacity:0.4}.calendar-day:focus{background:rgba(var(--ion-color-base-rgb), 0.2);-webkit-box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2);box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2)}:host .datetime-time{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host(.datetime-presentation-time) .datetime-time{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0}:host ion-popover{--height:200px}:host .time-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}:host .time-body{border-radius:8px;-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:6px;padding-bottom:6px;display:-ms-flexbox;display:flex;border:none;background:var(--ion-color-step-300, #edeef0);color:var(--ion-text-color, #000);font-family:inherit;font-size:inherit;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}:host .time-body-active{color:var(--ion-color-base)}:host(.in-item){position:static}:host(.show-month-and-year) .calendar-action-buttons ion-item{--color:var(--ion-color-base)}:host{--background:var(--ion-color-light, #ffffff);--background-rgb:var(--ion-color-light-rgb);--title-color:var(--ion-color-step-600, #666666)}:host(.datetime-presentation-date-time:not(.datetime-prefer-wheel)),:host(.datetime-presentation-time-date:not(.datetime-prefer-wheel)),:host(.datetime-presentation-date:not(.datetime-prefer-wheel)){min-height:350px}:host .datetime-header{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:16px;padding-bottom:16px;border-bottom:0.55px solid var(--ion-color-step-200, #cccccc);font-size:min(0.875rem, 22.4px)}:host .datetime-header .datetime-title{color:var(--title-color)}:host .datetime-header .datetime-selected-date{margin-top:10px}:host .calendar-action-buttons ion-item{--padding-start:16px;--background-hover:transparent;--background-activated:transparent;font-size:min(1rem, 25.6px);font-weight:600}:host .calendar-action-buttons ion-item ion-icon,:host .calendar-action-buttons ion-buttons ion-button{color:var(--ion-color-base)}:host .calendar-action-buttons ion-buttons{padding-left:0;padding-right:0;padding-top:8px;padding-bottom:0}:host .calendar-action-buttons ion-buttons ion-button{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:host .calendar-days-of-week{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:0;padding-bottom:0;color:var(--ion-color-step-300, #b3b3b3);font-size:min(0.75rem, 19.2px);font-weight:600;line-height:24px;text-transform:uppercase}@supports (border-radius: mod(1px, 1px)){.calendar-days-of-week .day-of-week{width:clamp(20px, calc(mod(min(1rem, 24px), 24px) * 10), 100%);height:24px;overflow:hidden}.calendar-day{border-radius:max(8px, mod(min(1rem, 24px), 24px) * 10)}}@supports ((border-radius: mod(1px, 1px)) and (background: -webkit-named-image(apple-pay-logo-black)) and (not (contain-intrinsic-size: none))) or (not (border-radius: mod(1px, 1px))){.calendar-days-of-week .day-of-week{width:auto;height:auto;overflow:initial}.calendar-day{border-radius:32px}}:host .calendar-body .calendar-month .calendar-month-grid{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:8px;padding-bottom:8px;-ms-flex-align:center;align-items:center;height:calc(100% - 16px)}:host .calendar-day-wrapper{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;height:0;min-height:1rem}:host .calendar-day{width:40px;min-width:40px;height:40px;font-size:min(1.25rem, 32px)}.calendar-day.calendar-day-active{background:rgba(var(--ion-color-base-rgb), 0.2)}:host .calendar-day.calendar-day-today{color:var(--ion-color-base)}:host .calendar-day.calendar-day-active{color:var(--ion-color-base);font-weight:600}:host .calendar-day.calendar-day-today.calendar-day-active{color:var(--ion-color-contrast)}:host .datetime-time{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:8px;padding-bottom:16px;font-size:min(1rem, 25.6px)}:host .datetime-time .time-header{font-weight:600}:host .datetime-buttons{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:8px;padding-bottom:8px;border-top:0.55px solid var(--ion-color-step-200, #cccccc)}:host .datetime-buttons ::slotted(ion-buttons),:host .datetime-buttons ion-buttons{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}:host .datetime-action-buttons{width:100%}";
189
+ const datetimeIosCss = ":host{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;background:var(--background);overflow:hidden}ion-picker-column-internal{min-width:26px}:host(.datetime-size-fixed){width:auto;height:auto}:host(.datetime-size-fixed:not(.datetime-prefer-wheel)){max-width:350px}:host(.datetime-size-fixed.datetime-prefer-wheel){min-width:350px;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}:host(.datetime-size-cover){width:100%}:host .calendar-body,:host .datetime-year{opacity:0}:host(:not(.datetime-ready)) .datetime-year{position:absolute;pointer-events:none}:host(.datetime-ready) .calendar-body{opacity:1}:host(.datetime-ready) .datetime-year{display:none;opacity:1}:host .wheel-order-year-first .day-column{-ms-flex-order:3;order:3;text-align:end}:host .wheel-order-year-first .month-column{-ms-flex-order:2;order:2;text-align:end}:host .wheel-order-year-first .year-column{-ms-flex-order:1;order:1;text-align:start}:host .datetime-calendar,:host .datetime-year{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-flow:column;flex-flow:column}:host(.show-month-and-year) .datetime-year{display:-ms-flexbox;display:flex}@supports (background: -webkit-named-image(apple-pay-logo-black)) and (not (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{position:absolute;visibility:hidden;pointer-events:none}@supports (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{inset-inline-start:-99999px}}@supports not (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{left:-99999px}:host-context([dir=rtl]):host(.show-month-and-year) .calendar-next-prev,:host-context([dir=rtl]).show-month-and-year .calendar-next-prev,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-days-of-week,:host-context([dir=rtl]).show-month-and-year .calendar-days-of-week,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-body,:host-context([dir=rtl]).show-month-and-year .calendar-body,:host-context([dir=rtl]):host(.show-month-and-year) .datetime-time,:host-context([dir=rtl]).show-month-and-year .datetime-time{left:unset;right:unset;right:-99999px}@supports selector(:dir(rtl)){:host(.show-month-and-year:dir(rtl)) .calendar-next-prev,:host(.show-month-and-year:dir(rtl)) .calendar-days-of-week,:host(.show-month-and-year:dir(rtl)) .calendar-body,:host(.show-month-and-year:dir(rtl)) .datetime-time{left:unset;right:unset;right:-99999px}}}}@supports (not (background: -webkit-named-image(apple-pay-logo-black))) or ((background: -webkit-named-image(apple-pay-logo-black)) and (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{display:none}}:host(.month-year-picker-open) .datetime-footer{display:none}:host(.datetime-disabled){pointer-events:none}:host(.datetime-disabled) .calendar-days-of-week,:host(.datetime-disabled) .datetime-time{opacity:0.4}:host(.datetime-readonly){pointer-events:none;}:host(.datetime-readonly) .calendar-action-buttons,:host(.datetime-readonly) .calendar-body,:host(.datetime-readonly) .datetime-year{pointer-events:initial}:host(.datetime-readonly) .calendar-day[disabled]:not(.calendar-day-constrained),:host(.datetime-readonly) .datetime-action-buttons ion-button[disabled]{opacity:1}:host .datetime-header .datetime-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host .datetime-action-buttons.has-clear-button{width:100%}:host .datetime-action-buttons ion-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.datetime-action-buttons .datetime-action-buttons-container{display:-ms-flexbox;display:flex}:host .calendar-action-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host .calendar-action-buttons ion-item,:host .calendar-action-buttons ion-button{--background:translucent}:host .calendar-action-buttons ion-item ion-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:auto}:host .calendar-action-buttons ion-item ion-icon{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:0;padding-inline-end:0;padding-top:0;padding-bottom:0}:host .calendar-days-of-week{display:grid;grid-template-columns:repeat(7, 1fr);text-align:center}.calendar-days-of-week .day-of-week{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:0;margin-bottom:0}:host .calendar-body{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-webkit-scroll-snap-type:x mandatory;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none;outline:none}:host .calendar-body .calendar-month{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;scroll-snap-align:start;scroll-snap-stop:always;-ms-flex-negative:0;flex-shrink:0;width:100%}:host .calendar-body .calendar-month-disabled{scroll-snap-align:none}:host .calendar-body::-webkit-scrollbar{display:none}:host .calendar-body .calendar-month-grid{display:grid;grid-template-columns:repeat(7, 1fr)}:host .calendar-day-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;min-width:0;min-height:0;overflow:visible}.calendar-day{border-radius:50%;-webkit-padding-start:0px;padding-inline-start:0px;-webkit-padding-end:0px;padding-inline-end:0px;padding-top:0px;padding-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-top:0px;margin-bottom:0px;display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border:none;outline:none;background:none;color:currentColor;font-family:var(--ion-font-family, inherit);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;z-index:0}:host .calendar-day[disabled]{pointer-events:none;opacity:0.4}.calendar-day:focus{background:rgba(var(--ion-color-base-rgb), 0.2);-webkit-box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2);box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2)}:host .datetime-time{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host(.datetime-presentation-time) .datetime-time{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0}:host ion-popover{--height:200px}:host .time-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}:host .time-body{border-radius:8px;-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:6px;padding-bottom:6px;display:-ms-flexbox;display:flex;border:none;background:var(--ion-color-step-300, #edeef0);color:var(--ion-text-color, #000);font-family:inherit;font-size:inherit;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}:host .time-body-active{color:var(--ion-color-base)}:host(.in-item){position:static}:host(.show-month-and-year) .calendar-action-buttons ion-item{--color:var(--ion-color-base)}:host{--background:var(--ion-color-light, #ffffff);--background-rgb:var(--ion-color-light-rgb);--title-color:var(--ion-color-step-600, #666666)}:host(.datetime-presentation-date-time:not(.datetime-prefer-wheel)),:host(.datetime-presentation-time-date:not(.datetime-prefer-wheel)),:host(.datetime-presentation-date:not(.datetime-prefer-wheel)){min-height:350px}:host .datetime-header{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:16px;padding-bottom:16px;border-bottom:0.55px solid var(--ion-color-step-200, #cccccc);font-size:min(0.875rem, 22.4px)}:host .datetime-header .datetime-title{color:var(--title-color)}:host .datetime-header .datetime-selected-date{margin-top:10px}:host .calendar-action-buttons ion-item{--padding-start:16px;--background-hover:transparent;--background-activated:transparent;font-size:min(1rem, 25.6px);font-weight:600}:host .calendar-action-buttons ion-item ion-icon,:host .calendar-action-buttons ion-buttons ion-button{color:var(--ion-color-base)}:host .calendar-action-buttons ion-buttons{padding-left:0;padding-right:0;padding-top:8px;padding-bottom:0}:host .calendar-action-buttons ion-buttons ion-button{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}:host .calendar-days-of-week{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:0;padding-bottom:0;color:var(--ion-color-step-300, #b3b3b3);font-size:min(0.75rem, 19.2px);font-weight:600;line-height:24px;text-transform:uppercase}@supports (border-radius: mod(1px, 1px)){.calendar-days-of-week .day-of-week{width:clamp(20px, calc(mod(min(1rem, 24px), 24px) * 10), 100%);height:24px;overflow:hidden}.calendar-day{border-radius:max(8px, mod(min(1rem, 24px), 24px) * 10)}}@supports ((border-radius: mod(1px, 1px)) and (background: -webkit-named-image(apple-pay-logo-black)) and (not (contain-intrinsic-size: none))) or (not (border-radius: mod(1px, 1px))){.calendar-days-of-week .day-of-week{width:auto;height:auto;overflow:initial}.calendar-day{border-radius:32px}}:host .calendar-body .calendar-month .calendar-month-grid{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:8px;padding-bottom:8px;-ms-flex-align:center;align-items:center;height:calc(100% - 16px)}:host .calendar-day-wrapper{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;height:0;min-height:1rem}:host .calendar-day{width:40px;min-width:40px;height:40px;font-size:min(1.25rem, 32px)}.calendar-day.calendar-day-active{background:rgba(var(--ion-color-base-rgb), 0.2)}:host .calendar-day.calendar-day-today{color:var(--ion-color-base)}:host .calendar-day.calendar-day-active{color:var(--ion-color-base);font-weight:600}:host .calendar-day.calendar-day-today.calendar-day-active{color:var(--ion-color-contrast)}:host .datetime-time{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:8px;padding-bottom:16px;font-size:min(1rem, 25.6px)}:host .datetime-time .time-header{font-weight:600}:host .datetime-buttons{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:8px;padding-bottom:8px;border-top:0.55px solid var(--ion-color-step-200, #cccccc)}:host .datetime-buttons ::slotted(ion-buttons),:host .datetime-buttons ion-buttons{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}:host .datetime-action-buttons{width:100%}";
190
190
 
191
- const datetimeMdCss = ":host{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;background:var(--background);overflow:hidden}ion-picker-column-internal{min-width:26px}:host(.datetime-size-fixed){width:auto;height:auto}:host(.datetime-size-fixed:not(.datetime-prefer-wheel)){max-width:350px}:host(.datetime-size-fixed.datetime-prefer-wheel){min-width:350px;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}:host(.datetime-size-cover){width:100%}:host .calendar-body,:host .datetime-year{opacity:0}:host(:not(.datetime-ready)) .datetime-year{position:absolute;pointer-events:none}:host(.datetime-ready) .calendar-body{opacity:1}:host(.datetime-ready) .datetime-year{display:none;opacity:1}:host .wheel-order-year-first .day-column{-ms-flex-order:3;order:3;text-align:end}:host .wheel-order-year-first .month-column{-ms-flex-order:2;order:2;text-align:end}:host .wheel-order-year-first .year-column{-ms-flex-order:1;order:1;text-align:start}:host .datetime-calendar,:host .datetime-year{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-flow:column;flex-flow:column}:host(.show-month-and-year) .datetime-year{display:-ms-flexbox;display:flex}@supports (background: -webkit-named-image(apple-pay-logo-black)) and (not (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{position:absolute;visibility:hidden;pointer-events:none}@supports (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{inset-inline-start:-99999px}}@supports not (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{left:-99999px}:host-context([dir=rtl]):host(.show-month-and-year) .calendar-next-prev,:host-context([dir=rtl]).show-month-and-year .calendar-next-prev,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-days-of-week,:host-context([dir=rtl]).show-month-and-year .calendar-days-of-week,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-body,:host-context([dir=rtl]).show-month-and-year .calendar-body,:host-context([dir=rtl]):host(.show-month-and-year) .datetime-time,:host-context([dir=rtl]).show-month-and-year .datetime-time{left:unset;right:unset;right:-99999px}@supports selector(:dir(rtl)){:host(.show-month-and-year:dir(rtl)) .calendar-next-prev,:host(.show-month-and-year:dir(rtl)) .calendar-days-of-week,:host(.show-month-and-year:dir(rtl)) .calendar-body,:host(.show-month-and-year:dir(rtl)) .datetime-time{left:unset;right:unset;right:-99999px}}}}@supports (not (background: -webkit-named-image(apple-pay-logo-black))) or ((background: -webkit-named-image(apple-pay-logo-black)) and (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{display:none}}:host(.month-year-picker-open) .datetime-footer{display:none}:host(.datetime-disabled){pointer-events:none}:host(.datetime-disabled) .calendar-days-of-week,:host(.datetime-disabled) .datetime-time{opacity:0.4}:host(.datetime-readonly){pointer-events:none;}:host(.datetime-readonly) .calendar-action-buttons,:host(.datetime-readonly) .calendar-body,:host(.datetime-readonly) .datetime-year{pointer-events:initial}:host(.datetime-readonly) .calendar-day[disabled]:not(.calendar-day-constrained),:host(.datetime-readonly) .datetime-action-buttons ion-button[disabled]{opacity:1}:host .datetime-header .datetime-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host .datetime-action-buttons.has-clear-button{width:100%}:host .datetime-action-buttons ion-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.datetime-action-buttons .datetime-action-buttons-container{display:-ms-flexbox;display:flex}:host .calendar-action-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host .calendar-action-buttons ion-item,:host .calendar-action-buttons ion-button{--background:translucent}:host .calendar-action-buttons ion-item ion-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}:host .calendar-action-buttons ion-item ion-icon{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:0;padding-inline-end:0;padding-top:0;padding-bottom:0}:host .calendar-days-of-week{display:grid;grid-template-columns:repeat(7, 1fr);text-align:center}.calendar-days-of-week .day-of-week{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:0;margin-bottom:0}:host .calendar-body{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-webkit-scroll-snap-type:x mandatory;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none;outline:none}:host .calendar-body .calendar-month{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;scroll-snap-align:start;scroll-snap-stop:always;-ms-flex-negative:0;flex-shrink:0;width:100%}:host .calendar-body .calendar-month-disabled{scroll-snap-align:none}:host .calendar-body::-webkit-scrollbar{display:none}:host .calendar-body .calendar-month-grid{display:grid;grid-template-columns:repeat(7, 1fr)}:host .calendar-day-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;min-width:0;min-height:0;overflow:visible}.calendar-day{border-radius:50%;-webkit-padding-start:0px;padding-inline-start:0px;-webkit-padding-end:0px;padding-inline-end:0px;padding-top:0px;padding-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-top:0px;margin-bottom:0px;display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border:none;outline:none;background:none;color:currentColor;font-family:var(--ion-font-family, inherit);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;z-index:0}:host .calendar-day[disabled]{pointer-events:none;opacity:0.4}.calendar-day:focus{background:rgba(var(--ion-color-base-rgb), 0.2);-webkit-box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2);box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2)}:host .datetime-time{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host(.datetime-presentation-time) .datetime-time{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0}:host ion-popover{--height:200px}:host .time-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}:host .time-body{border-radius:8px;-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:6px;padding-bottom:6px;display:-ms-flexbox;display:flex;border:none;background:var(--ion-color-step-300, #edeef0);color:var(--ion-text-color, #000);font-family:inherit;font-size:inherit;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}:host .time-body-active{color:var(--ion-color-base)}:host(.in-item){position:static}:host(.show-month-and-year) .calendar-action-buttons ion-item{--color:var(--ion-color-base)}:host{--background:var(--ion-color-step-100, #ffffff);--title-color:var(--ion-color-contrast)}:host .datetime-header{-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px;padding-top:20px;padding-bottom:20px;background:var(--ion-color-base);color:var(--title-color)}:host .datetime-header .datetime-title{font-size:0.75rem;text-transform:uppercase}:host .datetime-header .datetime-selected-date{margin-top:30px;font-size:2.125rem}:host .datetime-calendar .calendar-action-buttons ion-item{--padding-start:20px}:host .calendar-action-buttons ion-item,:host .calendar-action-buttons ion-button{--color:var(--ion-color-step-650, #595959)}:host .calendar-days-of-week{-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;padding-top:0px;padding-bottom:0px;color:var(--ion-color-step-500, gray);font-size:0.875rem;line-height:36px}:host .calendar-body .calendar-month .calendar-month-grid{-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;padding-top:4px;padding-bottom:4px;grid-template-rows:repeat(6, 1fr)}:host .calendar-day{width:42px;min-width:42px;height:42px;font-size:0.875rem}:host .calendar-day.calendar-day-today{border:1px solid var(--ion-color-base);color:var(--ion-color-base)}:host .calendar-day.calendar-day-active{color:var(--ion-color-contrast)}.calendar-day.calendar-day-active{border:1px solid var(--ion-color-base);background:var(--ion-color-base)}:host .datetime-time{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:8px;padding-bottom:8px}:host .time-header{color:var(--ion-color-step-650, #595959)}:host(.datetime-presentation-month) .datetime-year,:host(.datetime-presentation-year) .datetime-year,:host(.datetime-presentation-month-year) .datetime-year{margin-top:20px;margin-bottom:20px}:host .datetime-buttons{-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;padding-top:10px;padding-bottom:10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}";
191
+ const datetimeMdCss = ":host{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;background:var(--background);overflow:hidden}ion-picker-column-internal{min-width:26px}:host(.datetime-size-fixed){width:auto;height:auto}:host(.datetime-size-fixed:not(.datetime-prefer-wheel)){max-width:350px}:host(.datetime-size-fixed.datetime-prefer-wheel){min-width:350px;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}:host(.datetime-size-cover){width:100%}:host .calendar-body,:host .datetime-year{opacity:0}:host(:not(.datetime-ready)) .datetime-year{position:absolute;pointer-events:none}:host(.datetime-ready) .calendar-body{opacity:1}:host(.datetime-ready) .datetime-year{display:none;opacity:1}:host .wheel-order-year-first .day-column{-ms-flex-order:3;order:3;text-align:end}:host .wheel-order-year-first .month-column{-ms-flex-order:2;order:2;text-align:end}:host .wheel-order-year-first .year-column{-ms-flex-order:1;order:1;text-align:start}:host .datetime-calendar,:host .datetime-year{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-flow:column;flex-flow:column}:host(.show-month-and-year) .datetime-year{display:-ms-flexbox;display:flex}@supports (background: -webkit-named-image(apple-pay-logo-black)) and (not (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{position:absolute;visibility:hidden;pointer-events:none}@supports (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{inset-inline-start:-99999px}}@supports not (inset-inline-start: 0){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{left:-99999px}:host-context([dir=rtl]):host(.show-month-and-year) .calendar-next-prev,:host-context([dir=rtl]).show-month-and-year .calendar-next-prev,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-days-of-week,:host-context([dir=rtl]).show-month-and-year .calendar-days-of-week,:host-context([dir=rtl]):host(.show-month-and-year) .calendar-body,:host-context([dir=rtl]).show-month-and-year .calendar-body,:host-context([dir=rtl]):host(.show-month-and-year) .datetime-time,:host-context([dir=rtl]).show-month-and-year .datetime-time{left:unset;right:unset;right:-99999px}@supports selector(:dir(rtl)){:host(.show-month-and-year:dir(rtl)) .calendar-next-prev,:host(.show-month-and-year:dir(rtl)) .calendar-days-of-week,:host(.show-month-and-year:dir(rtl)) .calendar-body,:host(.show-month-and-year:dir(rtl)) .datetime-time{left:unset;right:unset;right:-99999px}}}}@supports (not (background: -webkit-named-image(apple-pay-logo-black))) or ((background: -webkit-named-image(apple-pay-logo-black)) and (aspect-ratio: 1/1)){:host(.show-month-and-year) .calendar-next-prev,:host(.show-month-and-year) .calendar-days-of-week,:host(.show-month-and-year) .calendar-body,:host(.show-month-and-year) .datetime-time{display:none}}:host(.month-year-picker-open) .datetime-footer{display:none}:host(.datetime-disabled){pointer-events:none}:host(.datetime-disabled) .calendar-days-of-week,:host(.datetime-disabled) .datetime-time{opacity:0.4}:host(.datetime-readonly){pointer-events:none;}:host(.datetime-readonly) .calendar-action-buttons,:host(.datetime-readonly) .calendar-body,:host(.datetime-readonly) .datetime-year{pointer-events:initial}:host(.datetime-readonly) .calendar-day[disabled]:not(.calendar-day-constrained),:host(.datetime-readonly) .datetime-action-buttons ion-button[disabled]{opacity:1}:host .datetime-header .datetime-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:host .datetime-action-buttons.has-clear-button{width:100%}:host .datetime-action-buttons ion-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.datetime-action-buttons .datetime-action-buttons-container{display:-ms-flexbox;display:flex}:host .calendar-action-buttons{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host .calendar-action-buttons ion-item,:host .calendar-action-buttons ion-button{--background:translucent}:host .calendar-action-buttons ion-item ion-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;width:auto}:host .calendar-action-buttons ion-item ion-icon{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:0;padding-inline-end:0;padding-top:0;padding-bottom:0}:host .calendar-days-of-week{display:grid;grid-template-columns:repeat(7, 1fr);text-align:center}.calendar-days-of-week .day-of-week{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:0;margin-bottom:0}:host .calendar-body{display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;-webkit-scroll-snap-type:x mandatory;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none;outline:none}:host .calendar-body .calendar-month{display:-ms-flexbox;display:flex;-ms-flex-flow:column;flex-flow:column;scroll-snap-align:start;scroll-snap-stop:always;-ms-flex-negative:0;flex-shrink:0;width:100%}:host .calendar-body .calendar-month-disabled{scroll-snap-align:none}:host .calendar-body::-webkit-scrollbar{display:none}:host .calendar-body .calendar-month-grid{display:grid;grid-template-columns:repeat(7, 1fr)}:host .calendar-day-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;min-width:0;min-height:0;overflow:visible}.calendar-day{border-radius:50%;-webkit-padding-start:0px;padding-inline-start:0px;-webkit-padding-end:0px;padding-inline-end:0px;padding-top:0px;padding-bottom:0px;-webkit-margin-start:0px;margin-inline-start:0px;-webkit-margin-end:0px;margin-inline-end:0px;margin-top:0px;margin-bottom:0px;display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border:none;outline:none;background:none;color:currentColor;font-family:var(--ion-font-family, inherit);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;z-index:0}:host .calendar-day[disabled]{pointer-events:none;opacity:0.4}.calendar-day:focus{background:rgba(var(--ion-color-base-rgb), 0.2);-webkit-box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2);box-shadow:0px 0px 0px 4px rgba(var(--ion-color-base-rgb), 0.2)}:host .datetime-time{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}:host(.datetime-presentation-time) .datetime-time{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0}:host ion-popover{--height:200px}:host .time-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}:host .time-body{border-radius:8px;-webkit-padding-start:12px;padding-inline-start:12px;-webkit-padding-end:12px;padding-inline-end:12px;padding-top:6px;padding-bottom:6px;display:-ms-flexbox;display:flex;border:none;background:var(--ion-color-step-300, #edeef0);color:var(--ion-text-color, #000);font-family:inherit;font-size:inherit;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}:host .time-body-active{color:var(--ion-color-base)}:host(.in-item){position:static}:host(.show-month-and-year) .calendar-action-buttons ion-item{--color:var(--ion-color-base)}:host{--background:var(--ion-color-step-100, #ffffff);--title-color:var(--ion-color-contrast)}:host .datetime-header{-webkit-padding-start:20px;padding-inline-start:20px;-webkit-padding-end:20px;padding-inline-end:20px;padding-top:20px;padding-bottom:20px;background:var(--ion-color-base);color:var(--title-color)}:host .datetime-header .datetime-title{font-size:0.75rem;text-transform:uppercase}:host .datetime-header .datetime-selected-date{margin-top:30px;font-size:2.125rem}:host .datetime-calendar .calendar-action-buttons ion-item{--padding-start:20px}:host .calendar-action-buttons ion-item,:host .calendar-action-buttons ion-button{--color:var(--ion-color-step-650, #595959)}:host .calendar-days-of-week{-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;padding-top:0px;padding-bottom:0px;color:var(--ion-color-step-500, gray);font-size:0.875rem;line-height:36px}:host .calendar-body .calendar-month .calendar-month-grid{-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;padding-top:4px;padding-bottom:4px;grid-template-rows:repeat(6, 1fr)}:host .calendar-day{width:42px;min-width:42px;height:42px;font-size:0.875rem}:host .calendar-day.calendar-day-today{border:1px solid var(--ion-color-base);color:var(--ion-color-base)}:host .calendar-day.calendar-day-active{color:var(--ion-color-contrast)}.calendar-day.calendar-day-active{border:1px solid var(--ion-color-base);background:var(--ion-color-base)}:host .datetime-time{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:8px;padding-bottom:8px}:host .time-header{color:var(--ion-color-step-650, #595959)}:host(.datetime-presentation-month) .datetime-year,:host(.datetime-presentation-year) .datetime-year,:host(.datetime-presentation-month-year) .datetime-year{margin-top:20px;margin-bottom:20px}:host .datetime-buttons{-webkit-padding-start:10px;padding-inline-start:10px;-webkit-padding-end:10px;padding-inline-end:10px;padding-top:10px;padding-bottom:10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}";
192
192
 
193
193
  const Datetime = class {
194
- constructor(hostRef) {
195
- registerInstance(this, hostRef);
196
- this.ionCancel = createEvent(this, "ionCancel", 7);
197
- this.ionChange = createEvent(this, "ionChange", 7);
198
- this.ionValueChange = createEvent(this, "ionValueChange", 7);
199
- this.ionFocus = createEvent(this, "ionFocus", 7);
200
- this.ionBlur = createEvent(this, "ionBlur", 7);
201
- this.ionStyle = createEvent(this, "ionStyle", 7);
202
- this.ionRender = createEvent(this, "ionRender", 7);
203
- this.inputId = `ion-dt-${datetimeIds++}`;
204
- this.prevPresentation = null;
205
- this.warnIfIncorrectValueUsage = () => {
206
- const { multiple, value } = this;
207
- if (!multiple && Array.isArray(value)) {
208
- /**
209
- * We do some processing on the `value` array so
210
- * that it looks more like an array when logged to
211
- * the console.
212
- * Example given ['a', 'b']
213
- * Default toString() behavior: a,b
214
- * Custom behavior: ['a', 'b']
215
- */
216
- printIonWarning(`ion-datetime was passed an array of values, but multiple="false". This is incorrect usage and may result in unexpected behaviors. To dismiss this warning, pass a string to the "value" property when multiple="false".
194
+ constructor(hostRef) {
195
+ registerInstance(this, hostRef);
196
+ this.ionCancel = createEvent(this, "ionCancel", 7);
197
+ this.ionChange = createEvent(this, "ionChange", 7);
198
+ this.ionValueChange = createEvent(this, "ionValueChange", 7);
199
+ this.ionFocus = createEvent(this, "ionFocus", 7);
200
+ this.ionBlur = createEvent(this, "ionBlur", 7);
201
+ this.ionStyle = createEvent(this, "ionStyle", 7);
202
+ this.ionRender = createEvent(this, "ionRender", 7);
203
+ this.inputId = `ion-dt-${datetimeIds++}`;
204
+ this.prevPresentation = null;
205
+ this.warnIfIncorrectValueUsage = () => {
206
+ const { multiple, value } = this;
207
+ if (!multiple && Array.isArray(value)) {
208
+ /**
209
+ * We do some processing on the `value` array so
210
+ * that it looks more like an array when logged to
211
+ * the console.
212
+ * Example given ['a', 'b']
213
+ * Default toString() behavior: a,b
214
+ * Custom behavior: ['a', 'b']
215
+ */
216
+ printIonWarning(`ion-datetime was passed an array of values, but multiple="false". This is incorrect usage and may result in unexpected behaviors. To dismiss this warning, pass a string to the "value" property when multiple="false".
217
217
 
218
218
  Value Passed: [${value.map((v) => `'${v}'`).join(', ')}]
219
219
  `, this.el);
220
- }
221
- };
222
- this.setValue = (value) => {
223
- this.value = value;
224
- this.ionChange.emit({ value });
225
- };
220
+ }
221
+ };
222
+ this.setValue = (value) => {
223
+ this.value = value;
224
+ this.ionChange.emit({ value });
225
+ };
226
+ /**
227
+ * Returns the DatetimePart interface
228
+ * to use when rendering an initial set of
229
+ * data. This should be used when rendering an
230
+ * interface in an environment where the `value`
231
+ * may not be set. This function works
232
+ * by returning the first selected date and then
233
+ * falling back to defaultParts if no active date
234
+ * is selected.
235
+ */
236
+ this.getActivePartsWithFallback = () => {
237
+ var _a;
238
+ const { defaultParts } = this;
239
+ return (_a = this.getActivePart()) !== null && _a !== void 0 ? _a : defaultParts;
240
+ };
241
+ this.getActivePart = () => {
242
+ const { activeParts } = this;
243
+ return Array.isArray(activeParts) ? activeParts[0] : activeParts;
244
+ };
245
+ this.closeParentOverlay = () => {
246
+ const popoverOrModal = this.el.closest('ion-modal, ion-popover');
247
+ if (popoverOrModal) {
248
+ popoverOrModal.dismiss();
249
+ }
250
+ };
251
+ this.setWorkingParts = (parts) => {
252
+ this.workingParts = Object.assign({}, parts);
253
+ };
254
+ this.setActiveParts = (parts, removeDate = false) => {
255
+ /** if the datetime component is in readonly mode,
256
+ * allow browsing of the calendar without changing
257
+ * the set value
258
+ */
259
+ if (this.readonly) {
260
+ return;
261
+ }
262
+ const { multiple, minParts, maxParts, activeParts } = this;
263
+ /**
264
+ * When setting the active parts, it is possible
265
+ * to set invalid data. For example,
266
+ * when updating January 31 to February,
267
+ * February 31 does not exist. As a result
268
+ * we need to validate the active parts and
269
+ * ensure that we are only setting valid dates.
270
+ * Additionally, we need to update the working parts
271
+ * too in the event that the validated parts are different.
272
+ */
273
+ const validatedParts = validateParts(parts, minParts, maxParts);
274
+ this.setWorkingParts(validatedParts);
275
+ if (multiple) {
276
+ const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
277
+ if (removeDate) {
278
+ this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
279
+ }
280
+ else {
281
+ this.activeParts = [...activePartsArray, validatedParts];
282
+ }
283
+ }
284
+ else {
285
+ this.activeParts = Object.assign({}, validatedParts);
286
+ }
287
+ const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
288
+ if (hasSlottedButtons || this.showDefaultButtons) {
289
+ return;
290
+ }
291
+ this.confirm();
292
+ };
293
+ this.initializeKeyboardListeners = () => {
294
+ const calendarBodyRef = this.calendarBodyRef;
295
+ if (!calendarBodyRef) {
296
+ return;
297
+ }
298
+ const root = this.el.shadowRoot;
299
+ /**
300
+ * Get a reference to the month
301
+ * element we are currently viewing.
302
+ */
303
+ const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
304
+ /**
305
+ * When focusing the calendar body, we want to pass focus
306
+ * to the working day, but other days should
307
+ * only be accessible using the arrow keys. Pressing
308
+ * Tab should jump between bodies of selectable content.
309
+ */
310
+ const checkCalendarBodyFocus = (ev) => {
311
+ var _a;
312
+ const record = ev[0];
313
+ /**
314
+ * If calendar body was already focused
315
+ * when this fired or if the calendar body
316
+ * if not currently focused, we should not re-focus
317
+ * the inner day.
318
+ */
319
+ if (((_a = record.oldValue) === null || _a === void 0 ? void 0 : _a.includes('ion-focused')) || !calendarBodyRef.classList.contains('ion-focused')) {
320
+ return;
321
+ }
322
+ this.focusWorkingDay(currentMonth);
323
+ };
324
+ const mo = new MutationObserver(checkCalendarBodyFocus);
325
+ mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
326
+ this.destroyKeyboardMO = () => {
327
+ mo === null || mo === void 0 ? void 0 : mo.disconnect();
328
+ };
329
+ /**
330
+ * We must use keydown not keyup as we want
331
+ * to prevent scrolling when using the arrow keys.
332
+ */
333
+ calendarBodyRef.addEventListener('keydown', (ev) => {
334
+ const activeElement = root.activeElement;
335
+ if (!activeElement || !activeElement.classList.contains('calendar-day')) {
336
+ return;
337
+ }
338
+ const parts = getPartsFromCalendarDay(activeElement);
339
+ let partsToFocus;
340
+ switch (ev.key) {
341
+ case 'ArrowDown':
342
+ ev.preventDefault();
343
+ partsToFocus = getNextWeek(parts);
344
+ break;
345
+ case 'ArrowUp':
346
+ ev.preventDefault();
347
+ partsToFocus = getPreviousWeek(parts);
348
+ break;
349
+ case 'ArrowRight':
350
+ ev.preventDefault();
351
+ partsToFocus = getNextDay(parts);
352
+ break;
353
+ case 'ArrowLeft':
354
+ ev.preventDefault();
355
+ partsToFocus = getPreviousDay(parts);
356
+ break;
357
+ case 'Home':
358
+ ev.preventDefault();
359
+ partsToFocus = getStartOfWeek(parts);
360
+ break;
361
+ case 'End':
362
+ ev.preventDefault();
363
+ partsToFocus = getEndOfWeek(parts);
364
+ break;
365
+ case 'PageUp':
366
+ ev.preventDefault();
367
+ partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
368
+ break;
369
+ case 'PageDown':
370
+ ev.preventDefault();
371
+ partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
372
+ break;
373
+ /**
374
+ * Do not preventDefault here
375
+ * as we do not want to override other
376
+ * browser defaults such as pressing Enter/Space
377
+ * to select a day.
378
+ */
379
+ default:
380
+ return;
381
+ }
382
+ /**
383
+ * If the day we want to move focus to is
384
+ * disabled, do not do anything.
385
+ */
386
+ if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
387
+ return;
388
+ }
389
+ this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), partsToFocus));
390
+ /**
391
+ * Give view a chance to re-render
392
+ * then move focus to the new working day
393
+ */
394
+ requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
395
+ });
396
+ };
397
+ this.focusWorkingDay = (currentMonth) => {
398
+ /**
399
+ * Get the number of padding days so
400
+ * we know how much to offset our next selector by
401
+ * to grab the correct calendar-day element.
402
+ */
403
+ const padding = currentMonth.querySelectorAll('.calendar-day-padding');
404
+ const { day } = this.workingParts;
405
+ if (day === null) {
406
+ return;
407
+ }
408
+ /**
409
+ * Get the calendar day element
410
+ * and focus it.
411
+ */
412
+ const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${padding.length + day}) .calendar-day`);
413
+ if (dayEl) {
414
+ dayEl.focus();
415
+ }
416
+ };
417
+ this.processMinParts = () => {
418
+ const { min, defaultParts } = this;
419
+ if (min === undefined) {
420
+ this.minParts = undefined;
421
+ return;
422
+ }
423
+ this.minParts = parseMinParts(min, defaultParts);
424
+ };
425
+ this.processMaxParts = () => {
426
+ const { max, defaultParts } = this;
427
+ if (max === undefined) {
428
+ this.maxParts = undefined;
429
+ return;
430
+ }
431
+ this.maxParts = parseMaxParts(max, defaultParts);
432
+ };
433
+ this.initializeCalendarListener = () => {
434
+ const calendarBodyRef = this.calendarBodyRef;
435
+ if (!calendarBodyRef) {
436
+ return;
437
+ }
438
+ /**
439
+ * For performance reasons, we only render 3
440
+ * months at a time: The current month, the previous
441
+ * month, and the next month. We have a scroll listener
442
+ * on the calendar body to append/prepend new months.
443
+ *
444
+ * We can do this because Stencil is smart enough to not
445
+ * re-create the .calendar-month containers, but rather
446
+ * update the content within those containers.
447
+ *
448
+ * As an added bonus, WebKit has some troubles with
449
+ * scroll-snap-stop: always, so not rendering all of
450
+ * the months in a row allows us to mostly sidestep
451
+ * that issue.
452
+ */
453
+ const months = calendarBodyRef.querySelectorAll('.calendar-month');
454
+ const startMonth = months[0];
455
+ const workingMonth = months[1];
456
+ const endMonth = months[2];
457
+ const mode = getIonMode(this);
458
+ const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
459
+ /**
460
+ * Before setting up the scroll listener,
461
+ * scroll the middle month into view.
462
+ * scrollIntoView() will scroll entire page
463
+ * if element is not in viewport. Use scrollLeft instead.
464
+ */
465
+ writeTask(() => {
466
+ calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
467
+ const getChangedMonth = (parts) => {
468
+ const box = calendarBodyRef.getBoundingClientRect();
469
+ /**
470
+ * If the current scroll position is all the way to the left
471
+ * then we have scrolled to the previous month.
472
+ * Otherwise, assume that we have scrolled to the next
473
+ * month. We have a tolerance of 2px to account for
474
+ * sub pixel rendering.
475
+ *
476
+ * Check below the next line ensures that we did not
477
+ * swipe and abort (i.e. we swiped but we are still on the current month).
478
+ */
479
+ const month = calendarBodyRef.scrollLeft <= 2 ? startMonth : endMonth;
480
+ /**
481
+ * The edge of the month must be lined up with
482
+ * the edge of the calendar body in order for
483
+ * the component to update. Otherwise, it
484
+ * may be the case that the user has paused their
485
+ * swipe or the browser has not finished snapping yet.
486
+ * Rather than check if the x values are equal,
487
+ * we give it a tolerance of 2px to account for
488
+ * sub pixel rendering.
489
+ */
490
+ const monthBox = month.getBoundingClientRect();
491
+ if (Math.abs(monthBox.x - box.x) > 2)
492
+ return;
493
+ /**
494
+ * If we're force-rendering a month, assume we've
495
+ * scrolled to that and return it.
496
+ *
497
+ * If forceRenderDate is ever used in a context where the
498
+ * forced month is not immediately auto-scrolled to, this
499
+ * should be updated to also check whether `month` has the
500
+ * same month and year as the forced date.
501
+ */
502
+ const { forceRenderDate } = this;
503
+ if (forceRenderDate !== undefined) {
504
+ return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
505
+ }
506
+ /**
507
+ * From here, we can determine if the start
508
+ * month or the end month was scrolled into view.
509
+ * If no month was changed, then we can return from
510
+ * the scroll callback early.
511
+ */
512
+ if (month === startMonth) {
513
+ return getPreviousMonth(parts);
514
+ }
515
+ else if (month === endMonth) {
516
+ return getNextMonth(parts);
517
+ }
518
+ else {
519
+ return;
520
+ }
521
+ };
522
+ const updateActiveMonth = () => {
523
+ if (needsiOSRubberBandFix) {
524
+ calendarBodyRef.style.removeProperty('pointer-events');
525
+ appliediOSRubberBandFix = false;
526
+ }
527
+ /**
528
+ * If the month did not change
529
+ * then we can return early.
530
+ */
531
+ const newDate = getChangedMonth(this.workingParts);
532
+ if (!newDate)
533
+ return;
534
+ const { month, day, year } = newDate;
535
+ if (isMonthDisabled({ month, year, day: null }, {
536
+ minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
537
+ maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
538
+ })) {
539
+ return;
540
+ }
541
+ /**
542
+ * Prevent scrolling for other browsers
543
+ * to give the DOM time to update and the container
544
+ * time to properly snap.
545
+ */
546
+ calendarBodyRef.style.setProperty('overflow', 'hidden');
547
+ /**
548
+ * Use a writeTask here to ensure
549
+ * that the state is updated and the
550
+ * correct month is scrolled into view
551
+ * in the same frame. This is not
552
+ * typically a problem on newer devices
553
+ * but older/slower device may have a flicker
554
+ * if we did not do this.
555
+ */
556
+ writeTask(() => {
557
+ this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month, day: day, year }));
558
+ calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
559
+ calendarBodyRef.style.removeProperty('overflow');
560
+ if (this.resolveForceDateScrolling) {
561
+ this.resolveForceDateScrolling();
562
+ }
563
+ });
564
+ };
565
+ /**
566
+ * When the container finishes scrolling we
567
+ * need to update the DOM with the selected month.
568
+ */
569
+ let scrollTimeout;
570
+ /**
571
+ * We do not want to attempt to set pointer-events
572
+ * multiple times within a single swipe gesture as
573
+ * that adds unnecessary work to the main thread.
574
+ */
575
+ let appliediOSRubberBandFix = false;
576
+ const scrollCallback = () => {
577
+ if (scrollTimeout) {
578
+ clearTimeout(scrollTimeout);
579
+ }
580
+ /**
581
+ * On iOS it is possible to quickly rubber band
582
+ * the scroll area before the scroll timeout has fired.
583
+ * This results in users reaching the end of the scrollable
584
+ * container before the DOM has updated.
585
+ * By setting `pointer-events: none` we can ensure that
586
+ * subsequent swipes do not happen while the container
587
+ * is snapping.
588
+ */
589
+ if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
590
+ calendarBodyRef.style.setProperty('pointer-events', 'none');
591
+ appliediOSRubberBandFix = true;
592
+ }
593
+ // Wait ~3 frames
594
+ scrollTimeout = setTimeout(updateActiveMonth, 50);
595
+ };
596
+ calendarBodyRef.addEventListener('scroll', scrollCallback);
597
+ this.destroyCalendarListener = () => {
598
+ calendarBodyRef.removeEventListener('scroll', scrollCallback);
599
+ };
600
+ });
601
+ };
602
+ /**
603
+ * Clean up all listeners except for the overlay
604
+ * listener. This is so that we can re-create the listeners
605
+ * if the datetime has been hidden/presented by a modal or popover.
606
+ */
607
+ this.destroyInteractionListeners = () => {
608
+ const { destroyCalendarListener, destroyKeyboardMO } = this;
609
+ if (destroyCalendarListener !== undefined) {
610
+ destroyCalendarListener();
611
+ }
612
+ if (destroyKeyboardMO !== undefined) {
613
+ destroyKeyboardMO();
614
+ }
615
+ };
616
+ this.processValue = (value) => {
617
+ const hasValue = value !== null && value !== undefined && (!Array.isArray(value) || value.length > 0);
618
+ const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
619
+ const { minParts, maxParts, workingParts, el } = this;
620
+ this.warnIfIncorrectValueUsage();
621
+ /**
622
+ * Return early if the value wasn't parsed correctly, such as
623
+ * if an improperly formatted date string was provided.
624
+ */
625
+ if (!valueToProcess) {
626
+ return;
627
+ }
628
+ /**
629
+ * Datetime should only warn of out of bounds values
630
+ * if set by the user. If the `value` is undefined,
631
+ * we will default to today's date which may be out
632
+ * of bounds. In this case, the warning makes it look
633
+ * like the developer did something wrong which is
634
+ * not true.
635
+ */
636
+ if (hasValue) {
637
+ warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
638
+ }
639
+ /**
640
+ * If there are multiple values, pick an arbitrary one to clamp to. This way,
641
+ * if the values are across months, we always show at least one of them. Note
642
+ * that the values don't necessarily have to be in order.
643
+ */
644
+ const singleValue = Array.isArray(valueToProcess) ? valueToProcess[0] : valueToProcess;
645
+ const targetValue = clampDate(singleValue, minParts, maxParts);
646
+ const { month, day, year, hour, minute } = targetValue;
647
+ const ampm = parseAmPm(hour);
648
+ /**
649
+ * Since `activeParts` indicates a value that
650
+ * been explicitly selected either by the
651
+ * user or the app, only update `activeParts`
652
+ * if the `value` property is set.
653
+ */
654
+ if (hasValue) {
655
+ if (Array.isArray(valueToProcess)) {
656
+ this.activeParts = [...valueToProcess];
657
+ }
658
+ else {
659
+ this.activeParts = {
660
+ month,
661
+ day,
662
+ year,
663
+ hour,
664
+ minute,
665
+ ampm,
666
+ };
667
+ }
668
+ }
669
+ else {
670
+ /**
671
+ * Reset the active parts if the value is not set.
672
+ * This will clear the selected calendar day when
673
+ * performing a clear action or using the reset() method.
674
+ */
675
+ this.activeParts = [];
676
+ }
677
+ /**
678
+ * Only animate if:
679
+ * 1. We're using grid style (wheel style pickers should just jump to new value)
680
+ * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
681
+ * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
682
+ * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
683
+ */
684
+ const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
685
+ const bodyIsVisible = el.classList.contains('datetime-ready');
686
+ const { isGridStyle, showMonthAndYear } = this;
687
+ if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
688
+ this.animateToDate(targetValue);
689
+ }
690
+ else {
691
+ /**
692
+ * We only need to do this if we didn't just animate to a new month,
693
+ * since that calls prevMonth/nextMonth which calls setWorkingParts for us.
694
+ */
695
+ this.setWorkingParts({
696
+ month,
697
+ day,
698
+ year,
699
+ hour,
700
+ minute,
701
+ ampm,
702
+ });
703
+ }
704
+ };
705
+ this.animateToDate = async (targetValue) => {
706
+ const { workingParts } = this;
707
+ /**
708
+ * Tell other render functions that we need to force the
709
+ * target month to appear in place of the actual next/prev month.
710
+ * Because this is a State variable, a rerender will be triggered
711
+ * automatically, updating the rendered months.
712
+ */
713
+ this.forceRenderDate = targetValue;
714
+ /**
715
+ * Flag that we've started scrolling to the forced date.
716
+ * The resolve function will be called by the datetime's
717
+ * scroll listener when it's done updating everything.
718
+ * This is a replacement for making prev/nextMonth async,
719
+ * since the logic we're waiting on is in a listener.
720
+ */
721
+ const forceDateScrollingPromise = new Promise((resolve) => {
722
+ this.resolveForceDateScrolling = resolve;
723
+ });
724
+ /**
725
+ * Animate smoothly to the forced month. This will also update
726
+ * workingParts and correct the surrounding months for us.
727
+ */
728
+ const targetMonthIsBefore = isBefore(targetValue, workingParts);
729
+ targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
730
+ await forceDateScrollingPromise;
731
+ this.resolveForceDateScrolling = undefined;
732
+ this.forceRenderDate = undefined;
733
+ };
734
+ this.onFocus = () => {
735
+ this.ionFocus.emit();
736
+ };
737
+ this.onBlur = () => {
738
+ this.ionBlur.emit();
739
+ };
740
+ this.hasValue = () => {
741
+ return this.value != null;
742
+ };
743
+ this.nextMonth = () => {
744
+ const calendarBodyRef = this.calendarBodyRef;
745
+ if (!calendarBodyRef) {
746
+ return;
747
+ }
748
+ const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
749
+ if (!nextMonth) {
750
+ return;
751
+ }
752
+ const left = nextMonth.offsetWidth * 2;
753
+ calendarBodyRef.scrollTo({
754
+ top: 0,
755
+ left: left * (isRTL(this.el) ? -1 : 1),
756
+ behavior: 'smooth',
757
+ });
758
+ };
759
+ this.prevMonth = () => {
760
+ const calendarBodyRef = this.calendarBodyRef;
761
+ if (!calendarBodyRef) {
762
+ return;
763
+ }
764
+ const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
765
+ if (!prevMonth) {
766
+ return;
767
+ }
768
+ calendarBodyRef.scrollTo({
769
+ top: 0,
770
+ left: 0,
771
+ behavior: 'smooth',
772
+ });
773
+ };
774
+ this.toggleMonthAndYearView = () => {
775
+ this.showMonthAndYear = !this.showMonthAndYear;
776
+ };
777
+ this.showMonthAndYear = false;
778
+ this.activeParts = [];
779
+ this.workingParts = {
780
+ month: 5,
781
+ day: 28,
782
+ year: 2021,
783
+ hour: 13,
784
+ minute: 52,
785
+ ampm: 'pm',
786
+ };
787
+ this.isTimePopoverOpen = false;
788
+ this.forceRenderDate = undefined;
789
+ this.color = 'primary';
790
+ this.name = this.inputId;
791
+ this.disabled = false;
792
+ this.readonly = false;
793
+ this.isDateEnabled = undefined;
794
+ this.min = undefined;
795
+ this.max = undefined;
796
+ this.presentation = 'date-time';
797
+ this.cancelText = 'Cancel';
798
+ this.doneText = 'Done';
799
+ this.clearText = 'Clear';
800
+ this.yearValues = undefined;
801
+ this.monthValues = undefined;
802
+ this.dayValues = undefined;
803
+ this.hourValues = undefined;
804
+ this.minuteValues = undefined;
805
+ this.locale = 'default';
806
+ this.firstDayOfWeek = 0;
807
+ this.titleSelectedDatesFormatter = undefined;
808
+ this.multiple = false;
809
+ this.highlightedDates = undefined;
810
+ this.value = undefined;
811
+ this.showDefaultTitle = false;
812
+ this.showDefaultButtons = false;
813
+ this.showClearButton = false;
814
+ this.showDefaultTimeLabel = true;
815
+ this.hourCycle = undefined;
816
+ this.size = 'fixed';
817
+ this.preferWheel = false;
818
+ }
819
+ disabledChanged() {
820
+ this.emitStyle();
821
+ }
822
+ minChanged() {
823
+ this.processMinParts();
824
+ }
825
+ maxChanged() {
826
+ this.processMaxParts();
827
+ }
828
+ get isGridStyle() {
829
+ const { presentation, preferWheel } = this;
830
+ const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
831
+ return hasDatePresentation && !preferWheel;
832
+ }
833
+ yearValuesChanged() {
834
+ this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
835
+ }
836
+ monthValuesChanged() {
837
+ this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
838
+ }
839
+ dayValuesChanged() {
840
+ this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
841
+ }
842
+ hourValuesChanged() {
843
+ this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
844
+ }
845
+ minuteValuesChanged() {
846
+ this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
847
+ }
226
848
  /**
227
- * Returns the DatetimePart interface
228
- * to use when rendering an initial set of
229
- * data. This should be used when rendering an
230
- * interface in an environment where the `value`
231
- * may not be set. This function works
232
- * by returning the first selected date and then
233
- * falling back to defaultParts if no active date
234
- * is selected.
849
+ * Update the datetime value when the value changes
235
850
  */
236
- this.getActivePartsWithFallback = () => {
237
- var _a;
238
- const { defaultParts } = this;
239
- return (_a = this.getActivePart()) !== null && _a !== void 0 ? _a : defaultParts;
240
- };
241
- this.getActivePart = () => {
242
- const { activeParts } = this;
243
- return Array.isArray(activeParts) ? activeParts[0] : activeParts;
244
- };
245
- this.closeParentOverlay = () => {
246
- const popoverOrModal = this.el.closest('ion-modal, ion-popover');
247
- if (popoverOrModal) {
248
- popoverOrModal.dismiss();
249
- }
250
- };
251
- this.setWorkingParts = (parts) => {
252
- this.workingParts = Object.assign({}, parts);
253
- };
254
- this.setActiveParts = (parts, removeDate = false) => {
255
- /** if the datetime component is in readonly mode,
256
- * allow browsing of the calendar without changing
257
- * the set value
258
- */
259
- if (this.readonly) {
260
- return;
261
- }
262
- const { multiple, minParts, maxParts, activeParts } = this;
263
- /**
264
- * When setting the active parts, it is possible
265
- * to set invalid data. For example,
266
- * when updating January 31 to February,
267
- * February 31 does not exist. As a result
268
- * we need to validate the active parts and
269
- * ensure that we are only setting valid dates.
270
- * Additionally, we need to update the working parts
271
- * too in the event that the validated parts are different.
272
- */
273
- const validatedParts = validateParts(parts, minParts, maxParts);
274
- this.setWorkingParts(validatedParts);
275
- if (multiple) {
276
- const activePartsArray = Array.isArray(activeParts) ? activeParts : [activeParts];
277
- if (removeDate) {
278
- this.activeParts = activePartsArray.filter((p) => !isSameDay(p, validatedParts));
851
+ async valueChanged() {
852
+ const { value } = this;
853
+ if (this.hasValue()) {
854
+ this.processValue(value);
279
855
  }
280
- else {
281
- this.activeParts = [...activePartsArray, validatedParts];
282
- }
283
- }
284
- else {
285
- this.activeParts = Object.assign({}, validatedParts);
286
- }
287
- const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
288
- if (hasSlottedButtons || this.showDefaultButtons) {
289
- return;
290
- }
291
- this.confirm();
292
- };
293
- this.initializeKeyboardListeners = () => {
294
- const calendarBodyRef = this.calendarBodyRef;
295
- if (!calendarBodyRef) {
296
- return;
297
- }
298
- const root = this.el.shadowRoot;
299
- /**
300
- * Get a reference to the month
301
- * element we are currently viewing.
302
- */
303
- const currentMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(2)');
304
- /**
305
- * When focusing the calendar body, we want to pass focus
306
- * to the working day, but other days should
307
- * only be accessible using the arrow keys. Pressing
308
- * Tab should jump between bodies of selectable content.
309
- */
310
- const checkCalendarBodyFocus = (ev) => {
311
- var _a;
312
- const record = ev[0];
856
+ this.emitStyle();
857
+ this.ionValueChange.emit({ value });
858
+ }
859
+ /**
860
+ * Confirms the selected datetime value, updates the
861
+ * `value` property, and optionally closes the popover
862
+ * or modal that the datetime was presented in.
863
+ */
864
+ async confirm(closeOverlay = false) {
865
+ const { isCalendarPicker, activeParts, preferWheel, workingParts } = this;
313
866
  /**
314
- * If calendar body was already focused
315
- * when this fired or if the calendar body
316
- * if not currently focused, we should not re-focus
317
- * the inner day.
867
+ * We only update the value if the presentation is not a calendar picker.
318
868
  */
319
- if (((_a = record.oldValue) === null || _a === void 0 ? void 0 : _a.includes('ion-focused')) || !calendarBodyRef.classList.contains('ion-focused')) {
320
- return;
869
+ if (activeParts !== undefined || !isCalendarPicker) {
870
+ const activePartsIsArray = Array.isArray(activeParts);
871
+ if (activePartsIsArray && activeParts.length === 0) {
872
+ if (preferWheel) {
873
+ /**
874
+ * If the datetime is using a wheel picker, but the
875
+ * active parts are empty, then the user has confirmed the
876
+ * initial value (working parts) presented to them.
877
+ */
878
+ this.setValue(convertDataToISO(workingParts));
879
+ }
880
+ else {
881
+ this.setValue(undefined);
882
+ }
883
+ }
884
+ else {
885
+ this.setValue(convertDataToISO(activeParts));
886
+ }
321
887
  }
322
- this.focusWorkingDay(currentMonth);
323
- };
324
- const mo = new MutationObserver(checkCalendarBodyFocus);
325
- mo.observe(calendarBodyRef, { attributeFilter: ['class'], attributeOldValue: true });
326
- this.destroyKeyboardMO = () => {
327
- mo === null || mo === void 0 ? void 0 : mo.disconnect();
328
- };
329
- /**
330
- * We must use keydown not keyup as we want
331
- * to prevent scrolling when using the arrow keys.
332
- */
333
- calendarBodyRef.addEventListener('keydown', (ev) => {
334
- const activeElement = root.activeElement;
335
- if (!activeElement || !activeElement.classList.contains('calendar-day')) {
336
- return;
888
+ if (closeOverlay) {
889
+ this.closeParentOverlay();
337
890
  }
338
- const parts = getPartsFromCalendarDay(activeElement);
339
- let partsToFocus;
340
- switch (ev.key) {
341
- case 'ArrowDown':
342
- ev.preventDefault();
343
- partsToFocus = getNextWeek(parts);
344
- break;
345
- case 'ArrowUp':
346
- ev.preventDefault();
347
- partsToFocus = getPreviousWeek(parts);
348
- break;
349
- case 'ArrowRight':
350
- ev.preventDefault();
351
- partsToFocus = getNextDay(parts);
352
- break;
353
- case 'ArrowLeft':
354
- ev.preventDefault();
355
- partsToFocus = getPreviousDay(parts);
356
- break;
357
- case 'Home':
358
- ev.preventDefault();
359
- partsToFocus = getStartOfWeek(parts);
360
- break;
361
- case 'End':
362
- ev.preventDefault();
363
- partsToFocus = getEndOfWeek(parts);
364
- break;
365
- case 'PageUp':
366
- ev.preventDefault();
367
- partsToFocus = ev.shiftKey ? getPreviousYear(parts) : getPreviousMonth(parts);
368
- break;
369
- case 'PageDown':
370
- ev.preventDefault();
371
- partsToFocus = ev.shiftKey ? getNextYear(parts) : getNextMonth(parts);
372
- break;
373
- /**
374
- * Do not preventDefault here
375
- * as we do not want to override other
376
- * browser defaults such as pressing Enter/Space
377
- * to select a day.
378
- */
379
- default:
380
- return;
891
+ }
892
+ /**
893
+ * Resets the internal state of the datetime but does not update the value.
894
+ * Passing a valid ISO-8601 string will reset the state of the component to the provided date.
895
+ * If no value is provided, the internal state will be reset to the clamped value of the min, max and today.
896
+ */
897
+ async reset(startDate) {
898
+ this.processValue(startDate);
899
+ }
900
+ /**
901
+ * Emits the ionCancel event and
902
+ * optionally closes the popover
903
+ * or modal that the datetime was
904
+ * presented in.
905
+ */
906
+ async cancel(closeOverlay = false) {
907
+ this.ionCancel.emit();
908
+ if (closeOverlay) {
909
+ this.closeParentOverlay();
381
910
  }
382
- /**
383
- * If the day we want to move focus to is
384
- * disabled, do not do anything.
385
- */
386
- if (isDayDisabled(partsToFocus, this.minParts, this.maxParts)) {
387
- return;
911
+ }
912
+ get isCalendarPicker() {
913
+ const { presentation } = this;
914
+ return presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
915
+ }
916
+ connectedCallback() {
917
+ this.clearFocusVisible = startFocusVisible(this.el).destroy;
918
+ }
919
+ disconnectedCallback() {
920
+ if (this.clearFocusVisible) {
921
+ this.clearFocusVisible();
922
+ this.clearFocusVisible = undefined;
388
923
  }
389
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), partsToFocus));
924
+ }
925
+ initializeListeners() {
926
+ this.initializeCalendarListener();
927
+ this.initializeKeyboardListeners();
928
+ }
929
+ componentDidLoad() {
390
930
  /**
391
- * Give view a chance to re-render
392
- * then move focus to the new working day
931
+ * If a scrollable element is hidden using `display: none`,
932
+ * it will not have a scroll height meaning we cannot scroll elements
933
+ * into view. As a result, we will need to wait for the datetime to become
934
+ * visible if used inside of a modal or a popover otherwise the scrollable
935
+ * areas will not have the correct values snapped into place.
393
936
  */
394
- requestAnimationFrame(() => this.focusWorkingDay(currentMonth));
395
- });
396
- };
397
- this.focusWorkingDay = (currentMonth) => {
398
- /**
399
- * Get the number of padding days so
400
- * we know how much to offset our next selector by
401
- * to grab the correct calendar-day element.
402
- */
403
- const padding = currentMonth.querySelectorAll('.calendar-day-padding');
404
- const { day } = this.workingParts;
405
- if (day === null) {
406
- return;
407
- }
408
- /**
409
- * Get the calendar day element
410
- * and focus it.
411
- */
412
- const dayEl = currentMonth.querySelector(`.calendar-day-wrapper:nth-of-type(${padding.length + day}) .calendar-day`);
413
- if (dayEl) {
414
- dayEl.focus();
415
- }
416
- };
417
- this.processMinParts = () => {
418
- const { min, defaultParts } = this;
419
- if (min === undefined) {
420
- this.minParts = undefined;
421
- return;
422
- }
423
- this.minParts = parseMinParts(min, defaultParts);
424
- };
425
- this.processMaxParts = () => {
426
- const { max, defaultParts } = this;
427
- if (max === undefined) {
428
- this.maxParts = undefined;
429
- return;
430
- }
431
- this.maxParts = parseMaxParts(max, defaultParts);
432
- };
433
- this.initializeCalendarListener = () => {
434
- const calendarBodyRef = this.calendarBodyRef;
435
- if (!calendarBodyRef) {
436
- return;
437
- }
438
- /**
439
- * For performance reasons, we only render 3
440
- * months at a time: The current month, the previous
441
- * month, and the next month. We have a scroll listener
442
- * on the calendar body to append/prepend new months.
443
- *
444
- * We can do this because Stencil is smart enough to not
445
- * re-create the .calendar-month containers, but rather
446
- * update the content within those containers.
447
- *
448
- * As an added bonus, WebKit has some troubles with
449
- * scroll-snap-stop: always, so not rendering all of
450
- * the months in a row allows us to mostly sidestep
451
- * that issue.
452
- */
453
- const months = calendarBodyRef.querySelectorAll('.calendar-month');
454
- const startMonth = months[0];
455
- const workingMonth = months[1];
456
- const endMonth = months[2];
457
- const mode = getIonMode(this);
458
- const needsiOSRubberBandFix = mode === 'ios' && typeof navigator !== 'undefined' && navigator.maxTouchPoints > 1;
459
- /**
460
- * Before setting up the scroll listener,
461
- * scroll the middle month into view.
462
- * scrollIntoView() will scroll entire page
463
- * if element is not in viewport. Use scrollLeft instead.
464
- */
465
- writeTask(() => {
466
- calendarBodyRef.scrollLeft = startMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
467
- const getChangedMonth = (parts) => {
468
- const box = calendarBodyRef.getBoundingClientRect();
469
- /**
470
- * If the current scroll position is all the way to the left
471
- * then we have scrolled to the previous month.
472
- * Otherwise, assume that we have scrolled to the next
473
- * month. We have a tolerance of 2px to account for
474
- * sub pixel rendering.
475
- *
476
- * Check below the next line ensures that we did not
477
- * swipe and abort (i.e. we swiped but we are still on the current month).
478
- */
479
- const month = calendarBodyRef.scrollLeft <= 2 ? startMonth : endMonth;
480
- /**
481
- * The edge of the month must be lined up with
482
- * the edge of the calendar body in order for
483
- * the component to update. Otherwise, it
484
- * may be the case that the user has paused their
485
- * swipe or the browser has not finished snapping yet.
486
- * Rather than check if the x values are equal,
487
- * we give it a tolerance of 2px to account for
488
- * sub pixel rendering.
489
- */
490
- const monthBox = month.getBoundingClientRect();
491
- if (Math.abs(monthBox.x - box.x) > 2)
492
- return;
493
- /**
494
- * If we're force-rendering a month, assume we've
495
- * scrolled to that and return it.
496
- *
497
- * If forceRenderDate is ever used in a context where the
498
- * forced month is not immediately auto-scrolled to, this
499
- * should be updated to also check whether `month` has the
500
- * same month and year as the forced date.
501
- */
502
- const { forceRenderDate } = this;
503
- if (forceRenderDate !== undefined) {
504
- return { month: forceRenderDate.month, year: forceRenderDate.year, day: forceRenderDate.day };
505
- }
506
- /**
507
- * From here, we can determine if the start
508
- * month or the end month was scrolled into view.
509
- * If no month was changed, then we can return from
510
- * the scroll callback early.
511
- */
512
- if (month === startMonth) {
513
- return getPreviousMonth(parts);
514
- }
515
- else if (month === endMonth) {
516
- return getNextMonth(parts);
517
- }
518
- else {
519
- return;
520
- }
521
- };
522
- const updateActiveMonth = () => {
523
- if (needsiOSRubberBandFix) {
524
- calendarBodyRef.style.removeProperty('pointer-events');
525
- appliediOSRubberBandFix = false;
526
- }
527
- /**
528
- * If the month did not change
529
- * then we can return early.
530
- */
531
- const newDate = getChangedMonth(this.workingParts);
532
- if (!newDate)
533
- return;
534
- const { month, day, year } = newDate;
535
- if (isMonthDisabled({ month, year, day: null }, {
536
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
537
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
538
- })) {
539
- return;
540
- }
541
- /**
542
- * Prevent scrolling for other browsers
543
- * to give the DOM time to update and the container
544
- * time to properly snap.
545
- */
546
- calendarBodyRef.style.setProperty('overflow', 'hidden');
547
- /**
548
- * Use a writeTask here to ensure
549
- * that the state is updated and the
550
- * correct month is scrolled into view
551
- * in the same frame. This is not
552
- * typically a problem on newer devices
553
- * but older/slower device may have a flicker
554
- * if we did not do this.
555
- */
556
- writeTask(() => {
557
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month, day: day, year }));
558
- calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
559
- calendarBodyRef.style.removeProperty('overflow');
560
- if (this.resolveForceDateScrolling) {
561
- this.resolveForceDateScrolling();
937
+ const visibleCallback = (entries) => {
938
+ const ev = entries[0];
939
+ if (!ev.isIntersecting) {
940
+ return;
562
941
  }
563
- });
942
+ this.initializeListeners();
943
+ /**
944
+ * TODO FW-2793: Datetime needs a frame to ensure that it
945
+ * can properly scroll contents into view. As a result
946
+ * we hide the scrollable content until after that frame
947
+ * so users do not see the content quickly shifting. The downside
948
+ * is that the content will pop into view a frame after. Maybe there
949
+ * is a better way to handle this?
950
+ */
951
+ writeTask(() => {
952
+ this.el.classList.add('datetime-ready');
953
+ });
564
954
  };
955
+ const visibleIO = new IntersectionObserver(visibleCallback, { threshold: 0.01 });
565
956
  /**
566
- * When the container finishes scrolling we
567
- * need to update the DOM with the selected month.
957
+ * Use raf to avoid a race condition between the component loading and
958
+ * its display animation starting (such as when shown in a modal). This
959
+ * could cause the datetime to start at a visibility of 0, erroneously
960
+ * triggering the `hiddenIO` observer below.
568
961
  */
569
- let scrollTimeout;
962
+ raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(this.el));
570
963
  /**
571
- * We do not want to attempt to set pointer-events
572
- * multiple times within a single swipe gesture as
573
- * that adds unnecessary work to the main thread.
964
+ * We need to clean up listeners when the datetime is hidden
965
+ * in a popover/modal so that we can properly scroll containers
966
+ * back into view if they are re-presented. When the datetime is hidden
967
+ * the scroll areas have scroll widths/heights of 0px, so any snapping
968
+ * we did originally has been lost.
574
969
  */
575
- let appliediOSRubberBandFix = false;
576
- const scrollCallback = () => {
577
- if (scrollTimeout) {
578
- clearTimeout(scrollTimeout);
579
- }
580
- /**
581
- * On iOS it is possible to quickly rubber band
582
- * the scroll area before the scroll timeout has fired.
583
- * This results in users reaching the end of the scrollable
584
- * container before the DOM has updated.
585
- * By setting `pointer-events: none` we can ensure that
586
- * subsequent swipes do not happen while the container
587
- * is snapping.
588
- */
589
- if (!appliediOSRubberBandFix && needsiOSRubberBandFix) {
590
- calendarBodyRef.style.setProperty('pointer-events', 'none');
591
- appliediOSRubberBandFix = true;
592
- }
593
- // Wait ~3 frames
594
- scrollTimeout = setTimeout(updateActiveMonth, 50);
595
- };
596
- calendarBodyRef.addEventListener('scroll', scrollCallback);
597
- this.destroyCalendarListener = () => {
598
- calendarBodyRef.removeEventListener('scroll', scrollCallback);
970
+ const hiddenCallback = (entries) => {
971
+ const ev = entries[0];
972
+ if (ev.isIntersecting) {
973
+ return;
974
+ }
975
+ this.destroyInteractionListeners();
976
+ /**
977
+ * When datetime is hidden, we need to make sure that
978
+ * the month/year picker is closed. Otherwise,
979
+ * it will be open when the datetime re-appears
980
+ * and the scroll area of the calendar grid will be 0.
981
+ * As a result, the wrong month will be shown.
982
+ */
983
+ this.showMonthAndYear = false;
984
+ writeTask(() => {
985
+ this.el.classList.remove('datetime-ready');
986
+ });
599
987
  };
600
- });
601
- };
988
+ const hiddenIO = new IntersectionObserver(hiddenCallback, { threshold: 0 });
989
+ raf(() => hiddenIO === null || hiddenIO === void 0 ? void 0 : hiddenIO.observe(this.el));
990
+ /**
991
+ * Datetime uses Ionic components that emit
992
+ * ionFocus and ionBlur. These events are
993
+ * composed meaning they will cross
994
+ * the shadow dom boundary. We need to
995
+ * stop propagation on these events otherwise
996
+ * developers will see 2 ionFocus or 2 ionBlur
997
+ * events at a time.
998
+ */
999
+ const root = getElementRoot(this.el);
1000
+ root.addEventListener('ionFocus', (ev) => ev.stopPropagation());
1001
+ root.addEventListener('ionBlur', (ev) => ev.stopPropagation());
1002
+ }
602
1003
  /**
603
- * Clean up all listeners except for the overlay
604
- * listener. This is so that we can re-create the listeners
605
- * if the datetime has been hidden/presented by a modal or popover.
1004
+ * When the presentation is changed, all calendar content is recreated,
1005
+ * so we need to re-init behavior with the new elements.
606
1006
  */
607
- this.destroyInteractionListeners = () => {
608
- const { destroyCalendarListener, destroyKeyboardMO } = this;
609
- if (destroyCalendarListener !== undefined) {
610
- destroyCalendarListener();
611
- }
612
- if (destroyKeyboardMO !== undefined) {
613
- destroyKeyboardMO();
614
- }
615
- };
616
- this.processValue = (value) => {
617
- const hasValue = value !== null && value !== undefined && (!Array.isArray(value) || value.length > 0);
618
- const valueToProcess = hasValue ? parseDate(value) : this.defaultParts;
619
- const { minParts, maxParts, workingParts, el } = this;
620
- this.warnIfIncorrectValueUsage();
621
- /**
622
- * Return early if the value wasn't parsed correctly, such as
623
- * if an improperly formatted date string was provided.
624
- */
625
- if (!valueToProcess) {
626
- return;
627
- }
628
- /**
629
- * Datetime should only warn of out of bounds values
630
- * if set by the user. If the `value` is undefined,
631
- * we will default to today's date which may be out
632
- * of bounds. In this case, the warning makes it look
633
- * like the developer did something wrong which is
634
- * not true.
635
- */
636
- if (hasValue) {
637
- warnIfValueOutOfBounds(valueToProcess, minParts, maxParts);
638
- }
639
- /**
640
- * If there are multiple values, pick an arbitrary one to clamp to. This way,
641
- * if the values are across months, we always show at least one of them. Note
642
- * that the values don't necessarily have to be in order.
643
- */
644
- const singleValue = Array.isArray(valueToProcess) ? valueToProcess[0] : valueToProcess;
645
- const targetValue = clampDate(singleValue, minParts, maxParts);
646
- const { month, day, year, hour, minute } = targetValue;
647
- const ampm = parseAmPm(hour);
648
- /**
649
- * Since `activeParts` indicates a value that
650
- * been explicitly selected either by the
651
- * user or the app, only update `activeParts`
652
- * if the `value` property is set.
653
- */
654
- if (hasValue) {
655
- if (Array.isArray(valueToProcess)) {
656
- this.activeParts = [...valueToProcess];
657
- }
658
- else {
659
- this.activeParts = {
660
- month,
661
- day,
662
- year,
663
- hour,
664
- minute,
665
- ampm,
666
- };
667
- }
668
- }
669
- else {
1007
+ componentDidRender() {
1008
+ const { presentation, prevPresentation, calendarBodyRef, minParts, preferWheel, forceRenderDate } = this;
670
1009
  /**
671
- * Reset the active parts if the value is not set.
672
- * This will clear the selected calendar day when
673
- * performing a clear action or using the reset() method.
1010
+ * TODO(FW-2165)
1011
+ * Remove this when https://bugs.webkit.org/show_bug.cgi?id=235960 is fixed.
1012
+ * When using `min`, we add `scroll-snap-align: none`
1013
+ * to the disabled month so that users cannot scroll to it.
1014
+ * This triggers a bug in WebKit where the scroll position is reset.
1015
+ * Since the month change logic is handled by a scroll listener,
1016
+ * this causes the month to change leading to `scroll-snap-align`
1017
+ * changing again, thus changing the scroll position again and causing
1018
+ * an infinite loop.
1019
+ * This issue only applies to the calendar grid, so we can disable
1020
+ * it if the calendar grid is not being used.
674
1021
  */
675
- this.activeParts = [];
676
- }
677
- /**
678
- * Only animate if:
679
- * 1. We're using grid style (wheel style pickers should just jump to new value)
680
- * 2. The month and/or year actually changed, and both are defined (otherwise there's nothing to animate to)
681
- * 3. The calendar body is visible (prevents animation when in collapsed datetime-button, for example)
682
- * 4. The month/year picker is not open (since you wouldn't see the animation anyway)
683
- */
684
- const didChangeMonth = (month !== undefined && month !== workingParts.month) || (year !== undefined && year !== workingParts.year);
685
- const bodyIsVisible = el.classList.contains('datetime-ready');
686
- const { isGridStyle, showMonthAndYear } = this;
687
- if (isGridStyle && didChangeMonth && bodyIsVisible && !showMonthAndYear) {
688
- this.animateToDate(targetValue);
689
- }
690
- else {
1022
+ const hasCalendarGrid = !preferWheel && ['date-time', 'time-date', 'date'].includes(presentation);
1023
+ if (minParts !== undefined && hasCalendarGrid && calendarBodyRef) {
1024
+ const workingMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(1)');
1025
+ /**
1026
+ * We need to make sure the datetime is not in the process
1027
+ * of scrolling to a new datetime value if the value
1028
+ * is updated programmatically.
1029
+ * Otherwise, the datetime will appear to not scroll at all because
1030
+ * we are resetting the scroll position to the center of the view.
1031
+ * Prior to the datetime's value being updated programmatically,
1032
+ * the calendarBodyRef is scrolled such that the middle month is centered
1033
+ * in the view. The below code updates the scroll position so the middle
1034
+ * month is also centered in the view. Since the scroll position did not change,
1035
+ * the scroll callback in this file does not fire,
1036
+ * and the resolveForceDateScrolling promise never resolves.
1037
+ */
1038
+ if (workingMonth && forceRenderDate === undefined) {
1039
+ calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
1040
+ }
1041
+ }
1042
+ if (prevPresentation === null) {
1043
+ this.prevPresentation = presentation;
1044
+ return;
1045
+ }
1046
+ if (presentation === prevPresentation) {
1047
+ return;
1048
+ }
1049
+ this.prevPresentation = presentation;
1050
+ this.destroyInteractionListeners();
1051
+ this.initializeListeners();
691
1052
  /**
692
- * We only need to do this if we didn't just animate to a new month,
693
- * since that calls prevMonth/nextMonth which calls setWorkingParts for us.
1053
+ * The month/year picker from the date interface
1054
+ * should be closed as it is not available in non-date
1055
+ * interfaces.
694
1056
  */
695
- this.setWorkingParts({
696
- month,
697
- day,
698
- year,
699
- hour,
700
- minute,
701
- ampm,
1057
+ this.showMonthAndYear = false;
1058
+ raf(() => {
1059
+ this.ionRender.emit();
702
1060
  });
703
- }
704
- };
705
- this.animateToDate = async (targetValue) => {
706
- const { workingParts } = this;
707
- /**
708
- * Tell other render functions that we need to force the
709
- * target month to appear in place of the actual next/prev month.
710
- * Because this is a State variable, a rerender will be triggered
711
- * automatically, updating the rendered months.
712
- */
713
- this.forceRenderDate = targetValue;
714
- /**
715
- * Flag that we've started scrolling to the forced date.
716
- * The resolve function will be called by the datetime's
717
- * scroll listener when it's done updating everything.
718
- * This is a replacement for making prev/nextMonth async,
719
- * since the logic we're waiting on is in a listener.
720
- */
721
- const forceDateScrollingPromise = new Promise((resolve) => {
722
- this.resolveForceDateScrolling = resolve;
723
- });
724
- /**
725
- * Animate smoothly to the forced month. This will also update
726
- * workingParts and correct the surrounding months for us.
727
- */
728
- const targetMonthIsBefore = isBefore(targetValue, workingParts);
729
- targetMonthIsBefore ? this.prevMonth() : this.nextMonth();
730
- await forceDateScrollingPromise;
731
- this.resolveForceDateScrolling = undefined;
732
- this.forceRenderDate = undefined;
733
- };
734
- this.onFocus = () => {
735
- this.ionFocus.emit();
736
- };
737
- this.onBlur = () => {
738
- this.ionBlur.emit();
739
- };
740
- this.hasValue = () => {
741
- return this.value != null;
742
- };
743
- this.nextMonth = () => {
744
- const calendarBodyRef = this.calendarBodyRef;
745
- if (!calendarBodyRef) {
746
- return;
747
- }
748
- const nextMonth = calendarBodyRef.querySelector('.calendar-month:last-of-type');
749
- if (!nextMonth) {
750
- return;
751
- }
752
- const left = nextMonth.offsetWidth * 2;
753
- calendarBodyRef.scrollTo({
754
- top: 0,
755
- left: left * (isRTL(this.el) ? -1 : 1),
756
- behavior: 'smooth',
757
- });
758
- };
759
- this.prevMonth = () => {
760
- const calendarBodyRef = this.calendarBodyRef;
761
- if (!calendarBodyRef) {
762
- return;
763
- }
764
- const prevMonth = calendarBodyRef.querySelector('.calendar-month:first-of-type');
765
- if (!prevMonth) {
766
- return;
767
- }
768
- calendarBodyRef.scrollTo({
769
- top: 0,
770
- left: 0,
771
- behavior: 'smooth',
772
- });
773
- };
774
- this.toggleMonthAndYearView = () => {
775
- this.showMonthAndYear = !this.showMonthAndYear;
776
- };
777
- this.showMonthAndYear = false;
778
- this.activeParts = [];
779
- this.workingParts = {
780
- month: 5,
781
- day: 28,
782
- year: 2021,
783
- hour: 13,
784
- minute: 52,
785
- ampm: 'pm',
786
- };
787
- this.isTimePopoverOpen = false;
788
- this.forceRenderDate = undefined;
789
- this.color = 'primary';
790
- this.name = this.inputId;
791
- this.disabled = false;
792
- this.readonly = false;
793
- this.isDateEnabled = undefined;
794
- this.min = undefined;
795
- this.max = undefined;
796
- this.presentation = 'date-time';
797
- this.cancelText = 'Cancel';
798
- this.doneText = 'Done';
799
- this.clearText = 'Clear';
800
- this.yearValues = undefined;
801
- this.monthValues = undefined;
802
- this.dayValues = undefined;
803
- this.hourValues = undefined;
804
- this.minuteValues = undefined;
805
- this.locale = 'default';
806
- this.firstDayOfWeek = 0;
807
- this.titleSelectedDatesFormatter = undefined;
808
- this.multiple = false;
809
- this.highlightedDates = undefined;
810
- this.value = undefined;
811
- this.showDefaultTitle = false;
812
- this.showDefaultButtons = false;
813
- this.showClearButton = false;
814
- this.showDefaultTimeLabel = true;
815
- this.hourCycle = undefined;
816
- this.size = 'fixed';
817
- this.preferWheel = false;
818
- }
819
- disabledChanged() {
820
- this.emitStyle();
821
- }
822
- minChanged() {
823
- this.processMinParts();
824
- }
825
- maxChanged() {
826
- this.processMaxParts();
827
- }
828
- get isGridStyle() {
829
- const { presentation, preferWheel } = this;
830
- const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
831
- return hasDatePresentation && !preferWheel;
832
- }
833
- yearValuesChanged() {
834
- this.parsedYearValues = convertToArrayOfNumbers(this.yearValues);
835
- }
836
- monthValuesChanged() {
837
- this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues);
838
- }
839
- dayValuesChanged() {
840
- this.parsedDayValues = convertToArrayOfNumbers(this.dayValues);
841
- }
842
- hourValuesChanged() {
843
- this.parsedHourValues = convertToArrayOfNumbers(this.hourValues);
844
- }
845
- minuteValuesChanged() {
846
- this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues);
847
- }
848
- /**
849
- * Update the datetime value when the value changes
850
- */
851
- async valueChanged() {
852
- const { value } = this;
853
- if (this.hasValue()) {
854
- this.processValue(value);
855
- }
856
- this.emitStyle();
857
- this.ionValueChange.emit({ value });
858
- }
859
- /**
860
- * Confirms the selected datetime value, updates the
861
- * `value` property, and optionally closes the popover
862
- * or modal that the datetime was presented in.
863
- */
864
- async confirm(closeOverlay = false) {
865
- const { isCalendarPicker, activeParts } = this;
866
- /**
867
- * We only update the value if the presentation is not a calendar picker.
868
- */
869
- if (activeParts !== undefined || !isCalendarPicker) {
870
- const activePartsIsArray = Array.isArray(activeParts);
871
- if (activePartsIsArray && activeParts.length === 0) {
872
- this.setValue(undefined);
873
- }
874
- else {
875
- this.setValue(convertDataToISO(activeParts));
876
- }
877
- }
878
- if (closeOverlay) {
879
- this.closeParentOverlay();
880
- }
881
- }
882
- /**
883
- * Resets the internal state of the datetime but does not update the value.
884
- * Passing a valid ISO-8601 string will reset the state of the component to the provided date.
885
- * If no value is provided, the internal state will be reset to the clamped value of the min, max and today.
886
- */
887
- async reset(startDate) {
888
- this.processValue(startDate);
889
- }
890
- /**
891
- * Emits the ionCancel event and
892
- * optionally closes the popover
893
- * or modal that the datetime was
894
- * presented in.
895
- */
896
- async cancel(closeOverlay = false) {
897
- this.ionCancel.emit();
898
- if (closeOverlay) {
899
- this.closeParentOverlay();
900
- }
901
- }
902
- get isCalendarPicker() {
903
- const { presentation } = this;
904
- return presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
905
- }
906
- connectedCallback() {
907
- this.clearFocusVisible = startFocusVisible(this.el).destroy;
908
- }
909
- disconnectedCallback() {
910
- if (this.clearFocusVisible) {
911
- this.clearFocusVisible();
912
- this.clearFocusVisible = undefined;
913
- }
914
- }
915
- initializeListeners() {
916
- this.initializeCalendarListener();
917
- this.initializeKeyboardListeners();
918
- }
919
- componentDidLoad() {
920
- /**
921
- * If a scrollable element is hidden using `display: none`,
922
- * it will not have a scroll height meaning we cannot scroll elements
923
- * into view. As a result, we will need to wait for the datetime to become
924
- * visible if used inside of a modal or a popover otherwise the scrollable
925
- * areas will not have the correct values snapped into place.
926
- */
927
- const visibleCallback = (entries) => {
928
- const ev = entries[0];
929
- if (!ev.isIntersecting) {
930
- return;
931
- }
932
- this.initializeListeners();
933
- /**
934
- * TODO FW-2793: Datetime needs a frame to ensure that it
935
- * can properly scroll contents into view. As a result
936
- * we hide the scrollable content until after that frame
937
- * so users do not see the content quickly shifting. The downside
938
- * is that the content will pop into view a frame after. Maybe there
939
- * is a better way to handle this?
940
- */
941
- writeTask(() => {
942
- this.el.classList.add('datetime-ready');
943
- });
944
- };
945
- const visibleIO = new IntersectionObserver(visibleCallback, { threshold: 0.01 });
946
- /**
947
- * Use raf to avoid a race condition between the component loading and
948
- * its display animation starting (such as when shown in a modal). This
949
- * could cause the datetime to start at a visibility of 0, erroneously
950
- * triggering the `hiddenIO` observer below.
951
- */
952
- raf(() => visibleIO === null || visibleIO === void 0 ? void 0 : visibleIO.observe(this.el));
953
- /**
954
- * We need to clean up listeners when the datetime is hidden
955
- * in a popover/modal so that we can properly scroll containers
956
- * back into view if they are re-presented. When the datetime is hidden
957
- * the scroll areas have scroll widths/heights of 0px, so any snapping
958
- * we did originally has been lost.
959
- */
960
- const hiddenCallback = (entries) => {
961
- const ev = entries[0];
962
- if (ev.isIntersecting) {
963
- return;
964
- }
965
- this.destroyInteractionListeners();
966
- /**
967
- * When datetime is hidden, we need to make sure that
968
- * the month/year picker is closed. Otherwise,
969
- * it will be open when the datetime re-appears
970
- * and the scroll area of the calendar grid will be 0.
971
- * As a result, the wrong month will be shown.
972
- */
973
- this.showMonthAndYear = false;
974
- writeTask(() => {
975
- this.el.classList.remove('datetime-ready');
976
- });
977
- };
978
- const hiddenIO = new IntersectionObserver(hiddenCallback, { threshold: 0 });
979
- raf(() => hiddenIO === null || hiddenIO === void 0 ? void 0 : hiddenIO.observe(this.el));
980
- /**
981
- * Datetime uses Ionic components that emit
982
- * ionFocus and ionBlur. These events are
983
- * composed meaning they will cross
984
- * the shadow dom boundary. We need to
985
- * stop propagation on these events otherwise
986
- * developers will see 2 ionFocus or 2 ionBlur
987
- * events at a time.
988
- */
989
- const root = getElementRoot(this.el);
990
- root.addEventListener('ionFocus', (ev) => ev.stopPropagation());
991
- root.addEventListener('ionBlur', (ev) => ev.stopPropagation());
992
- }
993
- /**
994
- * When the presentation is changed, all calendar content is recreated,
995
- * so we need to re-init behavior with the new elements.
996
- */
997
- componentDidRender() {
998
- const { presentation, prevPresentation, calendarBodyRef, minParts, preferWheel } = this;
999
- /**
1000
- * TODO(FW-2165)
1001
- * Remove this when https://bugs.webkit.org/show_bug.cgi?id=235960 is fixed.
1002
- * When using `min`, we add `scroll-snap-align: none`
1003
- * to the disabled month so that users cannot scroll to it.
1004
- * This triggers a bug in WebKit where the scroll position is reset.
1005
- * Since the month change logic is handled by a scroll listener,
1006
- * this causes the month to change leading to `scroll-snap-align`
1007
- * changing again, thus changing the scroll position again and causing
1008
- * an infinite loop.
1009
- * This issue only applies to the calendar grid, so we can disable
1010
- * it if the calendar grid is not being used.
1011
- */
1012
- const hasCalendarGrid = !preferWheel && ['date-time', 'time-date', 'date'].includes(presentation);
1013
- if (minParts !== undefined && hasCalendarGrid && calendarBodyRef) {
1014
- const workingMonth = calendarBodyRef.querySelector('.calendar-month:nth-of-type(1)');
1015
- if (workingMonth) {
1016
- calendarBodyRef.scrollLeft = workingMonth.clientWidth * (isRTL(this.el) ? -1 : 1);
1017
- }
1018
- }
1019
- if (prevPresentation === null) {
1020
- this.prevPresentation = presentation;
1021
- return;
1022
- }
1023
- if (presentation === prevPresentation) {
1024
- return;
1025
- }
1026
- this.prevPresentation = presentation;
1027
- this.destroyInteractionListeners();
1028
- this.initializeListeners();
1029
- /**
1030
- * The month/year picker from the date interface
1031
- * should be closed as it is not available in non-date
1032
- * interfaces.
1033
- */
1034
- this.showMonthAndYear = false;
1035
- raf(() => {
1036
- this.ionRender.emit();
1037
- });
1038
- }
1039
- componentWillLoad() {
1040
- const { el, highlightedDates, multiple, presentation, preferWheel } = this;
1041
- if (multiple) {
1042
- if (presentation !== 'date') {
1043
- printIonWarning('Multiple date selection is only supported for presentation="date".', el);
1044
- }
1045
- if (preferWheel) {
1046
- printIonWarning('Multiple date selection is not supported with preferWheel="true".', el);
1047
- }
1048
- }
1049
- if (highlightedDates !== undefined) {
1050
- if (presentation !== 'date' && presentation !== 'date-time' && presentation !== 'time-date') {
1051
- printIonWarning('The highlightedDates property is only supported with the date, date-time, and time-date presentations.', el);
1052
- }
1053
- if (preferWheel) {
1054
- printIonWarning('The highlightedDates property is not supported with preferWheel="true".', el);
1055
- }
1056
- }
1057
- const hourValues = (this.parsedHourValues = convertToArrayOfNumbers(this.hourValues));
1058
- const minuteValues = (this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues));
1059
- const monthValues = (this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues));
1060
- const yearValues = (this.parsedYearValues = convertToArrayOfNumbers(this.yearValues));
1061
- const dayValues = (this.parsedDayValues = convertToArrayOfNumbers(this.dayValues));
1062
- const todayParts = (this.todayParts = parseDate(getToday()));
1063
- this.defaultParts = getClosestValidDate(todayParts, monthValues, dayValues, yearValues, hourValues, minuteValues);
1064
- this.processMinParts();
1065
- this.processMaxParts();
1066
- this.processValue(this.value);
1067
- this.emitStyle();
1068
- }
1069
- emitStyle() {
1070
- this.ionStyle.emit({
1071
- interactive: true,
1072
- datetime: true,
1073
- 'interactive-disabled': this.disabled,
1074
- });
1075
- }
1076
- /**
1077
- * Universal render methods
1078
- * These are pieces of datetime that
1079
- * are rendered independently of presentation.
1080
- */
1081
- renderFooter() {
1082
- const { disabled, readonly, showDefaultButtons, showClearButton } = this;
1083
- /**
1084
- * The cancel, clear, and confirm buttons
1085
- * should not be interactive if the datetime
1086
- * is disabled or readonly.
1087
- */
1088
- const isButtonDisabled = disabled || readonly;
1089
- const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
1090
- if (!hasSlottedButtons && !showDefaultButtons && !showClearButton) {
1091
- return;
1092
- }
1093
- const clearButtonClick = () => {
1094
- this.reset();
1095
- this.setValue(undefined);
1096
- };
1097
- /**
1098
- * By default we render two buttons:
1099
- * Cancel - Dismisses the datetime and
1100
- * does not update the `value` prop.
1101
- * OK - Dismisses the datetime and
1102
- * updates the `value` prop.
1103
- */
1104
- return (h("div", { class: "datetime-footer" }, h("div", { class: "datetime-buttons" }, h("div", { class: {
1105
- ['datetime-action-buttons']: true,
1106
- ['has-clear-button']: this.showClearButton,
1107
- } }, h("slot", { name: "buttons" }, h("ion-buttons", null, showDefaultButtons && (h("ion-button", { id: "cancel-button", color: this.color, onClick: () => this.cancel(true), disabled: isButtonDisabled }, this.cancelText)), h("div", { class: "datetime-action-buttons-container" }, showClearButton && (h("ion-button", { id: "clear-button", color: this.color, onClick: () => clearButtonClick(), disabled: isButtonDisabled }, this.clearText)), showDefaultButtons && (h("ion-button", { id: "confirm-button", color: this.color, onClick: () => this.confirm(true), disabled: isButtonDisabled }, this.doneText)))))))));
1108
- }
1109
- /**
1110
- * Wheel picker render methods
1111
- */
1112
- renderWheelPicker(forcePresentation = this.presentation) {
1113
- /**
1114
- * If presentation="time-date" we switch the
1115
- * order of the render array here instead of
1116
- * manually reordering each date/time picker
1117
- * column with CSS. This allows for additional
1118
- * flexibility if we need to render subsets
1119
- * of the date/time data or do additional ordering
1120
- * within the child render functions.
1121
- */
1122
- const renderArray = forcePresentation === 'time-date'
1123
- ? [this.renderTimePickerColumns(forcePresentation), this.renderDatePickerColumns(forcePresentation)]
1124
- : [this.renderDatePickerColumns(forcePresentation), this.renderTimePickerColumns(forcePresentation)];
1125
- return h("ion-picker-internal", null, renderArray);
1126
- }
1127
- renderDatePickerColumns(forcePresentation) {
1128
- return forcePresentation === 'date-time' || forcePresentation === 'time-date'
1129
- ? this.renderCombinedDatePickerColumn()
1130
- : this.renderIndividualDatePickerColumns(forcePresentation);
1131
- }
1132
- renderCombinedDatePickerColumn() {
1133
- const { defaultParts, workingParts, locale, minParts, maxParts, todayParts, isDateEnabled } = this;
1134
- const activePart = this.getActivePartsWithFallback();
1135
- /**
1136
- * By default, generate a range of 3 months:
1137
- * Previous month, current month, and next month
1138
- */
1139
- const monthsToRender = generateMonths(workingParts);
1140
- const lastMonth = monthsToRender[monthsToRender.length - 1];
1141
- /**
1142
- * Ensure that users can select the entire window of dates.
1143
- */
1144
- monthsToRender[0].day = 1;
1145
- lastMonth.day = getNumDaysInMonth(lastMonth.month, lastMonth.year);
1146
- /**
1147
- * Narrow the dates rendered based on min/max dates (if any).
1148
- * The `min` date is used if the min is after the generated min month.
1149
- * The `max` date is used if the max is before the generated max month.
1150
- * This ensures that the sliding window always stays at 3 months
1151
- * but still allows future dates to be lazily rendered based on any min/max
1152
- * constraints.
1153
- */
1154
- const min = minParts !== undefined && isAfter(minParts, monthsToRender[0]) ? minParts : monthsToRender[0];
1155
- const max = maxParts !== undefined && isBefore(maxParts, lastMonth) ? maxParts : lastMonth;
1156
- const result = getCombinedDateColumnData(locale, todayParts, min, max, this.parsedDayValues, this.parsedMonthValues);
1157
- let items = result.items;
1158
- const parts = result.parts;
1159
- if (isDateEnabled) {
1160
- items = items.map((itemObject, index) => {
1161
- const referenceParts = parts[index];
1162
- let disabled;
1163
- try {
1164
- /**
1165
- * The `isDateEnabled` implementation is try-catch wrapped
1166
- * to prevent exceptions in the user's function from
1167
- * interrupting the calendar rendering.
1168
- */
1169
- disabled = !isDateEnabled(convertDataToISO(referenceParts));
1061
+ }
1062
+ componentWillLoad() {
1063
+ const { el, highlightedDates, multiple, presentation, preferWheel } = this;
1064
+ if (multiple) {
1065
+ if (presentation !== 'date') {
1066
+ printIonWarning('Multiple date selection is only supported for presentation="date".', el);
1067
+ }
1068
+ if (preferWheel) {
1069
+ printIonWarning('Multiple date selection is not supported with preferWheel="true".', el);
1070
+ }
1170
1071
  }
1171
- catch (e) {
1172
- printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1072
+ if (highlightedDates !== undefined) {
1073
+ if (presentation !== 'date' && presentation !== 'date-time' && presentation !== 'time-date') {
1074
+ printIonWarning('The highlightedDates property is only supported with the date, date-time, and time-date presentations.', el);
1075
+ }
1076
+ if (preferWheel) {
1077
+ printIonWarning('The highlightedDates property is not supported with preferWheel="true".', el);
1078
+ }
1173
1079
  }
1174
- return Object.assign(Object.assign({}, itemObject), { disabled });
1175
- });
1080
+ const hourValues = (this.parsedHourValues = convertToArrayOfNumbers(this.hourValues));
1081
+ const minuteValues = (this.parsedMinuteValues = convertToArrayOfNumbers(this.minuteValues));
1082
+ const monthValues = (this.parsedMonthValues = convertToArrayOfNumbers(this.monthValues));
1083
+ const yearValues = (this.parsedYearValues = convertToArrayOfNumbers(this.yearValues));
1084
+ const dayValues = (this.parsedDayValues = convertToArrayOfNumbers(this.dayValues));
1085
+ const todayParts = (this.todayParts = parseDate(getToday()));
1086
+ this.processMinParts();
1087
+ this.processMaxParts();
1088
+ this.defaultParts = getClosestValidDate({
1089
+ refParts: todayParts,
1090
+ monthValues,
1091
+ dayValues,
1092
+ yearValues,
1093
+ hourValues,
1094
+ minuteValues,
1095
+ minParts: this.minParts,
1096
+ maxParts: this.maxParts,
1097
+ });
1098
+ this.processValue(this.value);
1099
+ this.emitStyle();
1100
+ }
1101
+ emitStyle() {
1102
+ this.ionStyle.emit({
1103
+ interactive: true,
1104
+ datetime: true,
1105
+ 'interactive-disabled': this.disabled,
1106
+ });
1176
1107
  }
1177
1108
  /**
1178
- * If we have selected a day already, then default the column
1179
- * to that value. Otherwise, set it to the default date.
1109
+ * Universal render methods
1110
+ * These are pieces of datetime that
1111
+ * are rendered independently of presentation.
1180
1112
  */
1181
- const todayString = workingParts.day !== null
1182
- ? `${workingParts.year}-${workingParts.month}-${workingParts.day}`
1183
- : `${defaultParts.year}-${defaultParts.month}-${defaultParts.day}`;
1184
- return (h("ion-picker-column-internal", { class: "date-column", color: this.color, items: items, value: todayString, onIonChange: (ev) => {
1185
- // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1186
- // Due to a Safari 14 issue we need to destroy
1187
- // the scroll listener before we update state
1188
- // and trigger a re-render.
1189
- if (this.destroyCalendarListener) {
1190
- this.destroyCalendarListener();
1113
+ renderFooter() {
1114
+ const { disabled, readonly, showDefaultButtons, showClearButton } = this;
1115
+ /**
1116
+ * The cancel, clear, and confirm buttons
1117
+ * should not be interactive if the datetime
1118
+ * is disabled or readonly.
1119
+ */
1120
+ const isButtonDisabled = disabled || readonly;
1121
+ const hasSlottedButtons = this.el.querySelector('[slot="buttons"]') !== null;
1122
+ if (!hasSlottedButtons && !showDefaultButtons && !showClearButton) {
1123
+ return;
1191
1124
  }
1192
- const { value } = ev.detail;
1193
- const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1194
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
1195
- this.setActiveParts(Object.assign(Object.assign({}, activePart), findPart));
1196
- // We can re-attach the scroll listener after
1197
- // the working parts have been updated.
1198
- this.initializeCalendarListener();
1199
- ev.stopPropagation();
1200
- } }));
1201
- }
1202
- renderIndividualDatePickerColumns(forcePresentation) {
1203
- const { workingParts, isDateEnabled } = this;
1204
- const shouldRenderMonths = forcePresentation !== 'year' && forcePresentation !== 'time';
1205
- const months = shouldRenderMonths
1206
- ? getMonthColumnData(this.locale, workingParts, this.minParts, this.maxParts, this.parsedMonthValues)
1207
- : [];
1208
- const shouldRenderDays = forcePresentation === 'date';
1209
- let days = shouldRenderDays
1210
- ? getDayColumnData(this.locale, workingParts, this.minParts, this.maxParts, this.parsedDayValues)
1211
- : [];
1212
- if (isDateEnabled) {
1213
- days = days.map((dayObject) => {
1214
- const { value } = dayObject;
1215
- const valueNum = typeof value === 'string' ? parseInt(value) : value;
1216
- const referenceParts = {
1217
- month: workingParts.month,
1218
- day: valueNum,
1219
- year: workingParts.year,
1125
+ const clearButtonClick = () => {
1126
+ this.reset();
1127
+ this.setValue(undefined);
1220
1128
  };
1221
- let disabled;
1222
- try {
1223
- /**
1224
- * The `isDateEnabled` implementation is try-catch wrapped
1225
- * to prevent exceptions in the user's function from
1226
- * interrupting the calendar rendering.
1227
- */
1228
- disabled = !isDateEnabled(convertDataToISO(referenceParts));
1229
- }
1230
- catch (e) {
1231
- printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1232
- }
1233
- return Object.assign(Object.assign({}, dayObject), { disabled });
1234
- });
1129
+ /**
1130
+ * By default we render two buttons:
1131
+ * Cancel - Dismisses the datetime and
1132
+ * does not update the `value` prop.
1133
+ * OK - Dismisses the datetime and
1134
+ * updates the `value` prop.
1135
+ */
1136
+ return (h("div", { class: "datetime-footer" }, h("div", { class: "datetime-buttons" }, h("div", { class: {
1137
+ ['datetime-action-buttons']: true,
1138
+ ['has-clear-button']: this.showClearButton,
1139
+ } }, h("slot", { name: "buttons" }, h("ion-buttons", null, showDefaultButtons && (h("ion-button", { id: "cancel-button", color: this.color, onClick: () => this.cancel(true), disabled: isButtonDisabled }, this.cancelText)), h("div", { class: "datetime-action-buttons-container" }, showClearButton && (h("ion-button", { id: "clear-button", color: this.color, onClick: () => clearButtonClick(), disabled: isButtonDisabled }, this.clearText)), showDefaultButtons && (h("ion-button", { id: "confirm-button", color: this.color, onClick: () => this.confirm(true), disabled: isButtonDisabled }, this.doneText)))))))));
1235
1140
  }
1236
- const shouldRenderYears = forcePresentation !== 'month' && forcePresentation !== 'time';
1237
- const years = shouldRenderYears
1238
- ? getYearColumnData(this.locale, this.defaultParts, this.minParts, this.maxParts, this.parsedYearValues)
1239
- : [];
1240
1141
  /**
1241
- * Certain locales show the day before the month.
1142
+ * Wheel picker render methods
1242
1143
  */
1243
- const showMonthFirst = isMonthFirstLocale(this.locale, { month: 'numeric', day: 'numeric' });
1244
- let renderArray = [];
1245
- if (showMonthFirst) {
1246
- renderArray = [
1247
- this.renderMonthPickerColumn(months),
1248
- this.renderDayPickerColumn(days),
1249
- this.renderYearPickerColumn(years),
1250
- ];
1144
+ renderWheelPicker(forcePresentation = this.presentation) {
1145
+ /**
1146
+ * If presentation="time-date" we switch the
1147
+ * order of the render array here instead of
1148
+ * manually reordering each date/time picker
1149
+ * column with CSS. This allows for additional
1150
+ * flexibility if we need to render subsets
1151
+ * of the date/time data or do additional ordering
1152
+ * within the child render functions.
1153
+ */
1154
+ const renderArray = forcePresentation === 'time-date'
1155
+ ? [this.renderTimePickerColumns(forcePresentation), this.renderDatePickerColumns(forcePresentation)]
1156
+ : [this.renderDatePickerColumns(forcePresentation), this.renderTimePickerColumns(forcePresentation)];
1157
+ return h("ion-picker-internal", null, renderArray);
1251
1158
  }
1252
- else {
1253
- renderArray = [
1254
- this.renderDayPickerColumn(days),
1255
- this.renderMonthPickerColumn(months),
1256
- this.renderYearPickerColumn(years),
1257
- ];
1258
- }
1259
- return renderArray;
1260
- }
1261
- renderDayPickerColumn(days) {
1262
- var _a;
1263
- if (days.length === 0) {
1264
- return [];
1265
- }
1266
- const { workingParts } = this;
1267
- const activePart = this.getActivePartsWithFallback();
1268
- return (h("ion-picker-column-internal", { class: "day-column", color: this.color, items: days, value: (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined, onIonChange: (ev) => {
1269
- // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1270
- // Due to a Safari 14 issue we need to destroy
1271
- // the scroll listener before we update state
1272
- // and trigger a re-render.
1273
- if (this.destroyCalendarListener) {
1274
- this.destroyCalendarListener();
1275
- }
1276
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1277
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1278
- // We can re-attach the scroll listener after
1279
- // the working parts have been updated.
1280
- this.initializeCalendarListener();
1281
- ev.stopPropagation();
1282
- } }));
1283
- }
1284
- renderMonthPickerColumn(months) {
1285
- if (months.length === 0) {
1286
- return [];
1287
- }
1288
- const { workingParts } = this;
1289
- const activePart = this.getActivePartsWithFallback();
1290
- return (h("ion-picker-column-internal", { class: "month-column", color: this.color, items: months, value: workingParts.month, onIonChange: (ev) => {
1291
- // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1292
- // Due to a Safari 14 issue we need to destroy
1293
- // the scroll listener before we update state
1294
- // and trigger a re-render.
1295
- if (this.destroyCalendarListener) {
1296
- this.destroyCalendarListener();
1297
- }
1298
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1299
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1300
- // We can re-attach the scroll listener after
1301
- // the working parts have been updated.
1302
- this.initializeCalendarListener();
1303
- ev.stopPropagation();
1304
- } }));
1305
- }
1306
- renderYearPickerColumn(years) {
1307
- if (years.length === 0) {
1308
- return [];
1309
- }
1310
- const { workingParts } = this;
1311
- const activePart = this.getActivePartsWithFallback();
1312
- return (h("ion-picker-column-internal", { class: "year-column", color: this.color, items: years, value: workingParts.year, onIonChange: (ev) => {
1313
- // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1314
- // Due to a Safari 14 issue we need to destroy
1315
- // the scroll listener before we update state
1316
- // and trigger a re-render.
1317
- if (this.destroyCalendarListener) {
1318
- this.destroyCalendarListener();
1159
+ renderDatePickerColumns(forcePresentation) {
1160
+ return forcePresentation === 'date-time' || forcePresentation === 'time-date'
1161
+ ? this.renderCombinedDatePickerColumn()
1162
+ : this.renderIndividualDatePickerColumns(forcePresentation);
1163
+ }
1164
+ renderCombinedDatePickerColumn() {
1165
+ const { defaultParts, disabled, workingParts, locale, minParts, maxParts, todayParts, isDateEnabled } = this;
1166
+ const activePart = this.getActivePartsWithFallback();
1167
+ /**
1168
+ * By default, generate a range of 3 months:
1169
+ * Previous month, current month, and next month
1170
+ */
1171
+ const monthsToRender = generateMonths(workingParts);
1172
+ const lastMonth = monthsToRender[monthsToRender.length - 1];
1173
+ /**
1174
+ * Ensure that users can select the entire window of dates.
1175
+ */
1176
+ monthsToRender[0].day = 1;
1177
+ lastMonth.day = getNumDaysInMonth(lastMonth.month, lastMonth.year);
1178
+ /**
1179
+ * Narrow the dates rendered based on min/max dates (if any).
1180
+ * The `min` date is used if the min is after the generated min month.
1181
+ * The `max` date is used if the max is before the generated max month.
1182
+ * This ensures that the sliding window always stays at 3 months
1183
+ * but still allows future dates to be lazily rendered based on any min/max
1184
+ * constraints.
1185
+ */
1186
+ const min = minParts !== undefined && isAfter(minParts, monthsToRender[0]) ? minParts : monthsToRender[0];
1187
+ const max = maxParts !== undefined && isBefore(maxParts, lastMonth) ? maxParts : lastMonth;
1188
+ const result = getCombinedDateColumnData(locale, todayParts, min, max, this.parsedDayValues, this.parsedMonthValues);
1189
+ let items = result.items;
1190
+ const parts = result.parts;
1191
+ if (isDateEnabled) {
1192
+ items = items.map((itemObject, index) => {
1193
+ const referenceParts = parts[index];
1194
+ let disabled;
1195
+ try {
1196
+ /**
1197
+ * The `isDateEnabled` implementation is try-catch wrapped
1198
+ * to prevent exceptions in the user's function from
1199
+ * interrupting the calendar rendering.
1200
+ */
1201
+ disabled = !isDateEnabled(convertDataToISO(referenceParts));
1202
+ }
1203
+ catch (e) {
1204
+ printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1205
+ }
1206
+ return Object.assign(Object.assign({}, itemObject), { disabled });
1207
+ });
1319
1208
  }
1320
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1321
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1322
- // We can re-attach the scroll listener after
1323
- // the working parts have been updated.
1324
- this.initializeCalendarListener();
1325
- ev.stopPropagation();
1326
- } }));
1327
- }
1328
- renderTimePickerColumns(forcePresentation) {
1329
- if (['date', 'month', 'month-year', 'year'].includes(forcePresentation)) {
1330
- return [];
1209
+ /**
1210
+ * If we have selected a day already, then default the column
1211
+ * to that value. Otherwise, set it to the default date.
1212
+ */
1213
+ const todayString = workingParts.day !== null
1214
+ ? `${workingParts.year}-${workingParts.month}-${workingParts.day}`
1215
+ : `${defaultParts.year}-${defaultParts.month}-${defaultParts.day}`;
1216
+ return (h("ion-picker-column-internal", { class: "date-column", color: this.color, disabled: disabled, items: items, value: todayString, onIonChange: (ev) => {
1217
+ // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1218
+ // Due to a Safari 14 issue we need to destroy
1219
+ // the scroll listener before we update state
1220
+ // and trigger a re-render.
1221
+ if (this.destroyCalendarListener) {
1222
+ this.destroyCalendarListener();
1223
+ }
1224
+ const { value } = ev.detail;
1225
+ const findPart = parts.find(({ month, day, year }) => value === `${year}-${month}-${day}`);
1226
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), findPart));
1227
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), findPart));
1228
+ // We can re-attach the scroll listener after
1229
+ // the working parts have been updated.
1230
+ this.initializeCalendarListener();
1231
+ ev.stopPropagation();
1232
+ } }));
1331
1233
  }
1332
- /**
1333
- * If a user has not selected a date,
1334
- * then we should show all times. If the
1335
- * user has selected a date (even if it has
1336
- * not been confirmed yet), we should apply
1337
- * the max and min restrictions so that the
1338
- * time picker shows values that are
1339
- * appropriate for the selected date.
1340
- */
1341
- const activePart = this.getActivePart();
1342
- const userHasSelectedDate = activePart !== undefined;
1343
- const { hoursData, minutesData, dayPeriodData } = getTimeColumnsData(this.locale, this.workingParts, this.hourCycle, userHasSelectedDate ? this.minParts : undefined, userHasSelectedDate ? this.maxParts : undefined, this.parsedHourValues, this.parsedMinuteValues);
1344
- return [
1345
- this.renderHourPickerColumn(hoursData),
1346
- this.renderMinutePickerColumn(minutesData),
1347
- this.renderDayPeriodPickerColumn(dayPeriodData),
1348
- ];
1349
- }
1350
- renderHourPickerColumn(hoursData) {
1351
- const { workingParts } = this;
1352
- if (hoursData.length === 0)
1353
- return [];
1354
- const activePart = this.getActivePartsWithFallback();
1355
- return (h("ion-picker-column-internal", { color: this.color, value: activePart.hour, items: hoursData, numericInput: true, onIonChange: (ev) => {
1356
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1357
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { hour: ev.detail.value }));
1358
- ev.stopPropagation();
1359
- } }));
1360
- }
1361
- renderMinutePickerColumn(minutesData) {
1362
- const { workingParts } = this;
1363
- if (minutesData.length === 0)
1364
- return [];
1365
- const activePart = this.getActivePartsWithFallback();
1366
- return (h("ion-picker-column-internal", { color: this.color, value: activePart.minute, items: minutesData, numericInput: true, onIonChange: (ev) => {
1367
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1368
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { minute: ev.detail.value }));
1369
- ev.stopPropagation();
1370
- } }));
1371
- }
1372
- renderDayPeriodPickerColumn(dayPeriodData) {
1373
- const { workingParts } = this;
1374
- if (dayPeriodData.length === 0) {
1375
- return [];
1376
- }
1377
- const activePart = this.getActivePartsWithFallback();
1378
- const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1379
- return (h("ion-picker-column-internal", { style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, value: activePart.ampm, items: dayPeriodData, onIonChange: (ev) => {
1380
- const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1381
- this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1382
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { ampm: ev.detail.value, hour }));
1383
- ev.stopPropagation();
1384
- } }));
1385
- }
1386
- renderWheelView(forcePresentation) {
1387
- const { locale } = this;
1388
- const showMonthFirst = isMonthFirstLocale(locale);
1389
- const columnOrder = showMonthFirst ? 'month-first' : 'year-first';
1390
- return (h("div", { class: {
1391
- [`wheel-order-${columnOrder}`]: true,
1392
- } }, this.renderWheelPicker(forcePresentation)));
1393
- }
1394
- /**
1395
- * Grid Render Methods
1396
- */
1397
- renderCalendarHeader(mode) {
1398
- const { disabled } = this;
1399
- const expandedIcon = mode === 'ios' ? chevronDown : caretUpSharp;
1400
- const collapsedIcon = mode === 'ios' ? chevronForward : caretDownSharp;
1401
- const prevMonthDisabled = disabled || isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1402
- const nextMonthDisabled = disabled || isNextMonthDisabled(this.workingParts, this.maxParts);
1403
- // don't use the inheritAttributes util because it removes dir from the host, and we still need that
1404
- const hostDir = this.el.getAttribute('dir') || undefined;
1405
- return (h("div", { class: "calendar-header" }, h("div", { class: "calendar-action-buttons" }, h("div", { class: "calendar-month-year" }, h("ion-item", { part: "month-year-button", ref: (el) => (this.monthYearToggleItemRef = el), button: true, "aria-label": "Show year picker", detail: false, lines: "none", disabled: disabled, onClick: () => {
1406
- var _a;
1407
- this.toggleMonthAndYearView();
1234
+ renderIndividualDatePickerColumns(forcePresentation) {
1235
+ const { workingParts, isDateEnabled } = this;
1236
+ const shouldRenderMonths = forcePresentation !== 'year' && forcePresentation !== 'time';
1237
+ const months = shouldRenderMonths
1238
+ ? getMonthColumnData(this.locale, workingParts, this.minParts, this.maxParts, this.parsedMonthValues)
1239
+ : [];
1240
+ const shouldRenderDays = forcePresentation === 'date';
1241
+ let days = shouldRenderDays
1242
+ ? getDayColumnData(this.locale, workingParts, this.minParts, this.maxParts, this.parsedDayValues)
1243
+ : [];
1244
+ if (isDateEnabled) {
1245
+ days = days.map((dayObject) => {
1246
+ const { value } = dayObject;
1247
+ const valueNum = typeof value === 'string' ? parseInt(value) : value;
1248
+ const referenceParts = {
1249
+ month: workingParts.month,
1250
+ day: valueNum,
1251
+ year: workingParts.year,
1252
+ };
1253
+ let disabled;
1254
+ try {
1255
+ /**
1256
+ * The `isDateEnabled` implementation is try-catch wrapped
1257
+ * to prevent exceptions in the user's function from
1258
+ * interrupting the calendar rendering.
1259
+ */
1260
+ disabled = !isDateEnabled(convertDataToISO(referenceParts));
1261
+ }
1262
+ catch (e) {
1263
+ printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', e);
1264
+ }
1265
+ return Object.assign(Object.assign({}, dayObject), { disabled });
1266
+ });
1267
+ }
1268
+ const shouldRenderYears = forcePresentation !== 'month' && forcePresentation !== 'time';
1269
+ const years = shouldRenderYears
1270
+ ? getYearColumnData(this.locale, this.defaultParts, this.minParts, this.maxParts, this.parsedYearValues)
1271
+ : [];
1408
1272
  /**
1409
- * TODO: FW-3547
1410
- *
1411
- * Currently there is not a way to set the aria-label on the inner button
1412
- * on the `ion-item` and have it be reactive to changes. This is a workaround
1413
- * until we either refactor `ion-item` to a button or Stencil adds a way to
1414
- * have reactive props for built-in properties, such as `aria-label`.
1273
+ * Certain locales show the day before the month.
1415
1274
  */
1416
- const { monthYearToggleItemRef } = this;
1417
- if (monthYearToggleItemRef) {
1418
- const btn = (_a = monthYearToggleItemRef.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.item-native');
1419
- if (btn) {
1420
- const monthYearAriaLabel = this.showMonthAndYear ? 'Hide year picker' : 'Show year picker';
1421
- btn.setAttribute('aria-label', monthYearAriaLabel);
1422
- }
1275
+ const showMonthFirst = isMonthFirstLocale(this.locale, { month: 'numeric', day: 'numeric' });
1276
+ let renderArray = [];
1277
+ if (showMonthFirst) {
1278
+ renderArray = [
1279
+ this.renderMonthPickerColumn(months),
1280
+ this.renderDayPickerColumn(days),
1281
+ this.renderYearPickerColumn(years),
1282
+ ];
1423
1283
  }
1424
- } }, h("ion-label", null, getMonthAndYear(this.locale, this.workingParts), h("ion-icon", { "aria-hidden": "true", icon: this.showMonthAndYear ? expandedIcon : collapsedIcon, lazy: false, flipRtl: true })))), h("div", { class: "calendar-next-prev" }, h("ion-buttons", null, h("ion-button", { "aria-label": "Previous month", disabled: prevMonthDisabled, onClick: () => this.prevMonth() }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: chevronBack, lazy: false, flipRtl: true })), h("ion-button", { "aria-label": "Next month", disabled: nextMonthDisabled, onClick: () => this.nextMonth() }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: chevronForward, lazy: false, flipRtl: true }))))), h("div", { class: "calendar-days-of-week", "aria-hidden": "true" }, getDaysOfWeek(this.locale, mode, this.firstDayOfWeek % 7).map((d) => {
1425
- return h("div", { class: "day-of-week" }, d);
1426
- }))));
1427
- }
1428
- renderMonth(month, year) {
1429
- const { disabled, readonly } = this;
1430
- const yearAllowed = this.parsedYearValues === undefined || this.parsedYearValues.includes(year);
1431
- const monthAllowed = this.parsedMonthValues === undefined || this.parsedMonthValues.includes(month);
1432
- const isCalMonthDisabled = !yearAllowed || !monthAllowed;
1433
- const isDatetimeDisabled = disabled || readonly;
1434
- const swipeDisabled = disabled ||
1435
- isMonthDisabled({
1436
- month,
1437
- year,
1438
- day: null,
1439
- }, {
1440
- // The day is not used when checking if a month is disabled.
1441
- // Users should be able to access the min or max month, even if the
1442
- // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1443
- minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1444
- maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1445
- });
1446
- // The working month should never have swipe disabled.
1447
- // Otherwise the CSS scroll snap will not work and the user
1448
- // can free-scroll the calendar.
1449
- const isWorkingMonth = this.workingParts.month === month && this.workingParts.year === year;
1450
- const activePart = this.getActivePartsWithFallback();
1451
- return (h("div", { "aria-hidden": !isWorkingMonth ? 'true' : null, class: {
1452
- 'calendar-month': true,
1453
- // Prevents scroll snap swipe gestures for months outside of the min/max bounds
1454
- 'calendar-month-disabled': !isWorkingMonth && swipeDisabled,
1455
- } }, h("div", { class: "calendar-month-grid" }, getDaysOfMonth(month, year, this.firstDayOfWeek % 7).map((dateObject, index) => {
1456
- const { day, dayOfWeek } = dateObject;
1457
- const { el, highlightedDates, isDateEnabled, multiple } = this;
1458
- const referenceParts = { month, day, year };
1459
- const isCalendarPadding = day === null;
1460
- const { isActive, isToday, ariaLabel, ariaSelected, disabled: isDayDisabled, text, } = getCalendarDayState(this.locale, referenceParts, this.activeParts, this.todayParts, this.minParts, this.maxParts, this.parsedDayValues);
1461
- const dateIsoString = convertDataToISO(referenceParts);
1462
- let isCalDayDisabled = isCalMonthDisabled || isDayDisabled;
1463
- if (!isCalDayDisabled && isDateEnabled !== undefined) {
1464
- try {
1465
- /**
1466
- * The `isDateEnabled` implementation is try-catch wrapped
1467
- * to prevent exceptions in the user's function from
1468
- * interrupting the calendar rendering.
1469
- */
1470
- isCalDayDisabled = !isDateEnabled(dateIsoString);
1284
+ else {
1285
+ renderArray = [
1286
+ this.renderDayPickerColumn(days),
1287
+ this.renderMonthPickerColumn(months),
1288
+ this.renderYearPickerColumn(years),
1289
+ ];
1471
1290
  }
1472
- catch (e) {
1473
- printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', el, e);
1291
+ return renderArray;
1292
+ }
1293
+ renderDayPickerColumn(days) {
1294
+ var _a;
1295
+ if (days.length === 0) {
1296
+ return [];
1474
1297
  }
1475
- }
1476
- /**
1477
- * Some days are constrained through max & min or allowed dates
1478
- * and also disabled because the component is readonly or disabled.
1479
- * These need to be displayed differently.
1480
- */
1481
- const isCalDayConstrained = isCalDayDisabled && isDatetimeDisabled;
1482
- const isButtonDisabled = isCalDayDisabled || isDatetimeDisabled;
1483
- let dateStyle = undefined;
1484
- /**
1485
- * Custom highlight styles should not override the style for selected dates,
1486
- * nor apply to "filler days" at the start of the grid.
1487
- */
1488
- if (highlightedDates !== undefined && !isActive && day !== null) {
1489
- dateStyle = getHighlightStyles(highlightedDates, dateIsoString, el);
1490
- }
1491
- let dateParts = undefined;
1492
- // "Filler days" at the beginning of the grid should not get the calendar day
1493
- // CSS parts added to them
1494
- if (!isCalendarPadding) {
1495
- dateParts = `calendar-day${isActive ? ' active' : ''}${isToday ? ' today' : ''}${isCalDayDisabled ? ' disabled' : ''}`;
1496
- }
1497
- return (h("div", { class: "calendar-day-wrapper" }, h("button", {
1498
- // We need to use !important for the inline styles here because
1499
- // otherwise the CSS shadow parts will override these styles.
1500
- // See https://github.com/WICG/webcomponents/issues/847
1501
- // Both the CSS shadow parts and highlightedDates styles are
1502
- // provided by the developer, but highlightedDates styles should
1503
- // always take priority.
1504
- ref: (el) => {
1505
- if (el) {
1506
- el.style.setProperty('color', `${dateStyle ? dateStyle.textColor : ''}`, 'important');
1507
- el.style.setProperty('background-color', `${dateStyle ? dateStyle.backgroundColor : ''}`, 'important');
1508
- }
1509
- }, tabindex: "-1", "data-day": day, "data-month": month, "data-year": year, "data-index": index, "data-day-of-week": dayOfWeek, disabled: isButtonDisabled, class: {
1510
- 'calendar-day-padding': isCalendarPadding,
1511
- 'calendar-day': true,
1512
- 'calendar-day-active': isActive,
1513
- 'calendar-day-constrained': isCalDayConstrained,
1514
- 'calendar-day-today': isToday,
1515
- }, part: dateParts, "aria-hidden": isCalendarPadding ? 'true' : null, "aria-selected": ariaSelected, "aria-label": ariaLabel, onClick: () => {
1516
- if (isCalendarPadding) {
1517
- return;
1518
- }
1519
- this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month,
1520
- day,
1521
- year }));
1522
- // multiple only needs date info, so we can wipe out other fields like time
1523
- if (multiple) {
1524
- this.setActiveParts({
1525
- month,
1526
- day,
1527
- year,
1528
- }, isActive);
1529
- }
1530
- else {
1531
- this.setActiveParts(Object.assign(Object.assign({}, activePart), { month,
1532
- day,
1533
- year }));
1534
- }
1298
+ const { disabled, workingParts } = this;
1299
+ const activePart = this.getActivePartsWithFallback();
1300
+ return (h("ion-picker-column-internal", { class: "day-column", color: this.color, disabled: disabled, items: days, value: (_a = (workingParts.day !== null ? workingParts.day : this.defaultParts.day)) !== null && _a !== void 0 ? _a : undefined, onIonChange: (ev) => {
1301
+ // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1302
+ // Due to a Safari 14 issue we need to destroy
1303
+ // the scroll listener before we update state
1304
+ // and trigger a re-render.
1305
+ if (this.destroyCalendarListener) {
1306
+ this.destroyCalendarListener();
1307
+ }
1308
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { day: ev.detail.value }));
1309
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { day: ev.detail.value }));
1310
+ // We can re-attach the scroll listener after
1311
+ // the working parts have been updated.
1312
+ this.initializeCalendarListener();
1313
+ ev.stopPropagation();
1314
+ } }));
1315
+ }
1316
+ renderMonthPickerColumn(months) {
1317
+ if (months.length === 0) {
1318
+ return [];
1535
1319
  }
1536
- }, text)));
1537
- }))));
1538
- }
1539
- renderCalendarBody() {
1540
- return (h("div", { class: "calendar-body ion-focusable", ref: (el) => (this.calendarBodyRef = el), tabindex: "0" }, generateMonths(this.workingParts, this.forceRenderDate).map(({ month, year }) => {
1541
- return this.renderMonth(month, year);
1542
- })));
1543
- }
1544
- renderCalendar(mode) {
1545
- return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(mode), this.renderCalendarBody()));
1546
- }
1547
- renderTimeLabel() {
1548
- const hasSlottedTimeLabel = this.el.querySelector('[slot="time-label"]') !== null;
1549
- if (!hasSlottedTimeLabel && !this.showDefaultTimeLabel) {
1550
- return;
1551
- }
1552
- return h("slot", { name: "time-label" }, "Time");
1553
- }
1554
- renderTimeOverlay() {
1555
- const { disabled, hourCycle, isTimePopoverOpen, locale } = this;
1556
- const computedHourCycle = getHourCycle(locale, hourCycle);
1557
- const activePart = this.getActivePartsWithFallback();
1558
- return [
1559
- h("div", { class: "time-header" }, this.renderTimeLabel()),
1560
- h("button", { class: {
1561
- 'time-body': true,
1562
- 'time-body-active': isTimePopoverOpen,
1563
- }, part: `time-button${isTimePopoverOpen ? ' active' : ''}`, "aria-expanded": "false", "aria-haspopup": "true", disabled: disabled, onClick: async (ev) => {
1564
- const { popoverRef } = this;
1565
- if (popoverRef) {
1566
- this.isTimePopoverOpen = true;
1567
- popoverRef.present(new CustomEvent('ionShadowTarget', {
1568
- detail: {
1569
- ionShadowTarget: ev.target,
1570
- },
1571
- }));
1572
- await popoverRef.onWillDismiss();
1573
- this.isTimePopoverOpen = false;
1574
- }
1575
- } }, getLocalizedTime(locale, activePart, computedHourCycle)),
1576
- h("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
1577
- /**
1578
- * Intersection Observers do not consistently fire between Blink and Webkit
1579
- * when toggling the visibility of the popover and trying to scroll the picker
1580
- * column to the correct time value.
1581
- *
1582
- * This will correctly scroll the element position to the correct time value,
1583
- * before the popover is fully presented.
1584
- */
1585
- const cols = ev.target.querySelectorAll('ion-picker-column-internal');
1586
- // TODO (FW-615): Potentially remove this when intersection observers are fixed in picker column
1587
- cols.forEach((col) => col.scrollActiveItemIntoView());
1588
- }, style: {
1589
- '--offset-y': '-10px',
1590
- '--min-width': 'fit-content',
1591
- },
1592
- // Allow native browser keyboard events to support up/down/home/end key
1593
- // navigation within the time picker.
1594
- keyboardEvents: true, ref: (el) => (this.popoverRef = el) }, this.renderWheelPicker('time')),
1595
- ];
1596
- }
1597
- getHeaderSelectedDateText() {
1598
- const { activeParts, multiple, titleSelectedDatesFormatter } = this;
1599
- const isArray = Array.isArray(activeParts);
1600
- let headerText;
1601
- if (multiple && isArray && activeParts.length !== 1) {
1602
- headerText = `${activeParts.length} days`; // default/fallback for multiple selection
1603
- if (titleSelectedDatesFormatter !== undefined) {
1604
- try {
1605
- headerText = titleSelectedDatesFormatter(convertDataToISO(activeParts));
1320
+ const { disabled, workingParts } = this;
1321
+ const activePart = this.getActivePartsWithFallback();
1322
+ return (h("ion-picker-column-internal", { class: "month-column", color: this.color, disabled: disabled, items: months, value: workingParts.month, onIonChange: (ev) => {
1323
+ // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1324
+ // Due to a Safari 14 issue we need to destroy
1325
+ // the scroll listener before we update state
1326
+ // and trigger a re-render.
1327
+ if (this.destroyCalendarListener) {
1328
+ this.destroyCalendarListener();
1329
+ }
1330
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { month: ev.detail.value }));
1331
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { month: ev.detail.value }));
1332
+ // We can re-attach the scroll listener after
1333
+ // the working parts have been updated.
1334
+ this.initializeCalendarListener();
1335
+ ev.stopPropagation();
1336
+ } }));
1337
+ }
1338
+ renderYearPickerColumn(years) {
1339
+ if (years.length === 0) {
1340
+ return [];
1606
1341
  }
1607
- catch (e) {
1608
- printIonError('Exception in provided `titleSelectedDatesFormatter`: ', e);
1342
+ const { disabled, workingParts } = this;
1343
+ const activePart = this.getActivePartsWithFallback();
1344
+ return (h("ion-picker-column-internal", { class: "year-column", color: this.color, disabled: disabled, items: years, value: workingParts.year, onIonChange: (ev) => {
1345
+ // TODO(FW-1823) Remove this when iOS 14 support is dropped.
1346
+ // Due to a Safari 14 issue we need to destroy
1347
+ // the scroll listener before we update state
1348
+ // and trigger a re-render.
1349
+ if (this.destroyCalendarListener) {
1350
+ this.destroyCalendarListener();
1351
+ }
1352
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { year: ev.detail.value }));
1353
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { year: ev.detail.value }));
1354
+ // We can re-attach the scroll listener after
1355
+ // the working parts have been updated.
1356
+ this.initializeCalendarListener();
1357
+ ev.stopPropagation();
1358
+ } }));
1359
+ }
1360
+ renderTimePickerColumns(forcePresentation) {
1361
+ if (['date', 'month', 'month-year', 'year'].includes(forcePresentation)) {
1362
+ return [];
1609
1363
  }
1610
- }
1364
+ /**
1365
+ * If a user has not selected a date,
1366
+ * then we should show all times. If the
1367
+ * user has selected a date (even if it has
1368
+ * not been confirmed yet), we should apply
1369
+ * the max and min restrictions so that the
1370
+ * time picker shows values that are
1371
+ * appropriate for the selected date.
1372
+ */
1373
+ const activePart = this.getActivePart();
1374
+ const userHasSelectedDate = activePart !== undefined;
1375
+ const { hoursData, minutesData, dayPeriodData } = getTimeColumnsData(this.locale, this.workingParts, this.hourCycle, userHasSelectedDate ? this.minParts : undefined, userHasSelectedDate ? this.maxParts : undefined, this.parsedHourValues, this.parsedMinuteValues);
1376
+ return [
1377
+ this.renderHourPickerColumn(hoursData),
1378
+ this.renderMinutePickerColumn(minutesData),
1379
+ this.renderDayPeriodPickerColumn(dayPeriodData),
1380
+ ];
1381
+ }
1382
+ renderHourPickerColumn(hoursData) {
1383
+ const { disabled, workingParts } = this;
1384
+ if (hoursData.length === 0)
1385
+ return [];
1386
+ const activePart = this.getActivePartsWithFallback();
1387
+ return (h("ion-picker-column-internal", { color: this.color, disabled: disabled, value: activePart.hour, items: hoursData, numericInput: true, onIonChange: (ev) => {
1388
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { hour: ev.detail.value }));
1389
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { hour: ev.detail.value }));
1390
+ ev.stopPropagation();
1391
+ } }));
1392
+ }
1393
+ renderMinutePickerColumn(minutesData) {
1394
+ const { disabled, workingParts } = this;
1395
+ if (minutesData.length === 0)
1396
+ return [];
1397
+ const activePart = this.getActivePartsWithFallback();
1398
+ return (h("ion-picker-column-internal", { color: this.color, disabled: disabled, value: activePart.minute, items: minutesData, numericInput: true, onIonChange: (ev) => {
1399
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { minute: ev.detail.value }));
1400
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { minute: ev.detail.value }));
1401
+ ev.stopPropagation();
1402
+ } }));
1403
+ }
1404
+ renderDayPeriodPickerColumn(dayPeriodData) {
1405
+ const { disabled, workingParts } = this;
1406
+ if (dayPeriodData.length === 0) {
1407
+ return [];
1408
+ }
1409
+ const activePart = this.getActivePartsWithFallback();
1410
+ const isDayPeriodRTL = isLocaleDayPeriodRTL(this.locale);
1411
+ return (h("ion-picker-column-internal", { style: isDayPeriodRTL ? { order: '-1' } : {}, color: this.color, disabled: disabled, value: activePart.ampm, items: dayPeriodData, onIonChange: (ev) => {
1412
+ const hour = calculateHourFromAMPM(workingParts, ev.detail.value);
1413
+ this.setWorkingParts(Object.assign(Object.assign({}, workingParts), { ampm: ev.detail.value, hour }));
1414
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { ampm: ev.detail.value, hour }));
1415
+ ev.stopPropagation();
1416
+ } }));
1417
+ }
1418
+ renderWheelView(forcePresentation) {
1419
+ const { locale } = this;
1420
+ const showMonthFirst = isMonthFirstLocale(locale);
1421
+ const columnOrder = showMonthFirst ? 'month-first' : 'year-first';
1422
+ return (h("div", { class: {
1423
+ [`wheel-order-${columnOrder}`]: true,
1424
+ } }, this.renderWheelPicker(forcePresentation)));
1611
1425
  }
1612
- else {
1613
- // for exactly 1 day selected (multiple set or not), show a formatted version of that
1614
- headerText = getMonthAndDay(this.locale, this.getActivePartsWithFallback());
1615
- }
1616
- return headerText;
1617
- }
1618
- renderHeader(showExpandedHeader = true) {
1619
- const hasSlottedTitle = this.el.querySelector('[slot="title"]') !== null;
1620
- if (!hasSlottedTitle && !this.showDefaultTitle) {
1621
- return;
1622
- }
1623
- return (h("div", { class: "datetime-header" }, h("div", { class: "datetime-title" }, h("slot", { name: "title" }, "Select Date")), showExpandedHeader && h("div", { class: "datetime-selected-date" }, this.getHeaderSelectedDateText())));
1624
- }
1625
- /**
1626
- * Render time picker inside of datetime.
1627
- * Do not pass color prop to segment on
1628
- * iOS mode. MD segment has been customized and
1629
- * should take on the color prop, but iOS
1630
- * should just be the default segment.
1631
- */
1632
- renderTime() {
1633
- const { presentation } = this;
1634
- const timeOnlyPresentation = presentation === 'time';
1635
- return (h("div", { class: "datetime-time" }, timeOnlyPresentation ? this.renderWheelPicker() : this.renderTimeOverlay()));
1636
- }
1637
- /**
1638
- * Renders the month/year picker that is
1639
- * displayed on the calendar grid.
1640
- * The .datetime-year class has additional
1641
- * styles that let us show/hide the
1642
- * picker when the user clicks on the
1643
- * toggle in the calendar header.
1644
- */
1645
- renderCalendarViewMonthYearPicker() {
1646
- return h("div", { class: "datetime-year" }, this.renderWheelView('month-year'));
1647
- }
1648
- /**
1649
- * Render entry point
1650
- * All presentation types are rendered from here.
1651
- */
1652
- renderDatetime(mode) {
1653
- const { presentation, preferWheel } = this;
1654
1426
  /**
1655
- * Certain presentation types have separate grid and wheel displays.
1656
- * If preferWheel is true then we should show a wheel picker instead.
1427
+ * Grid Render Methods
1657
1428
  */
1658
- const hasWheelVariant = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1659
- if (preferWheel && hasWheelVariant) {
1660
- return [this.renderHeader(false), this.renderWheelView(), this.renderFooter()];
1429
+ renderCalendarHeader(mode) {
1430
+ const { disabled } = this;
1431
+ const expandedIcon = mode === 'ios' ? chevronDown : caretUpSharp;
1432
+ const collapsedIcon = mode === 'ios' ? chevronForward : caretDownSharp;
1433
+ const prevMonthDisabled = disabled || isPrevMonthDisabled(this.workingParts, this.minParts, this.maxParts);
1434
+ const nextMonthDisabled = disabled || isNextMonthDisabled(this.workingParts, this.maxParts);
1435
+ // don't use the inheritAttributes util because it removes dir from the host, and we still need that
1436
+ const hostDir = this.el.getAttribute('dir') || undefined;
1437
+ return (h("div", { class: "calendar-header" }, h("div", { class: "calendar-action-buttons" }, h("div", { class: "calendar-month-year" }, h("ion-item", { part: "month-year-button", ref: (el) => (this.monthYearToggleItemRef = el), button: true, "aria-label": "Show year picker", detail: false, lines: "none", disabled: disabled, onClick: () => {
1438
+ var _a;
1439
+ this.toggleMonthAndYearView();
1440
+ /**
1441
+ * TODO: FW-3547
1442
+ *
1443
+ * Currently there is not a way to set the aria-label on the inner button
1444
+ * on the `ion-item` and have it be reactive to changes. This is a workaround
1445
+ * until we either refactor `ion-item` to a button or Stencil adds a way to
1446
+ * have reactive props for built-in properties, such as `aria-label`.
1447
+ */
1448
+ const { monthYearToggleItemRef } = this;
1449
+ if (monthYearToggleItemRef) {
1450
+ const btn = (_a = monthYearToggleItemRef.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.item-native');
1451
+ if (btn) {
1452
+ const monthYearAriaLabel = this.showMonthAndYear ? 'Hide year picker' : 'Show year picker';
1453
+ btn.setAttribute('aria-label', monthYearAriaLabel);
1454
+ }
1455
+ }
1456
+ } }, h("ion-label", null, getMonthAndYear(this.locale, this.workingParts), h("ion-icon", { "aria-hidden": "true", icon: this.showMonthAndYear ? expandedIcon : collapsedIcon, lazy: false, flipRtl: true })))), h("div", { class: "calendar-next-prev" }, h("ion-buttons", null, h("ion-button", { "aria-label": "Previous month", disabled: prevMonthDisabled, onClick: () => this.prevMonth() }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: chevronBack, lazy: false, flipRtl: true })), h("ion-button", { "aria-label": "Next month", disabled: nextMonthDisabled, onClick: () => this.nextMonth() }, h("ion-icon", { dir: hostDir, "aria-hidden": "true", slot: "icon-only", icon: chevronForward, lazy: false, flipRtl: true }))))), h("div", { class: "calendar-days-of-week", "aria-hidden": "true" }, getDaysOfWeek(this.locale, mode, this.firstDayOfWeek % 7).map((d) => {
1457
+ return h("div", { class: "day-of-week" }, d);
1458
+ }))));
1661
1459
  }
1662
- switch (presentation) {
1663
- case 'date-time':
1664
- return [
1665
- this.renderHeader(),
1666
- this.renderCalendar(mode),
1667
- this.renderCalendarViewMonthYearPicker(),
1668
- this.renderTime(),
1669
- this.renderFooter(),
1670
- ];
1671
- case 'time-date':
1672
- return [
1673
- this.renderHeader(),
1674
- this.renderTime(),
1675
- this.renderCalendar(mode),
1676
- this.renderCalendarViewMonthYearPicker(),
1677
- this.renderFooter(),
1678
- ];
1679
- case 'time':
1680
- return [this.renderHeader(false), this.renderTime(), this.renderFooter()];
1681
- case 'month':
1682
- case 'month-year':
1683
- case 'year':
1684
- return [this.renderHeader(false), this.renderWheelView(), this.renderFooter()];
1685
- default:
1460
+ renderMonth(month, year) {
1461
+ const { disabled, readonly } = this;
1462
+ const yearAllowed = this.parsedYearValues === undefined || this.parsedYearValues.includes(year);
1463
+ const monthAllowed = this.parsedMonthValues === undefined || this.parsedMonthValues.includes(month);
1464
+ const isCalMonthDisabled = !yearAllowed || !monthAllowed;
1465
+ const isDatetimeDisabled = disabled || readonly;
1466
+ const swipeDisabled = disabled ||
1467
+ isMonthDisabled({
1468
+ month,
1469
+ year,
1470
+ day: null,
1471
+ }, {
1472
+ // The day is not used when checking if a month is disabled.
1473
+ // Users should be able to access the min or max month, even if the
1474
+ // min/max date is out of bounds (e.g. min is set to Feb 15, Feb should not be disabled).
1475
+ minParts: Object.assign(Object.assign({}, this.minParts), { day: null }),
1476
+ maxParts: Object.assign(Object.assign({}, this.maxParts), { day: null }),
1477
+ });
1478
+ // The working month should never have swipe disabled.
1479
+ // Otherwise the CSS scroll snap will not work and the user
1480
+ // can free-scroll the calendar.
1481
+ const isWorkingMonth = this.workingParts.month === month && this.workingParts.year === year;
1482
+ const activePart = this.getActivePartsWithFallback();
1483
+ return (h("div", { "aria-hidden": !isWorkingMonth ? 'true' : null, class: {
1484
+ 'calendar-month': true,
1485
+ // Prevents scroll snap swipe gestures for months outside of the min/max bounds
1486
+ 'calendar-month-disabled': !isWorkingMonth && swipeDisabled,
1487
+ } }, h("div", { class: "calendar-month-grid" }, getDaysOfMonth(month, year, this.firstDayOfWeek % 7).map((dateObject, index) => {
1488
+ const { day, dayOfWeek } = dateObject;
1489
+ const { el, highlightedDates, isDateEnabled, multiple } = this;
1490
+ const referenceParts = { month, day, year };
1491
+ const isCalendarPadding = day === null;
1492
+ const { isActive, isToday, ariaLabel, ariaSelected, disabled: isDayDisabled, text, } = getCalendarDayState(this.locale, referenceParts, this.activeParts, this.todayParts, this.minParts, this.maxParts, this.parsedDayValues);
1493
+ const dateIsoString = convertDataToISO(referenceParts);
1494
+ let isCalDayDisabled = isCalMonthDisabled || isDayDisabled;
1495
+ if (!isCalDayDisabled && isDateEnabled !== undefined) {
1496
+ try {
1497
+ /**
1498
+ * The `isDateEnabled` implementation is try-catch wrapped
1499
+ * to prevent exceptions in the user's function from
1500
+ * interrupting the calendar rendering.
1501
+ */
1502
+ isCalDayDisabled = !isDateEnabled(dateIsoString);
1503
+ }
1504
+ catch (e) {
1505
+ printIonError('Exception thrown from provided `isDateEnabled` function. Please check your function and try again.', el, e);
1506
+ }
1507
+ }
1508
+ /**
1509
+ * Some days are constrained through max & min or allowed dates
1510
+ * and also disabled because the component is readonly or disabled.
1511
+ * These need to be displayed differently.
1512
+ */
1513
+ const isCalDayConstrained = isCalDayDisabled && isDatetimeDisabled;
1514
+ const isButtonDisabled = isCalDayDisabled || isDatetimeDisabled;
1515
+ let dateStyle = undefined;
1516
+ /**
1517
+ * Custom highlight styles should not override the style for selected dates,
1518
+ * nor apply to "filler days" at the start of the grid.
1519
+ */
1520
+ if (highlightedDates !== undefined && !isActive && day !== null) {
1521
+ dateStyle = getHighlightStyles(highlightedDates, dateIsoString, el);
1522
+ }
1523
+ let dateParts = undefined;
1524
+ // "Filler days" at the beginning of the grid should not get the calendar day
1525
+ // CSS parts added to them
1526
+ if (!isCalendarPadding) {
1527
+ dateParts = `calendar-day${isActive ? ' active' : ''}${isToday ? ' today' : ''}${isCalDayDisabled ? ' disabled' : ''}`;
1528
+ }
1529
+ return (h("div", { class: "calendar-day-wrapper" }, h("button", {
1530
+ // We need to use !important for the inline styles here because
1531
+ // otherwise the CSS shadow parts will override these styles.
1532
+ // See https://github.com/WICG/webcomponents/issues/847
1533
+ // Both the CSS shadow parts and highlightedDates styles are
1534
+ // provided by the developer, but highlightedDates styles should
1535
+ // always take priority.
1536
+ ref: (el) => {
1537
+ if (el) {
1538
+ el.style.setProperty('color', `${dateStyle ? dateStyle.textColor : ''}`, 'important');
1539
+ el.style.setProperty('background-color', `${dateStyle ? dateStyle.backgroundColor : ''}`, 'important');
1540
+ }
1541
+ }, tabindex: "-1", "data-day": day, "data-month": month, "data-year": year, "data-index": index, "data-day-of-week": dayOfWeek, disabled: isButtonDisabled, class: {
1542
+ 'calendar-day-padding': isCalendarPadding,
1543
+ 'calendar-day': true,
1544
+ 'calendar-day-active': isActive,
1545
+ 'calendar-day-constrained': isCalDayConstrained,
1546
+ 'calendar-day-today': isToday,
1547
+ }, part: dateParts, "aria-hidden": isCalendarPadding ? 'true' : null, "aria-selected": ariaSelected, "aria-label": ariaLabel, onClick: () => {
1548
+ if (isCalendarPadding) {
1549
+ return;
1550
+ }
1551
+ this.setWorkingParts(Object.assign(Object.assign({}, this.workingParts), { month,
1552
+ day,
1553
+ year }));
1554
+ // multiple only needs date info, so we can wipe out other fields like time
1555
+ if (multiple) {
1556
+ this.setActiveParts({
1557
+ month,
1558
+ day,
1559
+ year,
1560
+ }, isActive);
1561
+ }
1562
+ else {
1563
+ this.setActiveParts(Object.assign(Object.assign({}, activePart), { month,
1564
+ day,
1565
+ year }));
1566
+ }
1567
+ }
1568
+ }, text)));
1569
+ }))));
1570
+ }
1571
+ renderCalendarBody() {
1572
+ return (h("div", { class: "calendar-body ion-focusable", ref: (el) => (this.calendarBodyRef = el), tabindex: "0" }, generateMonths(this.workingParts, this.forceRenderDate).map(({ month, year }) => {
1573
+ return this.renderMonth(month, year);
1574
+ })));
1575
+ }
1576
+ renderCalendar(mode) {
1577
+ return (h("div", { class: "datetime-calendar", key: "datetime-calendar" }, this.renderCalendarHeader(mode), this.renderCalendarBody()));
1578
+ }
1579
+ renderTimeLabel() {
1580
+ const hasSlottedTimeLabel = this.el.querySelector('[slot="time-label"]') !== null;
1581
+ if (!hasSlottedTimeLabel && !this.showDefaultTimeLabel) {
1582
+ return;
1583
+ }
1584
+ return h("slot", { name: "time-label" }, "Time");
1585
+ }
1586
+ renderTimeOverlay() {
1587
+ const { disabled, hourCycle, isTimePopoverOpen, locale } = this;
1588
+ const computedHourCycle = getHourCycle(locale, hourCycle);
1589
+ const activePart = this.getActivePartsWithFallback();
1686
1590
  return [
1687
- this.renderHeader(),
1688
- this.renderCalendar(mode),
1689
- this.renderCalendarViewMonthYearPicker(),
1690
- this.renderFooter(),
1591
+ h("div", { class: "time-header" }, this.renderTimeLabel()),
1592
+ h("button", { class: {
1593
+ 'time-body': true,
1594
+ 'time-body-active': isTimePopoverOpen,
1595
+ }, part: `time-button${isTimePopoverOpen ? ' active' : ''}`, "aria-expanded": "false", "aria-haspopup": "true", disabled: disabled, onClick: async (ev) => {
1596
+ const { popoverRef } = this;
1597
+ if (popoverRef) {
1598
+ this.isTimePopoverOpen = true;
1599
+ popoverRef.present(new CustomEvent('ionShadowTarget', {
1600
+ detail: {
1601
+ ionShadowTarget: ev.target,
1602
+ },
1603
+ }));
1604
+ await popoverRef.onWillDismiss();
1605
+ this.isTimePopoverOpen = false;
1606
+ }
1607
+ } }, getLocalizedTime(locale, activePart, computedHourCycle)),
1608
+ h("ion-popover", { alignment: "center", translucent: true, overlayIndex: 1, arrow: false, onWillPresent: (ev) => {
1609
+ /**
1610
+ * Intersection Observers do not consistently fire between Blink and Webkit
1611
+ * when toggling the visibility of the popover and trying to scroll the picker
1612
+ * column to the correct time value.
1613
+ *
1614
+ * This will correctly scroll the element position to the correct time value,
1615
+ * before the popover is fully presented.
1616
+ */
1617
+ const cols = ev.target.querySelectorAll('ion-picker-column-internal');
1618
+ // TODO (FW-615): Potentially remove this when intersection observers are fixed in picker column
1619
+ cols.forEach((col) => col.scrollActiveItemIntoView());
1620
+ }, style: {
1621
+ '--offset-y': '-10px',
1622
+ '--min-width': 'fit-content',
1623
+ },
1624
+ // Allow native browser keyboard events to support up/down/home/end key
1625
+ // navigation within the time picker.
1626
+ keyboardEvents: true, ref: (el) => (this.popoverRef = el) }, this.renderWheelPicker('time')),
1691
1627
  ];
1692
1628
  }
1693
- }
1694
- render() {
1695
- const { name, value, disabled, el, color, readonly, showMonthAndYear, preferWheel, presentation, size, isGridStyle, } = this;
1696
- const mode = getIonMode(this);
1697
- const isMonthAndYearPresentation = presentation === 'year' || presentation === 'month' || presentation === 'month-year';
1698
- const shouldShowMonthAndYear = showMonthAndYear || isMonthAndYearPresentation;
1699
- const monthYearPickerOpen = showMonthAndYear && !isMonthAndYearPresentation;
1700
- const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1701
- const hasWheelVariant = hasDatePresentation && preferWheel;
1702
- renderHiddenInput(true, el, name, formatValue(value), disabled);
1703
- return (h(Host, { "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1704
- [mode]: true,
1705
- ['datetime-readonly']: readonly,
1706
- ['datetime-disabled']: disabled,
1707
- 'show-month-and-year': shouldShowMonthAndYear,
1708
- 'month-year-picker-open': monthYearPickerOpen,
1709
- [`datetime-presentation-${presentation}`]: true,
1710
- [`datetime-size-${size}`]: true,
1711
- [`datetime-prefer-wheel`]: hasWheelVariant,
1712
- [`datetime-grid`]: isGridStyle,
1713
- })) }, this.renderDatetime(mode)));
1714
- }
1715
- get el() { return getElement(this); }
1716
- static get watchers() { return {
1717
- "disabled": ["disabledChanged"],
1718
- "min": ["minChanged"],
1719
- "max": ["maxChanged"],
1720
- "yearValues": ["yearValuesChanged"],
1721
- "monthValues": ["monthValuesChanged"],
1722
- "dayValues": ["dayValuesChanged"],
1723
- "hourValues": ["hourValuesChanged"],
1724
- "minuteValues": ["minuteValuesChanged"],
1725
- "value": ["valueChanged"]
1726
- }; }
1629
+ getHeaderSelectedDateText() {
1630
+ const { activeParts, multiple, titleSelectedDatesFormatter } = this;
1631
+ const isArray = Array.isArray(activeParts);
1632
+ let headerText;
1633
+ if (multiple && isArray && activeParts.length !== 1) {
1634
+ headerText = `${activeParts.length} days`; // default/fallback for multiple selection
1635
+ if (titleSelectedDatesFormatter !== undefined) {
1636
+ try {
1637
+ headerText = titleSelectedDatesFormatter(convertDataToISO(activeParts));
1638
+ }
1639
+ catch (e) {
1640
+ printIonError('Exception in provided `titleSelectedDatesFormatter`: ', e);
1641
+ }
1642
+ }
1643
+ }
1644
+ else {
1645
+ // for exactly 1 day selected (multiple set or not), show a formatted version of that
1646
+ headerText = getMonthAndDay(this.locale, this.getActivePartsWithFallback());
1647
+ }
1648
+ return headerText;
1649
+ }
1650
+ renderHeader(showExpandedHeader = true) {
1651
+ const hasSlottedTitle = this.el.querySelector('[slot="title"]') !== null;
1652
+ if (!hasSlottedTitle && !this.showDefaultTitle) {
1653
+ return;
1654
+ }
1655
+ return (h("div", { class: "datetime-header" }, h("div", { class: "datetime-title" }, h("slot", { name: "title" }, "Select Date")), showExpandedHeader && h("div", { class: "datetime-selected-date" }, this.getHeaderSelectedDateText())));
1656
+ }
1657
+ /**
1658
+ * Render time picker inside of datetime.
1659
+ * Do not pass color prop to segment on
1660
+ * iOS mode. MD segment has been customized and
1661
+ * should take on the color prop, but iOS
1662
+ * should just be the default segment.
1663
+ */
1664
+ renderTime() {
1665
+ const { presentation } = this;
1666
+ const timeOnlyPresentation = presentation === 'time';
1667
+ return (h("div", { class: "datetime-time" }, timeOnlyPresentation ? this.renderWheelPicker() : this.renderTimeOverlay()));
1668
+ }
1669
+ /**
1670
+ * Renders the month/year picker that is
1671
+ * displayed on the calendar grid.
1672
+ * The .datetime-year class has additional
1673
+ * styles that let us show/hide the
1674
+ * picker when the user clicks on the
1675
+ * toggle in the calendar header.
1676
+ */
1677
+ renderCalendarViewMonthYearPicker() {
1678
+ return h("div", { class: "datetime-year" }, this.renderWheelView('month-year'));
1679
+ }
1680
+ /**
1681
+ * Render entry point
1682
+ * All presentation types are rendered from here.
1683
+ */
1684
+ renderDatetime(mode) {
1685
+ const { presentation, preferWheel } = this;
1686
+ /**
1687
+ * Certain presentation types have separate grid and wheel displays.
1688
+ * If preferWheel is true then we should show a wheel picker instead.
1689
+ */
1690
+ const hasWheelVariant = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1691
+ if (preferWheel && hasWheelVariant) {
1692
+ return [this.renderHeader(false), this.renderWheelView(), this.renderFooter()];
1693
+ }
1694
+ switch (presentation) {
1695
+ case 'date-time':
1696
+ return [
1697
+ this.renderHeader(),
1698
+ this.renderCalendar(mode),
1699
+ this.renderCalendarViewMonthYearPicker(),
1700
+ this.renderTime(),
1701
+ this.renderFooter(),
1702
+ ];
1703
+ case 'time-date':
1704
+ return [
1705
+ this.renderHeader(),
1706
+ this.renderTime(),
1707
+ this.renderCalendar(mode),
1708
+ this.renderCalendarViewMonthYearPicker(),
1709
+ this.renderFooter(),
1710
+ ];
1711
+ case 'time':
1712
+ return [this.renderHeader(false), this.renderTime(), this.renderFooter()];
1713
+ case 'month':
1714
+ case 'month-year':
1715
+ case 'year':
1716
+ return [this.renderHeader(false), this.renderWheelView(), this.renderFooter()];
1717
+ default:
1718
+ return [
1719
+ this.renderHeader(),
1720
+ this.renderCalendar(mode),
1721
+ this.renderCalendarViewMonthYearPicker(),
1722
+ this.renderFooter(),
1723
+ ];
1724
+ }
1725
+ }
1726
+ render() {
1727
+ const { name, value, disabled, el, color, readonly, showMonthAndYear, preferWheel, presentation, size, isGridStyle, } = this;
1728
+ const mode = getIonMode(this);
1729
+ const isMonthAndYearPresentation = presentation === 'year' || presentation === 'month' || presentation === 'month-year';
1730
+ const shouldShowMonthAndYear = showMonthAndYear || isMonthAndYearPresentation;
1731
+ const monthYearPickerOpen = showMonthAndYear && !isMonthAndYearPresentation;
1732
+ const hasDatePresentation = presentation === 'date' || presentation === 'date-time' || presentation === 'time-date';
1733
+ const hasWheelVariant = hasDatePresentation && preferWheel;
1734
+ renderHiddenInput(true, el, name, formatValue(value), disabled);
1735
+ return (h(Host, { "aria-disabled": disabled ? 'true' : null, onFocus: this.onFocus, onBlur: this.onBlur, class: Object.assign({}, createColorClasses(color, {
1736
+ [mode]: true,
1737
+ ['datetime-readonly']: readonly,
1738
+ ['datetime-disabled']: disabled,
1739
+ 'show-month-and-year': shouldShowMonthAndYear,
1740
+ 'month-year-picker-open': monthYearPickerOpen,
1741
+ [`datetime-presentation-${presentation}`]: true,
1742
+ [`datetime-size-${size}`]: true,
1743
+ [`datetime-prefer-wheel`]: hasWheelVariant,
1744
+ [`datetime-grid`]: isGridStyle,
1745
+ })) }, this.renderDatetime(mode)));
1746
+ }
1747
+ get el() { return getElement(this); }
1748
+ static get watchers() { return {
1749
+ "disabled": ["disabledChanged"],
1750
+ "min": ["minChanged"],
1751
+ "max": ["maxChanged"],
1752
+ "yearValues": ["yearValuesChanged"],
1753
+ "monthValues": ["monthValuesChanged"],
1754
+ "dayValues": ["dayValuesChanged"],
1755
+ "hourValues": ["hourValuesChanged"],
1756
+ "minuteValues": ["minuteValuesChanged"],
1757
+ "value": ["valueChanged"]
1758
+ }; }
1727
1759
  };
1728
1760
  let datetimeIds = 0;
1729
1761
  Datetime.style = {
1730
- ios: datetimeIosCss,
1731
- md: datetimeMdCss
1762
+ ios: datetimeIosCss,
1763
+ md: datetimeMdCss
1732
1764
  };
1733
1765
 
1734
1766
  /**
1735
1767
  * iOS Picker Enter Animation
1736
1768
  */
1737
1769
  const iosEnterAnimation = (baseEl) => {
1738
- const baseAnimation = createAnimation();
1739
- const backdropAnimation = createAnimation();
1740
- const wrapperAnimation = createAnimation();
1741
- backdropAnimation
1742
- .addElement(baseEl.querySelector('ion-backdrop'))
1743
- .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
1744
- .beforeStyles({
1745
- 'pointer-events': 'none',
1746
- })
1747
- .afterClearStyles(['pointer-events']);
1748
- wrapperAnimation
1749
- .addElement(baseEl.querySelector('.picker-wrapper'))
1750
- .fromTo('transform', 'translateY(100%)', 'translateY(0%)');
1751
- return baseAnimation
1752
- .addElement(baseEl)
1753
- .easing('cubic-bezier(.36,.66,.04,1)')
1754
- .duration(400)
1755
- .addAnimation([backdropAnimation, wrapperAnimation]);
1770
+ const baseAnimation = createAnimation();
1771
+ const backdropAnimation = createAnimation();
1772
+ const wrapperAnimation = createAnimation();
1773
+ backdropAnimation
1774
+ .addElement(baseEl.querySelector('ion-backdrop'))
1775
+ .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
1776
+ .beforeStyles({
1777
+ 'pointer-events': 'none',
1778
+ })
1779
+ .afterClearStyles(['pointer-events']);
1780
+ wrapperAnimation
1781
+ .addElement(baseEl.querySelector('.picker-wrapper'))
1782
+ .fromTo('transform', 'translateY(100%)', 'translateY(0%)');
1783
+ return baseAnimation
1784
+ .addElement(baseEl)
1785
+ .easing('cubic-bezier(.36,.66,.04,1)')
1786
+ .duration(400)
1787
+ .addAnimation([backdropAnimation, wrapperAnimation]);
1756
1788
  };
1757
1789
 
1758
1790
  /**
1759
1791
  * iOS Picker Leave Animation
1760
1792
  */
1761
1793
  const iosLeaveAnimation = (baseEl) => {
1762
- const baseAnimation = createAnimation();
1763
- const backdropAnimation = createAnimation();
1764
- const wrapperAnimation = createAnimation();
1765
- backdropAnimation
1766
- .addElement(baseEl.querySelector('ion-backdrop'))
1767
- .fromTo('opacity', 'var(--backdrop-opacity)', 0.01);
1768
- wrapperAnimation
1769
- .addElement(baseEl.querySelector('.picker-wrapper'))
1770
- .fromTo('transform', 'translateY(0%)', 'translateY(100%)');
1771
- return baseAnimation
1772
- .addElement(baseEl)
1773
- .easing('cubic-bezier(.36,.66,.04,1)')
1774
- .duration(400)
1775
- .addAnimation([backdropAnimation, wrapperAnimation]);
1794
+ const baseAnimation = createAnimation();
1795
+ const backdropAnimation = createAnimation();
1796
+ const wrapperAnimation = createAnimation();
1797
+ backdropAnimation
1798
+ .addElement(baseEl.querySelector('ion-backdrop'))
1799
+ .fromTo('opacity', 'var(--backdrop-opacity)', 0.01);
1800
+ wrapperAnimation
1801
+ .addElement(baseEl.querySelector('.picker-wrapper'))
1802
+ .fromTo('transform', 'translateY(0%)', 'translateY(100%)');
1803
+ return baseAnimation
1804
+ .addElement(baseEl)
1805
+ .easing('cubic-bezier(.36,.66,.04,1)')
1806
+ .duration(400)
1807
+ .addAnimation([backdropAnimation, wrapperAnimation]);
1776
1808
  };
1777
1809
 
1778
1810
  const pickerIosCss = ".sc-ion-picker-ios-h{--border-radius:0;--border-style:solid;--min-width:auto;--width:100%;--max-width:500px;--min-height:auto;--max-height:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;font-family:var(--ion-font-family, inherit);contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1001}@supports (inset-inline-start: 0){.sc-ion-picker-ios-h{inset-inline-start:0}}@supports not (inset-inline-start: 0){.sc-ion-picker-ios-h{left:0}[dir=rtl].sc-ion-picker-ios-h,[dir=rtl] .sc-ion-picker-ios-h{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.sc-ion-picker-ios-h:dir(rtl){left:unset;right:unset;right:0}}}.overlay-hidden.sc-ion-picker-ios-h{display:none}.picker-wrapper.sc-ion-picker-ios{border-radius:var(--border-radius);left:0;right:0;bottom:0;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);display:-ms-flexbox;display:flex;position:absolute;-ms-flex-direction:column;flex-direction:column;width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);contain:strict;overflow:hidden;z-index:10}.picker-toolbar.sc-ion-picker-ios{width:100%;background:transparent;contain:strict;z-index:1}.picker-button.sc-ion-picker-ios{border:0;font-family:inherit}.picker-button.sc-ion-picker-ios:active,.picker-button.sc-ion-picker-ios:focus{outline:none}.picker-columns.sc-ion-picker-ios{display:-ms-flexbox;display:flex;position:relative;-ms-flex-pack:center;justify-content:center;margin-bottom:var(--ion-safe-area-bottom, 0);contain:strict;overflow:hidden}.picker-above-highlight.sc-ion-picker-ios,.picker-below-highlight.sc-ion-picker-ios{display:none;pointer-events:none}.sc-ion-picker-ios-h{--background:var(--ion-background-color, #fff);--border-width:1px 0 0;--border-color:var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-250, #c8c7cc)));--height:260px;--backdrop-opacity:var(--ion-backdrop-opacity, 0.26);color:var(--ion-item-color, var(--ion-text-color, #000))}.picker-toolbar.sc-ion-picker-ios{display:-ms-flexbox;display:flex;height:44px;border-bottom:0.55px solid var(--border-color)}.picker-toolbar-button.sc-ion-picker-ios{-ms-flex:1;flex:1;text-align:end}.picker-toolbar-button.sc-ion-picker-ios:last-child .picker-button.sc-ion-picker-ios{font-weight:600}.picker-toolbar-button.sc-ion-picker-ios:first-child{font-weight:normal;text-align:start}.picker-button.sc-ion-picker-ios,.picker-button.ion-activated.sc-ion-picker-ios{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-padding-start:1em;padding-inline-start:1em;-webkit-padding-end:1em;padding-inline-end:1em;padding-top:0;padding-bottom:0;height:44px;background:transparent;color:var(--ion-color-primary, #3880ff);font-size:16px}.picker-columns.sc-ion-picker-ios{height:215px;-webkit-perspective:1000px;perspective:1000px}.picker-above-highlight.sc-ion-picker-ios{top:0;-webkit-transform:translate3d(0, 0, 90px);transform:translate3d(0, 0, 90px);display:block;position:absolute;width:100%;height:81px;border-bottom:1px solid var(--border-color);background:-webkit-gradient(linear, left top, left bottom, color-stop(20%, var(--background, var(--ion-background-color, #fff))), to(rgba(var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255)), 0.8)));background:linear-gradient(to bottom, var(--background, var(--ion-background-color, #fff)) 20%, rgba(var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255)), 0.8) 100%);z-index:10}@supports (inset-inline-start: 0){.picker-above-highlight.sc-ion-picker-ios{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-above-highlight.sc-ion-picker-ios{left:0}[dir=rtl].sc-ion-picker-ios-h .picker-above-highlight.sc-ion-picker-ios,[dir=rtl] .sc-ion-picker-ios-h .picker-above-highlight.sc-ion-picker-ios{left:unset;right:unset;right:0}[dir=rtl].sc-ion-picker-ios .picker-above-highlight.sc-ion-picker-ios{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-above-highlight.sc-ion-picker-ios:dir(rtl){left:unset;right:unset;right:0}}}.picker-below-highlight.sc-ion-picker-ios{top:115px;-webkit-transform:translate3d(0, 0, 90px);transform:translate3d(0, 0, 90px);display:block;position:absolute;width:100%;height:119px;border-top:1px solid var(--border-color);background:-webkit-gradient(linear, left bottom, left top, color-stop(30%, var(--background, var(--ion-background-color, #fff))), to(rgba(var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255)), 0.8)));background:linear-gradient(to top, var(--background, var(--ion-background-color, #fff)) 30%, rgba(var(--background-rgb, var(--ion-background-color-rgb, 255, 255, 255)), 0.8) 100%);z-index:11}@supports (inset-inline-start: 0){.picker-below-highlight.sc-ion-picker-ios{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-below-highlight.sc-ion-picker-ios{left:0}[dir=rtl].sc-ion-picker-ios-h .picker-below-highlight.sc-ion-picker-ios,[dir=rtl] .sc-ion-picker-ios-h .picker-below-highlight.sc-ion-picker-ios{left:unset;right:unset;right:0}[dir=rtl].sc-ion-picker-ios .picker-below-highlight.sc-ion-picker-ios{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-below-highlight.sc-ion-picker-ios:dir(rtl){left:unset;right:unset;right:0}}}";
@@ -1780,195 +1812,205 @@ const pickerIosCss = ".sc-ion-picker-ios-h{--border-radius:0;--border-style:soli
1780
1812
  const pickerMdCss = ".sc-ion-picker-md-h{--border-radius:0;--border-style:solid;--min-width:auto;--width:100%;--max-width:500px;--min-height:auto;--max-height:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;font-family:var(--ion-font-family, inherit);contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1001}@supports (inset-inline-start: 0){.sc-ion-picker-md-h{inset-inline-start:0}}@supports not (inset-inline-start: 0){.sc-ion-picker-md-h{left:0}[dir=rtl].sc-ion-picker-md-h,[dir=rtl] .sc-ion-picker-md-h{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.sc-ion-picker-md-h:dir(rtl){left:unset;right:unset;right:0}}}.overlay-hidden.sc-ion-picker-md-h{display:none}.picker-wrapper.sc-ion-picker-md{border-radius:var(--border-radius);left:0;right:0;bottom:0;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);display:-ms-flexbox;display:flex;position:absolute;-ms-flex-direction:column;flex-direction:column;width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);contain:strict;overflow:hidden;z-index:10}.picker-toolbar.sc-ion-picker-md{width:100%;background:transparent;contain:strict;z-index:1}.picker-button.sc-ion-picker-md{border:0;font-family:inherit}.picker-button.sc-ion-picker-md:active,.picker-button.sc-ion-picker-md:focus{outline:none}.picker-columns.sc-ion-picker-md{display:-ms-flexbox;display:flex;position:relative;-ms-flex-pack:center;justify-content:center;margin-bottom:var(--ion-safe-area-bottom, 0);contain:strict;overflow:hidden}.picker-above-highlight.sc-ion-picker-md,.picker-below-highlight.sc-ion-picker-md{display:none;pointer-events:none}.sc-ion-picker-md-h{--background:var(--ion-background-color, #fff);--border-width:0.55px 0 0;--border-color:var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));--height:260px;--backdrop-opacity:var(--ion-backdrop-opacity, 0.26);color:var(--ion-item-color, var(--ion-text-color, #000))}.picker-toolbar.sc-ion-picker-md{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;height:44px}.picker-button.sc-ion-picker-md,.picker-button.ion-activated.sc-ion-picker-md{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-padding-start:1.1em;padding-inline-start:1.1em;-webkit-padding-end:1.1em;padding-inline-end:1.1em;padding-top:0;padding-bottom:0;height:44px;background:transparent;color:var(--ion-color-primary, #3880ff);font-size:14px;font-weight:500;text-transform:uppercase;-webkit-box-shadow:none;box-shadow:none}.picker-columns.sc-ion-picker-md{height:216px;-webkit-perspective:1800px;perspective:1800px}.picker-above-highlight.sc-ion-picker-md{top:0;-webkit-transform:translate3d(0, 0, 90px);transform:translate3d(0, 0, 90px);position:absolute;width:100%;height:81px;border-bottom:1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));background:-webkit-gradient(linear, left top, left bottom, color-stop(20%, var(--ion-background-color, #fff)), to(rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8)));background:linear-gradient(to bottom, var(--ion-background-color, #fff) 20%, rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8) 100%);z-index:10}@supports (inset-inline-start: 0){.picker-above-highlight.sc-ion-picker-md{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-above-highlight.sc-ion-picker-md{left:0}[dir=rtl].sc-ion-picker-md-h .picker-above-highlight.sc-ion-picker-md,[dir=rtl] .sc-ion-picker-md-h .picker-above-highlight.sc-ion-picker-md{left:unset;right:unset;right:0}[dir=rtl].sc-ion-picker-md .picker-above-highlight.sc-ion-picker-md{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-above-highlight.sc-ion-picker-md:dir(rtl){left:unset;right:unset;right:0}}}.picker-below-highlight.sc-ion-picker-md{top:115px;-webkit-transform:translate3d(0, 0, 90px);transform:translate3d(0, 0, 90px);position:absolute;width:100%;height:119px;border-top:1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));background:-webkit-gradient(linear, left bottom, left top, color-stop(30%, var(--ion-background-color, #fff)), to(rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8)));background:linear-gradient(to top, var(--ion-background-color, #fff) 30%, rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8) 100%);z-index:11}@supports (inset-inline-start: 0){.picker-below-highlight.sc-ion-picker-md{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-below-highlight.sc-ion-picker-md{left:0}[dir=rtl].sc-ion-picker-md-h .picker-below-highlight.sc-ion-picker-md,[dir=rtl] .sc-ion-picker-md-h .picker-below-highlight.sc-ion-picker-md{left:unset;right:unset;right:0}[dir=rtl].sc-ion-picker-md .picker-below-highlight.sc-ion-picker-md{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-below-highlight.sc-ion-picker-md:dir(rtl){left:unset;right:unset;right:0}}}";
1781
1813
 
1782
1814
  const Picker = class {
1783
- constructor(hostRef) {
1784
- registerInstance(this, hostRef);
1785
- this.didPresent = createEvent(this, "ionPickerDidPresent", 7);
1786
- this.willPresent = createEvent(this, "ionPickerWillPresent", 7);
1787
- this.willDismiss = createEvent(this, "ionPickerWillDismiss", 7);
1788
- this.didDismiss = createEvent(this, "ionPickerDidDismiss", 7);
1789
- this.didPresentShorthand = createEvent(this, "didPresent", 7);
1790
- this.willPresentShorthand = createEvent(this, "willPresent", 7);
1791
- this.willDismissShorthand = createEvent(this, "willDismiss", 7);
1792
- this.didDismissShorthand = createEvent(this, "didDismiss", 7);
1793
- this.delegateController = createDelegateController(this);
1794
- this.lockController = createLockController();
1795
- this.triggerController = createTriggerController();
1796
- this.onBackdropTap = () => {
1797
- this.dismiss(undefined, BACKDROP);
1798
- };
1799
- this.dispatchCancelHandler = (ev) => {
1800
- const role = ev.detail.role;
1801
- if (isCancel(role)) {
1802
- const cancelButton = this.buttons.find((b) => b.role === 'cancel');
1803
- this.callButtonHandler(cancelButton);
1804
- }
1805
- };
1806
- this.presented = false;
1807
- this.overlayIndex = undefined;
1808
- this.delegate = undefined;
1809
- this.hasController = false;
1810
- this.keyboardClose = true;
1811
- this.enterAnimation = undefined;
1812
- this.leaveAnimation = undefined;
1813
- this.buttons = [];
1814
- this.columns = [];
1815
- this.cssClass = undefined;
1816
- this.duration = 0;
1817
- this.showBackdrop = true;
1818
- this.backdropDismiss = true;
1819
- this.animated = true;
1820
- this.htmlAttributes = undefined;
1821
- this.isOpen = false;
1822
- this.trigger = undefined;
1823
- }
1824
- onIsOpenChange(newValue, oldValue) {
1825
- if (newValue === true && oldValue === false) {
1826
- this.present();
1827
- }
1828
- else if (newValue === false && oldValue === true) {
1829
- this.dismiss();
1830
- }
1831
- }
1832
- triggerChanged() {
1833
- const { trigger, el, triggerController } = this;
1834
- if (trigger) {
1835
- triggerController.addClickListener(el, trigger);
1836
- }
1837
- }
1838
- connectedCallback() {
1839
- prepareOverlay(this.el);
1840
- this.triggerChanged();
1841
- }
1842
- disconnectedCallback() {
1843
- this.triggerController.removeClickListener();
1844
- }
1845
- componentWillLoad() {
1846
- setOverlayId(this.el);
1847
- }
1848
- componentDidLoad() {
1815
+ constructor(hostRef) {
1816
+ registerInstance(this, hostRef);
1817
+ this.didPresent = createEvent(this, "ionPickerDidPresent", 7);
1818
+ this.willPresent = createEvent(this, "ionPickerWillPresent", 7);
1819
+ this.willDismiss = createEvent(this, "ionPickerWillDismiss", 7);
1820
+ this.didDismiss = createEvent(this, "ionPickerDidDismiss", 7);
1821
+ this.didPresentShorthand = createEvent(this, "didPresent", 7);
1822
+ this.willPresentShorthand = createEvent(this, "willPresent", 7);
1823
+ this.willDismissShorthand = createEvent(this, "willDismiss", 7);
1824
+ this.didDismissShorthand = createEvent(this, "didDismiss", 7);
1825
+ this.delegateController = createDelegateController(this);
1826
+ this.lockController = createLockController();
1827
+ this.triggerController = createTriggerController();
1828
+ this.onBackdropTap = () => {
1829
+ this.dismiss(undefined, BACKDROP);
1830
+ };
1831
+ this.dispatchCancelHandler = (ev) => {
1832
+ const role = ev.detail.role;
1833
+ if (isCancel(role)) {
1834
+ const cancelButton = this.buttons.find((b) => b.role === 'cancel');
1835
+ this.callButtonHandler(cancelButton);
1836
+ }
1837
+ };
1838
+ this.presented = false;
1839
+ this.overlayIndex = undefined;
1840
+ this.delegate = undefined;
1841
+ this.hasController = false;
1842
+ this.keyboardClose = true;
1843
+ this.enterAnimation = undefined;
1844
+ this.leaveAnimation = undefined;
1845
+ this.buttons = [];
1846
+ this.columns = [];
1847
+ this.cssClass = undefined;
1848
+ this.duration = 0;
1849
+ this.showBackdrop = true;
1850
+ this.backdropDismiss = true;
1851
+ this.animated = true;
1852
+ this.htmlAttributes = undefined;
1853
+ this.isOpen = false;
1854
+ this.trigger = undefined;
1855
+ }
1856
+ onIsOpenChange(newValue, oldValue) {
1857
+ if (newValue === true && oldValue === false) {
1858
+ this.present();
1859
+ }
1860
+ else if (newValue === false && oldValue === true) {
1861
+ this.dismiss();
1862
+ }
1863
+ }
1864
+ triggerChanged() {
1865
+ const { trigger, el, triggerController } = this;
1866
+ if (trigger) {
1867
+ triggerController.addClickListener(el, trigger);
1868
+ }
1869
+ }
1870
+ connectedCallback() {
1871
+ prepareOverlay(this.el);
1872
+ this.triggerChanged();
1873
+ }
1874
+ disconnectedCallback() {
1875
+ this.triggerController.removeClickListener();
1876
+ }
1877
+ componentWillLoad() {
1878
+ setOverlayId(this.el);
1879
+ }
1880
+ componentDidLoad() {
1881
+ /**
1882
+ * If picker was rendered with isOpen="true"
1883
+ * then we should open picker immediately.
1884
+ */
1885
+ if (this.isOpen === true) {
1886
+ raf(() => this.present());
1887
+ }
1888
+ /**
1889
+ * When binding values in frameworks such as Angular
1890
+ * it is possible for the value to be set after the Web Component
1891
+ * initializes but before the value watcher is set up in Stencil.
1892
+ * As a result, the watcher callback may not be fired.
1893
+ * We work around this by manually calling the watcher
1894
+ * callback when the component has loaded and the watcher
1895
+ * is configured.
1896
+ */
1897
+ this.triggerChanged();
1898
+ }
1849
1899
  /**
1850
- * If picker was rendered with isOpen="true"
1851
- * then we should open picker immediately.
1900
+ * Present the picker overlay after it has been created.
1852
1901
  */
1853
- if (this.isOpen === true) {
1854
- raf(() => this.present());
1855
- }
1856
- }
1857
- /**
1858
- * Present the picker overlay after it has been created.
1859
- */
1860
- async present() {
1861
- const unlock = await this.lockController.lock();
1862
- await this.delegateController.attachViewToDom();
1863
- await present(this, 'pickerEnter', iosEnterAnimation, iosEnterAnimation, undefined);
1864
- if (this.duration > 0) {
1865
- this.durationTimeout = setTimeout(() => this.dismiss(), this.duration);
1866
- }
1867
- unlock();
1868
- }
1869
- /**
1870
- * Dismiss the picker overlay after it has been presented.
1871
- *
1872
- * @param data Any data to emit in the dismiss events.
1873
- * @param role The role of the element that is dismissing the picker.
1874
- * This can be useful in a button handler for determining which button was
1875
- * clicked to dismiss the picker.
1876
- * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
1877
- */
1878
- async dismiss(data, role) {
1879
- const unlock = await this.lockController.lock();
1880
- if (this.durationTimeout) {
1881
- clearTimeout(this.durationTimeout);
1882
- }
1883
- const dismissed = await dismiss(this, data, role, 'pickerLeave', iosLeaveAnimation, iosLeaveAnimation);
1884
- if (dismissed) {
1885
- this.delegateController.removeViewFromDom();
1886
- }
1887
- unlock();
1888
- return dismissed;
1889
- }
1890
- /**
1891
- * Returns a promise that resolves when the picker did dismiss.
1892
- */
1893
- onDidDismiss() {
1894
- return eventMethod(this.el, 'ionPickerDidDismiss');
1895
- }
1896
- /**
1897
- * Returns a promise that resolves when the picker will dismiss.
1898
- */
1899
- onWillDismiss() {
1900
- return eventMethod(this.el, 'ionPickerWillDismiss');
1901
- }
1902
- /**
1903
- * Get the column that matches the specified name.
1904
- *
1905
- * @param name The name of the column.
1906
- */
1907
- getColumn(name) {
1908
- return Promise.resolve(this.columns.find((column) => column.name === name));
1909
- }
1910
- async buttonClick(button) {
1911
- const role = button.role;
1912
- if (isCancel(role)) {
1913
- return this.dismiss(undefined, role);
1914
- }
1915
- const shouldDismiss = await this.callButtonHandler(button);
1916
- if (shouldDismiss) {
1917
- return this.dismiss(this.getSelected(), button.role);
1918
- }
1919
- return Promise.resolve();
1920
- }
1921
- async callButtonHandler(button) {
1922
- if (button) {
1923
- // a handler has been provided, execute it
1924
- // pass the handler the values from the inputs
1925
- const rtn = await safeCall(button.handler, this.getSelected());
1926
- if (rtn === false) {
1927
- // if the return value of the handler is false then do not dismiss
1928
- return false;
1929
- }
1930
- }
1931
- return true;
1932
- }
1933
- getSelected() {
1934
- const selected = {};
1935
- this.columns.forEach((col, index) => {
1936
- const selectedColumn = col.selectedIndex !== undefined ? col.options[col.selectedIndex] : undefined;
1937
- selected[col.name] = {
1938
- text: selectedColumn ? selectedColumn.text : undefined,
1939
- value: selectedColumn ? selectedColumn.value : undefined,
1940
- columnIndex: index,
1941
- };
1942
- });
1943
- return selected;
1944
- }
1945
- render() {
1946
- const { htmlAttributes } = this;
1947
- const mode = getIonMode(this);
1948
- return (h(Host, Object.assign({ "aria-modal": "true", tabindex: "-1" }, htmlAttributes, { style: {
1949
- zIndex: `${20000 + this.overlayIndex}`,
1950
- }, class: Object.assign({ [mode]: true,
1951
- // Used internally for styling
1952
- [`picker-${mode}`]: true, 'overlay-hidden': true }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonPickerWillDismiss: this.dispatchCancelHandler }), h("ion-backdrop", { visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { tabindex: "0" }), h("div", { class: "picker-wrapper ion-overlay-wrapper", role: "dialog" }, h("div", { class: "picker-toolbar" }, this.buttons.map((b) => (h("div", { class: buttonWrapperClass(b) }, h("button", { type: "button", onClick: () => this.buttonClick(b), class: buttonClass(b) }, b.text))))), h("div", { class: "picker-columns" }, h("div", { class: "picker-above-highlight" }), this.presented && this.columns.map((c) => h("ion-picker-column", { col: c })), h("div", { class: "picker-below-highlight" }))), h("div", { tabindex: "0" })));
1953
- }
1954
- get el() { return getElement(this); }
1955
- static get watchers() { return {
1956
- "isOpen": ["onIsOpenChange"],
1957
- "trigger": ["triggerChanged"]
1958
- }; }
1902
+ async present() {
1903
+ const unlock = await this.lockController.lock();
1904
+ await this.delegateController.attachViewToDom();
1905
+ await present(this, 'pickerEnter', iosEnterAnimation, iosEnterAnimation, undefined);
1906
+ if (this.duration > 0) {
1907
+ this.durationTimeout = setTimeout(() => this.dismiss(), this.duration);
1908
+ }
1909
+ unlock();
1910
+ }
1911
+ /**
1912
+ * Dismiss the picker overlay after it has been presented.
1913
+ *
1914
+ * @param data Any data to emit in the dismiss events.
1915
+ * @param role The role of the element that is dismissing the picker.
1916
+ * This can be useful in a button handler for determining which button was
1917
+ * clicked to dismiss the picker.
1918
+ * Some examples include: ``"cancel"`, `"destructive"`, "selected"`, and `"backdrop"`.
1919
+ */
1920
+ async dismiss(data, role) {
1921
+ const unlock = await this.lockController.lock();
1922
+ if (this.durationTimeout) {
1923
+ clearTimeout(this.durationTimeout);
1924
+ }
1925
+ const dismissed = await dismiss(this, data, role, 'pickerLeave', iosLeaveAnimation, iosLeaveAnimation);
1926
+ if (dismissed) {
1927
+ this.delegateController.removeViewFromDom();
1928
+ }
1929
+ unlock();
1930
+ return dismissed;
1931
+ }
1932
+ /**
1933
+ * Returns a promise that resolves when the picker did dismiss.
1934
+ */
1935
+ onDidDismiss() {
1936
+ return eventMethod(this.el, 'ionPickerDidDismiss');
1937
+ }
1938
+ /**
1939
+ * Returns a promise that resolves when the picker will dismiss.
1940
+ */
1941
+ onWillDismiss() {
1942
+ return eventMethod(this.el, 'ionPickerWillDismiss');
1943
+ }
1944
+ /**
1945
+ * Get the column that matches the specified name.
1946
+ *
1947
+ * @param name The name of the column.
1948
+ */
1949
+ getColumn(name) {
1950
+ return Promise.resolve(this.columns.find((column) => column.name === name));
1951
+ }
1952
+ async buttonClick(button) {
1953
+ const role = button.role;
1954
+ if (isCancel(role)) {
1955
+ return this.dismiss(undefined, role);
1956
+ }
1957
+ const shouldDismiss = await this.callButtonHandler(button);
1958
+ if (shouldDismiss) {
1959
+ return this.dismiss(this.getSelected(), button.role);
1960
+ }
1961
+ return Promise.resolve();
1962
+ }
1963
+ async callButtonHandler(button) {
1964
+ if (button) {
1965
+ // a handler has been provided, execute it
1966
+ // pass the handler the values from the inputs
1967
+ const rtn = await safeCall(button.handler, this.getSelected());
1968
+ if (rtn === false) {
1969
+ // if the return value of the handler is false then do not dismiss
1970
+ return false;
1971
+ }
1972
+ }
1973
+ return true;
1974
+ }
1975
+ getSelected() {
1976
+ const selected = {};
1977
+ this.columns.forEach((col, index) => {
1978
+ const selectedColumn = col.selectedIndex !== undefined ? col.options[col.selectedIndex] : undefined;
1979
+ selected[col.name] = {
1980
+ text: selectedColumn ? selectedColumn.text : undefined,
1981
+ value: selectedColumn ? selectedColumn.value : undefined,
1982
+ columnIndex: index,
1983
+ };
1984
+ });
1985
+ return selected;
1986
+ }
1987
+ render() {
1988
+ const { htmlAttributes } = this;
1989
+ const mode = getIonMode(this);
1990
+ return (h(Host, Object.assign({ "aria-modal": "true", tabindex: "-1" }, htmlAttributes, { style: {
1991
+ zIndex: `${20000 + this.overlayIndex}`,
1992
+ }, class: Object.assign({ [mode]: true,
1993
+ // Used internally for styling
1994
+ [`picker-${mode}`]: true, 'overlay-hidden': true }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonPickerWillDismiss: this.dispatchCancelHandler }), h("ion-backdrop", { visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { tabindex: "0" }), h("div", { class: "picker-wrapper ion-overlay-wrapper", role: "dialog" }, h("div", { class: "picker-toolbar" }, this.buttons.map((b) => (h("div", { class: buttonWrapperClass(b) }, h("button", { type: "button", onClick: () => this.buttonClick(b), class: buttonClass(b) }, b.text))))), h("div", { class: "picker-columns" }, h("div", { class: "picker-above-highlight" }), this.presented && this.columns.map((c) => h("ion-picker-column", { col: c })), h("div", { class: "picker-below-highlight" }))), h("div", { tabindex: "0" })));
1995
+ }
1996
+ get el() { return getElement(this); }
1997
+ static get watchers() { return {
1998
+ "isOpen": ["onIsOpenChange"],
1999
+ "trigger": ["triggerChanged"]
2000
+ }; }
1959
2001
  };
1960
2002
  const buttonWrapperClass = (button) => {
1961
- return {
1962
- [`picker-toolbar-${button.role}`]: button.role !== undefined,
1963
- 'picker-toolbar-button': true,
1964
- };
2003
+ return {
2004
+ [`picker-toolbar-${button.role}`]: button.role !== undefined,
2005
+ 'picker-toolbar-button': true,
2006
+ };
1965
2007
  };
1966
2008
  const buttonClass = (button) => {
1967
- return Object.assign({ 'picker-button': true, 'ion-activatable': true }, getClassMap(button.cssClass));
2009
+ return Object.assign({ 'picker-button': true, 'ion-activatable': true }, getClassMap(button.cssClass));
1968
2010
  };
1969
2011
  Picker.style = {
1970
- ios: pickerIosCss,
1971
- md: pickerMdCss
2012
+ ios: pickerIosCss,
2013
+ md: pickerMdCss
1972
2014
  };
1973
2015
 
1974
2016
  const pickerColumnIosCss = ".picker-col{display:-ms-flexbox;display:flex;position:relative;-ms-flex:1;flex:1;-ms-flex-pack:center;justify-content:center;height:100%;-webkit-box-sizing:content-box;box-sizing:content-box;contain:content}.picker-opts{position:relative;-ms-flex:1;flex:1;max-width:100%}.picker-opt{top:0;display:block;position:absolute;width:100%;border:0;text-align:center;text-overflow:ellipsis;white-space:nowrap;contain:strict;overflow:hidden;will-change:transform}@supports (inset-inline-start: 0){.picker-opt{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-opt{left:0}:host-context([dir=rtl]) .picker-opt{left:unset;right:unset;right:0}[dir=rtl] .picker-opt{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){left:unset;right:unset;right:0}}}.picker-opt.picker-opt-disabled{pointer-events:none}.picker-opt-disabled{opacity:0}.picker-opts-left{-ms-flex-pack:start;justify-content:flex-start}.picker-opts-right{-ms-flex-pack:end;justify-content:flex-end}.picker-opt:active,.picker-opt:focus{outline:none}.picker-prefix{position:relative;-ms-flex:1;flex:1;text-align:end;white-space:nowrap}.picker-suffix{position:relative;-ms-flex:1;flex:1;text-align:start;white-space:nowrap}.picker-col{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:0;padding-bottom:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.picker-prefix,.picker-suffix,.picker-opts{top:77px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;color:inherit;font-size:20px;line-height:42px;pointer-events:none}.picker-opt{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;-webkit-transform-origin:center center;transform-origin:center center;height:46px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;background:transparent;color:inherit;font-size:20px;line-height:42px;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:auto}:host-context([dir=rtl]) .picker-opt{-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}[dir=rtl] .picker-opt{-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){-webkit-transform-origin:calc(100% - center) center;transform-origin:calc(100% - center) center}}";
@@ -1976,350 +2018,350 @@ const pickerColumnIosCss = ".picker-col{display:-ms-flexbox;display:flex;positio
1976
2018
  const pickerColumnMdCss = ".picker-col{display:-ms-flexbox;display:flex;position:relative;-ms-flex:1;flex:1;-ms-flex-pack:center;justify-content:center;height:100%;-webkit-box-sizing:content-box;box-sizing:content-box;contain:content}.picker-opts{position:relative;-ms-flex:1;flex:1;max-width:100%}.picker-opt{top:0;display:block;position:absolute;width:100%;border:0;text-align:center;text-overflow:ellipsis;white-space:nowrap;contain:strict;overflow:hidden;will-change:transform}@supports (inset-inline-start: 0){.picker-opt{inset-inline-start:0}}@supports not (inset-inline-start: 0){.picker-opt{left:0}:host-context([dir=rtl]) .picker-opt{left:unset;right:unset;right:0}[dir=rtl] .picker-opt{left:unset;right:unset;right:0}@supports selector(:dir(rtl)){.picker-opt:dir(rtl){left:unset;right:unset;right:0}}}.picker-opt.picker-opt-disabled{pointer-events:none}.picker-opt-disabled{opacity:0}.picker-opts-left{-ms-flex-pack:start;justify-content:flex-start}.picker-opts-right{-ms-flex-pack:end;justify-content:flex-end}.picker-opt:active,.picker-opt:focus{outline:none}.picker-prefix{position:relative;-ms-flex:1;flex:1;text-align:end;white-space:nowrap}.picker-suffix{position:relative;-ms-flex:1;flex:1;text-align:start;white-space:nowrap}.picker-col{-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:8px;padding-inline-end:8px;padding-top:0;padding-bottom:0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.picker-prefix,.picker-suffix,.picker-opts{top:77px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;color:inherit;font-size:22px;line-height:42px;pointer-events:none}.picker-opt{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;height:43px;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;background:transparent;color:inherit;font-size:22px;line-height:42px;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:auto}.picker-prefix,.picker-suffix,.picker-opt.picker-opt-selected{color:var(--ion-color-primary, #3880ff)}";
1977
2019
 
1978
2020
  const PickerColumnCmp = class {
1979
- constructor(hostRef) {
1980
- registerInstance(this, hostRef);
1981
- this.ionPickerColChange = createEvent(this, "ionPickerColChange", 7);
1982
- this.optHeight = 0;
1983
- this.rotateFactor = 0;
1984
- this.scaleFactor = 1;
1985
- this.velocity = 0;
1986
- this.y = 0;
1987
- this.noAnimate = true;
1988
- // `colDidChange` is a flag that gets set when the column is changed
1989
- // dynamically. When this flag is set, the column will refresh
1990
- // after the component re-renders to incorporate the new column data.
1991
- // This is necessary because `this.refresh` queries for the option elements,
1992
- // so it needs to wait for the latest elements to be available in the DOM.
1993
- // Ex: column is created with 3 options. User updates the column data
1994
- // to have 5 options. The column will still think it only has 3 options.
1995
- this.colDidChange = false;
1996
- this.col = undefined;
1997
- }
1998
- colChanged() {
1999
- this.colDidChange = true;
2000
- }
2001
- async connectedCallback() {
2002
- let pickerRotateFactor = 0;
2003
- let pickerScaleFactor = 0.81;
2004
- const mode = getIonMode(this);
2005
- if (mode === 'ios') {
2006
- pickerRotateFactor = -0.46;
2007
- pickerScaleFactor = 1;
2008
- }
2009
- this.rotateFactor = pickerRotateFactor;
2010
- this.scaleFactor = pickerScaleFactor;
2011
- this.gesture = (await import('./index-ff313b19.js')).createGesture({
2012
- el: this.el,
2013
- gestureName: 'picker-swipe',
2014
- gesturePriority: 100,
2015
- threshold: 0,
2016
- passive: false,
2017
- onStart: (ev) => this.onStart(ev),
2018
- onMove: (ev) => this.onMove(ev),
2019
- onEnd: (ev) => this.onEnd(ev),
2020
- });
2021
- this.gesture.enable();
2022
- // Options have not been initialized yet
2023
- // Animation must be disabled through the `noAnimate` flag
2024
- // Otherwise, the options will render
2025
- // at the top of the column and transition down
2026
- this.tmrId = setTimeout(() => {
2027
- this.noAnimate = false;
2028
- // After initialization, `refresh()` will be called
2029
- // At this point, animation will be enabled. The options will
2030
- // animate as they are being selected.
2031
- this.refresh(true);
2032
- }, 250);
2033
- }
2034
- componentDidLoad() {
2035
- this.onDomChange();
2036
- }
2037
- componentDidUpdate() {
2038
- // Options may have changed since last update.
2039
- if (this.colDidChange) {
2040
- // Animation must be disabled through the `onDomChange` parameter.
2041
- // Otherwise, the recently added options will render
2042
- // at the top of the column and transition down
2043
- this.onDomChange(true, false);
2044
- this.colDidChange = false;
2045
- }
2046
- }
2047
- disconnectedCallback() {
2048
- if (this.rafId !== undefined)
2049
- cancelAnimationFrame(this.rafId);
2050
- if (this.tmrId)
2051
- clearTimeout(this.tmrId);
2052
- if (this.gesture) {
2053
- this.gesture.destroy();
2054
- this.gesture = undefined;
2055
- }
2056
- }
2057
- emitColChange() {
2058
- this.ionPickerColChange.emit(this.col);
2059
- }
2060
- setSelected(selectedIndex, duration) {
2061
- // if there is a selected index, then figure out it's y position
2062
- // if there isn't a selected index, then just use the top y position
2063
- const y = selectedIndex > -1 ? -(selectedIndex * this.optHeight) : 0;
2064
- this.velocity = 0;
2065
- // set what y position we're at
2066
- if (this.rafId !== undefined)
2067
- cancelAnimationFrame(this.rafId);
2068
- this.update(y, duration, true);
2069
- this.emitColChange();
2070
- }
2071
- update(y, duration, saveY) {
2072
- if (!this.optsEl) {
2073
- return;
2074
- }
2075
- // ensure we've got a good round number :)
2076
- let translateY = 0;
2077
- let translateZ = 0;
2078
- const { col, rotateFactor } = this;
2079
- const prevSelected = col.selectedIndex;
2080
- const selectedIndex = (col.selectedIndex = this.indexForY(-y));
2081
- const durationStr = duration === 0 ? '' : duration + 'ms';
2082
- const scaleStr = `scale(${this.scaleFactor})`;
2083
- const children = this.optsEl.children;
2084
- for (let i = 0; i < children.length; i++) {
2085
- const button = children[i];
2086
- const opt = col.options[i];
2087
- const optOffset = i * this.optHeight + y;
2088
- let transform = '';
2089
- if (rotateFactor !== 0) {
2090
- const rotateX = optOffset * rotateFactor;
2091
- if (Math.abs(rotateX) <= 90) {
2092
- translateY = 0;
2093
- translateZ = 90;
2094
- transform = `rotateX(${rotateX}deg) `;
2021
+ constructor(hostRef) {
2022
+ registerInstance(this, hostRef);
2023
+ this.ionPickerColChange = createEvent(this, "ionPickerColChange", 7);
2024
+ this.optHeight = 0;
2025
+ this.rotateFactor = 0;
2026
+ this.scaleFactor = 1;
2027
+ this.velocity = 0;
2028
+ this.y = 0;
2029
+ this.noAnimate = true;
2030
+ // `colDidChange` is a flag that gets set when the column is changed
2031
+ // dynamically. When this flag is set, the column will refresh
2032
+ // after the component re-renders to incorporate the new column data.
2033
+ // This is necessary because `this.refresh` queries for the option elements,
2034
+ // so it needs to wait for the latest elements to be available in the DOM.
2035
+ // Ex: column is created with 3 options. User updates the column data
2036
+ // to have 5 options. The column will still think it only has 3 options.
2037
+ this.colDidChange = false;
2038
+ this.col = undefined;
2039
+ }
2040
+ colChanged() {
2041
+ this.colDidChange = true;
2042
+ }
2043
+ async connectedCallback() {
2044
+ let pickerRotateFactor = 0;
2045
+ let pickerScaleFactor = 0.81;
2046
+ const mode = getIonMode(this);
2047
+ if (mode === 'ios') {
2048
+ pickerRotateFactor = -0.46;
2049
+ pickerScaleFactor = 1;
2095
2050
  }
2096
- else {
2097
- translateY = -9999;
2051
+ this.rotateFactor = pickerRotateFactor;
2052
+ this.scaleFactor = pickerScaleFactor;
2053
+ this.gesture = (await import('./index-2cf77112.js')).createGesture({
2054
+ el: this.el,
2055
+ gestureName: 'picker-swipe',
2056
+ gesturePriority: 100,
2057
+ threshold: 0,
2058
+ passive: false,
2059
+ onStart: (ev) => this.onStart(ev),
2060
+ onMove: (ev) => this.onMove(ev),
2061
+ onEnd: (ev) => this.onEnd(ev),
2062
+ });
2063
+ this.gesture.enable();
2064
+ // Options have not been initialized yet
2065
+ // Animation must be disabled through the `noAnimate` flag
2066
+ // Otherwise, the options will render
2067
+ // at the top of the column and transition down
2068
+ this.tmrId = setTimeout(() => {
2069
+ this.noAnimate = false;
2070
+ // After initialization, `refresh()` will be called
2071
+ // At this point, animation will be enabled. The options will
2072
+ // animate as they are being selected.
2073
+ this.refresh(true);
2074
+ }, 250);
2075
+ }
2076
+ componentDidLoad() {
2077
+ this.onDomChange();
2078
+ }
2079
+ componentDidUpdate() {
2080
+ // Options may have changed since last update.
2081
+ if (this.colDidChange) {
2082
+ // Animation must be disabled through the `onDomChange` parameter.
2083
+ // Otherwise, the recently added options will render
2084
+ // at the top of the column and transition down
2085
+ this.onDomChange(true, false);
2086
+ this.colDidChange = false;
2098
2087
  }
2099
- }
2100
- else {
2101
- translateZ = 0;
2102
- translateY = optOffset;
2103
- }
2104
- const selected = selectedIndex === i;
2105
- transform += `translate3d(0px,${translateY}px,${translateZ}px) `;
2106
- if (this.scaleFactor !== 1 && !selected) {
2107
- transform += scaleStr;
2108
- }
2109
- // Update transition duration
2110
- if (this.noAnimate) {
2111
- opt.duration = 0;
2112
- button.style.transitionDuration = '';
2113
- }
2114
- else if (duration !== opt.duration) {
2115
- opt.duration = duration;
2116
- button.style.transitionDuration = durationStr;
2117
- }
2118
- // Update transform
2119
- if (transform !== opt.transform) {
2120
- opt.transform = transform;
2121
- }
2122
- button.style.transform = transform;
2123
- /**
2124
- * Ensure that the select column
2125
- * item has the selected class
2126
- */
2127
- opt.selected = selected;
2128
- if (selected) {
2129
- button.classList.add(PICKER_OPT_SELECTED);
2130
- }
2131
- else {
2132
- button.classList.remove(PICKER_OPT_SELECTED);
2133
- }
2134
- }
2135
- this.col.prevSelected = prevSelected;
2136
- if (saveY) {
2137
- this.y = y;
2138
- }
2139
- if (this.lastIndex !== selectedIndex) {
2140
- // have not set a last index yet
2141
- hapticSelectionChanged();
2142
- this.lastIndex = selectedIndex;
2143
- }
2144
- }
2145
- decelerate() {
2146
- if (this.velocity !== 0) {
2147
- // still decelerating
2148
- this.velocity *= DECELERATION_FRICTION;
2149
- // do not let it go slower than a velocity of 1
2150
- this.velocity = this.velocity > 0 ? Math.max(this.velocity, 1) : Math.min(this.velocity, -1);
2151
- let y = this.y + this.velocity;
2152
- if (y > this.minY) {
2153
- // whoops, it's trying to scroll up farther than the options we have!
2154
- y = this.minY;
2155
- this.velocity = 0;
2156
- }
2157
- else if (y < this.maxY) {
2158
- // gahh, it's trying to scroll down farther than we can!
2159
- y = this.maxY;
2160
- this.velocity = 0;
2161
- }
2162
- this.update(y, 0, true);
2163
- const notLockedIn = Math.round(y) % this.optHeight !== 0 || Math.abs(this.velocity) > 1;
2164
- if (notLockedIn) {
2165
- // isn't locked in yet, keep decelerating until it is
2166
- this.rafId = requestAnimationFrame(() => this.decelerate());
2167
- }
2168
- else {
2088
+ }
2089
+ disconnectedCallback() {
2090
+ if (this.rafId !== undefined)
2091
+ cancelAnimationFrame(this.rafId);
2092
+ if (this.tmrId)
2093
+ clearTimeout(this.tmrId);
2094
+ if (this.gesture) {
2095
+ this.gesture.destroy();
2096
+ this.gesture = undefined;
2097
+ }
2098
+ }
2099
+ emitColChange() {
2100
+ this.ionPickerColChange.emit(this.col);
2101
+ }
2102
+ setSelected(selectedIndex, duration) {
2103
+ // if there is a selected index, then figure out it's y position
2104
+ // if there isn't a selected index, then just use the top y position
2105
+ const y = selectedIndex > -1 ? -(selectedIndex * this.optHeight) : 0;
2169
2106
  this.velocity = 0;
2107
+ // set what y position we're at
2108
+ if (this.rafId !== undefined)
2109
+ cancelAnimationFrame(this.rafId);
2110
+ this.update(y, duration, true);
2170
2111
  this.emitColChange();
2171
- hapticSelectionEnd();
2172
- }
2173
- }
2174
- else if (this.y % this.optHeight !== 0) {
2175
- // needs to still get locked into a position so options line up
2176
- const currentPos = Math.abs(this.y % this.optHeight);
2177
- // create a velocity in the direction it needs to scroll
2178
- this.velocity = currentPos > this.optHeight / 2 ? 1 : -1;
2179
- this.decelerate();
2180
- }
2181
- }
2182
- indexForY(y) {
2183
- return Math.min(Math.max(Math.abs(Math.round(y / this.optHeight)), 0), this.col.options.length - 1);
2184
- }
2185
- onStart(detail) {
2186
- // We have to prevent default in order to block scrolling under the picker
2187
- // but we DO NOT have to stop propagation, since we still want
2188
- // some "click" events to capture
2189
- if (detail.event.cancelable) {
2190
- detail.event.preventDefault();
2191
- }
2192
- detail.event.stopPropagation();
2193
- hapticSelectionStart();
2194
- // reset everything
2195
- if (this.rafId !== undefined)
2196
- cancelAnimationFrame(this.rafId);
2197
- const options = this.col.options;
2198
- let minY = options.length - 1;
2199
- let maxY = 0;
2200
- for (let i = 0; i < options.length; i++) {
2201
- if (!options[i].disabled) {
2202
- minY = Math.min(minY, i);
2203
- maxY = Math.max(maxY, i);
2204
- }
2205
- }
2206
- this.minY = -(minY * this.optHeight);
2207
- this.maxY = -(maxY * this.optHeight);
2208
- }
2209
- onMove(detail) {
2210
- if (detail.event.cancelable) {
2211
- detail.event.preventDefault();
2212
- }
2213
- detail.event.stopPropagation();
2214
- // update the scroll position relative to pointer start position
2215
- let y = this.y + detail.deltaY;
2216
- if (y > this.minY) {
2217
- // scrolling up higher than scroll area
2218
- y = Math.pow(y, 0.8);
2219
- this.bounceFrom = y;
2220
- }
2221
- else if (y < this.maxY) {
2222
- // scrolling down below scroll area
2223
- y += Math.pow(this.maxY - y, 0.9);
2224
- this.bounceFrom = y;
2225
2112
  }
2226
- else {
2227
- this.bounceFrom = 0;
2228
- }
2229
- this.update(y, 0, false);
2230
- }
2231
- onEnd(detail) {
2232
- if (this.bounceFrom > 0) {
2233
- // bounce back up
2234
- this.update(this.minY, 100, true);
2235
- this.emitColChange();
2236
- return;
2237
- }
2238
- else if (this.bounceFrom < 0) {
2239
- // bounce back down
2240
- this.update(this.maxY, 100, true);
2241
- this.emitColChange();
2242
- return;
2243
- }
2244
- this.velocity = clamp(-MAX_PICKER_SPEED, detail.velocityY * 23, MAX_PICKER_SPEED);
2245
- if (this.velocity === 0 && detail.deltaY === 0) {
2246
- const opt = detail.event.target.closest('.picker-opt');
2247
- if (opt === null || opt === void 0 ? void 0 : opt.hasAttribute('opt-index')) {
2248
- this.setSelected(parseInt(opt.getAttribute('opt-index'), 10), TRANSITION_DURATION);
2249
- }
2113
+ update(y, duration, saveY) {
2114
+ if (!this.optsEl) {
2115
+ return;
2116
+ }
2117
+ // ensure we've got a good round number :)
2118
+ let translateY = 0;
2119
+ let translateZ = 0;
2120
+ const { col, rotateFactor } = this;
2121
+ const prevSelected = col.selectedIndex;
2122
+ const selectedIndex = (col.selectedIndex = this.indexForY(-y));
2123
+ const durationStr = duration === 0 ? '' : duration + 'ms';
2124
+ const scaleStr = `scale(${this.scaleFactor})`;
2125
+ const children = this.optsEl.children;
2126
+ for (let i = 0; i < children.length; i++) {
2127
+ const button = children[i];
2128
+ const opt = col.options[i];
2129
+ const optOffset = i * this.optHeight + y;
2130
+ let transform = '';
2131
+ if (rotateFactor !== 0) {
2132
+ const rotateX = optOffset * rotateFactor;
2133
+ if (Math.abs(rotateX) <= 90) {
2134
+ translateY = 0;
2135
+ translateZ = 90;
2136
+ transform = `rotateX(${rotateX}deg) `;
2137
+ }
2138
+ else {
2139
+ translateY = -9999;
2140
+ }
2141
+ }
2142
+ else {
2143
+ translateZ = 0;
2144
+ translateY = optOffset;
2145
+ }
2146
+ const selected = selectedIndex === i;
2147
+ transform += `translate3d(0px,${translateY}px,${translateZ}px) `;
2148
+ if (this.scaleFactor !== 1 && !selected) {
2149
+ transform += scaleStr;
2150
+ }
2151
+ // Update transition duration
2152
+ if (this.noAnimate) {
2153
+ opt.duration = 0;
2154
+ button.style.transitionDuration = '';
2155
+ }
2156
+ else if (duration !== opt.duration) {
2157
+ opt.duration = duration;
2158
+ button.style.transitionDuration = durationStr;
2159
+ }
2160
+ // Update transform
2161
+ if (transform !== opt.transform) {
2162
+ opt.transform = transform;
2163
+ }
2164
+ button.style.transform = transform;
2165
+ /**
2166
+ * Ensure that the select column
2167
+ * item has the selected class
2168
+ */
2169
+ opt.selected = selected;
2170
+ if (selected) {
2171
+ button.classList.add(PICKER_OPT_SELECTED);
2172
+ }
2173
+ else {
2174
+ button.classList.remove(PICKER_OPT_SELECTED);
2175
+ }
2176
+ }
2177
+ this.col.prevSelected = prevSelected;
2178
+ if (saveY) {
2179
+ this.y = y;
2180
+ }
2181
+ if (this.lastIndex !== selectedIndex) {
2182
+ // have not set a last index yet
2183
+ hapticSelectionChanged();
2184
+ this.lastIndex = selectedIndex;
2185
+ }
2250
2186
  }
2251
- else {
2252
- this.y += detail.deltaY;
2253
- if (Math.abs(detail.velocityY) < 0.05) {
2254
- const isScrollingUp = detail.deltaY > 0;
2255
- const optHeightFraction = (Math.abs(this.y) % this.optHeight) / this.optHeight;
2256
- if (isScrollingUp && optHeightFraction > 0.5) {
2257
- this.velocity = Math.abs(this.velocity) * -1;
2187
+ decelerate() {
2188
+ if (this.velocity !== 0) {
2189
+ // still decelerating
2190
+ this.velocity *= DECELERATION_FRICTION;
2191
+ // do not let it go slower than a velocity of 1
2192
+ this.velocity = this.velocity > 0 ? Math.max(this.velocity, 1) : Math.min(this.velocity, -1);
2193
+ let y = this.y + this.velocity;
2194
+ if (y > this.minY) {
2195
+ // whoops, it's trying to scroll up farther than the options we have!
2196
+ y = this.minY;
2197
+ this.velocity = 0;
2198
+ }
2199
+ else if (y < this.maxY) {
2200
+ // gahh, it's trying to scroll down farther than we can!
2201
+ y = this.maxY;
2202
+ this.velocity = 0;
2203
+ }
2204
+ this.update(y, 0, true);
2205
+ const notLockedIn = Math.round(y) % this.optHeight !== 0 || Math.abs(this.velocity) > 1;
2206
+ if (notLockedIn) {
2207
+ // isn't locked in yet, keep decelerating until it is
2208
+ this.rafId = requestAnimationFrame(() => this.decelerate());
2209
+ }
2210
+ else {
2211
+ this.velocity = 0;
2212
+ this.emitColChange();
2213
+ hapticSelectionEnd();
2214
+ }
2258
2215
  }
2259
- else if (!isScrollingUp && optHeightFraction <= 0.5) {
2260
- this.velocity = Math.abs(this.velocity);
2216
+ else if (this.y % this.optHeight !== 0) {
2217
+ // needs to still get locked into a position so options line up
2218
+ const currentPos = Math.abs(this.y % this.optHeight);
2219
+ // create a velocity in the direction it needs to scroll
2220
+ this.velocity = currentPos > this.optHeight / 2 ? 1 : -1;
2221
+ this.decelerate();
2261
2222
  }
2262
- }
2263
- this.decelerate();
2264
- }
2265
- }
2266
- refresh(forceRefresh, animated) {
2267
- var _a;
2268
- let min = this.col.options.length - 1;
2269
- let max = 0;
2270
- const options = this.col.options;
2271
- for (let i = 0; i < options.length; i++) {
2272
- if (!options[i].disabled) {
2273
- min = Math.min(min, i);
2274
- max = Math.max(max, i);
2275
- }
2276
2223
  }
2277
- /**
2278
- * Only update selected value if column has a
2279
- * velocity of 0. If it does not, then the
2280
- * column is animating might land on
2281
- * a value different than the value at
2282
- * selectedIndex
2283
- */
2284
- if (this.velocity !== 0) {
2285
- return;
2286
- }
2287
- const selectedIndex = clamp(min, (_a = this.col.selectedIndex) !== null && _a !== void 0 ? _a : 0, max);
2288
- if (this.col.prevSelected !== selectedIndex || forceRefresh) {
2289
- const y = selectedIndex * this.optHeight * -1;
2290
- const duration = animated ? TRANSITION_DURATION : 0;
2291
- this.velocity = 0;
2292
- this.update(y, duration, true);
2293
- }
2294
- }
2295
- onDomChange(forceRefresh, animated) {
2296
- const colEl = this.optsEl;
2297
- if (colEl) {
2298
- // DOM READ
2299
- // We perfom a DOM read over a rendered item, this needs to happen after the first render or after the the column has changed
2300
- this.optHeight = colEl.firstElementChild ? colEl.firstElementChild.clientHeight : 0;
2301
- }
2302
- this.refresh(forceRefresh, animated);
2303
- }
2304
- render() {
2305
- const col = this.col;
2306
- const mode = getIonMode(this);
2307
- return (h(Host, { class: Object.assign({ [mode]: true, 'picker-col': true, 'picker-opts-left': this.col.align === 'left', 'picker-opts-right': this.col.align === 'right' }, getClassMap(col.cssClass)), style: {
2308
- 'max-width': this.col.columnWidth,
2309
- } }, col.prefix && (h("div", { class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { class: "picker-opts", style: { maxWidth: col.optionsWidth }, ref: (el) => (this.optsEl = el) }, col.options.map((o, index) => (h("button", { "aria-label": o.ariaLabel, class: { 'picker-opt': true, 'picker-opt-disabled': !!o.disabled }, "opt-index": index }, o.text)))), col.suffix && (h("div", { class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
2310
- }
2311
- get el() { return getElement(this); }
2312
- static get watchers() { return {
2313
- "col": ["colChanged"]
2314
- }; }
2224
+ indexForY(y) {
2225
+ return Math.min(Math.max(Math.abs(Math.round(y / this.optHeight)), 0), this.col.options.length - 1);
2226
+ }
2227
+ onStart(detail) {
2228
+ // We have to prevent default in order to block scrolling under the picker
2229
+ // but we DO NOT have to stop propagation, since we still want
2230
+ // some "click" events to capture
2231
+ if (detail.event.cancelable) {
2232
+ detail.event.preventDefault();
2233
+ }
2234
+ detail.event.stopPropagation();
2235
+ hapticSelectionStart();
2236
+ // reset everything
2237
+ if (this.rafId !== undefined)
2238
+ cancelAnimationFrame(this.rafId);
2239
+ const options = this.col.options;
2240
+ let minY = options.length - 1;
2241
+ let maxY = 0;
2242
+ for (let i = 0; i < options.length; i++) {
2243
+ if (!options[i].disabled) {
2244
+ minY = Math.min(minY, i);
2245
+ maxY = Math.max(maxY, i);
2246
+ }
2247
+ }
2248
+ this.minY = -(minY * this.optHeight);
2249
+ this.maxY = -(maxY * this.optHeight);
2250
+ }
2251
+ onMove(detail) {
2252
+ if (detail.event.cancelable) {
2253
+ detail.event.preventDefault();
2254
+ }
2255
+ detail.event.stopPropagation();
2256
+ // update the scroll position relative to pointer start position
2257
+ let y = this.y + detail.deltaY;
2258
+ if (y > this.minY) {
2259
+ // scrolling up higher than scroll area
2260
+ y = Math.pow(y, 0.8);
2261
+ this.bounceFrom = y;
2262
+ }
2263
+ else if (y < this.maxY) {
2264
+ // scrolling down below scroll area
2265
+ y += Math.pow(this.maxY - y, 0.9);
2266
+ this.bounceFrom = y;
2267
+ }
2268
+ else {
2269
+ this.bounceFrom = 0;
2270
+ }
2271
+ this.update(y, 0, false);
2272
+ }
2273
+ onEnd(detail) {
2274
+ if (this.bounceFrom > 0) {
2275
+ // bounce back up
2276
+ this.update(this.minY, 100, true);
2277
+ this.emitColChange();
2278
+ return;
2279
+ }
2280
+ else if (this.bounceFrom < 0) {
2281
+ // bounce back down
2282
+ this.update(this.maxY, 100, true);
2283
+ this.emitColChange();
2284
+ return;
2285
+ }
2286
+ this.velocity = clamp(-MAX_PICKER_SPEED, detail.velocityY * 23, MAX_PICKER_SPEED);
2287
+ if (this.velocity === 0 && detail.deltaY === 0) {
2288
+ const opt = detail.event.target.closest('.picker-opt');
2289
+ if (opt === null || opt === void 0 ? void 0 : opt.hasAttribute('opt-index')) {
2290
+ this.setSelected(parseInt(opt.getAttribute('opt-index'), 10), TRANSITION_DURATION);
2291
+ }
2292
+ }
2293
+ else {
2294
+ this.y += detail.deltaY;
2295
+ if (Math.abs(detail.velocityY) < 0.05) {
2296
+ const isScrollingUp = detail.deltaY > 0;
2297
+ const optHeightFraction = (Math.abs(this.y) % this.optHeight) / this.optHeight;
2298
+ if (isScrollingUp && optHeightFraction > 0.5) {
2299
+ this.velocity = Math.abs(this.velocity) * -1;
2300
+ }
2301
+ else if (!isScrollingUp && optHeightFraction <= 0.5) {
2302
+ this.velocity = Math.abs(this.velocity);
2303
+ }
2304
+ }
2305
+ this.decelerate();
2306
+ }
2307
+ }
2308
+ refresh(forceRefresh, animated) {
2309
+ var _a;
2310
+ let min = this.col.options.length - 1;
2311
+ let max = 0;
2312
+ const options = this.col.options;
2313
+ for (let i = 0; i < options.length; i++) {
2314
+ if (!options[i].disabled) {
2315
+ min = Math.min(min, i);
2316
+ max = Math.max(max, i);
2317
+ }
2318
+ }
2319
+ /**
2320
+ * Only update selected value if column has a
2321
+ * velocity of 0. If it does not, then the
2322
+ * column is animating might land on
2323
+ * a value different than the value at
2324
+ * selectedIndex
2325
+ */
2326
+ if (this.velocity !== 0) {
2327
+ return;
2328
+ }
2329
+ const selectedIndex = clamp(min, (_a = this.col.selectedIndex) !== null && _a !== void 0 ? _a : 0, max);
2330
+ if (this.col.prevSelected !== selectedIndex || forceRefresh) {
2331
+ const y = selectedIndex * this.optHeight * -1;
2332
+ const duration = animated ? TRANSITION_DURATION : 0;
2333
+ this.velocity = 0;
2334
+ this.update(y, duration, true);
2335
+ }
2336
+ }
2337
+ onDomChange(forceRefresh, animated) {
2338
+ const colEl = this.optsEl;
2339
+ if (colEl) {
2340
+ // DOM READ
2341
+ // We perfom a DOM read over a rendered item, this needs to happen after the first render or after the the column has changed
2342
+ this.optHeight = colEl.firstElementChild ? colEl.firstElementChild.clientHeight : 0;
2343
+ }
2344
+ this.refresh(forceRefresh, animated);
2345
+ }
2346
+ render() {
2347
+ const col = this.col;
2348
+ const mode = getIonMode(this);
2349
+ return (h(Host, { class: Object.assign({ [mode]: true, 'picker-col': true, 'picker-opts-left': this.col.align === 'left', 'picker-opts-right': this.col.align === 'right' }, getClassMap(col.cssClass)), style: {
2350
+ 'max-width': this.col.columnWidth,
2351
+ } }, col.prefix && (h("div", { class: "picker-prefix", style: { width: col.prefixWidth } }, col.prefix)), h("div", { class: "picker-opts", style: { maxWidth: col.optionsWidth }, ref: (el) => (this.optsEl = el) }, col.options.map((o, index) => (h("button", { "aria-label": o.ariaLabel, class: { 'picker-opt': true, 'picker-opt-disabled': !!o.disabled }, "opt-index": index }, o.text)))), col.suffix && (h("div", { class: "picker-suffix", style: { width: col.suffixWidth } }, col.suffix))));
2352
+ }
2353
+ get el() { return getElement(this); }
2354
+ static get watchers() { return {
2355
+ "col": ["colChanged"]
2356
+ }; }
2315
2357
  };
2316
2358
  const PICKER_OPT_SELECTED = 'picker-opt-selected';
2317
2359
  const DECELERATION_FRICTION = 0.97;
2318
2360
  const MAX_PICKER_SPEED = 90;
2319
2361
  const TRANSITION_DURATION = 150;
2320
2362
  PickerColumnCmp.style = {
2321
- ios: pickerColumnIosCss,
2322
- md: pickerColumnMdCss
2363
+ ios: pickerColumnIosCss,
2364
+ md: pickerColumnMdCss
2323
2365
  };
2324
2366
 
2325
2367
  export { Datetime as ion_datetime, Picker as ion_picker, PickerColumnCmp as ion_picker_column };