Files
web/packages/design-system/lib/components/Stepper/index.tsx
Matilda Landström dd4826dd99 Merged in feat/STAY-140-stepper-accesible (pull request #3432)
feat(STAY-140): make Stepper more accessible

* feat(STAY-140): make Stepper more accessible

* fix(STAY-140): add aria-valuetext


Approved-by: Bianca Widstam
2026-01-15 12:32:09 +00:00

102 lines
2.5 KiB
TypeScript

import { useIntl } from "react-intl"
import { IconButton } from "../IconButton"
import { Tooltip } from "../Tooltip"
import { Typography } from "../Typography"
import styles from "./stepper.module.css"
type StepperProps = {
count: number
label: string
ariaLabelledBy: string
handleOnIncrease: () => void
handleOnDecrease: () => void
disableIncrease: boolean
disableDecrease: boolean
disabledMessage?: string
}
export function Stepper({
count,
label,
ariaLabelledBy,
handleOnIncrease,
handleOnDecrease,
disableIncrease,
disableDecrease,
disabledMessage,
}: StepperProps) {
const intl = useIntl()
return (
<div
role="group"
aria-labelledby={ariaLabelledBy}
className={styles.counterContainer}
>
<IconButton
type="button"
className={styles.counterBtn}
onPress={handleOnDecrease}
variant="Elevated"
isDisabled={disableDecrease}
iconName="remove"
aria-label={intl.formatMessage(
{
id: "designSystem.stepper.ariaLabel.decrease",
defaultMessage: "Decrease {label}",
},
{ label }
)}
aria-valuetext={intl.formatMessage(
{
id: "designSystem.stepper.ariaLabel.currentCount",
defaultMessage: "Current {label} {count}",
},
{ label, count }
)}
/>
<Typography variant="Body/Paragraph/mdRegular">
<span
aria-live="polite"
aria-atomic="true"
className={styles.countDisplay}
>
{count}
</span>
</Typography>
<Tooltip
text={disabledMessage}
isVisible={Boolean(disabledMessage && disableIncrease)}
position="top"
arrow="right"
isTouchable
>
<IconButton
type="button"
className={styles.counterBtn}
onPress={handleOnIncrease}
variant="Elevated"
isDisabled={disableIncrease}
iconName="add"
aria-label={intl.formatMessage(
{
id: "designSystem.stepper.ariaLabel.increase",
defaultMessage: "Increase {label}",
},
{ label }
)}
aria-valuetext={intl.formatMessage(
{
id: "designSystem.stepper.ariaLabel.currentCount",
defaultMessage: "Current {label} {count}",
},
{ label, count }
)}
/>
</Tooltip>
</div>
)
}