UNPKG

13.7 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 _clsx = _interopRequireDefault(require("clsx"));
12var _propTypes = _interopRequireDefault(require("prop-types"));
13var _reactTransitionGroup = require("react-transition-group");
14var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
15var _elementTypeAcceptingRef = _interopRequireDefault(require("@mui/utils/elementTypeAcceptingRef"));
16var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
17var _zeroStyled = require("../zero-styled");
18var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
19var _DefaultPropsProvider = require("../DefaultPropsProvider");
20var _createTransitions = require("../styles/createTransitions");
21var _utils = require("../transitions/utils");
22var _utils2 = require("../utils");
23var _collapseClasses = require("./collapseClasses");
24var _jsxRuntime = require("react/jsx-runtime");
25const useUtilityClasses = ownerState => {
26 const {
27 orientation,
28 classes
29 } = ownerState;
30 const slots = {
31 root: ['root', `${orientation}`],
32 entered: ['entered'],
33 hidden: ['hidden'],
34 wrapper: ['wrapper', `${orientation}`],
35 wrapperInner: ['wrapperInner', `${orientation}`]
36 };
37 return (0, _composeClasses.default)(slots, _collapseClasses.getCollapseUtilityClass, classes);
38};
39const CollapseRoot = (0, _zeroStyled.styled)('div', {
40 name: 'MuiCollapse',
41 slot: 'Root',
42 overridesResolver: (props, styles) => {
43 const {
44 ownerState
45 } = props;
46 return [styles.root, styles[ownerState.orientation], ownerState.state === 'entered' && styles.entered, ownerState.state === 'exited' && !ownerState.in && ownerState.collapsedSize === '0px' && styles.hidden];
47 }
48})((0, _memoTheme.default)(({
49 theme
50}) => ({
51 height: 0,
52 overflow: 'hidden',
53 transition: theme.transitions.create('height'),
54 variants: [{
55 props: {
56 orientation: 'horizontal'
57 },
58 style: {
59 height: 'auto',
60 width: 0,
61 transition: theme.transitions.create('width')
62 }
63 }, {
64 props: {
65 state: 'entered'
66 },
67 style: {
68 height: 'auto',
69 overflow: 'visible'
70 }
71 }, {
72 props: {
73 state: 'entered',
74 orientation: 'horizontal'
75 },
76 style: {
77 width: 'auto'
78 }
79 }, {
80 props: ({
81 ownerState
82 }) => ownerState.state === 'exited' && !ownerState.in && ownerState.collapsedSize === '0px',
83 style: {
84 visibility: 'hidden'
85 }
86 }]
87})));
88const CollapseWrapper = (0, _zeroStyled.styled)('div', {
89 name: 'MuiCollapse',
90 slot: 'Wrapper',
91 overridesResolver: (props, styles) => styles.wrapper
92})({
93 // Hack to get children with a negative margin to not falsify the height computation.
94 display: 'flex',
95 width: '100%',
96 variants: [{
97 props: {
98 orientation: 'horizontal'
99 },
100 style: {
101 width: 'auto',
102 height: '100%'
103 }
104 }]
105});
106const CollapseWrapperInner = (0, _zeroStyled.styled)('div', {
107 name: 'MuiCollapse',
108 slot: 'WrapperInner',
109 overridesResolver: (props, styles) => styles.wrapperInner
110})({
111 width: '100%',
112 variants: [{
113 props: {
114 orientation: 'horizontal'
115 },
116 style: {
117 width: 'auto',
118 height: '100%'
119 }
120 }]
121});
122
123/**
124 * The Collapse transition is used by the
125 * [Vertical Stepper](/material-ui/react-stepper/#vertical-stepper) StepContent component.
126 * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.
127 */
128const Collapse = /*#__PURE__*/React.forwardRef(function Collapse(inProps, ref) {
129 const props = (0, _DefaultPropsProvider.useDefaultProps)({
130 props: inProps,
131 name: 'MuiCollapse'
132 });
133 const {
134 addEndListener,
135 children,
136 className,
137 collapsedSize: collapsedSizeProp = '0px',
138 component,
139 easing,
140 in: inProp,
141 onEnter,
142 onEntered,
143 onEntering,
144 onExit,
145 onExited,
146 onExiting,
147 orientation = 'vertical',
148 style,
149 timeout = _createTransitions.duration.standard,
150 // eslint-disable-next-line react/prop-types
151 TransitionComponent = _reactTransitionGroup.Transition,
152 ...other
153 } = props;
154 const ownerState = {
155 ...props,
156 orientation,
157 collapsedSize: collapsedSizeProp
158 };
159 const classes = useUtilityClasses(ownerState);
160 const theme = (0, _zeroStyled.useTheme)();
161 const timer = (0, _useTimeout.default)();
162 const wrapperRef = React.useRef(null);
163 const autoTransitionDuration = React.useRef();
164 const collapsedSize = typeof collapsedSizeProp === 'number' ? `${collapsedSizeProp}px` : collapsedSizeProp;
165 const isHorizontal = orientation === 'horizontal';
166 const size = isHorizontal ? 'width' : 'height';
167 const nodeRef = React.useRef(null);
168 const handleRef = (0, _utils2.useForkRef)(ref, nodeRef);
169 const normalizedTransitionCallback = callback => maybeIsAppearing => {
170 if (callback) {
171 const node = nodeRef.current;
172
173 // onEnterXxx and onExitXxx callbacks have a different arguments.length value.
174 if (maybeIsAppearing === undefined) {
175 callback(node);
176 } else {
177 callback(node, maybeIsAppearing);
178 }
179 }
180 };
181 const getWrapperSize = () => wrapperRef.current ? wrapperRef.current[isHorizontal ? 'clientWidth' : 'clientHeight'] : 0;
182 const handleEnter = normalizedTransitionCallback((node, isAppearing) => {
183 if (wrapperRef.current && isHorizontal) {
184 // Set absolute position to get the size of collapsed content
185 wrapperRef.current.style.position = 'absolute';
186 }
187 node.style[size] = collapsedSize;
188 if (onEnter) {
189 onEnter(node, isAppearing);
190 }
191 });
192 const handleEntering = normalizedTransitionCallback((node, isAppearing) => {
193 const wrapperSize = getWrapperSize();
194 if (wrapperRef.current && isHorizontal) {
195 // After the size is read reset the position back to default
196 wrapperRef.current.style.position = '';
197 }
198 const {
199 duration: transitionDuration,
200 easing: transitionTimingFunction
201 } = (0, _utils.getTransitionProps)({
202 style,
203 timeout,
204 easing
205 }, {
206 mode: 'enter'
207 });
208 if (timeout === 'auto') {
209 const duration2 = theme.transitions.getAutoHeightDuration(wrapperSize);
210 node.style.transitionDuration = `${duration2}ms`;
211 autoTransitionDuration.current = duration2;
212 } else {
213 node.style.transitionDuration = typeof transitionDuration === 'string' ? transitionDuration : `${transitionDuration}ms`;
214 }
215 node.style[size] = `${wrapperSize}px`;
216 node.style.transitionTimingFunction = transitionTimingFunction;
217 if (onEntering) {
218 onEntering(node, isAppearing);
219 }
220 });
221 const handleEntered = normalizedTransitionCallback((node, isAppearing) => {
222 node.style[size] = 'auto';
223 if (onEntered) {
224 onEntered(node, isAppearing);
225 }
226 });
227 const handleExit = normalizedTransitionCallback(node => {
228 node.style[size] = `${getWrapperSize()}px`;
229 if (onExit) {
230 onExit(node);
231 }
232 });
233 const handleExited = normalizedTransitionCallback(onExited);
234 const handleExiting = normalizedTransitionCallback(node => {
235 const wrapperSize = getWrapperSize();
236 const {
237 duration: transitionDuration,
238 easing: transitionTimingFunction
239 } = (0, _utils.getTransitionProps)({
240 style,
241 timeout,
242 easing
243 }, {
244 mode: 'exit'
245 });
246 if (timeout === 'auto') {
247 // TODO: rename getAutoHeightDuration to something more generic (width support)
248 // Actually it just calculates animation duration based on size
249 const duration2 = theme.transitions.getAutoHeightDuration(wrapperSize);
250 node.style.transitionDuration = `${duration2}ms`;
251 autoTransitionDuration.current = duration2;
252 } else {
253 node.style.transitionDuration = typeof transitionDuration === 'string' ? transitionDuration : `${transitionDuration}ms`;
254 }
255 node.style[size] = collapsedSize;
256 node.style.transitionTimingFunction = transitionTimingFunction;
257 if (onExiting) {
258 onExiting(node);
259 }
260 });
261 const handleAddEndListener = next => {
262 if (timeout === 'auto') {
263 timer.start(autoTransitionDuration.current || 0, next);
264 }
265 if (addEndListener) {
266 // Old call signature before `react-transition-group` implemented `nodeRef`
267 addEndListener(nodeRef.current, next);
268 }
269 };
270 return /*#__PURE__*/(0, _jsxRuntime.jsx)(TransitionComponent, {
271 in: inProp,
272 onEnter: handleEnter,
273 onEntered: handleEntered,
274 onEntering: handleEntering,
275 onExit: handleExit,
276 onExited: handleExited,
277 onExiting: handleExiting,
278 addEndListener: handleAddEndListener,
279 nodeRef: nodeRef,
280 timeout: timeout === 'auto' ? null : timeout,
281 ...other,
282 children: (state, childProps) => /*#__PURE__*/(0, _jsxRuntime.jsx)(CollapseRoot, {
283 as: component,
284 className: (0, _clsx.default)(classes.root, className, {
285 'entered': classes.entered,
286 'exited': !inProp && collapsedSize === '0px' && classes.hidden
287 }[state]),
288 style: {
289 [isHorizontal ? 'minWidth' : 'minHeight']: collapsedSize,
290 ...style
291 },
292 ref: handleRef,
293 ...childProps,
294 // `ownerState` is set after `childProps` to override any existing `ownerState` property in `childProps`
295 // that might have been forwarded from the Transition component.
296 ownerState: {
297 ...ownerState,
298 state
299 },
300 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(CollapseWrapper, {
301 ownerState: {
302 ...ownerState,
303 state
304 },
305 className: classes.wrapper,
306 ref: wrapperRef,
307 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(CollapseWrapperInner, {
308 ownerState: {
309 ...ownerState,
310 state
311 },
312 className: classes.wrapperInner,
313 children: children
314 })
315 })
316 })
317 });
318});
319process.env.NODE_ENV !== "production" ? Collapse.propTypes /* remove-proptypes */ = {
320 // ┌────────────────────────────── Warning ──────────────────────────────┐
321 // │ These PropTypes are generated from the TypeScript type definitions. │
322 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
323 // └─────────────────────────────────────────────────────────────────────┘
324 /**
325 * Add a custom transition end trigger. Called with the transitioning DOM
326 * node and a done callback. Allows for more fine grained transition end
327 * logic. Note: Timeouts are still used as a fallback if provided.
328 */
329 addEndListener: _propTypes.default.func,
330 /**
331 * The content node to be collapsed.
332 */
333 children: _propTypes.default.node,
334 /**
335 * Override or extend the styles applied to the component.
336 */
337 classes: _propTypes.default.object,
338 /**
339 * @ignore
340 */
341 className: _propTypes.default.string,
342 /**
343 * The width (horizontal) or height (vertical) of the container when collapsed.
344 * @default '0px'
345 */
346 collapsedSize: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
347 /**
348 * The component used for the root node.
349 * Either a string to use a HTML element or a component.
350 */
351 component: _elementTypeAcceptingRef.default,
352 /**
353 * The transition timing function.
354 * You may specify a single easing or a object containing enter and exit values.
355 */
356 easing: _propTypes.default.oneOfType([_propTypes.default.shape({
357 enter: _propTypes.default.string,
358 exit: _propTypes.default.string
359 }), _propTypes.default.string]),
360 /**
361 * If `true`, the component will transition in.
362 */
363 in: _propTypes.default.bool,
364 /**
365 * @ignore
366 */
367 onEnter: _propTypes.default.func,
368 /**
369 * @ignore
370 */
371 onEntered: _propTypes.default.func,
372 /**
373 * @ignore
374 */
375 onEntering: _propTypes.default.func,
376 /**
377 * @ignore
378 */
379 onExit: _propTypes.default.func,
380 /**
381 * @ignore
382 */
383 onExited: _propTypes.default.func,
384 /**
385 * @ignore
386 */
387 onExiting: _propTypes.default.func,
388 /**
389 * The transition orientation.
390 * @default 'vertical'
391 */
392 orientation: _propTypes.default.oneOf(['horizontal', 'vertical']),
393 /**
394 * @ignore
395 */
396 style: _propTypes.default.object,
397 /**
398 * The system prop that allows defining system overrides as well as additional CSS styles.
399 */
400 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]),
401 /**
402 * The duration for the transition, in milliseconds.
403 * You may specify a single timeout for all transitions, or individually with an object.
404 *
405 * Set to 'auto' to automatically calculate transition time based on height.
406 * @default duration.standard
407 */
408 timeout: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.shape({
409 appear: _propTypes.default.number,
410 enter: _propTypes.default.number,
411 exit: _propTypes.default.number
412 })])
413} : void 0;
414if (Collapse) {
415 Collapse.muiSupportAuto = true;
416}
417var _default = exports.default = Collapse;
\No newline at end of file