UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

185 lines (179 loc) • 6.89 kB
'use strict'; var React = require('react'); var octiconsReact = require('@primer/octicons-react'); var Box = require('../Box/Box.js'); var Spinner = require('../Spinner/Spinner.js'); require('@styled-system/css'); var merge = require('deepmerge'); var shared = require('./shared.js'); var Tooltip = require('../TooltipV2/Tooltip.js'); var clsx = require('clsx'); require('../FeatureFlags/FeatureFlags.js'); var useFeatureFlag = require('../FeatureFlags/useFeatureFlag.js'); require('../FeatureFlags/DefaultFeatureFlags.js'); var ActionList_module = require('./ActionList.module.css.js'); var defaultSxProp = require('../utils/defaultSxProp.js'); var featureflag = require('./featureflag.js'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefault(React); var merge__default = /*#__PURE__*/_interopDefault(merge); function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const VisualContainer = ({ sx = defaultSxProp.defaultSxProp, className, ...props }) => { if (sx !== defaultSxProp.defaultSxProp) { return /*#__PURE__*/React__default.default.createElement(Box, _extends({ as: "span", className: clsx.clsx(className, ActionList_module.VisualWrap), sx: sx }, props)); } return /*#__PURE__*/React__default.default.createElement("span", _extends({ className: clsx.clsx(className, ActionList_module.VisualWrap) }, props)); }; VisualContainer.displayName = "VisualContainer"; // remove when primer_react_css_modules_X is shipped const LeadingVisualContainer = ({ sx = defaultSxProp.defaultSxProp, ...props }) => { return /*#__PURE__*/React__default.default.createElement(Box, _extends({ as: "span", sx: merge__default.default({ height: '20px', // match height of text row maxWidth: '20px', // square (same as height) display: 'flex', justifyContent: 'center', alignItems: 'center', flexShrink: 0, marginRight: 2, color: 'fg.muted' }, sx) }, props)); }; LeadingVisualContainer.displayName = "LeadingVisualContainer"; const LeadingVisual = ({ sx = defaultSxProp.defaultSxProp, className, ...props }) => { const { variant, disabled, inactive } = React__default.default.useContext(shared.ItemContext); const enabled = useFeatureFlag.useFeatureFlag(featureflag.actionListCssModulesFlag); if (enabled) { return /*#__PURE__*/React__default.default.createElement(VisualContainer, _extends({ className: clsx.clsx(className, ActionList_module.LeadingVisual), sx: sx }, props), props.children); } return /*#__PURE__*/React__default.default.createElement(LeadingVisualContainer, _extends({ className: className, sx: merge__default.default({ color: shared.getVariantStyles(variant, disabled, inactive).iconColor, svg: { fontSize: 0 }, '[data-variant="danger"]:not([aria-disabled]):not([data-inactive]):hover &, [data-variant="danger"]:active &': { color: shared.getVariantStyles(variant, disabled, inactive).hoverColor } }, sx) }, props), props.children); }; LeadingVisual.displayName = "LeadingVisual"; const TrailingVisual = ({ sx = defaultSxProp.defaultSxProp, className, ...props }) => { const { variant, disabled, inactive, trailingVisualId } = React__default.default.useContext(shared.ItemContext); const enabled = useFeatureFlag.useFeatureFlag(featureflag.actionListCssModulesFlag); if (enabled) { if (sx !== defaultSxProp.defaultSxProp) { return /*#__PURE__*/React__default.default.createElement(VisualContainer, _extends({ className: clsx.clsx(className, ActionList_module.TrailingVisual), sx: sx, id: trailingVisualId }, props), props.children); } return /*#__PURE__*/React__default.default.createElement(VisualContainer, _extends({ className: clsx.clsx(className, ActionList_module.TrailingVisual), id: trailingVisualId }, props), props.children); } return /*#__PURE__*/React__default.default.createElement(Box, _extends({ id: trailingVisualId, as: "span", className: className, sx: merge__default.default({ height: '20px', // match height of text row flexShrink: 0, color: shared.getVariantStyles(variant, disabled, inactive).annotationColor, marginLeft: 2, fontWeight: 'initial', display: 'grid', alignContent: 'center', '[data-variant="danger"]:hover &, [data-variant="danger"]:active &': { color: shared.getVariantStyles(variant, disabled, inactive).hoverColor } }, sx) }, props), props.children); }; TrailingVisual.displayName = "TrailingVisual"; // VisualOrIndicator handles the positioning of indicators and determines whether to show a visual or an indicator. // // If we're showing an *inactive* or *loading* indicator and a leading visual has NOT been passed, // replace the trailing visual with the inactive indicator. // // This preserves the left alignment of item text. const VisualOrIndicator = ({ children, labelId, loading, inactiveText, itemHasLeadingVisual, position, className }) => { const VisualComponent = position === 'leading' ? LeadingVisual : TrailingVisual; if (!loading && !inactiveText) return children; if (itemHasLeadingVisual && position === 'trailing' || // has a leading visual, and it's in the trailing position, or !itemHasLeadingVisual && position === 'leading' // it doesn't have a leading visual, and it's in the leading position ) { // => so we don't render the indicator here return children; } return inactiveText ? /*#__PURE__*/React__default.default.createElement("span", { className: ActionList_module.InactiveButtonWrap }, /*#__PURE__*/React__default.default.createElement(Tooltip.Tooltip, { text: inactiveText, type: "label" }, /*#__PURE__*/React__default.default.createElement("button", { type: "button", className: ActionList_module.InactiveButtonReset, "aria-describedby": labelId }, /*#__PURE__*/React__default.default.createElement(VisualComponent, null, /*#__PURE__*/React__default.default.createElement(octiconsReact.AlertIcon, null))))) : /*#__PURE__*/React__default.default.createElement(VisualComponent, { className: className }, /*#__PURE__*/React__default.default.createElement(Spinner, { size: "small" })); }; exports.LeadingVisual = LeadingVisual; exports.LeadingVisualContainer = LeadingVisualContainer; exports.TrailingVisual = TrailingVisual; exports.VisualContainer = VisualContainer; exports.VisualOrIndicator = VisualOrIndicator;