diff --git a/change/@fluentui-react-menu-84a7c9b8-4c96-469e-bd81-ab504dc3e1b2.json b/change/@fluentui-react-menu-84a7c9b8-4c96-469e-bd81-ab504dc3e1b2.json
new file mode 100644
index 0000000000000..709bf610084cf
--- /dev/null
+++ b/change/@fluentui-react-menu-84a7c9b8-4c96-469e-bd81-ab504dc3e1b2.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "refactor: migrate slide animation from CSS to motion components with surfaceMotion slot",
+ "packageName": "@fluentui/react-menu",
+ "email": "robertpenner@microsoft.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@fluentui-react-motion-4d715610-504c-4e63-8bb9-87cd24f37cd6.json b/change/@fluentui-react-motion-4d715610-504c-4e63-8bb9-87cd24f37cd6.json
new file mode 100644
index 0000000000000..d671749837db2
--- /dev/null
+++ b/change/@fluentui-react-motion-4d715610-504c-4e63-8bb9-87cd24f37cd6.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "fix: make children optional in MotionRefForwarder to resolve type issue",
+ "packageName": "@fluentui/react-motion",
+ "email": "robertpenner@microsoft.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@fluentui-react-popover-9944ff0a-e3bf-476a-9566-d495eda8b9b3.json b/change/@fluentui-react-popover-9944ff0a-e3bf-476a-9566-d495eda8b9b3.json
new file mode 100644
index 0000000000000..12ba2952478bb
--- /dev/null
+++ b/change/@fluentui-react-popover-9944ff0a-e3bf-476a-9566-d495eda8b9b3.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "refactor: migrate slide animation from CSS to motion components with surfaceMotion slot",
+ "packageName": "@fluentui/react-popover",
+ "email": "robertpenner@microsoft.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@fluentui-react-positioning-21632be5-a50c-4637-a8fc-84ec89d3796f.json b/change/@fluentui-react-positioning-21632be5-a50c-4637-a8fc-84ec89d3796f.json
new file mode 100644
index 0000000000000..48f78b4497c21
--- /dev/null
+++ b/change/@fluentui-react-positioning-21632be5-a50c-4637-a8fc-84ec89d3796f.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "refactor: deprecate createSlideStyles",
+ "packageName": "@fluentui/react-positioning",
+ "email": "robertpenner@microsoft.com",
+ "dependentChangeType": "patch"
+}
diff --git a/packages/charts/react-charts/library/src/components/GanttChart/__snapshots__/GanttChart.test.tsx.snap b/packages/charts/react-charts/library/src/components/GanttChart/__snapshots__/GanttChart.test.tsx.snap
index 6cdabc93cfd57..ab30f5e0acb33 100644
--- a/packages/charts/react-charts/library/src/components/GanttChart/__snapshots__/GanttChart.test.tsx.snap
+++ b/packages/charts/react-charts/library/src/components/GanttChart/__snapshots__/GanttChart.test.tsx.snap
@@ -428,7 +428,7 @@ exports[`GanttChart interaction and accessibility tests should render custom cal
data-popper-reference-hidden=""
data-tabster="{\\"restorer\\":{\\"type\\":0}}"
role="group"
- style="position: absolute; left: 0px; top: 0px; margin: 0px; box-sizing: border-box; max-width: 0px; max-height: -20px; overflow-y: auto; transform: translate(-10px, -40px);"
+ style="position: absolute; left: 0px; top: 0px; margin: 0px; box-sizing: border-box; max-width: 0px; max-height: -20px; overflow-y: auto; transform: translate(-10px, -40px); --fui-positioning-slide-direction-x: 0px; --fui-positioning-slide-direction-y: 1px;"
>
& Pick
& Pick & Pick & {
+export type MenuProps = ComponentProps> & Pick & Pick & {
children: [JSXElement, JSXElement] | JSXElement;
hoverDelay?: number;
inline?: boolean;
@@ -355,7 +356,9 @@ export type MenuProps = ComponentProps & Pick & React_2.FC>;
// @public (undocumented)
-export type MenuSlots = {};
+export type MenuSlots = {
+ surfaceMotion: Slot;
+};
// @public
export const MenuSplitGroup: ForwardRefComponent;
@@ -375,7 +378,7 @@ export type MenuSplitGroupSlots = {
export type MenuSplitGroupState = ComponentState & Pick;
// @public (undocumented)
-export type MenuState = ComponentState & Required> & {
+export type MenuState = ComponentState & Required> & {
contextTarget?: PositioningVirtualElement;
isSubmenu: boolean;
menuPopover: React_2.ReactNode;
diff --git a/packages/react-components/react-menu/library/package.json b/packages/react-components/react-menu/library/package.json
index 74b9c9ad3ec26..d0e9551d50278 100644
--- a/packages/react-components/react-menu/library/package.json
+++ b/packages/react-components/react-menu/library/package.json
@@ -16,6 +16,8 @@
"@fluentui/react-aria": "^9.17.10",
"@fluentui/react-context-selector": "^9.2.15",
"@fluentui/react-icons": "^2.0.245",
+ "@fluentui/react-motion": "^9.11.6",
+ "@fluentui/react-motion-components-preview": "^0.15.0",
"@fluentui/react-portal": "^9.8.11",
"@fluentui/react-positioning": "^9.21.0",
"@fluentui/react-shared-contexts": "^9.26.2",
diff --git a/packages/react-components/react-menu/library/src/components/Menu/Menu.types.ts b/packages/react-components/react-menu/library/src/components/Menu/Menu.types.ts
index 8f843a90ad4f8..ccd3929c2e8ca 100644
--- a/packages/react-components/react-menu/library/src/components/Menu/Menu.types.ts
+++ b/packages/react-components/react-menu/library/src/components/Menu/Menu.types.ts
@@ -1,17 +1,28 @@
import * as React from 'react';
+import type { PresenceMotionSlotProps } from '@fluentui/react-motion';
import { PositioningVirtualElement, SetVirtualMouseTarget } from '@fluentui/react-positioning';
import type { PositioningShorthand } from '@fluentui/react-positioning';
import type { PortalProps } from '@fluentui/react-portal';
-import type { ComponentProps, ComponentState, JSXElement } from '@fluentui/react-utilities';
+import type { ComponentProps, ComponentState, JSXElement, Slot } from '@fluentui/react-utilities';
import type { MenuContextValue } from '../../contexts/menuContext';
import type { MenuListProps } from '../MenuList/MenuList.types';
-export type MenuSlots = {};
+export type MenuSlots = {
+ /**
+ * Slot for the surface motion animation.
+ * For more information refer to the [Motion docs page](https://react.fluentui.dev/?path=/docs/motion-motion-slot--docs).
+ */
+ surfaceMotion: Slot;
+};
+
+export type InternalMenuSlots = {
+ surfaceMotion: NonNullable>;
+};
/**
* Extends and drills down Menulist props to simplify API
*/
-export type MenuProps = ComponentProps &
+export type MenuProps = ComponentProps> &
Pick &
Pick<
MenuListProps,
@@ -91,7 +102,7 @@ export type MenuProps = ComponentProps &
closeOnScroll?: boolean;
};
-export type MenuState = ComponentState &
+export type MenuState = ComponentState &
Required<
Pick<
MenuProps,
diff --git a/packages/react-components/react-menu/library/src/components/Menu/MenuSurfaceMotion.ts b/packages/react-components/react-menu/library/src/components/Menu/MenuSurfaceMotion.ts
new file mode 100644
index 0000000000000..286295197da00
--- /dev/null
+++ b/packages/react-components/react-menu/library/src/components/Menu/MenuSurfaceMotion.ts
@@ -0,0 +1,42 @@
+import { createPresenceComponent, motionTokens } from '@fluentui/react-motion';
+import { fadeAtom, slideAtom } from '@fluentui/react-motion-components-preview';
+import {
+ POSITIONING_SLIDE_DIRECTION_VAR_X as slideDirectionVarX,
+ POSITIONING_SLIDE_DIRECTION_VAR_Y as slideDirectionVarY,
+} from '@fluentui/react-positioning';
+
+// Shared timing constants for the enter animation.
+const duration = motionTokens.durationSlower;
+const easing = motionTokens.curveDecelerateMid;
+
+/**
+ * Default `surfaceMotion` slot for `