From cab11f210d8ad980e50180a4f21ddab96dd428b8 Mon Sep 17 00:00:00 2001
From: GitStart <1501599+gitstart@users.noreply.github.com>
Date: Fri, 22 Sep 2023 18:57:27 +0100
Subject: [PATCH] [Skeleton][material-ui] Add new props to the Skeleton
component (#38483)
---
.../material/components/skeleton/Facebook.js | 15 ++-
.../material/components/skeleton/Facebook.tsx | 15 ++-
.../material/components/skeleton/Shapes.js | 13 +++
.../material/components/skeleton/Shapes.tsx | 13 +++
.../components/skeleton/Shapes.tsx.preview | 3 +
.../material/components/skeleton/Sizes.js | 14 +++
.../material/components/skeleton/Sizes.tsx | 14 +++
.../components/skeleton/Sizes.tsx.preview | 4 +
.../components/skeleton/SkeletonChildren.js | 4 +-
.../components/skeleton/SkeletonChildren.tsx | 4 +-
.../components/skeleton/SkeletonColor.js | 3 +-
.../components/skeleton/SkeletonColor.tsx | 3 +-
.../skeleton/SkeletonColor.tsx.preview | 3 +-
.../material/components/skeleton/Variants.js | 16 ---
.../material/components/skeleton/Variants.tsx | 17 ---
.../components/skeleton/Variants.tsx.preview | 7 --
.../material/components/skeleton/YouTube.js | 2 +-
.../material/components/skeleton/YouTube.tsx | 2 +-
.../components/skeleton/skeleton-pt.md | 20 +++-
.../components/skeleton/skeleton-zh.md | 22 ++--
.../material/components/skeleton/skeleton.md | 20 +++-
docs/pages/material-ui/api/skeleton.json | 12 +-
.../api-docs/skeleton/skeleton.json | 17 ++-
.../mui-material/src/Skeleton/Skeleton.d.ts | 16 +++
.../mui-material/src/Skeleton/Skeleton.js | 109 ++++++++++--------
.../src/Skeleton/Skeleton.test.js | 86 ++++++++++++++
.../src/Skeleton/skeletonClasses.ts | 11 +-
27 files changed, 335 insertions(+), 130 deletions(-)
create mode 100644 docs/data/material/components/skeleton/Shapes.js
create mode 100644 docs/data/material/components/skeleton/Shapes.tsx
create mode 100644 docs/data/material/components/skeleton/Shapes.tsx.preview
create mode 100644 docs/data/material/components/skeleton/Sizes.js
create mode 100644 docs/data/material/components/skeleton/Sizes.tsx
create mode 100644 docs/data/material/components/skeleton/Sizes.tsx.preview
delete mode 100644 docs/data/material/components/skeleton/Variants.js
delete mode 100644 docs/data/material/components/skeleton/Variants.tsx
delete mode 100644 docs/data/material/components/skeleton/Variants.tsx.preview
diff --git a/docs/data/material/components/skeleton/Facebook.js b/docs/data/material/components/skeleton/Facebook.js
index eca186ecb4465d..aa5cdd934282ab 100644
--- a/docs/data/material/components/skeleton/Facebook.js
+++ b/docs/data/material/components/skeleton/Facebook.js
@@ -18,7 +18,13 @@ function Media(props) {
+
) : (
{loading ? (
-
+
) : (
+
) : (
{loading ? (
-
+
) : (
+
+
+
+
+ );
+}
diff --git a/docs/data/material/components/skeleton/Shapes.tsx b/docs/data/material/components/skeleton/Shapes.tsx
new file mode 100644
index 00000000000000..814ed30a70e8d3
--- /dev/null
+++ b/docs/data/material/components/skeleton/Shapes.tsx
@@ -0,0 +1,13 @@
+import * as React from 'react';
+import Skeleton from '@mui/material/Skeleton';
+import Stack from '@mui/material/Stack';
+
+export default function Shapes() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/docs/data/material/components/skeleton/Shapes.tsx.preview b/docs/data/material/components/skeleton/Shapes.tsx.preview
new file mode 100644
index 00000000000000..6fa0fbe5152508
--- /dev/null
+++ b/docs/data/material/components/skeleton/Shapes.tsx.preview
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/docs/data/material/components/skeleton/Sizes.js b/docs/data/material/components/skeleton/Sizes.js
new file mode 100644
index 00000000000000..38fcfdc8d7439c
--- /dev/null
+++ b/docs/data/material/components/skeleton/Sizes.js
@@ -0,0 +1,14 @@
+import * as React from 'react';
+import Skeleton from '@mui/material/Skeleton';
+import Stack from '@mui/material/Stack';
+
+export default function Sizes() {
+ return (
+
+ {/* For size="text", adjust the height via font-size */}
+
+ {/* For size="box", adjust height based on bounding box */}
+
+
+ );
+}
diff --git a/docs/data/material/components/skeleton/Sizes.tsx b/docs/data/material/components/skeleton/Sizes.tsx
new file mode 100644
index 00000000000000..38fcfdc8d7439c
--- /dev/null
+++ b/docs/data/material/components/skeleton/Sizes.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react';
+import Skeleton from '@mui/material/Skeleton';
+import Stack from '@mui/material/Stack';
+
+export default function Sizes() {
+ return (
+
+ {/* For size="text", adjust the height via font-size */}
+
+ {/* For size="box", adjust height based on bounding box */}
+
+
+ );
+}
diff --git a/docs/data/material/components/skeleton/Sizes.tsx.preview b/docs/data/material/components/skeleton/Sizes.tsx.preview
new file mode 100644
index 00000000000000..bd2e9812c47488
--- /dev/null
+++ b/docs/data/material/components/skeleton/Sizes.tsx.preview
@@ -0,0 +1,4 @@
+{/* For size="text", adjust the height via font-size */}
+
+{/* For size="box", adjust height based on bounding box */}
+
\ No newline at end of file
diff --git a/docs/data/material/components/skeleton/SkeletonChildren.js b/docs/data/material/components/skeleton/SkeletonChildren.js
index dea54ea2feb889..4238e3ebd076ce 100644
--- a/docs/data/material/components/skeleton/SkeletonChildren.js
+++ b/docs/data/material/components/skeleton/SkeletonChildren.js
@@ -19,7 +19,7 @@ function SkeletonChildrenDemo(props) {
{loading ? (
-
+
) : (
@@ -37,7 +37,7 @@ function SkeletonChildrenDemo(props) {
{loading ? (
-
+
) : (
diff --git a/docs/data/material/components/skeleton/SkeletonChildren.tsx b/docs/data/material/components/skeleton/SkeletonChildren.tsx
index bf27ebb7fad364..cc560617a7862b 100644
--- a/docs/data/material/components/skeleton/SkeletonChildren.tsx
+++ b/docs/data/material/components/skeleton/SkeletonChildren.tsx
@@ -18,7 +18,7 @@ function SkeletonChildrenDemo(props: { loading?: boolean }) {
{loading ? (
-
+
) : (
@@ -36,7 +36,7 @@ function SkeletonChildrenDemo(props: { loading?: boolean }) {
{loading ? (
-
+
) : (
diff --git a/docs/data/material/components/skeleton/SkeletonColor.js b/docs/data/material/components/skeleton/SkeletonColor.js
index ddad47d6302af8..9342f876680276 100644
--- a/docs/data/material/components/skeleton/SkeletonColor.js
+++ b/docs/data/material/components/skeleton/SkeletonColor.js
@@ -15,7 +15,8 @@ export default function SkeletonColor() {
>
diff --git a/docs/data/material/components/skeleton/SkeletonColor.tsx b/docs/data/material/components/skeleton/SkeletonColor.tsx
index ddad47d6302af8..9342f876680276 100644
--- a/docs/data/material/components/skeleton/SkeletonColor.tsx
+++ b/docs/data/material/components/skeleton/SkeletonColor.tsx
@@ -15,7 +15,8 @@ export default function SkeletonColor() {
>
diff --git a/docs/data/material/components/skeleton/SkeletonColor.tsx.preview b/docs/data/material/components/skeleton/SkeletonColor.tsx.preview
index 47ff5795e47d3c..1c90e20e617b1c 100644
--- a/docs/data/material/components/skeleton/SkeletonColor.tsx.preview
+++ b/docs/data/material/components/skeleton/SkeletonColor.tsx.preview
@@ -1,6 +1,7 @@
\ No newline at end of file
diff --git a/docs/data/material/components/skeleton/Variants.js b/docs/data/material/components/skeleton/Variants.js
deleted file mode 100644
index c6a075daad4feb..00000000000000
--- a/docs/data/material/components/skeleton/Variants.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import * as React from 'react';
-import Skeleton from '@mui/material/Skeleton';
-import Stack from '@mui/material/Stack';
-
-export default function Variants() {
- return (
-
- {/* For variant="text", adjust the height via font-size */}
-
- {/* For other variants, adjust the size with `width` and `height` */}
-
-
-
-
- );
-}
diff --git a/docs/data/material/components/skeleton/Variants.tsx b/docs/data/material/components/skeleton/Variants.tsx
deleted file mode 100644
index cb1bb0905d617d..00000000000000
--- a/docs/data/material/components/skeleton/Variants.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import * as React from 'react';
-import Skeleton from '@mui/material/Skeleton';
-import Stack from '@mui/material/Stack';
-
-export default function Variants() {
- return (
-
- {/* For variant="text", adjust the height via font-size */}
-
-
- {/* For other variants, adjust the size with `width` and `height` */}
-
-
-
-
- );
-}
diff --git a/docs/data/material/components/skeleton/Variants.tsx.preview b/docs/data/material/components/skeleton/Variants.tsx.preview
deleted file mode 100644
index 8b1bb76eaa17b2..00000000000000
--- a/docs/data/material/components/skeleton/Variants.tsx.preview
+++ /dev/null
@@ -1,7 +0,0 @@
-{/* For variant="text", adjust the height via font-size */}
-
-
-{/* For other variants, adjust the size with `width` and `height` */}
-
-
-
\ No newline at end of file
diff --git a/docs/data/material/components/skeleton/YouTube.js b/docs/data/material/components/skeleton/YouTube.js
index ad14816a766901..aa9a82aba7fc53 100644
--- a/docs/data/material/components/skeleton/YouTube.js
+++ b/docs/data/material/components/skeleton/YouTube.js
@@ -43,7 +43,7 @@ function Media(props) {
src={item.src}
/>
) : (
-
+
)}
{item ? (
diff --git a/docs/data/material/components/skeleton/YouTube.tsx b/docs/data/material/components/skeleton/YouTube.tsx
index b0ac646c1853fd..fb3800dac24385 100644
--- a/docs/data/material/components/skeleton/YouTube.tsx
+++ b/docs/data/material/components/skeleton/YouTube.tsx
@@ -46,7 +46,7 @@ function Media(props: MediaProps) {
src={item.src}
/>
) : (
-
+
)}
{item ? (
diff --git a/docs/data/material/components/skeleton/skeleton-pt.md b/docs/data/material/components/skeleton/skeleton-pt.md
index 535dcec9ac44a4..dbd07db167c28d 100644
--- a/docs/data/material/components/skeleton/skeleton-pt.md
+++ b/docs/data/material/components/skeleton/skeleton-pt.md
@@ -22,19 +22,27 @@ O componente é projetado para ser usado **diretamente em seus componentes**. Po
item ? (
) : (
-
+
);
}
```
-## Variantes
+## Formas
-The component supports 4 shape variants:
+O componente suporta 3 formas:
-- `text` (default): represents a single line of text (you can adjust the height via font size).
-- `circular`, `rectangular`, and `rounded`: come with different border radius to let you take control of the size.
+- `circular`, `rectangular`, e `rounded`: Venha com um raio de borda diferente para permitir que você assuma o controle da forma.
-{{"demo": "Variants.js"}}
+{{"demo": "Shapes.js"}}
+
+## Tamanhos
+
+Você pode usar os seguintes valores para especificar o tamanho do componente:
+
+- `text` (default): representa uma única linha de texto (você pode ajustar a altura por tamanho da fonte).
+- `box`: Escala o componente para o tamanho da caixa delimitadora.
+
+{{"demo": "Sizes.js"}}
## Animações
diff --git a/docs/data/material/components/skeleton/skeleton-zh.md b/docs/data/material/components/skeleton/skeleton-zh.md
index 4654b4dc0cfdc6..30e94804e49756 100644
--- a/docs/data/material/components/skeleton/skeleton-zh.md
+++ b/docs/data/material/components/skeleton/skeleton-zh.md
@@ -29,19 +29,27 @@ githubLabel: 'component: skeleton'
src={item.src}
/>
) : (
-
+
);
}
```
-## 变体
+## 形状
-The component supports 4 shape variants:
+组件支持 3 种形状:
-- `text` (default): represents a single line of text (you can adjust the height via font size).
-- `circular`, `rectangular`, and `rounded`: come with different border radius to let you take control of the size.
+- `circular`, `rectangular`, 和 `rounded`: 带有不同的边界半径,让您控制形状
-{{"demo": "Variants.js"}}
+{{"demo": "Shapes.js"}}
+
+## 尺寸
+
+您可以使用以下值来指定组件的大小:
+
+- `text` (默认值):表示一行文本(您可以通过字体大小调整高度)。
+- `box`: 将组件扩展到边界框的大小。
+
+{{"demo": "Sizes.js"}}
## 动画
@@ -73,7 +81,7 @@ The component supports 4 shape variants:
```jsx
loading ? (
-
+
) : (
diff --git a/docs/data/material/components/skeleton/skeleton.md b/docs/data/material/components/skeleton/skeleton.md
index da7cacad060fb6..81bd839c55039b 100644
--- a/docs/data/material/components/skeleton/skeleton.md
+++ b/docs/data/material/components/skeleton/skeleton.md
@@ -30,19 +30,27 @@ For instance:
src={item.src}
/>
) : (
-
+
);
}
```
-## Variants
+## Shapes
-The component supports 4 shape variants:
+The component supports 3 shapes:
+
+- `circular`, `rectangular`, and `rounded`: come with different border radius to let you take control of the shape.
+
+{{"demo": "Shapes.js"}}
+
+## Sizes
+
+You can use the following values to specify the size of the component:
- `text` (default): represents a single line of text (you can adjust the height via font size).
-- `circular`, `rectangular`, and `rounded`: come with different border radius to let you take control of the size.
+- `box`: scale the component to the size of the bounding box.
-{{"demo": "Variants.js"}}
+{{"demo": "Sizes.js"}}
## Animations
@@ -76,7 +84,7 @@ infer its width and height from them.
```jsx
loading ? (
-
+
) : (
diff --git a/docs/pages/material-ui/api/skeleton.json b/docs/pages/material-ui/api/skeleton.json
index 0204b0370994ae..ff6da79c3fdf12 100644
--- a/docs/pages/material-ui/api/skeleton.json
+++ b/docs/pages/material-ui/api/skeleton.json
@@ -11,6 +11,13 @@
"classes": { "type": { "name": "object" }, "additionalInfo": { "cssApi": true } },
"component": { "type": { "name": "elementType" } },
"height": { "type": { "name": "union", "description": "number
| string" } },
+ "shape": {
+ "type": {
+ "name": "enum",
+ "description": "'circular'
| 'rectangular'
| 'rounded'"
+ }
+ },
+ "size": { "type": { "name": "enum", "description": "'text'
| 'box'" } },
"sx": {
"type": {
"name": "union",
@@ -23,7 +30,9 @@
"name": "union",
"description": "'circular'
| 'rectangular'
| 'rounded'
| 'text'
| string"
},
- "default": "'text'"
+ "default": "'text'",
+ "deprecated": true,
+ "deprecationInfo": "Use shape
prop to set the shape of the skeleton and size
prop to set the scale adaptation."
},
"width": { "type": { "name": "union", "description": "number
| string" } }
},
@@ -36,6 +45,7 @@
"classes": [
"root",
"text",
+ "box",
"rectangular",
"rounded",
"circular",
diff --git a/docs/translations/api-docs/skeleton/skeleton.json b/docs/translations/api-docs/skeleton/skeleton.json
index 7eeb123f3b37f6..f143b853e7f211 100644
--- a/docs/translations/api-docs/skeleton/skeleton.json
+++ b/docs/translations/api-docs/skeleton/skeleton.json
@@ -12,6 +12,10 @@
"height": {
"description": "Height of the skeleton. Useful when you don't want to adapt the skeleton to a text element but for instance a card."
},
+ "shape": { "description": "The shape of the skeleton." },
+ "size": {
+ "description": "Determines whether the skeleton should scale to the element's text or bounding box."
+ },
"sx": {
"description": "The system prop that allows defining system overrides as well as additional CSS styles."
},
@@ -25,22 +29,27 @@
"text": {
"description": "Styles applied to {{nodeName}} if {{conditions}}.",
"nodeName": "the root element",
- "conditions": "variant=\"text\"
"
+ "conditions": "size=\"text\"
or variant=\"text\"
"
+ },
+ "box": {
+ "description": "Styles applied to {{nodeName}} if {{conditions}}.",
+ "nodeName": "the root element",
+ "conditions": "size=\"box\"
"
},
"rectangular": {
"description": "Styles applied to {{nodeName}} if {{conditions}}.",
"nodeName": "the root element",
- "conditions": "variant=\"rectangular\"
"
+ "conditions": "shape=\"rectangular\"
or variant=\"rectangular\"
"
},
"rounded": {
"description": "Styles applied to {{nodeName}} if {{conditions}}.",
"nodeName": "the root element",
- "conditions": "variant=\"rounded\"
"
+ "conditions": "shape=\"rounded\"
or variant=\"rounded\"
"
},
"circular": {
"description": "Styles applied to {{nodeName}} if {{conditions}}.",
"nodeName": "the root element",
- "conditions": "variant=\"circular\"
"
+ "conditions": "shape=\"circular\"
or variant=\"circular\"
"
},
"pulse": {
"description": "Styles applied to {{nodeName}} if {{conditions}}.",
diff --git a/packages/mui-material/src/Skeleton/Skeleton.d.ts b/packages/mui-material/src/Skeleton/Skeleton.d.ts
index 1d4e9eda13c324..090feef3106453 100644
--- a/packages/mui-material/src/Skeleton/Skeleton.d.ts
+++ b/packages/mui-material/src/Skeleton/Skeleton.d.ts
@@ -7,6 +7,10 @@ import { SkeletonClasses } from './skeletonClasses';
export interface SkeletonPropsVariantOverrides {}
+export interface SkeletonPropsSizeOverrides {}
+
+export interface SkeletonPropsShapeOverrides {}
+
export interface SkeletonOwnProps {
/**
* The animation.
@@ -27,6 +31,17 @@ export interface SkeletonOwnProps {
* Useful when you don't want to adapt the skeleton to a text element but for instance a card.
*/
height?: number | string;
+ /**
+ * The shape of the skeleton.
+ */
+ shape?: OverridableStringUnion<
+ 'rectangular' | 'rounded' | 'circular',
+ SkeletonPropsShapeOverrides
+ >;
+ /**
+ * Determines whether the skeleton should scale to the element's text or bounding box.
+ */
+ size?: OverridableStringUnion<'text' | 'box', SkeletonPropsSizeOverrides>;
/**
* The system prop that allows defining system overrides as well as additional CSS styles.
*/
@@ -34,6 +49,7 @@ export interface SkeletonOwnProps {
/**
* The type of content that will be rendered.
* @default 'text'
+ * @deprecated Use `shape` prop to set the shape of the skeleton and `size` prop to set the scale adaptation.
*/
variant?: OverridableStringUnion<
'text' | 'rectangular' | 'rounded' | 'circular',
diff --git a/packages/mui-material/src/Skeleton/Skeleton.js b/packages/mui-material/src/Skeleton/Skeleton.js
index 3fc8bf1a052627..8c81103f752862 100644
--- a/packages/mui-material/src/Skeleton/Skeleton.js
+++ b/packages/mui-material/src/Skeleton/Skeleton.js
@@ -4,18 +4,19 @@ import clsx from 'clsx';
import PropTypes from 'prop-types';
import { keyframes, css } from '@mui/system';
import { unstable_composeClasses as composeClasses } from '@mui/base/composeClasses';
-import { alpha, unstable_getUnit as getUnit, unstable_toUnitless as toUnitless } from '../styles';
+import { alpha } from '../styles';
import styled from '../styles/styled';
import useThemeProps from '../styles/useThemeProps';
import { getSkeletonUtilityClass } from './skeletonClasses';
const useUtilityClasses = (ownerState) => {
- const { classes, variant, animation, hasChildren, width, height } = ownerState;
+ const { classes, shape, size, animation, hasChildren, width, height } = ownerState;
const slots = {
root: [
'root',
- variant,
+ size,
+ shape,
animation,
hasChildren && 'withChildren',
hasChildren && !width && 'fitContent',
@@ -60,10 +61,10 @@ const SkeletonRoot = styled('span', {
slot: 'Root',
overridesResolver: (props, styles) => {
const { ownerState } = props;
-
return [
styles.root,
- styles[ownerState.variant],
+ ownerState.shape && styles[ownerState.shape],
+ ownerState.size && styles[ownerState.size],
ownerState.animation !== false && styles[ownerState.animation],
ownerState.hasChildren && styles.withChildren,
ownerState.hasChildren && !ownerState.width && styles.fitContent,
@@ -71,51 +72,44 @@ const SkeletonRoot = styled('span', {
];
},
})(
- ({ theme, ownerState }) => {
- const radiusUnit = getUnit(theme.shape.borderRadius) || 'px';
- const radiusValue = toUnitless(theme.shape.borderRadius);
-
- return {
- display: 'block',
- // Create a "on paper" color with sufficient contrast retaining the color
- backgroundColor: theme.vars
- ? theme.vars.palette.Skeleton.bg
- : alpha(theme.palette.text.primary, theme.palette.mode === 'light' ? 0.11 : 0.13),
- height: '1.2em',
- ...(ownerState.variant === 'text' && {
- marginTop: 0,
- marginBottom: 0,
- height: 'auto',
- transformOrigin: '0 55%',
- transform: 'scale(1, 0.60)',
- borderRadius: `${radiusValue}${radiusUnit}/${
- Math.round((radiusValue / 0.6) * 10) / 10
- }${radiusUnit}`,
- '&:empty:before': {
- content: '"\\00a0"',
- },
- }),
- ...(ownerState.variant === 'circular' && {
- borderRadius: '50%',
+ ({ theme, ownerState }) => ({
+ display: 'block',
+ // Create a "on paper" color with sufficient contrast retaining the color
+ backgroundColor: theme.vars
+ ? theme.vars.palette.Skeleton.bg
+ : alpha(theme.palette.text.primary, theme.palette.mode === 'light' ? 0.11 : 0.13),
+ height: '1.2em',
+ borderRadius: (theme.vars || theme).shape.borderRadius,
+ ...(ownerState.size === 'text' && {
+ marginTop: 0,
+ marginBottom: 0,
+ height: 'auto',
+ transformOrigin: '0 55%',
+ transform: 'scale(1, 0.60)',
+ '&:empty:before': {
+ content: '"\\00a0"',
+ },
+ }),
+ ...(ownerState.shape === 'circular' && {
+ borderRadius: '50%',
+ }),
+ ...(ownerState.shape === 'rectangular' && {
+ borderRadius: 0,
+ }),
+ ...(ownerState.hasChildren && {
+ '& > *': {
+ visibility: 'hidden',
+ },
+ }),
+ ...(ownerState.hasChildren &&
+ !ownerState.width && {
+ maxWidth: 'fit-content',
}),
- ...(ownerState.variant === 'rounded' && {
- borderRadius: (theme.vars || theme).shape.borderRadius,
- }),
- ...(ownerState.hasChildren && {
- '& > *': {
- visibility: 'hidden',
- },
+ ...(ownerState.hasChildren &&
+ !ownerState.height && {
+ height: 'auto',
}),
- ...(ownerState.hasChildren &&
- !ownerState.width && {
- maxWidth: 'fit-content',
- }),
- ...(ownerState.hasChildren &&
- !ownerState.height && {
- height: 'auto',
- }),
- };
- },
+ }),
({ ownerState }) =>
ownerState.animation === 'pulse' &&
css`
@@ -156,17 +150,25 @@ const Skeleton = React.forwardRef(function Skeleton(inProps, ref) {
className,
component = 'span',
height,
+ // TODO v6: add defaults
+ shape,
+ size,
style,
variant = 'text',
width,
...other
} = props;
+ const sizeValue = size ?? (variant === 'text' ? variant : undefined);
+ const shapeValue =
+ shape ?? (['circular', 'rectangular', 'rounded'].includes(variant) ? variant : undefined);
+
const ownerState = {
...props,
animation,
component,
- variant,
+ size: sizeValue,
+ shape: shapeValue,
hasChildren: Boolean(other.children),
};
@@ -221,6 +223,14 @@ Skeleton.propTypes /* remove-proptypes */ = {
* Useful when you don't want to adapt the skeleton to a text element but for instance a card.
*/
height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
+ /**
+ * The shape of the skeleton.
+ */
+ shape: PropTypes.oneOf(['circular', 'rectangular', 'rounded']),
+ /**
+ * Determines whether the skeleton should scale to the element's text or bounding box.
+ */
+ size: PropTypes.oneOf(['text', 'box']),
/**
* @ignore
*/
@@ -236,6 +246,7 @@ Skeleton.propTypes /* remove-proptypes */ = {
/**
* The type of content that will be rendered.
* @default 'text'
+ * @deprecated Use `shape` prop to set the shape of the skeleton and `size` prop to set the scale adaptation.
*/
variant: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([
PropTypes.oneOf(['circular', 'rectangular', 'rounded', 'text']),
diff --git a/packages/mui-material/src/Skeleton/Skeleton.test.js b/packages/mui-material/src/Skeleton/Skeleton.test.js
index 41bd8d67eec034..f217b8c8bb7abd 100644
--- a/packages/mui-material/src/Skeleton/Skeleton.test.js
+++ b/packages/mui-material/src/Skeleton/Skeleton.test.js
@@ -67,4 +67,90 @@ describe('', () => {
expect(containerWithHeight.firstChild).not.to.have.class(classes.heightAuto);
});
+
+ describe('Variant Prop', () => {
+ it('should get `text` class when no variant is specified', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.text);
+ });
+
+ it('should get `circular` when variant is set to `circular`', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.circular);
+ });
+
+ it('should get `rounded` when variant is set to `rounded`', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.rounded);
+ });
+
+ it('should get `rectangular` when variant is set to `rectangular`', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.rectangular);
+ });
+ });
+
+ describe('Size & Shape Prop', () => {
+ it('should get `box` class when size is set to `box`', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.box);
+ });
+
+ it('should set `size` prop over `variant` prop', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.box);
+ expect(container.firstChild).not.to.have.class(classes.text);
+ });
+
+ it('should get `circular` when shape is set to `circular`', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.circular);
+ });
+
+ it('should set `shape` prop over `variant` prop', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ expect(container.firstChild).to.have.class(classes.rectangular);
+ expect(container.firstChild).not.to.have.class(classes.rounded);
+ });
+ });
});
diff --git a/packages/mui-material/src/Skeleton/skeletonClasses.ts b/packages/mui-material/src/Skeleton/skeletonClasses.ts
index b57813f9d176b3..b9ad6bacc8ce4f 100644
--- a/packages/mui-material/src/Skeleton/skeletonClasses.ts
+++ b/packages/mui-material/src/Skeleton/skeletonClasses.ts
@@ -4,13 +4,15 @@ import generateUtilityClass from '../generateUtilityClass';
export interface SkeletonClasses {
/** Styles applied to the root element. */
root: string;
- /** Styles applied to the root element if `variant="text"`. */
+ /** Styles applied to the root element if `size="text"` or `variant="text"`. */
text: string;
- /** Styles applied to the root element if `variant="rectangular"`. */
+ /** Styles applied to the root element if `size="box"`. */
+ box: string;
+ /** Styles applied to the root element if `shape="rectangular"` or `variant="rectangular"`. */
rectangular: string;
- /** Styles applied to the root element if `variant="rounded"`. */
+ /** Styles applied to the root element if `shape="rounded"` or `variant="rounded"`. */
rounded: string;
- /** Styles applied to the root element if `variant="circular"`. */
+ /** Styles applied to the root element if `shape="circular"` or `variant="circular"`. */
circular: string;
/** Styles applied to the root element if `animation="pulse"`. */
pulse: string;
@@ -33,6 +35,7 @@ export function getSkeletonUtilityClass(slot: string): string {
const skeletonClasses: SkeletonClasses = generateUtilityClasses('MuiSkeleton', [
'root',
'text',
+ 'box',
'rectangular',
'rounded',
'circular',