UNPKG

@razorpay/blade

Version:

The Design System that powers Razorpay

194 lines (190 loc) 8.32 kB
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties'; import _defineProperty from '@babel/runtime/helpers/defineProperty'; import React__default from 'react'; import styled from 'styled-components'; import { useTabNavContext } from './TabNavContext.js'; import { MIXED_BG_COLOR } from './utils.js'; import '../../Box/BaseBox/index.js'; import getTextStyles from '../../Typography/Text/getTextStyles.js'; import '../../../utils/index.js'; import '../../../utils/assignWithoutSideEffects/index.js'; import '../../../utils/makeAccessible/index.js'; import '../../../tokens/global/index.js'; import '../../../utils/metaAttribute/index.js'; import { useIsomorphicLayoutEffect } from '../../../utils/useIsomorphicLayoutEffect.js'; import { jsxs, jsx } from 'react/jsx-runtime'; import { makeSpace } from '../../../utils/makeSpace/makeSpace.js'; import { makeBorderSize } from '../../../utils/makeBorderSize/makeBorderSize.js'; import { BaseBox } from '../../Box/BaseBox/BaseBox.web.js'; import { makeSize } from '../../../utils/makeSize/makeSize.js'; import { size } from '../../../tokens/global/size.js'; import { makeMotionTime } from '../../../utils/makeMotionTime/makeMotionTime.web.js'; import { metaAttribute } from '../../../utils/metaAttribute/metaAttribute.web.js'; import { MetaConstants } from '../../../utils/metaAttribute/metaConstants.js'; import { makeAccessible } from '../../../utils/makeAccessible/makeAccessible.web.js'; import { assignWithoutSideEffects } from '../../../utils/assignWithoutSideEffects/assignWithoutSideEffects.js'; var _excluded = ["as", "title", "isActive", "icon", "trailing", "accessibilityLabel", "href", "target", "__isInsideTabNavItems", "__index"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var StyledTabNavItem = /*#__PURE__*/styled.a.withConfig({ displayName: "TabNavItemweb__StyledTabNavItem", componentId: "sc-1eiaez7-0" })(function (_ref) { var theme = _ref.theme, $isActive = _ref.$isActive; return _objectSpread(_objectSpread({}, getTextStyles({ theme: theme, size: 'medium', weight: 'medium', color: $isActive ? 'interactive.text.gray.normal' : 'interactive.text.gray.subtle' })), {}, { flex: 1, display: 'flex', gap: makeSpace(theme.spacing[2]), alignItems: 'center', justifyContent: 'center', height: '100%', textDecoration: 'none', whiteSpace: 'nowrap', paddingTop: makeSpace(theme.spacing[3]), paddingBottom: makeSpace(theme.spacing[3]), paddingLeft: makeSpace(theme.spacing[4]), paddingRight: makeSpace(theme.spacing[4]), borderRadius: makeBorderSize(theme.border.radius.medium), // reset button styles border: 'none', background: 'none', '&[aria-expanded="true"]': $isActive ? {} : { backgroundColor: theme.colors.interactive.background.gray["default"] }, '&:hover': $isActive ? {} : { backgroundColor: theme.colors.interactive.background.gray["default"] } }); }); var StyledTabNavItemWrapper = /*#__PURE__*/styled(BaseBox).withConfig({ displayName: "TabNavItemweb__StyledTabNavItemWrapper", componentId: "sc-1eiaez7-1" })(function (_ref2) { var theme = _ref2.theme, isActive = _ref2.isActive; var dividerHiderStyle = { content: '""', position: 'absolute', top: '50%', transform: 'translateY(-50%)', width: makeSize(size[1]), height: makeSize(size[16]), backgroundColor: MIXED_BG_COLOR }; return _objectSpread({ position: 'relative', flexShrink: 0, padding: "".concat(makeSpace(theme.spacing[2]), " ").concat(makeSpace(theme.spacing[1])), backgroundColor: isActive ? theme.colors.surface.background.gray.moderate : 'transparent', borderColor: isActive ? theme.colors.surface.border.gray.muted : 'transparent', borderStyle: 'solid', borderWidth: makeBorderSize(theme.border.width.thin), borderBottomWidth: 0, borderTopLeftRadius: makeBorderSize(theme.border.radius.medium), borderTopRightRadius: makeBorderSize(theme.border.radius.medium), transition: "".concat(makeMotionTime(theme.motion.duration.moderate), " ").concat(theme.motion.easing.standard), transitionProperty: 'background' }, isActive ? { ':before, :after': dividerHiderStyle, ':before': { left: -2 }, ':after': { right: -2 } } : {}); }); var SelectedBar = /*#__PURE__*/styled(BaseBox).withConfig({ displayName: "TabNavItemweb__SelectedBar", componentId: "sc-1eiaez7-2" })(function (_ref3) { var theme = _ref3.theme, isActive = _ref3.isActive; return { position: 'absolute', top: 0, left: 0, right: 0, height: makeSpace(theme.spacing[1]), borderTopLeftRadius: makeBorderSize(theme.border.radius.medium), borderTopRightRadius: makeBorderSize(theme.border.radius.medium), backgroundColor: theme.colors.interactive.icon.gray.normal, pointerEvents: 'none', // Animation opacity: isActive ? 1 : 0, transition: "".concat(makeMotionTime(theme.motion.duration.moderate), " ").concat(theme.motion.easing.standard), transitionProperty: 'opacity' }; }); var _TabNavItem = function _TabNavItem(_ref4, ref) { var as = _ref4.as, title = _ref4.title, isActive = _ref4.isActive, Icon = _ref4.icon, trailing = _ref4.trailing, accessibilityLabel = _ref4.accessibilityLabel, href = _ref4.href, target = _ref4.target, __isInsideTabNavItems = _ref4.__isInsideTabNavItems, __index = _ref4.__index, props = _objectWithoutProperties(_ref4, _excluded); var _useTabNavContext = useTabNavContext(), setControlledItems = _useTabNavContext.setControlledItems; var bodyRef = React__default.useRef(null); // Update the controlledItems with the tabWidth and offsetX useIsomorphicLayoutEffect(function () { if (!bodyRef.current) return; if (!__isInsideTabNavItems) return; setControlledItems(function (prev) { return prev.map(function (item, index) { var _bodyRef$current; if (index !== __index) return item; var bounds = bodyRef === null || bodyRef === void 0 ? void 0 : (_bodyRef$current = bodyRef.current) === null || _bodyRef$current === void 0 ? void 0 : _bodyRef$current.getBoundingClientRect(); var tabWidth = bounds.width; var offsetX = bounds.right; return _objectSpread(_objectSpread({}, item), {}, { tabWidth: tabWidth, offsetX: offsetX }); }); }); }, [__isInsideTabNavItems, __index, setControlledItems]); return /*#__PURE__*/jsxs(StyledTabNavItemWrapper, _objectSpread(_objectSpread({ ref: bodyRef, isActive: isActive }, metaAttribute({ name: MetaConstants.TabNavItem })), {}, { children: [/*#__PURE__*/jsx(SelectedBar, { isActive: isActive }), /*#__PURE__*/jsxs(StyledTabNavItem, _objectSpread(_objectSpread(_objectSpread(_objectSpread({ ref: ref, as: as !== null && as !== void 0 ? as : href ? 'a' : 'button', to: href, href: as ? undefined : href, target: target, $isActive: isActive }, props), metaAttribute({ name: MetaConstants.TabNavItemLink })), makeAccessible({ label: accessibilityLabel, current: isActive })), {}, { children: [Icon ? /*#__PURE__*/jsx(Icon, { size: "large", color: isActive ? 'interactive.icon.gray.normal' : 'surface.icon.gray.subtle' }) : null, title, trailing ? trailing : null] }))] })); }; var TabNavItem = /*#__PURE__*/assignWithoutSideEffects( /*#__PURE__*/React__default.forwardRef(_TabNavItem), { displayName: 'TabNavItem' }); export { TabNavItem }; //# sourceMappingURL=TabNavItem.web.js.map