@primer/components
Version:
Primer react components
288 lines (251 loc) • 12.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Item = exports.TextContainer = void 0;
var _octiconsReact = require("@primer/octicons-react");
var _react = _interopRequireWildcard(require("react"));
var _constants = require("../constants");
var _sx = _interopRequireDefault(require("../sx"));
var _Truncate = _interopRequireDefault(require("../Truncate"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _Header = require("./Header");
var _Divider = require("./Divider");
var _ThemeProvider = require("../ThemeProvider");
var _focusZone = require("../behaviors/focusZone");
var _ssr = require("@react-aria/ssr");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 _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); }
/**
* These colors are not yet in our default theme. Need to remove this once they are added.
*/
const customItemThemes = {
default: {
hover: {
light: 'rgba(46, 77, 108, 0.06)',
dark: 'rgba(201, 206, 212, 0.12)',
dark_dimmed: 'rgba(201, 206, 212, 0.12)'
},
focus: {
light: 'rgba(54, 77, 100, 0.16)',
dark: 'rgba(201, 206, 212, 0.24)',
dark_dimmed: 'rgba(201, 206, 212, 0.24)'
}
},
danger: {
hover: {
light: 'rgba(234, 74, 90, 0.08)',
dark: 'rgba(248, 81, 73, 0.16)',
dark_dimmed: 'rgba(248, 81, 73, 0.16)'
},
focus: {
light: 'rgba(234, 74, 90, 0.14)',
dark: 'rgba(248, 81, 73, 0.24)',
dark_dimmed: 'rgba(248, 81, 73, 0.24)'
}
}
};
/**
* Contract for props passed to the `Item` component.
*/
const getItemVariant = (variant = 'default', disabled) => {
if (disabled) {
return {
color: (0, _constants.get)('colors.fg.muted'),
iconColor: (0, _constants.get)('colors.fg.muted'),
annotationColor: (0, _constants.get)('colors.fg.muted'),
hoverCursor: 'default'
};
}
switch (variant) {
case 'danger':
return {
color: (0, _constants.get)('colors.danger.fg'),
iconColor: (0, _constants.get)('colors.danger.fg'),
annotationColor: (0, _constants.get)('colors.fg.muted'),
hoverCursor: 'pointer'
};
default:
return {
color: (0, _constants.get)('colors.fg.default'),
iconColor: (0, _constants.get)('colors.fg.muted'),
annotationColor: (0, _constants.get)('colors.fg.muted'),
hoverCursor: 'pointer'
};
}
};
const DividedContent = _styledComponents.default.div.withConfig({
displayName: "Item__DividedContent",
componentId: "jqpvy8-0"
})(["display:flex;min-width:0;position:relative;flex-grow:1;"]);
const MainContent = _styledComponents.default.div.withConfig({
displayName: "Item__MainContent",
componentId: "jqpvy8-1"
})(["align-items:baseline;display:flex;min-width:0;flex-direction:var(--main-content-flex-direction);flex-grow:1;"]);
const StyledItem = _styledComponents.default.div.withConfig({
displayName: "Item__StyledItem",
componentId: "jqpvy8-2"
})(["padding:6px ", ";display:flex;border-radius:", ";color:", ";transition:background 33.333ms linear;text-decoration:none;@media (hover:hover) and (pointer:fine){:hover{background:var(--item-hover-bg-override,", ");cursor:", ";}}:not(:first-of-type):not(", " + &):not(", " + &){margin-top:", ";", "::before{content:' ';display:block;position:absolute;width:100%;top:-7px;border:0 solid ", ";border-top-width:", ";}}&:hover ", "::before,:hover + * ", "::before{border-color:var(--item-hover-divider-border-color-override,transparent) !important;}&:focus ", "::before,:focus + * ", "::before,&[", "] ", "::before,[", "] + & ", "::before{border-color:transparent !important;}&[", "='", "']{background:", ";}&[", "='", "']{background:", ";}&:focus{background:", ";outline:none;}&:active{background:", ";}", ""], (0, _constants.get)('space.2'), (0, _constants.get)('radii.2'), ({
variant,
item
}) => getItemVariant(variant, item === null || item === void 0 ? void 0 : item.disabled).color, ({
hoverBackground
}) => hoverBackground, ({
variant,
item
}) => getItemVariant(variant, item === null || item === void 0 ? void 0 : item.disabled).hoverCursor, _Divider.StyledDivider, _Header.StyledHeader, ({
showDivider
}) => showDivider ? `1px` : '0', DividedContent, (0, _constants.get)('colors.border.muted'), ({
showDivider
}) => showDivider ? `1px` : '0', DividedContent, DividedContent, DividedContent, DividedContent, _focusZone.isActiveDescendantAttribute, DividedContent, _focusZone.isActiveDescendantAttribute, DividedContent, _focusZone.isActiveDescendantAttribute, _focusZone.activeDescendantActivatedDirectly, ({
focusBackground
}) => focusBackground, _focusZone.isActiveDescendantAttribute, _focusZone.activeDescendantActivatedIndirectly, ({
hoverBackground
}) => hoverBackground, ({
focusBackground
}) => focusBackground, ({
focusBackground
}) => focusBackground, _sx.default);
const TextContainer = _styledComponents.default.span.withConfig({
displayName: "Item__TextContainer",
componentId: "jqpvy8-3"
})([""]);
exports.TextContainer = TextContainer;
const BaseVisualContainer = _styledComponents.default.div.withConfig({
displayName: "Item__BaseVisualContainer",
componentId: "jqpvy8-4"
})(["height:20px;width:", ";margin-right:", ";"], (0, _constants.get)('space.3'), (0, _constants.get)('space.2'));
const ColoredVisualContainer = (0, _styledComponents.default)(BaseVisualContainer).withConfig({
displayName: "Item__ColoredVisualContainer",
componentId: "jqpvy8-5"
})(["svg{fill:", ";font-size:", ";}"], ({
variant,
disabled
}) => getItemVariant(variant, disabled).iconColor, (0, _constants.get)('fontSizes.0'));
const LeadingVisualContainer = (0, _styledComponents.default)(ColoredVisualContainer).withConfig({
displayName: "Item__LeadingVisualContainer",
componentId: "jqpvy8-6"
})(["flex-shrink:0;display:flex;flex-direction:column;justify-content:center;"]);
const TrailingContent = (0, _styledComponents.default)(ColoredVisualContainer).withConfig({
displayName: "Item__TrailingContent",
componentId: "jqpvy8-7"
})(["color:", "};margin-left:", ";margin-right:0;width:auto;div:nth-child(2){margin-left:", ";}"], ({
variant,
disabled
}) => getItemVariant(variant, disabled).annotationColor, (0, _constants.get)('space.2'), (0, _constants.get)('space.2'));
const DescriptionContainer = _styledComponents.default.span.withConfig({
displayName: "Item__DescriptionContainer",
componentId: "jqpvy8-8"
})(["color:", ";font-size:", ";line-height:16px;margin-left:var(--description-container-margin-left);min-width:0;flex-grow:1;flex-basis:var(--description-container-flex-basis);"], (0, _constants.get)('colors.fg.muted'), (0, _constants.get)('fontSizes.0'));
const MultiSelectInput = _styledComponents.default.input.withConfig({
displayName: "Item__MultiSelectInput",
componentId: "jqpvy8-9"
})(["pointer-events:none;"]);
/**
* An actionable or selectable `Item` with an optional icon and description.
*/
const Item = /*#__PURE__*/_react.default.forwardRef((itemProps, ref) => {
const {
as: Component,
text,
description,
descriptionVariant = 'inline',
selected,
selectionVariant,
leadingVisual: LeadingVisual,
trailingIcon: TrailingIcon,
trailingText,
variant = 'default',
showDivider,
disabled,
onAction,
onKeyPress,
children,
onClick,
id,
...props
} = itemProps;
const labelId = (0, _ssr.useSSRSafeId)();
const descriptionId = (0, _ssr.useSSRSafeId)();
const keyPressHandler = (0, _react.useCallback)(event => {
if (disabled) {
return;
}
onKeyPress === null || onKeyPress === void 0 ? void 0 : onKeyPress(event);
const isCheckbox = event.target instanceof HTMLInputElement && event.target.type === 'checkbox';
if (isCheckbox && event.key === ' ') {
// space key on a checkbox will also trigger a click event. Ignore the space key so we don't get double events
return;
}
if (!event.defaultPrevented && [' ', 'Enter'].includes(event.key)) {
onAction === null || onAction === void 0 ? void 0 : onAction(itemProps, event);
}
}, [onAction, disabled, itemProps, onKeyPress]);
const clickHandler = (0, _react.useCallback)(event => {
if (disabled) {
return;
}
onClick === null || onClick === void 0 ? void 0 : onClick(event);
if (!event.defaultPrevented) {
onAction === null || onAction === void 0 ? void 0 : onAction(itemProps, event);
}
}, [onAction, disabled, itemProps, onClick]);
const customItemTheme = customItemThemes[variant];
const hoverBackground = (0, _ThemeProvider.useColorSchemeVar)(customItemTheme.hover, 'inherit');
const focusBackground = (0, _ThemeProvider.useColorSchemeVar)(customItemTheme.focus, 'inherit');
const {
theme
} = (0, _ThemeProvider.useTheme)();
return /*#__PURE__*/_react.default.createElement(StyledItem, _extends({
ref: ref,
as: Component,
tabIndex: disabled ? undefined : -1,
variant: variant,
showDivider: showDivider,
"aria-selected": selected,
"aria-labelledby": text ? labelId : undefined,
"aria-describedby": description ? descriptionId : undefined
}, props, {
"data-id": id,
onKeyPress: keyPressHandler,
onClick: clickHandler,
hoverBackground: disabled ? 'inherit' : hoverBackground,
focusBackground: disabled ? 'inherit' : focusBackground
}), !!selected === selected && /*#__PURE__*/_react.default.createElement(BaseVisualContainer, null, selectionVariant === 'multiple' ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(MultiSelectInput, {
disabled: disabled,
tabIndex: -1,
type: "checkbox",
checked: selected,
"aria-label": text,
readOnly: true,
"aria-readonly": "false"
})) : selected && /*#__PURE__*/_react.default.createElement(_octiconsReact.CheckIcon, {
fill: theme === null || theme === void 0 ? void 0 : theme.colors.text.primary
})), LeadingVisual && /*#__PURE__*/_react.default.createElement(LeadingVisualContainer, {
variant: variant,
disabled: disabled
}, /*#__PURE__*/_react.default.createElement(LeadingVisual, null)), /*#__PURE__*/_react.default.createElement(DividedContent, null, /*#__PURE__*/_react.default.createElement(MainContent, {
style: {
'--main-content-flex-direction': descriptionVariant === 'inline' ? 'row' : 'column'
}
}, children, text ? /*#__PURE__*/_react.default.createElement(TextContainer, {
id: labelId
}, text) : null, description ? /*#__PURE__*/_react.default.createElement(DescriptionContainer, {
id: descriptionId,
style: {
'--description-container-margin-left': descriptionVariant === 'inline' ? (0, _constants.get)('space.2')(theme) : 0,
'--description-container-flex-basis': descriptionVariant === 'inline' ? 0 : 'auto'
}
}, descriptionVariant === 'block' ? description : /*#__PURE__*/_react.default.createElement(_Truncate.default, {
title: description,
inline: true,
maxWidth: "100%"
}, description)) : null), TrailingIcon || trailingText ? /*#__PURE__*/_react.default.createElement(TrailingContent, {
variant: variant,
disabled: disabled
}, trailingText, TrailingIcon && /*#__PURE__*/_react.default.createElement(TrailingIcon, null)) : null));
});
exports.Item = Item;
Item.displayName = 'ActionList.Item';