diff --git a/packages/blade/docs/tokens/Motion.stories.mdx b/packages/blade/docs/tokens/Motion.stories.mdx index 584d4ab64d8..d0dbb33e526 100644 --- a/packages/blade/docs/tokens/Motion.stories.mdx +++ b/packages/blade/docs/tokens/Motion.stories.mdx @@ -13,11 +13,7 @@ import MovingDiv from '../components/MovingDiv'; const colorScheme = context.store.globals.globals.colorScheme; return ( - + {children} @@ -113,7 +109,7 @@ export const MotionExample = () => { background-color: ${(props) => props.theme.colors.surface.background.primary.subtle}; animation: ${(props) => `resize ${makeMotionTime(props.theme.motion.duration.xgentle)} ${ - props.theme.motion.easing.standard.effective + props.theme.motion.easing.standard } infinite`}; @keyframes resize { 0% { @@ -127,7 +123,7 @@ export const MotionExample = () => { } } `; - return ; + return ; }; @@ -153,7 +149,7 @@ const ExampleDiv = styled.div` props.theme.colors.surface.background.primary.subtle}; animation: ${(props) => `resize ${makeMotionTime(props.theme.motion.duration.xgentle)} ${ - props.theme.motion.easing.standard.effective + props.theme.motion.easing.standard } infinite`}; @keyframes resize { 0% { @@ -177,7 +173,7 @@ import { makeMotionTime } from '@razorpay/blade/utils'; const CustomComponent = () => { const { theme } = useTheme(); - const easing = theme.motion.easing.standard.effective; + const easing = theme.motion.easing.standard; const duration = makeMotionTime(theme.motion.duration.xgentle); const delay = makeMotionTime(theme.motion.delay.short); diff --git a/packages/blade/src/components/Accordion/commonStyles.ts b/packages/blade/src/components/Accordion/commonStyles.ts index c2842d99a39..1acc92c9595 100644 --- a/packages/blade/src/components/Accordion/commonStyles.ts +++ b/packages/blade/src/components/Accordion/commonStyles.ts @@ -7,7 +7,7 @@ import { makeMotionTime } from '~utils'; const getTransitionDuration = (theme: Theme) => makeMotionTime(theme.motion.duration['2xquick']); // eslint-disable-next-line @typescript-eslint/explicit-function-return-type -const getTransitionEasing = (theme: Theme) => theme.motion.easing.standard.effective; +const getTransitionEasing = (theme: Theme) => theme.motion.easing.standard; const getBackgroundColor = ({ theme, diff --git a/packages/blade/src/components/ActionList/ActionList.tsx b/packages/blade/src/components/ActionList/ActionList.tsx index 0e0f726b949..f340cd03935 100644 --- a/packages/blade/src/components/ActionList/ActionList.tsx +++ b/packages/blade/src/components/ActionList/ActionList.tsx @@ -36,6 +36,8 @@ const _ActionList = ({ children, testID }: ActionListProps): React.ReactElement [children], ); + console.log({ actionListOptions }); + React.useEffect(() => { setOptions(actionListOptions); // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/packages/blade/src/components/BladeProvider/__tests__/bladeLightTheme/bladeLightTheme.native.ts b/packages/blade/src/components/BladeProvider/__tests__/bladeLightTheme/bladeLightTheme.native.ts index 507660d6db8..76e6d26d027 100644 --- a/packages/blade/src/components/BladeProvider/__tests__/bladeLightTheme/bladeLightTheme.native.ts +++ b/packages/blade/src/components/BladeProvider/__tests__/bladeLightTheme/bladeLightTheme.native.ts @@ -13,22 +13,13 @@ const bladeLightTheme: Theme = { motion: { ...bladeTheme.motion, easing: { - standard: { - attentive: Easing.bezier(0.5, 0, 0.3, 1.5), - effective: Easing.bezier(0.3, 0, 0.2, 1), - revealing: Easing.bezier(0.5, 0, 0, 1), - wary: Easing.bezier(1, 0.5, 0, 0.5), - }, - entrance: { - attentive: Easing.bezier(0.5, 0, 0.3, 1.5), - effective: Easing.bezier(0, 0, 0.2, 1), - revealing: Easing.bezier(0, 0, 0, 1), - }, - exit: { - attentive: Easing.bezier(0.7, 0, 0.5, 1), - effective: Easing.bezier(0.17, 0, 1, 1), - revealing: Easing.bezier(0.5, 0, 1, 1), - }, + linear: Easing.bezier(0, 0, 0, 0), + entrance: Easing.bezier(0, 0, 0.2, 1), + exit: Easing.bezier(0.17, 0, 1, 1), + standard: Easing.bezier(0.3, 0, 0.2, 1), + emphasized: Easing.bezier(0.5, 0, 0, 1), + overshoot: Easing.bezier(0.5, 0, 0.3, 1.5), + shake: Easing.bezier(1, 0.5, 0, 0.5), }, }, }; diff --git a/packages/blade/src/components/BottomSheet/BottomSheetBackdrop.web.tsx b/packages/blade/src/components/BottomSheet/BottomSheetBackdrop.web.tsx index 583dde5e7cd..d065881fa55 100644 --- a/packages/blade/src/components/BottomSheet/BottomSheetBackdrop.web.tsx +++ b/packages/blade/src/components/BottomSheet/BottomSheetBackdrop.web.tsx @@ -11,8 +11,8 @@ const StyledBottomSheetBackdrop = styled(BaseBox)<{ isOpen: boolean }>(({ theme, return { transitionDuration: `${makeMotionTime(theme.motion.duration.moderate)}`, transitionTimingFunction: isOpen - ? castWebType(theme.motion.easing.entrance.revealing) - : castWebType(theme.motion.easing.exit.revealing), + ? castWebType(theme.motion.easing.entrance) + : castWebType(theme.motion.easing.exit), pointerEvents: isOpen ? 'all' : 'none', transitionProperty: 'opacity', }; diff --git a/packages/blade/src/components/Button/BaseButton/BaseButton.tsx b/packages/blade/src/components/Button/BaseButton/BaseButton.tsx index f1285723012..b6c84db1a56 100644 --- a/packages/blade/src/components/Button/BaseButton/BaseButton.tsx +++ b/packages/blade/src/components/Button/BaseButton/BaseButton.tsx @@ -257,7 +257,7 @@ const getProps = ({ borderWidth: variant == 'secondary' ? makeBorderSize(theme.border.width.thin) : '0px', borderRadius: makeBorderSize(theme.border.radius.medium), motionDuration: 'duration.xquick', - motionEasing: 'easing.standard.effective', + motionEasing: 'easing.standard', }; if (isDisabled) { diff --git a/packages/blade/src/components/Button/IconButton/StyledIconButton.web.tsx b/packages/blade/src/components/Button/IconButton/StyledIconButton.web.tsx index 57753398562..91e1d772be7 100644 --- a/packages/blade/src/components/Button/IconButton/StyledIconButton.web.tsx +++ b/packages/blade/src/components/Button/IconButton/StyledIconButton.web.tsx @@ -56,7 +56,7 @@ const StyledButton = styled.button((props) => { : theme.colors.interactive.icon[emphasisColor].muted, transitionProperty: 'color, box-shadow', transitionDuration: castWebType(makeMotionTime(motionToken.duration.xquick)), - transitionTimingFunction: motionToken.easing.standard.effective as string, + transitionTimingFunction: motionToken.easing.standard as string, '&:hover:not([disabled])': { color: theme.colors.interactive.icon[emphasisColor].subtle, diff --git a/packages/blade/src/components/Card/CardRoot.native.tsx b/packages/blade/src/components/Card/CardRoot.native.tsx index 757288d0edc..aacd50672e4 100644 --- a/packages/blade/src/components/Card/CardRoot.native.tsx +++ b/packages/blade/src/components/Card/CardRoot.native.tsx @@ -51,7 +51,7 @@ const CardRoot = ({ const { theme } = useTheme(); const [isPressed, setIsPressed] = React.useState(false); const duration = castNativeType(makeMotionTime(theme.motion.duration.xquick)); - const easing = castNativeType(theme.motion.easing.standard.effective); + const easing = castNativeType(theme.motion.easing.standard); const styles = useAnimatedStyle(() => { return { diff --git a/packages/blade/src/components/Card/CardRoot.web.tsx b/packages/blade/src/components/Card/CardRoot.web.tsx index 4689dc3be52..1948a35b745 100644 --- a/packages/blade/src/components/Card/CardRoot.web.tsx +++ b/packages/blade/src/components/Card/CardRoot.web.tsx @@ -20,7 +20,7 @@ const StyledCardRoot = styled(BaseBox) { const { theme } = useTheme(); - const easing = castNativeType(theme.motion.easing.standard.effective); + const easing = castNativeType(theme.motion.easing.standard); const duration = castNativeType(makeMotionTime(theme.motion.duration.gentle)); const style = useAnimatedStyle(() => { diff --git a/packages/blade/src/components/Carousel/Indicators/getIndicatorButtonStyles.ts b/packages/blade/src/components/Carousel/Indicators/getIndicatorButtonStyles.ts index 6f61afacbb1..5edc09c2222 100644 --- a/packages/blade/src/components/Carousel/Indicators/getIndicatorButtonStyles.ts +++ b/packages/blade/src/components/Carousel/Indicators/getIndicatorButtonStyles.ts @@ -17,7 +17,7 @@ const getIndicatorButtonStyles = ({ blue: theme.colors.interactive.icon.primary.subtle, }; - const easing = castWebType(theme.motion.easing.standard.effective); + const easing = castWebType(theme.motion.easing.standard); const duration = castWebType(makeMotionTime(theme.motion.duration.gentle)); return { diff --git a/packages/blade/src/components/Carousel/NavigationButton/getNavigationButtonStyles.ts b/packages/blade/src/components/Carousel/NavigationButton/getNavigationButtonStyles.ts index b2494f678a6..822d1ecb651 100644 --- a/packages/blade/src/components/Carousel/NavigationButton/getNavigationButtonStyles.ts +++ b/packages/blade/src/components/Carousel/NavigationButton/getNavigationButtonStyles.ts @@ -66,7 +66,7 @@ const getNavigationButtonStyles = (props: { : { transitionProperty: 'color, box-shadow', transitionDuration: castWebType(makeMotionTime(motionToken.duration.xquick)), - transitionTimingFunction: castWebType(motionToken.easing.standard.effective), + transitionTimingFunction: castWebType(motionToken.easing.standard), boxShadow: variant === 'filled' ? castWebType(theme.elevation.midRaised) : undefined, '&:hover': { diff --git a/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.native.tsx b/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.native.tsx index 8562c25463f..9c7b0a070eb 100644 --- a/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.native.tsx +++ b/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.native.tsx @@ -17,8 +17,8 @@ const StyledFade = styled(Animated.View)<{ styles: CSSObject }>(({ styles }) => const Fade = ({ children, show, styles }: FadeProps) => { const { theme } = useTheme(); - const fadeInEasing = (theme.motion.easing.entrance.effective as unknown) as EasingFn; - const fadeOutEasing = (theme.motion.easing.exit.effective as unknown) as EasingFn; + const fadeInEasing = (theme.motion.easing.entrance as unknown) as EasingFn; + const fadeOutEasing = (theme.motion.easing.exit as unknown) as EasingFn; const fadeIn = new Keyframe({ from: { transform: [{ scale: 0.6 }], diff --git a/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.web.tsx b/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.web.tsx index 395153af838..3fb9cdcaea7 100644 --- a/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.web.tsx +++ b/packages/blade/src/components/Checkbox/CheckboxIcon/Fade.web.tsx @@ -46,13 +46,11 @@ const Fade = ({ show, children, styles }: FadeProps) => { const duration = theme.motion.duration.xquick; const enter = css` - animation: ${fadeIn} ${makeMotionTime(duration)} - ${theme.motion.easing.entrance.effective as string}; + animation: ${fadeIn} ${makeMotionTime(duration)} ${theme.motion.easing.entrance as string}; `; const exit = css` - animation: ${fadeOut} ${makeMotionTime(duration)} - ${theme.motion.easing.exit.effective as string}; + animation: ${fadeOut} ${makeMotionTime(duration)} ${theme.motion.easing.exit as string}; `; // if show is undefined do not initialize the animation to prevent flash of animation diff --git a/packages/blade/src/components/Chip/chipTokens.ts b/packages/blade/src/components/Chip/chipTokens.ts index f3498cece12..05d79b88336 100644 --- a/packages/blade/src/components/Chip/chipTokens.ts +++ b/packages/blade/src/components/Chip/chipTokens.ts @@ -195,7 +195,7 @@ const chipTextSizes = { const chipMotionTokens: Record<'duration' | 'easing', DurationString | EasingString> = { duration: 'duration.xquick', - easing: 'easing.standard.effective', + easing: 'easing.standard', }; export { diff --git a/packages/blade/src/components/Collapsible/commonStyles.ts b/packages/blade/src/components/Collapsible/commonStyles.ts index ee23e117b83..25be289ca30 100644 --- a/packages/blade/src/components/Collapsible/commonStyles.ts +++ b/packages/blade/src/components/Collapsible/commonStyles.ts @@ -28,10 +28,10 @@ const getCollapsibleBodyContentBoxProps = ({ const getOpacity = ({ isExpanded }: { isExpanded: boolean }): number => (isExpanded ? 1 : 0.8); // eslint-disable-next-line @typescript-eslint/explicit-function-return-type -const getTransitionDuration = (theme: Theme) => makeMotionTime(theme.motion.duration.xmoderate); +const getTransitionDuration = (theme: Theme) => makeMotionTime(theme.motion.duration.moderate); // eslint-disable-next-line @typescript-eslint/explicit-function-return-type -const getTransitionEasing = (theme: Theme) => theme.motion.easing.standard.effective; +const getTransitionEasing = (theme: Theme) => theme.motion.easing.standard; const getCollapsibleChevronIconTransforms = (): { transformExpanded: number; diff --git a/packages/blade/src/components/Drawer/Drawer.web.tsx b/packages/blade/src/components/Drawer/Drawer.web.tsx index 1587b6205a6..69cb67fc290 100644 --- a/packages/blade/src/components/Drawer/Drawer.web.tsx +++ b/packages/blade/src/components/Drawer/Drawer.web.tsx @@ -28,12 +28,12 @@ const AnimatedDrawerContainer = styled(BaseBox)<{ isVisible: boolean; }>(({ theme, isFirstDrawerInStack, isVisible }) => { const entranceTransition: CSSProperties['transition'] = `all ${castWebType( - castWebType(makeMotionTime(theme.motion.duration.gentle)), - )} ${castWebType(theme.motion.easing.entrance.revealing)}`; + castWebType(makeMotionTime(theme.motion.duration.xmoderate)), + )} ${castWebType(theme.motion.easing.entrance)}`; const exitTransition: CSSProperties['transition'] = `all - ${castWebType(makeMotionTime(theme.motion.duration.xmoderate))} - ${castWebType(theme.motion.easing.exit.revealing)}`; + ${castWebType(makeMotionTime(theme.motion.duration.moderate))} + ${castWebType(theme.motion.easing.exit)}`; return { opacity: isVisible ? 1 : 0, @@ -52,13 +52,13 @@ const DrawerOverlay = styled(FloatingOverlay)(({ theme }) => { opacity: 0, transition: `opacity ${makeMotionTime(theme.motion.duration.xmoderate)} - ${castWebType(theme.motion.easing.exit.revealing)}`, + ${castWebType(theme.motion.easing.exit)}`, backgroundColor: theme.colors.overlay.background.subtle, [`&.${SHOW_DRAWER}`]: { opacity: 1, transition: `opacity ${makeMotionTime(theme.motion.duration.gentle)} ${castWebType( - theme.motion.easing.entrance.revealing, + theme.motion.easing.entrance, )}`, }, }; diff --git a/packages/blade/src/components/FileUpload/fileUploadTokens.ts b/packages/blade/src/components/FileUpload/fileUploadTokens.ts index 82e6eec6662..a441851cf98 100644 --- a/packages/blade/src/components/FileUpload/fileUploadTokens.ts +++ b/packages/blade/src/components/FileUpload/fileUploadTokens.ts @@ -20,7 +20,7 @@ const getFileUploadInputHoverTokens = (): SelectorInputHoverTokens => { const fileUploadMotionTokens: Record<'duration' | 'easing', DurationString | EasingString> = { duration: 'duration.2xquick', - easing: 'easing.standard.effective', + easing: 'easing.standard', }; const fileUploadHeightTokens = { diff --git a/packages/blade/src/components/Form/Selector/SelectorInput.web.tsx b/packages/blade/src/components/Form/Selector/SelectorInput.web.tsx index cce296e8a9a..4f4f512e5b6 100644 --- a/packages/blade/src/components/Form/Selector/SelectorInput.web.tsx +++ b/packages/blade/src/components/Form/Selector/SelectorInput.web.tsx @@ -31,7 +31,7 @@ const getHoverStyles = ({ return { borderColor: borderColor ? getIn(theme, borderColor) : undefined, backgroundColor: getIn(theme, backgroundColor), - transitionTimingFunction: theme.motion.easing.standard.effective as string, + transitionTimingFunction: theme.motion.easing.standard as string, transitionDuration: castWebType(makeMotionTime(theme.motion.duration['2xquick'])), }; }; diff --git a/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.native.tsx b/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.native.tsx index 17edc86131b..257c3cd5286 100644 --- a/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.native.tsx +++ b/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.native.tsx @@ -67,7 +67,7 @@ const _AnimatedBaseInputWrapper: React.ForwardRefRenderFunction< showAllTags ? baseInputWrapperMaxHeight[rest.size] : baseInputHeight[rest.size], { duration: theme.motion.duration.xquick, - easing: castNativeType(theme.motion.easing.exit.effective), + easing: castNativeType(theme.motion.easing.exit), }, (isComplete) => { if (isComplete && !showAllTags) { @@ -122,11 +122,10 @@ const _AnimatedBaseInputWrapper: React.ForwardRefRenderFunction< ), ), easing: castNativeType( - getIn( - theme.motion.easing, + theme.motion.easing[ baseInputBorderBackgroundMotion[rest.currentInteraction === 'focus' ? 'enter' : 'exit'] - .easing, - ), + .easing + ], ), }; diff --git a/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.web.tsx b/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.web.tsx index 22405021217..91c7abf98c2 100644 --- a/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.web.tsx +++ b/packages/blade/src/components/Input/BaseInput/AnimatedBaseInputWrapper.web.tsx @@ -46,7 +46,7 @@ const StyledBaseInputWrapper = styled(BaseBox)< }), transitionProperty: 'background-color', transitionDuration: castWebType(makeMotionTime(props.theme.motion.duration.xquick)), - transitionTimingFunction: castWebType(props.theme.motion.easing.standard.effective), + transitionTimingFunction: castWebType(props.theme.motion.easing.standard), }, ':focus-within': { ...getInputBackgroundAndBorderStyles({ @@ -113,12 +113,12 @@ to { const expandTransition = css` animation: ${expandAnimation} ${makeMotionTime(motion.duration.quick)} - ${String(motion.easing.entrance.effective)}; + ${String(motion.easing.entrance)}; `; const collapseTransition = css` animation: ${collapseAnimation} ${makeMotionTime(motion.duration.quick)} - ${String(motion.easing.exit.effective)}; + ${String(motion.easing.exit)}; `; const noTransition = css` diff --git a/packages/blade/src/components/Input/BaseInput/BaseInput.tsx b/packages/blade/src/components/Input/BaseInput/BaseInput.tsx index 6d4466321f0..efec0c03bba 100644 --- a/packages/blade/src/components/Input/BaseInput/BaseInput.tsx +++ b/packages/blade/src/components/Input/BaseInput/BaseInput.tsx @@ -752,11 +752,10 @@ const FocusRingWrapper = styled(BaseBox)<{ ), ), transitionTimingFunction: castWebType( - getIn( - theme.motion.easing, + theme.motion.easing[ baseInputBorderBackgroundMotion[currentInteraction === 'focus' ? 'enter' : 'exit'] - .easing, - ), + .easing + ], ), } : {}, diff --git a/packages/blade/src/components/Input/BaseInput/baseInputTokens.ts b/packages/blade/src/components/Input/BaseInput/baseInputTokens.ts index 889cc337acb..d6d6a4864bc 100644 --- a/packages/blade/src/components/Input/BaseInput/baseInputTokens.ts +++ b/packages/blade/src/components/Input/BaseInput/baseInputTokens.ts @@ -64,8 +64,8 @@ export const baseInputBorderWidth = { } as const; export const baseInputBorderBackgroundMotion = { - enter: { duration: 'xgentle', easing: 'standard.revealing' }, - exit: { duration: 'gentle', easing: 'standard.effective' }, + enter: { duration: 'xgentle', easing: 'emphasized' }, + exit: { duration: 'gentle', easing: 'standard' }, } as const; export const baseInputPaddingTokens = { diff --git a/packages/blade/src/components/Input/DropdownInputTriggers/AutoComplete.stories.tsx b/packages/blade/src/components/Input/DropdownInputTriggers/AutoComplete.stories.tsx index dbcacd505a7..fb3bc4214de 100644 --- a/packages/blade/src/components/Input/DropdownInputTriggers/AutoComplete.stories.tsx +++ b/packages/blade/src/components/Input/DropdownInputTriggers/AutoComplete.stories.tsx @@ -325,37 +325,75 @@ export const InternalAutoCompleteControlledSelection = (): React.ReactElement => ); }; -const cities = [ - { - title: 'Mumbai', - value: 'mumbai', - keywords: ['maharashtra'], - }, - { - title: 'Pune', - value: 'pune', - keywords: ['maharashtra'], - }, - { - title: 'Bengaluru', - value: 'bengaluru', - keywords: ['karnataka', 'bangalore'], - }, - { - title: 'Ooty', - value: 'ooty', - keywords: ['tamil nadu'], - }, -]; +const getCities = () => { + const cities = [ + { + title: 'Mumbai', + value: 'mumbai', + keywords: ['maharashtra'], + }, + { + title: 'Pune', + value: 'pune', + keywords: ['maharashtra'], + }, + { + title: 'Bengaluru', + value: 'bengaluru', + keywords: ['karnataka', 'bangalore'], + }, + { + title: 'Ooty', + value: 'ooty', + keywords: ['tamil nadu'], + }, + ]; + + return new Promise((resolve) => { + setTimeout(() => { + resolve(cities); + }, 500); + }); +}; + export const InternalAutoCompleteControlled = (): React.ReactElement => { + const [cities, setCities] = React.useState([]); + React.useEffect(() => { + getCities().then((data) => { + setCities(data); + setFilteredValues(data); + }); + + // setTimeout(() => { + // setFilteredValues(['mumbai', 'bengaluru']); + // }, 5000); + }, []); + + console.log(cities); + const cityValues = cities.map((city) => city.value); const [filteredValues, setFilteredValues] = React.useState(cityValues); + const [inputValue, setInputValue] = React.useState('Pune'); + const [selectedValue, setSelectedValue] = React.useState('pune'); return ( - + { + // if (isOpen) { + // setFilteredValues(cities); + // } + // console.log(filteredValues); + }} + > { + console.log('onInputValueChange called'); + setInputValue(value ?? ''); + if (value) { const filteredItems = cities .filter( @@ -376,6 +414,10 @@ export const InternalAutoCompleteControlled = (): React.ReactElement => { setFilteredValues(cityValues); } }} + onChange={({ values }) => { + console.log('onChange called'); + setSelectedValue(values[0]); + }} filteredValues={filteredValues} helpText="Try typing 'maharashtra' in input" /> diff --git a/packages/blade/src/components/Link/BaseLink/BaseLink.tsx b/packages/blade/src/components/Link/BaseLink/BaseLink.tsx index 0c78ab66946..42b4328d0fb 100644 --- a/packages/blade/src/components/Link/BaseLink/BaseLink.tsx +++ b/packages/blade/src/components/Link/BaseLink/BaseLink.tsx @@ -246,7 +246,7 @@ const getProps = ({ }) as BaseTextProps['color'], focusRingColor: getIn(theme.colors, 'interactive.background.primary.faded'), motionDuration: 'duration.2xquick', - motionEasing: 'easing.standard.effective', + motionEasing: 'easing.standard', cursor: isButton && isDisabled ? 'not-allowed' : 'pointer', disabled: isButton && isDisabled, role: isButton ? 'button' : 'link', diff --git a/packages/blade/src/components/Modal/Modal.web.tsx b/packages/blade/src/components/Modal/Modal.web.tsx index 041afb5b45a..2937f693fa5 100644 --- a/packages/blade/src/components/Modal/Modal.web.tsx +++ b/packages/blade/src/components/Modal/Modal.web.tsx @@ -59,10 +59,10 @@ const ModalContent = styled(BaseBox)<{ isVisible: boolean }>(({ isVisible, theme transform: translate(-50%, -50%); opacity: ${isVisible ? 1 : 0}; animation: ${isVisible ? entry : exit} - ${castWebType(makeMotionTime(theme.motion.duration.xmoderate))} + ${castWebType(makeMotionTime(theme.motion.duration.moderate))} ${isVisible - ? castWebType(theme.motion.easing.entrance.revealing) - : castWebType(theme.motion.easing.exit.revealing)}; + ? castWebType(theme.motion.easing.entrance) + : castWebType(theme.motion.easing.exit)}; `; }); @@ -77,7 +77,7 @@ const Modal = ({ }: ModalProps): React.ReactElement => { const { theme, platform } = useTheme(); const { isMounted, isVisible } = usePresence(isOpen, { - transitionDuration: theme.motion.duration.xmoderate, + transitionDuration: theme.motion.duration.moderate, initialEnter: true, }); diff --git a/packages/blade/src/components/Modal/ModalBackdrop.tsx b/packages/blade/src/components/Modal/ModalBackdrop.tsx index 00168c36e16..cda34b65001 100644 --- a/packages/blade/src/components/Modal/ModalBackdrop.tsx +++ b/packages/blade/src/components/Modal/ModalBackdrop.tsx @@ -10,10 +10,10 @@ const StyledModalBackdrop = styled(FloatingOverlay)(({ theme }) => { const { isVisible } = useModalContext(); return { - transitionDuration: `${makeMotionTime(theme.motion.duration.xmoderate)}`, + transitionDuration: `${makeMotionTime(theme.motion.duration.moderate)}`, transitionTimingFunction: isVisible - ? castWebType(theme.motion.easing.entrance.revealing) - : castWebType(theme.motion.easing.exit.revealing), + ? castWebType(theme.motion.easing.entrance) + : castWebType(theme.motion.easing.exit), transitionProperty: 'opacity', opacity: isVisible ? 1 : 0, backgroundColor: theme.colors.overlay.background.subtle, diff --git a/packages/blade/src/components/Popover/PopoverContentWrapper.native.tsx b/packages/blade/src/components/Popover/PopoverContentWrapper.native.tsx index a65fc0c6c33..e35ce3f59eb 100644 --- a/packages/blade/src/components/Popover/PopoverContentWrapper.native.tsx +++ b/packages/blade/src/components/Popover/PopoverContentWrapper.native.tsx @@ -38,7 +38,7 @@ const PopoverContentWrapper = React.forwardRef const translate = useSharedValue(offset); const opacity = useSharedValue(0); - const easing = (theme.motion.easing.entrance.effective as unknown) as EasingFn; + const easing = (theme.motion.easing.entrance as unknown) as EasingFn; const duration = theme.motion.duration.quick; React.useEffect(() => { diff --git a/packages/blade/src/components/ProgressBar/CircularProgressBar.web.tsx b/packages/blade/src/components/ProgressBar/CircularProgressBar.web.tsx index f87ce6f2301..a2f9a3958b9 100644 --- a/packages/blade/src/components/ProgressBar/CircularProgressBar.web.tsx +++ b/packages/blade/src/components/ProgressBar/CircularProgressBar.web.tsx @@ -138,7 +138,7 @@ const CircularProgressBarFilled = ({ strokeDashoffset={dashOffset} pulseMotionDuration="duration.2xgentle" pulseMotionDelay="delay.long" - motionEasing="easing.standard.revealing" + motionEasing="easing.emphasized" /> {showPercentage && size !== 'small' && ( ) : ( diff --git a/packages/blade/src/components/Radio/RadioIcon/Fade.native.tsx b/packages/blade/src/components/Radio/RadioIcon/Fade.native.tsx index 3ca846a0b73..44641b44c53 100644 --- a/packages/blade/src/components/Radio/RadioIcon/Fade.native.tsx +++ b/packages/blade/src/components/Radio/RadioIcon/Fade.native.tsx @@ -17,8 +17,8 @@ const StyledFade = styled(Animated.View)<{ styles: CSSObject }>(({ styles }) => const Fade = ({ children, show, styles }: FadeProps) => { const { theme } = useTheme(); - const enterEasing = (theme.motion.easing.entrance.effective as unknown) as EasingFn; - const exitEasing = (theme.motion.easing.exit.effective as unknown) as EasingFn; + const enterEasing = (theme.motion.easing.entrance as unknown) as EasingFn; + const exitEasing = (theme.motion.easing.exit as unknown) as EasingFn; const scaleIn = new Keyframe({ from: { transform: [{ scale: 0.3 }], diff --git a/packages/blade/src/components/Radio/RadioIcon/Fade.web.tsx b/packages/blade/src/components/Radio/RadioIcon/Fade.web.tsx index ef6d78f2fab..5a5ae76c91e 100644 --- a/packages/blade/src/components/Radio/RadioIcon/Fade.web.tsx +++ b/packages/blade/src/components/Radio/RadioIcon/Fade.web.tsx @@ -46,13 +46,11 @@ const Fade = ({ show, children, styles }: FadeProps) => { const duration = theme.motion.duration.xquick; const enter = css` - animation: ${scaleIn} ${makeMotionTime(duration)} - ${theme.motion.easing.entrance.effective as string}; + animation: ${scaleIn} ${makeMotionTime(duration)} ${theme.motion.easing.entrance as string}; `; const exit = css` - animation: ${fadeOut} ${makeMotionTime(duration)} - ${theme.motion.easing.exit.effective as string}; + animation: ${fadeOut} ${makeMotionTime(duration)} ${theme.motion.easing.exit as string}; `; // usePresence hook waits for the animation to finish before unmounting the component diff --git a/packages/blade/src/components/Radio/RadioIcon/RadioIconWrapperStyles.ts b/packages/blade/src/components/Radio/RadioIcon/RadioIconWrapperStyles.ts index 81c3d3ae064..dc85f138d5c 100644 --- a/packages/blade/src/components/Radio/RadioIcon/RadioIconWrapperStyles.ts +++ b/packages/blade/src/components/Radio/RadioIcon/RadioIconWrapperStyles.ts @@ -44,7 +44,7 @@ const getRadioIconWrapperStyles = ({ borderColor, ...(!isReactNative && { transitionDuration: castWebType(makeMotionTime(theme.motion.duration.xquick)), - transitionTimingFunction: castWebType(theme.motion.easing.exit.attentive), + transitionTimingFunction: castWebType(theme.motion.easing.exit), }), }; }; diff --git a/packages/blade/src/components/SideNav/SideNav.web.tsx b/packages/blade/src/components/SideNav/SideNav.web.tsx index a408ddfc227..cfa5ed7533b 100644 --- a/packages/blade/src/components/SideNav/SideNav.web.tsx +++ b/packages/blade/src/components/SideNav/SideNav.web.tsx @@ -37,12 +37,12 @@ const MobileL1Container = styled(BaseBox)(() => { }); const StyledL1Menu = styled(BaseBox)((props) => { - const moderate = makeMotionTime(props.theme.motion.duration.moderate); - const gentle = makeMotionTime(props.theme.motion.duration.gentle); + const quick = makeMotionTime(props.theme.motion.duration.quick); + const xmoderate = makeMotionTime(props.theme.motion.duration.xmoderate); const easing = props.theme.motion.easing; - const l1Expand = `width ${gentle} ${easing.entrance.revealing}`; - const l1Collapse = `width ${moderate} ${easing.exit.revealing}`; + const l1Expand = `width ${xmoderate} ${easing.entrance}`; + const l1Collapse = `width ${quick} ${easing.exit}`; return { width: '100%', diff --git a/packages/blade/src/components/SideNav/tokens.ts b/packages/blade/src/components/SideNav/tokens.ts index b9436d28905..67c07acedba 100644 --- a/packages/blade/src/components/SideNav/tokens.ts +++ b/packages/blade/src/components/SideNav/tokens.ts @@ -28,9 +28,7 @@ const HOVER_AGAIN_DELAY = 500; const L1_EXIT_HOVER_DELAY = 150; const getNavItemTransition = ({ motion }: Theme): string => { - return `background-color ${makeMotionTime(motion.duration['2xquick'])} ${ - motion.easing.standard.effective - }`; + return `background-color ${makeMotionTime(motion.duration['2xquick'])} ${motion.easing.standard}`; }; export { diff --git a/packages/blade/src/components/Skeleton/PulseAnimation.native.tsx b/packages/blade/src/components/Skeleton/PulseAnimation.native.tsx index ecebd076f75..233930b0054 100644 --- a/packages/blade/src/components/Skeleton/PulseAnimation.native.tsx +++ b/packages/blade/src/components/Skeleton/PulseAnimation.native.tsx @@ -22,7 +22,7 @@ const PulseAnimation = (props: SkeletonProps): React.ReactElement => { const durationPluseOff = theme.motion.duration.xmoderate; const durationPluseOn = theme.motion.duration['2xgentle']; const totalDuration = castNativeType(makeMotionTime(durationPluseOn + durationPluseOff)); - const easing = castNativeType(theme.motion.easing.standard.revealing); + const easing = castNativeType(theme.motion.easing.emphasized); const progress = useSharedValue(0); const fadeIn = () => { diff --git a/packages/blade/src/components/Skeleton/PulseAnimation.web.tsx b/packages/blade/src/components/Skeleton/PulseAnimation.web.tsx index 1352ed59b5d..f93683d6213 100644 --- a/packages/blade/src/components/Skeleton/PulseAnimation.web.tsx +++ b/packages/blade/src/components/Skeleton/PulseAnimation.web.tsx @@ -33,7 +33,7 @@ const PulseAnimation = styled(BaseBox)(({ theme }) => { const durationPulseOn = theme.motion.duration['2xgentle']; const totalDuration = castWebType(makeMotionTime(durationPulseOn + durationPluseOff)); const duration = castWebType(makeMotionTime(theme.motion.duration['2xgentle'])); - const easing = castWebType(theme.motion.easing.standard.effective); + const easing = castWebType(theme.motion.easing.standard); return css` opacity: 0; diff --git a/packages/blade/src/components/Spinner/BaseSpinner/spinnerTokens.ts b/packages/blade/src/components/Spinner/BaseSpinner/spinnerTokens.ts index a801891b8b8..f0d1a70c3ad 100644 --- a/packages/blade/src/components/Spinner/BaseSpinner/spinnerTokens.ts +++ b/packages/blade/src/components/Spinner/BaseSpinner/spinnerTokens.ts @@ -11,7 +11,7 @@ const motion: { easing: EasingString; } = { duration: 'duration.2xgentle', - easing: 'easing.standard.attentive', + easing: 'easing.overshoot', }; export { dimensions, motion }; diff --git a/packages/blade/src/components/SpotlightPopoverTour/TourMask.web.tsx b/packages/blade/src/components/SpotlightPopoverTour/TourMask.web.tsx index 4b41e60ddbf..42bf9a02514 100644 --- a/packages/blade/src/components/SpotlightPopoverTour/TourMask.web.tsx +++ b/packages/blade/src/components/SpotlightPopoverTour/TourMask.web.tsx @@ -67,13 +67,13 @@ const FadeRect = React.memo( const duration = theme.motion.duration.gentle; const enter = css` animation: ${scaleIn} ${makeMotionTime(duration)} - ${(theme.motion.easing.entrance.effective as unknown) as string}; + ${(theme.motion.easing.entrance as unknown) as string}; animation-fill-mode: forwards; `; const exit = css` animation: ${fadeOut} ${makeMotionTime(duration)} - ${(theme.motion.easing.exit.effective as unknown) as string}; + ${(theme.motion.easing.exit as unknown) as string}; animation-fill-mode: forwards; `; diff --git a/packages/blade/src/components/StepGroup/StepItem.web.tsx b/packages/blade/src/components/StepGroup/StepItem.web.tsx index adc4313a6b5..4be3511860c 100644 --- a/packages/blade/src/components/StepGroup/StepItem.web.tsx +++ b/packages/blade/src/components/StepGroup/StepItem.web.tsx @@ -43,7 +43,7 @@ const InteractiveItemHeaderBox = styled.button((prop : props.theme.colors.transparent, borderRadius: props.theme.border.radius.medium, width: '100%', - transition: `background-color ${props.theme.motion.duration.xquick} ${props.theme.motion.easing.standard.effective}`, + transition: `background-color ${props.theme.motion.duration.xquick} ${props.theme.motion.easing.standard}`, ':not([disabled]):hover': { backgroundColor: props.isSelected ? props.theme.colors.interactive.background.primary.fadedHighlighted diff --git a/packages/blade/src/components/Switch/AnimatedThumbIcon.web.tsx b/packages/blade/src/components/Switch/AnimatedThumbIcon.web.tsx index 07b82d64396..4425e8d84a4 100644 --- a/packages/blade/src/components/Switch/AnimatedThumbIcon.web.tsx +++ b/packages/blade/src/components/Switch/AnimatedThumbIcon.web.tsx @@ -11,7 +11,7 @@ const AnimatedThumbIcon = styled(Svg)<{ isChecked?: boolean }>(({ isChecked, the return { transitionDuration: `${makeMotionTime(duration)}`, transitionTimingFunction: easing, - transitionDelay: isChecked ? `${makeMotionTime(theme.motion.delay['2xshort'])}` : `0ms`, + transitionDelay: isChecked ? `${makeMotionTime(theme.motion.delay['2xquick'])}` : `0ms`, opacity: isChecked ? 1 : 0, }; }); diff --git a/packages/blade/src/components/Switch/getTrackStyles.ts b/packages/blade/src/components/Switch/getTrackStyles.ts index 4547267d28e..d7a38ec6d09 100644 --- a/packages/blade/src/components/Switch/getTrackStyles.ts +++ b/packages/blade/src/components/Switch/getTrackStyles.ts @@ -42,7 +42,7 @@ const getTrackStyles = ({ height, borderRadius: makeSize(theme.border.radius.max), backgroundColor, - transitionTimingFunction: `${theme.motion.easing.standard.effective}`, + transitionTimingFunction: `${theme.motion.easing.standard}`, transitionDuration: isReactNative() ? undefined : `${makeMotionTime(theme.motion.duration['2xquick'])}`, diff --git a/packages/blade/src/components/Switch/switchTokens.ts b/packages/blade/src/components/Switch/switchTokens.ts index 0d900d4ba98..c921e855a7c 100644 --- a/packages/blade/src/components/Switch/switchTokens.ts +++ b/packages/blade/src/components/Switch/switchTokens.ts @@ -82,14 +82,14 @@ const switchColors = { const switchMotion = { easing: { - thumb: 'motion.easing.standard.effective', - thumbIcon: 'motion.easing.standard.effective', - track: 'motion.easing.standard.effective', + thumb: 'motion.easing.standard', + thumbIcon: 'motion.easing.standard', + track: 'motion.easing.standard', }, duration: { - thumb: 'motion.duration.xquick', - thumbIcon: 'motion.duration.xquick', - track: 'motion.duration.xquick', + thumb: 'motion.duration.quick', + thumbIcon: 'motion.duration.quick', + track: 'motion.duration.quick', }, } as const; diff --git a/packages/blade/src/components/Table/Table.web.tsx b/packages/blade/src/components/Table/Table.web.tsx index 9125178c311..93be84157fc 100644 --- a/packages/blade/src/components/Table/Table.web.tsx +++ b/packages/blade/src/components/Table/Table.web.tsx @@ -111,9 +111,9 @@ const RefreshWrapper = styled(BaseBox)<{ opacity: isRefreshSpinnerVisible ? 1 : 0, transition: `opacity ${makeMotionTime(theme.motion.duration.quick)} ${ isRefreshSpinnerEntering - ? theme.motion.easing.entrance.effective + ? theme.motion.easing.entrance : isRefreshSpinnerExiting - ? theme.motion.easing.exit.effective + ? theme.motion.easing.exit : '' }`, }; diff --git a/packages/blade/src/components/Table/tokens.ts b/packages/blade/src/components/Table/tokens.ts index ebdedd5def3..206371de5cf 100644 --- a/packages/blade/src/components/Table/tokens.ts +++ b/packages/blade/src/components/Table/tokens.ts @@ -88,14 +88,14 @@ const tableRow = { }, borderBottomWidth: 'thin', borderColor: 'surface.border.gray.muted', - backgroundColorMotionEasing: 'easing.standard.effective', + backgroundColorMotionEasing: 'easing.standard', backgroundColorMotionDuration: 'duration.xquick', } as const; const tableToolbar = { backgroundColor: 'transparent', backgroundColorSelected: 'interactive.background.primary.faded', - backgroundColorMotionEasing: 'easing.standard.effective', + backgroundColorMotionEasing: 'easing.standard', backgroundColorMotionDuration: 'duration.xquick', } as const; diff --git a/packages/blade/src/components/Tabs/TabIndicator.web.tsx b/packages/blade/src/components/Tabs/TabIndicator.web.tsx index 76806f9a3b9..4cef7e04a9d 100644 --- a/packages/blade/src/components/Tabs/TabIndicator.web.tsx +++ b/packages/blade/src/components/Tabs/TabIndicator.web.tsx @@ -100,7 +100,7 @@ const TabIndicator = ({ transitionDuration: hasMeasured ? castWebType(makeMotionTime(theme.motion.duration.gentle)) : '0ms', - transitionTimingFunction: castWebType(theme.motion.easing.standard.effective), + transitionTimingFunction: castWebType(theme.motion.easing.standard), }; if (variant === 'filled') { diff --git a/packages/blade/src/components/Tabs/TabItem.web.tsx b/packages/blade/src/components/Tabs/TabItem.web.tsx index 5293b30a248..71335ea4097 100644 --- a/packages/blade/src/components/Tabs/TabItem.web.tsx +++ b/packages/blade/src/components/Tabs/TabItem.web.tsx @@ -88,11 +88,11 @@ const StyledTabButton = styled.button<{ }, transitionProperty: 'all', - transitionTimingFunction: castWebType(theme.motion.easing.standard.effective), + transitionTimingFunction: castWebType(theme.motion.easing.standard), transitionDuration: castWebType(makeMotionTime(theme.motion.duration.gentle)), '*': { transitionProperty: 'color, fill', - transitionTimingFunction: castWebType(theme.motion.easing.standard.effective), + transitionTimingFunction: castWebType(theme.motion.easing.standard), transitionDuration: castWebType(makeMotionTime(theme.motion.duration.xquick)), }, }; diff --git a/packages/blade/src/components/Tag/AnimatedTag.native.tsx b/packages/blade/src/components/Tag/AnimatedTag.native.tsx index b8d51273536..635db1201e0 100644 --- a/packages/blade/src/components/Tag/AnimatedTag.native.tsx +++ b/packages/blade/src/components/Tag/AnimatedTag.native.tsx @@ -40,7 +40,7 @@ const useAnimatedTag = ( }, 100: { opacity: TAG_OPACITY_START, - easing: (theme.motion.easing.exit.effective as unknown) as EasingFn, + easing: (theme.motion.easing.exit as unknown) as EasingFn, }, }).duration(makeMotionTime(theme.motion.duration.xquick)); @@ -49,7 +49,7 @@ const useAnimatedTag = ( TAG_MAX_WIDTH_END, { duration: makeMotionTime(theme.motion.duration.xquick), - easing: castNativeType(theme.motion.easing.exit.effective), + easing: castNativeType(theme.motion.easing.exit), }, (isComplete) => { if (isComplete) { diff --git a/packages/blade/src/components/Tag/AnimatedTag.web.tsx b/packages/blade/src/components/Tag/AnimatedTag.web.tsx index fcb87568d64..b0b27aa7251 100644 --- a/packages/blade/src/components/Tag/AnimatedTag.web.tsx +++ b/packages/blade/src/components/Tag/AnimatedTag.web.tsx @@ -61,12 +61,12 @@ const AnimatedTag = ({ const hideTagTransition = css` animation: ${tagDissappearKeyframe} ${makeMotionTime(theme.motion.duration.xquick)} - ${String(theme.motion.easing.exit.effective)}; + ${String(theme.motion.easing.exit)}; `; const showTagTransition = css` animation: ${tagShowKeyframe} ${makeMotionTime(theme.motion.duration.xquick)} - ${String(theme.motion.easing.entrance.effective)}; + ${String(theme.motion.easing.entrance)}; `; return ( diff --git a/packages/blade/src/components/Toast/Toast.web.tsx b/packages/blade/src/components/Toast/Toast.web.tsx index 7c4bfba4227..d368dc02e26 100644 --- a/packages/blade/src/components/Toast/Toast.web.tsx +++ b/packages/blade/src/components/Toast/Toast.web.tsx @@ -108,13 +108,13 @@ const Toast = ({ const enter = css` opacity: 0; animation: ${slideIn} ${makeMotionTime(theme.motion.duration.gentle)} - ${castWebType(theme.motion.easing.entrance.effective)} forwards; + ${castWebType(theme.motion.easing.entrance)} forwards; `; const exit = css` opacity: 1; animation: ${slideOut} ${makeMotionTime(theme.motion.duration.moderate)} - ${castWebType(theme.motion.easing.exit.effective)} forwards; + ${castWebType(theme.motion.easing.exit)} forwards; `; return ( diff --git a/packages/blade/src/components/Toast/ToastContainer.web.tsx b/packages/blade/src/components/Toast/ToastContainer.web.tsx index 38856a93d7a..e77e1d63a74 100644 --- a/packages/blade/src/components/Toast/ToastContainer.web.tsx +++ b/packages/blade/src/components/Toast/ToastContainer.web.tsx @@ -77,9 +77,7 @@ const getPositionStyle = ( display: 'flex', position: 'absolute', transformOrigin: 'center', - transition: `${makeMotionTime(theme.motion.duration.gentle)} ${ - theme.motion.easing.standard.effective - }`, + transition: `${makeMotionTime(theme.motion.duration.gentle)} ${theme.motion.easing.standard}`, transitionProperty: 'transform, opacity, height', transform: `translateY(${offset * (top ? 1 : -1)}px) scale(${scale})`, ...verticalStyle, diff --git a/packages/blade/src/components/Tooltip/TooltipContentWrapper.native.tsx b/packages/blade/src/components/Tooltip/TooltipContentWrapper.native.tsx index deb296cf6a7..f8f6a2de1f8 100644 --- a/packages/blade/src/components/Tooltip/TooltipContentWrapper.native.tsx +++ b/packages/blade/src/components/Tooltip/TooltipContentWrapper.native.tsx @@ -35,7 +35,7 @@ const TooltipContentWrapper = React.forwardRef const translate = useSharedValue(offset); const opacity = useSharedValue(0); - const easing = (theme.motion.easing.entrance.effective as unknown) as EasingFn; + const easing = (theme.motion.easing.entrance as unknown) as EasingFn; const duration = theme.motion.duration.quick; React.useEffect(() => { diff --git a/packages/blade/src/components/TopNav/TabNav/TabNavItem.web.tsx b/packages/blade/src/components/TopNav/TabNav/TabNavItem.web.tsx index f911864bc2a..45b4ede9a4f 100644 --- a/packages/blade/src/components/TopNav/TabNav/TabNavItem.web.tsx +++ b/packages/blade/src/components/TopNav/TabNav/TabNavItem.web.tsx @@ -76,9 +76,7 @@ const StyledTabNavItemWrapper = styled(BaseBox)<{ borderBottomWidth: 0, borderTopLeftRadius: makeBorderSize(theme.border.radius.medium), borderTopRightRadius: makeBorderSize(theme.border.radius.medium), - transition: `${makeMotionTime(theme.motion.duration.moderate)} ${ - theme.motion.easing.standard.effective - }`, + transition: `${makeMotionTime(theme.motion.duration.moderate)} ${theme.motion.easing.standard}`, transitionProperty: 'background', // Hide the left and right divider by overlaying them with a pseudo element as same color as the background @@ -109,9 +107,7 @@ const SelectedBar = styled(BaseBox)<{ isActive?: boolean }>(({ theme, isActive } pointerEvents: 'none', // Animation opacity: isActive ? 1 : 0, - transition: `${makeMotionTime(theme.motion.duration.moderate)} ${ - theme.motion.easing.standard.effective - }`, + transition: `${makeMotionTime(theme.motion.duration.moderate)} ${theme.motion.easing.standard}`, transitionProperty: 'opacity', }; }); diff --git a/packages/blade/src/storybook-recipes/ThemePlayground/Checkout/CheckoutHome.tsx b/packages/blade/src/storybook-recipes/ThemePlayground/Checkout/CheckoutHome.tsx index eb659180aa7..948edf3a958 100644 --- a/packages/blade/src/storybook-recipes/ThemePlayground/Checkout/CheckoutHome.tsx +++ b/packages/blade/src/storybook-recipes/ThemePlayground/Checkout/CheckoutHome.tsx @@ -64,7 +64,7 @@ const ClickableRow = styled.button(({ theme }) => ({ width: '100%', borderBottom: `2px solid ${theme.colors.surface.border.gray.muted}`, transition: `background-color ${makeMotionTime(theme.motion.duration.gentle)} ${ - theme.motion.easing.standard.revealing + theme.motion.easing.emphasized }}`, padding: `${makeSpace(theme.spacing[4])} ${makeSpace(theme.spacing[4])}`, '&:hover': { diff --git a/packages/blade/src/tokens/global/motion.ts b/packages/blade/src/tokens/global/motion.ts index 9ec06b2174c..aab4bf6c6c2 100644 --- a/packages/blade/src/tokens/global/motion.ts +++ b/packages/blade/src/tokens/global/motion.ts @@ -1,37 +1,42 @@ -import type { DotNotationMotionStringToken } from '~utils/types'; import type { Platform } from '~utils'; import { makeBezier } from '~utils/makeBezier'; type Duration = { - /** `70` milliseconds */ - '2xquick': 70; - /** `150` milliseconds */ - xquick: 150; + /** `80` milliseconds */ + '2xquick': 80; + /** `160` milliseconds */ + xquick: 160; /** `200` milliseconds */ quick: 200; - /** `250` milliseconds */ - moderate: 250; - /** `300` milliseconds */ - xmoderate: 300; - /** `400` milliseconds */ - gentle: 400; - /** `600` milliseconds */ - xgentle: 600; - /** `900` milliseconds */ - '2xgentle': 900; + /** `280` milliseconds */ + moderate: 280; + /** `360` milliseconds */ + xmoderate: 360; + /** `480` milliseconds */ + gentle: 480; + /** `640` milliseconds */ + xgentle: 640; + /** `960` milliseconds */ + '2xgentle': 960; }; type Delay = { - /** `70` milliseconds */ - '2xshort': 70; - /** `120` milliseconds */ - xshort: 120; - /** `180` milliseconds */ - short: 180; + /** `80` milliseconds */ + '2xquick': 80; + /** `160` milliseconds */ + xquick: 160; + /** `280` milliseconds */ + moderate: 280; + /** `480` milliseconds */ + gentle: 480; + /** `960` milliseconds */ + xgentle: 960; + /** `2000` milliseconds */ + long: 2000; /** `3000` milliseconds */ - long: 3000; + xlong: 3000; /** `5000` milliseconds */ - xlong: 5000; + '2xlong': 5000; }; export type EasingFactoryFn = { factory: () => (value: number) => number }; // similar to EasingFactoryFn of `react-native-reanimated` @@ -41,55 +46,68 @@ export type EasingType = Platform.Select<{ }>; type Easing = { - /** Easings for all standard animations*/ - standard: { - /** `cubic-bezier(0.5, 0, 0.3, 1.5)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - attentive: EasingType<'cubic-bezier(0.5, 0, 0.3, 1.5)'>; - /** `cubic-bezier(0.3, 0, 0.2, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - effective: EasingType<'cubic-bezier(0.3, 0, 0.2, 1)'>; - /** `cubic-bezier(0.5, 0, 0, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - revealing: EasingType<'cubic-bezier(0.5, 0, 0, 1)'>; - /** `cubic-bezier(1, 0.5, 0, 0.5)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - wary: EasingType<'cubic-bezier(1, 0.5, 0, 0.5)'>; - }; - /** Easings for all entrance animations*/ - entrance: { - /** `cubic-bezier(0.5, 0, 0.3, 1.5)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - attentive: EasingType<'cubic-bezier(0.5, 0, 0.3, 1.5)'>; - /** `cubic-bezier(0, 0, 0.2, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - effective: EasingType<'cubic-bezier(0, 0, 0.2, 1)'>; - /** `cubic-bezier(0, 0, 0, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - revealing: EasingType<'cubic-bezier(0, 0, 0, 1)'>; - }; - /** Easings for all exit animations*/ - exit: { - /** `cubic-bezier(0.7, 0, 0.5, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - attentive: EasingType<'cubic-bezier(0.7, 0, 0.5, 1)'>; - /** `cubic-bezier(0.17, 0, 1, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - effective: EasingType<'cubic-bezier(0.17, 0, 1, 1)'>; - /** `cubic-bezier(0.5, 0, 1, 1)` - * - * Returns a `string` of `"cubic-bezier(...)"` for web & react-native-reanimated's Easing Function of type `EasingFactoryFn` for native */ - revealing: EasingType<'cubic-bezier(0.5, 0, 1, 1)'>; - }; + /** + * Linear Easing + * + * Use Case: Marquee, Progress Bar, etc + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + linear: EasingType<'cubic-bezier(0, 0, 0, 0)'>; + + /** + * Entrance Animation Easing + * + * Use Case: Entry of modals, drawer, dropdown, etc + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + entrance: EasingType<'cubic-bezier(0, 0, 0.2, 1)'>; + + /** + * Exit Animation Easing + * + * Use Case: Exit of modals, drawer, dropdown, etc + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + exit: EasingType<'cubic-bezier(0.17, 0, 1, 1)'>; + + /** + * Standard Easing + * + * Use Case: Morph + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + standard: EasingType<'cubic-bezier(0.3, 0, 0.2, 1)'>; + + /** + * Emphasized Easing + * + * Use Case: Hover states of interactive items + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + emphasized: EasingType<'cubic-bezier(0.5, 0, 0, 1)'>; + + /** + * Overshoot Easing + * + * Use Case: Toast notifications + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + overshoot: EasingType<'cubic-bezier(0.5, 0, 0.3, 1.5)'>; + + /** + * Error Easing + * + * Use Case: Error States + * + * Returns cubic-bezier string in web and EasingFactoryFn of react-native-reanimated in native + */ + shake: EasingType<'cubic-bezier(1, 0.5, 0, 0.5)'>; }; export type Motion = Readonly<{ @@ -98,47 +116,41 @@ export type Motion = Readonly<{ easing: Easing; }>; -export type EasingString = `easing.${DotNotationMotionStringToken}`; +export type EasingString = `easing.${keyof Easing}`; export type DurationString = `duration.${keyof Duration}`; export type DelayString = `delay.${keyof Delay}`; const delay: Delay = { - '2xshort': 70, - xshort: 120, - short: 180, - long: 3000, - xlong: 5000, + '2xquick': 80, + xquick: 160, + moderate: 280, + gentle: 480, + xgentle: 960, + long: 2000, + xlong: 3000, + '2xlong': 5000, }; const duration: Duration = { - '2xquick': 70, - xquick: 150, + '2xquick': 80, + xquick: 160, quick: 200, - moderate: 250, - xmoderate: 300, - gentle: 400, - xgentle: 600, - '2xgentle': 900, + moderate: 280, + xmoderate: 360, + gentle: 480, + xgentle: 640, + '2xgentle': 960, }; /* makeBezier returns a string of `cubic-bezier()` for web & a react-native-reanimated Easing Function of type `EasingFactoryFn` for native */ const easing: Easing = { - standard: { - attentive: makeBezier(0.5, 0, 0.3, 1.5), - effective: makeBezier(0.3, 0, 0.2, 1), - revealing: makeBezier(0.5, 0, 0, 1), - wary: makeBezier(1, 0.5, 0, 0.5), - }, - entrance: { - attentive: makeBezier(0.5, 0, 0.3, 1.5), - effective: makeBezier(0, 0, 0.2, 1), - revealing: makeBezier(0, 0, 0, 1), - }, - exit: { - attentive: makeBezier(0.7, 0, 0.5, 1), - effective: makeBezier(0.17, 0, 1, 1), - revealing: makeBezier(0.5, 0, 1, 1), - }, + linear: makeBezier(0, 0, 0, 0), + entrance: makeBezier(0, 0, 0.2, 1), + exit: makeBezier(0.17, 0, 1, 1), + standard: makeBezier(0.3, 0, 0.2, 1), + emphasized: makeBezier(0.5, 0, 0, 1), + overshoot: makeBezier(0.5, 0, 0.3, 1.5), + shake: makeBezier(1, 0.5, 0, 0.5), }; export const motion: Motion = { diff --git a/packages/blade/src/utils/getFocusRingStyles/getFocusRingStyles.web.ts b/packages/blade/src/utils/getFocusRingStyles/getFocusRingStyles.web.ts index ff3907c160d..415855f1ec7 100644 --- a/packages/blade/src/utils/getFocusRingStyles/getFocusRingStyles.web.ts +++ b/packages/blade/src/utils/getFocusRingStyles/getFocusRingStyles.web.ts @@ -18,7 +18,7 @@ function getFocusRingStyles({ outlineOffset: `${negativeOffset ? '-4px' : '1px'}${important}`, transitionProperty: 'outline-width', transitionDuration: castWebType(makeMotionTime(theme.motion.duration['2xquick'])), - transitionTimingFunction: castWebType(theme.motion.easing.standard.effective), + transitionTimingFunction: castWebType(theme.motion.easing.standard), } as const; } diff --git a/packages/blade/src/utils/makeMotionTime/makeMotionTime.native.test.ts b/packages/blade/src/utils/makeMotionTime/makeMotionTime.native.test.ts index b9425a60478..190570a89c3 100644 --- a/packages/blade/src/utils/makeMotionTime/makeMotionTime.native.test.ts +++ b/packages/blade/src/utils/makeMotionTime/makeMotionTime.native.test.ts @@ -8,7 +8,7 @@ describe('makeMotionTime', () => { }); it('should return the delay value in `number`', () => { - const delay = makeMotionTime(motion.delay.short); - expect(delay).toEqual(180); + const delay = makeMotionTime(motion.delay.xquick); + expect(delay).toEqual(160); }); }); diff --git a/packages/blade/src/utils/makeMotionTime/makeMotionTime.web.test.ts b/packages/blade/src/utils/makeMotionTime/makeMotionTime.web.test.ts index 33752302787..4af65c24ef1 100644 --- a/packages/blade/src/utils/makeMotionTime/makeMotionTime.web.test.ts +++ b/packages/blade/src/utils/makeMotionTime/makeMotionTime.web.test.ts @@ -4,11 +4,11 @@ import { motion } from '~tokens/global'; describe('makeMotionTime', () => { it('should return the duration value in `ms`', () => { const duration = makeMotionTime(motion.duration.moderate); - expect(duration).toEqual('250ms'); + expect(duration).toEqual('280ms'); }); it('should return the delay value in `ms`', () => { - const delay = makeMotionTime(motion.delay.short); - expect(delay).toEqual('180ms'); + const delay = makeMotionTime(motion.delay.xquick); + expect(delay).toEqual('160ms'); }); }); diff --git a/packages/plugin-figma-blade-coverage/manifest.json b/packages/plugin-figma-blade-coverage/manifest.json index 85481a50ef2..ea001995fa2 100644 --- a/packages/plugin-figma-blade-coverage/manifest.json +++ b/packages/plugin-figma-blade-coverage/manifest.json @@ -1,14 +1,10 @@ { "api": "1.0.0", - "editorType": [ - "figma" - ], + "editorType": ["figma"], "id": "1258393250170675750", "name": "Blade Coverage", "main": "build/main.js", "ui": "build/ui.js", - "permissions": [ - "currentuser" - ], + "permissions": ["currentuser"], "enablePrivatePluginApi": true } diff --git a/packages/widget-figma-dev-handoff-checklist/dev-handoff-checklist/manifest.json b/packages/widget-figma-dev-handoff-checklist/dev-handoff-checklist/manifest.json index 660b73bc005..359b90ae20f 100644 --- a/packages/widget-figma-dev-handoff-checklist/dev-handoff-checklist/manifest.json +++ b/packages/widget-figma-dev-handoff-checklist/dev-handoff-checklist/manifest.json @@ -6,17 +6,11 @@ "capabilities": [], "enableProposedApi": false, "documentAccess": "dynamic-page", - "editorType": [ - "figma" - ], + "editorType": ["figma"], "containsWidget": true, "widgetApi": "1.0.0", - "permissions": [ - "currentuser" - ], + "permissions": ["currentuser"], "networkAccess": { - "allowedDomains": [ - "https://api.segment.io" - ] + "allowedDomains": ["https://api.segment.io"] } -} \ No newline at end of file +} diff --git a/packages/widget-figma-dev-handoff-checklist/snowflake-handoff-checklist/manifest.json b/packages/widget-figma-dev-handoff-checklist/snowflake-handoff-checklist/manifest.json index d00a4ccff8b..c69d09ccb1e 100644 --- a/packages/widget-figma-dev-handoff-checklist/snowflake-handoff-checklist/manifest.json +++ b/packages/widget-figma-dev-handoff-checklist/snowflake-handoff-checklist/manifest.json @@ -9,12 +9,8 @@ "editorType": ["figma"], "containsWidget": true, "widgetApi": "1.0.0", - "permissions": [ - "currentuser" - ], + "permissions": ["currentuser"], "networkAccess": { - "allowedDomains": [ - "https://api.segment.io" - ] + "allowedDomains": ["https://api.segment.io"] } } diff --git a/packages/widget-figma-dev-handoff-checklist/tsconfig.json b/packages/widget-figma-dev-handoff-checklist/tsconfig.json index fd705d83c1e..c0ca991122d 100644 --- a/packages/widget-figma-dev-handoff-checklist/tsconfig.json +++ b/packages/widget-figma-dev-handoff-checklist/tsconfig.json @@ -11,8 +11,12 @@ "strict": true, "skipLibCheck": true, "typeRoots": ["node_modules/@figma", "node_modules/@types"], - "target": "ESNext", + "target": "ESNext" }, - "include": ["components/**/*.tsx", "dev-handoff-checklist/**/*.tsx", "snowflake-handoff-checklist/**/*.tsx"], + "include": [ + "components/**/*.tsx", + "dev-handoff-checklist/**/*.tsx", + "snowflake-handoff-checklist/**/*.tsx" + ], "exclude": ["node_modules"] }