UNPKG

@1771technologies/lytenyte-pro

Version:
426 lines (425 loc) 17.4 kB
import { jsx } from "react/jsx-runtime"; import { context } from "@1771technologies/grid-provider"; import * as React from "react"; import React__default, { useContext } from "react"; import { d as useEnhancedEffect, C as getUserAgent } from "./proptypes-BjYr2nFr.js"; function useGrid() { return useContext(context); } function GridProvider(p) { return /* @__PURE__ */ jsx(context.Provider, { value: p.value, children: p.children }); } function useControlled({ controlled, default: defaultProp, name, state = "value" }) { const { current: isControlled } = React.useRef(controlled !== void 0); const [valueState, setValue] = React.useState(defaultProp); const value = isControlled ? controlled : valueState; if (process.env.NODE_ENV !== "production") { React.useEffect(() => { if (isControlled !== (controlled !== void 0)) { console.error([`Base UI: A component is changing the ${isControlled ? "" : "un"}controlled ${state} state of ${name} to be ${isControlled ? "un" : ""}controlled.`, "Elements should not switch from uncontrolled to controlled (or vice versa).", `Decide between using a controlled or uncontrolled ${name} element for the lifetime of the component.`, "The nature of the state is determined during the first render. It's considered controlled if the value is not `undefined`.", "More info: https://fb.me/react-controlled-components"].join("\n")); } }, [state, name, controlled]); const { current: defaultValue } = React.useRef(defaultProp); React.useEffect(() => { if (!isControlled && !Object.is(defaultValue, defaultProp)) { console.error([`Base UI: A component is changing the default ${state} state of an uncontrolled ${name} after being initialized. To suppress this warning opt to use a controlled ${name}.`].join("\n")); } }, [JSON.stringify(defaultProp)]); } const setValueIfUncontrolled = React.useCallback((newValue) => { if (!isControlled) { setValue(newValue); } }, []); return [value, setValueIfUncontrolled]; } function useTransitionStatus(open, delayStartingStatus = false) { const [transitionStatus, setTransitionStatus] = React.useState(); const [mounted, setMounted] = React.useState(open); if (open && !mounted) { setMounted(true); if (transitionStatus !== "starting" && !delayStartingStatus) { setTransitionStatus("starting"); } } if (!open && mounted && transitionStatus !== "ending") { setTransitionStatus("ending"); } if (!open && !mounted && transitionStatus === "ending") { setTransitionStatus(void 0); } useEnhancedEffect(() => { if (!open) { return void 0; } if (delayStartingStatus) { setTransitionStatus("starting"); } const frame = requestAnimationFrame(() => { setTransitionStatus(void 0); }); return () => { cancelAnimationFrame(frame); }; }, [open, delayStartingStatus]); return React.useMemo(() => ({ mounted, setMounted, transitionStatus }), [mounted, transitionStatus]); } const $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c = typeof document !== "undefined" ? React__default.useLayoutEffect : () => { }; function $ff5963eb1fccf552$export$e08e3b67e392101e(...callbacks) { return (...args) => { for (let callback of callbacks) if (typeof callback === "function") callback(...args); }; } function $c87311424ea30a05$var$testPlatform(re) { var _window_navigator_userAgentData; return typeof window !== "undefined" && window.navigator != null ? re.test(((_window_navigator_userAgentData = window.navigator["userAgentData"]) === null || _window_navigator_userAgentData === void 0 ? void 0 : _window_navigator_userAgentData.platform) || window.navigator.platform) : false; } function $c87311424ea30a05$var$cached(fn) { let res = null; return () => { if (res == null) res = fn(); return res; }; } const $c87311424ea30a05$export$9ac100e40613ea10 = $c87311424ea30a05$var$cached(function() { return $c87311424ea30a05$var$testPlatform(/^Mac/i); }); const $c87311424ea30a05$export$186c6964ca17d99 = $c87311424ea30a05$var$cached(function() { return $c87311424ea30a05$var$testPlatform(/^iPhone/i); }); const $c87311424ea30a05$export$7bef049ce92e4224 = $c87311424ea30a05$var$cached(function() { return $c87311424ea30a05$var$testPlatform(/^iPad/i) || // iPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support. $c87311424ea30a05$export$9ac100e40613ea10() && navigator.maxTouchPoints > 1; }); const $c87311424ea30a05$export$fedb369cb70207f1 = $c87311424ea30a05$var$cached(function() { return $c87311424ea30a05$export$186c6964ca17d99() || $c87311424ea30a05$export$7bef049ce92e4224(); }); function $cc38e7bd3fc7b213$export$2bb74740c4e19def(node, checkForOverflow) { if (!node) return false; let style = window.getComputedStyle(node); let isScrollable = /(auto|scroll)/.test(style.overflow + style.overflowX + style.overflowY); if (isScrollable && checkForOverflow) isScrollable = node.scrollHeight !== node.clientHeight || node.scrollWidth !== node.clientWidth; return isScrollable; } function $62d8ded9296f3872$export$cfa2225e87938781(node, checkForOverflow) { let scrollableNode = node; if ($cc38e7bd3fc7b213$export$2bb74740c4e19def(scrollableNode, checkForOverflow)) scrollableNode = scrollableNode.parentElement; while (scrollableNode && !$cc38e7bd3fc7b213$export$2bb74740c4e19def(scrollableNode, checkForOverflow)) scrollableNode = scrollableNode.parentElement; return scrollableNode || document.scrollingElement || document.documentElement; } const $49c51c25361d4cd2$var$visualViewport = typeof document !== "undefined" && window.visualViewport; const $49c51c25361d4cd2$var$nonTextInputTypes = /* @__PURE__ */ new Set([ "checkbox", "radio", "range", "color", "file", "image", "button", "submit", "reset" ]); let $49c51c25361d4cd2$var$preventScrollCount = 0; let $49c51c25361d4cd2$var$restore; function $49c51c25361d4cd2$export$ee0f7cc6afcd1c18(options = {}) { let { isDisabled } = options; $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(() => { if (isDisabled) return; $49c51c25361d4cd2$var$preventScrollCount++; if ($49c51c25361d4cd2$var$preventScrollCount === 1) { if ($c87311424ea30a05$export$fedb369cb70207f1()) $49c51c25361d4cd2$var$restore = $49c51c25361d4cd2$var$preventScrollMobileSafari(); else $49c51c25361d4cd2$var$restore = $49c51c25361d4cd2$var$preventScrollStandard(); } return () => { $49c51c25361d4cd2$var$preventScrollCount--; if ($49c51c25361d4cd2$var$preventScrollCount === 0) $49c51c25361d4cd2$var$restore(); }; }, [ isDisabled ]); } function $49c51c25361d4cd2$var$preventScrollStandard() { return $ff5963eb1fccf552$export$e08e3b67e392101e($49c51c25361d4cd2$var$setStyle(document.documentElement, "paddingRight", `${window.innerWidth - document.documentElement.clientWidth}px`), $49c51c25361d4cd2$var$setStyle(document.documentElement, "overflow", "hidden")); } function $49c51c25361d4cd2$var$preventScrollMobileSafari() { let scrollable; let restoreScrollableStyles; let onTouchStart = (e) => { scrollable = $62d8ded9296f3872$export$cfa2225e87938781(e.target, true); if (scrollable === document.documentElement && scrollable === document.body) return; if (scrollable instanceof HTMLElement && window.getComputedStyle(scrollable).overscrollBehavior === "auto") restoreScrollableStyles = $49c51c25361d4cd2$var$setStyle(scrollable, "overscrollBehavior", "contain"); }; let onTouchMove = (e) => { if (!scrollable || scrollable === document.documentElement || scrollable === document.body) { e.preventDefault(); return; } if (scrollable.scrollHeight === scrollable.clientHeight && scrollable.scrollWidth === scrollable.clientWidth) e.preventDefault(); }; let onTouchEnd = () => { if (restoreScrollableStyles) restoreScrollableStyles(); }; let onFocus = (e) => { let target = e.target; if ($49c51c25361d4cd2$var$willOpenKeyboard(target)) { setupStyles(); target.style.transform = "translateY(-2000px)"; requestAnimationFrame(() => { target.style.transform = ""; if ($49c51c25361d4cd2$var$visualViewport) { if ($49c51c25361d4cd2$var$visualViewport.height < window.innerHeight) requestAnimationFrame(() => { $49c51c25361d4cd2$var$scrollIntoView(target); }); else $49c51c25361d4cd2$var$visualViewport.addEventListener("resize", () => $49c51c25361d4cd2$var$scrollIntoView(target), { once: true }); } }); } }; let restoreStyles = null; let setupStyles = () => { if (restoreStyles) return; let onWindowScroll = () => { window.scrollTo(0, 0); }; let scrollX = window.pageXOffset; let scrollY = window.pageYOffset; restoreStyles = $ff5963eb1fccf552$export$e08e3b67e392101e($49c51c25361d4cd2$var$addEvent(window, "scroll", onWindowScroll), $49c51c25361d4cd2$var$setStyle(document.documentElement, "paddingRight", `${window.innerWidth - document.documentElement.clientWidth}px`), $49c51c25361d4cd2$var$setStyle(document.documentElement, "overflow", "hidden"), $49c51c25361d4cd2$var$setStyle(document.body, "marginTop", `-${scrollY}px`), () => { window.scrollTo(scrollX, scrollY); }); window.scrollTo(0, 0); }; let removeEvents = $ff5963eb1fccf552$export$e08e3b67e392101e($49c51c25361d4cd2$var$addEvent(document, "touchstart", onTouchStart, { passive: false, capture: true }), $49c51c25361d4cd2$var$addEvent(document, "touchmove", onTouchMove, { passive: false, capture: true }), $49c51c25361d4cd2$var$addEvent(document, "touchend", onTouchEnd, { passive: false, capture: true }), $49c51c25361d4cd2$var$addEvent(document, "focus", onFocus, true)); return () => { restoreScrollableStyles === null || restoreScrollableStyles === void 0 ? void 0 : restoreScrollableStyles(); restoreStyles === null || restoreStyles === void 0 ? void 0 : restoreStyles(); removeEvents(); }; } function $49c51c25361d4cd2$var$setStyle(element, style, value) { let cur = element.style[style]; element.style[style] = value; return () => { element.style[style] = cur; }; } function $49c51c25361d4cd2$var$addEvent(target, event, handler, options) { target.addEventListener(event, handler, options); return () => { target.removeEventListener(event, handler, options); }; } function $49c51c25361d4cd2$var$scrollIntoView(target) { let root = document.scrollingElement || document.documentElement; let nextTarget = target; while (nextTarget && nextTarget !== root) { let scrollable = $62d8ded9296f3872$export$cfa2225e87938781(nextTarget); if (scrollable !== document.documentElement && scrollable !== document.body && scrollable !== nextTarget) { let scrollableTop = scrollable.getBoundingClientRect().top; let targetTop = nextTarget.getBoundingClientRect().top; if (targetTop > scrollableTop + nextTarget.clientHeight) scrollable.scrollTop += targetTop - scrollableTop; } nextTarget = scrollable.parentElement; } } function $49c51c25361d4cd2$var$willOpenKeyboard(target) { return target instanceof HTMLInputElement && !$49c51c25361d4cd2$var$nonTextInputTypes.has(target.type) || target instanceof HTMLTextAreaElement || target instanceof HTMLElement && target.isContentEditable; } function getNavigatorData() { if (typeof navigator === "undefined") { return { platform: "", maxTouchPoints: -1 }; } const uaData = navigator.userAgentData; if (uaData?.platform) { return { platform: uaData.platform, maxTouchPoints: navigator.maxTouchPoints }; } return { platform: navigator.platform, maxTouchPoints: navigator.maxTouchPoints }; } function isWebKit() { if (typeof CSS === "undefined" || !CSS.supports) { return false; } return CSS.supports("-webkit-backdrop-filter:none"); } function isIOS() { const nav = getNavigatorData(); if (nav.platform === "MacIntel" && nav.maxTouchPoints > 1) { return true; } return /iP(hone|ad|od)|iOS/.test(nav.platform); } function isFirefox() { return /firefox/i.test(getUserAgent()); } function ownerDocument(node) { return node && node.ownerDocument || document; } function ownerWindow(node) { const doc = ownerDocument(node); return doc.defaultView || window; } let originalHtmlStyles = {}; let originalBodyStyles = {}; let originalHtmlScrollBehavior = ""; let preventScrollCount = 0; let restore = () => { }; function supportsDvh() { return typeof CSS !== "undefined" && typeof CSS.supports === "function" && CSS.supports("height", "1dvh"); } function hasInsetScrollbars(referenceElement) { if (typeof document === "undefined") { return false; } const doc = ownerDocument(referenceElement); const win = ownerWindow(doc); return win.innerWidth - doc.documentElement.clientWidth > 0; } function preventScrollStandard(referenceElement) { const doc = ownerDocument(referenceElement); const html = doc.documentElement; const body = doc.body; const win = ownerWindow(html); let scrollTop = 0; let scrollLeft = 0; let resizeRaf = -1; if (isWebKit() && (win.visualViewport?.scale ?? 1) !== 1) { return () => { }; } function lockScroll() { const htmlStyles = win.getComputedStyle(html); const bodyStyles = win.getComputedStyle(body); scrollTop = html.scrollTop; scrollLeft = html.scrollLeft; originalHtmlStyles = { overflowY: html.style.overflowY, overflowX: html.style.overflowX }; originalHtmlScrollBehavior = html.style.scrollBehavior; originalBodyStyles = { position: body.style.position, height: body.style.height, width: body.style.width, boxSizing: body.style.boxSizing, overflowY: body.style.overflowY, overflowX: body.style.overflowX, scrollBehavior: body.style.scrollBehavior }; const hasScrollbarGutterStable = htmlStyles.scrollbarGutter?.includes("stable"); const isScrollableY = html.scrollHeight > html.clientHeight; const isScrollableX = html.scrollWidth > html.clientWidth; const hasConstantOverflowY = htmlStyles.overflowY === "scroll" || bodyStyles.overflowY === "scroll"; const hasConstantOverflowX = htmlStyles.overflowX === "scroll" || bodyStyles.overflowX === "scroll"; const scrollbarWidth = Math.max(0, win.innerWidth - html.clientWidth); const scrollbarHeight = Math.max(0, win.innerHeight - html.clientHeight); Object.assign(html.style, { overflowY: !hasScrollbarGutterStable && (isScrollableY || hasConstantOverflowY) ? "scroll" : "hidden", overflowX: !hasScrollbarGutterStable && (isScrollableX || hasConstantOverflowX) ? "scroll" : "hidden" }); const marginY = parseFloat(bodyStyles.marginTop) + parseFloat(bodyStyles.marginBottom); const marginX = parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight); Object.assign(body.style, { position: "relative", height: marginY || scrollbarHeight ? `calc(100dvh - ${marginY + scrollbarHeight}px)` : "100dvh", width: marginX || scrollbarWidth ? `calc(100vw - ${marginX + scrollbarWidth}px)` : "100vw", boxSizing: "border-box", overflow: "hidden", scrollBehavior: "unset" }); body.scrollTop = scrollTop; body.scrollLeft = scrollLeft; html.setAttribute("data-base-ui-scroll-locked", ""); html.style.scrollBehavior = "unset"; } function cleanup() { Object.assign(html.style, originalHtmlStyles); Object.assign(body.style, originalBodyStyles); html.scrollTop = scrollTop; html.scrollLeft = scrollLeft; html.removeAttribute("data-base-ui-scroll-locked"); html.style.scrollBehavior = originalHtmlScrollBehavior; } function handleResize() { cleanup(); cancelAnimationFrame(resizeRaf); resizeRaf = requestAnimationFrame(lockScroll); } lockScroll(); win.addEventListener("resize", handleResize); return () => { cancelAnimationFrame(resizeRaf); cleanup(); win.removeEventListener("resize", handleResize); }; } function useScrollLock(enabled = true, referenceElement) { const isReactAriaHook = React.useMemo(() => enabled && (isIOS() || !supportsDvh() || // macOS Firefox "pops" scroll containers' scrollbars with our standard scroll lock isFirefox() && !hasInsetScrollbars(referenceElement)), [enabled, referenceElement]); $49c51c25361d4cd2$export$ee0f7cc6afcd1c18({ // react-aria will remove the scrollbar offset immediately upon close, since we use `open`, // not `mounted`, to disable/enable the scroll lock. However since there are no inset // scrollbars, no layouting issues occur. isDisabled: !isReactAriaHook }); useEnhancedEffect(() => { if (!enabled || isReactAriaHook) { return void 0; } preventScrollCount += 1; if (preventScrollCount === 1) { restore = preventScrollStandard(referenceElement); } return () => { preventScrollCount -= 1; if (preventScrollCount === 0) { restore(); } }; }, [enabled, isReactAriaHook, referenceElement]); } export { GridProvider as G, useTransitionStatus as a, useScrollLock as b, useGrid as c, ownerWindow as d, isWebKit as i, ownerDocument as o, useControlled as u };