UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

167 lines (164 loc) 5.32 kB
import React, { useRef } from 'react'; import cx from 'clsx'; import { useUncontrolled } from '@mantine/hooks'; import { Group } from '../Group/Group.js'; import { Tab } from './Tab/Tab.js'; export { Tab } from './Tab/Tab.js'; import { TabControl } from './TabControl/TabControl.js'; import useStyles from './Tabs.styles.js'; import { useMantineTheme } from '../../theme/use-mantine-theme/use-mantine-theme.js'; import { mergeStyles } from '../../theme/utils/merge-styles/merge-styles.js'; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __objRest = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols) for (var prop of __getOwnPropSymbols(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) target[prop] = source[prop]; } return target; }; function clamp(value, min, max) { return Math.min(Math.max(value, min), max); } function getPreviousTab(active, tabs) { for (let i = active - 1; i >= 0; i -= 1) { if (!tabs[i].props.disabled) { return i; } } return active; } function getNextTab(active, tabs) { for (let i = active + 1; i < tabs.length; i += 1) { if (!tabs[i].props.disabled) { return i; } } return active; } function findInitialTab(tabs) { for (let i = 0; i < tabs.length; i += 1) { if (!tabs[i].props.disabled) { return i; } } return -1; } function Tabs(_a) { var _b = _a, { className, children, style, initialTab, themeOverride, active, position = "left", grow = false, onTabChange, color, variant = "default", classNames, styles, tabPadding = "xs" } = _b, others = __objRest(_b, [ "className", "children", "style", "initialTab", "themeOverride", "active", "position", "grow", "onTabChange", "color", "variant", "classNames", "styles", "tabPadding" ]); const theme = useMantineTheme(themeOverride); const classes = useStyles({ theme, tabPadding }, classNames, "tabs"); const _styles = mergeStyles(classes, styles); const controlRefs = useRef({}); const tabs = React.Children.toArray(children).filter((item) => item.type === Tab); const [_activeTab, handleActiveTabChange] = useUncontrolled({ value: active, defaultValue: initialTab, finalValue: findInitialTab(tabs), rule: (value) => typeof value === "number", onChange: onTabChange }); const activeTab = clamp(_activeTab, 0, tabs.length - 1); const handleKeyDown = (event) => { if (event.nativeEvent.code === "ArrowRight") { const nextTab = getNextTab(activeTab, tabs); handleActiveTabChange(nextTab); controlRefs.current[nextTab].focus(); } if (event.nativeEvent.code === "ArrowLeft") { const previousTab = getPreviousTab(activeTab, tabs); handleActiveTabChange(previousTab); controlRefs.current[previousTab].focus(); } }; const panes = tabs.map((tab, index) => /* @__PURE__ */ React.createElement(TabControl, __spreadProps(__spreadValues({}, tab.props), { key: index, active: activeTab === index, tabProps: tab.props, onKeyDown: handleKeyDown, color, variant, elementRef: (node) => { controlRefs.current[index] = node; }, onClick: () => activeTab !== index && handleActiveTabChange(index), classNames, styles }))); const content = tabs[activeTab].props.children; return /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({}, others), { className: cx(classes.root, className), style: __spreadValues(__spreadValues({}, style), _styles.root) }), /* @__PURE__ */ React.createElement("div", { className: cx(classes.tabsListWrapper, classes[variant]), style: __spreadValues(__spreadValues({}, _styles.tabsListWrapper), _styles[variant]) }, /* @__PURE__ */ React.createElement(Group, { className: classes.tabsList, style: _styles.tabsList, role: "tablist", "aria-orientation": "horizontal", spacing: variant === "pills" ? "md" : 0, position, grow }, panes)), content && /* @__PURE__ */ React.createElement("div", { "data-mantine-tab-content": true, role: "tabpanel", className: classes.body, style: _styles.body }, content)); } Tabs.displayName = "@mantine/core/Tabs"; export { Tabs }; //# sourceMappingURL=Tabs.js.map