diff --git a/.changeset/unlucky-hotels-shake.md b/.changeset/unlucky-hotels-shake.md new file mode 100644 index 00000000000..7b7ba979e49 --- /dev/null +++ b/.changeset/unlucky-hotels-shake.md @@ -0,0 +1,5 @@ +--- +"@primer/react": minor +--- + +Add count to SegmentedControlButton diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-colorblind-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-colorblind-linux.png new file mode 100644 index 00000000000..e069aa96ffb Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-colorblind-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-dimmed-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-dimmed-linux.png new file mode 100644 index 00000000000..07bf97381f0 Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-dimmed-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-high-contrast-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-high-contrast-linux.png new file mode 100644 index 00000000000..fb1cd2ad950 Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-high-contrast-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-linux.png new file mode 100644 index 00000000000..e069aa96ffb Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-tritanopia-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-tritanopia-linux.png new file mode 100644 index 00000000000..e069aa96ffb Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-dark-tritanopia-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-colorblind-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-colorblind-linux.png new file mode 100644 index 00000000000..8953ef75283 Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-colorblind-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-high-contrast-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-high-contrast-linux.png new file mode 100644 index 00000000000..31ed64d6ee0 Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-high-contrast-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-linux.png new file mode 100644 index 00000000000..8953ef75283 Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-linux.png differ diff --git a/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-tritanopia-linux.png b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-tritanopia-linux.png new file mode 100644 index 00000000000..8953ef75283 Binary files /dev/null and b/.playwright/snapshots/components/SegmentedControl.test.ts-snapshots/SegmentedControl-With-Counter-Labels-light-tritanopia-linux.png differ diff --git a/e2e/components/SegmentedControl.test.ts b/e2e/components/SegmentedControl.test.ts index 8ab6ba8b427..24e09749352 100644 --- a/e2e/components/SegmentedControl.test.ts +++ b/e2e/components/SegmentedControl.test.ts @@ -48,6 +48,10 @@ const stories = [ title: 'With Icons', id: 'components-segmentedcontrol-features--with-icons', }, + { + title: 'With Counter Labels', + id: 'components-segmentedcontrol-features--with-counter-labels', + }, { title: 'SegmentedControlButton Playground', id: 'components-segmentedcontrol-segmentedcontrol-button--playground', diff --git a/packages/react/src/SegmentedControl/SegmentedControl.docs.json b/packages/react/src/SegmentedControl/SegmentedControl.docs.json index 7c80557edee..199ec948b9e 100644 --- a/packages/react/src/SegmentedControl/SegmentedControl.docs.json +++ b/packages/react/src/SegmentedControl/SegmentedControl.docs.json @@ -78,7 +78,7 @@ "type": "'small' | 'medium'", "description": "The size of the buttons", "defaultValue": "" - }, + }, { "name": "ref", "type": "React.RefObject" @@ -105,7 +105,13 @@ "type": "boolean", "defaultValue": "", "description": "Whether the segment is selected. This is used for uncontrolled SegmentedControls to pick one SegmentedControlButton that is selected on the initial render." - }, + }, + { + "name": "count", + "type": "number | string", + "defaultValue": "", + "description": "The number to display in the counter label." + }, { "name": "ref", "type": "React.RefObject" @@ -146,7 +152,7 @@ "type": "boolean", "defaultValue": "", "description": "Whether the segment is selected. This is used for uncontrolled SegmentedControls to pick one SegmentedControlButton that is selected on the initial render." - }, + }, { "name": "ref", "type": "React.RefObject" diff --git a/packages/react/src/SegmentedControl/SegmentedControl.features.stories.tsx b/packages/react/src/SegmentedControl/SegmentedControl.features.stories.tsx index 88851f12ca8..927a96d9a1f 100644 --- a/packages/react/src/SegmentedControl/SegmentedControl.features.stories.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControl.features.stories.tsx @@ -24,6 +24,20 @@ export const WithIcons = () => ( ) +export const WithCounterLabels = () => ( + + + Feature + + + Bug + + + Good first issue + + +) + export const Controlled = () => { const [selectedIndex, setSelectedIndex] = useState(0) const handleChange = (i: number) => { diff --git a/packages/react/src/SegmentedControl/SegmentedControl.module.css b/packages/react/src/SegmentedControl/SegmentedControl.module.css index c0371ea8fdc..2717c72816b 100644 --- a/packages/react/src/SegmentedControl/SegmentedControl.module.css +++ b/packages/react/src/SegmentedControl/SegmentedControl.module.css @@ -65,6 +65,12 @@ /* stylelint-disable-next-line primer/spacing */ margin-right: -1px; } + + .Counter { + margin-inline-start: var(--base-size-8); + display: flex; + align-items: center; + } } .Button { diff --git a/packages/react/src/SegmentedControl/SegmentedControlButton.stories.tsx b/packages/react/src/SegmentedControl/SegmentedControlButton.stories.tsx index 848172f3eb1..5a755b36b55 100644 --- a/packages/react/src/SegmentedControl/SegmentedControlButton.stories.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControlButton.stories.tsx @@ -43,4 +43,7 @@ Playground.argTypes = { defaultSelected: { type: 'boolean', }, + count: { + type: 'number', + }, } diff --git a/packages/react/src/SegmentedControl/SegmentedControlButton.tsx b/packages/react/src/SegmentedControl/SegmentedControlButton.tsx index 3aa74f23312..76198ac823d 100644 --- a/packages/react/src/SegmentedControl/SegmentedControlButton.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControlButton.tsx @@ -5,6 +5,7 @@ import {isElement} from 'react-is' import classes from './SegmentedControl.module.css' import {clsx} from 'clsx' +import CounterLabel from '../CounterLabel' export type SegmentedControlButtonProps = { /** The visible label rendered in the button */ @@ -15,6 +16,8 @@ export type SegmentedControlButtonProps = { defaultSelected?: boolean /** The leading icon comes before item label */ leadingIcon?: React.FunctionComponent> | React.ReactElement + /** Optional counter to display on the right side of the button */ + count?: number | string } & ButtonHTMLAttributes const SegmentedControlButton: React.FC> = ({ @@ -24,6 +27,7 @@ const SegmentedControlButton: React.FC { return ( @@ -36,6 +40,11 @@ const SegmentedControlButton: React.FC {children} + {count !== undefined && ( + + {count} + + )}