@ionic/vue 8.2.8-dev.11724886491.1c0dd39d → 8.2.8-dev.11725452518.16aa47d3

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 (56) hide show
  1. package/css/core.css +1 -1
  2. package/css/core.css.map +1 -1
  3. package/css/display.css.map +1 -1
  4. package/css/flex-utils.css.map +1 -1
  5. package/css/float-elements.css.map +1 -1
  6. package/css/global.bundle.css +1 -1
  7. package/css/global.bundle.css.map +1 -1
  8. package/css/ionic/bundle.ionic.css +1 -0
  9. package/css/ionic/bundle.ionic.css.map +1 -0
  10. package/css/ionic/core.ionic.css +1 -0
  11. package/css/ionic/core.ionic.css.map +1 -0
  12. package/css/ionic/global.bundle.ionic.css +1 -0
  13. package/css/ionic/global.bundle.ionic.css.map +1 -0
  14. package/css/ionic/ionic-swiper.ionic.css +1 -0
  15. package/css/ionic/ionic-swiper.ionic.css.map +1 -0
  16. package/css/ionic/link.ionic.css +1 -0
  17. package/css/ionic/link.ionic.css.map +1 -0
  18. package/css/ionic/structure.ionic.css +1 -0
  19. package/css/ionic/structure.ionic.css.map +1 -0
  20. package/css/ionic/typography.ionic.css +1 -0
  21. package/css/ionic/typography.ionic.css.map +1 -0
  22. package/css/ionic/utils.bundle.ionic.css +1 -0
  23. package/css/ionic/utils.bundle.ionic.css.map +1 -0
  24. package/css/ionic-swiper.css +1 -1
  25. package/css/ionic-swiper.css.map +1 -1
  26. package/css/ionic.bundle.css +1 -1
  27. package/css/ionic.bundle.css.map +1 -1
  28. package/css/normalize.css.map +1 -1
  29. package/css/padding.css.map +1 -1
  30. package/css/palettes/dark.always.css.map +1 -1
  31. package/css/palettes/dark.class.css.map +1 -1
  32. package/css/palettes/dark.system.css.map +1 -1
  33. package/css/palettes/high-contrast-dark.always.css.map +1 -1
  34. package/css/palettes/high-contrast-dark.class.css.map +1 -1
  35. package/css/palettes/high-contrast-dark.system.css.map +1 -1
  36. package/css/palettes/high-contrast.always.css.map +1 -1
  37. package/css/palettes/high-contrast.class.css.map +1 -1
  38. package/css/palettes/high-contrast.system.css.map +1 -1
  39. package/css/structure.css +1 -1
  40. package/css/structure.css.map +1 -1
  41. package/css/text-alignment.css.map +1 -1
  42. package/css/text-transformation.css.map +1 -1
  43. package/css/typography.css +1 -1
  44. package/css/typography.css.map +1 -1
  45. package/css/utils.bundle.css.map +1 -1
  46. package/dist/index.js +116 -210
  47. package/dist/index.js.map +1 -1
  48. package/dist/types/components/IonTabBar.d.ts +0 -29
  49. package/dist/types/components/IonTabButton.d.ts +0 -8
  50. package/dist/types/components/IonTabs.d.ts +1 -10
  51. package/dist/types/components/Overlays.d.ts +1 -1
  52. package/dist/types/proxies.d.ts +0 -1
  53. package/dist/vetur/attributes.json +1342 -104
  54. package/dist/vetur/tags.json +193 -45
  55. package/dist/web-types.json +1292 -112
  56. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defineComponent, ref, getCurrentInstance, inject, h, withDirectives, computed, provide, shallowRef, watch, onUnmounted, Fragment, isVNode, Teleport, onMounted } from 'vue';
1
+ import { defineComponent, ref, getCurrentInstance, inject, h, withDirectives, computed, provide, shallowRef, watch, onUnmounted, Teleport, onMounted } from 'vue';
2
2
  import { defineCustomElement } from '@ionic/core/components/ion-accordion.js';
3
3
  import { defineCustomElement as defineCustomElement$1 } from '@ionic/core/components/ion-accordion-group.js';
4
4
  import { defineCustomElement as defineCustomElement$2 } from '@ionic/core/components/ion-avatar.js';
@@ -42,7 +42,7 @@ import { defineCustomElement as defineCustomElement$D } from '@ionic/core/compon
42
42
  import { defineCustomElement as defineCustomElement$E } from '@ionic/core/components/ion-menu.js';
43
43
  import { defineCustomElement as defineCustomElement$F } from '@ionic/core/components/ion-menu-button.js';
44
44
  import { defineCustomElement as defineCustomElement$G } from '@ionic/core/components/ion-menu-toggle.js';
45
- import { defineCustomElement as defineCustomElement$1f } from '@ionic/core/components/ion-nav.js';
45
+ import { defineCustomElement as defineCustomElement$1d } from '@ionic/core/components/ion-nav.js';
46
46
  import { defineCustomElement as defineCustomElement$H } from '@ionic/core/components/ion-nav-link.js';
47
47
  import { defineCustomElement as defineCustomElement$I } from '@ionic/core/components/ion-note.js';
48
48
  import { defineCustomElement as defineCustomElement$J } from '@ionic/core/components/ion-picker.js';
@@ -66,30 +66,28 @@ import { defineCustomElement as defineCustomElement$_ } from '@ionic/core/compon
66
66
  import { defineCustomElement as defineCustomElement$$ } from '@ionic/core/components/ion-skeleton-text.js';
67
67
  import { defineCustomElement as defineCustomElement$10 } from '@ionic/core/components/ion-spinner.js';
68
68
  import { defineCustomElement as defineCustomElement$11 } from '@ionic/core/components/ion-split-pane.js';
