diff --git a/.changeset/tough-nails-explain.md b/.changeset/tough-nails-explain.md
new file mode 100644
index 00000000000..4ad9d303ee9
--- /dev/null
+++ b/.changeset/tough-nails-explain.md
@@ -0,0 +1,5 @@
+---
+'@clerk/clerk-js': patch
+---
+
+Adjust the `` enter/exit animations timing and easings.
diff --git a/packages/clerk-js/src/ui/elements/Drawer.tsx b/packages/clerk-js/src/ui/elements/Drawer.tsx
index d65ebc68991..574bfc82505 100644
--- a/packages/clerk-js/src/ui/elements/Drawer.tsx
+++ b/packages/clerk-js/src/ui/elements/Drawer.tsx
@@ -164,12 +164,9 @@ const Overlay = React.forwardRef((_, ref) => {
position: strategy,
inset: 0,
transitionProperty: 'opacity',
- transitionTimingFunction: transitionTiming.slowBezier,
- },
- duration: {
- open: transitionDurationValues.slower,
- close: transitionDurationValues.slow,
+ transitionTimingFunction: transitionTiming.bezier,
},
+ duration: transitionDurationValues.drawer,
});
if (!isMounted) return null;
@@ -202,19 +199,14 @@ const Content = React.forwardRef(({ children }, re
const mergedRefs = useMergeRefs([ref, refs.setFloating]);
const { isMounted, styles: transitionStyles } = useTransitionStyles(context, {
- initial: { transform: 'translateX(100%)' },
- open: { transform: 'translateX(0)' },
- close: { transform: 'translateX(100%)' },
+ initial: { transform: `translate3d(var(--transform-offset), 0, 0)` },
+ open: { transform: 'translate3d(0, 0, 0)' },
+ close: { transform: `translate3d(var(--transform-offset), 0, 0)` },
common: {
transitionProperty: 'transform',
- transitionTimingFunction: transitionTiming.slowBezier,
+ transitionTimingFunction: transitionTiming.bezier,
},
- duration: isMotionSafe
- ? {
- open: transitionDurationValues.slower,
- close: transitionDurationValues.slow,
- }
- : 0,
+ duration: isMotionSafe ? transitionDurationValues.drawer : 0,
});
if (!isMounted) return null;
@@ -234,6 +226,11 @@ const Content = React.forwardRef(({ children }, re
style={transitionStyles}
direction='col'
sx={t => ({
+ // Apply the conditional right offset + the spread of the
+ // box shadow to ensure it is fully offscreen before unmounting
+ '--transform-offset':
+ strategy === 'fixed' ? `calc(100% + ${t.space.$3} + ${t.space.$8x75})` : `calc(100% + ${t.space.$8x75})`,
+ willChange: 'transform',
position: strategy,
insetBlock: strategy === 'fixed' ? t.space.$3 : 0,
insetInlineEnd: strategy === 'fixed' ? t.space.$3 : 0,
diff --git a/packages/clerk-js/src/ui/foundations/sizes.ts b/packages/clerk-js/src/ui/foundations/sizes.ts
index 6143772ab48..9faf2dded28 100644
--- a/packages/clerk-js/src/ui/foundations/sizes.ts
+++ b/packages/clerk-js/src/ui/foundations/sizes.ts
@@ -23,6 +23,7 @@ const dynamicSpaceUnits = Object.freeze({
'7x5': '1.875rem',
'8': '2rem',
'8x5': '2.125rem',
+ '8x75': '2.1875rem',
'9': '2.25rem',
'10': '2.5rem',
'12': '3rem',
diff --git a/packages/clerk-js/src/ui/foundations/transitions.ts b/packages/clerk-js/src/ui/foundations/transitions.ts
index 55036490418..5ababb0ef22 100644
--- a/packages/clerk-js/src/ui/foundations/transitions.ts
+++ b/packages/clerk-js/src/ui/foundations/transitions.ts
@@ -6,6 +6,7 @@ const transitionDurationValues = Object.freeze({
focusRing: 200,
controls: 100,
textField: 450,
+ drawer: 500,
} as const);
const toMs = (value: number) => `${value}ms`;
@@ -24,6 +25,7 @@ const transitionProperty = Object.freeze({
const transitionTiming = Object.freeze({
common: 'ease',
easeOut: 'ease-out',
+ bezier: 'cubic-bezier(0.32, 0.72, 0, 1)',
slowBezier: 'cubic-bezier(0.16, 1, 0.3, 1)',
} as const);