Files
react-test/docs/data/joy/customization/theme-typography/TypographyThemeViewer.tsx
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

211 lines
6.2 KiB
TypeScript

import { extendTheme, styled, TypographySystem, FontSize } from '@mui/joy/styles';
import Box from '@mui/joy/Box';
import Tooltip from '@mui/joy/Tooltip';
import Typography from '@mui/joy/Typography';
const defaultTheme = extendTheme();
const Table = styled('table')(({ theme }) => ({
borderCollapse: 'separate',
borderSpacing: 0,
display: 'block',
width: 'max-content',
overflow: 'auto',
th: {
textAlign: 'left',
padding: 12,
position: 'sticky',
top: 0,
zIndex: 1,
...theme.variants.soft.neutral,
},
td: {
verticalAlign: 'top',
padding: '8px 12px',
'& > *': {
padding: '8px 12px',
margin: '-8px -12px',
},
},
tr: {
'&:hover': {
backgroundColor: theme.vars.palette.background.level1,
},
'&:first-of-type': {
'& td': { paddingTop: 6 },
},
},
}));
const extractFromVar = (value: string, field: string) =>
(value || '').replace(`var(--joy-${field}-`, '').replace(')', '');
export default function TypographyThemeViewer() {
const levels = Object.keys(defaultTheme.typography) as Array<
keyof TypographySystem
>;
const renderSwatch = (colorScheme: 'light' | 'dark', token: string) =>
token ? (
<Box
component="span"
data-joy-color-scheme={colorScheme}
sx={{
display: 'inline-block',
width: '16px',
height: '16px',
borderRadius: '2px',
bgcolor: token,
boxShadow: 'inset 0 0 0 1px #bababa',
}}
/>
) : null;
return (
<Box
sx={{
marginBottom: '-9px',
maxWidth: '100%',
overflowX: 'scroll',
border: '1px solid',
borderColor: 'divider',
borderTopLeftRadius: '12px',
borderTopRightRadius: '12px',
}}
>
<Table>
<thead>
<tr>
<th>
<Typography sx={{ fontSize: 'sm' }}>Level</Typography>
</th>
<th>
<Typography noWrap sx={{ fontSize: 'sm' }}>
Color
</Typography>
</th>
<th>
<Typography noWrap sx={{ fontSize: 'sm' }}>
Font size
</Typography>
</th>
<th>
<Typography noWrap sx={{ fontSize: 'sm' }}>
Font weight
</Typography>
</th>
<th>
<Typography noWrap sx={{ fontSize: 'sm' }}>
Line height
</Typography>
</th>
</tr>
</thead>
<tbody>
{levels.map((level) => (
<tr key={level}>
<td>
<Tooltip
title={<Typography level={level}>Preview</Typography>}
size="sm"
arrow
variant="outlined"
placement="bottom-start"
sx={{ pointerEvents: 'none' }}
>
<Typography sx={{ fontSize: 'sm', cursor: 'zoom-in' }}>
{level}
</Typography>
</Tooltip>
</td>
<td>
<Tooltip
size="sm"
arrow
variant="outlined"
title={
<Box sx={{ display: 'flex', gap: 3 }}>
<Typography
startDecorator={renderSwatch(
'light',
defaultTheme.typography[level].color as string,
)}
sx={{ fontSize: 'xs' }}
>
(light)
</Typography>
<Typography
startDecorator={renderSwatch(
'dark',
defaultTheme.typography[level].color as string,
)}
sx={{ fontSize: 'xs' }}
>
(dark)
</Typography>
</Box>
}
sx={{ pointerEvents: 'none' }}
>
<Typography
sx={{ fontSize: 'xs', fontFamily: 'code', cursor: 'zoom-in' }}
>
{defaultTheme.typography[level].color || '-'}
</Typography>
</Tooltip>
</td>
<td>
<Tooltip
size="sm"
arrow
title={
defaultTheme.fontSize[
extractFromVar(
defaultTheme.typography[level].fontSize as string,
'fontSize',
) as keyof FontSize
]
}
sx={{ pointerEvents: 'none' }}
>
<Typography
sx={{ fontSize: 'xs', fontFamily: 'code', cursor: 'zoom-in' }}
>
{defaultTheme.typography[level].fontSize || '-'}
</Typography>
</Tooltip>
</td>
{(['fontWeight', 'lineHeight'] as const).map((field) => (
<td key={field}>
<Tooltip
size="sm"
arrow
title={
(defaultTheme[field] as Record<string, any>)[
extractFromVar(
defaultTheme.typography[level][field] as string,
field,
)
] || ''
}
sx={{ pointerEvents: 'none' }}
>
<Typography
sx={{
fontSize: 'xs',
fontFamily: 'code',
textAlign: 'center',
cursor: 'zoom-in',
}}
>
{defaultTheme.typography[level][field] || '-'}
</Typography>
</Tooltip>
</td>
))}
</tr>
))}
</tbody>
</Table>
</Box>
);
}