@pod-os/elements 0.7.1-92705ee.0 → 0.7.1-a71f01c.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) hide show
  1. package/dist/cjs/{animation-5840e4df.js → animation-9bea118f.js} +115 -84
  2. package/dist/cjs/{app-globals-1aedd05c.js → app-globals-6352043e.js} +1 -1
  3. package/dist/cjs/{cubic-bezier-dcb7bfef.js → cubic-bezier-0b702a31.js} +13 -12
  4. package/dist/cjs/data-0c9489d7.js +1510 -0
  5. package/dist/cjs/dir-011f46ea.js +20 -0
  6. package/dist/cjs/elements.cjs.js +5 -5
  7. package/dist/cjs/focus-visible-2624ec15.js +76 -0
  8. package/dist/cjs/framework-delegate-437c0645.js +119 -0
  9. package/dist/cjs/{gesture-controller-fbbe9a65.js → gesture-controller-00a6b02f.js} +6 -2
  10. package/dist/cjs/{haptic-09e73337.js → haptic-7358cb0b.js} +37 -8
  11. package/dist/cjs/{hardware-back-button-01027575.js → hardware-back-button-25372ec7.js} +11 -8
  12. package/dist/cjs/{helpers-398ced09.js → helpers-cb08f5ae.js} +115 -15
  13. package/dist/cjs/{index-2067b305.js → index-1b07c737.js} +35 -24
  14. package/dist/cjs/{index-68ae43d2.js → index-2dc3637c.js} +34 -28
  15. package/dist/cjs/index-57b9fa9e.js +30 -0
  16. package/dist/cjs/{index-d01d9183.js → index-643851c6.js} +34 -19
  17. package/dist/cjs/index-731691ca.js +48 -0
  18. package/dist/cjs/{index-6bbae9b1.js → index-7d56774d.js} +12 -8
  19. package/dist/cjs/index-9fca5d6f.js +140 -0
  20. package/dist/cjs/index-b2a479e4.js +38 -0
  21. package/dist/cjs/{index-b4a9ece2.js → index-eaa0d16e.js} +7 -0
  22. package/dist/cjs/{tap-click-f24cb477.js → index-ed2ce04f.js} +37 -19
  23. package/dist/cjs/{input-shims-e959d9e2.js → input-shims-427999f7.js} +89 -38
  24. package/dist/cjs/ion-accordion-group.cjs.entry.js +205 -0
  25. package/dist/cjs/ion-accordion.cjs.entry.js +336 -0
  26. package/dist/cjs/ion-action-sheet_3.cjs.entry.js +865 -0
  27. package/dist/cjs/{ion-app_45.cjs.entry.js → ion-app_46.cjs.entry.js} +1906 -1492
  28. package/dist/cjs/ion-avatar.cjs.entry.js +2 -2
  29. package/dist/cjs/ion-back-button.cjs.entry.js +12 -11
  30. package/dist/cjs/ion-backdrop.cjs.entry.js +4 -4
  31. package/dist/cjs/ion-breadcrumb.cjs.entry.js +101 -0
  32. package/dist/cjs/ion-breadcrumbs.cjs.entry.js +137 -0
  33. package/dist/cjs/ion-buttons_3.cjs.entry.js +799 -0
  34. package/dist/cjs/ion-card-subtitle.cjs.entry.js +4 -4
  35. package/dist/cjs/{ion-list-header_3.cjs.entry.js → ion-checkbox_4.cjs.entry.js} +124 -23
  36. package/dist/cjs/ion-chip.cjs.entry.js +5 -10
  37. package/dist/cjs/ion-datetime-button.cjs.entry.js +346 -0
  38. package/dist/cjs/ion-datetime.cjs.entry.js +1548 -856
  39. package/dist/cjs/ion-fab-button.cjs.entry.js +26 -9
  40. package/dist/cjs/ion-fab-list.cjs.entry.js +4 -4
  41. package/dist/cjs/ion-fab.cjs.entry.js +15 -13
  42. package/dist/cjs/ion-img.cjs.entry.js +28 -4
  43. package/dist/cjs/ion-infinite-scroll-content.cjs.entry.js +5 -5
  44. package/dist/cjs/ion-infinite-scroll.cjs.entry.js +13 -13
  45. package/dist/cjs/ion-input.cjs.entry.js +57 -23
  46. package/dist/cjs/ion-item-option.cjs.entry.js +8 -8
  47. package/dist/cjs/ion-item-options.cjs.entry.js +5 -5
  48. package/dist/cjs/ion-item-sliding.cjs.entry.js +59 -63
  49. package/dist/cjs/ion-loading.cjs.entry.js +38 -37
  50. package/dist/cjs/ion-menu-button.cjs.entry.js +14 -12
  51. package/dist/cjs/ion-menu-toggle.cjs.entry.js +8 -7
  52. package/dist/cjs/ion-menu.cjs.entry.js +71 -57
  53. package/dist/cjs/ion-modal.cjs.entry.js +1386 -156
  54. package/dist/cjs/ion-nav-link.cjs.entry.js +5 -2
  55. package/dist/cjs/ion-nav.cjs.entry.js +177 -171
  56. package/dist/cjs/ion-picker-column.cjs.entry.js +25 -27
  57. package/dist/cjs/ion-picker.cjs.entry.js +22 -17
  58. package/dist/cjs/ion-popover.cjs.entry.js +1208 -182
  59. package/dist/cjs/ion-range.cjs.entry.js +137 -57
  60. package/dist/cjs/ion-refresher-content.cjs.entry.js +7 -12
  61. package/dist/cjs/ion-refresher.cjs.entry.js +150 -148
  62. package/dist/cjs/ion-reorder-group.cjs.entry.js +42 -35
  63. package/dist/cjs/ion-reorder.cjs.entry.js +5 -4
  64. package/dist/cjs/ion-route-redirect.cjs.entry.js +1 -1
  65. package/dist/cjs/ion-route.cjs.entry.js +1 -1
  66. package/dist/cjs/ion-router-link.cjs.entry.js +5 -5
  67. package/dist/cjs/ion-router-outlet.cjs.entry.js +24 -20
  68. package/dist/cjs/ion-router.cjs.entry.js +291 -194
  69. package/dist/cjs/ion-segment-button.cjs.entry.js +10 -17
  70. package/dist/cjs/ion-segment.cjs.entry.js +127 -26
  71. package/dist/cjs/ion-select-option.cjs.entry.js +3 -3
  72. package/dist/cjs/ion-select.cjs.entry.js +113 -78
  73. package/dist/cjs/ion-slide.cjs.entry.js +3 -3
  74. package/dist/cjs/ion-slides.cjs.entry.js +26 -27
  75. package/dist/cjs/ion-spinner.cjs.entry.js +10 -9
  76. package/dist/cjs/ion-split-pane.cjs.entry.js +16 -12
  77. package/dist/cjs/ion-tab-bar.cjs.entry.js +16 -23
  78. package/dist/cjs/ion-tab-button.cjs.entry.js +6 -6
  79. package/dist/cjs/ion-tab.cjs.entry.js +4 -4
  80. package/dist/cjs/ion-tabs.cjs.entry.js +4 -5
  81. package/dist/cjs/ion-text.cjs.entry.js +3 -3
  82. package/dist/cjs/ion-textarea.cjs.entry.js +31 -29
  83. package/dist/cjs/ion-thumbnail.cjs.entry.js +2 -2
  84. package/dist/cjs/ion-toast.cjs.entry.js +50 -60
  85. package/dist/cjs/ion-toggle.cjs.entry.js +41 -22
  86. package/dist/cjs/ion-virtual-scroll.cjs.entry.js +39 -31
  87. package/dist/cjs/{ionic-global-56e10eb5.js → ionic-global-f2d95fd3.js} +112 -93
  88. package/dist/cjs/{ios.transition-32e4623d.js → ios.transition-0f31ec9a.js} +78 -53
  89. package/dist/cjs/{keyboard-9e8103e4.js → keyboard-79afcba2.js} +6 -3
  90. package/dist/cjs/keyboard-controller-a934d106.js +42 -0
  91. package/dist/cjs/loader.cjs.js +5 -5
  92. package/dist/cjs/{md.transition-169c54f0.js → md.transition-d2a33a23.js} +15 -17
  93. package/dist/cjs/{menu-toggle-util-087678e0.js → menu-toggle-util-0a43ff7c.js} +5 -2
  94. package/dist/cjs/{overlays-49fe9ba7.js → overlays-f7d24abf.js} +190 -72
  95. package/dist/cjs/spinner-configs-cd0abbeb.js +147 -0
  96. package/dist/cjs/{status-tap-ada894ff.js → status-tap-beaa3a71.js} +10 -5
  97. package/dist/cjs/{swipe-back-c4a778df.js → swipe-back-666ea8e6.js} +34 -15
  98. package/dist/cjs/{theme-2259d0f5.js → theme-fc63803b.js} +9 -5
  99. package/dist/collection/collection-manifest.json +10 -4
  100. package/dist/collection/components/pos-rich-link/pos-rich-link.js +1 -1
  101. package/dist/components/ResourceAware.js +5 -0
  102. package/dist/components/action-sheet.js +309 -0
  103. package/dist/{esm/ion-alert.entry.js → components/alert.js} +150 -105
  104. package/dist/{esm/animation-fe6ed422.js → components/animation.js} +115 -84
  105. package/dist/components/app.js +112 -0
  106. package/dist/components/backdrop.js +82 -0
  107. package/dist/components/badge.js +42 -0
  108. package/dist/{esm/button-active-fd9d6d91.js → components/button-active.js} +9 -6
  109. package/dist/components/button.js +207 -0
  110. package/dist/{esm/ion-buttons.entry.js → components/buttons.js} +28 -12
  111. package/dist/components/card-content.js +40 -0
  112. package/dist/components/card-header.js +51 -0
  113. package/dist/components/card-title.js +43 -0
  114. package/dist/components/card.js +102 -0
  115. package/dist/{esm/ion-checkbox.entry.js → components/checkbox.js} +42 -24
  116. package/dist/components/col.js +161 -0
  117. package/dist/components/content.js +356 -0
  118. package/dist/{esm/cubic-bezier-108b8579.js → components/cubic-bezier.js} +13 -12
  119. package/dist/components/data.js +1463 -0
  120. package/dist/components/dir.js +18 -0
  121. package/dist/components/focus-visible.js +74 -0
  122. package/dist/components/footer.js +149 -0
  123. package/dist/components/framework-delegate.js +115 -0
  124. package/dist/{esm/gesture-controller-8f35af24.js → components/gesture-controller.js} +6 -2
  125. package/dist/components/grid.js +41 -0
  126. package/dist/{esm/haptic-c424e670.js → components/haptic.js} +38 -9
  127. package/dist/{esm/hardware-back-button-bb4c578a.js → components/hardware-back-button.js} +11 -8
  128. package/dist/components/header.js +360 -0
  129. package/dist/{esm/helpers-44e3bd9f.js → components/helpers.js} +113 -16
  130. package/dist/components/icon.js +367 -0
  131. package/dist/components/index.d.ts +41 -0
  132. package/dist/components/index.js +123 -0
  133. package/dist/components/index10.js +28 -0
  134. package/dist/{esm/tap-click-a7e55ef5.js → components/index11.js} +37 -19
  135. package/dist/components/index2.js +25 -0
  136. package/dist/{esm/index-8d682224.js → components/index3.js} +12 -8
  137. package/dist/components/index4.js +34 -0
  138. package/dist/components/index5.js +128 -0
  139. package/dist/{esm/index-97199683.js → components/index6.js} +34 -28
  140. package/dist/{esm/index-8a463a85.js → components/index7.js} +35 -24
  141. package/dist/{custom-elements/index.js → components/index8.js} +1049 -20945
  142. package/dist/{esm/index-3a1bd803.js → components/index9.js} +35 -20
  143. package/dist/{custom-elements → components}/input-shims.js +88 -38
  144. package/dist/components/ion-accordion-group.js +228 -0
  145. package/dist/components/ion-accordion.js +365 -0
  146. package/dist/components/ion-action-sheet.js +6 -0
  147. package/dist/components/ion-alert.js +6 -0
  148. package/dist/components/ion-app.js +6 -0
  149. package/dist/components/ion-avatar.js +39 -0
  150. package/dist/components/ion-back-button.js +128 -0
  151. package/dist/components/ion-backdrop.js +6 -0
  152. package/dist/components/ion-badge.js +6 -0
  153. package/dist/components/ion-breadcrumb.js +135 -0
  154. package/dist/components/ion-breadcrumbs.js +158 -0
  155. package/dist/components/ion-button.js +6 -0
  156. package/dist/components/ion-buttons.js +6 -0
  157. package/dist/components/ion-card-content.js +6 -0
  158. package/dist/components/ion-card-header.js +6 -0
  159. package/dist/components/ion-card-subtitle.js +46 -0
  160. package/dist/components/ion-card-title.js +6 -0
  161. package/dist/components/ion-card.js +6 -0
  162. package/dist/components/ion-checkbox.js +6 -0
  163. package/dist/components/ion-chip.js +59 -0
  164. package/dist/components/ion-col.js +6 -0
  165. package/dist/components/ion-content.js +6 -0
  166. package/dist/components/ion-datetime-button.js +375 -0
  167. package/dist/components/ion-datetime.js +1802 -0
  168. package/dist/components/ion-fab-button.js +149 -0
  169. package/dist/components/ion-fab-list.js +62 -0
  170. package/dist/components/ion-fab.js +97 -0
  171. package/dist/components/ion-footer.js +6 -0
  172. package/dist/components/ion-grid.js +6 -0
  173. package/dist/components/ion-header.js +6 -0
  174. package/dist/components/ion-icon.js +6 -0
  175. package/dist/components/ion-img.js +120 -0
  176. package/dist/components/ion-infinite-scroll-content.js +59 -0
  177. package/dist/components/ion-infinite-scroll.js +223 -0
  178. package/dist/components/ion-input.js +352 -0
  179. package/dist/components/ion-item-divider.js +6 -0
  180. package/dist/components/ion-item-group.js +6 -0
  181. package/dist/components/ion-item-option.js +89 -0
  182. package/dist/components/ion-item-options.js +63 -0
  183. package/dist/components/ion-item-sliding.js +419 -0
  184. package/dist/components/ion-item.js +6 -0
  185. package/dist/components/ion-label.js +6 -0
  186. package/dist/components/ion-list-header.js +6 -0
  187. package/dist/components/ion-list.js +6 -0
  188. package/dist/components/ion-loading.js +256 -0
  189. package/dist/components/ion-menu-button.js +107 -0
  190. package/dist/components/ion-menu-toggle.js +62 -0
  191. package/dist/components/ion-menu.js +611 -0
  192. package/dist/components/ion-modal.js +1765 -0
  193. package/dist/components/ion-nav-link.js +65 -0
  194. package/dist/components/ion-nav.js +905 -0
  195. package/dist/components/ion-note.js +6 -0
  196. package/dist/components/ion-picker-column-internal.js +6 -0
  197. package/dist/components/ion-picker-column.js +6 -0
  198. package/dist/components/ion-picker-internal.js +6 -0
  199. package/dist/components/ion-picker.js +263 -0
  200. package/dist/components/ion-popover.js +6 -0
  201. package/dist/components/ion-progress-bar.js +6 -0
  202. package/dist/components/ion-radio-group.js +6 -0
  203. package/dist/components/ion-radio.js +6 -0
  204. package/dist/components/ion-range.js +550 -0
  205. package/dist/components/ion-refresher-content.js +64 -0
  206. package/dist/components/ion-refresher.js +826 -0
  207. package/dist/components/ion-reorder-group.js +303 -0
  208. package/dist/components/ion-reorder.js +58 -0
  209. package/dist/components/ion-ripple-effect.js +6 -0
  210. package/dist/components/ion-route-redirect.js +40 -0
  211. package/dist/components/ion-route.js +68 -0
  212. package/dist/components/ion-router-link.js +59 -0
  213. package/dist/components/ion-router-outlet.js +223 -0
  214. package/dist/components/ion-router.js +852 -0
  215. package/dist/components/ion-row.js +6 -0
  216. package/dist/components/ion-searchbar.js +6 -0
  217. package/dist/components/ion-segment-button.js +128 -0
  218. package/dist/components/ion-segment.js +463 -0
  219. package/dist/components/ion-select-option.js +44 -0
  220. package/dist/components/ion-select-popover.js +6 -0
  221. package/dist/components/ion-select.js +596 -0
  222. package/dist/components/ion-skeleton-text.js +6 -0
  223. package/dist/components/ion-slide.js +38 -0
  224. package/dist/components/ion-slides.js +423 -0
  225. package/dist/components/ion-spinner.js +6 -0
  226. package/dist/components/ion-split-pane.js +179 -0
  227. package/dist/components/ion-tab-bar.js +86 -0
  228. package/dist/components/ion-tab-button.js +132 -0
  229. package/dist/components/ion-tab.js +86 -0
  230. package/dist/components/ion-tabs.js +176 -0
  231. package/dist/components/ion-text.js +40 -0
  232. package/dist/components/ion-textarea.js +287 -0
  233. package/dist/components/ion-thumbnail.js +34 -0
  234. package/dist/components/ion-title.js +6 -0
  235. package/dist/components/ion-toast.js +317 -0
  236. package/dist/components/ion-toggle.js +207 -0
  237. package/dist/components/ion-toolbar.js +6 -0
  238. package/dist/components/ion-virtual-scroll.js +588 -0
  239. package/dist/components/ionic-global.js +226 -0
  240. package/dist/{custom-elements → components}/ios.transition.js +75 -50
  241. package/dist/components/item-divider.js +54 -0
  242. package/dist/components/item-group.js +41 -0
  243. package/dist/components/item.js +323 -0
  244. package/dist/components/keyboard-controller.js +40 -0
  245. package/dist/{custom-elements → components}/keyboard.js +6 -3
  246. package/dist/components/label.js +95 -0
  247. package/dist/components/list-header.js +45 -0
  248. package/dist/components/list.js +66 -0
  249. package/dist/{custom-elements → components}/md.transition.js +12 -14
  250. package/dist/{esm/menu-toggle-util-562dfc9c.js → components/menu-toggle-util.js} +5 -2
  251. package/dist/components/note.js +42 -0
  252. package/dist/{esm/overlays-fc9a0625.js → components/overlays.js} +188 -72
  253. package/dist/components/picker-column-internal.js +315 -0
  254. package/dist/components/picker-column.js +343 -0
  255. package/dist/components/picker-internal.js +486 -0
  256. package/dist/components/popover.js +1440 -0
  257. package/dist/components/pos-app-browser.d.ts +11 -0
  258. package/dist/components/pos-app-browser.js +299 -0
  259. package/dist/components/pos-app-generic.d.ts +11 -0
  260. package/dist/components/pos-app-generic.js +6 -0
  261. package/dist/components/pos-app-generic2.js +194 -0
  262. package/dist/components/pos-app-image-viewer.d.ts +11 -0
  263. package/dist/components/pos-app-image-viewer.js +6 -0
  264. package/dist/components/pos-app-image-viewer2.js +162 -0
  265. package/dist/components/pos-app-rdf-document.d.ts +11 -0
  266. package/dist/components/pos-app-rdf-document.js +6 -0
  267. package/dist/components/pos-app-rdf-document2.js +170 -0
  268. package/dist/components/pos-app.d.ts +11 -0
  269. package/dist/components/pos-app.js +6 -0
  270. package/dist/components/pos-app2.js +53 -0
  271. package/dist/components/pos-description.d.ts +11 -0
  272. package/dist/components/pos-description.js +6 -0
  273. package/dist/components/pos-description2.js +38 -0
  274. package/dist/components/pos-image.d.ts +11 -0
  275. package/dist/components/pos-image.js +6 -0
  276. package/dist/components/pos-image2.js +117 -0
  277. package/dist/components/pos-label.d.ts +11 -0
  278. package/dist/components/pos-label.js +6 -0
  279. package/dist/components/pos-label2.js +38 -0
  280. package/dist/components/pos-literals.d.ts +11 -0
  281. package/dist/components/pos-literals.js +6 -0
  282. package/dist/components/pos-literals2.js +87 -0
  283. package/dist/components/pos-login.d.ts +11 -0
  284. package/dist/components/pos-login.js +6 -0
  285. package/dist/components/pos-login2.js +120 -0
  286. package/dist/components/pos-navigation-bar.d.ts +11 -0
  287. package/dist/components/pos-navigation-bar.js +6 -0
  288. package/dist/components/pos-navigation-bar2.js +52 -0
  289. package/dist/components/pos-picture.d.ts +11 -0
  290. package/dist/components/pos-picture.js +6 -0
  291. package/dist/components/pos-picture2.js +62 -0
  292. package/dist/components/pos-relations.d.ts +11 -0
  293. package/dist/components/pos-relations.js +6 -0
  294. package/dist/components/pos-relations2.js +135 -0
  295. package/dist/components/pos-resource.d.ts +11 -0
  296. package/dist/components/pos-resource.js +6 -0
  297. package/dist/components/pos-resource2.js +126 -0
  298. package/dist/components/pos-reverse-relations.d.ts +11 -0
  299. package/dist/components/pos-reverse-relations.js +6 -0
  300. package/dist/components/pos-reverse-relations2.js +135 -0
  301. package/dist/components/pos-rich-link.d.ts +11 -0
  302. package/dist/components/pos-rich-link.js +6 -0
  303. package/dist/components/pos-rich-link2.js +106 -0
  304. package/dist/components/pos-router.d.ts +11 -0
  305. package/dist/components/pos-router.js +6 -0
  306. package/dist/components/pos-router2.js +813 -0
  307. package/dist/components/pos-subjects.d.ts +11 -0
  308. package/dist/components/pos-subjects.js +6 -0
  309. package/dist/components/pos-subjects2.js +125 -0
  310. package/dist/components/pos-type-badges.d.ts +11 -0
  311. package/dist/components/pos-type-badges.js +6 -0
  312. package/dist/components/pos-type-badges2.js +69 -0
  313. package/dist/components/pos-type-router.d.ts +11 -0
  314. package/dist/components/pos-type-router.js +6 -0
  315. package/dist/components/pos-type-router2.js +241 -0
  316. package/dist/components/progress-bar.js +91 -0
  317. package/dist/components/radio-group.js +139 -0
  318. package/dist/components/radio.js +135 -0
  319. package/dist/components/ripple-effect.js +107 -0
  320. package/dist/components/row.js +31 -0
  321. package/dist/components/searchbar.js +412 -0
  322. package/dist/components/select-popover.js +174 -0
  323. package/dist/components/session.js +202 -0
  324. package/dist/components/skeleton-text.js +46 -0
  325. package/dist/components/spinner.js +224 -0
  326. package/dist/{custom-elements → components}/status-tap.js +8 -4
  327. package/dist/{custom-elements → components}/swipe-back.js +33 -13
  328. package/dist/{custom-elements → components}/swiper.bundle.js +0 -0
  329. package/dist/{esm/theme-d21826a7.js → components/theme.js} +9 -5
  330. package/dist/components/title.js +66 -0
  331. package/dist/components/toolbar.js +87 -0
  332. package/dist/elements/elements.css +1 -1
  333. package/dist/elements/elements.esm.js +1 -1
  334. package/dist/elements/p-00f19b1d.js +4 -0
  335. package/dist/elements/p-0587332d.entry.js +1 -0
  336. package/dist/elements/p-07f54139.entry.js +7 -0
  337. package/dist/elements/{p-cfc0e54d.js → p-0991c811.js} +3 -0
  338. package/dist/elements/p-0a69a563.entry.js +1 -0
  339. package/dist/elements/p-0d284fe0.entry.js +1 -0
  340. package/dist/elements/p-116437b0.entry.js +13 -0
  341. package/dist/elements/p-12880671.entry.js +1 -0
  342. package/dist/elements/p-14ccd586.entry.js +1 -0
  343. package/dist/elements/{p-83d45051.entry.js → p-14df6ac0.entry.js} +1 -1
  344. package/dist/elements/{p-e860be6a.entry.js → p-17079f06.entry.js} +1 -1
  345. package/dist/elements/p-19e4a688.js +4 -0
  346. package/dist/elements/p-1afc4eb4.js +4 -0
  347. package/dist/elements/p-1beaf6bf.js +4 -0
  348. package/dist/elements/p-1d1c6a6f.entry.js +1 -0
  349. package/dist/elements/{p-31d30e42.entry.js → p-1d98f84b.entry.js} +1 -1
  350. package/dist/elements/p-1e617706.entry.js +7 -0
  351. package/dist/elements/p-278ca4c9.js +4 -0
  352. package/dist/elements/p-27f5629c.entry.js +1 -0
  353. package/dist/elements/p-29c0f03f.js +4 -0
  354. package/dist/elements/p-2a629468.entry.js +4 -0
  355. package/dist/elements/p-2da59aca.js +4 -0
  356. package/dist/elements/p-3152143f.js +4 -0
  357. package/dist/elements/p-343ff720.entry.js +7 -0
  358. package/dist/elements/p-36d4c9a8.js +4 -0
  359. package/dist/elements/p-3a30dfb2.entry.js +1 -0
  360. package/dist/elements/p-3c013bf1.entry.js +1 -0
  361. package/dist/elements/{p-74ba1e42.entry.js → p-3c318da5.entry.js} +1 -1
  362. package/dist/elements/p-3cee3222.entry.js +1 -0
  363. package/dist/elements/p-3d0f59af.entry.js +7 -0
  364. package/dist/elements/p-41cb5688.entry.js +1 -0
  365. package/dist/elements/p-480b3c4f.entry.js +1 -0
  366. package/dist/elements/p-4e9d8f18.entry.js +1 -0
  367. package/dist/elements/p-53e23176.js +2 -0
  368. package/dist/elements/p-548524f3.js +4 -0
  369. package/dist/elements/p-5739fa41.entry.js +1 -0
  370. package/dist/elements/p-5808c505.js +1 -0
  371. package/dist/elements/p-58a8cc2a.js +4 -0
  372. package/dist/elements/p-6035415e.entry.js +1 -0
  373. package/dist/elements/p-60eeae90.js +4 -0
  374. package/dist/elements/p-667550a9.entry.js +14 -0
  375. package/dist/elements/p-67777478.entry.js +1 -0
  376. package/dist/elements/p-6ab826e1.entry.js +1 -0
  377. package/dist/elements/p-6f5a2827.entry.js +1 -0
  378. package/dist/elements/p-7916ecc5.entry.js +1 -0
  379. package/dist/elements/p-79f06b80.entry.js +1 -0
  380. package/dist/elements/p-7d0def79.js +5 -0
  381. package/dist/elements/p-8112afea.js +4 -0
  382. package/dist/elements/p-83678d7d.entry.js +4 -0
  383. package/dist/elements/p-87e45c94.entry.js +1 -0
  384. package/dist/elements/p-8f80768f.entry.js +4 -0
  385. package/dist/elements/p-8fe0433b.js +4 -0
  386. package/dist/elements/{p-4cb27b48.entry.js → p-9147d82b.entry.js} +1 -1
  387. package/dist/elements/p-96aeb07a.entry.js +1 -0
  388. package/dist/elements/p-97abb434.entry.js +1 -0
  389. package/dist/elements/p-98497a4b.entry.js +1 -0
  390. package/dist/elements/p-9c719139.js +4 -0
  391. package/dist/elements/p-9ca37332.js +4 -0
  392. package/dist/elements/{p-37de7110.js → p-9d48def2.js} +3 -0
  393. package/dist/elements/p-a805f2f9.entry.js +1 -0
  394. package/dist/elements/p-a86a5bfa.entry.js +1 -0
  395. package/dist/elements/{p-9c1dbe52.entry.js → p-ac34eab7.entry.js} +1 -1
  396. package/dist/elements/p-ad366eab.entry.js +4 -0
  397. package/dist/elements/p-aef3a931.js +7 -0
  398. package/dist/elements/p-b0537eb3.entry.js +1 -0
  399. package/dist/elements/p-b41e66f0.entry.js +1 -0
  400. package/dist/elements/p-b47e7091.entry.js +1 -0
  401. package/dist/elements/p-b840320e.js +4 -0
  402. package/dist/elements/p-b934ac5d.entry.js +1 -0
  403. package/dist/elements/p-bc63f4b6.entry.js +1 -0
  404. package/dist/elements/p-bd12806f.entry.js +1 -0
  405. package/dist/elements/p-bf90022d.entry.js +4 -0
  406. package/dist/elements/p-c16d38d5.js +4 -0
  407. package/dist/elements/p-c84205a3.js +4 -0
  408. package/dist/elements/{p-06675ac7.entry.js → p-cbe318f8.entry.js} +1 -1
  409. package/dist/elements/p-cfed7395.js +4 -0
  410. package/dist/elements/p-d3e75c94.entry.js +1 -0
  411. package/dist/elements/p-d8e7ebf4.entry.js +7 -0
  412. package/dist/elements/p-d9880221.entry.js +4 -0
  413. package/dist/elements/p-da5db8fb.entry.js +1 -0
  414. package/dist/elements/{p-91fe653f.js → p-dcc6b03c.js} +3 -0
  415. package/dist/elements/{p-305e246c.entry.js → p-dd846020.entry.js} +1 -1
  416. package/dist/elements/p-dffd8689.js +4 -0
  417. package/dist/elements/p-e3bcb6e8.entry.js +1 -0
  418. package/dist/elements/p-e495a095.js +4 -0
  419. package/dist/elements/p-e59d9789.entry.js +1 -0
  420. package/dist/elements/p-e5fc7d42.entry.js +1 -0
  421. package/dist/elements/{p-aaa8393e.entry.js → p-eb137e9d.entry.js} +1 -1
  422. package/dist/elements/p-f4e54a17.js +7 -0
  423. package/dist/elements/p-f67d0717.entry.js +1 -0
  424. package/dist/elements/p-f7f4c640.js +1 -0
  425. package/dist/elements/p-f851b91a.js +4 -0
  426. package/dist/elements/p-fb27ee76.entry.js +1 -0
  427. package/dist/elements/p-fbddca35.entry.js +1 -0
  428. package/dist/elements/p-fdac5f3a.js +4 -0
  429. package/dist/elements/p-feb0cea8.entry.js +4 -0
  430. package/dist/esm/animation-801a007a.js +986 -0
  431. package/dist/esm/{app-globals-27d92837.js → app-globals-05a3abfb.js} +1 -1
  432. package/dist/esm/cubic-bezier-538b6253.js +90 -0
  433. package/dist/esm/data-62c81c24.js +1463 -0
  434. package/dist/esm/dir-defb16c6.js +18 -0
  435. package/dist/esm/elements.js +5 -5
  436. package/dist/esm/focus-visible-78d55799.js +74 -0
  437. package/dist/esm/framework-delegate-7e2b767b.js +115 -0
  438. package/dist/esm/gesture-controller-c466ff14.js +195 -0
  439. package/dist/esm/haptic-e7d5ef4d.js +135 -0
  440. package/dist/esm/hardware-back-button-242191a7.js +71 -0
  441. package/dist/esm/helpers-aeff219b.js +410 -0
  442. package/dist/esm/index-0dbaca1a.js +28 -0
  443. package/dist/esm/index-1f3d8582.js +34 -0
  444. package/dist/esm/index-2be9a18b.js +312 -0
  445. package/dist/esm/index-51e4a829.js +137 -0
  446. package/dist/esm/index-6048aed6.js +224 -0
  447. package/dist/esm/index-65ecd543.js +25 -0
  448. package/dist/{custom-elements/tap-click.js → esm/index-b212db1c.js} +37 -19
  449. package/dist/esm/{index-e4deec27.js → index-cb938ffb.js} +7 -1
  450. package/dist/esm/index-d39eb62b.js +463 -0
  451. package/dist/esm/index-ebf7f059.js +128 -0
  452. package/dist/esm/{input-shims-3b48722f.js → input-shims-8a389148.js} +89 -38
  453. package/dist/esm/ion-accordion-group.entry.js +201 -0
  454. package/dist/esm/ion-accordion.entry.js +332 -0
  455. package/dist/esm/ion-action-sheet_3.entry.js +859 -0
  456. package/dist/esm/{ion-app_45.entry.js → ion-app_46.entry.js} +1906 -1493
  457. package/dist/esm/ion-avatar.entry.js +2 -2
  458. package/dist/esm/ion-back-button.entry.js +12 -11
  459. package/dist/esm/ion-backdrop.entry.js +4 -4
  460. package/dist/esm/ion-breadcrumb.entry.js +97 -0
  461. package/dist/esm/ion-breadcrumbs.entry.js +133 -0
  462. package/dist/esm/ion-buttons_3.entry.js +793 -0
  463. package/dist/esm/ion-card-subtitle.entry.js +4 -4
  464. package/dist/esm/{ion-list-header_3.entry.js → ion-checkbox_4.entry.js} +124 -24
  465. package/dist/esm/ion-chip.entry.js +5 -10
  466. package/dist/esm/ion-datetime-button.entry.js +342 -0
  467. package/dist/esm/ion-datetime.entry.js +1548 -856
  468. package/dist/esm/ion-fab-button.entry.js +26 -9
  469. package/dist/esm/ion-fab-list.entry.js +4 -4
  470. package/dist/esm/ion-fab.entry.js +15 -13
  471. package/dist/esm/ion-img.entry.js +28 -4
  472. package/dist/esm/ion-infinite-scroll-content.entry.js +5 -5
  473. package/dist/esm/ion-infinite-scroll.entry.js +13 -13
  474. package/dist/esm/ion-input.entry.js +57 -23
  475. package/dist/esm/ion-item-option.entry.js +8 -8
  476. package/dist/esm/ion-item-options.entry.js +5 -5
  477. package/dist/esm/ion-item-sliding.entry.js +59 -63
  478. package/dist/esm/ion-loading.entry.js +38 -37
  479. package/dist/esm/ion-menu-button.entry.js +14 -12
  480. package/dist/esm/ion-menu-toggle.entry.js +8 -7
  481. package/dist/esm/ion-menu.entry.js +71 -57
  482. package/dist/esm/ion-modal.entry.js +1377 -147
  483. package/dist/esm/ion-nav-link.entry.js +5 -2
  484. package/dist/esm/ion-nav.entry.js +177 -171
  485. package/dist/esm/ion-picker-column.entry.js +25 -27
  486. package/dist/esm/ion-picker.entry.js +22 -17
  487. package/dist/esm/ion-popover.entry.js +1208 -182
  488. package/dist/esm/ion-range.entry.js +137 -57
  489. package/dist/esm/ion-refresher-content.entry.js +7 -12
  490. package/dist/esm/ion-refresher.entry.js +149 -147
  491. package/dist/esm/ion-reorder-group.entry.js +42 -35
  492. package/dist/esm/ion-reorder.entry.js +5 -4
  493. package/dist/esm/ion-route-redirect.entry.js +1 -1
  494. package/dist/esm/ion-route.entry.js +1 -1
  495. package/dist/esm/ion-router-link.entry.js +5 -5
  496. package/dist/esm/ion-router-outlet.entry.js +24 -20
  497. package/dist/esm/ion-router.entry.js +291 -194
  498. package/dist/esm/ion-segment-button.entry.js +10 -17
  499. package/dist/esm/ion-segment.entry.js +127 -26
  500. package/dist/esm/ion-select-option.entry.js +3 -3
  501. package/dist/esm/ion-select.entry.js +113 -78
  502. package/dist/esm/ion-slide.entry.js +3 -3
  503. package/dist/esm/ion-slides.entry.js +26 -27
  504. package/dist/esm/ion-spinner.entry.js +10 -9
  505. package/dist/esm/ion-split-pane.entry.js +16 -12
  506. package/dist/esm/ion-tab-bar.entry.js +16 -23
  507. package/dist/esm/ion-tab-button.entry.js +6 -6
  508. package/dist/esm/ion-tab.entry.js +4 -4
  509. package/dist/esm/ion-tabs.entry.js +4 -5
  510. package/dist/esm/ion-text.entry.js +3 -3
  511. package/dist/esm/ion-textarea.entry.js +31 -29
  512. package/dist/esm/ion-thumbnail.entry.js +2 -2
  513. package/dist/esm/ion-toast.entry.js +50 -60
  514. package/dist/esm/ion-toggle.entry.js +41 -22
  515. package/dist/esm/ion-virtual-scroll.entry.js +39 -31
  516. package/dist/esm/{ionic-global-2e28f7c7.js → ionic-global-6cd57191.js} +112 -93
  517. package/dist/esm/{ios.transition-a783e3cd.js → ios.transition-bbd952f2.js} +78 -53
  518. package/dist/esm/{keyboard-e6abcb80.js → keyboard-413afe04.js} +6 -3
  519. package/dist/esm/keyboard-controller-33693bc2.js +40 -0
  520. package/dist/esm/loader.js +5 -5
  521. package/dist/esm/{md.transition-5a4a8c82.js → md.transition-5170a6d3.js} +15 -17
  522. package/dist/esm/menu-toggle-util-82bf888a.js +12 -0
  523. package/dist/esm/overlays-bd4abb68.js +502 -0
  524. package/dist/esm/spinner-configs-cbcd1f62.js +145 -0
  525. package/dist/esm/{status-tap-69e62ad6.js → status-tap-ad757b8a.js} +10 -5
  526. package/dist/esm/swipe-back-7ef22876.js +69 -0
  527. package/dist/esm/theme-7cf2cab0.js +43 -0
  528. package/dist/types/components.d.ts +0 -13
  529. package/package.json +7 -8
  530. package/dist/cjs/button-active-c14dab31.js +0 -66
  531. package/dist/cjs/focus-visible-16c98640.js +0 -45
  532. package/dist/cjs/framework-delegate-c45292a3.js +0 -37
  533. package/dist/cjs/ion-action-sheet.cjs.entry.js +0 -265
  534. package/dist/cjs/ion-alert.cjs.entry.js +0 -456
  535. package/dist/cjs/ion-buttons.cjs.entry.js +0 -42
  536. package/dist/cjs/ion-checkbox.cjs.entry.js +0 -117
  537. package/dist/cjs/ion-note.cjs.entry.js +0 -29
  538. package/dist/cjs/ion-select-popover.cjs.entry.js +0 -35
  539. package/dist/cjs/spinner-configs-fb16b986.js +0 -112
  540. package/dist/cjs/test-component.cjs.entry.js +0 -13
  541. package/dist/collection/test/TestComponent.js +0 -3
  542. package/dist/collection/test/mockPodOS.js +0 -35
  543. package/dist/collection/test/renderFunctionalComponent.js +0 -8
  544. package/dist/custom-elements/focus-visible.js +0 -43
  545. package/dist/custom-elements/index.d.ts +0 -165
  546. package/dist/elements/p-03bda390.js +0 -1
  547. package/dist/elements/p-0be044f1.entry.js +0 -1
  548. package/dist/elements/p-119c7c6c.entry.js +0 -1
  549. package/dist/elements/p-14c7c3ea.entry.js +0 -1
  550. package/dist/elements/p-1d4a2c61.js +0 -1
  551. package/dist/elements/p-1d894ac4.entry.js +0 -1
  552. package/dist/elements/p-1dafa1ce.entry.js +0 -1
  553. package/dist/elements/p-23b89ccb.entry.js +0 -1
  554. package/dist/elements/p-2c03b9ab.entry.js +0 -1
  555. package/dist/elements/p-346985f2.js +0 -1
  556. package/dist/elements/p-360f1c62.entry.js +0 -1
  557. package/dist/elements/p-373e1f25.entry.js +0 -1
  558. package/dist/elements/p-40547acb.entry.js +0 -1
  559. package/dist/elements/p-40b68014.entry.js +0 -1
  560. package/dist/elements/p-42e4f702.entry.js +0 -1
  561. package/dist/elements/p-489807e5.js +0 -1
  562. package/dist/elements/p-4ad72d54.entry.js +0 -1
  563. package/dist/elements/p-4cca7b5e.entry.js +0 -1
  564. package/dist/elements/p-4f24d306.js +0 -1
  565. package/dist/elements/p-519d6a53.entry.js +0 -1
  566. package/dist/elements/p-536e8e52.entry.js +0 -1
  567. package/dist/elements/p-599bb53f.entry.js +0 -1
  568. package/dist/elements/p-5eb7a546.js +0 -1
  569. package/dist/elements/p-60df2bed.entry.js +0 -1
  570. package/dist/elements/p-65133e33.js +0 -1
  571. package/dist/elements/p-6693fce8.js +0 -1
  572. package/dist/elements/p-689bdcc1.entry.js +0 -1
  573. package/dist/elements/p-70713b3d.entry.js +0 -1
  574. package/dist/elements/p-707d5d76.js +0 -1
  575. package/dist/elements/p-7212b7f2.js +0 -1
  576. package/dist/elements/p-73992898.entry.js +0 -1
  577. package/dist/elements/p-792c1e0f.entry.js +0 -1
  578. package/dist/elements/p-7e5300af.js +0 -2
  579. package/dist/elements/p-8068987c.entry.js +0 -1
  580. package/dist/elements/p-83accf46.entry.js +0 -1
  581. package/dist/elements/p-86635d06.entry.js +0 -1
  582. package/dist/elements/p-874c2b44.js +0 -1
  583. package/dist/elements/p-89c12ce8.entry.js +0 -1
  584. package/dist/elements/p-8bcba3f7.entry.js +0 -1
  585. package/dist/elements/p-8c759f51.entry.js +0 -1
  586. package/dist/elements/p-8f945e6b.entry.js +0 -1
  587. package/dist/elements/p-9300ab6a.js +0 -1
  588. package/dist/elements/p-93cacd51.entry.js +0 -1
  589. package/dist/elements/p-9408d0b4.entry.js +0 -1
  590. package/dist/elements/p-98c79eda.js +0 -1
  591. package/dist/elements/p-99f8abed.js +0 -1
  592. package/dist/elements/p-9ca7e079.js +0 -1
  593. package/dist/elements/p-a4648b74.entry.js +0 -1
  594. package/dist/elements/p-aab0f63c.js +0 -1
  595. package/dist/elements/p-ad4e2295.entry.js +0 -1
  596. package/dist/elements/p-afb8f7d5.entry.js +0 -1
  597. package/dist/elements/p-b055ec44.js +0 -1
  598. package/dist/elements/p-b078d63b.entry.js +0 -1
  599. package/dist/elements/p-b3460325.entry.js +0 -1
  600. package/dist/elements/p-b5406b58.entry.js +0 -1
  601. package/dist/elements/p-b5ef0c91.entry.js +0 -1
  602. package/dist/elements/p-b6ba623e.entry.js +0 -1
  603. package/dist/elements/p-b9926d8b.entry.js +0 -1
  604. package/dist/elements/p-bfd4cfcd.entry.js +0 -1
  605. package/dist/elements/p-c08dd7d0.entry.js +0 -1
  606. package/dist/elements/p-c0db9c51.entry.js +0 -1
  607. package/dist/elements/p-c1e7fbfb.js +0 -1
  608. package/dist/elements/p-ca69d6c9.js +0 -1
  609. package/dist/elements/p-cc4cb1ac.entry.js +0 -1
  610. package/dist/elements/p-cf8a7031.entry.js +0 -1
  611. package/dist/elements/p-cff82b6f.js +0 -1
  612. package/dist/elements/p-d01009b8.entry.js +0 -67
  613. package/dist/elements/p-d6d1e65f.entry.js +0 -1
  614. package/dist/elements/p-d9462b66.entry.js +0 -1
  615. package/dist/elements/p-e2e0fee9.entry.js +0 -1
  616. package/dist/elements/p-e642b266.entry.js +0 -1
  617. package/dist/elements/p-e953934f.entry.js +0 -1
  618. package/dist/elements/p-f0474f46.js +0 -1
  619. package/dist/elements/p-f10a94f6.entry.js +0 -1
  620. package/dist/elements/p-f2426182.entry.js +0 -1
  621. package/dist/elements/p-f327fd21.js +0 -1
  622. package/dist/elements/p-f84987ee.js +0 -1
  623. package/dist/elements/p-f8a3367d.entry.js +0 -1
  624. package/dist/esm/focus-visible-edb28f19.js +0 -43
  625. package/dist/esm/framework-delegate-9cd8048f.js +0 -34
  626. package/dist/esm/ion-action-sheet.entry.js +0 -261
  627. package/dist/esm/ion-note.entry.js +0 -25
  628. package/dist/esm/ion-select-popover.entry.js +0 -31
  629. package/dist/esm/spinner-configs-aaf2a1a9.js +0 -110
  630. package/dist/esm/swipe-back-d84cfc8a.js +0 -50
  631. package/dist/esm/test-component.entry.js +0 -9
  632. package/dist/types/test/TestComponent.d.ts +0 -2
  633. package/dist/types/test/mockPodOS.d.ts +0 -11
  634. package/dist/types/test/renderFunctionalComponent.d.ts +0 -1
