UNPKG

9.73 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 _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
13var _clsx = _interopRequireDefault(require("clsx"));
14var _formControlState = _interopRequireDefault(require("../FormControl/formControlState"));
15var _useFormControl = _interopRequireDefault(require("../FormControl/useFormControl"));
16var _FormLabel = _interopRequireWildcard(require("../FormLabel"));
17var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
18var _rootShouldForwardProp = _interopRequireDefault(require("../styles/rootShouldForwardProp"));
19var _zeroStyled = require("../zero-styled");
20var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
21var _DefaultPropsProvider = require("../DefaultPropsProvider");
22var _inputLabelClasses = require("./inputLabelClasses");
23var _jsxRuntime = require("react/jsx-runtime");
24const useUtilityClasses = ownerState => {
25 const {
26 classes,
27 formControl,
28 size,
29 shrink,
30 disableAnimation,
31 variant,
32 required
33 } = ownerState;
34 const slots = {
35 root: ['root', formControl && 'formControl', !disableAnimation && 'animated', shrink && 'shrink', size && size !== 'normal' && `size${(0, _capitalize.default)(size)}`, variant],
36 asterisk: [required && 'asterisk']
37 };
38 const composedClasses = (0, _composeClasses.default)(slots, _inputLabelClasses.getInputLabelUtilityClasses, classes);
39 return {
40 ...classes,
41 // forward the focused, disabled, etc. classes to the FormLabel
42 ...composedClasses
43 };
44};
45const InputLabelRoot = (0, _zeroStyled.styled)(_FormLabel.default, {
46 shouldForwardProp: prop => (0, _rootShouldForwardProp.default)(prop) || prop === 'classes',
47 name: 'MuiInputLabel',
48 slot: 'Root',
49 overridesResolver: (props, styles) => {
50 const {
51 ownerState
52 } = props;
53 return [{
54 [`& .${_FormLabel.formLabelClasses.asterisk}`]: styles.asterisk
55 }, styles.root, ownerState.formControl && styles.formControl, ownerState.size === 'small' && styles.sizeSmall, ownerState.shrink && styles.shrink, !ownerState.disableAnimation && styles.animated, ownerState.focused && styles.focused, styles[ownerState.variant]];
56 }
57})((0, _memoTheme.default)(({
58 theme
59}) => ({
60 display: 'block',
61 transformOrigin: 'top left',
62 whiteSpace: 'nowrap',
63 overflow: 'hidden',
64 textOverflow: 'ellipsis',
65 maxWidth: '100%',
66 variants: [{
67 props: ({
68 ownerState
69 }) => ownerState.formControl,
70 style: {
71 position: 'absolute',
72 left: 0,
73 top: 0,
74 // slight alteration to spec spacing to match visual spec result
75 transform: 'translate(0, 20px) scale(1)'
76 }
77 }, {
78 props: {
79 size: 'small'
80 },
81 style: {
82 // Compensation for the `Input.inputSizeSmall` style.
83 transform: 'translate(0, 17px) scale(1)'
84 }
85 }, {
86 props: ({
87 ownerState
88 }) => ownerState.shrink,
89 style: {
90 transform: 'translate(0, -1.5px) scale(0.75)',
91 transformOrigin: 'top left',
92 maxWidth: '133%'
93 }
94 }, {
95 props: ({
96 ownerState
97 }) => !ownerState.disableAnimation,
98 style: {
99 transition: theme.transitions.create(['color', 'transform', 'max-width'], {
100 duration: theme.transitions.duration.shorter,
101 easing: theme.transitions.easing.easeOut
102 })
103 }
104 }, {
105 props: {
106 variant: 'filled'
107 },
108 style: {
109 // Chrome's autofill feature gives the input field a yellow background.
110 // Since the input field is behind the label in the HTML tree,
111 // the input field is drawn last and hides the label with an opaque background color.
112 // zIndex: 1 will raise the label above opaque background-colors of input.
113 zIndex: 1,
114 pointerEvents: 'none',
115 transform: 'translate(12px, 16px) scale(1)',
116 maxWidth: 'calc(100% - 24px)'
117 }
118 }, {
119 props: {
120 variant: 'filled',
121 size: 'small'
122 },
123 style: {
124 transform: 'translate(12px, 13px) scale(1)'
125 }
126 }, {
127 props: ({
128 variant,
129 ownerState
130 }) => variant === 'filled' && ownerState.shrink,
131 style: {
132 userSelect: 'none',
133 pointerEvents: 'auto',
134 transform: 'translate(12px, 7px) scale(0.75)',
135 maxWidth: 'calc(133% - 24px)'
136 }
137 }, {
138 props: ({
139 variant,
140 ownerState,
141 size
142 }) => variant === 'filled' && ownerState.shrink && size === 'small',
143 style: {
144 transform: 'translate(12px, 4px) scale(0.75)'
145 }
146 }, {
147 props: {
148 variant: 'outlined'
149 },
150 style: {
151 // see comment above on filled.zIndex
152 zIndex: 1,
153 pointerEvents: 'none',
154 transform: 'translate(14px, 16px) scale(1)',
155 maxWidth: 'calc(100% - 24px)'
156 }
157 }, {
158 props: {
159 variant: 'outlined',
160 size: 'small'
161 },
162 style: {
163 transform: 'translate(14px, 9px) scale(1)'
164 }
165 }, {
166 props: ({
167 variant,
168 ownerState
169 }) => variant === 'outlined' && ownerState.shrink,
170 style: {
171 userSelect: 'none',
172 pointerEvents: 'auto',
173 // Theoretically, we should have (8+5)*2/0.75 = 34px
174 // but it feels a better when it bleeds a bit on the left, so 32px.
175 maxWidth: 'calc(133% - 32px)',
176 transform: 'translate(14px, -9px) scale(0.75)'
177 }
178 }]
179})));
180const InputLabel = /*#__PURE__*/React.forwardRef(function InputLabel(inProps, ref) {
181 const props = (0, _DefaultPropsProvider.useDefaultProps)({
182 name: 'MuiInputLabel',
183 props: inProps
184 });
185 const {
186 disableAnimation = false,
187 margin,
188 shrink: shrinkProp,
189 variant,
190 className,
191 ...other
192 } = props;
193 const muiFormControl = (0, _useFormControl.default)();
194 let shrink = shrinkProp;
195 if (typeof shrink === 'undefined' && muiFormControl) {
196 shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;
197 }
198 const fcs = (0, _formControlState.default)({
199 props,
200 muiFormControl,
201 states: ['size', 'variant', 'required', 'focused']
202 });
203 const ownerState = {
204 ...props,
205 disableAnimation,
206 formControl: muiFormControl,
207 shrink,
208 size: fcs.size,
209 variant: fcs.variant,
210 required: fcs.required,
211 focused: fcs.focused
212 };
213 const classes = useUtilityClasses(ownerState);
214 return /*#__PURE__*/(0, _jsxRuntime.jsx)(InputLabelRoot, {
215 "data-shrink": shrink,
216 ref: ref,
217 className: (0, _clsx.default)(classes.root, className),
218 ...other,
219 ownerState: ownerState,
220 classes: classes
221 });
222});
223process.env.NODE_ENV !== "production" ? InputLabel.propTypes /* remove-proptypes */ = {
224 // ┌────────────────────────────── Warning ──────────────────────────────┐
225 // │ These PropTypes are generated from the TypeScript type definitions. │
226 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
227 // └─────────────────────────────────────────────────────────────────────┘
228 /**
229 * The content of the component.
230 */
231 children: _propTypes.default.node,
232 /**
233 * Override or extend the styles applied to the component.
234 */
235 classes: _propTypes.default.object,
236 /**
237 * @ignore
238 */
239 className: _propTypes.default.string,
240 /**
241 * The color of the component.
242 * It supports both default and custom theme colors, which can be added as shown in the
243 * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
244 */
245 color: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['error', 'info', 'primary', 'secondary', 'success', 'warning']), _propTypes.default.string]),
246 /**
247 * If `true`, the transition animation is disabled.
248 * @default false
249 */
250 disableAnimation: _propTypes.default.bool,
251 /**
252 * If `true`, the component is disabled.
253 */
254 disabled: _propTypes.default.bool,
255 /**
256 * If `true`, the label is displayed in an error state.
257 */
258 error: _propTypes.default.bool,
259 /**
260 * If `true`, the `input` of this label is focused.
261 */
262 focused: _propTypes.default.bool,
263 /**
264 * If `dense`, will adjust vertical spacing. This is normally obtained via context from
265 * FormControl.
266 */
267 margin: _propTypes.default.oneOf(['dense']),
268 /**
269 * if `true`, the label will indicate that the `input` is required.
270 */
271 required: _propTypes.default.bool,
272 /**
273 * If `true`, the label is shrunk.
274 */
275 shrink: _propTypes.default.bool,
276 /**
277 * The size of the component.
278 * @default 'normal'
279 */
280 size: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['normal', 'small']), _propTypes.default.string]),
281 /**
282 * The system prop that allows defining system overrides as well as additional CSS styles.
283 */
284 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]),
285 /**
286 * The variant to use.
287 */
288 variant: _propTypes.default.oneOf(['filled', 'outlined', 'standard'])
289} : void 0;
290var _default = exports.default = InputLabel;
\No newline at end of file