UNPKG

11.4 kBJavaScriptView Raw
1"use strict";
2'use client';
3
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
6Object.defineProperty(exports, "__esModule", {
7 value: true
8});
9exports.default = void 0;
10var React = _interopRequireWildcard(require("react"));
11var _reactIs = require("react-is");
12var _propTypes = _interopRequireDefault(require("prop-types"));
13var _clsx = _interopRequireDefault(require("clsx"));
14var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
15var _getValidReactChildren = _interopRequireDefault(require("@mui/utils/getValidReactChildren"));
16var _zeroStyled = require("../zero-styled");
17var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
18var _DefaultPropsProvider = require("../DefaultPropsProvider");
19var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
20var _toggleButtonGroupClasses = _interopRequireWildcard(require("./toggleButtonGroupClasses"));
21var _ToggleButtonGroupContext = _interopRequireDefault(require("./ToggleButtonGroupContext"));
22var _ToggleButtonGroupButtonContext = _interopRequireDefault(require("./ToggleButtonGroupButtonContext"));
23var _toggleButtonClasses = _interopRequireDefault(require("../ToggleButton/toggleButtonClasses"));
24var _jsxRuntime = require("react/jsx-runtime");
25const useUtilityClasses = ownerState => {
26 const {
27 classes,
28 orientation,
29 fullWidth,
30 disabled
31 } = ownerState;
32 const slots = {
33 root: ['root', orientation, fullWidth && 'fullWidth'],
34 grouped: ['grouped', `grouped${(0, _capitalize.default)(orientation)}`, disabled && 'disabled'],
35 firstButton: ['firstButton'],
36 lastButton: ['lastButton'],
37 middleButton: ['middleButton']
38 };
39 return (0, _composeClasses.default)(slots, _toggleButtonGroupClasses.getToggleButtonGroupUtilityClass, classes);
40};
41const ToggleButtonGroupRoot = (0, _zeroStyled.styled)('div', {
42 name: 'MuiToggleButtonGroup',
43 slot: 'Root',
44 overridesResolver: (props, styles) => {
45 const {
46 ownerState
47 } = props;
48 return [{
49 [`& .${_toggleButtonGroupClasses.default.grouped}`]: styles.grouped
50 }, {
51 [`& .${_toggleButtonGroupClasses.default.grouped}`]: styles[`grouped${(0, _capitalize.default)(ownerState.orientation)}`]
52 }, {
53 [`& .${_toggleButtonGroupClasses.default.firstButton}`]: styles.firstButton
54 }, {
55 [`& .${_toggleButtonGroupClasses.default.lastButton}`]: styles.lastButton
56 }, {
57 [`& .${_toggleButtonGroupClasses.default.middleButton}`]: styles.middleButton
58 }, styles.root, ownerState.orientation === 'vertical' && styles.vertical, ownerState.fullWidth && styles.fullWidth];
59 }
60})((0, _memoTheme.default)(({
61 theme
62}) => ({
63 display: 'inline-flex',
64 borderRadius: (theme.vars || theme).shape.borderRadius,
65 variants: [{
66 props: {
67 orientation: 'vertical'
68 },
69 style: {
70 flexDirection: 'column',
71 [`& .${_toggleButtonGroupClasses.default.grouped}`]: {
72 [`&.${_toggleButtonGroupClasses.default.selected} + .${_toggleButtonGroupClasses.default.grouped}.${_toggleButtonGroupClasses.default.selected}`]: {
73 borderTop: 0,
74 marginTop: 0
75 }
76 },
77 [`& .${_toggleButtonGroupClasses.default.firstButton},& .${_toggleButtonGroupClasses.default.middleButton}`]: {
78 borderBottomLeftRadius: 0,
79 borderBottomRightRadius: 0
80 },
81 [`& .${_toggleButtonGroupClasses.default.lastButton},& .${_toggleButtonGroupClasses.default.middleButton}`]: {
82 marginTop: -1,
83 borderTop: '1px solid transparent',
84 borderTopLeftRadius: 0,
85 borderTopRightRadius: 0
86 },
87 [`& .${_toggleButtonGroupClasses.default.lastButton}.${_toggleButtonClasses.default.disabled},& .${_toggleButtonGroupClasses.default.middleButton}.${_toggleButtonClasses.default.disabled}`]: {
88 borderTop: '1px solid transparent'
89 }
90 }
91 }, {
92 props: {
93 fullWidth: true
94 },
95 style: {
96 width: '100%'
97 }
98 }, {
99 props: {
100 orientation: 'horizontal'
101 },
102 style: {
103 [`& .${_toggleButtonGroupClasses.default.grouped}`]: {
104 [`&.${_toggleButtonGroupClasses.default.selected} + .${_toggleButtonGroupClasses.default.grouped}.${_toggleButtonGroupClasses.default.selected}`]: {
105 borderLeft: 0,
106 marginLeft: 0
107 }
108 },
109 [`& .${_toggleButtonGroupClasses.default.firstButton},& .${_toggleButtonGroupClasses.default.middleButton}`]: {
110 borderTopRightRadius: 0,
111 borderBottomRightRadius: 0
112 },
113 [`& .${_toggleButtonGroupClasses.default.lastButton},& .${_toggleButtonGroupClasses.default.middleButton}`]: {
114 marginLeft: -1,
115 borderLeft: '1px solid transparent',
116 borderTopLeftRadius: 0,
117 borderBottomLeftRadius: 0
118 },
119 [`& .${_toggleButtonGroupClasses.default.lastButton}.${_toggleButtonClasses.default.disabled},& .${_toggleButtonGroupClasses.default.middleButton}.${_toggleButtonClasses.default.disabled}`]: {
120 borderLeft: '1px solid transparent'
121 }
122 }
123 }]
124})));
125const ToggleButtonGroup = /*#__PURE__*/React.forwardRef(function ToggleButtonGroup(inProps, ref) {
126 const props = (0, _DefaultPropsProvider.useDefaultProps)({
127 props: inProps,
128 name: 'MuiToggleButtonGroup'
129 });
130 const {
131 children,
132 className,
133 color = 'standard',
134 disabled = false,
135 exclusive = false,
136 fullWidth = false,
137 onChange,
138 orientation = 'horizontal',
139 size = 'medium',
140 value,
141 ...other
142 } = props;
143 const ownerState = {
144 ...props,
145 disabled,
146 fullWidth,
147 orientation,
148 size
149 };
150 const classes = useUtilityClasses(ownerState);
151 const handleChange = React.useCallback((event, buttonValue) => {
152 if (!onChange) {
153 return;
154 }
155 const index = value && value.indexOf(buttonValue);
156 let newValue;
157 if (value && index >= 0) {
158 newValue = value.slice();
159 newValue.splice(index, 1);
160 } else {
161 newValue = value ? value.concat(buttonValue) : [buttonValue];
162 }
163 onChange(event, newValue);
164 }, [onChange, value]);
165 const handleExclusiveChange = React.useCallback((event, buttonValue) => {
166 if (!onChange) {
167 return;
168 }
169 onChange(event, value === buttonValue ? null : buttonValue);
170 }, [onChange, value]);
171 const context = React.useMemo(() => ({
172 className: classes.grouped,
173 onChange: exclusive ? handleExclusiveChange : handleChange,
174 value,
175 size,
176 fullWidth,
177 color,
178 disabled
179 }), [classes.grouped, exclusive, handleExclusiveChange, handleChange, value, size, fullWidth, color, disabled]);
180 const validChildren = (0, _getValidReactChildren.default)(children);
181 const childrenCount = validChildren.length;
182 const getButtonPositionClassName = index => {
183 const isFirstButton = index === 0;
184 const isLastButton = index === childrenCount - 1;
185 if (isFirstButton && isLastButton) {
186 return '';
187 }
188 if (isFirstButton) {
189 return classes.firstButton;
190 }
191 if (isLastButton) {
192 return classes.lastButton;
193 }
194 return classes.middleButton;
195 };
196 return /*#__PURE__*/(0, _jsxRuntime.jsx)(ToggleButtonGroupRoot, {
197 role: "group",
198 className: (0, _clsx.default)(classes.root, className),
199 ref: ref,
200 ownerState: ownerState,
201 ...other,
202 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToggleButtonGroupContext.default.Provider, {
203 value: context,
204 children: validChildren.map((child, index) => {
205 if (process.env.NODE_ENV !== 'production') {
206 if ((0, _reactIs.isFragment)(child)) {
207 console.error(["MUI: The ToggleButtonGroup component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n'));
208 }
209 }
210 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ToggleButtonGroupButtonContext.default.Provider, {
211 value: getButtonPositionClassName(index),
212 children: child
213 }, index);
214 })
215 })
216 });
217});
218process.env.NODE_ENV !== "production" ? ToggleButtonGroup.propTypes /* remove-proptypes */ = {
219 // ┌────────────────────────────── Warning ──────────────────────────────┐
220 // │ These PropTypes are generated from the TypeScript type definitions. │
221 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
222 // └─────────────────────────────────────────────────────────────────────┘
223 /**
224 * The content of the component.
225 */
226 children: _propTypes.default.node,
227 /**
228 * Override or extend the styles applied to the component.
229 */
230 classes: _propTypes.default.object,
231 /**
232 * @ignore
233 */
234 className: _propTypes.default.string,
235 /**
236 * The color of the button when it is selected.
237 * It supports both default and custom theme colors, which can be added as shown in the
238 * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
239 * @default 'standard'
240 */
241 color: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['standard', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), _propTypes.default.string]),
242 /**
243 * If `true`, the component is disabled. This implies that all ToggleButton children will be disabled.
244 * @default false
245 */
246 disabled: _propTypes.default.bool,
247 /**
248 * If `true`, only allow one of the child ToggleButton values to be selected.
249 * @default false
250 */
251 exclusive: _propTypes.default.bool,
252 /**
253 * If `true`, the button group will take up the full width of its container.
254 * @default false
255 */
256 fullWidth: _propTypes.default.bool,
257 /**
258 * Callback fired when the value changes.
259 *
260 * @param {React.MouseEvent<HTMLElement>} event The event source of the callback.
261 * @param {any} value of the selected buttons. When `exclusive` is true
262 * this is a single value; when false an array of selected values. If no value
263 * is selected and `exclusive` is true the value is null; when false an empty array.
264 */
265 onChange: _propTypes.default.func,
266 /**
267 * The component orientation (layout flow direction).
268 * @default 'horizontal'
269 */
270 orientation: _propTypes.default.oneOf(['horizontal', 'vertical']),
271 /**
272 * The size of the component.
273 * @default 'medium'
274 */
275 size: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['small', 'medium', 'large']), _propTypes.default.string]),
276 /**
277 * The system prop that allows defining system overrides as well as additional CSS styles.
278 */
279 sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
280 /**
281 * The currently selected value within the group or an array of selected
282 * values when `exclusive` is false.
283 *
284 * The value must have reference equality with the option in order to be selected.
285 */
286 value: _propTypes.default.any
287} : void 0;
288var _default = exports.default = ToggleButtonGroup;
\No newline at end of file