69
- import { defineCustomElement as defineCustomElement$12 } from '@ionic/core/components/ion-tab.js';
70
- import { defineCustomElement as defineCustomElement$13 } from '@ionic/core/components/ion-text.js';
71
- import { defineCustomElement as defineCustomElement$14 } from '@ionic/core/components/ion-textarea.js';
72
- import { defineCustomElement as defineCustomElement$15 } from '@ionic/core/components/ion-thumbnail.js';
73
- import { defineCustomElement as defineCustomElement$16 } from '@ionic/core/components/ion-title.js';
74
- import { defineCustomElement as defineCustomElement$17 } from '@ionic/core/components/ion-toggle.js';
75
- import { defineCustomElement as defineCustomElement$18 } from '@ionic/core/components/ion-toolbar.js';
69
+ import { defineCustomElement as defineCustomElement$12 } from '@ionic/core/components/ion-text.js';
70
+ import { defineCustomElement as defineCustomElement$13 } from '@ionic/core/components/ion-textarea.js';
71
+ import { defineCustomElement as defineCustomElement$14 } from '@ionic/core/components/ion-thumbnail.js';
72
+ import { defineCustomElement as defineCustomElement$15 } from '@ionic/core/components/ion-title.js';
73
+ import { defineCustomElement as defineCustomElement$16 } from '@ionic/core/components/ion-toggle.js';
74
+ import { defineCustomElement as defineCustomElement$17 } from '@ionic/core/components/ion-toolbar.js';
76
75
  import { LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE, initialize, modalController as modalController$1, popoverController as popoverController$1, alertController as alertController$1, actionSheetController as actionSheetController$1, loadingController as loadingController$1, pickerController as pickerController$1, toastController as toastController$1 } from '@ionic/core/components';
77
76
  export { IonicSafeString, IonicSlides, createAnimation, createGesture, getIonPageElement, getPlatforms, getTimeGivenProgression, iosTransitionAnimation, isPlatform, mdTransitionAnimation, menuController, openURL } from '@ionic/core/components';
78
- import { defineCustomElement as defineCustomElement$19 } from '@ionic/core/components/ion-back-button.js';
79
- import { defineCustomElement as defineCustomElement$1a } from '@ionic/core/components/ion-router-outlet.js';
77
+ import { defineCustomElement as defineCustomElement$18 } from '@ionic/core/components/ion-back-button.js';
78
+ import { defineCustomElement as defineCustomElement$19 } from '@ionic/core/components/ion-router-outlet.js';
80
79
  import { routeLocationKey, useRoute, matchedRouteKey } from 'vue-router';
81
- import { defineCustomElement as defineCustomElement$1b } from '@ionic/core/components/ion-tab-button.js';
82
- import { defineCustomElement as defineCustomElement$1c } from '@ionic/core/components/ion-tabs.js';
83
- import { defineCustomElement as defineCustomElement$1d } from '@ionic/core/components/ion-tab-bar.js';
84
- import { defineCustomElement as defineCustomElement$1e } from '@ionic/core/components/ion-app.js';
85
- import { defineCustomElement as defineCustomElement$1g } from 'ionicons/components/ion-icon.js';
86
- import { defineCustomElement as defineCustomElement$1h } from '@ionic/core/components/ion-action-sheet.js';
87
- import { defineCustomElement as defineCustomElement$1i } from '@ionic/core/components/ion-alert.js';
88
- import { defineCustomElement as defineCustomElement$1j } from '@ionic/core/components/ion-loading.js';
89
- import { defineCustomElement as defineCustomElement$1k } from '@ionic/core/components/ion-picker-legacy.js';
90
- import { defineCustomElement as defineCustomElement$1l } from '@ionic/core/components/ion-toast.js';
91
- import { defineCustomElement as defineCustomElement$1m } from '@ionic/core/components/ion-modal.js';
92
- import { defineCustomElement as defineCustomElement$1n } from '@ionic/core/components/ion-popover.js';
80
+ import { defineCustomElement as defineCustomElement$1a } from '@ionic/core/components/ion-tab-button.js';
81
+ import { defineCustomElement as defineCustomElement$1b } from '@ionic/core/components/ion-tab-bar.js';
82
+ import { defineCustomElement as defineCustomElement$1c } from '@ionic/core/components/ion-app.js';
83
+ import { defineCustomElement as defineCustomElement$1e } from 'ionicons/components/ion-icon.js';
84
+ import { defineCustomElement as defineCustomElement$1f } from '@ionic/core/components/ion-action-sheet.js';
85
+ import { defineCustomElement as defineCustomElement$1g } from '@ionic/core/components/ion-alert.js';
86
+ import { defineCustomElement as defineCustomElement$1h } from '@ionic/core/components/ion-loading.js';
87
+ import { defineCustomElement as defineCustomElement$1i } from '@ionic/core/components/ion-picker-legacy.js';
88
+ import { defineCustomElement as defineCustomElement$1j } from '@ionic/core/components/ion-toast.js';
89
+ import { defineCustomElement as defineCustomElement$1k } from '@ionic/core/components/ion-modal.js';
90
+ import { defineCustomElement as defineCustomElement$1l } from '@ionic/core/components/ion-popover.js';
93
91
 
94
92
  // @ts-nocheck
95
93
  // It's easier and safer for Volar to disable typechecking and let the return type inference do its job.
@@ -299,7 +297,10 @@ const IonAccordionGroup = /*@__PURE__*/ defineContainer('ion-accordion-group', d
299
297
  'ionChange',
300
298
  'ionValueChange'
301
299
  ], 'value', 'ion-change');