@@ -2,250 +2,974 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const index = require('./index-b4a9ece2.js');
6
- const ionicGlobal = require('./ionic-global-56e10eb5.js');
7
- const frameworkDelegate = require('./framework-delegate-c45292a3.js');
8
- const overlays = require('./overlays-49fe9ba7.js');
9
- const theme = require('./theme-2259d0f5.js');
10
- const index$1 = require('./index-2067b305.js');
11
- const animation = require('./animation-5840e4df.js');
12
- require('./helpers-398ced09.js');
13
- require('./hardware-back-button-01027575.js');
5
+ const index = require('./index-eaa0d16e.js');
6
+ const ionicGlobal = require('./ionic-global-f2d95fd3.js');
7
+ const frameworkDelegate = require('./framework-delegate-437c0645.js');
8
+ const helpers = require('./helpers-cb08f5ae.js');
9
+ const overlays = require('./overlays-f7d24abf.js');
10
+ const theme = require('./theme-fc63803b.js');
11
+ const index$1 = require('./index-1b07c737.js');
12
+ const animation = require('./animation-9bea118f.js');
13
+ require('./hardware-back-button-25372ec7.js');
14
+ require('./index-57b9fa9e.js');
14
15
 
16
+ /*!
17
+ * (C) Ionic http://ionicframework.com - MIT License
18
+ */
15
19
  /**
16
- * iOS Popover Enter Animation
20
+ * Returns the dimensions of the popover
21
+ * arrow on `ios` mode. If arrow is disabled
22
+ * returns (0, 0).
17
23
  */
