@ionic/core 8.7.17-dev.11767891829.1a63afa3 → 8.7.17-dev.11767895575.16ea7cef
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.
- package/components/content.js +8 -96
- package/components/ion-tab-bar.js +23 -3
- package/components/modal.js +12 -213
- package/components/popover.js +11 -83
- package/dist/cjs/ion-app_8.cjs.entry.js +20 -107
- package/dist/cjs/ion-modal.cjs.entry.js +12 -213
- package/dist/cjs/ion-popover.cjs.entry.js +11 -83
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +23 -3
- package/dist/collection/components/content/content.css +0 -10
- package/dist/collection/components/content/content.js +6 -94
- package/dist/collection/components/modal/gestures/sheet.js +1 -3
- package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -3
- package/dist/collection/components/modal/modal.ios.css +4 -0
- package/dist/collection/components/modal/modal.js +7 -205
- package/dist/collection/components/modal/modal.md.css +4 -0
- package/dist/collection/components/popover/animations/ios.enter.js +5 -21
- package/dist/collection/components/popover/animations/md.enter.js +5 -30
- package/dist/collection/components/popover/utils.js +1 -32
- package/dist/collection/components/tab-bar/tab-bar.js +23 -3
- package/dist/docs.json +1 -1
- package/dist/esm/ion-app_8.entry.js +9 -96
- package/dist/esm/ion-modal.entry.js +12 -213
- package/dist/esm/ion-popover.entry.js +11 -83
- package/dist/esm/ion-tab-bar_2.entry.js +23 -3
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-172a579f.entry.js +4 -0
- package/dist/ionic/p-732b2fd6.entry.js +4 -0
- package/dist/ionic/p-91840a80.entry.js +4 -0
- package/dist/ionic/p-f9061316.entry.js +4 -0
- package/dist/types/components/content/content.d.ts +0 -24
- package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
- package/dist/types/components/modal/gestures/swipe-to-close.d.ts +1 -1
- package/dist/types/components/modal/modal.d.ts +0 -45
- package/dist/types/components/popover/utils.d.ts +0 -2
- package/dist/types/components/tab-bar/tab-bar.d.ts +1 -0
- package/hydrate/index.js +52 -385
- package/hydrate/index.mjs +52 -385
- package/package.json +1 -1
- package/dist/ionic/p-7268efa5.entry.js +0 -4
- package/dist/ionic/p-968a55d1.entry.js +0 -4
- package/dist/ionic/p-d9fd799f.entry.js +0 -4
- package/dist/ionic/p-ec9ca3fe.entry.js +0 -4
package/hydrate/index.js
CHANGED
|
@@ -10499,7 +10499,7 @@ const isRTL$1 = (hostEl) => {
|
|
|
10499
10499
|
return (document === null || document === void 0 ? void 0 : document.dir.toLowerCase()) === 'rtl';
|
|
10500
10500
|
};
|
|
10501
10501
|
|
|
10502
|
-
const contentCss = ":host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:\"\"}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}
|
|
10502
|
+
const contentCss = ":host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:\"\"}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}";
|
|
10503
10503
|
|
|
10504
10504
|
/**
|
|
10505
10505
|
* @slot - Content is placed in the scrollable area if provided without a slot.
|
|
@@ -10523,12 +10523,6 @@ class Content {
|
|
|
10523
10523
|
this.isMainContent = true;
|
|
10524
10524
|
this.resizeTimeout = null;
|
|
10525
10525
|
this.inheritedAttributes = {};
|
|
10526
|
-
/**
|
|
10527
|
-
* Track whether this content has sibling header/footer elements.
|
|
10528
|
-
* When absent, we need to apply safe-area padding directly.
|
|
10529
|
-
*/
|
|
10530
|
-
this.hasHeader = false;
|
|
10531
|
-
this.hasFooter = false;
|
|
10532
10526
|
this.tabsElement = null;
|
|
10533
10527
|
// Detail is used in a hot loop in the scroll event, by allocating it here
|
|
10534
10528
|
// V8 will be able to inline any read/write to it since it's a monomorphic class.
|
|
@@ -10583,13 +10577,7 @@ class Content {
|
|
|
10583
10577
|
this.inheritedAttributes = inheritAriaAttributes(this.el);
|
|
10584
10578
|
}
|
|
10585
10579
|
connectedCallback() {
|
|
10586
|
-
|
|
10587
|
-
// Content is "main" if not inside menu/popover/modal and not nested in another ion-content
|
|
10588
|
-
this.isMainContent =
|
|
10589
|
-
this.el.closest('ion-menu, ion-popover, ion-modal') === null &&
|
|
10590
|
-
((_a = this.el.parentElement) === null || _a === void 0 ? void 0 : _a.closest('ion-content')) === null;
|
|
10591
|
-
// Detect sibling header/footer for safe-area handling
|
|
10592
|
-
this.detectSiblingElements();
|
|
10580
|
+
this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null;
|
|
10593
10581
|
/**
|
|
10594
10582
|
* The fullscreen content offsets need to be
|
|
10595
10583
|
* computed after the tab bar has loaded. Since
|
|
@@ -10620,79 +10608,13 @@ class Content {
|
|
|
10620
10608
|
* bubbles, we can catch any instances of child tab bars loading by listening
|
|
10621
10609
|
* on IonTabs.
|
|
10622
10610
|
*/
|
|
10623
|
-
this.tabsLoadCallback = () =>
|
|
10624
|
-
this.resize();
|
|
10625
|
-
// Re-detect footer when tab bar loads (it may not exist during initial detection)
|
|
10626
|
-
this.updateSiblingDetection();
|
|
10627
|
-
};
|
|
10611
|
+
this.tabsLoadCallback = () => this.resize();
|
|
10628
10612
|
closestTabs.addEventListener('ionTabBarLoaded', this.tabsLoadCallback);
|
|
10629
10613
|
}
|
|
10630
10614
|
}
|
|
10631
10615
|
}
|
|
10632
|
-
/**
|
|
10633
|
-
* Detects sibling ion-header and ion-footer elements and sets up
|
|
10634
|
-
* a mutation observer to handle dynamic changes (e.g., conditional rendering).
|
|
10635
|
-
*/
|
|
10636
|
-
detectSiblingElements() {
|
|
10637
|
-
this.updateSiblingDetection();
|
|
10638
|
-
// Watch for dynamic header/footer changes (common in React conditional rendering)
|
|
10639
|
-
const parent = this.el.parentElement;
|
|
10640
|
-
if (parent && !this.parentMutationObserver && win$1 !== undefined && 'MutationObserver' in win$1) {
|
|
10641
|
-
this.parentMutationObserver = new MutationObserver(() => {
|
|
10642
|
-
this.updateSiblingDetection();
|
|
10643
|
-
});
|
|
10644
|
-
this.parentMutationObserver.observe(parent, { childList: true });
|
|
10645
|
-
}
|
|
10646
|
-
}
|
|
10647
|
-
/**
|
|
10648
|
-
* Updates hasHeader/hasFooter based on current DOM state.
|
|
10649
|
-
* Checks both direct siblings and elements wrapped in custom components
|
|
10650
|
-
* (e.g., <my-header><ion-header>...</ion-header></my-header>).
|
|
10651
|
-
*/
|
|
10652
|
-
updateSiblingDetection() {
|
|
10653
|
-
const parent = this.el.parentElement;
|
|
10654
|
-
if (parent) {
|
|
10655
|
-
// First check for direct ion-header/ion-footer siblings
|
|
10656
|
-
this.hasHeader = parent.querySelector(':scope > ion-header') !== null;
|
|
10657
|
-
this.hasFooter = parent.querySelector(':scope > ion-footer') !== null;
|
|
10658
|
-
// If not found, check if any sibling contains them (wrapped components)
|
|
10659
|
-
if (!this.hasHeader) {
|
|
10660
|
-
this.hasHeader = this.siblingContainsElement(parent, 'ion-header');
|
|
10661
|
-
}
|
|
10662
|
-
if (!this.hasFooter) {
|
|
10663
|
-
this.hasFooter = this.siblingContainsElement(parent, 'ion-footer');
|
|
10664
|
-
}
|
|
10665
|
-
}
|
|
10666
|
-
// If no footer found, check if we're inside ion-tabs which has ion-tab-bar
|
|
10667
|
-
if (!this.hasFooter) {
|
|
10668
|
-
const tabs = this.el.closest('ion-tabs');
|
|
10669
|
-
if (tabs) {
|
|
10670
|
-
this.hasFooter = tabs.querySelector(':scope > ion-tab-bar') !== null;
|
|
10671
|
-
}
|
|
10672
|
-
}
|
|
10673
|
-
}
|
|
10674
|
-
/**
|
|
10675
|
-
* Checks if any sibling element of ion-content contains the specified element.
|
|
10676
|
-
* Only searches one level deep to avoid finding elements in nested pages.
|
|
10677
|
-
*/
|
|
10678
|
-
siblingContainsElement(parent, tagName) {
|
|
10679
|
-
for (const sibling of parent.children) {
|
|
10680
|
-
// Skip ion-content itself
|
|
10681
|
-
if (sibling === this.el)
|
|
10682
|
-
continue;
|
|
10683
|
-
// Check if this sibling contains the target element as an immediate child
|
|
10684
|
-
if (sibling.querySelector(`:scope > ${tagName}`) !== null) {
|
|
10685
|
-
return true;
|
|
10686
|
-
}
|
|
10687
|
-
}
|
|
10688
|
-
return false;
|
|
10689
|
-
}
|
|
10690
10616
|
disconnectedCallback() {
|
|
10691
|
-
var _a;
|
|
10692
10617
|
this.onScrollEnd();
|
|
10693
|
-
// Clean up mutation observer to prevent memory leaks
|
|
10694
|
-
(_a = this.parentMutationObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
10695
|
-
this.parentMutationObserver = undefined;
|
|
10696
10618
|
if (hasLazyBuild(this.el)) {
|
|
10697
10619
|
/**
|
|
10698
10620
|
* The event listener and tabs caches need to
|
|
@@ -10921,28 +10843,26 @@ class Content {
|
|
|
10921
10843
|
}
|
|
10922
10844
|
}
|
|
10923
10845
|
render() {
|
|
10924
|
-
const { fixedSlotPlacement,
|
|
10846
|
+
const { fixedSlotPlacement, inheritedAttributes, isMainContent, scrollX, scrollY, el } = this;
|
|
10925
10847
|
const rtl = isRTL$1(el) ? 'rtl' : 'ltr';
|
|
10926
10848
|
const mode = getIonMode$1(this);
|
|
10927
10849
|
const forceOverscroll = this.shouldForceOverscroll();
|
|
10928
10850
|
const transitionShadow = mode === 'ios';
|
|
10929
10851
|
this.resize();
|
|
10930
|
-
return (hAsync(Host, Object.assign({ key: '
|
|
10852
|
+
return (hAsync(Host, Object.assign({ key: 'cd8781f848d8dc926fe66f43d43c49564425a507', role: isMainContent ? 'main' : undefined, class: createColorClasses$1(this.color, {
|
|
10931
10853
|
[mode]: true,
|
|
10932
10854
|
'content-sizing': hostContext('ion-popover', this.el),
|
|
10933
10855
|
overscroll: forceOverscroll,
|
|
10934
10856
|
[`content-${rtl}`]: true,
|
|
10935
|
-
'safe-area-top': isMainContent && !hasHeader,
|
|
10936
|
-
'safe-area-bottom': isMainContent && !hasFooter,
|
|
10937
10857
|
}), style: {
|
|
10938
10858
|
'--offset-top': `${this.cTop}px`,
|
|
10939
10859
|
'--offset-bottom': `${this.cBottom}px`,
|
|
10940
|
-
} }, inheritedAttributes), hAsync("div", { key: '
|
|
10860
|
+
} }, inheritedAttributes), hAsync("div", { key: '95b112d7cae30f22ef778ceffb88edb4d941c170', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? hAsync("slot", { name: "fixed" }) : null, hAsync("div", { key: '2fdfcbc39fb66f11b6191911f2941c660f4c12e5', class: {
|
|
10941
10861
|
'inner-scroll': true,
|
|
10942
10862
|
'scroll-x': scrollX,
|
|
10943
10863
|
'scroll-y': scrollY,
|
|
10944
10864
|
overscroll: (scrollX || scrollY) && forceOverscroll,
|
|
10945
|
-
}, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: '
|
|
10865
|
+
}, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, hAsync("slot", { key: '6bc77e0054ec8e21635a7f2abfe0ca46e0962e03' })), transitionShadow ? (hAsync("div", { class: "transition-effect" }, hAsync("div", { class: "transition-cover" }), hAsync("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? hAsync("slot", { name: "fixed" }) : null));
|
|
10946
10866
|
}
|
|
10947
10867
|
get el() { return getElement(this); }
|
|
10948
10868
|
static get style() { return contentCss; }
|
|
@@ -21613,7 +21533,7 @@ const calculateSpringStep = (t) => {
|
|
|
21613
21533
|
const SwipeToCloseDefaults = {
|
|
21614
21534
|
MIN_PRESENTING_SCALE: 0.915,
|
|
21615
21535
|
};
|
|
21616
|
-
const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss
|
|
21536
|
+
const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss) => {
|
|
21617
21537
|
/**
|
|
21618
21538
|
* The step value at which a card modal
|
|
21619
21539
|
* is eligible for dismissing via gesture.
|
|
@@ -21770,8 +21690,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onG
|
|
|
21770
21690
|
const processedStep = isAttemptingDismissWithCanDismiss ? calculateSpringStep(step / maxStep) : step;
|
|
21771
21691
|
const clampedStep = clamp(0.0001, processedStep, maxStep);
|
|
21772
21692
|
animation.progressStep(clampedStep);
|
|
21773
|
-
// Notify modal of position change for safe-area updates
|
|
21774
|
-
onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
|
|
21775
21693
|
/**
|
|
21776
21694
|
* When swiping down half way, the status bar style
|
|
21777
21695
|
* should be reset to its default value.
|
|
@@ -22315,7 +22233,7 @@ const mdLeaveAnimation$2 = (baseEl, opts) => {
|
|
|
22315
22233
|
return baseAnimation;
|
|
22316
22234
|
};
|
|
22317
22235
|
|
|
22318
|
-
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange
|
|
22236
|
+
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
|
|
22319
22237
|
// Defaults for the sheet swipe animation
|
|
22320
22238
|
const defaultBackdrop = [
|
|
22321
22239
|
{ offset: 0, opacity: 'var(--backdrop-opacity)' },
|
|
@@ -22646,8 +22564,6 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
22646
22564
|
: step;
|
|
22647
22565
|
offset = clamp(0.0001, processedStep, maxStep);
|
|
22648
22566
|
animation.progressStep(offset);
|
|
22649
|
-
// Notify modal of position change for safe-area updates
|
|
22650
|
-
onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
|
|
22651
22567
|
};
|
|
22652
22568
|
const onEnd = (detail) => {
|
|
22653
22569
|
/**
|
|
@@ -22842,9 +22758,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
22842
22758
|
};
|
|
22843
22759
|
};
|
|
22844
22760
|
|
|
22845
|
-
const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}";
|
|
22761
|
+
const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}";
|
|
22846
22762
|
|
|
22847
|
-
const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
|
|
22763
|
+
const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
|
|
22848
22764
|
|
|
22849
22765
|
// TODO(FW-2832): types
|
|
22850
22766
|
/**
|
|
@@ -22877,10 +22793,6 @@ class Modal {
|
|
|
22877
22793
|
this.inline = false;
|
|
22878
22794
|
// Whether or not modal is being dismissed via gesture
|
|
22879
22795
|
this.gestureAnimationDismissing = false;
|
|
22880
|
-
// Whether to skip coordinate-based safe-area detection (for fullscreen phone modals)
|
|
22881
|
-
this.skipSafeAreaCoordinateDetection = false;
|
|
22882
|
-
// Track previous safe-area state to avoid redundant DOM writes
|
|
22883
|
-
this.prevSafeAreaState = { top: false, bottom: false, left: false, right: false };
|
|
22884
22796
|
this.presented = false;
|
|
22885
22797
|
/** @internal */
|
|
22886
22798
|
this.hasController = false;
|
|
@@ -23071,10 +22983,7 @@ class Modal {
|
|
|
23071
22983
|
}
|
|
23072
22984
|
}
|
|
23073
22985
|
onWindowResize() {
|
|
23074
|
-
//
|
|
23075
|
-
this.cachedSafeAreas = undefined;
|
|
23076
|
-
this.updateSafeAreaOverrides();
|
|
23077
|
-
// Only handle view transition for iOS card modals when no custom animations are provided
|
|
22986
|
+
// Only handle resize for iOS card modals when no custom animations are provided
|
|
23078
22987
|
if (getIonMode$1(this) !== 'ios' || !this.presentingElement || this.enterAnimation || this.leaveAnimation) {
|
|
23079
22988
|
return;
|
|
23080
22989
|
}
|
|
@@ -23097,8 +23006,6 @@ class Modal {
|
|
|
23097
23006
|
this.triggerController.removeClickListener();
|
|
23098
23007
|
this.cleanupViewTransitionListener();
|
|
23099
23008
|
this.cleanupParentRemovalObserver();
|
|
23100
|
-
// Reset safe-area state to handle removal without dismiss (e.g., framework unmount)
|
|
23101
|
-
this.resetSafeAreaState();
|
|
23102
23009
|
}
|
|
23103
23010
|
componentWillLoad() {
|
|
23104
23011
|
var _a;
|
|
@@ -23258,8 +23165,6 @@ class Modal {
|
|
|
23258
23165
|
else if (!this.keepContentsMounted) {
|
|
23259
23166
|
await waitForMount();
|
|
23260
23167
|
}
|
|
23261
|
-
// Predict safe-area needs based on modal configuration to avoid visual snap
|
|
23262
|
-
this.setInitialSafeAreaOverrides(presentingElement);
|
|
23263
23168
|
writeTask(() => this.el.classList.add('show-modal'));
|
|
23264
23169
|
const hasCardModal = presentingElement !== undefined;
|
|
23265
23170
|
/**
|
|
@@ -23321,8 +23226,6 @@ class Modal {
|
|
|
23321
23226
|
else if (hasCardModal) {
|
|
23322
23227
|
this.initSwipeToClose();
|
|
23323
23228
|
}
|
|
23324
|
-
// Now that animation is complete, update safe-area based on actual position
|
|
23325
|
-
this.updateSafeAreaOverrides();
|
|
23326
23229
|
// Initialize view transition listener for iOS card modals
|
|
23327
23230
|
this.initViewTransitionListener();
|
|
23328
23231
|
// Initialize parent removal observer
|
|
@@ -23374,7 +23277,7 @@ class Modal {
|
|
|
23374
23277
|
await this.dismiss(undefined, GESTURE);
|
|
23375
23278
|
this.gestureAnimationDismissing = false;
|
|
23376
23279
|
});
|
|
23377
|
-
}
|
|
23280
|
+
});
|
|
23378
23281
|
this.gesture.enable(true);
|
|
23379
23282
|
}
|
|
23380
23283
|
initSheetGesture() {
|
|
@@ -23395,8 +23298,7 @@ class Modal {
|
|
|
23395
23298
|
this.currentBreakpoint = breakpoint;
|
|
23396
23299
|
this.ionBreakpointDidChange.emit({ breakpoint });
|
|
23397
23300
|
}
|
|
23398
|
-
|
|
23399
|
-
}, () => this.updateSafeAreaOverrides());
|
|
23301
|
+
});
|
|
23400
23302
|
this.gesture = gesture;
|
|
23401
23303
|
this.moveSheetToBreakpoint = moveSheetToBreakpoint;
|
|
23402
23304
|
this.gesture.enable(true);
|
|
@@ -23474,187 +23376,6 @@ class Modal {
|
|
|
23474
23376
|
// Clear the cached reference
|
|
23475
23377
|
this.cachedPageParent = undefined;
|
|
23476
23378
|
}
|
|
23477
|
-
/**
|
|
23478
|
-
* Sets initial safe-area overrides based on modal configuration before
|
|
23479
|
-
* the modal becomes visible. This predicts whether the modal will touch
|
|
23480
|
-
* screen edges to avoid a visual snap after animation completes.
|
|
23481
|
-
*/
|
|
23482
|
-
setInitialSafeAreaOverrides(presentingElement) {
|
|
23483
|
-
const style = this.el.style;
|
|
23484
|
-
const mode = getIonMode$1(this);
|
|
23485
|
-
const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
23486
|
-
// Card modals only exist in iOS mode - in MD mode, presentingElement is ignored
|
|
23487
|
-
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
23488
|
-
const isTablet = window.innerWidth >= 768;
|
|
23489
|
-
// Sheet modals always touch bottom edge, never top/left/right
|
|
23490
|
-
if (isSheetModal) {
|
|
23491
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
23492
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
23493
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
23494
|
-
return;
|
|
23495
|
-
}
|
|
23496
|
-
// Card modals have rounded top corners
|
|
23497
|
-
if (isCardModal) {
|
|
23498
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
23499
|
-
if (isTablet) {
|
|
23500
|
-
// On tablets, card modals are inset from all edges
|
|
23501
|
-
this.zeroAllSafeAreas();
|
|
23502
|
-
}
|
|
23503
|
-
else {
|
|
23504
|
-
// On phones, card modals still extend to the bottom edge
|
|
23505
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
23506
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
23507
|
-
this.applyFullscreenSafeArea();
|
|
23508
|
-
}
|
|
23509
|
-
return;
|
|
23510
|
-
}
|
|
23511
|
-
// Phone-sized fullscreen modals inherit safe areas and use wrapper padding
|
|
23512
|
-
if (!isTablet) {
|
|
23513
|
-
this.applyFullscreenSafeArea();
|
|
23514
|
-
return;
|
|
23515
|
-
}
|
|
23516
|
-
// Check if tablet modal is fullscreen via CSS custom properties
|
|
23517
|
-
const computedStyle = getComputedStyle(this.el);
|
|
23518
|
-
const width = computedStyle.getPropertyValue('--width').trim();
|
|
23519
|
-
const height = computedStyle.getPropertyValue('--height').trim();
|
|
23520
|
-
const isFullscreen = width === '100%' && height === '100%';
|
|
23521
|
-
if (isFullscreen) {
|
|
23522
|
-
this.applyFullscreenSafeArea();
|
|
23523
|
-
}
|
|
23524
|
-
else {
|
|
23525
|
-
// Centered dialog doesn't touch edges
|
|
23526
|
-
this.zeroAllSafeAreas();
|
|
23527
|
-
}
|
|
23528
|
-
}
|
|
23529
|
-
/**
|
|
23530
|
-
* Applies safe-area handling for fullscreen modals.
|
|
23531
|
-
* Adds wrapper padding when no footer is present to prevent
|
|
23532
|
-
* content from overlapping system navigation areas.
|
|
23533
|
-
*/
|
|
23534
|
-
applyFullscreenSafeArea() {
|
|
23535
|
-
this.skipSafeAreaCoordinateDetection = true;
|
|
23536
|
-
this.updateFooterPadding();
|
|
23537
|
-
// Watch for dynamic footer additions/removals (e.g., async data loading)
|
|
23538
|
-
// Use subtree:true to support wrapped footers in framework components
|
|
23539
|
-
// (e.g., <my-footer><ion-footer>...</ion-footer></my-footer>)
|
|
23540
|
-
if (!this.footerObserver && win$1 !== undefined && 'MutationObserver' in win$1) {
|
|
23541
|
-
this.footerObserver = new MutationObserver(() => this.updateFooterPadding());
|
|
23542
|
-
this.footerObserver.observe(this.el, { childList: true, subtree: true });
|
|
23543
|
-
}
|
|
23544
|
-
}
|
|
23545
|
-
/**
|
|
23546
|
-
* Updates wrapper padding based on footer presence.
|
|
23547
|
-
* Called initially and when footer is dynamically added/removed.
|
|
23548
|
-
*/
|
|
23549
|
-
updateFooterPadding() {
|
|
23550
|
-
if (!this.wrapperEl)
|
|
23551
|
-
return;
|
|
23552
|
-
const hasFooter = this.el.querySelector('ion-footer') !== null;
|
|
23553
|
-
if (hasFooter) {
|
|
23554
|
-
this.wrapperEl.style.removeProperty('padding-bottom');
|
|
23555
|
-
this.wrapperEl.style.removeProperty('box-sizing');
|
|
23556
|
-
}
|
|
23557
|
-
else {
|
|
23558
|
-
this.wrapperEl.style.setProperty('padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
|
|
23559
|
-
this.wrapperEl.style.setProperty('box-sizing', 'border-box');
|
|
23560
|
-
}
|
|
23561
|
-
}
|
|
23562
|
-
/**
|
|
23563
|
-
* Sets all safe-area CSS variables to 0px for modals that
|
|
23564
|
-
* don't touch screen edges.
|
|
23565
|
-
*/
|
|
23566
|
-
zeroAllSafeAreas() {
|
|
23567
|
-
const style = this.el.style;
|
|
23568
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
23569
|
-
style.setProperty('--ion-safe-area-bottom', '0px');
|
|
23570
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
23571
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
23572
|
-
}
|
|
23573
|
-
/**
|
|
23574
|
-
* Resets all safe-area related state and styles.
|
|
23575
|
-
* Called during dismiss and disconnectedCallback to ensure clean state
|
|
23576
|
-
* for re-presentation of inline modals.
|
|
23577
|
-
*/
|
|
23578
|
-
resetSafeAreaState() {
|
|
23579
|
-
var _a;
|
|
23580
|
-
this.skipSafeAreaCoordinateDetection = false;
|
|
23581
|
-
this.cachedSafeAreas = undefined;
|
|
23582
|
-
this.prevSafeAreaState = { top: false, bottom: false, left: false, right: false };
|
|
23583
|
-
(_a = this.footerObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
23584
|
-
this.footerObserver = undefined;
|
|
23585
|
-
// Clear wrapper styles that may have been set for safe-area handling
|
|
23586
|
-
if (this.wrapperEl) {
|
|
23587
|
-
this.wrapperEl.style.removeProperty('padding-bottom');
|
|
23588
|
-
this.wrapperEl.style.removeProperty('box-sizing');
|
|
23589
|
-
}
|
|
23590
|
-
// Clear safe-area CSS variable overrides
|
|
23591
|
-
const style = this.el.style;
|
|
23592
|
-
style.removeProperty('--ion-safe-area-top');
|
|
23593
|
-
style.removeProperty('--ion-safe-area-bottom');
|
|
23594
|
-
style.removeProperty('--ion-safe-area-left');
|
|
23595
|
-
style.removeProperty('--ion-safe-area-right');
|
|
23596
|
-
}
|
|
23597
|
-
/**
|
|
23598
|
-
* Gets the root safe-area values from the document element.
|
|
23599
|
-
* Uses cached values during gestures to avoid getComputedStyle calls.
|
|
23600
|
-
*/
|
|
23601
|
-
getSafeAreaValues() {
|
|
23602
|
-
if (!this.cachedSafeAreas) {
|
|
23603
|
-
const rootStyle = getComputedStyle(document.documentElement);
|
|
23604
|
-
this.cachedSafeAreas = {
|
|
23605
|
-
top: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-top')) || 0,
|
|
23606
|
-
bottom: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-bottom')) || 0,
|
|
23607
|
-
left: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-left')) || 0,
|
|
23608
|
-
right: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-right')) || 0,
|
|
23609
|
-
};
|
|
23610
|
-
}
|
|
23611
|
-
return this.cachedSafeAreas;
|
|
23612
|
-
}
|
|
23613
|
-
/**
|
|
23614
|
-
* Updates safe-area CSS variable overrides based on whether the modal
|
|
23615
|
-
* extends into each safe-area region. Called after animation
|
|
23616
|
-
* and during gestures to handle dynamic position changes.
|
|
23617
|
-
*
|
|
23618
|
-
* Optimized to avoid redundant DOM writes by tracking previous state.
|
|
23619
|
-
*/
|
|
23620
|
-
updateSafeAreaOverrides() {
|
|
23621
|
-
if (this.skipSafeAreaCoordinateDetection) {
|
|
23622
|
-
return;
|
|
23623
|
-
}
|
|
23624
|
-
const wrapper = this.wrapperEl;
|
|
23625
|
-
if (!wrapper) {
|
|
23626
|
-
return;
|
|
23627
|
-
}
|
|
23628
|
-
const rect = wrapper.getBoundingClientRect();
|
|
23629
|
-
const safeAreas = this.getSafeAreaValues();
|
|
23630
|
-
const extendsIntoTop = rect.top < safeAreas.top;
|
|
23631
|
-
const extendsIntoBottom = rect.bottom > window.innerHeight - safeAreas.bottom;
|
|
23632
|
-
const extendsIntoLeft = rect.left < safeAreas.left;
|
|
23633
|
-
const extendsIntoRight = rect.right > window.innerWidth - safeAreas.right;
|
|
23634
|
-
// Only update DOM when state actually changes
|
|
23635
|
-
const prev = this.prevSafeAreaState;
|
|
23636
|
-
const style = this.el.style;
|
|
23637
|
-
if (extendsIntoTop !== prev.top) {
|
|
23638
|
-
extendsIntoTop ? style.removeProperty('--ion-safe-area-top') : style.setProperty('--ion-safe-area-top', '0px');
|
|
23639
|
-
prev.top = extendsIntoTop;
|
|
23640
|
-
}
|
|
23641
|
-
if (extendsIntoBottom !== prev.bottom) {
|
|
23642
|
-
extendsIntoBottom
|
|
23643
|
-
? style.removeProperty('--ion-safe-area-bottom')
|
|
23644
|
-
: style.setProperty('--ion-safe-area-bottom', '0px');
|
|
23645
|
-
prev.bottom = extendsIntoBottom;
|
|
23646
|
-
}
|
|
23647
|
-
if (extendsIntoLeft !== prev.left) {
|
|
23648
|
-
extendsIntoLeft ? style.removeProperty('--ion-safe-area-left') : style.setProperty('--ion-safe-area-left', '0px');
|
|
23649
|
-
prev.left = extendsIntoLeft;
|
|
23650
|
-
}
|
|
23651
|
-
if (extendsIntoRight !== prev.right) {
|
|
23652
|
-
extendsIntoRight
|
|
23653
|
-
? style.removeProperty('--ion-safe-area-right')
|
|
23654
|
-
: style.setProperty('--ion-safe-area-right', '0px');
|
|
23655
|
-
prev.right = extendsIntoRight;
|
|
23656
|
-
}
|
|
23657
|
-
}
|
|
23658
23379
|
sheetOnDismiss() {
|
|
23659
23380
|
/**
|
|
23660
23381
|
* While the gesture animation is finishing
|
|
@@ -23747,8 +23468,6 @@ class Modal {
|
|
|
23747
23468
|
}
|
|
23748
23469
|
this.currentBreakpoint = undefined;
|
|
23749
23470
|
this.animation = undefined;
|
|
23750
|
-
// Reset safe-area state for potential re-presentation
|
|
23751
|
-
this.resetSafeAreaState();
|
|
23752
23471
|
unlock();
|
|
23753
23472
|
return dismissed;
|
|
23754
23473
|
}
|
|
@@ -23998,20 +23717,20 @@ class Modal {
|
|
|
23998
23717
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
23999
23718
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
24000
23719
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
24001
|
-
return (hAsync(Host, Object.assign({ key: '
|
|
23720
|
+
return (hAsync(Host, Object.assign({ key: '87328006ea6c75ebc518ace300438492a567223e', "no-router": true,
|
|
24002
23721
|
// Allow the modal to be navigable when the handle is focusable
|
|
24003
23722
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
24004
23723
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
24005
|
-
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), hAsync("ion-backdrop", { key: '
|
|
23724
|
+
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), hAsync("ion-backdrop", { key: 'ee94ff8e09b691dd4ad4e4db1720f06bc3c5a469', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: 'bffd69b4635c22d9f249725bd952c1e93d5615c7', class: "modal-shadow" }), hAsync("div", Object.assign({ key: '1d394d3c68916e464ff1fbf5242419f4a3d3cca1',
|
|
24006
23725
|
/*
|
|
24007
23726
|
role and aria-modal must be used on the
|
|
24008
23727
|
same element. They must also be set inside the
|
|
24009
23728
|
shadow DOM otherwise ion-button will not be highlighted
|
|
24010
23729
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
24011
23730
|
*/
|
|
24012
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: '
|
|
23731
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: '2dcf58792018e557e0c323baad2d672bc99c0bb1', class: "modal-handle",
|
|
24013
23732
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
24014
|
-
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: '
|
|
23733
|
+
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), hAsync("slot", { key: '44164b1e8710c3895400ad9f44ecd99873874ad5', onSlotchange: this.onSlotChange }))));
|
|
24015
23734
|
}
|
|
24016
23735
|
get el() { return getElement(this); }
|
|
24017
23736
|
static get watchers() { return {
|
|
@@ -27589,8 +27308,6 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
|
|
|
27589
27308
|
let bottom;
|
|
27590
27309
|
let originX = contentOriginX;
|
|
27591
27310
|
let originY = contentOriginY;
|
|
27592
|
-
let checkSafeAreaTop = false;
|
|
27593
|
-
let checkSafeAreaBottom = false;
|
|
27594
27311
|
let checkSafeAreaLeft = false;
|
|
27595
27312
|
let checkSafeAreaRight = false;
|
|
27596
27313
|
const triggerTop = triggerCoordinates
|
|
@@ -27635,18 +27352,10 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
|
|
|
27635
27352
|
* We chose 12 here so that the popover position looks a bit nicer as
|
|
27636
27353
|
* it is not right up against the edge of the screen.
|
|
27637
27354
|
*/
|
|
27638
|
-
top = Math.max(
|
|
27355
|
+
top = Math.max(12, triggerTop - contentHeight - triggerHeight - (arrowHeight - 1));
|
|
27639
27356
|
arrowTop = top + contentHeight;
|
|
27640
27357
|
originY = 'bottom';
|
|
27641
27358
|
addPopoverBottomClass = true;
|
|
27642
|
-
/**
|
|
27643
|
-
* If the popover is positioned near the top edge, account for safe area.
|
|
27644
|
-
* This ensures the popover doesn't overlap with status bars or notches.
|
|
27645
|
-
*/
|
|
27646
|
-
if (top <= bodyPadding + safeAreaMargin) {
|
|
27647
|
-
checkSafeAreaTop = true;
|
|
27648
|
-
top = bodyPadding;
|
|
27649
|
-
}
|
|
27650
27359
|
/**
|
|
27651
27360
|
* If not enough room for popover to appear
|
|
27652
27361
|
* above trigger, then cut it off.
|
|
@@ -27654,35 +27363,14 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
|
|
|
27654
27363
|
}
|
|
27655
27364
|
else {
|
|
27656
27365
|
bottom = bodyPadding;
|
|
27657
|
-
/**
|
|
27658
|
-
* When the popover is pinned to the bottom, account for safe area.
|
|
27659
|
-
* This ensures the popover doesn't overlap with home indicators
|
|
27660
|
-
* or navigation bars (e.g., Android API 36+ edge-to-edge).
|
|
27661
|
-
*/
|
|
27662
|
-
checkSafeAreaBottom = true;
|
|
27663
27366
|
}
|
|
27664
27367
|
}
|
|
27665
|
-
/**
|
|
27666
|
-
* Final check: If the popover extends into any safe-area region,
|
|
27667
|
-
* ensure the corresponding flag is set regardless of side.
|
|
27668
|
-
* This handles cases where a side-positioned popover (left/right)
|
|
27669
|
-
* still needs bottom safe-area padding because it extends into that region.
|
|
27670
|
-
*/
|
|
27671
|
-
const popoverBottom = bottom !== undefined ? bodyHeight - bottom : top + contentHeight;
|
|
27672
|
-
if (popoverBottom + safeAreaMargin > bodyHeight) {
|
|
27673
|
-
checkSafeAreaBottom = true;
|
|
27674
|
-
}
|
|
27675
|
-
if (top < safeAreaMargin) {
|
|
27676
|
-
checkSafeAreaTop = true;
|
|
27677
|
-
}
|
|
27678
27368
|
return {
|
|
27679
27369
|
top,
|
|
27680
27370
|
left,
|
|
27681
27371
|
bottom,
|
|
27682
27372
|
originX,
|
|
27683
27373
|
originY,
|
|
27684
|
-
checkSafeAreaTop,
|
|
27685
|
-
checkSafeAreaBottom,
|
|
27686
27374
|
checkSafeAreaLeft,
|
|
27687
27375
|
checkSafeAreaRight,
|
|
27688
27376
|
arrowTop,
|
|
@@ -27743,7 +27431,7 @@ const iosEnterAnimation$1 = (baseEl, opts) => {
|
|
|
27743
27431
|
const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev);
|
|
27744
27432
|
const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING;
|
|
27745
27433
|
const margin = size === 'cover' ? 0 : 25;
|
|
27746
|
-
const { originX, originY, top, left, bottom,
|
|
27434
|
+
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);
|
|
27747
27435
|
const baseAnimation = createAnimation();
|
|
27748
27436
|
const backdropAnimation = createAnimation();
|
|
27749
27437
|
const contentAnimation = createAnimation();
|
|
@@ -27773,35 +27461,19 @@ const iosEnterAnimation$1 = (baseEl, opts) => {
|
|
|
27773
27461
|
if (addPopoverBottomClass) {
|
|
27774
27462
|
baseEl.classList.add('popover-bottom');
|
|
27775
27463
|
}
|
|
27776
|
-
|
|
27777
|
-
|
|
27778
|
-
|
|
27779
|
-
* safe-area inset to ensure the popover doesn't overlap with system UI
|
|
27780
|
-
* (status bars, home indicators, navigation bars on Android API 36+, etc.)
|
|
27781
|
-
*/
|
|
27782
|
-
const safeAreaTop = ' + var(--ion-safe-area-top, 0)';
|
|
27783
|
-
const safeAreaBottom = ' + var(--ion-safe-area-bottom, 0)';
|
|
27464
|
+
if (bottom !== undefined) {
|
|
27465
|
+
contentEl.style.setProperty('bottom', `${bottom}px`);
|
|
27466
|
+
}
|
|
27784
27467
|
const safeAreaLeft = ' + var(--ion-safe-area-left, 0)';
|
|
27785
27468
|
const safeAreaRight = ' - var(--ion-safe-area-right, 0)';
|
|
27786
|
-
let topValue = `${top}px`;
|
|
27787
|
-
let bottomValue = bottom !== undefined ? `${bottom}px` : undefined;
|
|
27788
27469
|
let leftValue = `${left}px`;
|
|
27789
|
-
if (checkSafeAreaTop) {
|
|
27790
|
-
topValue = `${top}px${safeAreaTop}`;
|
|
27791
|
-
}
|
|
27792
|
-
if (checkSafeAreaBottom && bottomValue !== undefined) {
|
|
27793
|
-
bottomValue = `${bottom}px${safeAreaBottom}`;
|
|
27794
|
-
}
|
|
27795
27470
|
if (checkSafeAreaLeft) {
|
|
27796
27471
|
leftValue = `${left}px${safeAreaLeft}`;
|
|
27797
27472
|
}
|
|
27798
27473
|
if (checkSafeAreaRight) {
|
|
27799
27474
|
leftValue = `${left}px${safeAreaRight}`;
|
|
27800
27475
|
}
|
|
27801
|
-
|
|
27802
|
-
contentEl.style.setProperty('bottom', `calc(${bottomValue})`);
|
|
27803
|
-
}
|
|
27804
|
-
contentEl.style.setProperty('top', `calc(${topValue} + var(--offset-y, 0))`);
|
|
27476
|
+
contentEl.style.setProperty('top', `calc(${top}px + var(--offset-y, 0))`);
|
|
27805
27477
|
contentEl.style.setProperty('left', `calc(${leftValue} + var(--offset-x, 0))`);
|
|
27806
27478
|
contentEl.style.setProperty('transform-origin', `${originY} ${originX}`);
|
|
27807
27479
|
if (arrowEl !== null) {
|
|
@@ -27877,32 +27549,7 @@ const mdEnterAnimation$1 = (baseEl, opts) => {
|
|
|
27877
27549
|
};
|
|
27878
27550
|
const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
|
|
27879
27551
|
const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING;
|
|
27880
|
-
const { originX, originY, top, left, bottom
|
|
27881
|
-
/**
|
|
27882
|
-
* Safe area CSS variable adjustments.
|
|
27883
|
-
* When the popover is positioned near an edge, we add the corresponding
|
|
27884
|
-
* safe-area inset to ensure the popover doesn't overlap with system UI
|
|
27885
|
-
* (status bars, home indicators, navigation bars on Android API 36+, etc.)
|
|
27886
|
-
*/
|
|
27887
|
-
const safeAreaTop = ' + var(--ion-safe-area-top, 0)';
|
|
27888
|
-
const safeAreaBottom = ' + var(--ion-safe-area-bottom, 0)';
|
|
27889
|
-
const safeAreaLeft = ' + var(--ion-safe-area-left, 0)';
|
|
27890
|
-
const safeAreaRight = ' - var(--ion-safe-area-right, 0)';
|
|
27891
|
-
let topValue = `${top}px`;
|
|
27892
|
-
let bottomValue = bottom !== undefined ? `${bottom}px` : undefined;
|
|
27893
|
-
let leftValue = `${left}px`;
|
|
27894
|
-
if (checkSafeAreaTop) {
|
|
27895
|
-
topValue = `${top}px${safeAreaTop}`;
|
|
27896
|
-
}
|
|
27897
|
-
if (checkSafeAreaBottom && bottomValue !== undefined) {
|
|
27898
|
-
bottomValue = `${bottom}px${safeAreaBottom}`;
|
|
27899
|
-
}
|
|
27900
|
-
if (checkSafeAreaLeft) {
|
|
27901
|
-
leftValue = `${left}px${safeAreaLeft}`;
|
|
27902
|
-
}
|
|
27903
|
-
if (checkSafeAreaRight) {
|
|
27904
|
-
leftValue = `${left}px${safeAreaRight}`;
|
|
27905
|
-
}
|
|
27552
|
+
const { originX, originY, top, left, bottom } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, 0, results.originX, results.originY, results.referenceCoordinates);
|
|
27906
27553
|
const baseAnimation = createAnimation();
|
|
27907
27554
|
const backdropAnimation = createAnimation();
|
|
27908
27555
|
const wrapperAnimation = createAnimation();
|
|
@@ -27919,13 +27566,13 @@ const mdEnterAnimation$1 = (baseEl, opts) => {
|
|
|
27919
27566
|
contentAnimation
|
|
27920
27567
|
.addElement(contentEl)
|
|
27921
27568
|
.beforeStyles({
|
|
27922
|
-
top: `calc(${
|
|
27923
|
-
left: `calc(${
|
|
27569
|
+
top: `calc(${top}px + var(--offset-y, 0px))`,
|
|
27570
|
+
left: `calc(${left}px + var(--offset-x, 0px))`,
|
|
27924
27571
|
'transform-origin': `${originY} ${originX}`,
|
|
27925
27572
|
})
|
|
27926
27573
|
.beforeAddWrite(() => {
|
|
27927
|
-
if (
|
|
27928
|
-
contentEl.style.setProperty('bottom',
|
|
27574
|
+
if (bottom !== undefined) {
|
|
27575
|
+
contentEl.style.setProperty('bottom', `${bottom}px`);
|
|
27929
27576
|
}
|
|
27930
27577
|
})
|
|
27931
27578
|
.fromTo('transform', 'scale(0.8)', 'scale(1)');
|
|
@@ -35343,6 +34990,7 @@ class TabBar {
|
|
|
35343
34990
|
this.ionTabBarChanged = createEvent(this, "ionTabBarChanged", 7);
|
|
35344
34991
|
this.ionTabBarLoaded = createEvent(this, "ionTabBarLoaded", 7);
|
|
35345
34992
|
this.keyboardCtrl = null;
|
|
34993
|
+
this.keyboardCtrlPromise = null;
|
|
35346
34994
|
this.didLoad = false;
|
|
35347
34995
|
this.keyboardVisible = false;
|
|
35348
34996
|
/**
|
|
@@ -35378,7 +35026,7 @@ class TabBar {
|
|
|
35378
35026
|
}
|
|
35379
35027
|
}
|
|
35380
35028
|
async connectedCallback() {
|
|
35381
|
-
|
|
35029
|
+
const promise = createKeyboardController(async (keyboardOpen, waitForResize) => {
|
|
35382
35030
|
/**
|
|
35383
35031
|
* If the keyboard is hiding, then we need to wait
|
|
35384
35032
|
* for the webview to resize. Otherwise, the tab bar
|
|
@@ -35389,21 +35037,40 @@ class TabBar {
|
|
|
35389
35037
|
}
|
|
35390
35038
|
this.keyboardVisible = keyboardOpen; // trigger re-render by updating state
|
|
35391
35039
|
});
|
|
35040
|
+
this.keyboardCtrlPromise = promise;
|
|
35041
|
+
const keyboardCtrl = await promise;
|
|
35042
|
+
/**
|
|
35043
|
+
* Only assign if this is still the current promise.
|
|
35044
|
+
* Otherwise, a new connectedCallback has started or
|
|
35045
|
+
* disconnectedCallback was called, so destroy this instance.
|
|
35046
|
+
*/
|
|
35047
|
+
if (this.keyboardCtrlPromise === promise) {
|
|
35048
|
+
this.keyboardCtrl = keyboardCtrl;
|
|
35049
|
+
this.keyboardCtrlPromise = null;
|
|
35050
|
+
}
|
|
35051
|
+
else {
|
|
35052
|
+
keyboardCtrl.destroy();
|
|
35053
|
+
}
|
|
35392
35054
|
}
|
|
35393
35055
|
disconnectedCallback() {
|
|
35056
|
+
if (this.keyboardCtrlPromise) {
|
|
35057
|
+
this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy());
|
|
35058
|
+
this.keyboardCtrlPromise = null;
|
|
35059
|
+
}
|
|
35394
35060
|
if (this.keyboardCtrl) {
|
|
35395
35061
|
this.keyboardCtrl.destroy();
|
|
35062
|
+
this.keyboardCtrl = null;
|
|
35396
35063
|
}
|
|
35397
35064
|
}
|
|
35398
35065
|
render() {
|
|
35399
35066
|
const { color, translucent, keyboardVisible } = this;
|
|
35400
35067
|
const mode = getIonMode$1(this);
|
|
35401
35068
|
const shouldHide = keyboardVisible && this.el.getAttribute('slot') !== 'top';
|
|
35402
|
-
return (hAsync(Host, { key: '
|
|
35069
|
+
return (hAsync(Host, { key: '9daf4e2acaff6e3ce3878cf9dd5109fb1afbbebe', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: createColorClasses$1(color, {
|
|
35403
35070
|
[mode]: true,
|
|
35404
35071
|
'tab-bar-translucent': translucent,
|
|
35405
35072
|
'tab-bar-hidden': shouldHide,
|
|
35406
|
-
}) }, hAsync("slot", { key: '
|
|
35073
|
+
}) }, hAsync("slot", { key: '1d15aa2da8501e8e7eff11ad4a491478be845c43' })));
|
|
35407
35074
|
}
|
|
35408
35075
|
get el() { return getElement(this); }
|
|
35409
35076
|
static get watchers() { return {
|