diff --git a/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx b/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx index 2294069f71..69e48d5789 100644 --- a/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx +++ b/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx @@ -20,6 +20,8 @@ import { ToggleButton } from '../ToggleButton/ToggleButton'; import { Flex } from '../Flex'; import { Text } from '../Text'; import { useState } from 'react'; +import type { Selection } from 'react-aria-components'; +import { useBreakpoint } from '../../hooks/useBreakpoint'; import { RiCloudLine, RiStarLine, @@ -124,16 +126,42 @@ export const Orientation = meta.story({ ), }); +export const ResponsiveOrientation = meta.story({ + render: () => { + const { breakpoint } = useBreakpoint(); // For testing purposes only (display breakpoint) + + return ( + + + Breakpoint: {breakpoint} (orientation: vertical on initial/sm, + horizontal from md+) + + + Morning + Afternoon + Evening + + + ); + }, +}); + export const ControlledGroup = meta.story({ render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set(['beta'])); + const [selectedKeys, setSelectedKeys] = useState( + new Set(['beta']), + ); return ( setSelectedKeys(new Set(keys))} + onSelectionChange={setSelectedKeys} > Alpha Beta diff --git a/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.tsx b/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.tsx index 26b4eb51c8..cec9bd90db 100644 --- a/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.tsx +++ b/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.tsx @@ -18,27 +18,30 @@ import clsx from 'clsx'; import { forwardRef, Ref } from 'react'; import { ToggleButtonGroup as AriaToggleButtonGroup } from 'react-aria-components'; import type { ToggleButtonGroupProps } from './types'; -import { useStyles } from '../../hooks/useStyles'; +import { resolveResponsiveValue, useStyles } from '../../hooks/useStyles'; import { ToggleButtonGroupDefinition } from './definition'; import styles from './ToggleButtonGroup.module.css'; +import { useBreakpoint } from '../../hooks/useBreakpoint'; /** @public */ export const ToggleButtonGroup = forwardRef( (props: ToggleButtonGroupProps, ref: Ref) => { + const { breakpoint } = useBreakpoint(); const { classNames, dataAttributes, cleanedProps } = useStyles( ToggleButtonGroupDefinition, { - orientation: 'horizontal', + orientation: 'horizontal' as const, ...props, }, ); - const { className, children, ...rest } = cleanedProps; + const { className, children, orientation, ...rest } = cleanedProps; return ( diff --git a/packages/ui/src/components/ToggleButtonGroup/types.ts b/packages/ui/src/components/ToggleButtonGroup/types.ts index d0de983f66..16ca11d482 100644 --- a/packages/ui/src/components/ToggleButtonGroup/types.ts +++ b/packages/ui/src/components/ToggleButtonGroup/types.ts @@ -14,14 +14,13 @@ * limitations under the License. */ -import type { Breakpoint } from '../..'; import type { ToggleButtonGroupProps as AriaToggleButtonGroupProps } from 'react-aria-components'; +import { Responsive } from '../../types'; /** @public */ export interface ToggleButtonGroupProps - extends AriaToggleButtonGroupProps { - orientation?: - | 'horizontal' - | 'vertical' - | Partial>; + extends Omit { + orientation?: Responsive< + NonNullable + >; } diff --git a/packages/ui/src/hooks/useStyles.ts b/packages/ui/src/hooks/useStyles.ts index cc05f5f362..384b25d913 100644 --- a/packages/ui/src/hooks/useStyles.ts +++ b/packages/ui/src/hooks/useStyles.ts @@ -23,10 +23,13 @@ import { utilityClassMap } from '../utils/utilityClassMap'; * @param breakpoint - The current breakpoint * @returns The resolved value for the current breakpoint */ -function resolveResponsiveValue( - value: string | Record, +export function resolveResponsiveValue( + value: T | Partial> | undefined, breakpoint: string, -): string | undefined { +): T | undefined { + if (value === undefined) { + return undefined; + } if (typeof value === 'string') { return value; }