1 | "use strict";
|
2 | 'use client';
|
3 |
|
4 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
5 | var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
6 | Object.defineProperty(exports, "__esModule", {
|
7 | value: true
|
8 | });
|
9 | exports.default = exports.PopoverRoot = exports.PopoverPaper = void 0;
|
10 | exports.getOffsetLeft = getOffsetLeft;
|
11 | exports.getOffsetTop = getOffsetTop;
|
12 | var React = _interopRequireWildcard(require("react"));
|
13 | var _propTypes = _interopRequireDefault(require("prop-types"));
|
14 | var _clsx = _interopRequireDefault(require("clsx"));
|
15 | var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
|
16 | var _HTMLElementType = _interopRequireDefault(require("@mui/utils/HTMLElementType"));
|
17 | var _refType = _interopRequireDefault(require("@mui/utils/refType"));
|
18 | var _elementTypeAcceptingRef = _interopRequireDefault(require("@mui/utils/elementTypeAcceptingRef"));
|
19 | var _integerPropType = _interopRequireDefault(require("@mui/utils/integerPropType"));
|
20 | var _chainPropTypes = _interopRequireDefault(require("@mui/utils/chainPropTypes"));
|
21 | var _isHostComponent = _interopRequireDefault(require("../utils/isHostComponent"));
|
22 | var _zeroStyled = require("../zero-styled");
|
23 | var _DefaultPropsProvider = require("../DefaultPropsProvider");
|
24 | var _debounce = _interopRequireDefault(require("../utils/debounce"));
|
25 | var _ownerDocument = _interopRequireDefault(require("../utils/ownerDocument"));
|
26 | var _ownerWindow = _interopRequireDefault(require("../utils/ownerWindow"));
|
27 | var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
|
28 | var _Grow = _interopRequireDefault(require("../Grow"));
|
29 | var _Modal = _interopRequireDefault(require("../Modal"));
|
30 | var _Paper = _interopRequireDefault(require("../Paper"));
|
31 | var _popoverClasses = require("./popoverClasses");
|
32 | var _useSlot = _interopRequireDefault(require("../utils/useSlot"));
|
33 | var _jsxRuntime = require("react/jsx-runtime");
|
34 | function getOffsetTop(rect, vertical) {
|
35 | let offset = 0;
|
36 | if (typeof vertical === 'number') {
|
37 | offset = vertical;
|
38 | } else if (vertical === 'center') {
|
39 | offset = rect.height / 2;
|
40 | } else if (vertical === 'bottom') {
|
41 | offset = rect.height;
|
42 | }
|
43 | return offset;
|
44 | }
|
45 | function getOffsetLeft(rect, horizontal) {
|
46 | let offset = 0;
|
47 | if (typeof horizontal === 'number') {
|
48 | offset = horizontal;
|
49 | } else if (horizontal === 'center') {
|
50 | offset = rect.width / 2;
|
51 | } else if (horizontal === 'right') {
|
52 | offset = rect.width;
|
53 | }
|
54 | return offset;
|
55 | }
|
56 | function getTransformOriginValue(transformOrigin) {
|
57 | return [transformOrigin.horizontal, transformOrigin.vertical].map(n => typeof n === 'number' ? `${n}px` : n).join(' ');
|
58 | }
|
59 | function resolveAnchorEl(anchorEl) {
|
60 | return typeof anchorEl === 'function' ? anchorEl() : anchorEl;
|
61 | }
|
62 | const useUtilityClasses = ownerState => {
|
63 | const {
|
64 | classes
|
65 | } = ownerState;
|
66 | const slots = {
|
67 | root: ['root'],
|
68 | paper: ['paper']
|
69 | };
|
70 | return (0, _composeClasses.default)(slots, _popoverClasses.getPopoverUtilityClass, classes);
|
71 | };
|
72 | const PopoverRoot = exports.PopoverRoot = (0, _zeroStyled.styled)(_Modal.default, {
|
73 | name: 'MuiPopover',
|
74 | slot: 'Root',
|
75 | overridesResolver: (props, styles) => styles.root
|
76 | })({});
|
77 | const PopoverPaper = exports.PopoverPaper = (0, _zeroStyled.styled)(_Paper.default, {
|
78 | name: 'MuiPopover',
|
79 | slot: 'Paper',
|
80 | overridesResolver: (props, styles) => styles.paper
|
81 | })({
|
82 | position: 'absolute',
|
83 | overflowY: 'auto',
|
84 | overflowX: 'hidden',
|
85 |
|
86 |
|
87 | minWidth: 16,
|
88 | minHeight: 16,
|
89 | maxWidth: 'calc(100% - 32px)',
|
90 | maxHeight: 'calc(100% - 32px)',
|
91 |
|
92 | outline: 0
|
93 | });
|
94 | const Popover = React.forwardRef(function Popover(inProps, ref) {
|
95 | const props = (0, _DefaultPropsProvider.useDefaultProps)({
|
96 | props: inProps,
|
97 | name: 'MuiPopover'
|
98 | });
|
99 | const {
|
100 | action,
|
101 | anchorEl,
|
102 | anchorOrigin = {
|
103 | vertical: 'top',
|
104 | horizontal: 'left'
|
105 | },
|
106 | anchorPosition,
|
107 | anchorReference = 'anchorEl',
|
108 | children,
|
109 | className,
|
110 | container: containerProp,
|
111 | elevation = 8,
|
112 | marginThreshold = 16,
|
113 | open,
|
114 | PaperProps: PaperPropsProp = {},
|
115 | slots = {},
|
116 | slotProps = {},
|
117 | transformOrigin = {
|
118 | vertical: 'top',
|
119 | horizontal: 'left'
|
120 | },
|
121 | TransitionComponent = _Grow.default,
|
122 | transitionDuration: transitionDurationProp = 'auto',
|
123 | TransitionProps: {
|
124 | onEntering,
|
125 | ...TransitionProps
|
126 | } = {},
|
127 | disableScrollLock = false,
|
128 | ...other
|
129 | } = props;
|
130 | const externalPaperSlotProps = slotProps?.paper ?? PaperPropsProp;
|
131 | const paperRef = React.useRef();
|
132 | const ownerState = {
|
133 | ...props,
|
134 | anchorOrigin,
|
135 | anchorReference,
|
136 | elevation,
|
137 | marginThreshold,
|
138 | externalPaperSlotProps,
|
139 | transformOrigin,
|
140 | TransitionComponent,
|
141 | transitionDuration: transitionDurationProp,
|
142 | TransitionProps
|
143 | };
|
144 | const classes = useUtilityClasses(ownerState);
|
145 |
|
146 |
|
147 |
|
148 | const getAnchorOffset = React.useCallback(() => {
|
149 | if (anchorReference === 'anchorPosition') {
|
150 | if (process.env.NODE_ENV !== 'production') {
|
151 | if (!anchorPosition) {
|
152 | console.error('MUI: You need to provide a `anchorPosition` prop when using ' + '<Popover anchorReference="anchorPosition" />.');
|
153 | }
|
154 | }
|
155 | return anchorPosition;
|
156 | }
|
157 | const resolvedAnchorEl = resolveAnchorEl(anchorEl);
|
158 |
|
159 |
|
160 | const anchorElement = resolvedAnchorEl && resolvedAnchorEl.nodeType === 1 ? resolvedAnchorEl : (0, _ownerDocument.default)(paperRef.current).body;
|
161 | const anchorRect = anchorElement.getBoundingClientRect();
|
162 | if (process.env.NODE_ENV !== 'production') {
|
163 | const box = anchorElement.getBoundingClientRect();
|
164 | if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
|
165 | console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
|
166 | }
|
167 | }
|
168 | return {
|
169 | top: anchorRect.top + getOffsetTop(anchorRect, anchorOrigin.vertical),
|
170 | left: anchorRect.left + getOffsetLeft(anchorRect, anchorOrigin.horizontal)
|
171 | };
|
172 | }, [anchorEl, anchorOrigin.horizontal, anchorOrigin.vertical, anchorPosition, anchorReference]);
|
173 |
|
174 |
|
175 | const getTransformOrigin = React.useCallback(elemRect => {
|
176 | return {
|
177 | vertical: getOffsetTop(elemRect, transformOrigin.vertical),
|
178 | horizontal: getOffsetLeft(elemRect, transformOrigin.horizontal)
|
179 | };
|
180 | }, [transformOrigin.horizontal, transformOrigin.vertical]);
|
181 | const getPositioningStyle = React.useCallback(element => {
|
182 | const elemRect = {
|
183 | width: element.offsetWidth,
|
184 | height: element.offsetHeight
|
185 | };
|
186 |
|
187 |
|
188 | const elemTransformOrigin = getTransformOrigin(elemRect);
|
189 | if (anchorReference === 'none') {
|
190 | return {
|
191 | top: null,
|
192 | left: null,
|
193 | transformOrigin: getTransformOriginValue(elemTransformOrigin)
|
194 | };
|
195 | }
|
196 |
|
197 |
|
198 | const anchorOffset = getAnchorOffset();
|
199 |
|
200 |
|
201 | let top = anchorOffset.top - elemTransformOrigin.vertical;
|
202 | let left = anchorOffset.left - elemTransformOrigin.horizontal;
|
203 | const bottom = top + elemRect.height;
|
204 | const right = left + elemRect.width;
|
205 |
|
206 |
|
207 | const containerWindow = (0, _ownerWindow.default)(resolveAnchorEl(anchorEl));
|
208 |
|
209 |
|
210 | const heightThreshold = containerWindow.innerHeight - marginThreshold;
|
211 | const widthThreshold = containerWindow.innerWidth - marginThreshold;
|
212 |
|
213 |
|
214 | if (marginThreshold !== null && top < marginThreshold) {
|
215 | const diff = top - marginThreshold;
|
216 | top -= diff;
|
217 | elemTransformOrigin.vertical += diff;
|
218 | } else if (marginThreshold !== null && bottom > heightThreshold) {
|
219 | const diff = bottom - heightThreshold;
|
220 | top -= diff;
|
221 | elemTransformOrigin.vertical += diff;
|
222 | }
|
223 | if (process.env.NODE_ENV !== 'production') {
|
224 | if (elemRect.height > heightThreshold && elemRect.height && heightThreshold) {
|
225 | console.error(['MUI: The popover component is too tall.', `Some part of it can not be seen on the screen (${elemRect.height - heightThreshold}px).`, 'Please consider adding a `max-height` to improve the user-experience.'].join('\n'));
|
226 | }
|
227 | }
|
228 |
|
229 |
|
230 | if (marginThreshold !== null && left < marginThreshold) {
|
231 | const diff = left - marginThreshold;
|
232 | left -= diff;
|
233 | elemTransformOrigin.horizontal += diff;
|
234 | } else if (right > widthThreshold) {
|
235 | const diff = right - widthThreshold;
|
236 | left -= diff;
|
237 | elemTransformOrigin.horizontal += diff;
|
238 | }
|
239 | return {
|
240 | top: `${Math.round(top)}px`,
|
241 | left: `${Math.round(left)}px`,
|
242 | transformOrigin: getTransformOriginValue(elemTransformOrigin)
|
243 | };
|
244 | }, [anchorEl, anchorReference, getAnchorOffset, getTransformOrigin, marginThreshold]);
|
245 | const [isPositioned, setIsPositioned] = React.useState(open);
|
246 | const setPositioningStyles = React.useCallback(() => {
|
247 | const element = paperRef.current;
|
248 | if (!element) {
|
249 | return;
|
250 | }
|
251 | const positioning = getPositioningStyle(element);
|
252 | if (positioning.top !== null) {
|
253 | element.style.setProperty('top', positioning.top);
|
254 | }
|
255 | if (positioning.left !== null) {
|
256 | element.style.left = positioning.left;
|
257 | }
|
258 | element.style.transformOrigin = positioning.transformOrigin;
|
259 | setIsPositioned(true);
|
260 | }, [getPositioningStyle]);
|
261 | React.useEffect(() => {
|
262 | if (disableScrollLock) {
|
263 | window.addEventListener('scroll', setPositioningStyles);
|
264 | }
|
265 | return () => window.removeEventListener('scroll', setPositioningStyles);
|
266 | }, [anchorEl, disableScrollLock, setPositioningStyles]);
|
267 | const handleEntering = (element, isAppearing) => {
|
268 | if (onEntering) {
|
269 | onEntering(element, isAppearing);
|
270 | }
|
271 | setPositioningStyles();
|
272 | };
|
273 | const handleExited = () => {
|
274 | setIsPositioned(false);
|
275 | };
|
276 | React.useEffect(() => {
|
277 | if (open) {
|
278 | setPositioningStyles();
|
279 | }
|
280 | });
|
281 | React.useImperativeHandle(action, () => open ? {
|
282 | updatePosition: () => {
|
283 | setPositioningStyles();
|
284 | }
|
285 | } : null, [open, setPositioningStyles]);
|
286 | React.useEffect(() => {
|
287 | if (!open) {
|
288 | return undefined;
|
289 | }
|
290 | const handleResize = (0, _debounce.default)(() => {
|
291 | setPositioningStyles();
|
292 | });
|
293 | const containerWindow = (0, _ownerWindow.default)(anchorEl);
|
294 | containerWindow.addEventListener('resize', handleResize);
|
295 | return () => {
|
296 | handleResize.clear();
|
297 | containerWindow.removeEventListener('resize', handleResize);
|
298 | };
|
299 | }, [anchorEl, open, setPositioningStyles]);
|
300 | let transitionDuration = transitionDurationProp;
|
301 | if (transitionDurationProp === 'auto' && !TransitionComponent.muiSupportAuto) {
|
302 | transitionDuration = undefined;
|
303 | }
|
304 |
|
305 |
|
306 |
|
307 |
|
308 | const container = containerProp || (anchorEl ? (0, _ownerDocument.default)(resolveAnchorEl(anchorEl)).body : undefined);
|
309 | const externalForwardedProps = {
|
310 | slots,
|
311 | slotProps: {
|
312 | ...slotProps,
|
313 | paper: externalPaperSlotProps
|
314 | }
|
315 | };
|
316 | const [PaperSlot, paperProps] = (0, _useSlot.default)('paper', {
|
317 | elementType: PopoverPaper,
|
318 | externalForwardedProps,
|
319 | additionalProps: {
|
320 | elevation,
|
321 | className: (0, _clsx.default)(classes.paper, externalPaperSlotProps?.className),
|
322 | style: isPositioned ? externalPaperSlotProps.style : {
|
323 | ...externalPaperSlotProps.style,
|
324 | opacity: 0
|
325 | }
|
326 | },
|
327 | ownerState
|
328 | });
|
329 | const [RootSlot, {
|
330 | slotProps: rootSlotPropsProp,
|
331 | ...rootProps
|
332 | }] = (0, _useSlot.default)('root', {
|
333 | elementType: PopoverRoot,
|
334 | externalForwardedProps,
|
335 | additionalProps: {
|
336 | slotProps: {
|
337 | backdrop: {
|
338 | invisible: true
|
339 | }
|
340 | },
|
341 | container,
|
342 | open
|
343 | },
|
344 | ownerState,
|
345 | className: (0, _clsx.default)(classes.root, className)
|
346 | });
|
347 | const handlePaperRef = (0, _useForkRef.default)(paperRef, paperProps.ref);
|
348 | return (0, _jsxRuntime.jsx)(RootSlot, {
|
349 | ...rootProps,
|
350 | ...(!(0, _isHostComponent.default)(RootSlot) && {
|
351 | slotProps: rootSlotPropsProp,
|
352 | disableScrollLock
|
353 | }),
|
354 | ...other,
|
355 | ref: ref,
|
356 | children: (0, _jsxRuntime.jsx)(TransitionComponent, {
|
357 | appear: true,
|
358 | in: open,
|
359 | onEntering: handleEntering,
|
360 | onExited: handleExited,
|
361 | timeout: transitionDuration,
|
362 | ...TransitionProps,
|
363 | children: (0, _jsxRuntime.jsx)(PaperSlot, {
|
364 | ...paperProps,
|
365 | ref: handlePaperRef,
|
366 | children: children
|
367 | })
|
368 | })
|
369 | });
|
370 | });
|
371 | process.env.NODE_ENV !== "production" ? Popover.propTypes = {
|
372 |
|
373 |
|
374 |
|
375 |
|
376 | |
377 |
|
378 |
|
379 |
|
380 | action: _refType.default,
|
381 | |
382 |
|
383 |
|
384 |
|
385 |
|
386 | anchorEl: (0, _chainPropTypes.default)(_propTypes.default.oneOfType([_HTMLElementType.default, _propTypes.default.func]), props => {
|
387 | if (props.open && (!props.anchorReference || props.anchorReference === 'anchorEl')) {
|
388 | const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);
|
389 | if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {
|
390 | const box = resolvedAnchorEl.getBoundingClientRect();
|
391 | if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
|
392 | return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
|
393 | }
|
394 | } else {
|
395 | return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', `It should be an Element or PopoverVirtualElement instance but it's \`${resolvedAnchorEl}\` instead.`].join('\n'));
|
396 | }
|
397 | }
|
398 | return null;
|
399 | }),
|
400 | |
401 |
|
402 |
|
403 |
|
404 |
|
405 |
|
406 |
|
407 |
|
408 |
|
409 |
|
410 |
|
411 |
|
412 |
|
413 | anchorOrigin: _propTypes.default.shape({
|
414 | horizontal: _propTypes.default.oneOfType([_propTypes.default.oneOf(['center', 'left', 'right']), _propTypes.default.number]).isRequired,
|
415 | vertical: _propTypes.default.oneOfType([_propTypes.default.oneOf(['bottom', 'center', 'top']), _propTypes.default.number]).isRequired
|
416 | }),
|
417 | |
418 |
|
419 |
|
420 |
|
421 | anchorPosition: _propTypes.default.shape({
|
422 | left: _propTypes.default.number.isRequired,
|
423 | top: _propTypes.default.number.isRequired
|
424 | }),
|
425 | |
426 |
|
427 |
|
428 |
|
429 |
|
430 | anchorReference: _propTypes.default.oneOf(['anchorEl', 'anchorPosition', 'none']),
|
431 | |
432 |
|
433 |
|
434 |
|
435 |
|
436 |
|
437 |
|
438 |
|
439 |
|
440 |
|
441 |
|
442 |
|
443 |
|
444 |
|
445 | BackdropComponent: _propTypes.default.elementType,
|
446 | |
447 |
|
448 |
|
449 |
|
450 | BackdropProps: _propTypes.default.object,
|
451 | |
452 |
|
453 |
|
454 | children: _propTypes.default.node,
|
455 | |
456 |
|
457 |
|
458 | classes: _propTypes.default.object,
|
459 | |
460 |
|
461 |
|
462 | className: _propTypes.default.string,
|
463 | |
464 |
|
465 |
|
466 |
|
467 |
|
468 |
|
469 |
|
470 | container: _propTypes.default .oneOfType([_HTMLElementType.default, _propTypes.default.func]),
|
471 | |
472 |
|
473 |
|
474 |
|
475 | disableScrollLock: _propTypes.default.bool,
|
476 | |
477 |
|
478 |
|
479 |
|
480 | elevation: _integerPropType.default,
|
481 | |
482 |
|
483 |
|
484 |
|
485 |
|
486 | marginThreshold: _propTypes.default.number,
|
487 | |
488 |
|
489 |
|
490 |
|
491 | onClose: _propTypes.default.func,
|
492 | |
493 |
|
494 |
|
495 | open: _propTypes.default.bool.isRequired,
|
496 | |
497 |
|
498 |
|
499 |
|
500 |
|
501 |
|
502 |
|
503 |
|
504 | PaperProps: _propTypes.default .shape({
|
505 | component: _elementTypeAcceptingRef.default
|
506 | }),
|
507 | |
508 |
|
509 |
|
510 |
|
511 | slotProps: _propTypes.default.shape({
|
512 | paper: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
|
513 | root: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])
|
514 | }),
|
515 | |
516 |
|
517 |
|
518 |
|
519 | slots: _propTypes.default.shape({
|
520 | paper: _propTypes.default.elementType,
|
521 | root: _propTypes.default.elementType
|
522 | }),
|
523 | |
524 |
|
525 |
|
526 | 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]),
|
527 | |
528 |
|
529 |
|
530 |
|
531 |
|
532 |
|
533 |
|
534 |
|
535 |
|
536 |
|
537 |
|
538 |
|
539 | transformOrigin: _propTypes.default.shape({
|
540 | horizontal: _propTypes.default.oneOfType([_propTypes.default.oneOf(['center', 'left', 'right']), _propTypes.default.number]).isRequired,
|
541 | vertical: _propTypes.default.oneOfType([_propTypes.default.oneOf(['bottom', 'center', 'top']), _propTypes.default.number]).isRequired
|
542 | }),
|
543 | |
544 |
|
545 |
|
546 |
|
547 |
|
548 | TransitionComponent: _propTypes.default.elementType,
|
549 | |
550 |
|
551 |
|
552 |
|
553 | transitionDuration: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.shape({
|
554 | appear: _propTypes.default.number,
|
555 | enter: _propTypes.default.number,
|
556 | exit: _propTypes.default.number
|
557 | })]),
|
558 | |
559 |
|
560 |
|
561 |
|
562 |
|
563 | TransitionProps: _propTypes.default.object
|
564 | } : void 0;
|
565 | var _default = exports.default = Popover; |
\ | No newline at end of file |