UNPKG

@primer/components

Version:
258 lines (222 loc) • 9.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Item = exports.TEXT_ROW_HEIGHT = exports.Slot = exports.getVariantStyles = void 0; var _react = _interopRequireDefault(require("react")); var _ssr = require("@react-aria/ssr"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _ThemeProvider = require("../ThemeProvider"); var _Box = _interopRequireDefault(require("../Box")); var _sx = _interopRequireWildcard(require("../sx")); var _createSlots = _interopRequireDefault(require("../utils/create-slots")); var _List = require("./List"); var _ActionListContainerContext = require("./ActionListContainerContext"); var _Selection = require("./Selection"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const getVariantStyles = (variant, disabled) => { if (disabled) { return { color: 'primer.fg.disabled', iconColor: 'primer.fg.disabled', annotationColor: 'primer.fg.disabled' }; } switch (variant) { case 'danger': return { color: 'danger.fg', iconColor: 'danger.fg', annotationColor: 'fg.muted', hoverColor: 'actionListItem.danger.hoverText' }; default: return { color: 'fg.default', iconColor: 'fg.muted', annotationColor: 'fg.muted', hoverColor: 'fg.default' }; } }; exports.getVariantStyles = getVariantStyles; const { Slots, Slot } = (0, _createSlots.default)(['LeadingVisual', 'InlineDescription', 'BlockDescription', 'TrailingVisual']); exports.Slot = Slot; const LiBox = _styledComponents.default.li.withConfig({ displayName: "Item__LiBox", componentId: "sc-c3scat-0" })(_sx.default); const TEXT_ROW_HEIGHT = '20px'; // custom value off the scale exports.TEXT_ROW_HEIGHT = TEXT_ROW_HEIGHT; const Item = /*#__PURE__*/_react.default.forwardRef(({ variant = 'default', disabled = false, selected = undefined, onSelect, sx: sxProp = {}, id, role, _PrivateItemWrapper, ...props }, forwardedRef) => { const { variant: listVariant, showDividers } = _react.default.useContext(_List.ListContext); const { itemRole, afterSelect } = _react.default.useContext(_ActionListContainerContext.ActionListContainerContext); const { theme } = (0, _ThemeProvider.useTheme)(); const styles = { display: 'flex', paddingX: 2, fontSize: 1, paddingY: '6px', // custom value off the scale lineHeight: TEXT_ROW_HEIGHT, minHeight: 5, marginX: listVariant === 'inset' ? 2 : 0, borderRadius: listVariant === 'inset' ? 2 : 0, transition: 'background 33.333ms linear', color: getVariantStyles(variant, disabled).color, cursor: 'pointer', '&[aria-disabled]': { cursor: 'not-allowed' }, '@media (hover: hover) and (pointer: fine)': { ':hover:not([aria-disabled])': { backgroundColor: `actionListItem.${variant}.hoverBg`, color: getVariantStyles(variant, disabled).hoverColor }, ':focus:not([data-focus-visible-added])': { backgroundColor: `actionListItem.${variant}.selectedBg`, color: getVariantStyles(variant, disabled).hoverColor, outline: 'none' }, '&[data-focus-visible-added]': { // we don't use :focus-visible because not all browsers (safari) have it yet outline: 'none', border: `2 solid`, boxShadow: `0 0 0 2px ${theme === null || theme === void 0 ? void 0 : theme.colors.accent.emphasis}` }, ':active:not([aria-disabled])': { backgroundColor: `actionListItem.${variant}.activeBg`, color: getVariantStyles(variant, disabled).hoverColor } }, /** Divider styles */ '[data-component="ActionList.Item--DividerContainer"]': { position: 'relative' }, '[data-component="ActionList.Item--DividerContainer"]::before': { content: '" "', display: 'block', position: 'absolute', width: '100%', top: '-7px', border: '0 solid', borderTopWidth: showDividers ? `1px` : '0', borderColor: 'var(--divider-color, transparent)' }, // show between 2 items ':not(:first-of-type)': { '--divider-color': theme === null || theme === void 0 ? void 0 : theme.colors.actionListItem.inlineDivider }, // hide divider after dividers & group header, with higher importance! '[data-component="ActionList.Divider"] + &': { '--divider-color': 'transparent !important' }, // hide border on current and previous item '&:hover:not([aria-disabled]), &:focus:not([aria-disabled]), &[data-focus-visible-added]:not([aria-disabled])': { '--divider-color': 'transparent' }, '&:hover:not([aria-disabled]) + &, &:focus:not([aria-disabled]) + &, &[data-focus-visible-added] + li': { '--divider-color': 'transparent' } }; const clickHandler = _react.default.useCallback(event => { if (disabled) return; if (!event.defaultPrevented) { if (typeof onSelect === 'function') onSelect(event); // if this Item is inside a Menu, close the Menu if (typeof afterSelect === 'function') afterSelect(); } }, [onSelect, disabled, afterSelect]); const keyPressHandler = _react.default.useCallback(event => { if (disabled) return; if (!event.defaultPrevented && [' ', 'Enter'].includes(event.key)) { if (typeof onSelect === 'function') onSelect(event); // if this Item is inside a Menu, close the Menu if (typeof afterSelect === 'function') afterSelect(); } }, [onSelect, disabled, afterSelect]); // use props.id if provided, otherwise generate one. const labelId = (0, _ssr.useSSRSafeId)(id); const inlineDescriptionId = (0, _ssr.useSSRSafeId)(id && `${id}--inline-description`); const blockDescriptionId = (0, _ssr.useSSRSafeId)(id && `${id}--block-description`); const ItemWrapper = _PrivateItemWrapper || _react.default.Fragment; return /*#__PURE__*/_react.default.createElement(Slots, { context: { variant, disabled, inlineDescriptionId, blockDescriptionId } }, slots => /*#__PURE__*/_react.default.createElement(LiBox, _extends({ ref: forwardedRef, sx: (0, _sx.merge)(styles, sxProp), onClick: clickHandler, onKeyPress: keyPressHandler, "aria-selected": selected, "aria-disabled": disabled ? true : undefined, tabIndex: disabled || _PrivateItemWrapper ? undefined : 0, "aria-labelledby": `${labelId} ${slots.InlineDescription ? inlineDescriptionId : ''}`, "aria-describedby": slots.BlockDescription ? blockDescriptionId : undefined, role: role || itemRole }, props), /*#__PURE__*/_react.default.createElement(ItemWrapper, null, /*#__PURE__*/_react.default.createElement(_Selection.Selection, { selected: selected }), slots.LeadingVisual, /*#__PURE__*/_react.default.createElement(_Box.default, { "data-component": "ActionList.Item--DividerContainer", sx: { display: 'flex', flexDirection: 'column', flexGrow: 1, minWidth: 0 } }, /*#__PURE__*/_react.default.createElement(ConditionalBox, { if: Boolean(slots.TrailingVisual), sx: { display: 'flex', flexGrow: 1 } }, /*#__PURE__*/_react.default.createElement(ConditionalBox, { if: Boolean(slots.InlineDescription), sx: { display: 'flex', flexGrow: 1, alignItems: 'baseline', minWidth: 0 } }, /*#__PURE__*/_react.default.createElement(_Box.default, { as: "span", id: labelId, sx: { flexGrow: slots.InlineDescription ? 0 : 1 } }, props.children), slots.InlineDescription), slots.TrailingVisual), slots.BlockDescription)))); }); exports.Item = Item; Item.displayName = 'ActionList.Item'; const ConditionalBox = props => { const { if: condition, ...rest } = props; if (condition) return /*#__PURE__*/_react.default.createElement(_Box.default, rest, props.children);else return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children); };