Files
react-test/docs/data/joy/customization/theme-shadow/ShadowThemeViewer.js
how2ice 005cf56baf
Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
init project
2025-12-12 14:26:25 +09:00

152 lines
4.3 KiB
JavaScript

import * as React from 'react';
import { styled, extendTheme } from '@mui/joy/styles';
import Box from '@mui/joy/Box';
import Link from '@mui/joy/Link';
import Typography from '@mui/joy/Typography';
import Sheet from '@mui/joy/Sheet';
import LightMode from '@mui/icons-material/LightModeOutlined';
import DarkMode from '@mui/icons-material/DarkModeOutlined';
import Check from '@mui/icons-material/CheckCircle';
import { useClipboardCopy } from '@mui/docs/CodeCopy';
const Table = styled('table')(({ theme }) => ({
border: '1px solid',
borderColor: theme.vars.palette.divider,
borderRadius: theme.vars.radius.md,
borderCollapse: 'separate',
borderSpacing: 0,
width: '100%',
overflowY: 'scroll',
th: {
textAlign: 'left',
padding: 12,
position: 'sticky',
top: 0,
zIndex: 1,
...theme.variants.soft.neutral,
},
td: {
verticalAlign: 'top',
padding: '8px 12px',
},
tr: {
'&:hover': {
backgroundColor: theme.vars.palette.background.level1,
},
'&:first-of-type': {
'& td': { paddingTop: 6 },
},
},
}));
const defaultTheme = extendTheme();
export default function ShadowThemeViewer() {
const { copy, isCopied } = useClipboardCopy();
const tokens = Object.keys(defaultTheme.shadow);
const formatShadowLayers = (shadow) =>
React.Children.toArray(
shadow
.split(', ')
.reduce(
(result, curr, index, array) =>
array.length - 1 !== index
? [...result, `${curr},`, <br />]
: [...result, curr],
[],
),
);
return (
<Box sx={{ width: '100%', overflow: 'hidden', position: 'relative' }}>
<Sheet
variant="solid"
color="success"
sx={[
{
position: 'absolute',
left: '50%',
bottom: 0,
transition: '0.3s',
p: 0.5,
px: 0.75,
borderRadius: 'xs',
boxShadow: 'sm',
zIndex: 1,
},
isCopied
? { transform: `translateX(-50%) translateY(-0.5rem)` }
: { transform: `translateX(-50%) translateY(calc(100% + 0.5rem))` },
]}
>
<Typography level="body-xs" textColor="inherit" startDecorator={<Check />}>
Copied
</Typography>
</Sheet>
<Table>
<thead>
<tr>
<th>
<Typography sx={{ fontSize: 'sm' }}>Token</Typography>
</th>
<th>
<Typography sx={{ fontSize: 'sm' }}>Value</Typography>
</th>
<th>
<Typography startDecorator={<LightMode />} sx={{ fontSize: 'sm' }}>
Light
</Typography>
</th>
<th>
<Typography startDecorator={<DarkMode />} sx={{ fontSize: 'sm' }}>
Dark
</Typography>
</th>
</tr>
</thead>
<tbody>
{tokens.map((token) => (
<tr key={token}>
<td>
<Typography sx={{ fontSize: 'sm' }}>{token}</Typography>
</td>
<td>
<Link
component="button"
color="neutral"
textColor="inherit"
onClick={() => copy(token)}
sx={{ textAlign: 'left', fontSize: 'xs', fontFamily: 'code' }}
>
{formatShadowLayers(defaultTheme.shadow[token])}
</Link>
</td>
<td data-joy-color-scheme="light">
<Sheet
variant="outlined"
sx={{
width: 64,
height: 64,
boxShadow: (theme) => theme.shadow[token],
borderRadius: 'xs',
mr: 2,
}}
/>
</td>
<td data-joy-color-scheme="dark">
<Sheet
variant="outlined"
sx={{
width: 64,
height: 64,
boxShadow: (theme) => theme.shadow[token],
borderRadius: 'xs',
}}
/>
</td>
</tr>
))}
</tbody>
</Table>
</Box>
);
}