UNPKG

10 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 _refType = _interopRequireDefault(require("@mui/utils/refType"));
14var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
15var _colorManipulator = require("@mui/system/colorManipulator");
16var _SwitchBase = _interopRequireDefault(require("../internal/SwitchBase"));
17var _RadioButtonIcon = _interopRequireDefault(require("./RadioButtonIcon"));
18var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
19var _createChainedFunction = _interopRequireDefault(require("../utils/createChainedFunction"));
20var _useFormControl = _interopRequireDefault(require("../FormControl/useFormControl"));
21var _useRadioGroup = _interopRequireDefault(require("../RadioGroup/useRadioGroup"));
22var _radioClasses = _interopRequireWildcard(require("./radioClasses"));
23var _rootShouldForwardProp = _interopRequireDefault(require("../styles/rootShouldForwardProp"));
24var _zeroStyled = require("../zero-styled");
25var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
26var _createSimplePaletteValueFilter = _interopRequireDefault(require("../utils/createSimplePaletteValueFilter"));
27var _DefaultPropsProvider = require("../DefaultPropsProvider");
28var _jsxRuntime = require("react/jsx-runtime");
29const useUtilityClasses = ownerState => {
30 const {
31 classes,
32 color,
33 size
34 } = ownerState;
35 const slots = {
36 root: ['root', `color${(0, _capitalize.default)(color)}`, size !== 'medium' && `size${(0, _capitalize.default)(size)}`]
37 };
38 return {
39 ...classes,
40 ...(0, _composeClasses.default)(slots, _radioClasses.getRadioUtilityClass, classes)
41 };
42};
43const RadioRoot = (0, _zeroStyled.styled)(_SwitchBase.default, {
44 shouldForwardProp: prop => (0, _rootShouldForwardProp.default)(prop) || prop === 'classes',
45 name: 'MuiRadio',
46 slot: 'Root',
47 overridesResolver: (props, styles) => {
48 const {
49 ownerState
50 } = props;
51 return [styles.root, ownerState.size !== 'medium' && styles[`size${(0, _capitalize.default)(ownerState.size)}`], styles[`color${(0, _capitalize.default)(ownerState.color)}`]];
52 }
53})((0, _memoTheme.default)(({
54 theme
55}) => ({
56 color: (theme.vars || theme).palette.text.secondary,
57 [`&.${_radioClasses.default.disabled}`]: {
58 color: (theme.vars || theme).palette.action.disabled
59 },
60 variants: [{
61 props: {
62 color: 'default',
63 disabled: false,
64 disableRipple: false
65 },
66 style: {
67 '&:hover': {
68 backgroundColor: theme.vars ? `rgba(${theme.vars.palette.action.activeChannel} / ${theme.vars.palette.action.hoverOpacity})` : (0, _colorManipulator.alpha)(theme.palette.action.active, theme.palette.action.hoverOpacity)
69 }
70 }
71 }, ...Object.entries(theme.palette).filter((0, _createSimplePaletteValueFilter.default)()).map(([color]) => ({
72 props: {
73 color,
74 disabled: false,
75 disableRipple: false
76 },
77 style: {
78 '&:hover': {
79 backgroundColor: theme.vars ? `rgba(${theme.vars.palette[color].mainChannel} / ${theme.vars.palette.action.hoverOpacity})` : (0, _colorManipulator.alpha)(theme.palette[color].main, theme.palette.action.hoverOpacity)
80 }
81 }
82 })), ...Object.entries(theme.palette).filter((0, _createSimplePaletteValueFilter.default)()).map(([color]) => ({
83 props: {
84 color,
85 disabled: false
86 },
87 style: {
88 [`&.${_radioClasses.default.checked}`]: {
89 color: (theme.vars || theme).palette[color].main
90 }
91 }
92 })), {
93 // Should be last to override other colors
94 props: {
95 disableRipple: false
96 },
97 style: {
98 // Reset on touch devices, it doesn't add specificity
99 '&:hover': {
100 '@media (hover: none)': {
101 backgroundColor: 'transparent'
102 }
103 }
104 }
105 }]
106})));
107function areEqualValues(a, b) {
108 if (typeof b === 'object' && b !== null) {
109 return a === b;
110 }
111
112 // The value could be a number, the DOM will stringify it anyway.
113 return String(a) === String(b);
114}
115const defaultCheckedIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_RadioButtonIcon.default, {
116 checked: true
117});
118const defaultIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_RadioButtonIcon.default, {});
119const Radio = /*#__PURE__*/React.forwardRef(function Radio(inProps, ref) {
120 const props = (0, _DefaultPropsProvider.useDefaultProps)({
121 props: inProps,
122 name: 'MuiRadio'
123 });
124 const {
125 checked: checkedProp,
126 checkedIcon = defaultCheckedIcon,
127 color = 'primary',
128 icon = defaultIcon,
129 name: nameProp,
130 onChange: onChangeProp,
131 size = 'medium',
132 className,
133 disabled: disabledProp,
134 disableRipple = false,
135 ...other
136 } = props;
137 const muiFormControl = (0, _useFormControl.default)();
138 let disabled = disabledProp;
139 if (muiFormControl) {
140 if (typeof disabled === 'undefined') {
141 disabled = muiFormControl.disabled;
142 }
143 }
144 disabled ?? (disabled = false);
145 const ownerState = {
146 ...props,
147 disabled,
148 disableRipple,
149 color,
150 size
151 };
152 const classes = useUtilityClasses(ownerState);
153 const radioGroup = (0, _useRadioGroup.default)();
154 let checked = checkedProp;
155 const onChange = (0, _createChainedFunction.default)(onChangeProp, radioGroup && radioGroup.onChange);
156 let name = nameProp;
157 if (radioGroup) {
158 if (typeof checked === 'undefined') {
159 checked = areEqualValues(radioGroup.value, props.value);
160 }
161 if (typeof name === 'undefined') {
162 name = radioGroup.name;
163 }
164 }
165 return /*#__PURE__*/(0, _jsxRuntime.jsx)(RadioRoot, {
166 type: "radio",
167 icon: /*#__PURE__*/React.cloneElement(icon, {
168 fontSize: defaultIcon.props.fontSize ?? size
169 }),
170 checkedIcon: /*#__PURE__*/React.cloneElement(checkedIcon, {
171 fontSize: defaultCheckedIcon.props.fontSize ?? size
172 }),
173 disabled: disabled,
174 ownerState: ownerState,
175 classes: classes,
176 name: name,
177 checked: checked,
178 onChange: onChange,
179 ref: ref,
180 className: (0, _clsx.default)(classes.root, className),
181 ...other
182 });
183});
184process.env.NODE_ENV !== "production" ? Radio.propTypes /* remove-proptypes */ = {
185 // ┌────────────────────────────── Warning ──────────────────────────────┐
186 // │ These PropTypes are generated from the TypeScript type definitions. │
187 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
188 // └─────────────────────────────────────────────────────────────────────┘
189 /**
190 * If `true`, the component is checked.
191 */
192 checked: _propTypes.default.bool,
193 /**
194 * The icon to display when the component is checked.
195 * @default <RadioButtonIcon checked />
196 */
197 checkedIcon: _propTypes.default.node,
198 /**
199 * Override or extend the styles applied to the component.
200 */
201 classes: _propTypes.default.object,
202 /**
203 * @ignore
204 */
205 className: _propTypes.default.string,
206 /**
207 * The color of the component.
208 * It supports both default and custom theme colors, which can be added as shown in the
209 * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
210 * @default 'primary'
211 */
212 color: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['default', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), _propTypes.default.string]),
213 /**
214 * If `true`, the component is disabled.
215 */
216 disabled: _propTypes.default.bool,
217 /**
218 * If `true`, the ripple effect is disabled.
219 * @default false
220 */
221 disableRipple: _propTypes.default.bool,
222 /**
223 * The icon to display when the component is unchecked.
224 * @default <RadioButtonIcon />
225 */
226 icon: _propTypes.default.node,
227 /**
228 * The id of the `input` element.
229 */
230 id: _propTypes.default.string,
231 /**
232 * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.
233 */
234 inputProps: _propTypes.default.object,
235 /**
236 * Pass a ref to the `input` element.
237 */
238 inputRef: _refType.default,
239 /**
240 * Name attribute of the `input` element.
241 */
242 name: _propTypes.default.string,
243 /**
244 * Callback fired when the state is changed.
245 *
246 * @param {React.ChangeEvent<HTMLInputElement>} event The event source of the callback.
247 * You can pull out the new value by accessing `event.target.value` (string).
248 * You can pull out the new checked state by accessing `event.target.checked` (boolean).
249 */
250 onChange: _propTypes.default.func,
251 /**
252 * If `true`, the `input` element is required.
253 * @default false
254 */
255 required: _propTypes.default.bool,
256 /**
257 * The size of the component.
258 * `small` is equivalent to the dense radio styling.
259 * @default 'medium'
260 */
261 size: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['medium', 'small']), _propTypes.default.string]),
262 /**
263 * The system prop that allows defining system overrides as well as additional CSS styles.
264 */
265 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]),
266 /**
267 * The value of the component. The DOM API casts this to a string.
268 */
269 value: _propTypes.default.any
270} : void 0;
271var _default = exports.default = Radio;
\No newline at end of file