Files
react-test/docs/pages/experiments/joy/toggle-button.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

86 lines
2.9 KiB
TypeScript

import * as React from 'react';
import { CssVarsProvider, useColorScheme } from '@mui/joy/styles';
import Button from '@mui/joy/Button';
import CssBaseline from '@mui/joy/CssBaseline';
import Box from '@mui/joy/Box';
import IconButton, { IconButtonProps } from '@mui/joy/IconButton';
import ToggleButtonGroup from '@mui/joy/ToggleButtonGroup';
import FormatAlignCenterIcon from '@mui/icons-material/FormatAlignCenter';
import FormatAlignJustifyIcon from '@mui/icons-material/FormatAlignJustify';
import DarkMode from '@mui/icons-material/DarkMode';
import LightMode from '@mui/icons-material/LightMode';
function ColorSchemeToggle({ onClick, sx, ...props }: IconButtonProps) {
const { mode, setMode } = useColorScheme();
const [mounted, setMounted] = React.useState(false);
React.useEffect(() => {
setMounted(true);
}, []);
if (!mounted) {
return <IconButton size="sm" variant="outlined" color="neutral" {...props} sx={sx} disabled />;
}
return (
<IconButton
data-screenshot="toggle-mode"
size="sm"
variant="outlined"
color="neutral"
{...props}
onClick={(event) => {
if (mode === 'light') {
setMode('dark');
} else {
setMode('light');
}
onClick?.(event);
}}
sx={[
mode === 'dark'
? { '& > *:first-of-type': { display: 'none' } }
: { '& > *:first-of-type': { display: 'initial' } },
mode === 'light'
? { '& > *:last-of-type': { display: 'none' } }
: { '& > *:last-of-type': { display: 'initial' } },
...(Array.isArray(sx) ? sx : [sx]),
]}
>
<DarkMode />
<LightMode />
</IconButton>
);
}
export default function JoyToggleButton() {
const [alignment, setAlignment] = React.useState<Array<'left' | 'center'>>(['left']);
return (
<CssVarsProvider>
<CssBaseline />
<ColorSchemeToggle sx={{ my: 3 }} />
<Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 2 }}>
{(['primary', 'neutral', 'danger', 'success', 'warning'] as const).map((color) =>
(['plain', 'outlined', 'soft', 'solid'] as const).map((variant) => (
<ToggleButtonGroup
key={`${variant}-${color}`}
variant={variant}
color={color}
// spacing={0.5}
value={alignment}
onChange={(event, newValue) => {
setAlignment(newValue);
}}
>
<Button value="left">Left Aligned</Button>
<IconButton value="center" aria-label="centered">
<FormatAlignCenterIcon />
</IconButton>
<IconButton value="justify" aria-label="justified" disabled>
<FormatAlignJustifyIcon />
</IconButton>
</ToggleButtonGroup>
)),
)}
</Box>
</CssVarsProvider>
);
}