@primer/react
Version:
An implementation of GitHub's Primer Design System using React
77 lines (74 loc) • 3.25 kB
JavaScript
import React from 'react';
import { XIcon } from '@primer/octicons-react';
import styled, { css } from 'styled-components';
import { variant } from 'styled-system';
import { clsx } from 'clsx';
import { get } from '../constants.js';
import sx from '../sx.js';
import { tokenSizes, defaultTokenSize } from './TokenBase.js';
import { toggleStyledComponent } from '../internal/utils/toggleStyledComponent.js';
import '../FeatureFlags/FeatureFlags.js';
import { useFeatureFlag } from '../FeatureFlags/useFeatureFlag.js';
import '../FeatureFlags/DefaultFeatureFlags.js';
import classes from './_RemoveTokenButton.module.css.js';
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 CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_staff';
const variants = variant({
prop: 'size',
variants: {
small: {
height: tokenSizes.small,
width: tokenSizes.small
},
medium: {
height: tokenSizes.medium,
width: tokenSizes.medium
},
large: {
height: tokenSizes.large,
width: tokenSizes.large
},
xlarge: {
height: tokenSizes.xlarge,
width: tokenSizes.xlarge
}
}
});
const getTokenButtonIconSize = size => parseInt(tokenSizes[size || defaultTokenSize], 10) * 0.75;
const StyledTokenButton = toggleStyledComponent(CSS_MODULES_FEATURE_FLAG, 'span', styled.span.withConfig({
displayName: "_RemoveTokenButton__StyledTokenButton",
componentId: "sc-urhpr1-0"
})(["background-color:transparent;font-family:inherit;color:currentColor;cursor:pointer;display:inline-flex;justify-content:center;align-items:center;user-select:none;appearance:none;text-decoration:none;padding:0;transform:", ";align-self:baseline;border:0;border-radius:999px;", " &:hover,&:focus{background-color:", ";}&:active{background-color:", ";}", " ", ""], props => `translate(${props.borderOffset}px, -${props.borderOffset}px)`, props => {
switch (props.size) {
case 'large':
case 'xlarge':
return css(["margin-left:", ";"], get('space.2'));
default:
return css(["margin-left:", ";"], get('space.1'));
}
}, get('colors.neutral.muted'), get('colors.neutral.subtle'), variants, sx));
const RemoveTokenButton = ({
'aria-label': ariaLabel,
isParentInteractive,
size = defaultTokenSize,
className,
...rest
}) => {
delete rest.children;
const enabled = useFeatureFlag(CSS_MODULES_FEATURE_FLAG);
return /*#__PURE__*/React.createElement(StyledTokenButton, _extends({
as: isParentInteractive ? 'span' : 'button',
tabIndex: isParentInteractive ? -1 : undefined,
"aria-label": !isParentInteractive ? 'Remove token' : ariaLabel,
size: size,
"data-size": size,
className: clsx(enabled && classes.TokenButton, className),
style: enabled ? {
transform: `translate(${rest.borderOffset}px, -${rest.borderOffset}px)`
} : {}
}, rest), /*#__PURE__*/React.createElement(XIcon, {
size: getTokenButtonIconSize(size)
}));
};
RemoveTokenButton.displayName = "RemoveTokenButton";
export { RemoveTokenButton as default };