Skip to content

Commit

Permalink
[system][docs] Add "dynamic values" section to sx prop page (@aaronga…
Browse files Browse the repository at this point in the history
…rciah) (#42453)

Co-authored-by: Aarón García Hervás <aaron@mui.com>
  • Loading branch information
github-actions[bot] and aarongarciah authored May 30, 2024
1 parent 7be02ec commit 12d87b3
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
38 changes: 38 additions & 0 deletions docs/data/system/getting-started/the-sx-prop/DynamicValues.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import Stack from '@mui/material/Stack';
import Typography from '@mui/material/Typography';

export default function DynamicValues() {
const [color, setColor] = React.useState('#007fff');

return (
<Stack spacing={1} alignItems="center">
<Typography
component="label"
variant="body2"
sx={{ display: 'inline-flex', alignItems: 'center', gap: 1 }}
>
Pick a color to see a live preview
<input
type="color"
value={color}
onChange={(event) => setColor(event.target.value)}
/>
</Typography>
<Box
component="div"
sx={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: 75,
height: 75,
borderRadius: 2,
backgroundColor: 'var(--bg)',
}}
style={{ '--bg': color }}
/>
</Stack>
);
}
38 changes: 38 additions & 0 deletions docs/data/system/getting-started/the-sx-prop/DynamicValues.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import * as React from 'react';
import Box from '@mui/material/Box';
import Stack from '@mui/material/Stack';
import Typography from '@mui/material/Typography';

export default function DynamicValues() {
const [color, setColor] = React.useState('#007fff');

return (
<Stack spacing={1} alignItems="center">
<Typography
component="label"
variant="body2"
sx={{ display: 'inline-flex', alignItems: 'center', gap: 1 }}
>
Pick a color to see a live preview
<input
type="color"
value={color}
onChange={(event) => setColor(event.target.value)}
/>
</Typography>
<Box
component="div"
sx={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: 75,
height: 75,
borderRadius: 2,
backgroundColor: 'var(--bg)',
}}
style={{ '--bg': color } as React.CSSProperties}
/>
</Stack>
);
}
12 changes: 12 additions & 0 deletions docs/data/system/getting-started/the-sx-prop/the-sx-prop.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,18 @@ If you want to receive the `sx` prop from a custom component and pass it down to

{{"demo": "PassingSxProp.js", "bg": true, "defaultCodeOpen": true}}

## Dynamic values

For highly dynamic CSS values, we recommend using inline CSS variables instead of passing an object with varying values to the `sx` prop on each render.
This approach avoids inserting unnecessary `style` tags into the DOM, which prevents potential performance issues when dealing with CSS properties that can hold a wide range of values that change frequently—for example, a color picker with live preview.

:::info
If you're having problems with your Content Security Policy while using inline styles with the `style` attribute, make sure you've enabled the [`style-src-attr` directive](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src-attr).
Visit the [Content Security Policy guide](/material-ui/guides/content-security-policy/) for configuration details.
:::

{{"demo": "DynamicValues.js", "bg": true}}

## TypeScript usage

A frequent source of confusion with the `sx` prop is TypeScript's [type widening](https://mariusschulz.com/blog/literal-type-widening-in-typescript), which causes this example not to work as expected:
Expand Down

0 comments on commit 12d87b3

Please sign in to comment.