@mui/utils 9.0.1 → 9.1.1

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,5 +1,127 @@
1
1
  # [Versions](https://mui.com/material-ui/getting-started/versions/)
2
2
 
3
+ ## 9.1.1
4
+
5
+ <!-- generated comparing v9.1.0..master -->
6
+
7
+ _Jun 11, 2026_
8
+
9
+ A big thanks to the 9 contributors who made this release possible.
10
+
11
+ ### `@mui/material@9.1.1`
12
+
13
+ - [Autocomplete] Update fullWidth prop documentation (#48626) @vipin8797
14
+ - [ButtonBase] Fix focus ripple lingering after blur (#48650) @siriwatknp
15
+ - [InitColorSchemeScript] Server-render in tests for React 19.3 (#48604) @Janpot
16
+ - [Transition] Mount child in same commit when opening from unmounted (#48649) @siriwatknp
17
+
18
+ ### `@mui/styled-engine@9.1.1`
19
+
20
+ - [styled-engine] Prevent enableCssLayer styles from being overridden by unlayered styles (#48603) @Janpot
21
+
22
+ ### Docs
23
+
24
+ - Send SOURCE to Brevo on newsletter subscribe (#48633) @aemartos
25
+ - fix TypeScript heading capitalization (#48619) @ifer47
26
+ - Remove outdated security section (#48628) @oliviertassinari
27
+ - [legal] Update EULA links on website (#48642) @rluzists1
28
+
29
+ ### Core
30
+
31
+ - Update dependencies to resolve Dependabot security alerts (#48641) @Janpot
32
+ - [core-docs] Pin StackBlitz demo vite to v7 and plugin-react to v5 (#48643) @Janpot
33
+ - [code-infra] Port codebase to use tsgo (#48616) @brijeshb42
34
+ - [docs-infra] Fix immutable cache headers for /\_next/static assets (#48655) @brijeshb42
35
+ - [docs-infra] Run link checker during docs build instead of as separate CI step (#48634) @Janpot
36
+ - [docs-infra] Support turbopack for docs (#48569) @brijeshb42
37
+ - [test] Cover docs landing-page composites with Argos (#48589) @LukasTy
38
+
39
+ All contributors of this release in alphabetical order: @aemartos, @brijeshb42, @ifer47, @Janpot, @LukasTy, @oliviertassinari, @rluzists1, @siriwatknp, @vipin8797
40
+
41
+ ## 9.1.0
42
+
43
+ <!-- generated comparing v9.0.1..master -->
44
+
45
+ _Jun 8, 2026_
46
+
47
+ A big thanks to the 15 contributors who made this release possible. Here are some highlights ✨:
48
+
49
+ - ⚙️ Support for the [prefers-reduced-motion](https://mui.com/material-ui/transitions/#reduced-motion) setting.
50
+ - ♿️ Improved support for Windows High Contrast mode with the [enhanceHighContrast](https://mui.com/material-ui/customization/palette/#windows-high-contrast-mode) theme wrapper.
51
+
52
+ ### `@mui/material@9.1.0`
53
+
54
+ - [autocomplete] Enable clearing highlight when mouse leaves popup (#48354) @mj12albert
55
+ - [autocomplete] Fix `freeSolo` controlled values cleared by initial `null` (#48611) @mj12albert
56
+ - [autocomplete] Fix item removal when it receives focus from VoiceOver before using Backspace (#48572) @silviuaavram
57
+ - [autocomplete] Fix `resetHighlightOnMouseLeave` JSdoc (#48536) @mj12albert
58
+ - [autocomplete] Guard against null inputRef during unmount (#48617) @noam3127
59
+ - [badge] Add `aria-hidden` to badge content and polish docs demos (#48471) @mj12albert
60
+ - [badge] Use inline CSS variables for anchorOrigin/overlap positioning (#48549) @siriwatknp
61
+ - [button] Fix customized flex gap styles (#48542) @mj12albert
62
+ - [dialog] Fix unwanted `DialogPaper` focus ring (#48535) @mj12albert
63
+ - [focus trap] Fix incorrect tab order when `tabIndex >= 1` (#48546) @mj12albert
64
+ - [progress] Show runtime errors only once (#48591) @silviuaavram
65
+ - [select] Allow spacebar to select elements (#48615) @silviuaavram
66
+ - [select] Support typeahead when closed (#48563) @mj12albert
67
+ - [step button] Choose higher contrast ripple color for dark mode focus (#48612) @silviuaavram
68
+ - [stepper] Include StepConnector inside Step element (#48492) @silviuaavram
69
+ - [stepper] Proper support for vertical alternativeLabel (#48485) @silviuaavram
70
+ - [tabs] Fix React 18 roving tabindex and dedupe invalid-value warning (#48605) @Janpot
71
+ - [theme] Add HighContrast theme enhancer (#48319) @silviuaavram
72
+ - [timeline item] Fix extra ::before spacing when TimelineOppositeContent is present (#46663) @tyalau
73
+ - [tooltip] Prevent stuck-open tooltip when child becomes disabled (#48606) @Janpot
74
+ - [transitions] Custom `Transition` component (#48325) @mj12albert
75
+ - [transitions] Support `prefers-reduced-motion` (#48357) @mj12albert
76
+
77
+ ### `@mui/utils@9.1.0`
78
+
79
+ - [utils] Prevent prototype pollution in fastDeepAssign (#48580) @Janpot
80
+
81
+ ### Docs
82
+
83
+ - [docs] Add function `slotProps` documentation (#48574) @mj12albert
84
+ - [docs] Clarify styled-components version compatibility (#48533) @nightt5879
85
+ - [docs] Fix broken URLs (#48520) @oliviertassinari
86
+ - [docs] Fix invalid JSON in Zed MCP setup example (#48490) @pavan-sh
87
+ - [docs] Mention release version for enhanceHighContrast (#48609) @silviuaavram
88
+ - [docs] Remove outdated MUI X v8 notification (#48600) @cherniavskii
89
+ - [docs] Remove redundant enhanceHighContrast information (#48632) @silviuaavram
90
+ - [docs-infra] Decrease loaded bundle size on docs (#48584) @brijeshb42
91
+ - [docs-infra] Drop multi-locale plumbing from API pages (#48370) @brijeshb42
92
+ - [docs-infra] Fix Cookie banner heading (#48529) @oliviertassinari
93
+ - [docs-infra] Infinitely cache all static assets (#48627) @brijeshb42
94
+ - [docs-infra] Remove outdated noSEOadvantage entries (#48527) @oliviertassinari
95
+ - [docs-infra] Restore build-only invariant throws via `NEXT_RUNTIME` guard (#48475) @Janpot
96
+ - [docs-infra] Test HTML validation in broken links checker (#48088) @Janpot
97
+ - [docs][icons] Fix Font Awesome Chip demo in dark mode (#48576) @siriwatknp
98
+ - [docs][icons] Remove redundant font awesome demo (#48493) @ZeeshanTamboli
99
+ - [docs][modal] Add nested modal guidance (#46507) @JakeSaterlay
100
+ - [docs][stepper] Fix focus management in examples (#48494) @silviuaavram
101
+
102
+ ### Core
103
+
104
+ - Eslint markdown (#48371) @Janpot
105
+ - [agents] Fix some docs links (#48561) @silviuaavram
106
+ - [blog] Copy editing improvement on v9 announcement blog posts (#48543) @joserodolfofreitas
107
+ - [code-infra] Cleanup unused jss packages (#48590) @brijeshb42
108
+ - [code-infra] Collapse canary workflows into nightly and nightly-cron (#48556) @Janpot
109
+ - [code-infra] Convert @mui/private-theming to TypeScript (#48565) @Janpot
110
+ - [code-infra] Convert @mui/styled-engine to TypeScript (#48544) @Janpot
111
+ - [code-infra] Convert @mui/styled-engine-sc to TypeScript (#48577) @Janpot
112
+ - [code-infra] Fix duplicate resource_class in test_regressions CI job (#48601) @LukasTy
113
+ - [code-infra] Make @mui/internal-docs-utils compatible with TypeScript 6 (#48594) @Janpot
114
+ - [code-infra] Migrate CircleCI jobs to Gen2 resource classes (#48593) @LukasTy
115
+ - [code-infra] Parallelize visual regression screenshots (#48557) @Janpot
116
+ - [code-infra] Run nightly-cron on v7.x (#48579) @Janpot
117
+ - [core] Fix typescript@next typecheck (#48587) @Janpot
118
+ - [pnpm] Add security settings to pnpm-workspace.yaml (#48582) @Janpot
119
+ - [styled-engine-sc] Fix compatibility with Vite and Vitest (#48558) @mj12albert
120
+ - [test] Add axe-core tests for mui-material (#48341) @siriwatknp
121
+ - [test] Configure Tailwind CSS in the visual-regression app (#48575) @Janpot
122
+
123
+ All contributors of this release in alphabetical order: @brijeshb42, @cherniavskii, @JakeSaterlay, @Janpot, @joserodolfofreitas, @LukasTy, @mj12albert, @nightt5879, @noam3127, @oliviertassinari, @pavan-sh, @silviuaavram, @siriwatknp, @tyalau, @ZeeshanTamboli
124
+
3
125
  ## 9.0.1
4
126
 
5
127
  <!-- generated comparing v9.0.0..master -->
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- The MIT License (MIT)
1
+ MIT License
2
2
 
3
3
  Copyright (c) 2014 Call-Em-All
4
4
 
@@ -9,7 +9,6 @@ exports.default = fastDeepAssign;
9
9
  // MIT License
10
10
  // Copyright (c) 2012 - 2022 James Halliday, Josh Duff, and other contributors of deepmerge
11
11
 
12
- /* eslint-disable guard-for-in */
13
12
  /* eslint-disable no-else-return */
14
13
 
15
14
  /**
@@ -43,6 +42,9 @@ function cloneArray(value) {
43
42
  function cloneObject(target) {
44
43
  const result = {};
45
44
  for (const key in target) {
45
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
46
+ continue;
47
+ }
46
48
  result[key] = clone(target[key]);
47
49
  }
48
50
  return result;
@@ -69,6 +71,9 @@ function clone(entry) {
69
71
  }
70
72
  function mergeObject(target, source) {
71
73
  for (const key in source) {
74
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
75
+ continue;
76
+ }
72
77
  if (key in target) {
73
78
  target[key] = fastDeepAssign(target[key], source[key]);
74
79
  } else {
@@ -3,7 +3,6 @@
3
3
  // MIT License
4
4
  // Copyright (c) 2012 - 2022 James Halliday, Josh Duff, and other contributors of deepmerge
5
5
 
6
- /* eslint-disable guard-for-in */
7
6
  /* eslint-disable no-else-return */
8
7
 
9
8
  /**
@@ -37,6 +36,9 @@ function cloneArray(value) {
37
36
  function cloneObject(target) {
38
37
  const result = {};
39
38
  for (const key in target) {
39
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
40
+ continue;
41
+ }
40
42
  result[key] = clone(target[key]);
41
43
  }
42
44
  return result;
@@ -63,6 +65,9 @@ function clone(entry) {
63
65
  }
64
66
  function mergeObject(target, source) {
65
67
  for (const key in source) {
68
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
69
+ continue;
70
+ }
66
71
  if (key in target) {
67
72
  target[key] = fastDeepAssign(target[key], source[key]);
68
73
  } else {
package/index.d.mts CHANGED
@@ -35,6 +35,7 @@ export { default as unstable_useTimeout, Timeout as unstable_Timeout } from "./u
35
35
  export { default as unstable_useOnMount } from "./useOnMount/index.mjs";
36
36
  export { default as unstable_useIsFocusVisible } from "./useIsFocusVisible/index.mjs";
37
37
  export { default as unstable_useForcedRerendering } from "./useForcedRerendering/index.mjs";
38
+ export { default as unstable_useValueAsRef } from "./useValueAsRef/index.mjs";
38
39
  export { default as unstable_isFocusVisible } from "./isFocusVisible/index.mjs";
39
40
  export { default as unstable_getScrollbarSize } from "./getScrollbarSize/index.mjs";
40
41
  export { default as usePreviousProps } from "./usePreviousProps/index.mjs";
package/index.d.ts CHANGED
@@ -35,6 +35,7 @@ export { default as unstable_useTimeout, Timeout as unstable_Timeout } from "./u
35
35
  export { default as unstable_useOnMount } from "./useOnMount/index.js";
36
36
  export { default as unstable_useIsFocusVisible } from "./useIsFocusVisible/index.js";
37
37
  export { default as unstable_useForcedRerendering } from "./useForcedRerendering/index.js";
38
+ export { default as unstable_useValueAsRef } from "./useValueAsRef/index.js";
38
39
  export { default as unstable_isFocusVisible } from "./isFocusVisible/index.js";
39
40
  export { default as unstable_getScrollbarSize } from "./getScrollbarSize/index.js";
40
41
  export { default as usePreviousProps } from "./usePreviousProps/index.js";
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/utils v9.0.1
2
+ * @mui/utils v9.1.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -51,6 +51,7 @@ var _exportNames = {
51
51
  unstable_useOnMount: true,
52
52
  unstable_useIsFocusVisible: true,
53
53
  unstable_useForcedRerendering: true,
54
+ unstable_useValueAsRef: true,
54
55
  unstable_isFocusVisible: true,
55
56
  unstable_getScrollbarSize: true,
56
57
  usePreviousProps: true,
@@ -401,6 +402,12 @@ Object.defineProperty(exports, "unstable_useTimeout", {
401
402
  return _useTimeout.default;
402
403
  }
403
404
  });
405
+ Object.defineProperty(exports, "unstable_useValueAsRef", {
406
+ enumerable: true,
407
+ get: function () {
408
+ return _useValueAsRef.default;
409
+ }
410
+ });
404
411
  Object.defineProperty(exports, "usePreviousProps", {
405
412
  enumerable: true,
406
413
  get: function () {
@@ -449,6 +456,7 @@ var _useTimeout = _interopRequireWildcard(require("./useTimeout"));
449
456
  var _useOnMount = _interopRequireDefault(require("./useOnMount"));
450
457
  var _useIsFocusVisible = _interopRequireDefault(require("./useIsFocusVisible"));
451
458
  var _useForcedRerendering = _interopRequireDefault(require("./useForcedRerendering"));
459
+ var _useValueAsRef = _interopRequireDefault(require("./useValueAsRef"));
452
460
  var _isFocusVisible = _interopRequireDefault(require("./isFocusVisible"));
453
461
  var _getScrollbarSize = _interopRequireDefault(require("./getScrollbarSize"));
454
462
  var _usePreviousProps = _interopRequireDefault(require("./usePreviousProps"));
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/utils v9.0.1
2
+ * @mui/utils v9.1.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -42,6 +42,7 @@ export { default as unstable_useTimeout, Timeout as unstable_Timeout } from "./u
42
42
  export { default as unstable_useOnMount } from "./useOnMount/index.mjs";
43
43
  export { default as unstable_useIsFocusVisible } from "./useIsFocusVisible/index.mjs";
44
44
  export { default as unstable_useForcedRerendering } from "./useForcedRerendering/index.mjs";
45
+ export { default as unstable_useValueAsRef } from "./useValueAsRef/index.mjs";
45
46
  export { default as unstable_isFocusVisible } from "./isFocusVisible/index.mjs";
46
47
  export { default as unstable_getScrollbarSize } from "./getScrollbarSize/index.mjs";
47
48
  export { default as usePreviousProps } from "./usePreviousProps/index.mjs";
@@ -2,5 +2,5 @@ import * as React from 'react';
2
2
  /**
3
3
  * Determines if a given element is a DOM element name (i.e. not a React component).
4
4
  */
5
- declare function isHostComponent(element: React.ElementType): element is "symbol" | "object" | "search" | "big" | "link" | "small" | "sub" | "sup" | "map" | "filter" | "input" | "set" | "base" | "code" | "data" | "time" | "progress" | "stop" | "track" | "source" | "button" | "address" | "center" | "view" | "clipPath" | "marker" | "mask" | "a" | "abbr" | "area" | "article" | "aside" | "audio" | "b" | "bdi" | "bdo" | "blockquote" | "body" | "br" | "canvas" | "caption" | "cite" | "col" | "colgroup" | "datalist" | "dd" | "del" | "details" | "dfn" | "dialog" | "div" | "dl" | "dt" | "em" | "embed" | "fieldset" | "figcaption" | "figure" | "footer" | "form" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "head" | "header" | "hgroup" | "hr" | "html" | "i" | "iframe" | "img" | "ins" | "kbd" | "label" | "legend" | "li" | "main" | "mark" | "menu" | "meta" | "meter" | "nav" | "noscript" | "ol" | "optgroup" | "option" | "output" | "p" | "picture" | "pre" | "q" | "rp" | "rt" | "ruby" | "s" | "samp" | "script" | "section" | "select" | "slot" | "span" | "strong" | "style" | "summary" | "table" | "tbody" | "td" | "template" | "textarea" | "tfoot" | "th" | "thead" | "title" | "tr" | "u" | "ul" | "var" | "video" | "wbr" | "keygen" | "menuitem" | "param" | "animate" | "animateMotion" | "animateTransform" | "circle" | "defs" | "desc" | "ellipse" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "foreignObject" | "g" | "image" | "line" | "linearGradient" | "metadata" | "mpath" | "path" | "pattern" | "polygon" | "polyline" | "radialGradient" | "rect" | "svg" | "switch" | "text" | "textPath" | "tspan" | "use" | "noindex" | "webview";
5
+ declare function isHostComponent(element: React.ElementType): element is "a" | "abbr" | "address" | "animate" | "animateMotion" | "animateTransform" | "area" | "article" | "aside" | "audio" | "b" | "base" | "bdi" | "bdo" | "big" | "blockquote" | "body" | "br" | "button" | "canvas" | "caption" | "center" | "circle" | "cite" | "clipPath" | "code" | "col" | "colgroup" | "data" | "datalist" | "dd" | "defs" | "del" | "desc" | "details" | "dfn" | "dialog" | "div" | "dl" | "dt" | "ellipse" | "em" | "embed" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "fieldset" | "figcaption" | "figure" | "filter" | "footer" | "foreignObject" | "form" | "g" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "head" | "header" | "hgroup" | "hr" | "html" | "i" | "iframe" | "image" | "img" | "input" | "ins" | "kbd" | "keygen" | "label" | "legend" | "li" | "line" | "linearGradient" | "link" | "main" | "map" | "mark" | "marker" | "mask" | "menu" | "menuitem" | "meta" | "metadata" | "meter" | "mpath" | "nav" | "noindex" | "noscript" | "object" | "ol" | "optgroup" | "option" | "output" | "p" | "param" | "path" | "pattern" | "picture" | "polygon" | "polyline" | "pre" | "progress" | "q" | "radialGradient" | "rect" | "rp" | "rt" | "ruby" | "s" | "samp" | "script" | "search" | "section" | "select" | "set" | "slot" | "small" | "source" | "span" | "stop" | "strong" | "style" | "sub" | "summary" | "sup" | "svg" | "switch" | "symbol" | "table" | "tbody" | "td" | "template" | "text" | "textPath" | "textarea" | "tfoot" | "th" | "thead" | "time" | "title" | "tr" | "track" | "tspan" | "u" | "ul" | "use" | "var" | "video" | "view" | "wbr" | "webview";
6
6
  export default isHostComponent;
@@ -2,5 +2,5 @@ import * as React from 'react';
2
2
  /**
3
3
  * Determines if a given element is a DOM element name (i.e. not a React component).
4
4
  */
5
- declare function isHostComponent(element: React.ElementType): element is "symbol" | "object" | "search" | "big" | "link" | "small" | "sub" | "sup" | "map" | "filter" | "input" | "set" | "base" | "code" | "data" | "time" | "progress" | "stop" | "track" | "source" | "button" | "address" | "center" | "view" | "clipPath" | "marker" | "mask" | "a" | "abbr" | "area" | "article" | "aside" | "audio" | "b" | "bdi" | "bdo" | "blockquote" | "body" | "br" | "canvas" | "caption" | "cite" | "col" | "colgroup" | "datalist" | "dd" | "del" | "details" | "dfn" | "dialog" | "div" | "dl" | "dt" | "em" | "embed" | "fieldset" | "figcaption" | "figure" | "footer" | "form" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "head" | "header" | "hgroup" | "hr" | "html" | "i" | "iframe" | "img" | "ins" | "kbd" | "label" | "legend" | "li" | "main" | "mark" | "menu" | "meta" | "meter" | "nav" | "noscript" | "ol" | "optgroup" | "option" | "output" | "p" | "picture" | "pre" | "q" | "rp" | "rt" | "ruby" | "s" | "samp" | "script" | "section" | "select" | "slot" | "span" | "strong" | "style" | "summary" | "table" | "tbody" | "td" | "template" | "textarea" | "tfoot" | "th" | "thead" | "title" | "tr" | "u" | "ul" | "var" | "video" | "wbr" | "keygen" | "menuitem" | "param" | "animate" | "animateMotion" | "animateTransform" | "circle" | "defs" | "desc" | "ellipse" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "foreignObject" | "g" | "image" | "line" | "linearGradient" | "metadata" | "mpath" | "path" | "pattern" | "polygon" | "polyline" | "radialGradient" | "rect" | "svg" | "switch" | "text" | "textPath" | "tspan" | "use" | "noindex" | "webview";
5
+ declare function isHostComponent(element: React.ElementType): element is "a" | "abbr" | "address" | "animate" | "animateMotion" | "animateTransform" | "area" | "article" | "aside" | "audio" | "b" | "base" | "bdi" | "bdo" | "big" | "blockquote" | "body" | "br" | "button" | "canvas" | "caption" | "center" | "circle" | "cite" | "clipPath" | "code" | "col" | "colgroup" | "data" | "datalist" | "dd" | "defs" | "del" | "desc" | "details" | "dfn" | "dialog" | "div" | "dl" | "dt" | "ellipse" | "em" | "embed" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "fieldset" | "figcaption" | "figure" | "filter" | "footer" | "foreignObject" | "form" | "g" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "head" | "header" | "hgroup" | "hr" | "html" | "i" | "iframe" | "image" | "img" | "input" | "ins" | "kbd" | "keygen" | "label" | "legend" | "li" | "line" | "linearGradient" | "link" | "main" | "map" | "mark" | "marker" | "mask" | "menu" | "menuitem" | "meta" | "metadata" | "meter" | "mpath" | "nav" | "noindex" | "noscript" | "object" | "ol" | "optgroup" | "option" | "output" | "p" | "param" | "path" | "pattern" | "picture" | "polygon" | "polyline" | "pre" | "progress" | "q" | "radialGradient" | "rect" | "rp" | "rt" | "ruby" | "s" | "samp" | "script" | "search" | "section" | "select" | "set" | "slot" | "small" | "source" | "span" | "stop" | "strong" | "style" | "sub" | "summary" | "sup" | "svg" | "switch" | "symbol" | "table" | "tbody" | "td" | "template" | "text" | "textPath" | "textarea" | "tfoot" | "th" | "thead" | "time" | "title" | "tr" | "track" | "tspan" | "u" | "ul" | "use" | "var" | "video" | "view" | "wbr" | "webview";
6
6
  export default isHostComponent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/utils",
3
- "version": "9.0.1",
3
+ "version": "9.1.1",
4
4
  "author": "MUI Team",
5
5
  "description": "Utility functions for React components.",
6
6
  "license": "MIT",
@@ -28,8 +28,8 @@
28
28
  "@types/prop-types": "^15.7.15",
29
29
  "clsx": "^2.1.1",
30
30
  "prop-types": "^15.8.1",
31
- "react-is": "^19.2.4",
32
- "@mui/types": "^9.0.0"
31
+ "react-is": "^19.2.6",
32
+ "@mui/types": "^9.1.1"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
@@ -904,6 +904,20 @@
904
904
  "default": "./useTimeout/index.mjs"
905
905
  }
906
906
  },
907
+ "./useValueAsRef": {
908
+ "import": {
909
+ "types": "./useValueAsRef/index.d.mts",
910
+ "default": "./useValueAsRef/index.mjs"
911
+ },
912
+ "require": {
913
+ "types": "./useValueAsRef/index.d.ts",
914
+ "default": "./useValueAsRef/index.js"
915
+ },
916
+ "default": {
917
+ "types": "./useValueAsRef/index.d.mts",
918
+ "default": "./useValueAsRef/index.mjs"
919
+ }
920
+ },
907
921
  "./visuallyHidden": {
908
922
  "import": {
909
923
  "types": "./visuallyHidden/index.d.mts",
@@ -36,10 +36,10 @@ function useRovingTabIndexRoot(params) {
36
36
  wrap = true
37
37
  } = params;
38
38
  const [activeItemIdState, setActiveItemIdState] = React.useState(activeItemIdProp);
39
- const previousActiveItemIdPropRef = React.useRef(activeItemIdProp);
39
+ const [previousActiveItemIdProp, setPreviousActiveItemIdProp] = React.useState(activeItemIdProp);
40
40
  let activeItemIdCandidate = activeItemIdState;
41
- if (activeItemIdProp !== previousActiveItemIdPropRef.current) {
42
- previousActiveItemIdPropRef.current = activeItemIdProp;
41
+ if (activeItemIdProp !== previousActiveItemIdProp) {
42
+ setPreviousActiveItemIdProp(activeItemIdProp);
43
43
  if (activeItemIdProp !== undefined && activeItemIdProp !== activeItemIdState) {
44
44
  activeItemIdCandidate = activeItemIdProp;
45
45
  setActiveItemIdState(activeItemIdProp);
@@ -27,10 +27,10 @@ export function useRovingTabIndexRoot(params) {
27
27
  wrap = true
28
28
  } = params;
29
29
  const [activeItemIdState, setActiveItemIdState] = React.useState(activeItemIdProp);
30
- const previousActiveItemIdPropRef = React.useRef(activeItemIdProp);
30
+ const [previousActiveItemIdProp, setPreviousActiveItemIdProp] = React.useState(activeItemIdProp);
31
31
  let activeItemIdCandidate = activeItemIdState;
32
- if (activeItemIdProp !== previousActiveItemIdPropRef.current) {
33
- previousActiveItemIdPropRef.current = activeItemIdProp;
32
+ if (activeItemIdProp !== previousActiveItemIdProp) {
33
+ setPreviousActiveItemIdProp(activeItemIdProp);
34
34
  if (activeItemIdProp !== undefined && activeItemIdProp !== activeItemIdState) {
35
35
  activeItemIdCandidate = activeItemIdProp;
36
36
  setActiveItemIdState(activeItemIdProp);
@@ -0,0 +1 @@
1
+ export { default } from "./useValueAsRef.mjs";
@@ -0,0 +1 @@
1
+ export { default } from "./useValueAsRef.js";
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _useValueAsRef.default;
11
+ }
12
+ });
13
+ var _useValueAsRef = _interopRequireDefault(require("./useValueAsRef"));
@@ -0,0 +1 @@
1
+ export { default } from "./useValueAsRef.mjs";
@@ -0,0 +1,14 @@
1
+ interface ValueRef<T> {
2
+ current: T;
3
+ next: T;
4
+ effect: () => void;
5
+ }
6
+ /**
7
+ * Copied from `@base-ui/utils/useValueAsRef`.
8
+ *
9
+ * Stores the latest value in a stable ref. The ref updates after React commits,
10
+ * so effects and delayed callbacks can read the current value without depending
11
+ * on it and rerunning.
12
+ */
13
+ export default function useValueAsRef<T>(value: T): ValueRef<T>;
14
+ export {};
@@ -0,0 +1,14 @@
1
+ interface ValueRef<T> {
2
+ current: T;
3
+ next: T;
4
+ effect: () => void;
5
+ }
6
+ /**
7
+ * Copied from `@base-ui/utils/useValueAsRef`.
8
+ *
9
+ * Stores the latest value in a stable ref. The ref updates after React commits,
10
+ * so effects and delayed callbacks can read the current value without depending
11
+ * on it and rerunning.
12
+ */
13
+ export default function useValueAsRef<T>(value: T): ValueRef<T>;
14
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = useValueAsRef;
9
+ var _useEnhancedEffect = _interopRequireDefault(require("../useEnhancedEffect/useEnhancedEffect"));
10
+ var _useLazyRef = _interopRequireDefault(require("../useLazyRef/useLazyRef"));
11
+ /**
12
+ * Copied from `@base-ui/utils/useValueAsRef`.
13
+ *
14
+ * Stores the latest value in a stable ref. The ref updates after React commits,
15
+ * so effects and delayed callbacks can read the current value without depending
16
+ * on it and rerunning.
17
+ */
18
+ function useValueAsRef(value) {
19
+ const latest = (0, _useLazyRef.default)(() => createValueRef(value)).current;
20
+ latest.next = value;
21
+
22
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- effect never changes; it reads latest.next.
23
+ (0, _useEnhancedEffect.default)(latest.effect);
24
+ return latest;
25
+ }
26
+ function createValueRef(value) {
27
+ const latest = {
28
+ current: value,
29
+ next: value,
30
+ effect: () => {
31
+ latest.current = latest.next;
32
+ }
33
+ };
34
+ return latest;
35
+ }
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+
3
+ import useEnhancedEffect from "../useEnhancedEffect/useEnhancedEffect.mjs";
4
+ import useLazyRef from "../useLazyRef/useLazyRef.mjs";
5
+ /**
6
+ * Copied from `@base-ui/utils/useValueAsRef`.
7
+ *
8
+ * Stores the latest value in a stable ref. The ref updates after React commits,
9
+ * so effects and delayed callbacks can read the current value without depending
10
+ * on it and rerunning.
11
+ */
12
+ export default function useValueAsRef(value) {
13
+ const latest = useLazyRef(() => createValueRef(value)).current;
14
+ latest.next = value;
15
+
16
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- effect never changes; it reads latest.next.
17
+ useEnhancedEffect(latest.effect);
18
+ return latest;
19
+ }
20
+ function createValueRef(value) {
21
+ const latest = {
22
+ current: value,
23
+ next: value,
24
+ effect: () => {
25
+ latest.current = latest.next;
26
+ }
27
+ };
28
+ return latest;
29
+ }