@ariakit/react-core
Version:
Ariakit React core
141 lines (139 loc) • 3.98 kB
JavaScript
"use client";
import {
useTabScopedContext
} from "../__chunks/QGC5LOGZ.js";
import {
CompositeItem,
useCompositeItem
} from "../__chunks/SBSPVDDI.js";
import "../__chunks/5VQZOHHZ.js";
import "../__chunks/Y62RTBST.js";
import "../__chunks/APTFW6PT.js";
import "../__chunks/2W3RN7C5.js";
import "../__chunks/OE2EFRVA.js";
import "../__chunks/SWN3JYXT.js";
import {
useStoreState
} from "../__chunks/RTNCFSKZ.js";
import "../__chunks/5CPL3B7G.js";
import {
createElement,
createHook,
forwardRef,
memo
} from "../__chunks/VOQWLFSQ.js";
import {
useEvent,
useId
} from "../__chunks/5GGHRIN3.js";
import "../__chunks/SK3NAZA3.js";
import {
__objRest,
__spreadProps,
__spreadValues
} from "../__chunks/3YLGPPWQ.js";
// src/tab/tab.tsx
import { disabledFromProps, invariant } from "@ariakit/core/utils/misc";
import { useCallback } from "react";
import { jsx } from "react/jsx-runtime";
var TagName = "button";
var useTab = createHook(function useTab2(_a) {
var _b = _a, {
store,
getItem: getItemProp
} = _b, props = __objRest(_b, [
"store",
"getItem"
]);
var _a2;
const context = useTabScopedContext();
store = store || context;
invariant(
store,
process.env.NODE_ENV !== "production" && "Tab must be wrapped in a TabList component."
);
const defaultId = useId();
const id = props.id || defaultId;
const dimmed = disabledFromProps(props);
const getItem = useCallback(
(item) => {
const nextItem = __spreadProps(__spreadValues({}, item), { dimmed });
if (getItemProp) {
return getItemProp(nextItem);
}
return nextItem;
},
[dimmed, getItemProp]
);
const onClickProp = props.onClick;
const onClick = useEvent((event) => {
onClickProp == null ? void 0 : onClickProp(event);
if (event.defaultPrevented) return;
store == null ? void 0 : store.setSelectedId(id);
});
const panelId = store.panels.useState(
(state) => {
var _a3;
return (_a3 = state.items.find((item) => item.tabId === id)) == null ? void 0 : _a3.id;
}
);
const shouldRegisterItem = defaultId ? props.shouldRegisterItem : false;
const isActive = store.useState((state) => !!id && state.activeId === id);
const selected = store.useState((state) => !!id && state.selectedId === id);
const hasActiveItem = store.useState((state) => !!store.item(state.activeId));
const canRegisterComposedItem = isActive || selected && !hasActiveItem;
const accessibleWhenDisabled = selected || ((_a2 = props.accessibleWhenDisabled) != null ? _a2 : true);
const isWithinVirtualFocusComposite = useStoreState(
store.combobox || store.composite,
"virtualFocus"
);
if (isWithinVirtualFocusComposite) {
props = __spreadProps(__spreadValues({}, props), {
tabIndex: -1
});
}
props = __spreadProps(__spreadValues({
id,
role: "tab",
"aria-selected": selected,
"aria-controls": panelId || void 0
}, props), {
onClick
});
if (store.composite) {
const defaultProps = {
id,
accessibleWhenDisabled,
store: store.composite,
shouldRegisterItem: canRegisterComposedItem && shouldRegisterItem,
rowId: props.rowId,
render: props.render
};
props = __spreadProps(__spreadValues({}, props), {
render: /* @__PURE__ */ jsx(
CompositeItem,
__spreadProps(__spreadValues({}, defaultProps), {
render: store.combobox && store.composite !== store.combobox ? /* @__PURE__ */ jsx(CompositeItem, __spreadProps(__spreadValues({}, defaultProps), { store: store.combobox })) : defaultProps.render
})
)
});
}
props = useCompositeItem(__spreadProps(__spreadValues({
store
}, props), {
accessibleWhenDisabled,
getItem,
shouldRegisterItem
}));
return props;
});
var Tab = memo(
forwardRef(function Tab2(props) {
const htmlProps = useTab(props);
return createElement(TagName, htmlProps);
})
);
export {
Tab,
useTab
};