Skip to content

Commit 88f3913

Browse files
committed
feat(SegmentedToggle): add support for count display in toggle items
Closes UXD-1701
1 parent e69e952 commit 88f3913

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed
Loading

src/components/forms/SegmentedToggle/SegmentedToggle.stories.tsx

+28
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,34 @@ export const Default: Story = {
9191
args: { children: children({ group: 'default' }), group: 'default' },
9292
};
9393

94+
export const WithCount: Story = {
95+
args: {
96+
children: (
97+
<>
98+
<SegmentedToggleItem
99+
itemId="counter-input1"
100+
label="One"
101+
value="1"
102+
defaultChecked
103+
/>
104+
<SegmentedToggleItem
105+
count={10}
106+
itemId="counter-input2"
107+
label="Two"
108+
value="2"
109+
/>
110+
<SegmentedToggleItem
111+
count={20}
112+
itemId="counter-input3"
113+
label="Three"
114+
value="3"
115+
/>
116+
</>
117+
),
118+
group: 'counter',
119+
},
120+
};
121+
94122
export const Disabled: Story = {
95123
args: {
96124
children: children({ group: 'disabled' }),

src/components/forms/SegmentedToggle/SegmentedToggle.tsx

+18-5
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,14 @@ import ElementLabel from '../../ElementLabel/ElementLabel';
1515

1616
export interface SegmentedToggleItemProps
1717
extends Omit<ComponentPropsWithRef<'input'>, 'size'> {
18+
/** Text label for the item */
1819
label: string;
20+
/** Value for the item */
1921
value: string | number;
22+
/** Unique identifier for the item */
2023
itemId: string;
24+
/** Optional count number displayed next to the label */
25+
count?: number;
2126
}
2227

2328
export interface SegmentedToggleProps {
@@ -120,10 +125,11 @@ const SegmentedToggleLabel = styled.label`
120125
padding: var(--sscds-space-1x) var(--sscds-space-2x);
121126
text-align: center;
122127
transition: var(--sscds-action-transition);
128+
cursor: pointer;
123129
`;
124130

125131
const Radio = styled.input`
126-
/* transform: translateX(-100%); */
132+
transform: translateX(-100%);
127133
position: absolute;
128134
pointer-events: none;
129135
opacity: 0;
@@ -164,7 +170,7 @@ const Radio = styled.input`
164170
export const SegmentedToggleItem = forwardRef<
165171
HTMLInputElement,
166172
SegmentedToggleItemProps
167-
>(({ label, value, itemId, ...props }, ref) => {
173+
>(({ label, value, itemId, count, ...props }, ref) => {
168174
const { name, disabled, onChange } = useContext();
169175

170176
return (
@@ -180,9 +186,16 @@ export const SegmentedToggleItem = forwardRef<
180186
onChange={onChange}
181187
/>
182188
<SegmentedToggleLabel htmlFor={itemId}>
183-
<ElementLabel color={disabled ? 'disabled' : 'default'}>
184-
{label}
185-
</ElementLabel>
189+
<Inline gap="1x">
190+
<ElementLabel color={disabled ? 'disabled' : 'default'}>
191+
{label}
192+
</ElementLabel>
193+
{count && (
194+
<ElementLabel color={disabled ? 'disabled' : 'default'} isStrong>
195+
{count}
196+
</ElementLabel>
197+
)}
198+
</Inline>
186199
</SegmentedToggleLabel>
187200
</SegmentedToggleItemRoot>
188201
);

0 commit comments

Comments
 (0)