UNPKG

@ariakit/react-core

Version:

Ariakit React core

183 lines (157 loc) 6.11 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _NROAA37Vcjs = require('../__chunks/NROAA37V.cjs'); var _YZWMAQPAcjs = require('../__chunks/YZWMAQPA.cjs'); var _WT6V7PQBcjs = require('../__chunks/WT6V7PQB.cjs'); var _XFOFWDPYcjs = require('../__chunks/XFOFWDPY.cjs'); require('../__chunks/5WCU5NVK.cjs'); require('../__chunks/57Z4CQLB.cjs'); require('../__chunks/GCJBB4ZT.cjs'); var _YAKNSXYIcjs = require('../__chunks/YAKNSXYI.cjs'); require('../__chunks/T3QB4FR3.cjs'); var _EMYYI4CZcjs = require('../__chunks/EMYYI4CZ.cjs'); require('../__chunks/QJGTENWI.cjs'); var _WBFXWJUHcjs = require('../__chunks/WBFXWJUH.cjs'); var _MZ2HG624cjs = require('../__chunks/MZ2HG624.cjs'); require('../__chunks/XMDZRF6Y.cjs'); // src/tab/tab-panel.tsx var _focus = require('@ariakit/core/utils/focus'); var _misc = require('@ariakit/core/utils/misc'); var _react = require('react'); var _jsxruntime = require('react/jsx-runtime'); var TagName = "div"; var useTabPanel = _WBFXWJUHcjs.createHook.call(void 0, function useTabPanel2({ store, unmountOnHide, tabId: tabIdProp, getItem: getItemProp, scrollRestoration, scrollElement, ...props }) { const context = _NROAA37Vcjs.useTabProviderContext.call(void 0, ); store = store || context; _misc.invariant.call(void 0, store, process.env.NODE_ENV !== "production" && "TabPanel must receive a `store` prop or be wrapped in a TabProvider component." ); const ref = _react.useRef.call(void 0, null); const id = _MZ2HG624cjs.useId.call(void 0, props.id); const tabId = _EMYYI4CZcjs.useStoreState.call(void 0, store.panels, () => { var _a; return tabIdProp || ((_a = store == null ? void 0 : store.panels.item(id)) == null ? void 0 : _a.tabId); } ); const open = _EMYYI4CZcjs.useStoreState.call(void 0, store, (state) => !!tabId && state.selectedId === tabId ); const disclosure = _WT6V7PQBcjs.useDisclosureStore.call(void 0, { open }); const mounted = _EMYYI4CZcjs.useStoreState.call(void 0, disclosure, "mounted"); const scrollPositionRef = _react.useRef.call(void 0, /* @__PURE__ */ new Map() ); const getScrollElement = _MZ2HG624cjs.useEvent.call(void 0, () => { const panelElement = ref.current; if (!panelElement) return null; if (!scrollElement) return panelElement; if (typeof scrollElement === "function") { return scrollElement(panelElement); } if ("current" in scrollElement) { return scrollElement.current; } return scrollElement; }); _react.useEffect.call(void 0, () => { var _a, _b; if (!scrollRestoration) return; if (!mounted) return; const element = getScrollElement(); if (!element) return; if (scrollRestoration === "reset") { element.scroll(0, 0); return; } if (!tabId) return; const position = scrollPositionRef.current.get(tabId); element.scroll((_a = position == null ? void 0 : position.x) != null ? _a : 0, (_b = position == null ? void 0 : position.y) != null ? _b : 0); const onScroll = () => { scrollPositionRef.current.set(tabId, { x: element.scrollLeft, y: element.scrollTop }); }; element.addEventListener("scroll", onScroll); return () => { element.removeEventListener("scroll", onScroll); }; }, [scrollRestoration, mounted, tabId, getScrollElement, store]); const [hasTabbableChildren, setHasTabbableChildren] = _react.useState.call(void 0, false); _react.useEffect.call(void 0, () => { const element = ref.current; if (!element) return; const tabbable = _focus.getAllTabbableIn.call(void 0, element); setHasTabbableChildren(!!tabbable.length); }, []); const getItem = _react.useCallback.call(void 0, (item) => { const nextItem = { ...item, id: id || item.id, tabId: tabIdProp }; if (getItemProp) { return getItemProp(nextItem); } return nextItem; }, [id, tabIdProp, getItemProp] ); const onKeyDownProp = props.onKeyDown; const onKeyDown = _MZ2HG624cjs.useEvent.call(void 0, (event) => { onKeyDownProp == null ? void 0 : onKeyDownProp(event); if (event.defaultPrevented) return; if (!(store == null ? void 0 : store.composite)) return; const keyMap = { ArrowLeft: store.previous, ArrowRight: store.next, Home: store.first, End: store.last }; const action = keyMap[event.key]; if (!action) return; const { selectedId } = store.getState(); const nextId = action({ activeId: selectedId }); if (!nextId) return; event.preventDefault(); store.move(nextId); }); props = _MZ2HG624cjs.useWrapElement.call(void 0, props, (element) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _NROAA37Vcjs.TabScopedContextProvider, { value: store, children: element }), [store] ); props = { id, role: "tabpanel", "aria-labelledby": tabId || void 0, ...props, children: unmountOnHide && !mounted ? null : props.children, ref: _MZ2HG624cjs.useMergeRefs.call(void 0, ref, props.ref), onKeyDown }; props = _YAKNSXYIcjs.useFocusable.call(void 0, { // If the tab panel is rendered as part of another composite widget such // as combobox, it should not be focusable. focusable: !store.composite && !hasTabbableChildren, ...props }); props = _YZWMAQPAcjs.useDisclosureContent.call(void 0, { store: disclosure, ...props }); props = _XFOFWDPYcjs.useCollectionItem.call(void 0, { store: store.panels, ...props, getItem }); return props; } ); var TabPanel = _WBFXWJUHcjs.forwardRef.call(void 0, function TabPanel2(props) { const htmlProps = useTabPanel(props); return _WBFXWJUHcjs.createElement.call(void 0, TagName, htmlProps); }); exports.TabPanel = TabPanel; exports.useTabPanel = useTabPanel;