@ionic/core 8.8.9-dev.11780493108.1d8e1a89 → 8.8.9-dev.11780493937.17fe092d
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/ion-content.js +1 -1
- package/components/ion-footer.js +1 -1
- package/components/ion-gallery.js +1 -1
- package/components/ion-header.js +1 -1
- package/components/ion-select-modal.js +1 -1
- package/components/ion-select.js +1 -1
- package/components/p-BF5oFX1I.js +4 -0
- package/components/p-CpFORZud.js +4 -0
- package/components/p-d77Zk1DK.js +4 -0
- package/components/p-hdGd8ben.js +4 -0
- package/dist/cjs/ion-app_8.cjs.entry.js +286 -28
- package/dist/cjs/ion-gallery.cjs.entry.js +7 -26
- package/dist/collection/components/content/content.css +56 -0
- package/dist/collection/components/footer/footer.ios.css +13 -0
- package/dist/collection/components/footer/footer.js +65 -18
- package/dist/collection/components/footer/footer.md.css +13 -0
- package/dist/collection/components/footer/footer.utils.js +9 -0
- package/dist/collection/components/gallery/gallery.js +9 -14
- package/dist/collection/components/header/header.ionic.css +75 -0
- package/dist/collection/components/header/header.ios.css +75 -0
- package/dist/collection/components/header/header.js +41 -11
- package/dist/collection/components/header/header.md.css +75 -0
- package/dist/collection/components/header/header.utils.js +9 -0
- package/dist/collection/utils/css-value-validation.js +0 -14
- package/dist/collection/utils/on-scroll/collapse-hide.utils.js +168 -0
- package/dist/docs.json +18 -10
- package/dist/esm/ion-app_8.entry.js +286 -28
- package/dist/esm/ion-gallery.entry.js +7 -26
- package/dist/html.html-data.json +9 -3
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-04b5794c.entry.js +4 -0
- package/dist/ionic/p-ad4d0138.entry.js +4 -0
- package/dist/types/components/footer/footer.d.ts +12 -2
- package/dist/types/components/footer/footer.utils.d.ts +1 -0
- package/dist/types/components/gallery/gallery.d.ts +4 -6
- package/dist/types/components/header/header.d.ts +10 -3
- package/dist/types/components/header/header.utils.d.ts +1 -0
- package/dist/types/components.d.ts +12 -12
- package/dist/types/utils/css-value-validation.d.ts +0 -9
- package/dist/types/utils/on-scroll/collapse-hide.utils.d.ts +26 -0
- package/hydrate/index.js +293 -54
- package/hydrate/index.mjs +293 -54
- package/package.json +1 -1
- package/components/p-7kL3tltU.js +0 -4
- package/components/p-BGiYL2RS.js +0 -4
- package/components/p-LB-QPk3e.js +0 -4
- package/dist/ionic/p-290778c1.entry.js +0 -4
- package/dist/ionic/p-70ee89c9.entry.js +0 -4
|
@@ -89,7 +89,7 @@ Buttons.style = {
|
|
|
89
89
|
md: buttonsMdCss()
|
|
90
90
|
};
|
|
91
91
|
|
|
92
|
-
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{right:0px;left:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{right:0px;left: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) + var(--internal-content-safe-area-padding-bottom, 0px));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)}`;
|
|
92
|
+
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{right:0px;left:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{right:0px;left: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) + var(--internal-content-safe-area-padding-bottom, 0px));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)}:host(.content-header-hide-scroll-partner:not(.content-footer-hide-scroll-partner)) .inner-scroll{-webkit-transform:translateY(0);transform:translateY(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;height:100%;-webkit-transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}:host(.content-header-hide-scroll-partner:not(.content-footer-hide-scroll-partner).content-header-hide-scroll-hidden) .inner-scroll{-webkit-transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));-webkit-backface-visibility:hidden;backface-visibility:hidden;height:calc(100% + var(--header-hide-slide-y, 0px));-webkit-transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1)}:host(.content-footer-hide-scroll-partner:not(.content-header-hide-scroll-partner)) .inner-scroll{-webkit-transform:translateY(0);transform:translateY(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;height:100%;-webkit-transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}:host(.content-footer-hide-scroll-partner:not(.content-header-hide-scroll-partner).content-footer-hide-scroll-hidden) .inner-scroll{-webkit-transform:translateY(0);transform:translateY(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;height:calc(100% + var(--footer-hide-slide-y, 0px));-webkit-transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1)}:host(.content-header-hide-scroll-partner.content-footer-hide-scroll-partner:not(.content-header-hide-scroll-hidden):not(.content-footer-hide-scroll-hidden)) .inner-scroll{-webkit-transform:translateY(0);transform:translateY(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;height:100%;-webkit-transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), height 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1)}:host(.content-header-hide-scroll-partner.content-footer-hide-scroll-partner.content-header-hide-scroll-hidden:not(.content-footer-hide-scroll-hidden)) .inner-scroll{-webkit-transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));-webkit-backface-visibility:hidden;backface-visibility:hidden;height:calc(100% + var(--header-hide-slide-y, 0px));-webkit-transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1)}:host(.content-header-hide-scroll-partner.content-footer-hide-scroll-partner:not(.content-header-hide-scroll-hidden).content-footer-hide-scroll-hidden) .inner-scroll{-webkit-transform:translateY(0);transform:translateY(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;height:calc(100% + var(--footer-hide-slide-y, 0px));-webkit-transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1)}:host(.content-header-hide-scroll-partner.content-footer-hide-scroll-partner.content-header-hide-scroll-hidden.content-footer-hide-scroll-hidden) .inner-scroll{-webkit-transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));-webkit-backface-visibility:hidden;backface-visibility:hidden;height:calc(100% + var(--header-hide-slide-y, 0px) + var(--footer-hide-slide-y, 0px));-webkit-transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), height 200ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1)}`;
|
|
93
93
|
|
|
94
94
|
const Content = class {
|
|
95
95
|
constructor(hostRef) {
|
|
@@ -530,6 +530,171 @@ const updateScrollDetail = (detail, el, timestamp, shouldStart) => {
|
|
|
530
530
|
};
|
|
531
531
|
Content.style = contentCss();
|
|
532
532
|
|
|
533
|
+
/** Cumulative downward delta before hiding (header or footer `collapse="hide"`). */
|
|
534
|
+
const COLLAPSE_HIDE_THRESHOLD_PX = 24;
|
|
535
|
+
/**
|
|
536
|
+
* Cumulative upward delta before showing again after hide. Small bias
|
|
537
|
+
* (instead of "any upward delta") guards against inertial-scroll
|
|
538
|
+
* oscillation flicking the region back open during a downward gesture.
|
|
539
|
+
*/
|
|
540
|
+
const COLLAPSE_SHOW_THRESHOLD_PX = 5;
|
|
541
|
+
const WHEEL_SCROLL_SUPPRESS_MS = 80;
|
|
542
|
+
const getContentHostFromScrollEl = (scrollEl) => {
|
|
543
|
+
const root = scrollEl.getRootNode();
|
|
544
|
+
if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {
|
|
545
|
+
return root.host;
|
|
546
|
+
}
|
|
547
|
+
// Light-DOM fallback: the scroll element may live inside a non-shadow
|
|
548
|
+
// ion-content (e.g. custom scroll host). Walk up to the nearest ion-content.
|
|
549
|
+
return scrollEl.closest('ion-content');
|
|
550
|
+
};
|
|
551
|
+
const applySlideDistance = (regionEl, contentHost, slideCssVar, heightPx) => {
|
|
552
|
+
const value = `${Math.max(0, Math.ceil(heightPx))}px`;
|
|
553
|
+
regionEl.style.setProperty(slideCssVar, value);
|
|
554
|
+
contentHost === null || contentHost === void 0 ? void 0 : contentHost.style.setProperty(slideCssVar, value);
|
|
555
|
+
};
|
|
556
|
+
const clearSlideDistance = (regionEl, contentHost, slideCssVar) => {
|
|
557
|
+
regionEl.style.removeProperty(slideCssVar);
|
|
558
|
+
contentHost === null || contentHost === void 0 ? void 0 : contentHost.style.removeProperty(slideCssVar);
|
|
559
|
+
};
|
|
560
|
+
/**
|
|
561
|
+
* Scroll/wheel-driven hide/show for `collapse="hide"` on `ion-header` or `ion-footer`.
|
|
562
|
+
* Hide after {@link COLLAPSE_HIDE_THRESHOLD_PX}px cumulative downward delta; show after
|
|
563
|
+
* {@link COLLAPSE_SHOW_THRESHOLD_PX}px cumulative upward delta. Each direction drains
|
|
564
|
+
* (not resets) the opposing accumulator so inertial-scroll jitter doesn't stall either
|
|
565
|
+
* transition. Motion is defined in component SCSS and `content.scss`; this toggles
|
|
566
|
+
* classes and syncs the slide distance CSS var.
|
|
567
|
+
*/
|
|
568
|
+
const createCollapseHideInteraction = ({ regionEl, scrollEl, slideCssVar, contentPartnerClass, contentHiddenClass, regionHiddenClass, }) => {
|
|
569
|
+
const contentHost = getContentHostFromScrollEl(scrollEl);
|
|
570
|
+
if (contentHost !== null) {
|
|
571
|
+
contentHost.classList.add(contentPartnerClass);
|
|
572
|
+
}
|
|
573
|
+
let resizeObserver;
|
|
574
|
+
let destroyed = false;
|
|
575
|
+
const syncSlideDistance = () => {
|
|
576
|
+
readTask(() => {
|
|
577
|
+
if (destroyed) {
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
const heightPx = regionEl.offsetHeight;
|
|
581
|
+
writeTask(() => {
|
|
582
|
+
if (destroyed) {
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
applySlideDistance(regionEl, contentHost, slideCssVar, heightPx);
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
};
|
|
589
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
590
|
+
resizeObserver = new ResizeObserver(() => {
|
|
591
|
+
syncSlideDistance();
|
|
592
|
+
});
|
|
593
|
+
resizeObserver.observe(regionEl);
|
|
594
|
+
}
|
|
595
|
+
syncSlideDistance();
|
|
596
|
+
requestAnimationFrame(() => {
|
|
597
|
+
if (!destroyed) {
|
|
598
|
+
syncSlideDistance();
|
|
599
|
+
}
|
|
600
|
+
});
|
|
601
|
+
let hidden = false;
|
|
602
|
+
let accDown = 0;
|
|
603
|
+
let accUp = 0;
|
|
604
|
+
let lastScrollTop = scrollEl.scrollTop;
|
|
605
|
+
let lastWheelTime = 0;
|
|
606
|
+
const setHidden = (next) => {
|
|
607
|
+
if (hidden === next || destroyed) {
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
hidden = next;
|
|
611
|
+
// When transitioning to hidden, re-measure synchronously in case the
|
|
612
|
+
// initial layout reported offsetHeight === 0 (e.g. mid page transition).
|
|
613
|
+
// Without this the slide animates by 0px and only opacity fades.
|
|
614
|
+
if (hidden) {
|
|
615
|
+
const heightPx = regionEl.offsetHeight;
|
|
616
|
+
if (heightPx > 0) {
|
|
617
|
+
applySlideDistance(regionEl, contentHost, slideCssVar, heightPx);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
writeTask(() => {
|
|
621
|
+
if (destroyed) {
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
regionEl.classList.toggle(regionHiddenClass, hidden);
|
|
625
|
+
contentHost === null || contentHost === void 0 ? void 0 : contentHost.classList.toggle(contentHiddenClass, hidden);
|
|
626
|
+
if (hidden) {
|
|
627
|
+
// `inert` removes the subtree from the tab order and AT, AND moves
|
|
628
|
+
// focus out automatically in supporting browsers. `aria-hidden` is
|
|
629
|
+
// kept as a fallback for older engines without `inert` support.
|
|
630
|
+
regionEl.setAttribute('inert', '');
|
|
631
|
+
regionEl.setAttribute('aria-hidden', 'true');
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
regionEl.removeAttribute('inert');
|
|
635
|
+
regionEl.removeAttribute('aria-hidden');
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
};
|
|
639
|
+
// Accumulate cumulative movement in each direction. The OPPOSITE accumulator
|
|
640
|
+
// is drained (not reset) by each event, so brief inertial jitter does not
|
|
641
|
+
// wipe a sustained gesture's accumulation. Crossing a threshold resets both.
|
|
642
|
+
const processDelta = (delta) => {
|
|
643
|
+
if (delta > 0) {
|
|
644
|
+
accUp = Math.max(0, accUp - delta);
|
|
645
|
+
accDown += delta;
|
|
646
|
+
if (accDown >= COLLAPSE_HIDE_THRESHOLD_PX) {
|
|
647
|
+
setHidden(true);
|
|
648
|
+
accDown = 0;
|
|
649
|
+
accUp = 0;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
else if (delta < 0) {
|
|
653
|
+
const mag = -delta;
|
|
654
|
+
accDown = Math.max(0, accDown - mag);
|
|
655
|
+
accUp += mag;
|
|
656
|
+
if (accUp >= COLLAPSE_SHOW_THRESHOLD_PX) {
|
|
657
|
+
setHidden(false);
|
|
658
|
+
accUp = 0;
|
|
659
|
+
accDown = 0;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
const onWheel = (ev) => {
|
|
664
|
+
if (destroyed) {
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
lastWheelTime = performance.now();
|
|
668
|
+
processDelta(ev.deltaY);
|
|
669
|
+
};
|
|
670
|
+
const onScroll = () => {
|
|
671
|
+
if (destroyed) {
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
const st = scrollEl.scrollTop;
|
|
675
|
+
if (performance.now() - lastWheelTime < WHEEL_SCROLL_SUPPRESS_MS) {
|
|
676
|
+
lastScrollTop = st;
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
const delta = st - lastScrollTop;
|
|
680
|
+
lastScrollTop = st;
|
|
681
|
+
processDelta(delta);
|
|
682
|
+
};
|
|
683
|
+
scrollEl.addEventListener('wheel', onWheel, { passive: true });
|
|
684
|
+
scrollEl.addEventListener('scroll', onScroll, { passive: true });
|
|
685
|
+
return () => {
|
|
686
|
+
destroyed = true;
|
|
687
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
|
|
688
|
+
scrollEl.removeEventListener('wheel', onWheel);
|
|
689
|
+
scrollEl.removeEventListener('scroll', onScroll);
|
|
690
|
+
regionEl.classList.remove(regionHiddenClass);
|
|
691
|
+
regionEl.removeAttribute('inert');
|
|
692
|
+
regionEl.removeAttribute('aria-hidden');
|
|
693
|
+
contentHost === null || contentHost === void 0 ? void 0 : contentHost.classList.remove(contentPartnerClass, contentHiddenClass);
|
|
694
|
+
clearSlideDistance(regionEl, contentHost, slideCssVar);
|
|
695
|
+
};
|
|
696
|
+
};
|
|
697
|
+
|
|
533
698
|
const handleFooterFade = (scrollEl, baseEl) => {
|
|
534
699
|
readTask(() => {
|
|
535
700
|
const scrollTop = scrollEl.scrollTop;
|
|
@@ -558,16 +723,26 @@ const handleFooterFade = (scrollEl, baseEl) => {
|
|
|
558
723
|
});
|
|
559
724
|
});
|
|
560
725
|
};
|
|
726
|
+
const createFooterHideInteraction = (footerEl, scrollEl) => createCollapseHideInteraction({
|
|
727
|
+
regionEl: footerEl,
|
|
728
|
+
scrollEl,
|
|
729
|
+
slideCssVar: '--footer-hide-slide-y',
|
|
730
|
+
contentPartnerClass: 'content-footer-hide-scroll-partner',
|
|
731
|
+
contentHiddenClass: 'content-footer-hide-scroll-hidden',
|
|
732
|
+
regionHiddenClass: 'footer-collapse-hide-hidden',
|
|
733
|
+
});
|
|
561
734
|
|
|
562
|
-
const ionicFooterMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
|
|
735
|
+
const ionicFooterMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}ion-footer.footer-collapse-hide{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);opacity:1}ion-footer.footer-collapse-hide.footer-collapse-hide-hidden{-webkit-transform:translateY(var(--footer-hide-slide-y, 0px));transform:translateY(var(--footer-hide-slide-y, 0px));pointer-events:none;-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
|
|
563
736
|
|
|
564
|
-
const footerIosCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-ios ion-toolbar:first-of-type{--border-width:0.55px 0 0}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.footer-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.footer-translucent-ios ion-toolbar{--opacity:0.8}}.footer-ios.ion-no-border ion-toolbar:first-of-type{--border-width:0}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}`;
|
|
737
|
+
const footerIosCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}ion-footer.footer-collapse-hide{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);opacity:1}ion-footer.footer-collapse-hide.footer-collapse-hide-hidden{-webkit-transform:translateY(var(--footer-hide-slide-y, 0px));transform:translateY(var(--footer-hide-slide-y, 0px));pointer-events:none;-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}.footer-ios ion-toolbar:first-of-type{--border-width:0.55px 0 0}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.footer-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.footer-translucent-ios ion-toolbar{--opacity:0.8}}.footer-ios.ion-no-border ion-toolbar:first-of-type{--border-width:0}.footer-collapse-fade ion-toolbar{--opacity-scale:inherit}`;
|
|
565
738
|
|
|
566
|
-
const footerMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
|
|
739
|
+
const footerMdCss = () => `ion-footer{display:block;position:relative;-ms-flex-order:1;order:1;width:100%;z-index:10}ion-footer.footer-toolbar-padding ion-toolbar:last-of-type{padding-bottom:var(--ion-safe-area-bottom, 0)}ion-footer.footer-collapse-hide{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);opacity:1}ion-footer.footer-collapse-hide.footer-collapse-hide-hidden{-webkit-transform:translateY(var(--footer-hide-slide-y, 0px));transform:translateY(var(--footer-hide-slide-y, 0px));pointer-events:none;-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}.footer-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.footer-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
|
|
567
740
|
|
|
568
741
|
const Footer = class {
|
|
569
742
|
constructor(hostRef) {
|
|
570
743
|
registerInstance(this, hostRef);
|
|
744
|
+
this.didLoad = false;
|
|
745
|
+
this.setupToken = 0;
|
|
571
746
|
this.keyboardCtrl = null;
|
|
572
747
|
this.keyboardCtrlPromise = null;
|
|
573
748
|
this.keyboardVisible = false;
|
|
@@ -582,25 +757,45 @@ const Footer = class {
|
|
|
582
757
|
this.translucent = false;
|
|
583
758
|
this.checkCollapsibleFooter = () => {
|
|
584
759
|
const theme = getIonTheme(this);
|
|
585
|
-
if (theme !== 'ios') {
|
|
586
|
-
return;
|
|
587
|
-
}
|
|
588
760
|
const { collapse } = this;
|
|
589
761
|
const hasFade = collapse === 'fade';
|
|
762
|
+
const hasHide = collapse === 'hide';
|
|
763
|
+
const runIosFade = theme === 'ios' && hasFade;
|
|
764
|
+
if (!runIosFade && !hasHide) {
|
|
765
|
+
this.destroyCollapsibleFooter();
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
768
|
+
// Skip teardown/rebuild when the collapse mode and theme have not changed
|
|
769
|
+
// since the last setup — avoids thrashing listeners and resetting scroll
|
|
770
|
+
// accumulators on unrelated re-renders (e.g. keyboardVisible state flips).
|
|
771
|
+
const activeMode = hasHide ? 'hide' : 'fade';
|
|
772
|
+
if (this.appliedCollapse === activeMode && this.appliedTheme === theme) {
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
590
775
|
this.destroyCollapsibleFooter();
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
776
|
+
const appRootSelector = config.get('appRootSelector', 'ion-app');
|
|
777
|
+
const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
|
|
778
|
+
const contentEl = pageEl ? findIonContent(pageEl) : null;
|
|
779
|
+
if (!contentEl) {
|
|
780
|
+
printIonContentErrorMsg(this.el);
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
this.appliedCollapse = activeMode;
|
|
784
|
+
this.appliedTheme = theme;
|
|
785
|
+
if (runIosFade) {
|
|
599
786
|
this.setupFadeFooter(contentEl);
|
|
600
787
|
}
|
|
788
|
+
else if (hasHide) {
|
|
789
|
+
void this.setupHideFooter(contentEl);
|
|
790
|
+
}
|
|
601
791
|
};
|
|
602
792
|
this.setupFadeFooter = async (contentEl) => {
|
|
603
|
-
const
|
|
793
|
+
const token = ++this.setupToken;
|
|
794
|
+
const scrollEl = await getScrollElement(contentEl);
|
|
795
|
+
if (token !== this.setupToken) {
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
this.scrollEl = scrollEl;
|
|
604
799
|
/**
|
|
605
800
|
* Handle fading of toolbars on scroll
|
|
606
801
|
*/
|
|
@@ -612,12 +807,18 @@ const Footer = class {
|
|
|
612
807
|
};
|
|
613
808
|
}
|
|
614
809
|
componentDidLoad() {
|
|
810
|
+
this.didLoad = true;
|
|
615
811
|
this.checkCollapsibleFooter();
|
|
616
812
|
}
|
|
617
813
|
componentDidUpdate() {
|
|
618
814
|
this.checkCollapsibleFooter();
|
|
619
815
|
}
|
|
620
816
|
async connectedCallback() {
|
|
817
|
+
// On re-attach (didLoad already true but disconnectedCallback ran since),
|
|
818
|
+
// componentDidLoad will not fire again — re-run setup here.
|
|
819
|
+
if (this.didLoad) {
|
|
820
|
+
this.checkCollapsibleFooter();
|
|
821
|
+
}
|
|
621
822
|
const promise = createKeyboardController(async (keyboardOpen, waitForResize) => {
|
|
622
823
|
/**
|
|
623
824
|
* If the keyboard is hiding, then we need to wait
|
|
@@ -645,6 +846,7 @@ const Footer = class {
|
|
|
645
846
|
}
|
|
646
847
|
}
|
|
647
848
|
disconnectedCallback() {
|
|
849
|
+
this.destroyCollapsibleFooter();
|
|
648
850
|
if (this.keyboardCtrlPromise) {
|
|
649
851
|
this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy());
|
|
650
852
|
this.keyboardCtrlPromise = null;
|
|
@@ -654,18 +856,36 @@ const Footer = class {
|
|
|
654
856
|
this.keyboardCtrl = null;
|
|
655
857
|
}
|
|
656
858
|
}
|
|
859
|
+
async setupHideFooter(contentEl) {
|
|
860
|
+
const token = ++this.setupToken;
|
|
861
|
+
const scrollEl = await getScrollElement(contentEl);
|
|
862
|
+
// A newer checkCollapsibleFooter ran while we were awaiting — abandon.
|
|
863
|
+
if (token !== this.setupToken) {
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
this.scrollEl = scrollEl;
|
|
867
|
+
this.footerHideCleanup = createFooterHideInteraction(this.el, scrollEl);
|
|
868
|
+
}
|
|
657
869
|
destroyCollapsibleFooter() {
|
|
870
|
+
// Invalidate any in-flight setupHideFooter/setupFadeFooter awaits.
|
|
871
|
+
this.setupToken++;
|
|
872
|
+
if (this.footerHideCleanup) {
|
|
873
|
+
this.footerHideCleanup();
|
|
874
|
+
this.footerHideCleanup = undefined;
|
|
875
|
+
}
|
|
658
876
|
if (this.scrollEl && this.contentScrollCallback) {
|
|
659
877
|
this.scrollEl.removeEventListener('scroll', this.contentScrollCallback);
|
|
660
878
|
this.contentScrollCallback = undefined;
|
|
661
879
|
}
|
|
880
|
+
this.appliedCollapse = undefined;
|
|
881
|
+
this.appliedTheme = undefined;
|
|
662
882
|
}
|
|
663
883
|
render() {
|
|
664
884
|
const { translucent, collapse } = this;
|
|
665
885
|
const theme = getIonTheme(this);
|
|
666
886
|
const tabs = this.el.closest('ion-tabs');
|
|
667
887
|
const tabBar = tabs === null || tabs === void 0 ? void 0 : tabs.querySelector(':scope > ion-tab-bar');
|
|
668
|
-
return (h(Host, { key: '
|
|
888
|
+
return (h(Host, { key: '5df79a31f36febfad49c5858727e93c7ba5734f8', role: "contentinfo", class: {
|
|
669
889
|
[theme]: true,
|
|
670
890
|
// Used internally for styling
|
|
671
891
|
[`footer-${theme}`]: true,
|
|
@@ -673,7 +893,7 @@ const Footer = class {
|
|
|
673
893
|
[`footer-translucent-${theme}`]: translucent,
|
|
674
894
|
['footer-toolbar-padding']: !this.keyboardVisible && (!tabBar || tabBar.slot !== 'bottom'),
|
|
675
895
|
[`footer-collapse-${collapse}`]: collapse !== undefined,
|
|
676
|
-
} }, theme === 'ios' && translucent && h("div", { key: '
|
|
896
|
+
} }, theme === 'ios' && translucent && h("div", { key: '9175ae4f6576d82dff2a00a36e91f4b633d8c9ad', class: "footer-background" }), h("slot", { key: 'd6d618cdae4726822d8e82edb782c5c86fc7b77b' })));
|
|
677
897
|
}
|
|
678
898
|
get el() { return getElement(this); }
|
|
679
899
|
};
|
|
@@ -859,6 +1079,14 @@ const scaleLargeTitles = (toolbars = [], scale = 1, transition = false) => {
|
|
|
859
1079
|
titleDiv.style.transform = `scale3d(${scale}, ${scale}, 1)`;
|
|
860
1080
|
});
|
|
861
1081
|
};
|
|
1082
|
+
const createHeaderHideInteraction = (headerEl, scrollEl) => createCollapseHideInteraction({
|
|
1083
|
+
regionEl: headerEl,
|
|
1084
|
+
scrollEl,
|
|
1085
|
+
slideCssVar: '--header-hide-slide-y',
|
|
1086
|
+
contentPartnerClass: 'content-header-hide-scroll-partner',
|
|
1087
|
+
contentHiddenClass: 'content-header-hide-scroll-hidden',
|
|
1088
|
+
regionHiddenClass: 'header-collapse-hide-hidden',
|
|
1089
|
+
});
|
|
862
1090
|
const handleHeaderFade = (scrollEl, baseEl, condenseHeader) => {
|
|
863
1091
|
readTask(() => {
|
|
864
1092
|
const scrollTop = scrollEl.scrollTop;
|
|
@@ -915,16 +1143,17 @@ const getRoleType = (isInsideMenu, isCondensed, theme) => {
|
|
|
915
1143
|
return ROLE_BANNER;
|
|
916
1144
|
};
|
|
917
1145
|
|
|
918
|
-
const headerIonicCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header{z-index:10}ion-header.header-divider{border-bottom:var(--token-border-size-025, var(--token-scale-025, 1px)) var(--token-border-style-solid, solid) var(--token-border-default, var(--token-primitives-neutral-400, #d5d5d5))}ion-toolbar+ion-toolbar{--padding-start:var(--token-space-400, var(--token-scale-400, 16px));--padding-end:var(--token-space-400, var(--token-scale-400, 16px))}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px));backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px))}.header-translucent-ionic ion-toolbar{--opacity:0.7}}`;
|
|
1146
|
+
const headerIonicCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header.header-collapse-hide{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);opacity:1;z-index:10}ion-header.header-collapse-hide.header-collapse-hide-hidden{-webkit-transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));pointer-events:none;-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}ion-header{z-index:10}ion-header.header-divider{border-bottom:var(--token-border-size-025, var(--token-scale-025, 1px)) var(--token-border-style-solid, solid) var(--token-border-default, var(--token-primitives-neutral-400, #d5d5d5))}ion-toolbar+ion-toolbar{--padding-start:var(--token-space-400, var(--token-scale-400, 16px));--padding-end:var(--token-space-400, var(--token-scale-400, 16px))}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px));backdrop-filter:saturate(180%) blur(var(--token-scale-100, 4px))}.header-translucent-ionic ion-toolbar{--opacity:0.7}}`;
|
|
919
1147
|
|
|
920
|
-
const headerIosCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header{z-index:10}.header-ios ion-toolbar:last-of-type{--border-width:0 0 0.55px}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.header-translucent-ios ion-toolbar{--opacity:0.8}.header-collapse-condense-inactive .header-background{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}}.header-ios.ion-no-border ion-toolbar:last-of-type{--border-width:0}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-fade.header-transitioning ion-toolbar{--background:transparent;--border-style:none}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:0px;z-index:1}.header-collapse-condense ion-toolbar{z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense ion-toolbar,.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--background:var(--ion-background-color, #fff)}.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--border-style:none;--opacity-scale:1}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}ion-header.header-ios:not(.header-collapse-main):has(~ion-content ion-header.header-ios[collapse=condense],~ion-content ion-header.header-ios.header-collapse-condense){opacity:0}`;
|
|
1148
|
+
const headerIosCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header.header-collapse-hide{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);opacity:1;z-index:10}ion-header.header-collapse-hide.header-collapse-hide-hidden{-webkit-transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));pointer-events:none;-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}ion-header{z-index:10}.header-ios ion-toolbar:last-of-type{--border-width:0 0 0.55px}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){.header-background{right:0;left:0;top:0;bottom:0;position:absolute;-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}.header-translucent-ios ion-toolbar{--opacity:0.8}.header-collapse-condense-inactive .header-background{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}}.header-ios.ion-no-border ion-toolbar:last-of-type{--border-width:0}.header-collapse-fade ion-toolbar{--opacity-scale:inherit}.header-collapse-fade.header-transitioning ion-toolbar{--background:transparent;--border-style:none}.header-collapse-condense{z-index:9}.header-collapse-condense ion-toolbar{position:-webkit-sticky;position:sticky;top:0}.header-collapse-condense ion-toolbar:first-of-type{padding-top:0px;z-index:1}.header-collapse-condense ion-toolbar{z-index:0}.header-collapse-condense ion-toolbar:last-of-type{--border-width:0px}.header-collapse-condense ion-toolbar ion-searchbar{padding-top:0px;padding-bottom:13px}.header-collapse-main{--opacity-scale:1}.header-collapse-main ion-toolbar{--opacity-scale:inherit}.header-collapse-main ion-toolbar.in-toolbar ion-title,.header-collapse-main ion-toolbar.in-toolbar ion-buttons{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.header-collapse-condense ion-toolbar,.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--background:var(--ion-background-color, #fff)}.header-collapse-condense-inactive.header-transitioning:not(.header-collapse-condense) ion-toolbar{--border-style:none;--opacity-scale:1}.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive:not(.header-collapse-condense) ion-toolbar.in-toolbar ion-buttons.buttons-collapse{opacity:0;pointer-events:none}.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-title,.header-collapse-condense-inactive.header-collapse-condense ion-toolbar.in-toolbar ion-buttons.buttons-collapse{visibility:hidden}ion-header.header-ios:not(.header-collapse-main):has(~ion-content ion-header.header-ios[collapse=condense],~ion-content ion-header.header-ios.header-collapse-condense){opacity:0}`;
|
|
921
1149
|
|
|
922
|
-
const headerMdCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header{z-index:10}.header-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.header-md.header-collapse-condense{display:none}.header-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
|
|
1150
|
+
const headerMdCss = () => `ion-header{display:block;position:relative;-ms-flex-order:-1;order:-1;width:100%}ion-header ion-toolbar:first-of-type{padding-top:var(--ion-safe-area-top, 0)}ion-header.header-collapse-hide{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1);transition:transform 300ms cubic-bezier(0, 0, 0.2, 1), opacity 300ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 300ms cubic-bezier(0, 0, 0.2, 1);opacity:1;z-index:10}ion-header.header-collapse-hide.header-collapse-hide-hidden{-webkit-transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));transform:translateY(calc(-1 * var(--header-hide-slide-y, 0px)));pointer-events:none;-webkit-transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1);transition:transform 200ms cubic-bezier(0.4, 0, 1, 1), opacity 300ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 200ms cubic-bezier(0.4, 0, 1, 1);opacity:0}ion-header{z-index:10}.header-md{-webkit-box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12);box-shadow:0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12)}.header-md.header-collapse-condense{display:none}.header-md.ion-no-border{-webkit-box-shadow:none;box-shadow:none}`;
|
|
923
1151
|
|
|
924
1152
|
const Header = class {
|
|
925
1153
|
constructor(hostRef) {
|
|
926
1154
|
registerInstance(this, hostRef);
|
|
927
1155
|
this.inheritedAttributes = {};
|
|
1156
|
+
this.didLoad = false;
|
|
928
1157
|
/**
|
|
929
1158
|
* If `true`, the header will have a line at the bottom.
|
|
930
1159
|
* TODO(ROU-10855): add support for this prop on ios/md themes
|
|
@@ -955,25 +1184,37 @@ const Header = class {
|
|
|
955
1184
|
this.inheritedAttributes = inheritAriaAttributes(this.el);
|
|
956
1185
|
}
|
|
957
1186
|
componentDidLoad() {
|
|
1187
|
+
this.didLoad = true;
|
|
958
1188
|
this.checkCollapsibleHeader();
|
|
959
1189
|
}
|
|
960
1190
|
componentDidUpdate() {
|
|
961
1191
|
this.checkCollapsibleHeader();
|
|
962
1192
|
}
|
|
1193
|
+
connectedCallback() {
|
|
1194
|
+
// On re-attach (didLoad already true but disconnectedCallback ran since),
|
|
1195
|
+
// componentDidLoad will not fire again — re-run setup here.
|
|
1196
|
+
if (this.didLoad) {
|
|
1197
|
+
this.checkCollapsibleHeader();
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
963
1200
|
disconnectedCallback() {
|
|
964
1201
|
this.destroyCollapsibleHeader();
|
|
965
1202
|
}
|
|
966
1203
|
async checkCollapsibleHeader() {
|
|
967
1204
|
const theme = getIonTheme(this);
|
|
968
|
-
if (theme !== 'ios') {
|
|
969
|
-
return;
|
|
970
|
-
}
|
|
971
1205
|
const { collapse } = this;
|
|
972
1206
|
const hasCondense = collapse === 'condense';
|
|
973
1207
|
const hasFade = collapse === 'fade';
|
|
1208
|
+
const hasHide = collapse === 'hide';
|
|
1209
|
+
const runIosCollapse = theme === 'ios' && (hasCondense || hasFade);
|
|
1210
|
+
const runHide = hasHide;
|
|
1211
|
+
if (!runIosCollapse && !runHide) {
|
|
1212
|
+
this.destroyCollapsibleHeader();
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
974
1215
|
this.destroyCollapsibleHeader();
|
|
975
1216
|
const appRootSelector = config.get('appRootSelector', 'ion-app');
|
|
976
|
-
if (hasCondense) {
|
|
1217
|
+
if (runIosCollapse && hasCondense) {
|
|
977
1218
|
const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
|
|
978
1219
|
const contentEl = pageEl ? findIonContent(pageEl) : null;
|
|
979
1220
|
// Cloned elements are always needed in iOS transition
|
|
@@ -984,7 +1225,7 @@ const Header = class {
|
|
|
984
1225
|
});
|
|
985
1226
|
await this.setupCondenseHeader(contentEl, pageEl);
|
|
986
1227
|
}
|
|
987
|
-
else if (hasFade) {
|
|
1228
|
+
else if (runIosCollapse && hasFade) {
|
|
988
1229
|
const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
|
|
989
1230
|
const contentEl = pageEl ? findIonContent(pageEl) : null;
|
|
990
1231
|
if (!contentEl) {
|
|
@@ -994,12 +1235,29 @@ const Header = class {
|
|
|
994
1235
|
const condenseHeader = contentEl.querySelector('ion-header[collapse="condense"]');
|
|
995
1236
|
await this.setupFadeHeader(contentEl, condenseHeader);
|
|
996
1237
|
}
|
|
1238
|
+
if (runHide) {
|
|
1239
|
+
const pageEl = this.el.closest(`${appRootSelector},ion-page,.ion-page,page-inner`);
|
|
1240
|
+
const contentEl = pageEl ? findIonContent(pageEl) : null;
|
|
1241
|
+
if (!contentEl) {
|
|
1242
|
+
printIonContentErrorMsg(this.el);
|
|
1243
|
+
return;
|
|
1244
|
+
}
|
|
1245
|
+
await this.setupHideHeader(contentEl);
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
async setupHideHeader(contentEl) {
|
|
1249
|
+
const scrollEl = (this.scrollEl = await getScrollElement(contentEl));
|
|
1250
|
+
this.headerHideCleanup = createHeaderHideInteraction(this.el, scrollEl);
|
|
997
1251
|
}
|
|
998
1252
|
destroyCollapsibleHeader() {
|
|
999
1253
|
if (this.intersectionObserver) {
|
|
1000
1254
|
this.intersectionObserver.disconnect();
|
|
1001
1255
|
this.intersectionObserver = undefined;
|
|
1002
1256
|
}
|
|
1257
|
+
if (this.headerHideCleanup) {
|
|
1258
|
+
this.headerHideCleanup();
|
|
1259
|
+
this.headerHideCleanup = undefined;
|
|
1260
|
+
}
|
|
1003
1261
|
if (this.scrollEl && this.contentScrollCallback) {
|
|
1004
1262
|
this.scrollEl.removeEventListener('scroll', this.contentScrollCallback);
|
|
1005
1263
|
this.contentScrollCallback = undefined;
|
|
@@ -1066,7 +1324,7 @@ const Header = class {
|
|
|
1066
1324
|
const isCondensed = collapse === 'condense';
|
|
1067
1325
|
// banner role must be at top level, so remove role if inside a menu
|
|
1068
1326
|
const roleType = getRoleType(hostContext('ion-menu', this.el), isCondensed, theme);
|
|
1069
|
-
return (h(Host, Object.assign({ key: '
|
|
1327
|
+
return (h(Host, Object.assign({ key: '5cae1ff0bbc5f2035325c128a9394caf7f1459a0', role: roleType, class: {
|
|
1070
1328
|
[theme]: true,
|
|
1071
1329
|
// Used internally for styling
|
|
1072
1330
|
[`header-${theme}`]: true,
|
|
@@ -1074,7 +1332,7 @@ const Header = class {
|
|
|
1074
1332
|
[`header-collapse-${collapse}`]: true,
|
|
1075
1333
|
[`header-translucent-${theme}`]: this.translucent,
|
|
1076
1334
|
['header-divider']: divider,
|
|
1077
|
-
} }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: '
|
|
1335
|
+
} }, inheritedAttributes), theme !== 'md' && translucent && h("div", { key: '705f120951a3dd429286b66cd0b511fa267b3702', class: "header-background" }), h("slot", { key: '1c7a9d474083cf92abfe88c02d363f8d420716ca' })));
|
|
1078
1336
|
}
|
|
1079
1337
|
get el() { return getElement(this); }
|
|
1080
1338
|
};
|
|
@@ -14,9 +14,6 @@ import './focus-visible-vXpMhGrs.js';
|
|
|
14
14
|
const LENGTH_PERCENTAGE_PATTERN = /^[-+]?(?:\d+\.?\d*|\.\d+)(?:%|[a-z]+)$/i;
|
|
15
15
|
// Matches simple `calc` / `min` / `max` / `clamp(...)` functions.
|
|
16
16
|
const MATH_FUNCTION_PATTERN = /^(calc|min|max|clamp)\s*\(.+\)$/i;
|
|
17
|
-
// Matches a `var(--name)` reference with an optional fallback, e.g.
|
|
18
|
-
// `var(--my-gap)` or `var(--my-gap, 16px)`.
|
|
19
|
-
const VAR_FUNCTION_PATTERN = /^var\(\s*--[^\s,)]+\s*(?:,[\s\S]*)?\)$/i;
|
|
20
17
|
/**
|
|
21
18
|
* Returns whether `value` matches the [length-percentage](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/length-percentage)
|
|
22
19
|
* syntax. Accepts `<length>` (`<number>` + unit identifier) or `<percentage>` (`<number>%`).
|
|
@@ -31,17 +28,6 @@ function isValidLengthPercentage(value) {
|
|
|
31
28
|
}
|
|
32
29
|
return MATH_FUNCTION_PATTERN.test(v) || LENGTH_PERCENTAGE_PATTERN.test(v);
|
|
33
30
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Returns whether `value` is a single [`var()`](https://developer.mozilla.org/en-US/docs/Web/CSS/var)
|
|
36
|
-
* reference, e.g. `var(--my-token)` or `var(--my-token, 16px)`. The referenced
|
|
37
|
-
* custom property is resolved by the browser, so the resolved value is not
|
|
38
|
-
* validated here.
|
|
39
|
-
*
|
|
40
|
-
* @param value String value to validate.
|
|
41
|
-
*/
|
|
42
|
-
function isCssVariable(value) {
|
|
43
|
-
return VAR_FUNCTION_PATTERN.test(value.trim());
|
|
44
|
-
}
|
|
45
31
|
|
|
46
32
|
const DEFAULT_COLUMNS = {
|
|
47
33
|
xs: 2,
|
|
@@ -89,8 +75,7 @@ const Gallery = class {
|
|
|
89
75
|
/**
|
|
90
76
|
* The space between gallery items. Accepts valid CSS [length-percentage](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/length-percentage)
|
|
91
77
|
* values like `16px`, `1rem`, `20%`, math functions like `calc(10px + 20%)`,
|
|
92
|
-
*
|
|
93
|
-
* values). Can also be set as a breakpoint map
|
|
78
|
+
* or numbers (treated as pixel values). Can also be set as a breakpoint map
|
|
94
79
|
* (e.g. `{ xs: '8px', sm: '1rem', md: '24px' }`). Does not accept
|
|
95
80
|
* space-separated values or CSS keyword values like `inherit`, `auto`, etc.
|
|
96
81
|
*/
|
|
@@ -211,10 +196,9 @@ const Gallery = class {
|
|
|
211
196
|
return numericColumns;
|
|
212
197
|
}
|
|
213
198
|
/**
|
|
214
|
-
* Normalize a single gap value (`gap` as a number,
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
* input cannot be interpreted as a valid CSS length or `var()` reference.
|
|
199
|
+
* Normalize a single gap value (`gap` as a number, string, or one entry from
|
|
200
|
+
* a `gap` breakpoint map) to a CSS length string. Returns `undefined` when
|
|
201
|
+
* the input cannot be interpreted as a valid CSS length.
|
|
218
202
|
*/
|
|
219
203
|
sanitizeGap(gap) {
|
|
220
204
|
if (gap === undefined) {
|
|
@@ -231,9 +215,6 @@ const Gallery = class {
|
|
|
231
215
|
if (typeof normalizedGap !== 'string') {
|
|
232
216
|
return undefined;
|
|
233
217
|
}
|
|
234
|
-
if (isCssVariable(normalizedGap)) {
|
|
235
|
-
return normalizedGap;
|
|
236
|
-
}
|
|
237
218
|
const isValidCssLength = isValidLengthPercentage(normalizedGap);
|
|
238
219
|
return isValidCssLength ? normalizedGap : undefined;
|
|
239
220
|
}
|
|
@@ -314,7 +295,7 @@ const Gallery = class {
|
|
|
314
295
|
if (this.hasWarnedInvalidGap) {
|
|
315
296
|
return;
|
|
316
297
|
}
|
|
317
|
-
printIonWarning(`[ion-gallery] - Invalid "gap" value (${JSON.stringify(gap)}). Expected a non-negative number, CSS length string,
|
|
298
|
+
printIonWarning(`[ion-gallery] - Invalid "gap" value (${JSON.stringify(gap)}). Expected a non-negative number, CSS length string, or breakpoint map object (e.g. { xs: 8, md: "1rem" }).`, this.el);
|
|
318
299
|
this.hasWarnedInvalidGap = true;
|
|
319
300
|
}
|
|
320
301
|
/**
|
|
@@ -500,11 +481,11 @@ const Gallery = class {
|
|
|
500
481
|
const { layout } = this;
|
|
501
482
|
const order = this.getOrder();
|
|
502
483
|
const theme = getIonTheme(this);
|
|
503
|
-
return (h(Host, { key: '
|
|
484
|
+
return (h(Host, { key: '1bf2973d22835c0dbddf3214b602f8c08b95e421', class: {
|
|
504
485
|
[theme]: true,
|
|
505
486
|
[`gallery-layout-${layout}`]: true,
|
|
506
487
|
[`gallery-order-${order}`]: layout === 'masonry' && order !== undefined,
|
|
507
|
-
} }, h("slot", { key: '
|
|
488
|
+
} }, h("slot", { key: '0dea31f609f6afdb1d73ecb2d873909ffe49203f', onSlotchange: this.onSlotChange })));
|
|
508
489
|
}
|
|
509
490
|
get el() { return getElement(this); }
|
|
510
491
|
static get watchers() { return {
|