UNPKG

14.5 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 _propTypes = _interopRequireDefault(require("prop-types"));
12var _clsx = _interopRequireDefault(require("clsx"));
13var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
14var _colorManipulator = require("@mui/system/colorManipulator");
15var _getValidReactChildren = _interopRequireDefault(require("@mui/utils/getValidReactChildren"));
16var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
17var _zeroStyled = require("../zero-styled");
18var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
19var _createSimplePaletteValueFilter = _interopRequireDefault(require("../utils/createSimplePaletteValueFilter"));
20var _DefaultPropsProvider = require("../DefaultPropsProvider");
21var _buttonGroupClasses = _interopRequireWildcard(require("./buttonGroupClasses"));
22var _ButtonGroupContext = _interopRequireDefault(require("./ButtonGroupContext"));
23var _ButtonGroupButtonContext = _interopRequireDefault(require("./ButtonGroupButtonContext"));
24var _jsxRuntime = require("react/jsx-runtime");
25const overridesResolver = (props, styles) => {
26 const {
27 ownerState
28 } = props;
29 return [{
30 [`& .${_buttonGroupClasses.default.grouped}`]: styles.grouped
31 }, {
32 [`& .${_buttonGroupClasses.default.grouped}`]: styles[`grouped${(0, _capitalize.default)(ownerState.orientation)}`]
33 }, {
34 [`& .${_buttonGroupClasses.default.grouped}`]: styles[`grouped${(0, _capitalize.default)(ownerState.variant)}`]
35 }, {
36 [`& .${_buttonGroupClasses.default.grouped}`]: styles[`grouped${(0, _capitalize.default)(ownerState.variant)}${(0, _capitalize.default)(ownerState.orientation)}`]
37 }, {
38 [`& .${_buttonGroupClasses.default.grouped}`]: styles[`grouped${(0, _capitalize.default)(ownerState.variant)}${(0, _capitalize.default)(ownerState.color)}`]
39 }, {
40 [`& .${_buttonGroupClasses.default.firstButton}`]: styles.firstButton
41 }, {
42 [`& .${_buttonGroupClasses.default.lastButton}`]: styles.lastButton
43 }, {
44 [`& .${_buttonGroupClasses.default.middleButton}`]: styles.middleButton
45 }, styles.root, styles[ownerState.variant], ownerState.disableElevation === true && styles.disableElevation, ownerState.fullWidth && styles.fullWidth, ownerState.orientation === 'vertical' && styles.vertical];
46};
47const useUtilityClasses = ownerState => {
48 const {
49 classes,
50 color,
51 disabled,
52 disableElevation,
53 fullWidth,
54 orientation,
55 variant
56 } = ownerState;
57 const slots = {
58 root: ['root', variant, orientation, fullWidth && 'fullWidth', disableElevation && 'disableElevation', `color${(0, _capitalize.default)(color)}`],
59 grouped: ['grouped', `grouped${(0, _capitalize.default)(orientation)}`, `grouped${(0, _capitalize.default)(variant)}`, `grouped${(0, _capitalize.default)(variant)}${(0, _capitalize.default)(orientation)}`, `grouped${(0, _capitalize.default)(variant)}${(0, _capitalize.default)(color)}`, disabled && 'disabled'],
60 firstButton: ['firstButton'],
61 lastButton: ['lastButton'],
62 middleButton: ['middleButton']
63 };
64 return (0, _composeClasses.default)(slots, _buttonGroupClasses.getButtonGroupUtilityClass, classes);
65};
66const ButtonGroupRoot = (0, _zeroStyled.styled)('div', {
67 name: 'MuiButtonGroup',
68 slot: 'Root',
69 overridesResolver
70})((0, _memoTheme.default)(({
71 theme
72}) => ({
73 display: 'inline-flex',
74 borderRadius: (theme.vars || theme).shape.borderRadius,
75 variants: [{
76 props: {
77 variant: 'contained'
78 },
79 style: {
80 boxShadow: (theme.vars || theme).shadows[2]
81 }
82 }, {
83 props: {
84 disableElevation: true
85 },
86 style: {
87 boxShadow: 'none'
88 }
89 }, {
90 props: {
91 fullWidth: true
92 },
93 style: {
94 width: '100%'
95 }
96 }, {
97 props: {
98 orientation: 'vertical'
99 },
100 style: {
101 flexDirection: 'column',
102 [`& .${_buttonGroupClasses.default.lastButton},& .${_buttonGroupClasses.default.middleButton}`]: {
103 borderTopRightRadius: 0,
104 borderTopLeftRadius: 0
105 },
106 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
107 borderBottomRightRadius: 0,
108 borderBottomLeftRadius: 0
109 }
110 }
111 }, {
112 props: {
113 orientation: 'horizontal'
114 },
115 style: {
116 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
117 borderTopRightRadius: 0,
118 borderBottomRightRadius: 0
119 },
120 [`& .${_buttonGroupClasses.default.lastButton},& .${_buttonGroupClasses.default.middleButton}`]: {
121 borderTopLeftRadius: 0,
122 borderBottomLeftRadius: 0
123 }
124 }
125 }, {
126 props: {
127 variant: 'text',
128 orientation: 'horizontal'
129 },
130 style: {
131 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
132 borderRight: theme.vars ? `1px solid rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.23)` : `1px solid ${theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'}`,
133 [`&.${_buttonGroupClasses.default.disabled}`]: {
134 borderRight: `1px solid ${(theme.vars || theme).palette.action.disabled}`
135 }
136 }
137 }
138 }, {
139 props: {
140 variant: 'text',
141 orientation: 'vertical'
142 },
143 style: {
144 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
145 borderBottom: theme.vars ? `1px solid rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.23)` : `1px solid ${theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'}`,
146 [`&.${_buttonGroupClasses.default.disabled}`]: {
147 borderBottom: `1px solid ${(theme.vars || theme).palette.action.disabled}`
148 }
149 }
150 }
151 }, ...Object.entries(theme.palette).filter((0, _createSimplePaletteValueFilter.default)()).flatMap(([color]) => [{
152 props: {
153 variant: 'text',
154 color
155 },
156 style: {
157 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
158 borderColor: theme.vars ? `rgba(${theme.vars.palette[color].mainChannel} / 0.5)` : (0, _colorManipulator.alpha)(theme.palette[color].main, 0.5)
159 }
160 }
161 }]), {
162 props: {
163 variant: 'outlined',
164 orientation: 'horizontal'
165 },
166 style: {
167 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
168 borderRightColor: 'transparent',
169 '&:hover': {
170 borderRightColor: 'currentColor'
171 }
172 },
173 [`& .${_buttonGroupClasses.default.lastButton},& .${_buttonGroupClasses.default.middleButton}`]: {
174 marginLeft: -1
175 }
176 }
177 }, {
178 props: {
179 variant: 'outlined',
180 orientation: 'vertical'
181 },
182 style: {
183 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
184 borderBottomColor: 'transparent',
185 '&:hover': {
186 borderBottomColor: 'currentColor'
187 }
188 },
189 [`& .${_buttonGroupClasses.default.lastButton},& .${_buttonGroupClasses.default.middleButton}`]: {
190 marginTop: -1
191 }
192 }
193 }, {
194 props: {
195 variant: 'contained',
196 orientation: 'horizontal'
197 },
198 style: {
199 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
200 borderRight: `1px solid ${(theme.vars || theme).palette.grey[400]}`,
201 [`&.${_buttonGroupClasses.default.disabled}`]: {
202 borderRight: `1px solid ${(theme.vars || theme).palette.action.disabled}`
203 }
204 }
205 }
206 }, {
207 props: {
208 variant: 'contained',
209 orientation: 'vertical'
210 },
211 style: {
212 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
213 borderBottom: `1px solid ${(theme.vars || theme).palette.grey[400]}`,
214 [`&.${_buttonGroupClasses.default.disabled}`]: {
215 borderBottom: `1px solid ${(theme.vars || theme).palette.action.disabled}`
216 }
217 }
218 }
219 }, ...Object.entries(theme.palette).filter((0, _createSimplePaletteValueFilter.default)(['dark'])).map(([color]) => ({
220 props: {
221 variant: 'contained',
222 color
223 },
224 style: {
225 [`& .${_buttonGroupClasses.default.firstButton},& .${_buttonGroupClasses.default.middleButton}`]: {
226 borderColor: (theme.vars || theme).palette[color].dark
227 }
228 }
229 }))],
230 [`& .${_buttonGroupClasses.default.grouped}`]: {
231 minWidth: 40,
232 boxShadow: 'none',
233 props: {
234 variant: 'contained'
235 },
236 style: {
237 '&:hover': {
238 boxShadow: 'none'
239 }
240 }
241 }
242})));
243const ButtonGroup = /*#__PURE__*/React.forwardRef(function ButtonGroup(inProps, ref) {
244 const props = (0, _DefaultPropsProvider.useDefaultProps)({
245 props: inProps,
246 name: 'MuiButtonGroup'
247 });
248 const {
249 children,
250 className,
251 color = 'primary',
252 component = 'div',
253 disabled = false,
254 disableElevation = false,
255 disableFocusRipple = false,
256 disableRipple = false,
257 fullWidth = false,
258 orientation = 'horizontal',
259 size = 'medium',
260 variant = 'outlined',
261 ...other
262 } = props;
263 const ownerState = {
264 ...props,
265 color,
266 component,
267 disabled,
268 disableElevation,
269 disableFocusRipple,
270 disableRipple,
271 fullWidth,
272 orientation,
273 size,
274 variant
275 };
276 const classes = useUtilityClasses(ownerState);
277 const context = React.useMemo(() => ({
278 className: classes.grouped,
279 color,
280 disabled,
281 disableElevation,
282 disableFocusRipple,
283 disableRipple,
284 fullWidth,
285 size,
286 variant
287 }), [color, disabled, disableElevation, disableFocusRipple, disableRipple, fullWidth, size, variant, classes.grouped]);
288 const validChildren = (0, _getValidReactChildren.default)(children);
289 const childrenCount = validChildren.length;
290 const getButtonPositionClassName = index => {
291 const isFirstButton = index === 0;
292 const isLastButton = index === childrenCount - 1;
293 if (isFirstButton && isLastButton) {
294 return '';
295 }
296 if (isFirstButton) {
297 return classes.firstButton;
298 }
299 if (isLastButton) {
300 return classes.lastButton;
301 }
302 return classes.middleButton;
303 };
304 return /*#__PURE__*/(0, _jsxRuntime.jsx)(ButtonGroupRoot, {
305 as: component,
306 role: "group",
307 className: (0, _clsx.default)(classes.root, className),
308 ref: ref,
309 ownerState: ownerState,
310 ...other,
311 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ButtonGroupContext.default.Provider, {
312 value: context,
313 children: validChildren.map((child, index) => {
314 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ButtonGroupButtonContext.default.Provider, {
315 value: getButtonPositionClassName(index),
316 children: child
317 }, index);
318 })
319 })
320 });
321});
322process.env.NODE_ENV !== "production" ? ButtonGroup.propTypes /* remove-proptypes */ = {
323 // ┌────────────────────────────── Warning ──────────────────────────────┐
324 // │ These PropTypes are generated from the TypeScript type definitions. │
325 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
326 // └─────────────────────────────────────────────────────────────────────┘
327 /**
328 * The content of the component.
329 */
330 children: _propTypes.default.node,
331 /**
332 * Override or extend the styles applied to the component.
333 */
334 classes: _propTypes.default.object,
335 /**
336 * @ignore
337 */
338 className: _propTypes.default.string,
339 /**
340 * The color of the component.
341 * It supports both default and custom theme colors, which can be added as shown in the
342 * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
343 * @default 'primary'
344 */
345 color: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['inherit', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), _propTypes.default.string]),
346 /**
347 * The component used for the root node.
348 * Either a string to use a HTML element or a component.
349 */
350 component: _propTypes.default.elementType,
351 /**
352 * If `true`, the component is disabled.
353 * @default false
354 */
355 disabled: _propTypes.default.bool,
356 /**
357 * If `true`, no elevation is used.
358 * @default false
359 */
360 disableElevation: _propTypes.default.bool,
361 /**
362 * If `true`, the button keyboard focus ripple is disabled.
363 * @default false
364 */
365 disableFocusRipple: _propTypes.default.bool,
366 /**
367 * If `true`, the button ripple effect is disabled.
368 * @default false
369 */
370 disableRipple: _propTypes.default.bool,
371 /**
372 * If `true`, the buttons will take up the full width of its container.
373 * @default false
374 */
375 fullWidth: _propTypes.default.bool,
376 /**
377 * The component orientation (layout flow direction).
378 * @default 'horizontal'
379 */
380 orientation: _propTypes.default.oneOf(['horizontal', 'vertical']),
381 /**
382 * The size of the component.
383 * `small` is equivalent to the dense button styling.
384 * @default 'medium'
385 */
386 size: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['small', 'medium', 'large']), _propTypes.default.string]),
387 /**
388 * The system prop that allows defining system overrides as well as additional CSS styles.
389 */
390 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]),
391 /**
392 * The variant to use.
393 * @default 'outlined'
394 */
395 variant: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['contained', 'outlined', 'text']), _propTypes.default.string])
396} : void 0;
397var _default = exports.default = ButtonGroup;
\No newline at end of file