Skip to content

Commit

Permalink
Allow color to be customized for medium-sized IconButtons (#4989)
Browse files Browse the repository at this point in the history
* Allow color to be specified for medium-sized IconButtons

* Add changeset

* Build

* Fix Button component

* Update snapshots
  • Loading branch information
camertron committed Sep 19, 2024
1 parent b82286d commit dc80aa6
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 38 deletions.
5 changes: 5 additions & 0 deletions .changeset/quick-feet-sip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@primer/react': patch
---

Allow color to be customized for medium-sized IconButtons
4 changes: 2 additions & 2 deletions packages/react/src/Button/Button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {defaultSxProp} from '../utils/defaultSxProp'
import type {BetterSystemStyleObject, CSSCustomProperties} from '../sx'

const ButtonComponent = forwardRef(({children, sx: sxProp = defaultSxProp, ...props}, forwardedRef): JSX.Element => {
const {block, size, leadingVisual, trailingVisual, trailingAction} = props
const {block, size = 'medium', leadingVisual, trailingVisual, trailingAction} = props
let sxStyles = sxProp
const style: CSSCustomProperties = {}

Expand Down Expand Up @@ -70,7 +70,7 @@ export function generateCustomSxProp(
providedSx: BetterSystemStyleObject,
) {
// Possible data attributes: data-size, data-block, data-no-visuals
const size = props.size && props.size !== 'medium' ? `[data-size="${props.size}"]` : '' // medium is a default size therefore it doesn't have a data attribute that used for styling
const size = `[data-size="${props.size}"]`
const block = props.block ? `[data-block="block"]` : ''
const noVisuals = props.leadingVisual || props.trailingVisual || props.trailingAction ? '' : '[data-no-visuals]'

Expand Down
2 changes: 1 addition & 1 deletion packages/react/src/Button/ButtonBase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ const ButtonBase = forwardRef(
data-inactive={inactive ? true : undefined}
data-loading={Boolean(loading)}
data-no-visuals={!LeadingVisual && !TrailingVisual && !TrailingAction ? true : undefined}
data-size={size === 'small' || size === 'large' ? size : undefined}
data-size={size}
data-label-wrap={labelWrap}
aria-describedby={[loadingAnnouncementID, ariaDescribedBy]
.filter(descriptionID => Boolean(descriptionID))
Expand Down
2 changes: 1 addition & 1 deletion packages/react/src/Button/IconButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const IconButton = forwardRef(
): JSX.Element => {
let sxStyles = sxProp
// grap the button props that have associated data attributes in the styles
const {size} = props
const {size = 'medium'} = props

if (sxProp !== null && Object.keys(sxProp).length > 0) {
sxStyles = generateCustomSxProp({size}, sxProp)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ exports[`Button respects block prop 1`] = `
data-block="block"
data-loading="false"
data-no-visuals="true"
data-size="medium"
id="test-button"
type="button"
>
Expand Down Expand Up @@ -617,6 +618,7 @@ exports[`Button respects the alignContent prop 1`] = `
class="c0"
data-loading="false"
data-no-visuals="true"
data-size="medium"
id="test-button"
type="button"
>
Expand Down Expand Up @@ -1570,6 +1572,7 @@ exports[`Button styles danger button appropriately 1`] = `
class="c0"
data-loading="false"
data-no-visuals="true"
data-size="medium"
id="test-button"
type="button"
>
Expand Down Expand Up @@ -1896,6 +1899,7 @@ exports[`Button styles invisible button appropriately 1`] = `
class="c0"
data-loading="false"
data-no-visuals="true"
data-size="medium"
id="test-button"
type="button"
>
Expand Down Expand Up @@ -2211,6 +2215,7 @@ exports[`Button styles primary button appropriately 1`] = `
class="c0"
data-loading="false"
data-no-visuals="true"
data-size="medium"
id="test-button"
type="button"
>
Expand Down
78 changes: 44 additions & 34 deletions packages/react/src/__tests__/__snapshots__/TextInput.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2579,37 +2579,41 @@ exports[`TextInput renders trailingAction text button 1`] = `
}
.c4[data-no-visuals] {
color: var(--fgColor-muted,var(--color-fg-subtle,#6e7781));
color: var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));
}
.c4:has([data-component="ButtonCounter"]) {
color: var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));
}
.c4:disabled[data-no-visuals] {
color: var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));
}
.c4:disabled[data-no-visuals] [data-component=ButtonCounter] {
color: inherit;
}
.c4[data-size="medium"][data-no-visuals] {
padding-top: 2px;
padding-right: 4px;
padding-bottom: 2px;
padding-left: 4px;
position: relative;
background-color: transparent;
color: var(--fgColor-muted,var(--color-fg-subtle,#6e7781));
}
.c4[data-no-visuals]:hover,
.c4[data-no-visuals]:focus {
.c4[data-size="medium"][data-no-visuals]:hover,
.c4[data-size="medium"][data-no-visuals]:focus {
color: var(--fgColor-default,var(--color-fg-default,#1F2328));
}
.c4[data-no-visuals][data-component="IconButton"] {
.c4[data-size="medium"][data-no-visuals][data-component="IconButton"] {
width: var(--inner-action-size);
height: var(--inner-action-size);
}
.c4:has([data-component="ButtonCounter"]) {
color: var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));
}
.c4:disabled[data-no-visuals] {
color: var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));
}
.c4:disabled[data-no-visuals] [data-component=ButtonCounter] {
color: inherit;
}
.c0 {
font-size: 14px;
line-height: 20px;
Expand Down Expand Up @@ -2718,7 +2722,7 @@ exports[`TextInput renders trailingAction text button 1`] = `
}
@media (pointer:coarse) {
.c4[data-no-visuals]:after {
.c4[data-size="medium"][data-no-visuals]:after {
content: "";
position: absolute;
left: 0;
Expand Down Expand Up @@ -2760,6 +2764,7 @@ exports[`TextInput renders trailingAction text button 1`] = `
data-block={null}
data-loading={false}
data-no-visuals={true}
data-size="medium"
onClick={[MockFunction]}
style={
{
Expand Down Expand Up @@ -3073,37 +3078,41 @@ exports[`TextInput renders trailingAction text button with a tooltip 1`] = `
}
.c4[data-no-visuals] {
color: var(--fgColor-muted,var(--color-fg-subtle,#6e7781));
color: var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));
}
.c4:has([data-component="ButtonCounter"]) {
color: var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));
}
.c4:disabled[data-no-visuals] {
color: var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));
}
.c4:disabled[data-no-visuals] [data-component=ButtonCounter] {
color: inherit;
}
.c4[data-size="medium"][data-no-visuals] {
padding-top: 2px;
padding-right: 4px;
padding-bottom: 2px;
padding-left: 4px;
position: relative;
background-color: transparent;
color: var(--fgColor-muted,var(--color-fg-subtle,#6e7781));
}
.c4[data-no-visuals]:hover,
.c4[data-no-visuals]:focus {
.c4[data-size="medium"][data-no-visuals]:hover,
.c4[data-size="medium"][data-no-visuals]:focus {
color: var(--fgColor-default,var(--color-fg-default,#1F2328));
}
.c4[data-no-visuals][data-component="IconButton"] {
.c4[data-size="medium"][data-no-visuals][data-component="IconButton"] {
width: var(--inner-action-size);
height: var(--inner-action-size);
}
.c4:has([data-component="ButtonCounter"]) {
color: var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));
}
.c4:disabled[data-no-visuals] {
color: var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));
}
.c4:disabled[data-no-visuals] [data-component=ButtonCounter] {
color: inherit;
}
.c6 {
display: none;
display: inline-block;
Expand Down Expand Up @@ -3319,7 +3328,7 @@ exports[`TextInput renders trailingAction text button with a tooltip 1`] = `
}
@media (pointer:coarse) {
.c4[data-no-visuals]:after {
.c4[data-size="medium"][data-no-visuals]:after {
content: "";
position: absolute;
left: 0;
Expand Down Expand Up @@ -3367,6 +3376,7 @@ exports[`TextInput renders trailingAction text button with a tooltip 1`] = `
data-block={null}
data-loading={false}
data-no-visuals={true}
data-size="medium"
onBlur={[Function]}
onClick={[MockFunction]}
onFocus={[Function]}
Expand Down

0 comments on commit dc80aa6

Please sign in to comment.