@fluentui/react-motion 9.11.6 → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,23 @@
1
1
  # Change Log - @fluentui/react-motion
2
2
 
3
- This log was last generated on Thu, 22 Jan 2026 17:01:15 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 25 Feb 2026 13:28:18 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.12.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion_v9.12.0)
8
+
9
+ Wed, 25 Feb 2026 13:28:18 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-motion_v9.11.6..@fluentui/react-motion_v9.12.0)
11
+
12
+ ### Minor changes
13
+
14
+ - feat: export MotionRefForwarder and useMotionForwardedRef for shared motion ref forwarding ([PR #35774](https://github.com/microsoft/fluentui/pull/35774) by robertpenner@microsoft.com)
15
+ - Bump @fluentui/react-shared-contexts to v9.26.2 ([PR #35782](https://github.com/microsoft/fluentui/pull/35782) by beachball)
16
+ - Bump @fluentui/react-utilities to v9.26.2 ([PR #35782](https://github.com/microsoft/fluentui/pull/35782) by beachball)
17
+
7
18
  ## [9.11.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion_v9.11.6)
8
19
 
9
- Thu, 22 Jan 2026 17:01:15 GMT
20
+ Thu, 22 Jan 2026 17:06:32 GMT
10
21
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-motion_v9.11.5..@fluentui/react-motion_v9.11.6)
11
22
 
12
23
  ### Patches
package/dist/index.d.ts CHANGED
@@ -136,6 +136,17 @@ export declare type MotionImperativeRef = {
136
136
  */
137
137
  export declare type MotionParam = boolean | number | string;
138
138
 
139
+ /**
140
+ * A component that forwards a ref to its children via a React context.
141
+ * This is used to pass a motion component's ref through to the actual surface element,
142
+ * since motion components wrap their children and the ref needs to reach the inner element.
143
+ *
144
+ * @internal
145
+ */
146
+ export declare const MotionRefForwarder: React_2.ForwardRefExoticComponent<{
147
+ children: React_2.ReactElement;
148
+ } & React_2.RefAttributes<HTMLElement>>;
149
+
139
150
  export declare const motionTokens: {
140
151
  curveAccelerateMax: "cubic-bezier(0.9,0.1,1,0.2)";
141
152
  curveAccelerateMid: "cubic-bezier(1,0,1,1)";
@@ -283,6 +294,14 @@ export declare type PresenceMotionSlotProps<MotionParams extends Record<string,
283
294
  */
284
295
  declare type PresenceMotionSlotRenderProps = Pick<PresenceComponentProps, 'appear' | 'onMotionFinish' | 'onMotionStart' | 'unmountOnExit' | 'visible'>;
285
296
 
297
+ /**
298
+ * A hook that reads the ref forwarded by `MotionRefForwarder` from context.
299
+ * Used in child components to merge the motion ref into the root slot ref.
300
+ *
301
+ * @internal
302
+ */
303
+ export declare function useMotionForwardedRef(): React_2.Ref<HTMLElement> | undefined;
304
+
286
305
  export declare const usePresenceGroupChildContext: () => PresenceGroupChildContextValue | undefined;
287
306
 
288
307
  export { }
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ const MotionRefForwarderContext = /*#__PURE__*/ React.createContext(undefined);
4
+ /**
5
+ * A hook that reads the ref forwarded by `MotionRefForwarder` from context.
6
+ * Used in child components to merge the motion ref into the root slot ref.
7
+ *
8
+ * @internal
9
+ */ export function useMotionForwardedRef() {
10
+ return React.useContext(MotionRefForwarderContext);
11
+ }
12
+ /**
13
+ * A component that forwards a ref to its children via a React context.
14
+ * This is used to pass a motion component's ref through to the actual surface element,
15
+ * since motion components wrap their children and the ref needs to reach the inner element.
16
+ *
17
+ * @internal
18
+ */ export const MotionRefForwarder = /*#__PURE__*/ React.forwardRef((props, ref)=>{
19
+ return /*#__PURE__*/ React.createElement(MotionRefForwarderContext.Provider, {
20
+ value: ref
21
+ }, props.children);
22
+ });
23
+ MotionRefForwarder.displayName = 'MotionRefForwarder';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MotionRefForwarder.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nconst MotionRefForwarderContext = React.createContext<React.Ref<HTMLElement> | undefined>(undefined);\n\n/**\n * A hook that reads the ref forwarded by `MotionRefForwarder` from context.\n * Used in child components to merge the motion ref into the root slot ref.\n *\n * @internal\n */\nexport function useMotionForwardedRef(): React.Ref<HTMLElement> | undefined {\n return React.useContext(MotionRefForwarderContext);\n}\n\n/**\n * A component that forwards a ref to its children via a React context.\n * This is used to pass a motion component's ref through to the actual surface element,\n * since motion components wrap their children and the ref needs to reach the inner element.\n *\n * @internal\n */\nexport const MotionRefForwarder = React.forwardRef<HTMLElement, { children: React.ReactElement }>((props, ref) => {\n return <MotionRefForwarderContext.Provider value={ref}>{props.children}</MotionRefForwarderContext.Provider>;\n});\n\nMotionRefForwarder.displayName = 'MotionRefForwarder';\n"],"names":["React","MotionRefForwarderContext","createContext","undefined","useMotionForwardedRef","useContext","MotionRefForwarder","forwardRef","props","ref","Provider","value","children","displayName"],"mappings":"AAAA;AAEA,YAAYA,WAAW,QAAQ;AAE/B,MAAMC,0CAA4BD,MAAME,aAAa,CAAqCC;AAE1F;;;;;CAKC,GACD,OAAO,SAASC;IACd,OAAOJ,MAAMK,UAAU,CAACJ;AAC1B;AAEA;;;;;;CAMC,GACD,OAAO,MAAMK,mCAAqBN,MAAMO,UAAU,CAAgD,CAACC,OAAOC;IACxG,qBAAO,oBAACR,0BAA0BS,QAAQ;QAACC,OAAOF;OAAMD,MAAMI,QAAQ;AACxE,GAAG;AAEHN,mBAAmBO,WAAW,GAAG"}
package/lib/index.js CHANGED
@@ -4,6 +4,7 @@ export { createMotionComponentVariant } from './factories/createMotionComponentV
4
4
  export { createPresenceComponent } from './factories/createPresenceComponent';
5
5
  export { createPresenceComponentVariant } from './factories/createPresenceComponentVariant';
6
6
  export { PresenceGroup } from './components/PresenceGroup';
7
+ export { MotionRefForwarder, useMotionForwardedRef } from './components/MotionRefForwarder';
7
8
  export { presenceMotionSlot } from './slots/presenceMotionSlot';
8
9
  export { PresenceGroupChildProvider, usePresenceGroupChildContext } from './contexts/PresenceGroupChildContext';
9
10
  export { MotionBehaviourProvider } from './contexts/MotionBehaviourContext';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { motionTokens, durations, curves } from './motions/motionTokens';\n\nexport {\n createMotionComponent,\n type MotionComponentProps,\n type MotionComponent,\n} from './factories/createMotionComponent';\nexport { createMotionComponentVariant } from './factories/createMotionComponentVariant';\nexport {\n createPresenceComponent,\n type PresenceComponentProps,\n type PresenceComponent,\n} from './factories/createPresenceComponent';\nexport { createPresenceComponentVariant } from './factories/createPresenceComponentVariant';\n\nexport { PresenceGroup } from './components/PresenceGroup';\n\nexport { presenceMotionSlot, type PresenceMotionSlotProps } from './slots/presenceMotionSlot';\n\nexport {\n PresenceGroupChildProvider,\n usePresenceGroupChildContext,\n type PresenceGroupChildContextValue,\n} from './contexts/PresenceGroupChildContext';\n\nexport type {\n AtomMotion,\n AtomMotionFn,\n PresenceMotion,\n PresenceMotionFn,\n PresenceDirection,\n MotionImperativeRef,\n MotionParam,\n} from './types';\n\nexport { MotionBehaviourProvider } from './contexts/MotionBehaviourContext';\n"],"names":["motionTokens","durations","curves","createMotionComponent","createMotionComponentVariant","createPresenceComponent","createPresenceComponentVariant","PresenceGroup","presenceMotionSlot","PresenceGroupChildProvider","usePresenceGroupChildContext","MotionBehaviourProvider"],"mappings":"AAAA,SAASA,YAAY,EAAEC,SAAS,EAAEC,MAAM,QAAQ,yBAAyB;AAEzE,SACEC,qBAAqB,QAGhB,oCAAoC;AAC3C,SAASC,4BAA4B,QAAQ,2CAA2C;AACxF,SACEC,uBAAuB,QAGlB,sCAAsC;AAC7C,SAASC,8BAA8B,QAAQ,6CAA6C;AAE5F,SAASC,aAAa,QAAQ,6BAA6B;AAE3D,SAASC,kBAAkB,QAAsC,6BAA6B;AAE9F,SACEC,0BAA0B,EAC1BC,4BAA4B,QAEvB,uCAAuC;AAY9C,SAASC,uBAAuB,QAAQ,oCAAoC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { motionTokens, durations, curves } from './motions/motionTokens';\n\nexport {\n createMotionComponent,\n type MotionComponentProps,\n type MotionComponent,\n} from './factories/createMotionComponent';\nexport { createMotionComponentVariant } from './factories/createMotionComponentVariant';\nexport {\n createPresenceComponent,\n type PresenceComponentProps,\n type PresenceComponent,\n} from './factories/createPresenceComponent';\nexport { createPresenceComponentVariant } from './factories/createPresenceComponentVariant';\n\nexport { PresenceGroup } from './components/PresenceGroup';\nexport { MotionRefForwarder, useMotionForwardedRef } from './components/MotionRefForwarder';\n\nexport { presenceMotionSlot, type PresenceMotionSlotProps } from './slots/presenceMotionSlot';\n\nexport {\n PresenceGroupChildProvider,\n usePresenceGroupChildContext,\n type PresenceGroupChildContextValue,\n} from './contexts/PresenceGroupChildContext';\n\nexport type {\n AtomMotion,\n AtomMotionFn,\n PresenceMotion,\n PresenceMotionFn,\n PresenceDirection,\n MotionImperativeRef,\n MotionParam,\n} from './types';\n\nexport { MotionBehaviourProvider } from './contexts/MotionBehaviourContext';\n"],"names":["motionTokens","durations","curves","createMotionComponent","createMotionComponentVariant","createPresenceComponent","createPresenceComponentVariant","PresenceGroup","MotionRefForwarder","useMotionForwardedRef","presenceMotionSlot","PresenceGroupChildProvider","usePresenceGroupChildContext","MotionBehaviourProvider"],"mappings":"AAAA,SAASA,YAAY,EAAEC,SAAS,EAAEC,MAAM,QAAQ,yBAAyB;AAEzE,SACEC,qBAAqB,QAGhB,oCAAoC;AAC3C,SAASC,4BAA4B,QAAQ,2CAA2C;AACxF,SACEC,uBAAuB,QAGlB,sCAAsC;AAC7C,SAASC,8BAA8B,QAAQ,6CAA6C;AAE5F,SAASC,aAAa,QAAQ,6BAA6B;AAC3D,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ,kCAAkC;AAE5F,SAASC,kBAAkB,QAAsC,6BAA6B;AAE9F,SACEC,0BAA0B,EAC1BC,4BAA4B,QAEvB,uCAAuC;AAY9C,SAASC,uBAAuB,QAAQ,oCAAoC"}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ function _export(target, all) {
7
+ for(var name in all)Object.defineProperty(target, name, {
8
+ enumerable: true,
9
+ get: all[name]
10
+ });
11
+ }
12
+ _export(exports, {
13
+ MotionRefForwarder: function() {
14
+ return MotionRefForwarder;
15
+ },
16
+ useMotionForwardedRef: function() {
17
+ return useMotionForwardedRef;
18
+ }
19
+ });
20
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
21
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
22
+ const MotionRefForwarderContext = /*#__PURE__*/ _react.createContext(undefined);
23
+ function useMotionForwardedRef() {
24
+ return _react.useContext(MotionRefForwarderContext);
25
+ }
26
+ const MotionRefForwarder = /*#__PURE__*/ _react.forwardRef((props, ref)=>{
27
+ return /*#__PURE__*/ _react.createElement(MotionRefForwarderContext.Provider, {
28
+ value: ref
29
+ }, props.children);
30
+ });
31
+ MotionRefForwarder.displayName = 'MotionRefForwarder';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MotionRefForwarder.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nconst MotionRefForwarderContext = React.createContext<React.Ref<HTMLElement> | undefined>(undefined);\n\n/**\n * A hook that reads the ref forwarded by `MotionRefForwarder` from context.\n * Used in child components to merge the motion ref into the root slot ref.\n *\n * @internal\n */\nexport function useMotionForwardedRef(): React.Ref<HTMLElement> | undefined {\n return React.useContext(MotionRefForwarderContext);\n}\n\n/**\n * A component that forwards a ref to its children via a React context.\n * This is used to pass a motion component's ref through to the actual surface element,\n * since motion components wrap their children and the ref needs to reach the inner element.\n *\n * @internal\n */\nexport const MotionRefForwarder = React.forwardRef<HTMLElement, { children: React.ReactElement }>((props, ref) => {\n return <MotionRefForwarderContext.Provider value={ref}>{props.children}</MotionRefForwarderContext.Provider>;\n});\n\nMotionRefForwarder.displayName = 'MotionRefForwarder';\n"],"names":["MotionRefForwarder","useMotionForwardedRef","MotionRefForwarderContext","React","createContext","undefined","useContext","forwardRef","props","ref","Provider","value","children","displayName"],"mappings":"AAAA;;;;;;;;;;;;IAuBaA,kBAAkB;eAAlBA;;IAXGC,qBAAqB;eAArBA;;;;iEAVO;AAEvB,MAAMC,0CAA4BC,OAAMC,aAAa,CAAqCC;AAQnF,SAASJ;IACd,OAAOE,OAAMG,UAAU,CAACJ;AAC1B;AASO,MAAMF,mCAAqBG,OAAMI,UAAU,CAAgD,CAACC,OAAOC;IACxG,qBAAO,qBAACP,0BAA0BQ,QAAQ;QAACC,OAAOF;OAAMD,MAAMI,QAAQ;AACxE;AAEAZ,mBAAmBa,WAAW,GAAG"}
@@ -12,6 +12,9 @@ _export(exports, {
12
12
  MotionBehaviourProvider: function() {
13
13
  return _MotionBehaviourContext.MotionBehaviourProvider;
14
14
  },
15
+ MotionRefForwarder: function() {
16
+ return _MotionRefForwarder.MotionRefForwarder;
17
+ },
15
18
  PresenceGroup: function() {
16
19
  return _PresenceGroup.PresenceGroup;
17
20
  },
@@ -42,6 +45,9 @@ _export(exports, {
42
45
  presenceMotionSlot: function() {
43
46
  return _presenceMotionSlot.presenceMotionSlot;
44
47
  },
48
+ useMotionForwardedRef: function() {
49
+ return _MotionRefForwarder.useMotionForwardedRef;
50
+ },
45
51
  usePresenceGroupChildContext: function() {
46
52
  return _PresenceGroupChildContext.usePresenceGroupChildContext;
47
53
  }
@@ -52,6 +58,7 @@ const _createMotionComponentVariant = require("./factories/createMotionComponent
52
58
  const _createPresenceComponent = require("./factories/createPresenceComponent");
53
59
  const _createPresenceComponentVariant = require("./factories/createPresenceComponentVariant");
54
60
  const _PresenceGroup = require("./components/PresenceGroup");
61
+ const _MotionRefForwarder = require("./components/MotionRefForwarder");
55
62
  const _presenceMotionSlot = require("./slots/presenceMotionSlot");
56
63
  const _PresenceGroupChildContext = require("./contexts/PresenceGroupChildContext");
57
64
  const _MotionBehaviourContext = require("./contexts/MotionBehaviourContext");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { motionTokens, durations, curves } from './motions/motionTokens';\n\nexport {\n createMotionComponent,\n type MotionComponentProps,\n type MotionComponent,\n} from './factories/createMotionComponent';\nexport { createMotionComponentVariant } from './factories/createMotionComponentVariant';\nexport {\n createPresenceComponent,\n type PresenceComponentProps,\n type PresenceComponent,\n} from './factories/createPresenceComponent';\nexport { createPresenceComponentVariant } from './factories/createPresenceComponentVariant';\n\nexport { PresenceGroup } from './components/PresenceGroup';\n\nexport { presenceMotionSlot, type PresenceMotionSlotProps } from './slots/presenceMotionSlot';\n\nexport {\n PresenceGroupChildProvider,\n usePresenceGroupChildContext,\n type PresenceGroupChildContextValue,\n} from './contexts/PresenceGroupChildContext';\n\nexport type {\n AtomMotion,\n AtomMotionFn,\n PresenceMotion,\n PresenceMotionFn,\n PresenceDirection,\n MotionImperativeRef,\n MotionParam,\n} from './types';\n\nexport { MotionBehaviourProvider } from './contexts/MotionBehaviourContext';\n"],"names":["MotionBehaviourProvider","PresenceGroup","PresenceGroupChildProvider","createMotionComponent","createMotionComponentVariant","createPresenceComponent","createPresenceComponentVariant","curves","durations","motionTokens","presenceMotionSlot","usePresenceGroupChildContext"],"mappings":";;;;;;;;;;;IAmCSA,uBAAuB;eAAvBA,+CAAuB;;IApBvBC,aAAa;eAAbA,4BAAa;;IAKpBC,0BAA0B;eAA1BA,qDAA0B;;IAjB1BC,qBAAqB;eAArBA,4CAAqB;;IAIdC,4BAA4B;eAA5BA,0DAA4B;;IAEnCC,uBAAuB;eAAvBA,gDAAuB;;IAIhBC,8BAA8B;eAA9BA,8DAA8B;;IAbLC,MAAM;eAANA,oBAAM;;IAAjBC,SAAS;eAATA,uBAAS;;IAAvBC,YAAY;eAAZA,0BAAY;;IAiBZC,kBAAkB;eAAlBA,sCAAkB;;IAIzBC,4BAA4B;eAA5BA,uDAA4B;;;8BArBkB;uCAMzC;8CACsC;yCAKtC;gDACwC;+BAEjB;oCAEmC;2CAM1D;wCAYiC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { motionTokens, durations, curves } from './motions/motionTokens';\n\nexport {\n createMotionComponent,\n type MotionComponentProps,\n type MotionComponent,\n} from './factories/createMotionComponent';\nexport { createMotionComponentVariant } from './factories/createMotionComponentVariant';\nexport {\n createPresenceComponent,\n type PresenceComponentProps,\n type PresenceComponent,\n} from './factories/createPresenceComponent';\nexport { createPresenceComponentVariant } from './factories/createPresenceComponentVariant';\n\nexport { PresenceGroup } from './components/PresenceGroup';\nexport { MotionRefForwarder, useMotionForwardedRef } from './components/MotionRefForwarder';\n\nexport { presenceMotionSlot, type PresenceMotionSlotProps } from './slots/presenceMotionSlot';\n\nexport {\n PresenceGroupChildProvider,\n usePresenceGroupChildContext,\n type PresenceGroupChildContextValue,\n} from './contexts/PresenceGroupChildContext';\n\nexport type {\n AtomMotion,\n AtomMotionFn,\n PresenceMotion,\n PresenceMotionFn,\n PresenceDirection,\n MotionImperativeRef,\n MotionParam,\n} from './types';\n\nexport { MotionBehaviourProvider } from './contexts/MotionBehaviourContext';\n"],"names":["MotionBehaviourProvider","MotionRefForwarder","PresenceGroup","PresenceGroupChildProvider","createMotionComponent","createMotionComponentVariant","createPresenceComponent","createPresenceComponentVariant","curves","durations","motionTokens","presenceMotionSlot","useMotionForwardedRef","usePresenceGroupChildContext"],"mappings":";;;;;;;;;;;IAoCSA,uBAAuB;eAAvBA,+CAAuB;;IApBvBC,kBAAkB;eAAlBA,sCAAkB;;IADlBC,aAAa;eAAbA,4BAAa;;IAMpBC,0BAA0B;eAA1BA,qDAA0B;;IAlB1BC,qBAAqB;eAArBA,4CAAqB;;IAIdC,4BAA4B;eAA5BA,0DAA4B;;IAEnCC,uBAAuB;eAAvBA,gDAAuB;;IAIhBC,8BAA8B;eAA9BA,8DAA8B;;IAbLC,MAAM;eAANA,oBAAM;;IAAjBC,SAAS;eAATA,uBAAS;;IAAvBC,YAAY;eAAZA,0BAAY;;IAkBZC,kBAAkB;eAAlBA,sCAAkB;;IAFEC,qBAAqB;eAArBA,yCAAqB;;IAMhDC,4BAA4B;eAA5BA,uDAA4B;;;8BAtBkB;uCAMzC;8CACsC;yCAKtC;gDACwC;+BAEjB;oCAC4B;oCAEO;2CAM1D;wCAYiC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/react-motion",
3
- "version": "9.11.6",
3
+ "version": "9.12.0",
4
4
  "description": "A package with utilities & motion definitions using Web Animations API",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -18,8 +18,8 @@
18
18
  },
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
- "@fluentui/react-shared-contexts": "^9.26.1",
22
- "@fluentui/react-utilities": "^9.26.1",
21
+ "@fluentui/react-shared-contexts": "^9.26.2",
22
+ "@fluentui/react-utilities": "^9.26.2",
23
23
  "@swc/helpers": "^0.5.1"
24
24
  },
25
25
  "peerDependencies": {