diff --git a/packages/canon/src/components/Avatar/Avatar.tsx b/packages/canon/src/components/Avatar/Avatar.tsx index 472bec39fb..4e899170de 100644 --- a/packages/canon/src/components/Avatar/Avatar.tsx +++ b/packages/canon/src/components/Avatar/Avatar.tsx @@ -18,28 +18,36 @@ import { forwardRef, ElementRef } from 'react'; import { Avatar as AvatarPrimitive } from '@base-ui-components/react/avatar'; import clsx from 'clsx'; import { AvatarProps } from './types'; +import { useStyles } from '../../hooks/useStyles'; /** @public */ export const Avatar = forwardRef< ElementRef, AvatarProps ->(({ className, src, name, size = 'medium', ...props }, ref) => ( - - - - {(name || '') - .split(' ') - .map(word => word[0]) - .join('') - .toLocaleUpperCase('en-US') - .slice(0, 2)} - - -)); +>((props, ref) => { + const { className, src, name, size = 'medium', ...rest } = props; + const { classNames } = useStyles('Avatar', { + size, + }); + + return ( + + + + {(name || '') + .split(' ') + .map(word => word[0]) + .join('') + .toLocaleUpperCase('en-US') + .slice(0, 2)} + + + ); +}); Avatar.displayName = AvatarPrimitive.Root.displayName; diff --git a/packages/canon/src/components/Button/Button.tsx b/packages/canon/src/components/Button/Button.tsx index 29593ea922..40879e51ed 100644 --- a/packages/canon/src/components/Button/Button.tsx +++ b/packages/canon/src/components/Button/Button.tsx @@ -18,7 +18,7 @@ import clsx from 'clsx'; import { forwardRef, Ref } from 'react'; import { Button as RAButton } from 'react-aria-components'; import type { ButtonProps } from './types'; -import { useStyles } from '../../definition'; +import { useStyles } from '../../hooks/useStyles'; /** @public */ export const Button = forwardRef( diff --git a/packages/canon/src/components/ButtonIcon/ButtonIcon.tsx b/packages/canon/src/components/ButtonIcon/ButtonIcon.tsx index 43c2f598ac..072ed20963 100644 --- a/packages/canon/src/components/ButtonIcon/ButtonIcon.tsx +++ b/packages/canon/src/components/ButtonIcon/ButtonIcon.tsx @@ -17,8 +17,8 @@ import clsx from 'clsx'; import { forwardRef, Ref } from 'react'; import { Button as RAButton } from 'react-aria-components'; -import { useResponsiveValue } from '../../hooks/useResponsiveValue'; import type { ButtonIconProps } from './types'; +import { useStyles } from '../../hooks/useStyles'; /** @public */ export const ButtonIcon = forwardRef( @@ -32,15 +32,18 @@ export const ButtonIcon = forwardRef( ...rest } = props; - const responsiveSize = useResponsiveValue(size); - const responsiveVariant = useResponsiveValue(variant); + const { classNames, dataAttributes } = useStyles('Button', { + size, + variant, + }); + + const { classNames: classNamesButtonIcon } = useStyles('ButtonIcon'); return ( {icon} diff --git a/packages/canon/src/components/ButtonLink/ButtonLink.tsx b/packages/canon/src/components/ButtonLink/ButtonLink.tsx index cb68401160..153643a530 100644 --- a/packages/canon/src/components/ButtonLink/ButtonLink.tsx +++ b/packages/canon/src/components/ButtonLink/ButtonLink.tsx @@ -17,8 +17,8 @@ import clsx from 'clsx'; import { forwardRef, Ref } from 'react'; import { Link as RALink } from 'react-aria-components'; -import { useResponsiveValue } from '../../hooks/useResponsiveValue'; import type { ButtonLinkProps } from './types'; +import { useStyles } from '../../hooks/useStyles'; /** @public */ export const ButtonLink = forwardRef( @@ -33,15 +33,18 @@ export const ButtonLink = forwardRef( ...rest } = props; - const responsiveSize = useResponsiveValue(size); - const responsiveVariant = useResponsiveValue(variant); + const { classNames, dataAttributes } = useStyles('Button', { + size, + variant, + }); + + const { classNames: classNamesButtonLink } = useStyles('ButtonLink'); return ( {iconStart} diff --git a/packages/canon/src/hooks/useStyles.ts b/packages/canon/src/hooks/useStyles.ts index d6c9d0c76b..19f9823236 100644 --- a/packages/canon/src/hooks/useStyles.ts +++ b/packages/canon/src/hooks/useStyles.ts @@ -15,7 +15,7 @@ */ import { useBreakpoint, breakpoints } from './useBreakpoint'; import { componentDefinitions } from '../utils/componentDefinitions'; -import type { ComponentDefinitionName } from '../types'; +import type { ComponentDefinitionName, ComponentClassNames } from '../types'; /** * Resolve a responsive value based on the current breakpoint @@ -61,9 +61,14 @@ function resolveResponsiveValue( export function useStyles( componentName: T, props: Record = {}, -) { +): { + classNames: ComponentClassNames; + dataAttributes: Record; + resolvedProps: Record; +} { const { breakpoint } = useBreakpoint(); - const classNames = componentDefinitions[componentName].classNames; + const classNames = componentDefinitions[componentName] + .classNames as ComponentClassNames; // Resolve responsive values and generate data attributes const dataAttributes: Record = {}; diff --git a/packages/canon/src/utils/componentDefinitions.ts b/packages/canon/src/utils/componentDefinitions.ts index 9d6926a002..97261f80e7 100644 --- a/packages/canon/src/utils/componentDefinitions.ts +++ b/packages/canon/src/utils/componentDefinitions.ts @@ -17,12 +17,40 @@ import type { ComponentDefinition } from '../types'; export const componentDefinitions = { - // Layout Components + Avatar: { + classNames: { + root: 'canon-AvatarRoot', + image: 'canon-AvatarImage', + fallback: 'canon-AvatarFallback', + }, + dataAttributes: { + size: ['small', 'medium', 'large'] as const, + }, + }, Box: { classNames: { root: 'canon-Box', }, }, + Button: { + classNames: { + root: 'canon-Button', + }, + dataAttributes: { + size: ['small', 'medium', 'large'] as const, + variant: ['primary', 'secondary', 'ghost'] as const, + }, + }, + ButtonIcon: { + classNames: { + root: 'canon-ButtonIcon', + }, + }, + ButtonLink: { + classNames: { + root: 'canon-ButtonLink', + }, + }, Container: { classNames: { @@ -66,33 +94,6 @@ export const componentDefinitions = { }, }, - // Form Components - Button: { - classNames: { - root: 'canon-Button', - }, - dataAttributes: { - size: ['small', 'medium', 'large'] as const, - variant: ['primary', 'secondary', 'ghost'] as const, - }, - }, - - ButtonIcon: { - classNames: { - root: 'canon-ButtonIcon', - }, - dataAttributes: { - size: ['small', 'medium', 'large'] as const, - variant: ['primary', 'secondary', 'ghost'] as const, - }, - }, - - ButtonLink: { - classNames: { - root: 'canon-ButtonLink', - }, - }, - TextField: { classNames: { root: 'canon-TextField', @@ -223,18 +224,6 @@ export const componentDefinitions = { }, }, - Avatar: { - classNames: { - root: 'canon-Avatar', - image: 'canon-Avatar-image', - fallback: 'canon-Avatar-fallback', - indicator: 'canon-Avatar-indicator', - }, - dataAttributes: { - size: ['small', 'medium', 'large'] as const, - }, - }, - Icon: { classNames: { root: 'canon-Icon',