diff --git a/.changeset/cyan-needles-melt.md b/.changeset/cyan-needles-melt.md new file mode 100644 index 00000000000..50ba08cfec0 --- /dev/null +++ b/.changeset/cyan-needles-melt.md @@ -0,0 +1,7 @@ +--- +"@primer/react": major +--- + +- Changes `leadingIcon` and `trailingIcon` to `leadingVisual` and `trailingVisual` +- Removes `Button.Counter` as a child component, replacing it with a `count` prop. This change allows us to use the `trailingVisual` slot for counters. +- Removes the `outline` button variant as we wish to only support `invisible` buttons. diff --git a/docs/content/ActionMenu.mdx b/docs/content/ActionMenu.mdx index 937a06a07d2..78654d5ac89 100644 --- a/docs/content/ActionMenu.mdx +++ b/docs/content/ActionMenu.mdx @@ -182,7 +182,7 @@ const fieldTypes = [ {icon: NumberIcon, name: 'Number'}, {icon: CalendarIcon, name: 'Date'}, {icon: SingleSelectIcon, name: 'Single select'}, - {icon: IterationsIcon, name: 'Iteration'} + {icon: IterationsIcon, name: 'Iteration'}, ] const Example = () => { @@ -191,7 +191,7 @@ const Example = () => { return ( - + {selectedType.name} @@ -275,7 +275,7 @@ render( - + , ) ``` @@ -368,7 +368,7 @@ render( stableApi: true, addressedApiFeedback: false, hasDesignGuidelines: true, - hasFigmaComponent: true + hasFigmaComponent: true, }} /> diff --git a/docs/content/Button.mdx b/docs/content/Button.mdx index 75de1bd279f..d8284b7623d 100644 --- a/docs/content/Button.mdx +++ b/docs/content/Button.mdx @@ -29,14 +29,6 @@ The `danger` variant of `Button` is used to warn users about potentially destruc ``` -### Outline button - -The `outline` variant of `Button` is typically used as a secondary button - -```jsx live - -``` - ### Invisible button The `invisible` variant of `Button` indicates that the action is a low priority one. @@ -66,11 +58,11 @@ It is recommended to use an octicon here. ```jsx live <> - - + - @@ -96,17 +88,12 @@ A separate component called `IconButton` is used if the action shows only an ico ``` -### Counter component +### Button with counter -A common use case for primer is a button with a counter component which shows the child count value. -We provide `Button.Counter` as a composite component which requires you to provide a number as child. -The counter will match the `variant` styles of the parent button. +To show a count value as a trailing visual inside `Button`, pass a value to the `count` prop. The counter will match the `variant` styles of the parent button. ```jsx live - + ``` ### Block button @@ -142,12 +129,12 @@ Native ` export const Invisible = () => -export const Outline = () => +export const LeadingVisual = () => -export const LeadingVisual = () => - -export const TrailingVisual = () => +export const TrailingVisual = () => export const TrailingCounter = () => { const [count, setCount] = useState(0) return ( - ) } @@ -47,23 +44,20 @@ export const InvisibleVariants = () => { return (
- - - -
) diff --git a/src/Button/Button.stories.tsx b/src/Button/Button.stories.tsx index ca84096b269..1975469b573 100644 --- a/src/Button/Button.stories.tsx +++ b/src/Button/Button.stories.tsx @@ -35,8 +35,8 @@ export default { type: 'boolean', }, }, - leadingIcon: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), - trailingIcon: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), + leadingVisual: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), + trailingVisual: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), trailingAction: OcticonArgType([TriangleDownIcon]), trailingVisualCount: { control: { @@ -50,8 +50,8 @@ export default { disabled: false, variant: 'default', alignContent: 'center', - trailingIcon: null, - leadingIcon: null, + trailingVisual: null, + leadingVisual: null, trailingAction: null, trailingVisualCount: undefined, }, diff --git a/src/Button/ButtonBase.tsx b/src/Button/ButtonBase.tsx index f31fffa79e4..84243010490 100644 --- a/src/Button/ButtonBase.tsx +++ b/src/Button/ButtonBase.tsx @@ -6,15 +6,17 @@ import {useTheme} from '../ThemeProvider' import {ButtonProps, StyledButton} from './types' import {getVariantStyles, getButtonStyles, getAlignContentSize} from './styles' import {useRefObjectAsForwardedRef} from '../hooks/useRefObjectAsForwardedRef' +import CounterLabel from '../CounterLabel' declare let __DEV__: boolean const defaultSxProp = {} const ButtonBase = forwardRef( ({children, as: Component = 'button', sx: sxProp = defaultSxProp, ...props}, forwardedRef): JSX.Element => { const { - leadingIcon: LeadingIcon, - trailingIcon: TrailingIcon, + leadingVisual: LeadingVisual, + trailingVisual: TrailingVisual, trailingAction: TrailingAction, + trailingVisualCount: trailingVisualCount, variant = 'default', size = 'medium', alignContent = 'center', @@ -61,20 +63,31 @@ const ButtonBase = forwardRef( ref={innerRef} data-component={block ? 'block' : null} data-size={size === 'small' || size === 'large' ? size : undefined} - data-no-visuals={!LeadingIcon && !TrailingIcon && !TrailingAction ? true : undefined} + data-no-visuals={ + !LeadingVisual && !TrailingVisual && !TrailingAction && !trailingVisualCount ? true : undefined + } > - {LeadingIcon && ( + {LeadingVisual && ( - + )} {children && {children}} - {TrailingIcon && ( + {TrailingVisual && ( - + )} + {trailingVisualCount !== undefined ? ( + + {trailingVisualCount} + + ) : TrailingVisual ? ( + + + + ) : null} {TrailingAction && ( diff --git a/src/Button/ButtonCounter.tsx b/src/Button/ButtonCounter.tsx deleted file mode 100644 index bc386530d08..00000000000 --- a/src/Button/ButtonCounter.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import {SxProp} from '../sx' -import CounterLabel from '../CounterLabel' - -export type CounterProps = { - children: number -} & SxProp - -const Counter = ({children, sx: sxProp = {}, ...props}: CounterProps) => { - return ( - - {children} - - ) -} - -export {Counter} diff --git a/src/Button/LinkButton.features.stories.tsx b/src/Button/LinkButton.features.stories.tsx index a6ef0c35987..e01f73112a4 100644 --- a/src/Button/LinkButton.features.stories.tsx +++ b/src/Button/LinkButton.features.stories.tsx @@ -30,20 +30,14 @@ export const Invisible = () => ( ) -export const Outline = () => ( - -) - export const LeadingVisual = () => ( - ) export const TrailingVisual = () => ( - ) diff --git a/src/Button/LinkButton.stories.tsx b/src/Button/LinkButton.stories.tsx index 5ca0dcab065..ee611880bf7 100644 --- a/src/Button/LinkButton.stories.tsx +++ b/src/Button/LinkButton.stories.tsx @@ -30,8 +30,8 @@ export default { type: 'boolean', }, }, - leadingIcon: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), - trailingIcon: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), + leadingVisual: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), + trailingVisual: OcticonArgType([EyeClosedIcon, EyeIcon, SearchIcon, XIcon, HeartIcon]), trailingAction: OcticonArgType([ChevronRightIcon]), trailingVisualCount: { control: { @@ -45,8 +45,8 @@ export default { size: 'medium', variant: 'default', alignContent: 'center', - trailingIcon: null, - leadingIcon: null, + trailingVisual: null, + leadingVisual: null, href: '/', }, } as Meta diff --git a/src/Button/index.ts b/src/Button/index.ts index d0519b22e70..85c1d2bb2bf 100644 --- a/src/Button/index.ts +++ b/src/Button/index.ts @@ -1,10 +1,7 @@ import {ButtonComponent} from './Button' -import {Counter} from './ButtonCounter' import {IconButton} from './IconButton' import {LinkButton} from './LinkButton' export type {ButtonProps, IconButtonProps} from './types' export {IconButton, LinkButton} -export const Button = Object.assign(ButtonComponent, { - Counter, -}) +export const Button = Object.assign(ButtonComponent) diff --git a/src/Button/styles.ts b/src/Button/styles.ts index 55f82740a3c..0d43a3a3683 100644 --- a/src/Button/styles.ts +++ b/src/Button/styles.ts @@ -127,52 +127,6 @@ export const getVariantStyles = (variant: VariantType = 'default', theme?: Theme '&[data-no-visuals]': { color: 'accent.fg', }, - '&:has([data-component="ButtonCounter"])': { - color: 'btn.text', - }, - }, - outline: { - color: 'btn.outline.text', - boxShadow: `${theme?.shadows.btn.shadow}`, - borderColor: 'btn.border', - backgroundColor: 'btn.bg', - - '&:hover:not([disabled])': { - color: 'btn.outline.hoverText', - backgroundColor: 'btn.outline.hoverBg', - borderColor: 'btn.outline.hoverBorder', - boxShadow: `${theme?.shadows.btn.outline.hoverShadow}`, - '[data-component=ButtonCounter]': { - backgroundColor: 'btn.outline.hoverCounterBg', - color: 'inherit', - }, - }, - '&:active:not([disabled])': { - color: 'btn.outline.selectedText', - backgroundColor: 'btn.outline.selectedBg', - boxShadow: `${theme?.shadows.btn.outline.selectedShadow}`, - borderColor: 'btn.outline.selectedBorder', - }, - - '&:disabled': { - color: 'btn.outline.disabledText', - backgroundColor: 'btn.outline.disabledBg', - borderColor: 'btn.border', - '[data-component=ButtonCounter]': { - backgroundColor: 'btn.outline.disabledCounterBg', - color: 'inherit', - }, - }, - '[data-component=ButtonCounter]': { - backgroundColor: 'btn.outline.counterBg', - color: 'btn.outline.text', - }, - '&[aria-expanded=true]': { - color: 'btn.outline.selectedText', - backgroundColor: 'btn.outline.selectedBg', - boxShadow: `${theme?.shadows.btn.outline.selectedShadow}`, - borderColor: 'btn.outline.selectedBorder', - }, }, } return style[variant] diff --git a/src/Button/types.ts b/src/Button/types.ts index f746de8b775..61406888446 100644 --- a/src/Button/types.ts +++ b/src/Button/types.ts @@ -9,7 +9,7 @@ export const StyledButton = styled.button` ${sx}; ` -export type VariantType = 'default' | 'primary' | 'invisible' | 'danger' | 'outline' +export type VariantType = 'default' | 'primary' | 'invisible' | 'danger' export type Size = 'small' | 'medium' | 'large' @@ -49,11 +49,11 @@ export type ButtonProps = { /** * The leading icon comes before button content */ - leadingIcon?: React.FunctionComponent> + leadingVisual?: React.FunctionComponent> /** * The trailing icon comes after button content */ - trailingIcon?: React.FunctionComponent> + trailingVisual?: React.FunctionComponent> /** * Trailing action appears to the right of the trailing visual and is always locked to the end */ diff --git a/src/PageHeader/PageHeader.stories.tsx b/src/PageHeader/PageHeader.stories.tsx index c781473185d..219321ecc9b 100644 --- a/src/PageHeader/PageHeader.stories.tsx +++ b/src/PageHeader/PageHeader.stories.tsx @@ -203,7 +203,7 @@ const Template: Story = args => (