@ariakit/react
Version:
Toolkit for building accessible web apps with React
269 lines (220 loc) • 11.5 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true});
var _5FQZLBJ7cjs = require('./5FQZLBJ7.cjs');
var _LZ6L3ECGcjs = require('./LZ6L3ECG.cjs');
// ../ariakit-react-components/dist/disclosure/disclosure-context.js
var ctx = _LZ6L3ECGcjs.createStoreContext.call(void 0, );
var useDisclosureContext = ctx.useContext;
var useDisclosureScopedContext = ctx.useScopedContext;
var useDisclosureProviderContext = ctx.useProviderContext;
var DisclosureContextProvider = ctx.ContextProvider;
var DisclosureScopedContextProvider = ctx.ScopedContextProvider;
// ../ariakit-react-components/dist/dialog/dialog-context.js
var _react = require('react');
var ctx2 = _LZ6L3ECGcjs.createStoreContext.call(void 0, [DisclosureContextProvider], [DisclosureScopedContextProvider]);
var useDialogContext = ctx2.useContext;
var useDialogScopedContext = ctx2.useScopedContext;
var useDialogProviderContext = ctx2.useProviderContext;
var DialogContextProvider = ctx2.ContextProvider;
var DialogScopedContextProvider = ctx2.ScopedContextProvider;
var DialogHeadingContext = _react.createContext.call(void 0, void 0);
var DialogDescriptionContext = _react.createContext.call(void 0, void 0);
// ../ariakit-react-components/dist/disclosure/disclosure-content.js
var _jsxruntime = require('react/jsx-runtime');
var _reactdom = require('react-dom');
var TagName = "div";
function afterTimeout(timeoutMs, cb) {
const timeoutId = setTimeout(cb, timeoutMs);
return () => clearTimeout(timeoutId);
}
function parseCSSTime(time) {
const value = (time == null ? void 0 : time.trim()) || "0s";
const multiplier = value.endsWith("ms") ? 1 : 1e3;
const parsed = Number.parseFloat(value) * multiplier;
return Number.isNaN(parsed) ? 0 : parsed;
}
function getEndTime(names, delays, durations) {
const nameList = names.split(",");
const delayList = delays.split(",");
const durationList = durations.split(",");
let endTime = 0;
for (const [index, name] of nameList.entries()) {
if (name.trim() === "none") continue;
const delay = parseCSSTime(delayList[index % delayList.length]);
const duration = parseCSSTime(durationList[index % durationList.length]);
endTime = Math.max(endTime, delay + duration);
}
return endTime;
}
function getElementEndTime(element) {
const { transitionProperty, transitionDuration, transitionDelay, animationName, animationDuration, animationDelay } = getComputedStyle(element);
return Math.max(getEndTime(transitionProperty, transitionDelay, transitionDuration), getEndTime(animationName, animationDelay, animationDuration));
}
function isHidden(mounted, hidden, alwaysVisible) {
return !alwaysVisible && hidden !== false && (!mounted || !!hidden);
}
var useDisclosureContent = _LZ6L3ECGcjs.createHook.call(void 0, function useDisclosureContent2({ store, alwaysVisible, unstable_otherElementRef: otherElementRef, ...props }) {
const context = useDisclosureProviderContext();
store = store || context;
_LZ6L3ECGcjs.invariant.call(void 0, store, process.env.NODE_ENV !== "production" && "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component.");
const ref = _react.useRef.call(void 0, null);
const id = _LZ6L3ECGcjs.useId.call(void 0, props.id);
const [transition, setTransition] = _react.useState.call(void 0, null);
const open = _5FQZLBJ7cjs.useStoreState.call(void 0, store, "open");
const mounted = _5FQZLBJ7cjs.useStoreState.call(void 0, store, "mounted");
const animated = _5FQZLBJ7cjs.useStoreState.call(void 0, store, "animated");
const contentElement = _5FQZLBJ7cjs.useStoreState.call(void 0, store, "contentElement");
const otherElement = _5FQZLBJ7cjs.useStoreState.call(void 0, store.disclosure, "contentElement");
const hasClosedRef = _react.useRef.call(void 0, false);
_LZ6L3ECGcjs.useSafeLayoutEffect.call(void 0, () => {
if (!ref.current) return;
store == null ? void 0 : store.setContentElement(ref.current);
}, [store]);
_LZ6L3ECGcjs.useSafeLayoutEffect.call(void 0, () => {
let previousAnimated;
store == null ? void 0 : store.setState("animated", (animated2) => {
previousAnimated = animated2;
return true;
});
return () => {
if (previousAnimated === void 0) return;
store == null ? void 0 : store.setState("animated", previousAnimated);
};
}, [store]);
_LZ6L3ECGcjs.useSafeLayoutEffect.call(void 0, () => {
if (!animated) {
if (!open) {
hasClosedRef.current = true;
setTransition(null);
} else if (hasClosedRef.current) {
hasClosedRef.current = false;
setTransition("enter");
}
return;
}
if (!(contentElement == null ? void 0 : contentElement.isConnected)) {
setTransition(null);
return;
}
return _LZ6L3ECGcjs.afterPaint.call(void 0, () => {
setTransition(open ? "enter" : mounted ? "leave" : null);
});
}, [
animated,
contentElement,
open,
mounted
]);
_LZ6L3ECGcjs.useSafeLayoutEffect.call(void 0, () => {
if (!store) return;
if (!animated) return;
if (!transition) return;
if (!contentElement) return;
const stopAnimation = () => store == null ? void 0 : store.setState("animating", false);
const stopAnimationSync = () => _reactdom.flushSync.call(void 0, stopAnimation);
if (transition === "leave" && open) return;
if (transition === "enter" && !open) return;
if (typeof animated === "number") return afterTimeout(animated, stopAnimationSync);
const elements = [contentElement];
if (otherElement) elements.push(otherElement);
const relatedElement = otherElementRef == null ? void 0 : otherElementRef.current;
if (relatedElement) elements.push(relatedElement);
const timeout = Math.max(...elements.map(getElementEndTime));
if (!timeout) {
if (transition === "enter") store.setState("animated", false);
stopAnimation();
return;
}
return afterTimeout(Math.max(timeout - 1e3 / 60, 0), stopAnimationSync);
}, [
store,
animated,
contentElement,
otherElement,
otherElementRef,
open,
transition
]);
props = _LZ6L3ECGcjs.useWrapElement.call(void 0, props, (element) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DialogScopedContextProvider, {
value: store,
children: element
}), [store]);
const hidden = isHidden(mounted, props.hidden, alwaysVisible);
const styleProp = props.style;
const style = _react.useMemo.call(void 0, () => {
if (hidden) return {
...styleProp,
display: "none"
};
return styleProp;
}, [hidden, styleProp]);
props = {
"data-open": open || void 0,
"data-enter": transition === "enter" || void 0,
"data-leave": transition === "leave" || void 0,
hidden,
...props,
id,
ref: _LZ6L3ECGcjs.useMergeRefs.call(void 0, id ? store.setContentElement : null, ref, props.ref),
style
};
return _LZ6L3ECGcjs.removeUndefinedValues.call(void 0, props);
});
var DisclosureContentImpl = _LZ6L3ECGcjs.forwardRef.call(void 0, function DisclosureContentImpl2(props) {
return _LZ6L3ECGcjs.createElement.call(void 0, TagName, useDisclosureContent(props));
});
var DisclosureContent = _LZ6L3ECGcjs.forwardRef.call(void 0, function DisclosureContent2({ unmountOnHide, ...props }) {
const context = useDisclosureProviderContext();
if (_5FQZLBJ7cjs.useStoreState.call(void 0, props.store || context, (state) => !unmountOnHide || (state == null ? void 0 : state.mounted)) === false) return null;
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DisclosureContentImpl, { ...props });
});
// ../ariakit-components/dist/disclosure/disclosure-store.js
function createDisclosureStore(props = {}) {
const store = _5FQZLBJ7cjs.mergeStore.call(void 0, props.store, _5FQZLBJ7cjs.omit.call(void 0, props.disclosure, ["contentElement", "disclosureElement"]));
_5FQZLBJ7cjs.throwOnConflictingProps.call(void 0, props, store);
const syncState = store == null ? void 0 : store.getState();
const open = _LZ6L3ECGcjs.defaultValue.call(void 0, props.open, syncState == null ? void 0 : syncState.open, props.defaultOpen, false);
const animated = _LZ6L3ECGcjs.defaultValue.call(void 0, props.animated, syncState == null ? void 0 : syncState.animated, false);
const disclosure = _5FQZLBJ7cjs.createStore.call(void 0, {
open,
animated,
animating: !!animated && open,
mounted: open,
contentElement: _LZ6L3ECGcjs.defaultValue.call(void 0, syncState == null ? void 0 : syncState.contentElement, null),
disclosureElement: _LZ6L3ECGcjs.defaultValue.call(void 0, syncState == null ? void 0 : syncState.disclosureElement, null)
}, store);
_5FQZLBJ7cjs.setup.call(void 0, disclosure, () => _5FQZLBJ7cjs.sync.call(void 0, disclosure, ["animated", "animating"], (state) => {
if (state.animated) return;
disclosure.setState("animating", false);
}));
_5FQZLBJ7cjs.setup.call(void 0, disclosure, () => _5FQZLBJ7cjs.subscribe.call(void 0, disclosure, ["open"], () => {
if (!disclosure.getState().animated) return;
disclosure.setState("animating", true);
}));
_5FQZLBJ7cjs.setup.call(void 0, disclosure, () => _5FQZLBJ7cjs.sync.call(void 0, disclosure, ["open", "animating"], (state) => {
disclosure.setState("mounted", state.open || state.animating);
}));
return {
...disclosure,
disclosure: props.disclosure,
setOpen: (value) => disclosure.setState("open", value),
show: () => disclosure.setState("open", true),
hide: () => disclosure.setState("open", false),
toggle: () => disclosure.setState("open", (open2) => !open2),
stopAnimation: () => disclosure.setState("animating", false),
setContentElement: (value) => disclosure.setState("contentElement", value),
setDisclosureElement: (value) => disclosure.setState("disclosureElement", value)
};
}
// ../ariakit-react-components/dist/disclosure/disclosure-store.js
function useDisclosureStoreProps(store, update, props) {
_LZ6L3ECGcjs.useUpdateEffect.call(void 0, update, [props.store, props.disclosure]);
_5FQZLBJ7cjs.useStoreProps.call(void 0, store, props, "open", "setOpen");
_5FQZLBJ7cjs.useStoreProps.call(void 0, store, props, "mounted", "setMounted");
_5FQZLBJ7cjs.useStoreProps.call(void 0, store, props, "animated");
return Object.assign(store, { disclosure: props.disclosure });
}
function useDisclosureStore(props = {}) {
const [store, update] = _5FQZLBJ7cjs.useStore.call(void 0, createDisclosureStore, props);
return useDisclosureStoreProps(store, update, props);
}
exports.useDisclosureContext = useDisclosureContext; exports.useDisclosureProviderContext = useDisclosureProviderContext; exports.DisclosureContextProvider = DisclosureContextProvider; exports.useDialogContext = useDialogContext; exports.useDialogScopedContext = useDialogScopedContext; exports.useDialogProviderContext = useDialogProviderContext; exports.DialogContextProvider = DialogContextProvider; exports.DialogScopedContextProvider = DialogScopedContextProvider; exports.DialogHeadingContext = DialogHeadingContext; exports.DialogDescriptionContext = DialogDescriptionContext; exports.isHidden = isHidden; exports.useDisclosureContent = useDisclosureContent; exports.DisclosureContent = DisclosureContent; exports.createDisclosureStore = createDisclosureStore; exports.useDisclosureStoreProps = useDisclosureStoreProps; exports.useDisclosureStore = useDisclosureStore;