diff --git a/modules/docs/mdx/13.0-UPGRADE-GUIDE.mdx b/modules/docs/mdx/13.0-UPGRADE-GUIDE.mdx index e29e399175..f01cf1bffa 100644 --- a/modules/docs/mdx/13.0-UPGRADE-GUIDE.mdx +++ b/modules/docs/mdx/13.0-UPGRADE-GUIDE.mdx @@ -93,7 +93,7 @@ yarn remove @workday/canvas-kit-codemod ### Styling API and CSS Tokens -**PRs:** [#3101](https://github.com/Workday/canvas-kit/pull/3101), [#3088](https://github.com/Workday/canvas-kit/pull/3088), [#3114](https://github.com/Workday/canvas-kit/pull/3114), [#3119](https://github.com/Workday/canvas-kit/pull/3119), [#3120](https://github.com/Workday/canvas-kit/pull/3120), [#3164](https://github.com/Workday/canvas-kit/pull/3164) +**PRs:** [#3101](https://github.com/Workday/canvas-kit/pull/3101), [#3088](https://github.com/Workday/canvas-kit/pull/3088), [#3114](https://github.com/Workday/canvas-kit/pull/3114), [#3119](https://github.com/Workday/canvas-kit/pull/3119), [#3120](https://github.com/Workday/canvas-kit/pull/3120), [#3164](https://github.com/Workday/canvas-kit/pull/3164), [#3128](https://github.com/Workday/canvas-kit/pull/3128) Several components have been refactored to use our [Canvas Tokens](https://workday.github.io/canvas-tokens/?path=/docs/docs-getting-started--docs) and @@ -106,6 +106,7 @@ The React interface **has not changed**, but CSS variables are now used for dyna The following components are affected: +- `Expandable` - `ExternalHyperlink` - `LoadingSparkles` - `Menu` @@ -135,7 +136,7 @@ The following components are affected: **PR:** [#3119](https://github.com/Workday/canvas-kit/pull/3119) -- The `disabled` icon color has been updated to use `system.color.fg.disabled`. This has made the icon darker for better contrast. +- The `disabled` icon color has been updated to use `system.color.fg.disabled`. This has made the icon darker for better contrast. **Note:** There should be no developer impact and the visual changes are safe to accept. diff --git a/modules/labs-react/expandable/lib/Expandable.tsx b/modules/labs-react/expandable/lib/Expandable.tsx index 8b56731c0b..3e84546c3e 100644 --- a/modules/labs-react/expandable/lib/Expandable.tsx +++ b/modules/labs-react/expandable/lib/Expandable.tsx @@ -1,7 +1,7 @@ import React from 'react'; import {createContainer, ExtractProps} from '@workday/canvas-kit-react/common'; -import {Flex} from '@workday/canvas-kit-react/layout'; +import {Flex, mergeStyles} from '@workday/canvas-kit-react/layout'; import {ExpandableContent} from './ExpandableContent'; import {ExpandableTarget} from './ExpandableTarget'; @@ -9,6 +9,8 @@ import {ExpandableIcon} from './ExpandableIcon'; import {ExpandableTitle} from './ExpandableTitle'; import {ExpandableAvatar} from './ExpandableAvatar'; import {useExpandableModel} from './hooks/useExpandableModel'; +import {createStencil} from '@workday/canvas-kit-styling'; +import {system} from '@workday/canvas-tokens-web'; export interface ExpandableProps extends ExtractProps { /** @@ -18,11 +20,20 @@ export interface ExpandableProps extends ExtractProps { children?: React.ReactNode; } +export const expandableContainerStencil = createStencil({ + base: { + display: 'flex', + flexDirection: 'column', + padding: system.space.x2, + }, +}); + /** * `Expandable` wraps an `Expandable.Target` and an `Expandable.Content`. By default, it provides a * `DisclosureModel` for its subcomponents. Alternatively, a model may be passed in using the * hoisted model pattern. */ + export const Expandable = createContainer('div')({ displayName: 'Expandable', modelHook: useExpandableModel, @@ -62,7 +73,5 @@ export const Expandable = createContainer('div')({ Content: ExpandableContent, }, })(({children, ...elementProps}, Element) => ( - - {children} - + {children} )); diff --git a/modules/labs-react/expandable/lib/ExpandableAvatar.tsx b/modules/labs-react/expandable/lib/ExpandableAvatar.tsx index 6573de13de..59836d8f8a 100644 --- a/modules/labs-react/expandable/lib/ExpandableAvatar.tsx +++ b/modules/labs-react/expandable/lib/ExpandableAvatar.tsx @@ -1,31 +1,35 @@ import React from 'react'; import {createComponent} from '@workday/canvas-kit-react/common'; -import {Avatar, AvatarProps} from '@workday/canvas-kit-react/avatar'; +import {Avatar, AvatarProps, avatarStencil} from '@workday/canvas-kit-react/avatar'; import {system} from '@workday/canvas-tokens-web'; -import {createStyles} from '@workday/canvas-kit-styling'; +import {createStencil} from '@workday/canvas-kit-styling'; +import {mergeStyles} from '@workday/canvas-kit-react/layout'; export interface ExpandableAvatarProps extends AvatarProps {} -const expandableAvatarStyles = createStyles({ - marginRight: system.space.x2, - flexShrink: 0, +export const expandableAvatarStencil = createStencil({ + extends: avatarStencil, + base: { + marginInlineEnd: system.space.x2, + flexShrink: 0, + }, }); // When the component is created, it needs to be a button element to match AvatarProps. // Once Avatar becomes a `createComponent` we can default the element type to a `div` // and the types should be properly extracted +// Setting altText prop to a default empty string for decorative purposes export const ExpandableAvatar = createComponent('div')({ displayName: 'Expandable.Avatar', - Component: ({altText, ...elemProps}: ExpandableAvatarProps, ref, Element) => { + Component: ({altText = '', ...elemProps}: ExpandableAvatarProps, ref, Element) => { return ( ); }, diff --git a/modules/labs-react/expandable/lib/ExpandableContent.tsx b/modules/labs-react/expandable/lib/ExpandableContent.tsx index 54ed4aefca..2b63a55b8d 100644 --- a/modules/labs-react/expandable/lib/ExpandableContent.tsx +++ b/modules/labs-react/expandable/lib/ExpandableContent.tsx @@ -1,11 +1,12 @@ import React from 'react'; -import {space} from '@workday/canvas-kit-react/tokens'; import {createSubcomponent, ExtractProps} from '@workday/canvas-kit-react/common'; -import {Box} from '@workday/canvas-kit-react/layout'; +import {Box, mergeStyles} from '@workday/canvas-kit-react/layout'; import {useExpandableContent} from './hooks/useExpandableContent'; import {useExpandableModel} from './hooks/useExpandableModel'; +import {createStencil} from '@workday/canvas-kit-styling'; +import {system} from '@workday/canvas-tokens-web'; export interface ExpandableContentProps extends ExtractProps { /** @@ -15,18 +16,16 @@ export interface ExpandableContentProps extends ExtractProps children?: React.ReactNode; } +export const expandableContentStencil = createStencil({ + base: { + background: system.color.bg.transparent, + padding: `${system.space.x4} ${system.space.x2} ${system.space.x2}`, + }, +}); + export const ExpandableContent = createSubcomponent('div')({ modelHook: useExpandableModel, elemPropsHook: useExpandableContent, })(({children, ...elementProps}, Element) => { - return ( - - {children} - - ); + return {children}; }); diff --git a/modules/labs-react/expandable/lib/ExpandableIcon.tsx b/modules/labs-react/expandable/lib/ExpandableIcon.tsx index dbba3d35c8..8472d9297c 100644 --- a/modules/labs-react/expandable/lib/ExpandableIcon.tsx +++ b/modules/labs-react/expandable/lib/ExpandableIcon.tsx @@ -1,20 +1,15 @@ import React from 'react'; -import { - createSubcomponent, - ExtractProps, - filterOutProps, - styled, - StyledType, -} from '@workday/canvas-kit-react/common'; -import {chevronUpIcon, chevronDownIcon} from '@workday/canvas-system-icons-web'; +import {createSubcomponent, ExtractProps} from '@workday/canvas-kit-react/common'; +import {chevronUpIcon} from '@workday/canvas-system-icons-web'; import {CanvasSystemIcon} from '@workday/design-assets-types'; import {useExpandableIcon} from './hooks/useExpandableIcon'; -import {SystemIcon} from '@workday/canvas-kit-react/icon'; +import {SystemIcon, systemIconStencil} from '@workday/canvas-kit-react/icon'; import {IconPositions} from '@workday/canvas-kit-react/button'; -import {colors, space} from '@workday/canvas-kit-react/tokens'; - import {useExpandableModel} from './hooks/useExpandableModel'; +import {createStencil} from '@workday/canvas-kit-styling'; +import {mergeStyles} from '@workday/canvas-kit-react/layout'; +import {system} from '@workday/canvas-tokens-web'; export interface ExpandableIconProps extends Omit, 'icon'> { /** @@ -30,51 +25,70 @@ export interface ExpandableIconProps extends Omit( - { - marginLeft: 'auto', +export const expandableIconStencil = createStencil({ + extends: systemIconStencil, + base: { + padding: system.space.x1, }, - ({visible}) => ({ - transform: !visible ? 'rotate(-180deg)' : undefined, - padding: !visible - ? `${space.xxxs} ${space.xs} ${space.xxxs} ${space.xxxs}` - : `${space.xxxs} ${space.xxxs} ${space.xxxs} ${space.xs}`, - }) -); - -const StyledStartIcon = styled(SystemIcon, { - shouldForwardProp: filterOutProps(['visible']), -})<{visible: boolean} & StyledType>( - { - margin: `0 ${space.xxs} 0 0`, - padding: space.xxxs, + modifiers: { + isExpanded: { + true: {}, + false: {}, + }, + position: { + start: {}, + end: {}, + only: {}, + }, }, - ({visible}) => ({ - transform: !visible ? 'rotate(-90deg)' : undefined, - }) -); + compound: [ + { + modifiers: {position: 'end', isExpanded: false}, + styles: { + marginInlineStart: 'auto', + transform: 'rotate(180deg)', + paddingInlineEnd: system.space.x3, + }, + }, + { + modifiers: {position: 'end', isExpanded: true}, + styles: { + marginInlineStart: 'auto', + paddingInlineStart: system.space.x3, + }, + }, + { + modifiers: {position: 'start', isExpanded: false}, + styles: { + marginInlineEnd: system.space.x2, + transform: 'rotate(90deg)', + ':dir(rtl)': { + transform: 'rotate(-90deg)', + }, + }, + }, + { + modifiers: {position: 'start', isExpanded: true}, + styles: { + marginInlineEnd: system.space.x2, + transform: 'rotate(180deg)', + }, + }, + ], +}); export const ExpandableIcon = createSubcomponent('span')({ modelHook: useExpandableModel, elemPropsHook: useExpandableIcon, -})(({icon, visible, iconPosition = 'start', ...elementProps}, Element) => - iconPosition === 'end' ? ( - (({icon, visible, iconPosition = 'start', ...elementProps}, Element) => { + return ( + - ) : ( - - ) -); + ); +}); diff --git a/modules/labs-react/expandable/lib/ExpandableTarget.tsx b/modules/labs-react/expandable/lib/ExpandableTarget.tsx index 1768fc1ae4..3ed1ff93ce 100644 --- a/modules/labs-react/expandable/lib/ExpandableTarget.tsx +++ b/modules/labs-react/expandable/lib/ExpandableTarget.tsx @@ -1,15 +1,10 @@ import React from 'react'; -import { - createSubcomponent, - ExtractProps, - focusRing, - styled, - StyledType, -} from '@workday/canvas-kit-react/common'; -import {Flex} from '@workday/canvas-kit-react/layout'; -import {colors} from '@workday/canvas-kit-react/tokens'; - +import {createSubcomponent, ExtractProps} from '@workday/canvas-kit-react/common'; +import {Flex, mergeStyles} from '@workday/canvas-kit-react/layout'; +import {Heading} from '@workday/canvas-kit-react/text'; +import {createStencil} from '@workday/canvas-kit-styling'; +import {system} from '@workday/canvas-tokens-web'; import {useExpandableTarget} from './hooks/useExpandableTarget'; import {useExpandableModel} from './hooks/useExpandableModel'; @@ -28,38 +23,38 @@ export interface ExpandableTargetProps extends ExtractProps headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; } -const StyledButton = styled(Flex.as('button'))({ - cursor: 'pointer', - '&:focus-visible, &.focus': { - ...focusRing(), - }, - '&:hover': { - background: colors.soap300, +export const expandableTargetStencil = createStencil({ + base: { + background: system.color.bg.transparent, + borderColor: system.color.bg.transparent, + borderRadius: system.shape.x1, + borderWidth: 0, + display: 'flex', + alignItems: 'flex-start', + flexDirection: 'row', + justifyContent: 'start', + padding: system.space.x2, + cursor: 'pointer', + width: '100%', + '&:hover, &.hover': { + backgroundColor: system.color.bg.alt.default, + }, }, }); -const Heading = styled('h1')({ - margin: 0, -}); - export const ExpandableTarget = createSubcomponent('button')({ modelHook: useExpandableModel, elemPropsHook: useExpandableTarget, })(({children, headingLevel, ...elementProps}, Element) => { const button = ( - - {children} - + {children} ); - return !!headingLevel ? {button} : button; + return headingLevel ? ( + + {button} + + ) : ( + button + ); }); diff --git a/modules/labs-react/expandable/lib/ExpandableTitle.tsx b/modules/labs-react/expandable/lib/ExpandableTitle.tsx index 453819fe2c..79addaaff1 100644 --- a/modules/labs-react/expandable/lib/ExpandableTitle.tsx +++ b/modules/labs-react/expandable/lib/ExpandableTitle.tsx @@ -1,8 +1,9 @@ import React from 'react'; import {createComponent, ExtractProps} from '@workday/canvas-kit-react/common'; -import {Box} from '@workday/canvas-kit-react/layout'; -import {colors, space, type} from '@workday/canvas-kit-react/tokens'; +import {Box, mergeStyles} from '@workday/canvas-kit-react/layout'; +import {system} from '@workday/canvas-tokens-web'; +import {createStencil, px2rem} from '@workday/canvas-kit-styling'; export interface ExpandableTitleProps extends ExtractProps { /** @@ -11,22 +12,23 @@ export interface ExpandableTitleProps extends ExtractProps { children: React.ReactNode; } +export const expandableTitleStencil = createStencil({ + base: { + ...system.type.body.medium, + fontWeight: system.fontWeight.bold, + color: system.color.text.strong, + padding: `${px2rem(2)} ${system.space.zero}`, + textAlign: 'left', + }, +}); + export const ExpandableTitle = createComponent('div')({ displayName: 'Expandable.Title', Component: ({children, ...elemProps}: ExpandableTitleProps, ref, Element) => { return ( - + {children} - + ); }, }); diff --git a/modules/react/avatar/lib/Avatar.tsx b/modules/react/avatar/lib/Avatar.tsx index 491893aeed..b3d4535851 100644 --- a/modules/react/avatar/lib/Avatar.tsx +++ b/modules/react/avatar/lib/Avatar.tsx @@ -73,6 +73,7 @@ export const avatarStencil = createStencil({ border: 0, overflow: 'hidden', cursor: 'default', + pointerEvents: 'none', borderRadius: system.shape.round, width: size, height: size, @@ -82,6 +83,7 @@ export const avatarStencil = createStencil({ }, ':is(button)': { cursor: 'pointer', + pointerEvents: 'auto', }, ['& > [data-part="avatar-icon"]']: { transition: 'opacity 150ms linear', @@ -210,20 +212,20 @@ export const avatarStencil = createStencil({ }, }, isImageLoaded: { - true: { + false: { ['& [data-part="avatar-icon"]']: { - opacity: 0, + opacity: 1, }, ['& [data-part="avatar-image"]']: { - opacity: 1, + opacity: 0, }, }, - false: { + true: { ['& [data-part="avatar-icon"]']: { - opacity: 1, + opacity: 0, }, ['& [data-part="avatar-image"]']: { - opacity: 0, + opacity: 1, }, }, }, @@ -271,8 +273,7 @@ export const Avatar = createComponent('button')({ return (