18
- const iosEnterAnimation = (baseEl, ev) => {
19
- let originY = 'top';
20
- let originX = 'left';
21
- const contentEl = baseEl.querySelector('.popover-content');
24
+ const getArrowDimensions = (arrowEl) => {
25
+ if (!arrowEl) {
26
+ return { arrowWidth: 0, arrowHeight: 0 };
27
+ }
28
+ const { width, height } = arrowEl.getBoundingClientRect();
29
+ return { arrowWidth: width, arrowHeight: height };
30
+ };
31
+ /**
32
+ * Returns the recommended dimensions of the popover
33
+ * that takes into account whether or not the width
34
+ * should match the trigger width.
35
+ */
36
+ const getPopoverDimensions = (size, contentEl, triggerEl) => {
22
37
  const contentDimentions = contentEl.getBoundingClientRect();
23
- const contentWidth = contentDimentions.width;
24
38
  const contentHeight = contentDimentions.height;
25
- const bodyWidth = baseEl.ownerDocument.defaultView.innerWidth;
26
- const bodyHeight = baseEl.ownerDocument.defaultView.innerHeight;
27
- // If ev was passed, use that for target element
28
- const targetDim = ev && ev.target && ev.target.getBoundingClientRect();
29
- const targetTop = targetDim != null && 'top' in targetDim ? targetDim.top : bodyHeight / 2 - contentHeight / 2;
30
- const targetLeft = targetDim != null && 'left' in targetDim ? targetDim.left : bodyWidth / 2;
31
- const targetWidth = (targetDim && targetDim.width) || 0;
32
- const targetHeight = (targetDim && targetDim.height) || 0;
33
- const arrowEl = baseEl.querySelector('.popover-arrow');
34
- const arrowDim = arrowEl.getBoundingClientRect();
35
- const arrowWidth = arrowDim.width;
36
- const arrowHeight = arrowDim.height;
37
- if (targetDim == null) {
38
- arrowEl.style.display = 'none';
39
- }
40
- const arrowCSS = {
41
- top: targetTop + targetHeight,
42
- left: targetLeft + targetWidth / 2 - arrowWidth / 2
39
+ let contentWidth = contentDimentions.width;
40
+ if (size === 'cover' && triggerEl) {
41
+ const triggerDimensions = triggerEl.getBoundingClientRect();
42
+ contentWidth = triggerDimensions.width;
43
+ }
44
+ return {
45
+ contentWidth,
46
+ contentHeight,
47
+ };
48
+ };
49
+ const configureDismissInteraction = (triggerEl, triggerAction, popoverEl, parentPopoverEl) => {
50
+ let dismissCallbacks = [];
51
+ const root = helpers.getElementRoot(parentPopoverEl);
52
+ const parentContentEl = root.querySelector('.popover-content');
53
+ switch (triggerAction) {
54
+ case 'hover':
55
+ dismissCallbacks = [
56
+ {
57
+ /**
58
+ * Do not use mouseover here
59
+ * as this will causes the event to
60
+ * be dispatched on each underlying
61
+ * element rather than on the popover
62
+ * content as a whole.
63
+ */
64
+ eventName: 'mouseenter',
65
+ callback: (ev) => {
66
+ /**
67
+ * Do not dismiss the popover is we
68
+ * are hovering over its trigger.
69
+ * This would be easier if we used mouseover
70
+ * but this would cause the event to be dispatched
71
+ * more often than we would like, potentially
72
+ * causing performance issues.
73
+ */
74
+ const element = document.elementFromPoint(ev.clientX, ev.clientY);
75
+ if (element === triggerEl) {
76
+ return;
77
+ }
78
+ popoverEl.dismiss(undefined, undefined, false);
79
+ },
80
+ },
81
+ ];
82
+ break;
83
+ case 'context-menu':
84
+ case 'click':
85
+ default:
86
+ dismissCallbacks = [
87
+ {
88
+ eventName: 'click',
89
+ callback: (ev) => {
90
+ /**
91
+ * Do not dismiss the popover is we
92
+ * are hovering over its trigger.
93
+ */
94
+ const target = ev.target;
95
+ const closestTrigger = target.closest('[data-ion-popover-trigger]');
96
+ if (closestTrigger === triggerEl) {
97
+ /**
98
+ * stopPropagation here so if the
99
+ * popover has dismissOnSelect="true"
100
+ * the popover does not dismiss since
101
+ * we just clicked a trigger element.
102
+ */
103
+ ev.stopPropagation();
104
+ return;
105
+ }
106
+ popoverEl.dismiss(undefined, undefined, false);
107
+ },
108
+ },
109
+ ];
110
+ break;
111
+ }
112
+ dismissCallbacks.forEach(({ eventName, callback }) => parentContentEl.addEventListener(eventName, callback));
113
+ return () => {
114
+ dismissCallbacks.forEach(({ eventName, callback }) => parentContentEl.removeEventListener(eventName, callback));
115
+ };
116
+ };
117
+ /**
118
+ * Configures the triggerEl to respond
119
+ * to user interaction based upon the triggerAction
120
+ * prop that devs have defined.
121
+ */
122
+ const configureTriggerInteraction = (triggerEl, triggerAction, popoverEl) => {
123
+ let triggerCallbacks = [];
124
+ /**
125
+ * Based upon the kind of trigger interaction
126
+ * the user wants, we setup the correct event
127
+ * listeners.
128
+ */
129
+ switch (triggerAction) {
130
+ case 'hover':
131
+ let hoverTimeout;
132
+ triggerCallbacks = [
133
+ {
134
+ eventName: 'mouseenter',
135
+ callback: async (ev) => {
136
+ ev.stopPropagation();
137
+ if (hoverTimeout) {
138
+ clearTimeout(hoverTimeout);
139
+ }
140
+ /**
141
+ * Hovering over a trigger should not
142
+ * immediately open the next popover.
143
+ */
144
+ hoverTimeout = setTimeout(() => {
145
+ helpers.raf(() => {
146
+ popoverEl.presentFromTrigger(ev);
147
+ hoverTimeout = undefined;
148
+ });
149
+ }, 100);
150
+ },
151
+ },
152
+ {
153
+ eventName: 'mouseleave',
154
+ callback: (ev) => {
155
+ if (hoverTimeout) {
156
+ clearTimeout(hoverTimeout);
157
+ }
158
+ /**
159
+ * If mouse is over another popover
160
+ * that is not this popover then we should
161
+ * close this popover.
162
+ */
163
+ const target = ev.relatedTarget;
164
+ if (!target) {
165
+ return;
166
+ }
167
+ if (target.closest('ion-popover') !== popoverEl) {
168
+ popoverEl.dismiss(undefined, undefined, false);
169
+ }
170
+ },
171
+ },
172
+ {
173
+ /**
174
+ * stopPropagation here prevents the popover
175
+ * from dismissing when dismiss-on-select="true".
176
+ */
177
+ eventName: 'click',
178
+ callback: (ev) => ev.stopPropagation(),
179
+ },
180
+ {
181
+ eventName: 'ionPopoverActivateTrigger',
182
+ callback: (ev) => popoverEl.presentFromTrigger(ev, true),
183
+ },
184
+ ];
185
+ break;
186
+ case 'context-menu':
187
+ triggerCallbacks = [
188
+ {
189
+ eventName: 'contextmenu',
190
+ callback: (ev) => {
191
+ /**
192
+ * Prevents the platform context
193
+ * menu from appearing.
194
+ */
195
+ ev.preventDefault();
196
+ popoverEl.presentFromTrigger(ev);
197
+ },
198
+ },
199
+ {
200
+ eventName: 'click',
201
+ callback: (ev) => ev.stopPropagation(),
202
+ },
203
+ {
204
+ eventName: 'ionPopoverActivateTrigger',
205
+ callback: (ev) => popoverEl.presentFromTrigger(ev, true),
206
+ },
207
+ ];
208
+ break;
209
+ case 'click':
210
+ default:
211
+ triggerCallbacks = [
212
+ {
213
+ /**
214
+ * Do not do a stopPropagation() here
215
+ * because if you had two click triggers
216
+ * then clicking the first trigger and then
217
+ * clicking the second trigger would not cause
218
+ * the first popover to dismiss.
219
+ */
220
+ eventName: 'click',
221
+ callback: (ev) => popoverEl.presentFromTrigger(ev),
222
+ },
223
+ {
224
+ eventName: 'ionPopoverActivateTrigger',
225
+ callback: (ev) => popoverEl.presentFromTrigger(ev, true),
226
+ },
227
+ ];
228
+ break;
229
+ }
230
+ triggerCallbacks.forEach(({ eventName, callback }) => triggerEl.addEventListener(eventName, callback));
231
+ triggerEl.setAttribute('data-ion-popover-trigger', 'true');
232
+ return () => {
233
+ triggerCallbacks.forEach(({ eventName, callback }) => triggerEl.removeEventListener(eventName, callback));
234
+ triggerEl.removeAttribute('data-ion-popover-trigger');
235
+ };
236
+ };
237
+ /**
238
+ * Returns the index of an ion-item in an array of ion-items.
239
+ */
240
+ const getIndexOfItem = (items, item) => {
241
+ if (!item || item.tagName !== 'ION-ITEM') {
242
+ return -1;
243
+ }
244
+ return items.findIndex((el) => el === item);
245
+ };
246
+ /**
247
+ * Given an array of elements and a currently focused ion-item
248
+ * returns the next ion-item relative to the focused one or
249
+ * undefined.
250
+ */
251
+ const getNextItem = (items, currentItem) => {
252
+ const currentItemIndex = getIndexOfItem(items, currentItem);
253
+ return items[currentItemIndex + 1];
254
+ };
255
+ /**
256
+ * Given an array of elements and a currently focused ion-item
257
+ * returns the previous ion-item relative to the focused one or
258
+ * undefined.
259
+ */
260
+ const getPrevItem = (items, currentItem) => {
261
+ const currentItemIndex = getIndexOfItem(items, currentItem);
262
+ return items[currentItemIndex - 1];
263
+ };
264
+ /** Focus the internal button of the ion-item */
265
+ const focusItem = (item) => {
266
+ const root = helpers.getElementRoot(item);
267
+ const button = root.querySelector('button');
268
+ if (button) {
269
+ helpers.raf(() => button.focus());
270
+ }
271
+ };
272
+ /**
273
+ * Returns `true` if `el` has been designated
274
+ * as a trigger element for an ion-popover.
275
+ */
276
+ const isTriggerElement = (el) => el.hasAttribute('data-ion-popover-trigger');
277
+ const configureKeyboardInteraction = (popoverEl) => {
278
+ const callback = async (ev) => {
279
+ var _a;
280
+ const activeElement = document.activeElement;
281
+ let items = [];
282
+ const targetTagName = (_a = ev.target) === null || _a === void 0 ? void 0 : _a.tagName;
283
+ /**
284
+ * Only handle custom keyboard interactions for the host popover element
285
+ * and children ion-item elements.
286
+ */
287
+ if (targetTagName !== 'ION-POPOVER' && targetTagName !== 'ION-ITEM') {
288
+ return;
289
+ }
290
+ /**
291
+ * Complex selectors with :not() are :not supported
292
+ * in older versions of Chromium so we need to do a
293
+ * try/catch here so errors are not thrown.
294
+ */
295
+ try {
296
+ /**
297
+ * Select all ion-items that are not children of child popovers.
298
+ * i.e. only select ion-item elements that are part of this popover
299
+ */
300
+ items = Array.from(popoverEl.querySelectorAll('ion-item:not(ion-popover ion-popover *):not([disabled])'));
301
+ /* eslint-disable-next-line */
302
+ }
303
+ catch (_b) { }
304
+ switch (ev.key) {
305
+ /**
306
+ * If we are in a child popover
307
+ * then pressing the left arrow key
308
+ * should close this popover and move
309
+ * focus to the popover that presented
310
+ * this one.
311
+ */
312
+ case 'ArrowLeft':
313
+ const parentPopover = await popoverEl.getParentPopover();
314
+ if (parentPopover) {
315
+ popoverEl.dismiss(undefined, undefined, false);
316
+ }
317
+ break;
318
+ /**
319
+ * ArrowDown should move focus to the next focusable ion-item.
320
+ */
321
+ case 'ArrowDown':
322
+ // Disable movement/scroll with keyboard
323
+ ev.preventDefault();
324
+ const nextItem = getNextItem(items, activeElement);
325
+ if (nextItem !== undefined) {
326
+ focusItem(nextItem);
327
+ }
328
+ break;
329
+ /**
330
+ * ArrowUp should move focus to the previous focusable ion-item.
331
+ */
332
+ case 'ArrowUp':
333
+ // Disable movement/scroll with keyboard
334
+ ev.preventDefault();
335
+ const prevItem = getPrevItem(items, activeElement);
336
+ if (prevItem !== undefined) {
337
+ focusItem(prevItem);
338
+ }
339
+ break;
340
+ /**
341
+ * Home should move focus to the first focusable ion-item.
342
+ */
343
+ case 'Home':
344
+ ev.preventDefault();
345
+ const firstItem = items[0];
346
+ if (firstItem !== undefined) {
347
+ focusItem(firstItem);
348
+ }
349
+ break;
350
+ /**
351
+ * End should move focus to the last focusable ion-item.
352
+ */
353
+ case 'End':
354
+ ev.preventDefault();
355
+ const lastItem = items[items.length - 1];
356
+ if (lastItem !== undefined) {
357
+ focusItem(lastItem);
358
+ }
359
+ break;
360
+ /**
361
+ * ArrowRight, Spacebar, or Enter should activate
362
+ * the currently focused trigger item to open a
363
+ * popover if the element is a trigger item.
364
+ */
365
+ case 'ArrowRight':
366
+ case ' ':
367
+ case 'Enter':
368
+ if (activeElement && isTriggerElement(activeElement)) {
369
+ const rightEvent = new CustomEvent('ionPopoverActivateTrigger');
370
+ activeElement.dispatchEvent(rightEvent);
371
+ }
372
+ break;
373
+ }
43
374
  };
44
- const popoverCSS = {
45
- top: targetTop + targetHeight + (arrowHeight - 1),
46
- left: targetLeft + targetWidth / 2 - contentWidth / 2
375
+ popoverEl.addEventListener('keydown', callback);
376
+ return () => popoverEl.removeEventListener('keydown', callback);
377
+ };
378
+ /**
379
+ * Positions a popover by taking into account
380
+ * the reference point, preferred side, alignment
381
+ * and viewport dimensions.
382
+ */
383
+ const getPopoverPosition = (isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, triggerEl, event) => {
384
+ var _a;
385
+ let referenceCoordinates = {
386
+ top: 0,
387
+ left: 0,
388
+ width: 0,
389
+ height: 0,
47
390
  };
48
- // If the popover left is less than the padding it is off screen
49
- // to the left so adjust it, else if the width of the popover
50
- // exceeds the body width it is off screen to the right so adjust
51
- //
391
+ /**
392
+ * Calculate position relative to the
393
+ * x-y coordinates in the event that
394
+ * was passed in
395
+ */
396
+ switch (reference) {
397
+ case 'event':
398
+ if (!event) {
399
+ return defaultPosition;
400
+ }
401
+ const mouseEv = event;
402
+ referenceCoordinates = {
403
+ top: mouseEv.clientY,
404
+ left: mouseEv.clientX,
405
+ width: 1,
406
+ height: 1,
407
+ };
408
+ break;
409
+ /**
410
+ * Calculate position relative to the bounding
411
+ * box on either the trigger element
412
+ * specified via the `trigger` prop or
413
+ * the target specified on the event
414
+ * that was passed in.
415
+ */
416
+ case 'trigger':
417
+ default:
418
+ const customEv = event;
419
+ /**
420
+ * ionShadowTarget is used when we need to align the
421
+ * popover with an element inside of the shadow root
422
+ * of an Ionic component. Ex: Presenting a popover
423
+ * by clicking on the collapsed indicator inside
424
+ * of `ion-breadcrumb` and centering it relative
425
+ * to the indicator rather than `ion-breadcrumb`
426
+ * as a whole.
427
+ */
428
+ const actualTriggerEl = (triggerEl ||
429
+ ((_a = customEv === null || customEv === void 0 ? void 0 : customEv.detail) === null || _a === void 0 ? void 0 : _a.ionShadowTarget) ||
430
+ (customEv === null || customEv === void 0 ? void 0 : customEv.target));
431
+ if (!actualTriggerEl) {
432
+ return defaultPosition;
433
+ }
434
+ const triggerBoundingBox = actualTriggerEl.getBoundingClientRect();
435
+ referenceCoordinates = {
436
+ top: triggerBoundingBox.top,
437
+ left: triggerBoundingBox.left,
438
+ width: triggerBoundingBox.width,
439
+ height: triggerBoundingBox.height,
440
+ };
441
+ break;
442
+ }
443
+ /**
444
+ * Get top/left offset that would allow
445
+ * popover to be positioned on the
446
+ * preferred side of the reference.
447
+ */
448
+ const coordinates = calculatePopoverSide(side, referenceCoordinates, contentWidth, contentHeight, arrowWidth, arrowHeight, isRTL);
449
+ /**
450
+ * Get the top/left adjustments that
451
+ * would allow the popover content
452
+ * to have the correct alignment.
453
+ */
454
+ const alignedCoordinates = calculatePopoverAlign(align, side, referenceCoordinates, contentWidth, contentHeight);
455
+ const top = coordinates.top + alignedCoordinates.top;
456
+ const left = coordinates.left + alignedCoordinates.left;
457
+ const { arrowTop, arrowLeft } = calculateArrowPosition(side, arrowWidth, arrowHeight, top, left, contentWidth, contentHeight, isRTL);
458
+ const { originX, originY } = calculatePopoverOrigin(side, align, isRTL);
459
+ return { top, left, referenceCoordinates, arrowTop, arrowLeft, originX, originY };
460
+ };
461
+ /**
462
+ * Determines the transform-origin
463
+ * of the popover animation so that it
464
+ * is in line with what the side and alignment
465
+ * prop values are. Currently only used
466
+ * with the MD animation.
467
+ */
468
+ const calculatePopoverOrigin = (side, align, isRTL) => {
469
+ switch (side) {
470
+ case 'top':
471
+ return { originX: getOriginXAlignment(align), originY: 'bottom' };
472
+ case 'bottom':
473
+ return { originX: getOriginXAlignment(align), originY: 'top' };
474
+ case 'left':
475
+ return { originX: 'right', originY: getOriginYAlignment(align) };
476
+ case 'right':
477
+ return { originX: 'left', originY: getOriginYAlignment(align) };
478
+ case 'start':
479
+ return { originX: isRTL ? 'left' : 'right', originY: getOriginYAlignment(align) };
480
+ case 'end':
481
+ return { originX: isRTL ? 'right' : 'left', originY: getOriginYAlignment(align) };
482
+ }
483
+ };
484
+ const getOriginXAlignment = (align) => {
485
+ switch (align) {
486
+ case 'start':
487
+ return 'left';
488
+ case 'center':
489
+ return 'center';
490
+ case 'end':
491
+ return 'right';
492
+ }
493
+ };
494
+ const getOriginYAlignment = (align) => {
495
+ switch (align) {
496
+ case 'start':
497
+ return 'top';
498
+ case 'center':
499
+ return 'center';
500
+ case 'end':
501
+ return 'bottom';
502
+ }
503
+ };
504
+ /**
505
+ * Calculates where the arrow positioning
506
+ * should be relative to the popover content.
507
+ */
508
+ const calculateArrowPosition = (side, arrowWidth, arrowHeight, top, left, contentWidth, contentHeight, isRTL) => {
509
+ /**
510
+ * Note: When side is left, right, start, or end, the arrow is
511
+ * been rotated using a `transform`, so to move the arrow up or down
512
+ * by its dimension, you need to use `arrowWidth`.
513
+ */
514
+ const leftPosition = {
515
+ arrowTop: top + contentHeight / 2 - arrowWidth / 2,
516
+ arrowLeft: left + contentWidth - arrowWidth / 2,
517
+ };
518
+ /**
519
+ * Move the arrow to the left by arrowWidth and then
520
+ * again by half of its width because we have rotated
521
+ * the arrow using a transform.
522
+ */
523
+ const rightPosition = { arrowTop: top + contentHeight / 2 - arrowWidth / 2, arrowLeft: left - arrowWidth * 1.5 };
524
+ switch (side) {
525
+ case 'top':
526
+ return { arrowTop: top + contentHeight, arrowLeft: left + contentWidth / 2 - arrowWidth / 2 };
527
+ case 'bottom':
528
+ return { arrowTop: top - arrowHeight, arrowLeft: left + contentWidth / 2 - arrowWidth / 2 };
529
+ case 'left':
530
+ return leftPosition;
531
+ case 'right':
532
+ return rightPosition;
533
+ case 'start':
534
+ return isRTL ? rightPosition : leftPosition;
535
+ case 'end':
536
+ return isRTL ? leftPosition : rightPosition;
537
+ default:
538
+ return { arrowTop: 0, arrowLeft: 0 };
539
+ }
540
+ };
541
+ /**
542
+ * Calculates the required top/left
543
+ * values needed to position the popover
544
+ * content on the side specified in the
545
+ * `side` prop.
546
+ */
547
+ const calculatePopoverSide = (side, triggerBoundingBox, contentWidth, contentHeight, arrowWidth, arrowHeight, isRTL) => {
548
+ const sideLeft = {
549
+ top: triggerBoundingBox.top,
550
+ left: triggerBoundingBox.left - contentWidth - arrowWidth,
551
+ };
552
+ const sideRight = {
553
+ top: triggerBoundingBox.top,
554
+ left: triggerBoundingBox.left + triggerBoundingBox.width + arrowWidth,
555
+ };
556
+ switch (side) {
557
+ case 'top':
558
+ return {
559
+ top: triggerBoundingBox.top - contentHeight - arrowHeight,
560
+ left: triggerBoundingBox.left,
561
+ };
562
+ case 'right':
563
+ return sideRight;
564
+ case 'bottom':
565
+ return {
566
+ top: triggerBoundingBox.top + triggerBoundingBox.height + arrowHeight,
567
+ left: triggerBoundingBox.left,
568
+ };
569
+ case 'left':
570
+ return sideLeft;
571
+ case 'start':
572
+ return isRTL ? sideRight : sideLeft;
573
+ case 'end':
574
+ return isRTL ? sideLeft : sideRight;
575
+ }
576
+ };
577
+ /**
578
+ * Calculates the required top/left
579
+ * offset values needed to provide the
580
+ * correct alignment regardless while taking
581
+ * into account the side the popover is on.
582
+ */
583
+ const calculatePopoverAlign = (align, side, triggerBoundingBox, contentWidth, contentHeight) => {
584
+ switch (align) {
585
+ case 'center':
586
+ return calculatePopoverCenterAlign(side, triggerBoundingBox, contentWidth, contentHeight);
587
+ case 'end':
588
+ return calculatePopoverEndAlign(side, triggerBoundingBox, contentWidth, contentHeight);
589
+ case 'start':
590
+ default:
591
+ return { top: 0, left: 0 };
592
+ }
593
+ };
594
+ /**
595
+ * Calculate the end alignment for
596
+ * the popover. If side is on the x-axis
597
+ * then the align values refer to the top
598
+ * and bottom margins of the content.
599
+ * If side is on the y-axis then the
600
+ * align values refer to the left and right
601
+ * margins of the content.
602
+ */
603
+ const calculatePopoverEndAlign = (side, triggerBoundingBox, contentWidth, contentHeight) => {
604
+ switch (side) {
605
+ case 'start':
606
+ case 'end':
607
+ case 'left':
608
+ case 'right':
609
+ return {
610
+ top: -(contentHeight - triggerBoundingBox.height),
611
+ left: 0,
612
+ };
613
+ case 'top':
614
+ case 'bottom':
615
+ default:
616
+ return {
617
+ top: 0,
618
+ left: -(contentWidth - triggerBoundingBox.width),
619
+ };
620
+ }
621
+ };
622
+ /**
623
+ * Calculate the center alignment for
624
+ * the popover. If side is on the x-axis
625
+ * then the align values refer to the top
626
+ * and bottom margins of the content.
627
+ * If side is on the y-axis then the
628
+ * align values refer to the left and right
629
+ * margins of the content.
630
+ */
631
+ const calculatePopoverCenterAlign = (side, triggerBoundingBox, contentWidth, contentHeight) => {
632
+ switch (side) {
633
+ case 'start':
634
+ case 'end':
635
+ case 'left':
636
+ case 'right':
637
+ return {
638
+ top: -(contentHeight / 2 - triggerBoundingBox.height / 2),
639
+ left: 0,
640
+ };
641
+ case 'top':
642
+ case 'bottom':
643
+ default:
644
+ return {
645
+ top: 0,
646
+ left: -(contentWidth / 2 - triggerBoundingBox.width / 2),
647
+ };
648
+ }
649
+ };
650
+ /**
651
+ * Adjusts popover positioning coordinates
652
+ * such that popover does not appear offscreen
653
+ * or overlapping safe area bounds.
654
+ */
655
+ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyWidth, bodyHeight, contentWidth, contentHeight, safeAreaMargin, contentOriginX, contentOriginY, triggerCoordinates, coordArrowTop = 0, coordArrowLeft = 0, arrowHeight = 0) => {
656
+ let arrowTop = coordArrowTop;
657
+ const arrowLeft = coordArrowLeft;
658
+ let left = coordLeft;
659
+ let top = coordTop;
660
+ let bottom;
661
+ let originX = contentOriginX;
662
+ let originY = contentOriginY;
52
663
  let checkSafeAreaLeft = false;
53
664
  let checkSafeAreaRight = false;
54
- // If the popover left is less than the padding it is off screen
55
- // to the left so adjust it, else if the width of the popover
56
- // exceeds the body width it is off screen to the right so adjust
57
- // 25 is a random/arbitrary number. It seems to work fine for ios11
58
- // and iPhoneX. Is it perfect? No. Does it work? Yes.
59
- if (popoverCSS.left < POPOVER_IOS_BODY_PADDING + 25) {
665
+ const triggerTop = triggerCoordinates
666
+ ? triggerCoordinates.top + triggerCoordinates.height
667
+ : bodyHeight / 2 - contentHeight / 2;
668
+ const triggerHeight = triggerCoordinates ? triggerCoordinates.height : 0;
669
+ let addPopoverBottomClass = false;
670
+ /**
671
+ * Adjust popover so it does not
672
+ * go off the left of the screen.
673
+ */
674
+ if (left < bodyPadding + safeAreaMargin) {
675
+ left = bodyPadding;
60
676
  checkSafeAreaLeft = true;
61
- popoverCSS.left = POPOVER_IOS_BODY_PADDING;
677
+ originX = 'left';
678
+ /**
679
+ * Adjust popover so it does not
680
+ * go off the right of the screen.
681
+ */
62
682
  }
63
- else if (contentWidth + POPOVER_IOS_BODY_PADDING + popoverCSS.left + 25 > bodyWidth) {
64
- // Ok, so we're on the right side of the screen,
65
- // but now we need to make sure we're still a bit further right
66
- // cus....notchurally... Again, 25 is random. It works tho
683
+ else if (contentWidth + bodyPadding + left + safeAreaMargin > bodyWidth) {
67
684
  checkSafeAreaRight = true;
68
- popoverCSS.left = bodyWidth - contentWidth - POPOVER_IOS_BODY_PADDING;
685
+ left = bodyWidth - contentWidth - bodyPadding;
69
686
  originX = 'right';
70
687
  }
71
- // make it pop up if there's room above
72
- if (targetTop + targetHeight + contentHeight > bodyHeight && targetTop - contentHeight > 0) {
73
- arrowCSS.top = targetTop - (arrowHeight + 1);
74
- popoverCSS.top = targetTop - contentHeight - (arrowHeight - 1);
75
- baseEl.className = baseEl.className + ' popover-bottom';
76
- originY = 'bottom';
77
- // If there isn't room for it to pop up above the target cut it off
78
- }
79
- else if (targetTop + targetHeight + contentHeight > bodyHeight) {
80
- contentEl.style.bottom = POPOVER_IOS_BODY_PADDING + '%';
688
+ /**
689
+ * Adjust popover so it does not
690
+ * go off the top of the screen.
691
+ * If popover is on the left or the right of
692
+ * the trigger, then we should not adjust top
693
+ * margins.
694
+ */
695
+ if (triggerTop + triggerHeight + contentHeight > bodyHeight && (side === 'top' || side === 'bottom')) {
696
+ if (triggerTop - contentHeight > 0) {
697
+ /**
698
+ * While we strive to align the popover with the trigger
699
+ * on smaller screens this is not always possible. As a result,
700
+ * we adjust the popover up so that it does not hang
701
+ * off the bottom of the screen. However, we do not want to move
702
+ * the popover up so much that it goes off the top of the screen.
703
+ *
704
+ * We chose 12 here so that the popover position looks a bit nicer as
705
+ * it is not right up against the edge of the screen.
706
+ */
707
+ top = Math.max(12, triggerTop - contentHeight - triggerHeight - (arrowHeight - 1));
708
+ arrowTop = top + contentHeight;
709
+ originY = 'bottom';
710
+ addPopoverBottomClass = true;
711
+ /**
712
+ * If not enough room for popover to appear
713
+ * above trigger, then cut it off.
714
+ */
715
+ }
716
+ else {
717
+ bottom = bodyPadding;
718
+ }
81
719
  }
82
- arrowEl.style.top = arrowCSS.top + 'px';
83
- arrowEl.style.left = arrowCSS.left + 'px';
84
- contentEl.style.top = popoverCSS.top + 'px';
85
- contentEl.style.left = popoverCSS.left + 'px';
86
- if (checkSafeAreaLeft) {
87
- contentEl.style.left = `calc(${popoverCSS.left}px + var(--ion-safe-area-left, 0px))`;
720
+ return {
721
+ top,
722
+ left,
723
+ bottom,
724
+ originX,
725
+ originY,
726
+ checkSafeAreaLeft,
727
+ checkSafeAreaRight,
728
+ arrowTop,
729
+ arrowLeft,
730
+ addPopoverBottomClass,
731
+ };
732
+ };
733
+ const shouldShowArrow = (side, didAdjustBounds = false, ev, trigger) => {
734
+ /**
735
+ * If no event provided and
736
+ * we do not have a trigger,
737
+ * then this popover was likely
738
+ * presented via the popoverController
739
+ * or users called `present` manually.
740
+ * In this case, the arrow should not be
741
+ * shown as we do not have a reference.
742
+ */
743
+ if (!ev && !trigger) {
744
+ return false;
88
745
  }
89
- if (checkSafeAreaRight) {
90
- contentEl.style.left = `calc(${popoverCSS.left}px - var(--ion-safe-area-right, 0px))`;
746
+ /**
747
+ * If popover is on the left or the right
748
+ * of a trigger, but we needed to adjust the
749
+ * popover due to screen bounds, then we should
750
+ * hide the arrow as it will never be pointing
751
+ * at the trigger.
752
+ */
753
+ if (side !== 'top' && side !== 'bottom' && didAdjustBounds) {
754
+ return false;
91
755
  }
92
- contentEl.style.transformOrigin = originY + ' ' + originX;
756
+ return true;
757
+ };
758
+
759
+ /*!
760
+ * (C) Ionic http://ionicframework.com - MIT License
761
+ */
762
+ const POPOVER_IOS_BODY_PADDING = 5;
763
+ /**
764
+ * iOS Popover Enter Animation
765
+ */
766
+ const iosEnterAnimation = (baseEl, opts) => {
767
+ var _a;
768
+ const { event: ev, size, trigger, reference, side, align } = opts;
769
+ const doc = baseEl.ownerDocument;
770
+ const isRTL = doc.dir === 'rtl';
771
+ const bodyWidth = doc.defaultView.innerWidth;
772
+ const bodyHeight = doc.defaultView.innerHeight;
773
+ const root = helpers.getElementRoot(baseEl);
774
+ const contentEl = root.querySelector('.popover-content');
775
+ const arrowEl = root.querySelector('.popover-arrow');
776
+ const referenceSizeEl = trigger || ((_a = ev === null || ev === void 0 ? void 0 : ev.detail) === null || _a === void 0 ? void 0 : _a.ionShadowTarget) || (ev === null || ev === void 0 ? void 0 : ev.target);
777
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
778
+ const { arrowWidth, arrowHeight } = getArrowDimensions(arrowEl);
779
+ const defaultPosition = {
780
+ top: bodyHeight / 2 - contentHeight / 2,
781
+ left: bodyWidth / 2 - contentWidth / 2,
782
+ originX: isRTL ? 'right' : 'left',
783
+ originY: 'top',
784
+ };
785
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev);
786
+ const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING;
787
+ const margin = size === 'cover' ? 0 : 25;
788
+ const { originX, originY, top, left, bottom, checkSafeAreaLeft, checkSafeAreaRight, arrowTop, arrowLeft, addPopoverBottomClass, } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, margin, results.originX, results.originY, results.referenceCoordinates, results.arrowTop, results.arrowLeft, arrowHeight);
93
789
  const baseAnimation = animation.createAnimation();
94
790
  const backdropAnimation = animation.createAnimation();
95
791
  const wrapperAnimation = animation.createAnimation();
96
792
  backdropAnimation
97
- .addElement(baseEl.querySelector('ion-backdrop'))
793
+ .addElement(root.querySelector('ion-backdrop'))
98
794
  .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
99
795
  .beforeStyles({
100
- 'pointer-events': 'none'
796
+ 'pointer-events': 'none',
101
797
  })
102
798
  .afterClearStyles(['pointer-events']);
103
- wrapperAnimation
104
- .addElement(baseEl.querySelector('.popover-wrapper'))
105
- .fromTo('opacity', 0.01, 1);
799
+ wrapperAnimation.addElement(root.querySelector('.popover-wrapper')).fromTo('opacity', 0.01, 1);
106
800
  return baseAnimation
107
- .addElement(baseEl)
108
801
  .easing('ease')
109
802
  .duration(100)
803
+ .beforeAddWrite(() => {
804
+ if (size === 'cover') {
805
+ baseEl.style.setProperty('--width', `${contentWidth}px`);
806
+ }
807
+ if (addPopoverBottomClass) {
808
+ baseEl.classList.add('popover-bottom');
809
+ }
810
+ if (bottom !== undefined) {
811
+ contentEl.style.setProperty('bottom', `${bottom}px`);
812
+ }
813
+ const safeAreaLeft = ' + var(--ion-safe-area-left, 0)';
814
+ const safeAreaRight = ' - var(--ion-safe-area-right, 0)';
815
+ let leftValue = `${left}px`;
816
+ if (checkSafeAreaLeft) {
817
+ leftValue = `${left}px${safeAreaLeft}`;
818
+ }
819
+ if (checkSafeAreaRight) {
820
+ leftValue = `${left}px${safeAreaRight}`;
821
+ }
822
+ contentEl.style.setProperty('top', `calc(${top}px + var(--offset-y, 0))`);
823
+ contentEl.style.setProperty('left', `calc(${leftValue} + var(--offset-x, 0))`);
824
+ contentEl.style.setProperty('transform-origin', `${originY} ${originX}`);
825
+ if (arrowEl !== null) {
826
+ const didAdjustBounds = results.top !== top || results.left !== left;
827
+ const showArrow = shouldShowArrow(side, didAdjustBounds, ev, trigger);
828
+ if (showArrow) {
829
+ arrowEl.style.setProperty('top', `calc(${arrowTop}px + var(--offset-y, 0))`);
830
+ arrowEl.style.setProperty('left', `calc(${arrowLeft}px + var(--offset-x, 0))`);
831
+ }
832
+ else {
833
+ arrowEl.style.setProperty('display', 'none');
834
+ }
835
+ }
836
+ })
110
837
  .addAnimation([backdropAnimation, wrapperAnimation]);
111
838
  };
112
- const POPOVER_IOS_BODY_PADDING = 5;
113
839
 
840
+ /*!
841
+ * (C) Ionic http://ionicframework.com - MIT License
842
+ */
114
843
  /**
115
844
  * iOS Popover Leave Animation
116
845
  */
117
846
  const iosLeaveAnimation = (baseEl) => {
847
+ const root = helpers.getElementRoot(baseEl);
848
+ const contentEl = root.querySelector('.popover-content');
849
+ const arrowEl = root.querySelector('.popover-arrow');
118
850
  const baseAnimation = animation.createAnimation();
119
851
  const backdropAnimation = animation.createAnimation();
120
852
  const wrapperAnimation = animation.createAnimation();
121
- backdropAnimation
122
- .addElement(baseEl.querySelector('ion-backdrop'))
123
- .fromTo('opacity', 'var(--backdrop-opacity)', 0);
124
- wrapperAnimation
125
- .addElement(baseEl.querySelector('.popover-wrapper'))
126
- .fromTo('opacity', 0.99, 0);
853
+ backdropAnimation.addElement(root.querySelector('ion-backdrop')).fromTo('opacity', 'var(--backdrop-opacity)', 0);
854
+ wrapperAnimation.addElement(root.querySelector('.popover-wrapper')).fromTo('opacity', 0.99, 0);
127
855
  return baseAnimation
128
- .addElement(baseEl)
129
856
  .easing('ease')
130
- .duration(500)
857
+ .afterAddWrite(() => {
858
+ baseEl.style.removeProperty('--width');
859
+ baseEl.classList.remove('popover-bottom');
860
+ contentEl.style.removeProperty('top');
861
+ contentEl.style.removeProperty('left');
862
+ contentEl.style.removeProperty('bottom');
863
+ contentEl.style.removeProperty('transform-origin');
864
+ if (arrowEl) {
865
+ arrowEl.style.removeProperty('top');
866
+ arrowEl.style.removeProperty('left');
867
+ arrowEl.style.removeProperty('display');
868
+ }
869
+ })
870
+ .duration(300)
131
871
  .addAnimation([backdropAnimation, wrapperAnimation]);
132
872
  };
133
873
 
874
+ /*!
875
+ * (C) Ionic http://ionicframework.com - MIT License
876
+ */
877
+ const POPOVER_MD_BODY_PADDING = 12;
134
878
  /**
135
879
  * Md Popover Enter Animation
136
880
  */
137
- const mdEnterAnimation = (baseEl, ev) => {
138
- const POPOVER_MD_BODY_PADDING = 12;
881
+ const mdEnterAnimation = (baseEl, opts) => {
882
+ var _a;
883
+ const { event: ev, size, trigger, reference, side, align } = opts;
139
884
  const doc = baseEl.ownerDocument;
140
885
  const isRTL = doc.dir === 'rtl';
141
- let originY = 'top';
142
- let originX = isRTL ? 'right' : 'left';
143
- const contentEl = baseEl.querySelector('.popover-content');
144
- const contentDimentions = contentEl.getBoundingClientRect();
145
- const contentWidth = contentDimentions.width;
146
- const contentHeight = contentDimentions.height;
147
886
  const bodyWidth = doc.defaultView.innerWidth;
148
887
  const bodyHeight = doc.defaultView.innerHeight;
149
- // If ev was passed, use that for target element
150
- const targetDim = ev && ev.target && ev.target.getBoundingClientRect();
151
- // As per MD spec, by default position the popover below the target (trigger) element
152
- const targetTop = targetDim != null && 'bottom' in targetDim
153
- ? targetDim.bottom
154
- : bodyHeight / 2 - contentHeight / 2;
155
- const targetLeft = targetDim != null && 'left' in targetDim
156
- ? isRTL
157
- ? targetDim.left - contentWidth + targetDim.width
158
- : targetDim.left
159
- : bodyWidth / 2 - contentWidth / 2;
160
- const targetHeight = (targetDim && targetDim.height) || 0;
161
- const popoverCSS = {
162
- top: targetTop,
163
- left: targetLeft
888
+ const root = helpers.getElementRoot(baseEl);
889
+ const contentEl = root.querySelector('.popover-content');
890
+ const referenceSizeEl = trigger || ((_a = ev === null || ev === void 0 ? void 0 : ev.detail) === null || _a === void 0 ? void 0 : _a.ionShadowTarget) || (ev === null || ev === void 0 ? void 0 : ev.target);
891
+ const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
892
+ const defaultPosition = {
893
+ top: bodyHeight / 2 - contentHeight / 2,
894
+ left: bodyWidth / 2 - contentWidth / 2,
895
+ originX: isRTL ? 'right' : 'left',
896
+ originY: 'top',
164
897
  };
165
- // If the popover left is less than the padding it is off screen
166
- // to the left so adjust it, else if the width of the popover
167
- // exceeds the body width it is off screen to the right so adjust
168
- if (popoverCSS.left < POPOVER_MD_BODY_PADDING) {
169
- popoverCSS.left = POPOVER_MD_BODY_PADDING;
170
- // Same origin in this case for both LTR & RTL
171
- // Note: in LTR, originX is already 'left'
172
- originX = 'left';
173
- }
174
- else if (contentWidth + POPOVER_MD_BODY_PADDING + popoverCSS.left >
175
- bodyWidth) {
176
- popoverCSS.left = bodyWidth - contentWidth - POPOVER_MD_BODY_PADDING;
177
- // Same origin in this case for both LTR & RTL
178
- // Note: in RTL, originX is already 'right'
179
- originX = 'right';
180
- }
181
- // If the popover when popped down stretches past bottom of screen,
182
- // make it pop up if there's room above
183
- if (targetTop + targetHeight + contentHeight > bodyHeight &&
184
- targetTop - contentHeight > 0) {
185
- popoverCSS.top = targetTop - contentHeight - targetHeight;
186
- baseEl.className = baseEl.className + ' popover-bottom';
187
- originY = 'bottom';
188
- // If there isn't room for it to pop up above the target cut it off
189
- }
190
- else if (targetTop + targetHeight + contentHeight > bodyHeight) {
191
- contentEl.style.bottom = POPOVER_MD_BODY_PADDING + 'px';
192
- }
898
+ const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
899
+ const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING;
900
+ const { originX, originY, top, left, bottom } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, 0, results.originX, results.originY, results.referenceCoordinates);
193
901
  const baseAnimation = animation.createAnimation();
194
902
  const backdropAnimation = animation.createAnimation();
195
903
  const wrapperAnimation = animation.createAnimation();
196
904
  const contentAnimation = animation.createAnimation();
197
905
  const viewportAnimation = animation.createAnimation();
198
906
  backdropAnimation
199
- .addElement(baseEl.querySelector('ion-backdrop'))
907
+ .addElement(root.querySelector('ion-backdrop'))
200
908
  .fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
201
909
  .beforeStyles({
202
- 'pointer-events': 'none'
910
+ 'pointer-events': 'none',
203
911
  })
204
912
  .afterClearStyles(['pointer-events']);
205
- wrapperAnimation
206
- .addElement(baseEl.querySelector('.popover-wrapper'))
207
- .fromTo('opacity', 0.01, 1);
913
+ wrapperAnimation.addElement(root.querySelector('.popover-wrapper')).duration(150).fromTo('opacity', 0.01, 1);
208
914
  contentAnimation
209
915
  .addElement(contentEl)
210
916
  .beforeStyles({
211
- 'top': `${popoverCSS.top}px`,
212
- 'left': `${popoverCSS.left}px`,
213
- 'transform-origin': `${originY} ${originX}`
917
+ top: `calc(${top}px + var(--offset-y, 0px))`,
918
+ left: `calc(${left}px + var(--offset-x, 0px))`,
919
+ 'transform-origin': `${originY} ${originX}`,
920
+ })
921
+ .beforeAddWrite(() => {
922
+ if (bottom !== undefined) {
923
+ contentEl.style.setProperty('bottom', `${bottom}px`);
924
+ }
214
925
  })
215
- .fromTo('transform', 'scale(0.001)', 'scale(1)');
216
- viewportAnimation
217
- .addElement(baseEl.querySelector('.popover-viewport'))
218
- .fromTo('opacity', 0.01, 1);
926
+ .fromTo('transform', 'scale(0.8)', 'scale(1)');
927
+ viewportAnimation.addElement(root.querySelector('.popover-viewport')).fromTo('opacity', 0.01, 1);
219
928
  return baseAnimation
220
- .addElement(baseEl)
221
929
  .easing('cubic-bezier(0.36,0.66,0.04,1)')
222
930
  .duration(300)
931
+ .beforeAddWrite(() => {
932
+ if (size === 'cover') {
933
+ baseEl.style.setProperty('--width', `${contentWidth}px`);
934
+ }
935
+ if (originY === 'bottom') {
936
+ baseEl.classList.add('popover-bottom');
937
+ }
938
+ })
223
939
  .addAnimation([backdropAnimation, wrapperAnimation, contentAnimation, viewportAnimation]);
224
940
  };
225
941
 
942
+ /*!
943
+ * (C) Ionic http://ionicframework.com - MIT License
944
+ */
226
945
  /**
227
946
  * Md Popover Leave Animation
228
947
  */
229
948
  const mdLeaveAnimation = (baseEl) => {
949
+ const root = helpers.getElementRoot(baseEl);
950
+ const contentEl = root.querySelector('.popover-content');
230
951
  const baseAnimation = animation.createAnimation();
231
952
  const backdropAnimation = animation.createAnimation();
232
953
  const wrapperAnimation = animation.createAnimation();
233
- backdropAnimation
234
- .addElement(baseEl.querySelector('ion-backdrop'))
235
- .fromTo('opacity', 'var(--backdrop-opacity)', 0);
236
- wrapperAnimation
237
- .addElement(baseEl.querySelector('.popover-wrapper'))
238
- .fromTo('opacity', 0.99, 0);
954
+ backdropAnimation.addElement(root.querySelector('ion-backdrop')).fromTo('opacity', 'var(--backdrop-opacity)', 0);
955
+ wrapperAnimation.addElement(root.querySelector('.popover-wrapper')).fromTo('opacity', 0.99, 0);
239
956
  return baseAnimation
240
- .addElement(baseEl)
241
957
  .easing('ease')
242
- .duration(500)
958
+ .afterAddWrite(() => {
959
+ baseEl.style.removeProperty('--width');
960
+ baseEl.classList.remove('popover-bottom');
961
+ contentEl.style.removeProperty('top');
962
+ contentEl.style.removeProperty('left');
963
+ contentEl.style.removeProperty('bottom');
964
+ contentEl.style.removeProperty('transform-origin');
965
+ })
966
+ .duration(150)
243
967
  .addAnimation([backdropAnimation, wrapperAnimation]);
244
968
  };
245
969
 
246
- const popoverIosCss = ".sc-ion-popover-ios-h{--background:var(--ion-background-color, #fff);--min-width:0;--min-height:0;--max-width:auto;--height:auto;left:0;right:0;top:0;bottom:0;display:flex;position:fixed;align-items:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);z-index:1001}.overlay-hidden.sc-ion-popover-ios-h{display:none}.popover-wrapper.sc-ion-popover-ios{opacity:0;z-index:10}.popover-content.sc-ion-popover-ios{display:flex;position:absolute;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);background:var(--background);box-shadow:var(--box-shadow);overflow:auto;z-index:10}.popover-viewport.sc-ion-popover-ios{--ion-safe-area-top:0px;--ion-safe-area-right:0px;--ion-safe-area-bottom:0px;--ion-safe-area-left:0px;display:flex;flex-direction:column;overflow:hidden}.sc-ion-popover-ios-h{--width:200px;--max-height:90%;--box-shadow:none;--backdrop-opacity:var(--ion-backdrop-opacity, 0.08)}.popover-content.sc-ion-popover-ios{border-radius:10px}.popover-arrow.sc-ion-popover-ios{display:block;position:absolute;width:20px;height:10px;overflow:hidden}.popover-arrow.sc-ion-popover-ios::after{left:3px;top:3px;border-radius:3px;position:absolute;width:14px;height:14px;transform:rotate(45deg);background:var(--background);content:\"\";z-index:10}[dir=rtl].sc-ion-popover-ios .popover-arrow.sc-ion-popover-ios::after,[dir=rtl].sc-ion-popover-ios-h .popover-arrow.sc-ion-popover-ios::after,[dir=rtl] .sc-ion-popover-ios-h .popover-arrow.sc-ion-popover-ios::after{left:unset;right:unset;right:3px}.popover-bottom.sc-ion-popover-ios-h .popover-arrow.sc-ion-popover-ios{top:auto;bottom:-10px}.popover-bottom.sc-ion-popover-ios-h .popover-arrow.sc-ion-popover-ios::after{top:-6px}@supports (backdrop-filter: blur(0)){.popover-translucent.sc-ion-popover-ios-h .popover-content.sc-ion-popover-ios,.popover-translucent.sc-ion-popover-ios-h .popover-arrow.sc-ion-popover-ios::after{background:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8);backdrop-filter:saturate(180%) blur(20px)}}";
970
+ const popoverIosCss = ":host{--background:var(--ion-background-color, #fff);--min-width:0;--min-height:0;--max-width:auto;--height:auto;--offset-x:0px;--offset-y:0px;left:0;right:0;top:0;bottom:0;display:flex;position:fixed;align-items:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);z-index:1001}:host(.popover-nested){pointer-events:none}:host(.popover-nested) .popover-wrapper{pointer-events:auto}:host(.overlay-hidden){display:none}.popover-wrapper{opacity:0;z-index:10}.popover-content{display:flex;position:absolute;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);background:var(--background);box-shadow:var(--box-shadow);overflow:auto;z-index:10}.popover-viewport{--ion-safe-area-top:0px;--ion-safe-area-right:0px;--ion-safe-area-bottom:0px;--ion-safe-area-left:0px;display:flex;flex-direction:column;overflow:hidden}:host(.popover-nested.popover-side-left){--offset-x:5px}:host(.popover-nested.popover-side-right){--offset-x:-5px}:host(.popover-nested.popover-side-start){--offset-x:5px}:host-context([dir=rtl]):host(.popover-nested.popover-side-start),:host-context([dir=rtl]).popover-nested.popover-side-start{--offset-x:-5px}:host(.popover-nested.popover-side-end){--offset-x:-5px}:host-context([dir=rtl]):host(.popover-nested.popover-side-end),:host-context([dir=rtl]).popover-nested.popover-side-end{--offset-x:5px}:host{--width:200px;--max-height:90%;--box-shadow:none;--backdrop-opacity:var(--ion-backdrop-opacity, 0.08)}:host(.popover-desktop){--box-shadow:0px 4px 16px 0px rgba(0, 0, 0, 0.12)}.popover-content{border-radius:10px}:host(.popover-desktop) .popover-content{border:0.5px solid var(--ion-color-step-100, #e6e6e6)}.popover-arrow{display:block;position:absolute;width:20px;height:10px;overflow:hidden}.popover-arrow::after{left:3px;top:3px;border-radius:3px;position:absolute;width:14px;height:14px;transform:rotate(45deg);background:var(--background);content:\"\";z-index:10}[dir=rtl] .popover-arrow::after,:host-context([dir=rtl]) .popover-arrow::after{left:unset;right:unset;right:3px}:host(.popover-bottom) .popover-arrow{top:auto;bottom:-10px}:host(.popover-bottom) .popover-arrow::after{top:-6px}:host(.popover-side-left) .popover-arrow{transform:rotate(90deg)}:host(.popover-side-right) .popover-arrow{transform:rotate(-90deg)}:host(.popover-side-top) .popover-arrow{transform:rotate(180deg)}:host(.popover-side-start) .popover-arrow{transform:rotate(90deg)}:host-context([dir=rtl]):host(.popover-side-start) .popover-arrow,:host-context([dir=rtl]).popover-side-start .popover-arrow{transform:rotate(-90deg)}:host(.popover-side-end) .popover-arrow{transform:rotate(-90deg)}:host-context([dir=rtl]):host(.popover-side-end) .popover-arrow,:host-context([dir=rtl]).popover-side-end .popover-arrow{transform:rotate(90deg)}@supports (backdrop-filter: blur(0)){:host(.popover-translucent) .popover-content,:host(.popover-translucent) .popover-arrow::after{background:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8);backdrop-filter:saturate(180%) blur(20px)}}";
247
971
 
248
- const popoverMdCss = ".sc-ion-popover-md-h{--background:var(--ion-background-color, #fff);--min-width:0;--min-height:0;--max-width:auto;--height:auto;left:0;right:0;top:0;bottom:0;display:flex;position:fixed;align-items:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);z-index:1001}.overlay-hidden.sc-ion-popover-md-h{display:none}.popover-wrapper.sc-ion-popover-md{opacity:0;z-index:10}.popover-content.sc-ion-popover-md{display:flex;position:absolute;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);background:var(--background);box-shadow:var(--box-shadow);overflow:auto;z-index:10}.popover-viewport.sc-ion-popover-md{--ion-safe-area-top:0px;--ion-safe-area-right:0px;--ion-safe-area-bottom:0px;--ion-safe-area-left:0px;display:flex;flex-direction:column;overflow:hidden}.sc-ion-popover-md-h{--width:250px;--max-height:90%;--box-shadow:0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}.popover-content.sc-ion-popover-md{border-radius:4px;transform-origin:left top}[dir=rtl].sc-ion-popover-md .popover-content.sc-ion-popover-md,[dir=rtl].sc-ion-popover-md-h .popover-content.sc-ion-popover-md,[dir=rtl] .sc-ion-popover-md-h .popover-content.sc-ion-popover-md{transform-origin:right top}.popover-viewport.sc-ion-popover-md{transition-delay:100ms}";
972
+ const popoverMdCss = ":host{--background:var(--ion-background-color, #fff);--min-width:0;--min-height:0;--max-width:auto;--height:auto;--offset-x:0px;--offset-y:0px;left:0;right:0;top:0;bottom:0;display:flex;position:fixed;align-items:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);z-index:1001}:host(.popover-nested){pointer-events:none}:host(.popover-nested) .popover-wrapper{pointer-events:auto}:host(.overlay-hidden){display:none}.popover-wrapper{opacity:0;z-index:10}.popover-content{display:flex;position:absolute;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);background:var(--background);box-shadow:var(--box-shadow);overflow:auto;z-index:10}.popover-viewport{--ion-safe-area-top:0px;--ion-safe-area-right:0px;--ion-safe-area-bottom:0px;--ion-safe-area-left:0px;display:flex;flex-direction:column;overflow:hidden}:host(.popover-nested.popover-side-left){--offset-x:5px}:host(.popover-nested.popover-side-right){--offset-x:-5px}:host(.popover-nested.popover-side-start){--offset-x:5px}:host-context([dir=rtl]):host(.popover-nested.popover-side-start),:host-context([dir=rtl]).popover-nested.popover-side-start{--offset-x:-5px}:host(.popover-nested.popover-side-end){--offset-x:-5px}:host-context([dir=rtl]):host(.popover-nested.popover-side-end),:host-context([dir=rtl]).popover-nested.popover-side-end{--offset-x:5px}:host{--width:250px;--max-height:90%;--box-shadow:0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}.popover-content{border-radius:4px;transform-origin:left top}[dir=rtl] .popover-content,:host-context([dir=rtl]) .popover-content{transform-origin:right top}.popover-viewport{transition-delay:100ms}";
249
973
 
250
974
  const Popover = class {
251
975
  constructor(hostRef) {
@@ -254,7 +978,19 @@ const Popover = class {
254
978
  this.willPresent = index.createEvent(this, "ionPopoverWillPresent", 7);
255
979
  this.willDismiss = index.createEvent(this, "ionPopoverWillDismiss", 7);
256
980
  this.didDismiss = index.createEvent(this, "ionPopoverDidDismiss", 7);
981
+ this.didPresentShorthand = index.createEvent(this, "didPresent", 7);
982
+ this.willPresentShorthand = index.createEvent(this, "willPresent", 7);
983
+ this.willDismissShorthand = index.createEvent(this, "willDismiss", 7);
984
+ this.didDismissShorthand = index.createEvent(this, "didDismiss", 7);
985
+ this.ionMount = index.createEvent(this, "ionMount", 7);
986
+ this.parentPopover = null;
987
+ this.popoverIndex = popoverIds++;
988
+ this.coreDelegate = frameworkDelegate.CoreDelegate();
989
+ this.inline = false;
990
+ this.focusDescendantOnPresent = false;
257
991
  this.presented = false;
992
+ /** @internal */
993
+ this.hasController = false;
258
994
  /**
259
995
  * If `true`, the keyboard will be automatically dismissed when the overlay is presented.
260
996
  */
@@ -265,6 +1001,10 @@ const Popover = class {
265
1001
  this.backdropDismiss = true;
266
1002
  /**
267
1003
  * If `true`, a backdrop will be displayed behind the popover.
1004
+ * This property controls whether or not the backdrop
1005
+ * darkens the screen when the popover is presented.
1006
+ * It does not control whether or not the backdrop
1007
+ * is active or present in the DOM.
268
1008
  */
269
1009
  this.showBackdrop = true;
270
1010
  /**
@@ -277,11 +1017,82 @@ const Popover = class {
277
1017
  * If `true`, the popover will animate.
278
1018
  */
279
1019
  this.animated = true;
280
- this.onDismiss = (ev) => {
281
- ev.stopPropagation();
282
- ev.preventDefault();
283
- this.dismiss();
284
- };
1020
+ /**
1021
+ * Describes what kind of interaction with the trigger that
1022
+ * should cause the popover to open. Does not apply when the `trigger`
1023
+ * property is `undefined`.
1024
+ * If `'click'`, the popover will be presented when the trigger is left clicked.
1025
+ * If `'hover'`, the popover will be presented when a pointer hovers over the trigger.
1026
+ * If `'context-menu'`, the popover will be presented when the trigger is right
1027
+ * clicked on desktop and long pressed on mobile. This will also prevent your
1028
+ * device's normal context menu from appearing.
1029
+ */
1030
+ this.triggerAction = 'click';
1031
+ /**
1032
+ * Describes how to calculate the popover width.
1033
+ * If `'cover'`, the popover width will match the width of the trigger.
1034
+ * If `'auto'`, the popover width will be determined by the content in
1035
+ * the popover.
1036
+ */
1037
+ this.size = 'auto';
1038
+ /**
1039
+ * If `true`, the popover will be automatically
1040
+ * dismissed when the content has been clicked.
1041
+ */
1042
+ this.dismissOnSelect = false;
1043
+ /**
1044
+ * Describes what to position the popover relative to.
1045
+ * If `'trigger'`, the popover will be positioned relative
1046
+ * to the trigger button. If passing in an event, this is
1047
+ * determined via event.target.
1048
+ * If `'event'`, the popover will be positioned relative
1049
+ * to the x/y coordinates of the trigger action. If passing
1050
+ * in an event, this is determined via event.clientX and event.clientY.
1051
+ */
1052
+ this.reference = 'trigger';
1053
+ /**
1054
+ * Describes which side of the `reference` point to position
1055
+ * the popover on. The `'start'` and `'end'` values are RTL-aware,
1056
+ * and the `'left'` and `'right'` values are not.
1057
+ */
1058
+ this.side = 'bottom';
1059
+ /**
1060
+ * If `true`, the popover will display an arrow that points at the
1061
+ * `reference` when running in `ios` mode. Does not apply in `md` mode.
1062
+ */
1063
+ this.arrow = true;
1064
+ /**
1065
+ * If `true`, the popover will open. If `false`, the popover will close.
1066
+ * Use this if you need finer grained control over presentation, otherwise
1067
+ * just use the popoverController or the `trigger` property.
1068
+ * Note: `isOpen` will not automatically be set back to `false` when
1069
+ * the popover dismisses. You will need to do that in your code.
1070
+ */
1071
+ this.isOpen = false;
1072
+ /**
1073
+ * @internal
1074
+ *
1075
+ * If `true` the popover will not register its own keyboard event handlers.
1076
+ * This allows the contents of the popover to handle their own keyboard interactions.
1077
+ *
1078
+ * If `false`, the popover will register its own keyboard event handlers for
1079
+ * navigating `ion-list` items within a popover (up/down/home/end/etc.).
1080
+ * This will also cancel browser keyboard event bindings to prevent scroll
1081
+ * behavior in a popover using a list of items.
1082
+ */
1083
+ this.keyboardEvents = false;
1084
+ /**
1085
+ * If `true`, the component passed into `ion-popover` will
1086
+ * automatically be mounted when the popover is created. The
1087
+ * component will remain mounted even when the popover is dismissed.
1088
+ * However, the component will be destroyed when the popover is
1089
+ * destroyed. This property is not reactive and should only be
1090
+ * used when initially creating a popover.
1091
+ *
1092
+ * Note: This feature only applies to inline popovers in JavaScript
1093
+ * frameworks such as Angular, React, and Vue.
1094
+ */
1095
+ this.keepContentsMounted = false;
285
1096
  this.onBackdropTap = () => {
286
1097
  this.dismiss(undefined, overlays.BACKDROP);
287
1098
  };
@@ -292,44 +1103,251 @@ const Popover = class {
292
1103
  const event = new CustomEvent(name, {
293
1104
  bubbles: false,
294
1105
  cancelable: false,
295
- detail: modalEvent.detail
1106
+ detail: modalEvent.detail,
296
1107
  });
297
1108
  el.dispatchEvent(event);
298
1109
  }
299
1110
  };
1111
+ this.configureTriggerInteraction = () => {
1112
+ const { trigger, triggerAction, el, destroyTriggerInteraction } = this;
1113
+ if (destroyTriggerInteraction) {
1114
+ destroyTriggerInteraction();
1115
+ }
1116
+ const triggerEl = (this.triggerEl = trigger !== undefined ? document.getElementById(trigger) : null);
1117
+ if (!triggerEl) {
1118
+ return;
1119
+ }
1120
+ this.destroyTriggerInteraction = configureTriggerInteraction(triggerEl, triggerAction, el);
1121
+ };
1122
+ this.configureKeyboardInteraction = () => {
1123
+ const { destroyKeyboardInteraction, el } = this;
1124
+ if (destroyKeyboardInteraction) {
1125
+ destroyKeyboardInteraction();
1126
+ }
1127
+ this.destroyKeyboardInteraction = configureKeyboardInteraction(el);
1128
+ };
1129
+ this.configureDismissInteraction = () => {
1130
+ const { destroyDismissInteraction, parentPopover, triggerAction, triggerEl, el } = this;
1131
+ if (!parentPopover || !triggerEl) {
1132
+ return;
1133
+ }
1134
+ if (destroyDismissInteraction) {
1135
+ destroyDismissInteraction();
1136
+ }
1137
+ this.destroyDismissInteraction = configureDismissInteraction(triggerEl, triggerAction, el, parentPopover);
1138
+ };
1139
+ }
1140
+ onTriggerChange() {
1141
+ this.configureTriggerInteraction();
1142
+ }
1143
+ onIsOpenChange(newValue, oldValue) {
1144
+ if (newValue === true && oldValue === false) {
1145
+ this.present();
1146
+ }
1147
+ else if (newValue === false && oldValue === true) {
1148
+ this.dismiss();
1149
+ }
300
1150
  }
301
1151
  connectedCallback() {
302
- overlays.prepareOverlay(this.el);
1152
+ const { configureTriggerInteraction, el } = this;
1153
+ overlays.prepareOverlay(el);
1154
+ configureTriggerInteraction();
1155
+ }
1156
+ disconnectedCallback() {
1157
+ const { destroyTriggerInteraction } = this;
1158
+ if (destroyTriggerInteraction) {
1159
+ destroyTriggerInteraction();
1160
+ }
1161
+ }
1162
+ componentWillLoad() {
1163
+ /**
1164
+ * If user has custom ID set then we should
1165
+ * not assign the default incrementing ID.
1166
+ */
1167
+ this.popoverId = this.el.hasAttribute('id') ? this.el.getAttribute('id') : `ion-popover-${this.popoverIndex}`;
1168
+ this.parentPopover = this.el.closest(`ion-popover:not(#${this.popoverId})`);
1169
+ if (this.alignment === undefined) {
1170
+ this.alignment = ionicGlobal.getIonMode(this) === 'ios' ? 'center' : 'start';
1171
+ }
1172
+ }
1173
+ componentDidLoad() {
1174
+ const { parentPopover, isOpen } = this;
1175
+ /**
1176
+ * If popover was rendered with isOpen="true"
1177
+ * then we should open popover immediately.
1178
+ */
1179
+ if (isOpen === true) {
1180
+ helpers.raf(() => this.present());
1181
+ }
1182
+ if (parentPopover) {
1183
+ helpers.addEventListener(parentPopover, 'ionPopoverWillDismiss', () => {
1184
+ this.dismiss(undefined, undefined, false);
1185
+ });
1186
+ }
1187
+ }
1188
+ /**
1189
+ * When opening a popover from a trigger, we should not be
1190
+ * modifying the `event` prop from inside the component.
1191
+ * Additionally, when pressing the "Right" arrow key, we need
1192
+ * to shift focus to the first descendant in the newly presented
1193
+ * popover.
1194
+ *
1195
+ * @internal
1196
+ */
1197
+ async presentFromTrigger(event, focusDescendant = false) {
1198
+ this.focusDescendantOnPresent = focusDescendant;
1199
+ await this.present(event);
1200
+ this.focusDescendantOnPresent = false;
1201
+ }
1202
+ /**
1203
+ * Determines whether or not an overlay
1204
+ * is being used inline or via a controller/JS
1205
+ * and returns the correct delegate.
1206
+ * By default, subsequent calls to getDelegate
1207
+ * will use a cached version of the delegate.
1208
+ * This is useful for calling dismiss after
1209
+ * present so that the correct delegate is given.
1210
+ */
1211
+ getDelegate(force = false) {
1212
+ if (this.workingDelegate && !force) {
1213
+ return {
1214
+ delegate: this.workingDelegate,
1215
+ inline: this.inline,
1216
+ };
1217
+ }
1218
+ /**
1219
+ * If using overlay inline
1220
+ * we potentially need to use the coreDelegate
1221
+ * so that this works in vanilla JS apps.
1222
+ * If a developer has presented this component
1223
+ * via a controller, then we can assume
1224
+ * the component is already in the
1225
+ * correct place.
1226
+ */
1227
+ const parentEl = this.el.parentNode;
1228
+ const inline = (this.inline = parentEl !== null && !this.hasController);
1229
+ const delegate = (this.workingDelegate = inline ? this.delegate || this.coreDelegate : this.delegate);
1230
+ return { inline, delegate };
303
1231
  }
304
1232
  /**
305
1233
  * Present the popover overlay after it has been created.
1234
+ * Developers can pass a mouse, touch, or pointer event
1235
+ * to position the popover relative to where that event
1236
+ * was dispatched.
306
1237
  */
307
- async present() {
1238
+ async present(event) {
308
1239
  if (this.presented) {
309
1240
  return;
310
1241
  }
311
- const container = this.el.querySelector('.popover-content');
312
- if (!container) {
313
- throw new Error('container is undefined');
1242
+ /**
1243
+ * When using an inline popover
1244
+ * and dismissing a popover it is possible to
1245
+ * quickly present the popover while it is
1246
+ * dismissing. We need to await any current
1247
+ * transition to allow the dismiss to finish
1248
+ * before presenting again.
1249
+ */
1250
+ if (this.currentTransition !== undefined) {
1251
+ await this.currentTransition;
314
1252
  }
315
1253
  const data = Object.assign(Object.assign({}, this.componentProps), { popover: this.el });
316
- this.usersElement = await frameworkDelegate.attachComponent(this.delegate, container, this.component, ['popover-viewport', this.el['s-sc']], data);
1254
+ const { inline, delegate } = this.getDelegate(true);
1255
+ this.usersElement = await frameworkDelegate.attachComponent(delegate, this.el, this.component, ['popover-viewport'], data, inline);
317
1256
  await index$1.deepReady(this.usersElement);
318
- return overlays.present(this, 'popoverEnter', iosEnterAnimation, mdEnterAnimation, this.event);
1257
+ if (!this.keyboardEvents) {
1258
+ this.configureKeyboardInteraction();
1259
+ }
1260
+ this.configureDismissInteraction();
1261
+ this.ionMount.emit();
1262
+ return new Promise((resolve) => {
1263
+ /**
1264
+ * Wait two request animation frame loops before presenting the popover.
1265
+ * This allows the framework implementations enough time to mount
1266
+ * the popover contents, so the bounding box is set when the popover
1267
+ * transition starts.
1268
+ *
1269
+ * On Angular and React, a single raf is enough time, but for Vue
1270
+ * we need to wait two rafs. As a result we are using two rafs for
1271
+ * all frameworks to ensure the popover is presented correctly.
1272
+ */
1273
+ helpers.raf(() => {
1274
+ helpers.raf(async () => {
1275
+ this.currentTransition = overlays.present(this, 'popoverEnter', iosEnterAnimation, mdEnterAnimation, {
1276
+ event: event || this.event,
1277
+ size: this.size,
1278
+ trigger: this.triggerEl,
1279
+ reference: this.reference,
1280
+ side: this.side,
1281
+ align: this.alignment,
1282
+ });
1283
+ await this.currentTransition;
1284
+ this.currentTransition = undefined;
1285
+ /**
1286
+ * If popover is nested and was
1287
+ * presented using the "Right" arrow key,
1288
+ * we need to move focus to the first
1289
+ * descendant inside of the popover.
1290
+ */
1291
+ if (this.focusDescendantOnPresent) {
1292
+ overlays.focusFirstDescendant(this.el, this.el);
1293
+ }
1294
+ resolve();
1295
+ });
1296
+ });
1297
+ });
319
1298
  }
320
1299
  /**
321
1300
  * Dismiss the popover overlay after it has been presented.
322
1301
  *
323
1302
  * @param data Any data to emit in the dismiss events.
324
1303
  * @param role The role of the element that is dismissing the popover. For example, 'cancel' or 'backdrop'.
1304
+ * @param dismissParentPopover If `true`, dismissing this popover will also dismiss
1305
+ * a parent popover if this popover is nested. Defaults to `true`.
325
1306
  */
326
- async dismiss(data, role) {
327
- const shouldDismiss = await overlays.dismiss(this, data, role, 'popoverLeave', iosLeaveAnimation, mdLeaveAnimation, this.event);
1307
+ async dismiss(data, role, dismissParentPopover = true) {
1308
+ /**
1309
+ * When using an inline popover
1310
+ * and presenting a popover it is possible to
1311
+ * quickly dismiss the popover while it is
1312
+ * presenting. We need to await any current
1313
+ * transition to allow the present to finish
1314
+ * before dismissing again.
1315
+ */
1316
+ if (this.currentTransition !== undefined) {
1317
+ await this.currentTransition;
1318
+ }
1319
+ const { destroyKeyboardInteraction, destroyDismissInteraction } = this;
1320
+ if (dismissParentPopover && this.parentPopover) {
1321
+ this.parentPopover.dismiss(data, role, dismissParentPopover);
1322
+ }
1323
+ this.currentTransition = overlays.dismiss(this, data, role, 'popoverLeave', iosLeaveAnimation, mdLeaveAnimation, this.event);
1324
+ const shouldDismiss = await this.currentTransition;
328
1325
  if (shouldDismiss) {
329
- await frameworkDelegate.detachComponent(this.delegate, this.usersElement);
1326
+ if (destroyKeyboardInteraction) {
1327
+ destroyKeyboardInteraction();
1328
+ this.destroyKeyboardInteraction = undefined;
1329
+ }
1330
+ if (destroyDismissInteraction) {
1331
+ destroyDismissInteraction();
1332
+ this.destroyDismissInteraction = undefined;
1333
+ }
1334
+ /**
1335
+ * If using popover inline
1336
+ * we potentially need to use the coreDelegate
1337
+ * so that this works in vanilla JS apps
1338
+ */
1339
+ const { delegate } = this.getDelegate();
1340
+ await frameworkDelegate.detachComponent(delegate, this.usersElement);
330
1341
  }
1342
+ this.currentTransition = undefined;
331
1343
  return shouldDismiss;
332
1344
  }
1345
+ /**
1346
+ * @internal
1347
+ */
1348
+ async getParentPopover() {
1349
+ return this.parentPopover;
1350
+ }
333
1351
  /**
334
1352
  * Returns a promise that resolves when the popover did dismiss.
335
1353
  */
@@ -344,19 +1362,27 @@ const Popover = class {
344
1362
  }
345
1363
  render() {
346
1364
  const mode = ionicGlobal.getIonMode(this);
347
- const { onLifecycle, htmlAttributes } = this;
1365
+ const { onLifecycle, popoverId, parentPopover, dismissOnSelect, side, arrow, htmlAttributes } = this;
1366
+ const desktop = ionicGlobal.isPlatform('desktop');
1367
+ const enableArrow = arrow && !parentPopover;
348
1368
  return (index.h(index.Host, Object.assign({ "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
349
1369
  zIndex: `${20000 + this.overlayIndex}`,
350
- }, class: Object.assign(Object.assign({}, theme.getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonDismiss: this.onDismiss, onIonBackdropTap: this.onBackdropTap }), index.h("ion-backdrop", { tappable: this.backdropDismiss, visible: this.showBackdrop }), index.h("div", { tabindex: "0" }), index.h("div", { class: "popover-wrapper ion-overlay-wrapper" }, index.h("div", { class: "popover-arrow" }), index.h("div", { class: "popover-content" })), index.h("div", { tabindex: "0" })));
1370
+ }, id: popoverId, class: Object.assign(Object.assign({}, theme.getClassMap(this.cssClass)), { [mode]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && index.h("ion-backdrop", { tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), index.h("div", { class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && index.h("div", { class: "popover-arrow", part: "arrow" }), index.h("div", { class: "popover-content", part: "content" }, index.h("slot", null)))));
351
1371
  }
352
1372
  get el() { return index.getElement(this); }
1373
+ static get watchers() { return {
1374
+ "trigger": ["onTriggerChange"],
1375
+ "triggerAction": ["onTriggerChange"],
1376
+ "isOpen": ["onIsOpenChange"]
1377
+ }; }
353
1378
  };
354
1379
  const LIFECYCLE_MAP = {
355
- 'ionPopoverDidPresent': 'ionViewDidEnter',
356
- 'ionPopoverWillPresent': 'ionViewWillEnter',
357
- 'ionPopoverWillDismiss': 'ionViewWillLeave',
358
- 'ionPopoverDidDismiss': 'ionViewDidLeave',
1380
+ ionPopoverDidPresent: 'ionViewDidEnter',
1381
+ ionPopoverWillPresent: 'ionViewWillEnter',
1382
+ ionPopoverWillDismiss: 'ionViewWillLeave',
1383
+ ionPopoverDidDismiss: 'ionViewDidLeave',
359
1384
  };
1385
+ let popoverIds = 0;
360
1386
  Popover.style = {
361
1387
  ios: popoverIosCss,
362
1388
  md: popoverMdCss