302
- const IonAvatar = /*@__PURE__*/ defineContainer('ion-avatar', defineCustomElement$2);
300
+ const IonAvatar = /*@__PURE__*/ defineContainer('ion-avatar', defineCustomElement$2, [
301
+ 'size',
302
+ 'shape'
303
+ ]);
303
304
  const IonBackdrop = /*@__PURE__*/ defineContainer('ion-backdrop', defineCustomElement$3, [
304
305
  'visible',
305
306
  'tappable',
@@ -307,7 +308,9 @@ const IonBackdrop = /*@__PURE__*/ defineContainer('ion-backdrop', defineCustomEl
307
308
  'ionBackdropTap'
308
309
  ]);
309
310
  const IonBadge = /*@__PURE__*/ defineContainer('ion-badge', defineCustomElement$4, [
310
- 'color'
311
+ 'color',
312
+ 'shape',
313
+ 'size'
311
314
  ]);
312
315
  const IonBreadcrumb = /*@__PURE__*/ defineContainer('ion-breadcrumb', defineCustomElement$5, [
313
316
  'collapsed',
@@ -367,6 +370,7 @@ const IonCard = /*@__PURE__*/ defineContainer('ion-card', defineCustomElement$9,
367
370
  'rel',
368
371
  'routerDirection',
369
372
  'routerAnimation',
373
+ 'shape',
370
374
  'target'
371
375
  ]);
372
376
  const IonCardContent = /*@__PURE__*/ defineContainer('ion-card-content', defineCustomElement$a);
@@ -390,6 +394,8 @@ const IonCheckbox = /*@__PURE__*/ defineContainer('ion-checkbox', defineCustomEl
390
394
  'labelPlacement',
391
395
  'justify',
392
396
  'alignment',
397
+ 'size',
398
+ 'shape',
393
399
  'ionChange',
394
400
  'ionFocus',
395
401
  'ionBlur'
@@ -397,7 +403,9 @@ const IonCheckbox = /*@__PURE__*/ defineContainer('ion-checkbox', defineCustomEl
397
403
  const IonChip = /*@__PURE__*/ defineContainer('ion-chip', defineCustomElement$f, [
398
404
  'color',
399
405
  'outline',
400
- 'disabled'
406
+ 'disabled',
407
+ 'shape',
408
+ 'size'
401
409
  ]);
402
410
  const IonCol = /*@__PURE__*/ defineContainer('ion-col', defineCustomElement$g, [
403
411
  'offset',
@@ -518,6 +526,7 @@ const IonGrid = /*@__PURE__*/ defineContainer('ion-grid', defineCustomElement$o,
518
526
  ]);
519
527
  const IonHeader = /*@__PURE__*/ defineContainer('ion-header', defineCustomElement$p, [
520
528
  'collapse',
529
+ 'divider',
521
530
  'translucent'
522
531
  ]);
523
532
  const IonImg = /*@__PURE__*/ defineContainer('ion-img', defineCustomElement$q, [
@@ -570,6 +579,7 @@ const IonInput = /*@__PURE__*/ defineContainer('ion-input', defineCustomElement$
570
579
  'shape',
571
580
  'spellcheck',
572
581
  'step',
582
+ 'size',
573
583
  'type',
574
584
  'value',
575
585
  'ionInput',
@@ -611,7 +621,8 @@ const IonItemOption = /*@__PURE__*/ defineContainer('ion-item-option', defineCus
611
621
  'href',
612
622
  'rel',
613
623
  'target',
614
- 'type'
624
+ 'type',
625
+ 'shape'
615
626
  ]);
616
627
  const IonItemOptions = /*@__PURE__*/ defineContainer('ion-item-options', defineCustomElement$z, [
617
628
  'side',
@@ -629,7 +640,8 @@ const IonLabel = /*@__PURE__*/ defineContainer('ion-label', defineCustomElement$
629
640
  ]);
630
641
  const IonList = /*@__PURE__*/ defineContainer('ion-list', defineCustomElement$C, [
631
642
  'lines',
632
- 'inset'
643
+ 'inset',
644
+ 'shape'
633
645
  ]);
634
646
  const IonListHeader = /*@__PURE__*/ defineContainer('ion-list-header', defineCustomElement$D, [
635
647
  'color',
@@ -847,7 +859,8 @@ const IonSpinner = /*@__PURE__*/ defineContainer('ion-spinner', defineCustomElem
847
859
  'color',
848
860
  'duration',
849
861
  'name',
850
- 'paused'
862
+ 'paused',
863
+ 'size'
851
864
  ]);
852
865
  const IonSplitPane = /*@__PURE__*/ defineContainer('ion-split-pane', defineCustomElement$11, [
853
866
  'contentId',
@@ -855,16 +868,10 @@ const IonSplitPane = /*@__PURE__*/ defineContainer('ion-split-pane', defineCusto
855
868
  'when',
856
869
  'ionSplitPaneVisible'
857
870
  ]);
858
- const IonTab = /*@__PURE__*/ defineContainer('ion-tab', defineCustomElement$12, [
859
- 'active',
860
- 'delegate',
861
- 'tab',
862
- 'component'
863
- ]);
864
- const IonText = /*@__PURE__*/ defineContainer('ion-text', defineCustomElement$13, [
871
+ const IonText = /*@__PURE__*/ defineContainer('ion-text', defineCustomElement$12, [
865
872
  'color'
866
873
  ]);
867
- const IonTextarea = /*@__PURE__*/ defineContainer('ion-textarea', defineCustomElement$14, [
874
+ const IonTextarea = /*@__PURE__*/ defineContainer('ion-textarea', defineCustomElement$13, [
868
875
  'color',
869
876
  'autocapitalize',
870
877
  'autofocus',
@@ -893,18 +900,19 @@ const IonTextarea = /*@__PURE__*/ defineContainer('ion-textarea', defineCustomEl
893
900
  'label',
894
901
  'labelPlacement',
895
902
  'shape',
903
+ 'size',
896
904
  'ionChange',
897
905
  'ionInput',
898
906
  'ionBlur',
899
907
  'ionFocus'
900
908
  ], 'value', 'ion-input');
901
- const IonThumbnail = /*@__PURE__*/ defineContainer('ion-thumbnail', defineCustomElement$15);
902
- const IonTitle = /*@__PURE__*/ defineContainer('ion-title', defineCustomElement$16, [
909
+ const IonThumbnail = /*@__PURE__*/ defineContainer('ion-thumbnail', defineCustomElement$14);
910
+ const IonTitle = /*@__PURE__*/ defineContainer('ion-title', defineCustomElement$15, [
903
911
  'color',
904
912
  'size',
905
913
  'ionStyle'
906
914
  ]);
907
- const IonToggle = /*@__PURE__*/ defineContainer('ion-toggle', defineCustomElement$17, [
915
+ const IonToggle = /*@__PURE__*/ defineContainer('ion-toggle', defineCustomElement$16, [
908
916
  'color',
909
917
  'name',
910
918
  'checked',
@@ -918,7 +926,7 @@ const IonToggle = /*@__PURE__*/ defineContainer('ion-toggle', defineCustomElemen
918
926
  'ionFocus',
919
927
  'ionBlur'
920
928
  ], 'checked', 'ion-change');
921
- const IonToolbar = /*@__PURE__*/ defineContainer('ion-toolbar', defineCustomElement$18, [
929
+ const IonToolbar = /*@__PURE__*/ defineContainer('ion-toolbar', defineCustomElement$17, [
922
930
  'color'
923
931
  ]);
924
932
 
@@ -1096,7 +1104,7 @@ const IonicVue = {
1096
1104
  };
1097
1105
 
1098
1106
  const IonBackButton = /*@__PURE__*/ defineComponent((_, { attrs, slots }) => {
1099
- defineCustomElement$19();
1107
+ defineCustomElement$18();
1100
1108
  // TODO(FW-2969): type
1101
1109
  const ionRouter = inject("navManager");
1102
1110
  const onClick = () => {
@@ -1142,7 +1150,7 @@ const viewDepthKey = Symbol(0);
1142
1150
  const IonRouterOutlet = /*@__PURE__*/ defineComponent({
1143
1151
  name: "IonRouterOutlet",
1144
1152
  setup() {
1145
- defineCustomElement$1a();
1153
+ defineCustomElement$19();
1146
1154
  const injectedRoute = inject(routeLocationKey);
1147
1155
  const route = useRoute();
1148
1156
  const depth = inject(viewDepthKey, 0);
@@ -1576,13 +1584,9 @@ const IonTabButton = /*@__PURE__*/ defineComponent({
1576
1584
  selected: Boolean,
1577
1585
  tab: String,
1578
1586
  target: String,
1579
- _onClick: {
1580
- type: Function,
1581
- required: false,
1582
- },
1583
1587
  },
1584
1588
  setup(props, { slots }) {
1585
- defineCustomElement$1b();
1589
+ defineCustomElement$1a();
1586
1590
  // TODO(FW-2969): type
1587
1591
  const ionRouter = inject("navManager");
1588
1592
  const onClick = (ev) => {
@@ -1597,25 +1601,10 @@ const IonTabButton = /*@__PURE__*/ defineComponent({
1597
1601
  */
1598
1602
  const { tab, href, _getTabState } = props;
1599
1603
  const tabState = _getTabState();
1600
- const hasRouterOutlet = tabState.hasRouterOutlet;
1601
1604
  const tappedTab = tabState.tabs[tab] || {};
1602
1605
  const originalHref = tappedTab.originalHref || href;
1603
- /**
1604
- * If the router outlet is not defined, then the tabs is being used
1605
- * as a basic tab navigation without the router. In this case, we
1606
- * don't want to update the href else the URL will change.
1607
- */
1608
- const currentHref = hasRouterOutlet ? tappedTab.currentHref || href : "";
1606
+ const currentHref = tappedTab.currentHref || href;
1609
1607
  const prevActiveTab = tabState.activeTab;
1610
- if (!hasRouterOutlet && props._onClick) {
1611
- props._onClick(new CustomEvent("ionTabButtonClick", {
1612
- detail: {
1613
- href: currentHref,
1614
- selected: tab === prevActiveTab,
1615
- tab,
1616
- },
1617
- }));
1618
- }
1619
1608
  /**
1620
1609
  * If we are still on the same
1621
1610
  * tab as before, but the base href
@@ -1658,67 +1647,47 @@ const isTabBar = (node) => {
1658
1647
  return (node.type &&
1659
1648
  (node.type.name === "IonTabBar" || node.type === "ion-tab-bar"));
1660
1649
  };
1661
- const isTab = (node) => {
1662
- // The `ion-tab` component was created with the `v-for` directive.
1663
- if (node.type === Fragment) {
1664
- if (Array.isArray(node.children)) {
1665
- return node.children.some((child) => isVNode(child) && isTab(child));
1666
- }
1667
- return false; // In case the fragment has no children.
1668
- }
1669
- return (node.type && (node.type.name === "ion-tab" || node.type === IonTab));
1670
- };
1671
1650
  const IonTabs = /*@__PURE__*/ defineComponent({
1672
1651
  name: "IonTabs",
1673
1652
  emits: [WILL_CHANGE, DID_CHANGE],
1674
- setup(props, { slots, emit }) {
1675
- return {
1676
- props,
1677
- slots,
1678
- emit,
1679
- };
1680
- },
1681
- mounted() {
1682
- /**
1683
- * `defineCustomElement` must be called in the `mounted` hook
1684
- * to ensure that the custom element is defined after the
1685
- * component has been fully rendered and initialized.
1686
- * This prevents issues with undefined properties, like
1687
- * `selectedTab` from core, which may occur if the custom
1688
- * element is defined too early in the component's lifecycle.
1689
- */
1690
- defineCustomElement$1c();
1691
- },
1692
1653
  render() {
1693
- const { slots, emit, props } = this;
1654
+ var _a;
1655
+ const { $slots: slots, $emit } = this;
1694
1656
  const slottedContent = slots.default && slots.default();
1695
1657
  let routerOutlet;
1696
- let hasTab = false;
1658
+ /**
1659
+ * Developers must pass an ion-router-outlet
1660
+ * inside of ion-tabs.
1661
+ */
1697
1662
  if (slottedContent && slottedContent.length > 0) {
1698
- /**
1699
- * Developers must pass an ion-router-outlet
1700
- * inside of ion-tabs if they want to use
1701
- * the history stack or URL updates associated
1702
- * wit the router.
1703
- */
1704
1663
  routerOutlet = slottedContent.find((child) => isRouterOutlet(child));
1705
- /**
1706
- * Developers must pass at least one ion-tab
1707
- * inside of ion-tabs if they want to use a
1708
- * basic tab-based navigation without the
1709
- * history stack or URL updates associated
1710
- * with the router.
1711
- */
1712
- hasTab = slottedContent.some((child) => isTab(child));
1713
- }
1714
- if (!routerOutlet && !hasTab) {
1715
- throw new Error("IonTabs must contain an IonRouterOutlet or an IonTab.");
1716
1664
  }
1717
- if (routerOutlet && hasTab) {
1718
- throw new Error("IonTabs cannot contain an IonRouterOutlet and IonTab at the same time.");
1665
+ if (!routerOutlet) {
1666
+ throw new Error("IonTabs must contain an IonRouterOutlet. See https://ionicframework.com/docs/vue/navigation#working-with-tabs for more information.");
1719
1667
  }
1668
+ let childrenToRender = [
1669
+ h("div", {
1670
+ class: "tabs-inner",
1671
+ style: {
1672
+ position: "relative",
1673
+ flex: "1",
1674
+ contain: "layout size style",
1675
+ },
1676
+ }, routerOutlet),
1677
+ ];
1678
+ /**
1679
+ * If ion-tab-bar has slot="top" it needs to be
1680
+ * rendered before `.tabs-inner` otherwise it will
1681
+ * not show above the tab content.
1682
+ */
1720
1683
  if (slottedContent && slottedContent.length > 0) {
1721
- const slottedTabBar = slottedContent.find((child) => isTabBar(child));
1684
+ /**
1685
+ * Render all content except for router outlet
1686
+ * since that needs to be inside of `.tabs-inner`.
1687
+ */
1688
+ const filteredContent = slottedContent.filter((child) => !child.type || !isRouterOutlet(child));
1689
+ const slottedTabBar = filteredContent.find((child) => isTabBar(child));
1690
+ const hasTopSlotTabBar = slottedTabBar && ((_a = slottedTabBar.props) === null || _a === void 0 ? void 0 : _a.slot) === "top";
1722
1691
  if (slottedTabBar) {
1723
1692
  if (!slottedTabBar.props) {
1724
1693
  slottedTabBar.props = {};
@@ -1730,24 +1699,16 @@ const IonTabs = /*@__PURE__*/ defineComponent({
1730
1699
  * TODO: We may want to move logic from the tab bar into here
1731
1700
  * so we do not have code split across two components.
1732
1701
  */
1733
- slottedTabBar.props._tabsWillChange = (tab) => emit(WILL_CHANGE, { tab });
1734
- slottedTabBar.props._tabsDidChange = (tab) => emit(DID_CHANGE, { tab });
1735
- slottedTabBar.props._hasRouterOutlet = !!routerOutlet;
1702
+ slottedTabBar.props._tabsWillChange = (tab) => $emit(WILL_CHANGE, { tab });
1703
+ slottedTabBar.props._tabsDidChange = (tab) => $emit(DID_CHANGE, { tab });
1704
+ }
1705
+ if (hasTopSlotTabBar) {
1706
+ childrenToRender = [...filteredContent, ...childrenToRender];
1707
+ }
1708
+ else {
1709
+ childrenToRender = [...childrenToRender, ...filteredContent];
1736
1710
  }
1737
1711
  }
1738
- if (hasTab) {
1739
- return h("ion-tabs", Object.assign({}, props), slottedContent);
1740
- }
1741
- /**
1742
- * TODO(ROU-11056)
1743
- *
1744
- * Vue handles the error case for when there is no
1745
- * associated page matching the tab `href`.
1746
- *
1747
- * More investigation is needed to determine if we
1748
- * override the error handling and provide our own
1749
- * error message.
1750
- */
1751
1712
  return h("ion-tabs", {
1752
1713
  style: {
1753
1714
  display: "flex",
@@ -1762,7 +1723,7 @@ const IonTabs = /*@__PURE__*/ defineComponent({
1762
1723
  contain: "layout size style",
1763
1724
  "z-index": "0",
1764
1725
  },
1765
- }, slottedContent);
1726
+ }, childrenToRender);
1766
1727
  },
1767
1728
  });
1768
1729
 
@@ -1786,7 +1747,6 @@ const IonTabBar = defineComponent({
1786
1747
  /* eslint-disable @typescript-eslint/no-empty-function */
1787
1748
  _tabsWillChange: { type: Function, default: () => { } },
1788
1749
  _tabsDidChange: { type: Function, default: () => { } },
1789
- _hasRouterOutlet: { type: Boolean, default: false },
1790
1750
  /* eslint-enable @typescript-eslint/no-empty-function */
1791
1751
  },
1792
1752
  data() {
@@ -1803,7 +1763,6 @@ const IonTabBar = defineComponent({
1803
1763
  },
1804
1764
  methods: {
1805
1765
  setupTabState(ionRouter) {
1806
- const hasRouterOutlet = this.$props._hasRouterOutlet;
1807
1766
  /**
1808
1767
  * For each tab, we need to keep track of its
1809
1768
  * base href as well as any child page that
@@ -1820,65 +1779,25 @@ const IonTabBar = defineComponent({
1820
1779
  currentHref: child.props.href,
1821
1780
  ref: child,
1822
1781
  };
1823
- /**
1824
- * Passing this prop to each tab button
1825
- * lets it be aware of the presence of
1826
- * the router outlet.
1827
- */
1828
- tabState.hasRouterOutlet = hasRouterOutlet;
1829
1782
  /**
1830
1783
  * Passing this prop to each tab button
1831
1784
  * lets it be aware of the state that
1832
1785
  * ion-tab-bar is managing for it.
1833
1786
  */
1834
1787
  child.component.props._getTabState = () => tabState;
1835
- /**
1836
- * If the router outlet is not defined, then the tabs are being used
1837
- * as a basic tab navigation without the router. In this case, the
1838
- * tabs will not emit the `ionTabsDidChange` and `ionTabsWillChange`
1839
- * events through the `checkActiveTab` method. Instead, we need to
1840
- * handle those events through the tab buttons.
1841
- */
1842
- if (!hasRouterOutlet) {
1843
- child.component.props._onClick = (event) => {
1844
- this.handleIonTabButtonClick(event);
1845
- };
1846
- }
1847
1788
  });
1848
1789
  this.checkActiveTab(ionRouter);
1849
1790
  },
1850
- /**
1851
- * This method is called upon setup and when the
1852
- * history changes. It checks the current route
1853
- * and updates the active tab accordingly.
1854
- *
1855
- * History changes only occur when the router
1856
- * outlet is present. Due to this, the
1857
- * `ionTabsDidChange` and `ionTabsWillChange`
1858
- * events are only emitted when the router
1859
- * outlet is present. A different approach must
1860
- * be taken for tabs without a router outlet.
1861
- *
1862
- * @param ionRouter
1863
- */
1864
1791
  checkActiveTab(ionRouter) {
1865
- const hasRouterOutlet = this.$props._hasRouterOutlet;
1866
1792
  const currentRoute = ionRouter.getCurrentRouteInfo();
1867
1793
  const childNodes = this.$data.tabVnodes;
1868
1794
  const { tabs, activeTab: prevActiveTab } = this.$data.tabState;
1795
+ const tabState = this.$data.tabState;
1869
1796
  const tabKeys = Object.keys(tabs);
1870
- let activeTab = tabKeys.find((key) => {
1797
+ const activeTab = tabKeys.find((key) => {
1871
1798
  const href = tabs[key].originalHref;
1872
1799
  return currentRoute.pathname.startsWith(href);
1873
1800
  });
1874
- /**
1875
- * Tabs is being used as a basic tab navigation,
1876
- * so we need to set the first tab as active since
1877
- * `checkActiveTab` will not be called after setup.
1878
- */
1879
- if (!activeTab && !hasRouterOutlet) {
1880
- activeTab = tabKeys[0];
1881
- }
1882
1801
  /**
1883
1802
  * For each tab, check to see if the
1884
1803
  * base href has changed. If so, update
@@ -1922,36 +1841,23 @@ const IonTabBar = defineComponent({
1922
1841
  tabs[prevActiveTab] = Object.assign(Object.assign({}, tabs[prevActiveTab]), { currentHref: tabs[prevActiveTab].originalHref });
1923
1842
  }
1924
1843
  }
1925
- this.tabSwitch(activeTab, ionRouter);
1926
- },
1927
- handleIonTabButtonClick(event) {
1928
- const activeTab = event.detail.tab;
1929
- this.tabSwitch(activeTab);
1930
- },
1931
- tabSwitch(activeTab, ionRouter) {
1932
- const hasRouterOutlet = this.$props._hasRouterOutlet;
1933
- const childNodes = this.$data.tabVnodes;
1934
- const { activeTab: prevActiveTab } = this.$data.tabState;
1935
- const tabState = this.$data.tabState;
1936
1844
  const activeChild = childNodes.find((child) => { var _a; return isTabButton(child) && ((_a = child.props) === null || _a === void 0 ? void 0 : _a.tab) === activeTab; });
1937
1845
  const tabBar = this.$refs.ionTabBar;
1938
1846
  const tabDidChange = activeTab !== prevActiveTab;
1939
1847
  if (tabBar) {
1940
1848
  if (activeChild) {
1941
1849
  tabDidChange && this.$props._tabsWillChange(activeTab);
1942
- if (hasRouterOutlet && ionRouter) {
1943
- ionRouter.handleSetCurrentTab(activeTab);
1944
- }
1850
+ ionRouter.handleSetCurrentTab(activeTab);
1945
1851
  tabBar.selectedTab = tabState.activeTab = activeTab;
1946
1852
  tabDidChange && this.$props._tabsDidChange(activeTab);
1947
- }
1948
- else {
1949
1853
  /**
1950
1854
  * When going to a tab that does
1951
1855
  * not have an associated ion-tab-button
1952
1856
  * we need to remove the selected state from
1953
1857
  * the old tab.
1954
1858
  */
1859
+ }
1860
+ else {
1955
1861
  tabBar.selectedTab = tabState.activeTab = "";
1956
1862
  }
1957
1863
  }
@@ -1963,7 +1869,7 @@ const IonTabBar = defineComponent({
1963
1869
  ionRouter.registerHistoryChangeListener(() => this.checkActiveTab(ionRouter));
1964
1870
  },
1965
1871
  setup(_, { slots }) {
1966
- defineCustomElement$1d();
1872
+ defineCustomElement$1b();
1967
1873
  return () => {
1968
1874
  return h("ion-tab-bar", { ref: "ionTabBar" }, slots.default && slots.default());
1969
1875
  };
@@ -1972,7 +1878,7 @@ const IonTabBar = defineComponent({
1972
1878
 
1973
1879
  const userComponents = shallowRef([]);
1974
1880
  const IonApp = /*@__PURE__*/ defineComponent((_, { attrs, slots }) => {
1975
- defineCustomElement$1e();
1881
+ defineCustomElement$1c();
1976
1882
  return () => {
1977
1883
  return h("ion-app", Object.assign({}, attrs), [slots.default && slots.default(), ...userComponents.value]);
1978
1884
  };
@@ -2024,7 +1930,7 @@ const VueDelegate = (addFn = addTeleportedUserComponent, removeFn = removeTelepo
2024
1930
  };
2025
1931
 
2026
1932
  const IonNav = /*@__PURE__*/ defineComponent((props) => {
2027
- defineCustomElement$1f();
1933
+ defineCustomElement$1d();
2028
1934
  const views = shallowRef([]);
2029
1935
  /**
2030
1936
  * Allows us to create the component
@@ -2084,7 +1990,7 @@ const IonIcon = /*@__PURE__*/ defineComponent({
2084
1990
  src: String,
2085
1991
  },
2086
1992
  setup(props, { slots }) {
2087
- defineCustomElement$1g();
1993
+ defineCustomElement$1e();
2088
1994
  return () => {
2089
1995
  var _a, _b;
2090
1996
  const { icon, ios, md, mode } = props;
@@ -2273,13 +2179,13 @@ const defineOverlayContainer = (name, defineCustomElement, componentProps = [],
2273
2179
  * This is an autogenerated file created by 'scripts/copy-overlays.js'.
2274
2180
  * Changes made to this file will be overwritten on build.
2275
2181
  */
2276
- const IonActionSheet = /*@__PURE__*/ defineOverlayContainer('ion-action-sheet', defineCustomElement$1h, ['animated', 'backdropDismiss', 'buttons', 'cssClass', 'enterAnimation', 'header', 'htmlAttributes', 'isOpen', 'keyboardClose', 'leaveAnimation', 'mode', 'subHeader', 'translucent', 'trigger']);
2277
- const IonAlert = /*@__PURE__*/ defineOverlayContainer('ion-alert', defineCustomElement$1i, ['animated', 'backdropDismiss', 'buttons', 'cssClass', 'enterAnimation', 'header', 'htmlAttributes', 'inputs', 'isOpen', 'keyboardClose', 'leaveAnimation', 'message', 'mode', 'subHeader', 'translucent', 'trigger']);
2278
- const IonLoading = /*@__PURE__*/ defineOverlayContainer('ion-loading', defineCustomElement$1j, ['animated', 'backdropDismiss', 'cssClass', 'duration', 'enterAnimation', 'htmlAttributes', 'isOpen', 'keyboardClose', 'leaveAnimation', 'message', 'mode', 'showBackdrop', 'spinner', 'translucent', 'trigger']);
2279
- const IonPickerLegacy = /*@__PURE__*/ defineOverlayContainer('ion-picker-legacy', defineCustomElement$1k, ['animated', 'backdropDismiss', 'buttons', 'columns', 'cssClass', 'duration', 'enterAnimation', 'htmlAttributes', 'isOpen', 'keyboardClose', 'leaveAnimation', 'mode', 'showBackdrop', 'trigger']);
2280
- const IonToast = /*@__PURE__*/ defineOverlayContainer('ion-toast', defineCustomElement$1l, ['animated', 'buttons', 'color', 'cssClass', 'duration', 'enterAnimation', 'header', 'htmlAttributes', 'icon', 'isOpen', 'keyboardClose', 'layout', 'leaveAnimation', 'message', 'mode', 'position', 'positionAnchor', 'swipeGesture', 'translucent', 'trigger']);
2281
- const IonModal = /*@__PURE__*/ defineOverlayContainer('ion-modal', defineCustomElement$1m, ['animated', 'backdropBreakpoint', 'backdropDismiss', 'breakpoints', 'canDismiss', 'enterAnimation', 'focusTrap', 'handle', 'handleBehavior', 'htmlAttributes', 'initialBreakpoint', 'isOpen', 'keepContentsMounted', 'keyboardClose', 'leaveAnimation', 'mode', 'presentingElement', 'showBackdrop', 'trigger'], true);
2282
- const IonPopover = /*@__PURE__*/ defineOverlayContainer('ion-popover', defineCustomElement$1n, ['alignment', 'animated', 'arrow', 'backdropDismiss', 'component', 'componentProps', 'dismissOnSelect', 'enterAnimation', 'event', 'focusTrap', 'htmlAttributes', 'isOpen', 'keepContentsMounted', 'keyboardClose', 'leaveAnimation', 'mode', 'reference', 'showBackdrop', 'side', 'size', 'translucent', 'trigger', 'triggerAction']);
2182
+ const IonActionSheet = /*@__PURE__*/ defineOverlayContainer('ion-action-sheet', defineCustomElement$1f, ['animated', 'backdropDismiss', 'buttons', 'cssClass', 'enterAnimation', 'header', 'htmlAttributes', 'isOpen', 'keyboardClose', 'leaveAnimation', 'mode', 'subHeader', 'theme', 'translucent', 'trigger']);
2183
+ const IonAlert = /*@__PURE__*/ defineOverlayContainer('ion-alert', defineCustomElement$1g, ['animated', 'backdropDismiss', 'buttons', 'cssClass', 'enterAnimation', 'header', 'htmlAttributes', 'inputs', 'isOpen', 'keyboardClose', 'leaveAnimation', 'message', 'mode', 'subHeader', 'theme', 'translucent', 'trigger']);
2184
+ const IonLoading = /*@__PURE__*/ defineOverlayContainer('ion-loading', defineCustomElement$1h, ['animated', 'backdropDismiss', 'cssClass', 'duration', 'enterAnimation', 'htmlAttributes', 'isOpen', 'keyboardClose', 'leaveAnimation', 'message', 'mode', 'showBackdrop', 'spinner', 'theme', 'translucent', 'trigger']);
2185
+ const IonPickerLegacy = /*@__PURE__*/ defineOverlayContainer('ion-picker-legacy', defineCustomElement$1i, ['animated', 'backdropDismiss', 'buttons', 'columns', 'cssClass', 'duration', 'enterAnimation', 'htmlAttributes', 'isOpen', 'keyboardClose', 'leaveAnimation', 'mode', 'showBackdrop', 'theme', 'trigger']);
2186
+ const IonToast = /*@__PURE__*/ defineOverlayContainer('ion-toast', defineCustomElement$1j, ['animated', 'buttons', 'color', 'cssClass', 'duration', 'enterAnimation', 'header', 'htmlAttributes', 'icon', 'isOpen', 'keyboardClose', 'layout', 'leaveAnimation', 'message', 'mode', 'position', 'positionAnchor', 'swipeGesture', 'theme', 'translucent', 'trigger']);
2187
+ const IonModal = /*@__PURE__*/ defineOverlayContainer('ion-modal', defineCustomElement$1k, ['animated', 'backdropBreakpoint', 'backdropDismiss', 'breakpoints', 'canDismiss', 'enterAnimation', 'focusTrap', 'handle', 'handleBehavior', 'htmlAttributes', 'initialBreakpoint', 'isOpen', 'keepContentsMounted', 'keyboardClose', 'leaveAnimation', 'mode', 'presentingElement', 'showBackdrop', 'theme', 'trigger'], true);
2188
+ const IonPopover = /*@__PURE__*/ defineOverlayContainer('ion-popover', defineCustomElement$1l, ['alignment', 'animated', 'arrow', 'backdropDismiss', 'component', 'componentProps', 'dismissOnSelect', 'enterAnimation', 'event', 'focusTrap', 'htmlAttributes', 'isOpen', 'keepContentsMounted', 'keyboardClose', 'leaveAnimation', 'mode', 'reference', 'showBackdrop', 'side', 'size', 'theme', 'translucent', 'trigger', 'triggerAction']);
2283
2189
 
2284
2190
  // TODO(FW-2969): types
2285
2191
  /**
@@ -2296,16 +2202,16 @@ const createController = (defineCustomElement, oldController, useDelegate = fals
2296
2202
  };
2297
2203
  return oldController;
2298
2204
  };
2299
- const modalController = /*@__PURE__*/ createController(defineCustomElement$1m, modalController$1, true);
2300
- const popoverController = /*@__PURE__*/ createController(defineCustomElement$1n, popoverController$1, true);
2301
- const alertController = /*@__PURE__*/ createController(defineCustomElement$1i, alertController$1);
2302
- const actionSheetController = /*@__PURE__*/ createController(defineCustomElement$1h, actionSheetController$1);
2303
- const loadingController = /*@__PURE__*/ createController(defineCustomElement$1j, loadingController$1);
2205
+ const modalController = /*@__PURE__*/ createController(defineCustomElement$1k, modalController$1, true);
2206
+ const popoverController = /*@__PURE__*/ createController(defineCustomElement$1l, popoverController$1, true);
2207
+ const alertController = /*@__PURE__*/ createController(defineCustomElement$1g, alertController$1);
2208
+ const actionSheetController = /*@__PURE__*/ createController(defineCustomElement$1f, actionSheetController$1);
2209
+ const loadingController = /*@__PURE__*/ createController(defineCustomElement$1h, loadingController$1);
2304
2210
  /**
2305
2211
  * @deprecated Use the inline ion-picker component instead.
2306
2212
  */
2307
- const pickerController = /*@__PURE__*/ createController(defineCustomElement$1k, pickerController$1);
2308
- const toastController = /*@__PURE__*/ createController(defineCustomElement$1l, toastController$1);
2213
+ const pickerController = /*@__PURE__*/ createController(defineCustomElement$1i, pickerController$1);
2214
+ const toastController = /*@__PURE__*/ createController(defineCustomElement$1j, toastController$1);
2309
2215
 
2310
- export { IonAccordion, IonAccordionGroup, IonActionSheet, IonAlert, IonApp, IonAvatar, IonBackButton, IonBackdrop, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonButton, IonButtons, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonCheckbox, IonChip, IonCol, IonContent, IonDatetime, IonDatetimeButton, IonFab, IonFabButton, IonFabList, IonFooter, IonGrid, IonHeader, IonIcon, IonImg, IonInfiniteScroll, IonInfiniteScrollContent, IonInput, IonInputPasswordToggle, IonItem, IonItemDivider, IonItemGroup, IonItemOption, IonItemOptions, IonItemSliding, IonLabel, IonList, IonListHeader, IonLoading, IonMenu, IonMenuButton, IonMenuToggle, IonModal, IonNav, IonNavLink, IonNote, IonPage, IonPicker, IonPickerColumn, IonPickerColumnOption, IonPickerLegacy, IonPopover, IonProgressBar, IonRadio, IonRadioGroup, IonRange, IonRefresher, IonRefresherContent, IonReorder, IonReorderGroup, IonRippleEffect, IonRouterOutlet, IonRow, IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption, IonSkeletonText, IonSpinner, IonSplitPane, IonTab, IonTabBar, IonTabButton, IonTabs, IonText, IonTextarea, IonThumbnail, IonTitle, IonToast, IonToggle, IonToolbar, IonicVue, actionSheetController, alertController, loadingController, modalController, onIonViewDidEnter, onIonViewDidLeave, onIonViewWillEnter, onIonViewWillLeave, pickerController, popoverController, toastController, useBackButton, useIonRouter, useKeyboard };
2216
+ export { IonAccordion, IonAccordionGroup, IonActionSheet, IonAlert, IonApp, IonAvatar, IonBackButton, IonBackdrop, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonButton, IonButtons, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonCheckbox, IonChip, IonCol, IonContent, IonDatetime, IonDatetimeButton, IonFab, IonFabButton, IonFabList, IonFooter, IonGrid, IonHeader, IonIcon, IonImg, IonInfiniteScroll, IonInfiniteScrollContent, IonInput, IonInputPasswordToggle, IonItem, IonItemDivider, IonItemGroup, IonItemOption, IonItemOptions, IonItemSliding, IonLabel, IonList, IonListHeader, IonLoading, IonMenu, IonMenuButton, IonMenuToggle, IonModal, IonNav, IonNavLink, IonNote, IonPage, IonPicker, IonPickerColumn, IonPickerColumnOption, IonPickerLegacy, IonPopover, IonProgressBar, IonRadio, IonRadioGroup, IonRange, IonRefresher, IonRefresherContent, IonReorder, IonReorderGroup, IonRippleEffect, IonRouterOutlet, IonRow, IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption, IonSkeletonText, IonSpinner, IonSplitPane, IonTabBar, IonTabButton, IonTabs, IonText, IonTextarea, IonThumbnail, IonTitle, IonToast, IonToggle, IonToolbar, IonicVue, actionSheetController, alertController, loadingController, modalController, onIonViewDidEnter, onIonViewDidLeave, onIonViewWillEnter, onIonViewWillLeave, pickerController, popoverController, toastController, useBackButton, useIonRouter, useKeyboard };
2311
2217
  //# sourceMappingURL=index.js.map