forked from mui/material-ui
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDensityTool.js
More file actions
118 lines (110 loc) · 3.43 KB
/
DensityTool.js
File metadata and controls
118 lines (110 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import * as React from 'react';
import Box from '@mui/material/Box';
import Input from '@mui/material/Input';
import Typography from '@mui/material/Typography';
import Button from '@mui/material/Button';
import IconButton from '@mui/material/IconButton';
import FormControlLabel from '@mui/material/FormControlLabel';
import Switch from '@mui/material/Switch';
import IncreaseIcon from '@mui/icons-material/AddCircleOutline';
import DecreaseIcon from '@mui/icons-material/RemoveCircleOutline';
import { DispatchContext, ThemeOptionsContext } from '@mui/docs/ThemeContext';
import { useTranslate } from '@mui/docs/i18n';
import { setDocsSpacing, resetDocsSpacing } from '@mui/docs/branding';
const minSpacing = 0;
const maxSpacing = 20;
export default function DensityTool() {
const [spacingUnit, setSpacingUnit] = React.useState(8);
const dispatch = React.useContext(DispatchContext);
const themeOptions = React.useContext(ThemeOptionsContext);
const handleDensityChange = (event) => {
dispatch({
type: 'SET_DENSE',
payload: event.target.checked,
});
};
const handleSpacingChange = (event, value) => {
let spacing = value || +event.target.value;
// If the entered value is greater than maxSpacing, setting up maxSpacing as value
if (spacing > maxSpacing) {
spacing = maxSpacing;
}
// If the entered value is less than minSpacing, setting up minSpacing as value
if (spacing < minSpacing) {
spacing = minSpacing;
}
setSpacingUnit(spacing);
setDocsSpacing(spacing);
};
const resetDensity = () => {
setSpacingUnit(8);
resetDocsSpacing();
dispatch({ type: 'RESET_DENSITY' });
};
const t = useTranslate();
return (
<Box
sx={{
width: '100%',
display: 'flex',
flexDirection: 'column',
alignItems: 'flex-start',
gap: 2,
}}
>
<FormControlLabel
control={
<Switch
checked={themeOptions.dense}
onChange={handleDensityChange}
value="dense"
color="secondary"
/>
}
label={t('useHighDensity')}
/>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
<Typography id="input-slider" gutterBottom>
{t('spacingUnit')}
</Typography>
<Box sx={{ display: 'flex', alignItems: 'center' }}>
<IconButton
aria-label={t('decreaseSpacing')}
onClick={() => {
setSpacingUnit(spacingUnit - 1);
setDocsSpacing(spacingUnit - 1);
}}
disabled={spacingUnit === minSpacing}
>
<DecreaseIcon />
</IconButton>
<Input
value={spacingUnit}
margin="dense"
onChange={handleSpacingChange}
inputProps={{
step: 1,
min: minSpacing,
max: maxSpacing,
type: 'number',
'aria-labelledby': 'input-slider',
}}
/>
<IconButton
aria-label={t('increaseSpacing')}
onClick={() => {
setSpacingUnit(spacingUnit + 1);
setDocsSpacing(spacingUnit + 1);
}}
disabled={spacingUnit === maxSpacing}
>
<IncreaseIcon />
</IconButton>
</Box>
</Box>
<Button variant="contained" onClick={resetDensity}>
{t('resetDensity')}
</Button>
</Box>
);
}