UNPKG

30.4 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;
10exports.testReset = testReset;
11var React = _interopRequireWildcard(require("react"));
12var _propTypes = _interopRequireDefault(require("prop-types"));
13var _clsx = _interopRequireDefault(require("clsx"));
14var _useTimeout = _interopRequireWildcard(require("@mui/utils/useTimeout"));
15var _elementAcceptingRef = _interopRequireDefault(require("@mui/utils/elementAcceptingRef"));
16var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
17var _colorManipulator = require("@mui/system/colorManipulator");
18var _RtlProvider = require("@mui/system/RtlProvider");
19var _isFocusVisible = _interopRequireDefault(require("@mui/utils/isFocusVisible"));
20var _appendOwnerState = _interopRequireDefault(require("@mui/utils/appendOwnerState"));
21var _getReactElementRef = _interopRequireDefault(require("@mui/utils/getReactElementRef"));
22var _zeroStyled = require("../zero-styled");
23var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
24var _DefaultPropsProvider = require("../DefaultPropsProvider");
25var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
26var _Grow = _interopRequireDefault(require("../Grow"));
27var _Popper = _interopRequireDefault(require("../Popper"));
28var _useEventCallback = _interopRequireDefault(require("../utils/useEventCallback"));
29var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
30var _useId = _interopRequireDefault(require("../utils/useId"));
31var _useControlled = _interopRequireDefault(require("../utils/useControlled"));
32var _tooltipClasses = _interopRequireWildcard(require("./tooltipClasses"));
33var _jsxRuntime = require("react/jsx-runtime");
34function round(value) {
35 return Math.round(value * 1e5) / 1e5;
36}
37const useUtilityClasses = ownerState => {
38 const {
39 classes,
40 disableInteractive,
41 arrow,
42 touch,
43 placement
44 } = ownerState;
45 const slots = {
46 popper: ['popper', !disableInteractive && 'popperInteractive', arrow && 'popperArrow'],
47 tooltip: ['tooltip', arrow && 'tooltipArrow', touch && 'touch', `tooltipPlacement${(0, _capitalize.default)(placement.split('-')[0])}`],
48 arrow: ['arrow']
49 };
50 return (0, _composeClasses.default)(slots, _tooltipClasses.getTooltipUtilityClass, classes);
51};
52const TooltipPopper = (0, _zeroStyled.styled)(_Popper.default, {
53 name: 'MuiTooltip',
54 slot: 'Popper',
55 overridesResolver: (props, styles) => {
56 const {
57 ownerState
58 } = props;
59 return [styles.popper, !ownerState.disableInteractive && styles.popperInteractive, ownerState.arrow && styles.popperArrow, !ownerState.open && styles.popperClose];
60 }
61})((0, _memoTheme.default)(({
62 theme
63}) => ({
64 zIndex: (theme.vars || theme).zIndex.tooltip,
65 pointerEvents: 'none',
66 variants: [{
67 props: ({
68 ownerState
69 }) => !ownerState.disableInteractive,
70 style: {
71 pointerEvents: 'auto'
72 }
73 }, {
74 props: ({
75 open
76 }) => !open,
77 style: {
78 pointerEvents: 'none'
79 }
80 }, {
81 props: ({
82 ownerState
83 }) => ownerState.arrow,
84 style: {
85 [`&[data-popper-placement*="bottom"] .${_tooltipClasses.default.arrow}`]: {
86 top: 0,
87 marginTop: '-0.71em',
88 '&::before': {
89 transformOrigin: '0 100%'
90 }
91 },
92 [`&[data-popper-placement*="top"] .${_tooltipClasses.default.arrow}`]: {
93 bottom: 0,
94 marginBottom: '-0.71em',
95 '&::before': {
96 transformOrigin: '100% 0'
97 }
98 },
99 [`&[data-popper-placement*="right"] .${_tooltipClasses.default.arrow}`]: {
100 height: '1em',
101 width: '0.71em',
102 '&::before': {
103 transformOrigin: '100% 100%'
104 }
105 },
106 [`&[data-popper-placement*="left"] .${_tooltipClasses.default.arrow}`]: {
107 height: '1em',
108 width: '0.71em',
109 '&::before': {
110 transformOrigin: '0 0'
111 }
112 }
113 }
114 }, {
115 props: ({
116 ownerState
117 }) => ownerState.arrow && !ownerState.isRtl,
118 style: {
119 [`&[data-popper-placement*="right"] .${_tooltipClasses.default.arrow}`]: {
120 left: 0,
121 marginLeft: '-0.71em'
122 }
123 }
124 }, {
125 props: ({
126 ownerState
127 }) => ownerState.arrow && !!ownerState.isRtl,
128 style: {
129 [`&[data-popper-placement*="right"] .${_tooltipClasses.default.arrow}`]: {
130 right: 0,
131 marginRight: '-0.71em'
132 }
133 }
134 }, {
135 props: ({
136 ownerState
137 }) => ownerState.arrow && !ownerState.isRtl,
138 style: {
139 [`&[data-popper-placement*="left"] .${_tooltipClasses.default.arrow}`]: {
140 right: 0,
141 marginRight: '-0.71em'
142 }
143 }
144 }, {
145 props: ({
146 ownerState
147 }) => ownerState.arrow && !!ownerState.isRtl,
148 style: {
149 [`&[data-popper-placement*="left"] .${_tooltipClasses.default.arrow}`]: {
150 left: 0,
151 marginLeft: '-0.71em'
152 }
153 }
154 }]
155})));
156const TooltipTooltip = (0, _zeroStyled.styled)('div', {
157 name: 'MuiTooltip',
158 slot: 'Tooltip',
159 overridesResolver: (props, styles) => {
160 const {
161 ownerState
162 } = props;
163 return [styles.tooltip, ownerState.touch && styles.touch, ownerState.arrow && styles.tooltipArrow, styles[`tooltipPlacement${(0, _capitalize.default)(ownerState.placement.split('-')[0])}`]];
164 }
165})((0, _memoTheme.default)(({
166 theme
167}) => ({
168 backgroundColor: theme.vars ? theme.vars.palette.Tooltip.bg : (0, _colorManipulator.alpha)(theme.palette.grey[700], 0.92),
169 borderRadius: (theme.vars || theme).shape.borderRadius,
170 color: (theme.vars || theme).palette.common.white,
171 fontFamily: theme.typography.fontFamily,
172 padding: '4px 8px',
173 fontSize: theme.typography.pxToRem(11),
174 maxWidth: 300,
175 margin: 2,
176 wordWrap: 'break-word',
177 fontWeight: theme.typography.fontWeightMedium,
178 [`.${_tooltipClasses.default.popper}[data-popper-placement*="left"] &`]: {
179 transformOrigin: 'right center'
180 },
181 [`.${_tooltipClasses.default.popper}[data-popper-placement*="right"] &`]: {
182 transformOrigin: 'left center'
183 },
184 [`.${_tooltipClasses.default.popper}[data-popper-placement*="top"] &`]: {
185 transformOrigin: 'center bottom',
186 marginBottom: '14px'
187 },
188 [`.${_tooltipClasses.default.popper}[data-popper-placement*="bottom"] &`]: {
189 transformOrigin: 'center top',
190 marginTop: '14px'
191 },
192 variants: [{
193 props: ({
194 ownerState
195 }) => ownerState.arrow,
196 style: {
197 position: 'relative',
198 margin: 0
199 }
200 }, {
201 props: ({
202 ownerState
203 }) => ownerState.touch,
204 style: {
205 padding: '8px 16px',
206 fontSize: theme.typography.pxToRem(14),
207 lineHeight: `${round(16 / 14)}em`,
208 fontWeight: theme.typography.fontWeightRegular
209 }
210 }, {
211 props: ({
212 ownerState
213 }) => !ownerState.isRtl,
214 style: {
215 [`.${_tooltipClasses.default.popper}[data-popper-placement*="left"] &`]: {
216 marginRight: '14px'
217 },
218 [`.${_tooltipClasses.default.popper}[data-popper-placement*="right"] &`]: {
219 marginLeft: '14px'
220 }
221 }
222 }, {
223 props: ({
224 ownerState
225 }) => !ownerState.isRtl && ownerState.touch,
226 style: {
227 [`.${_tooltipClasses.default.popper}[data-popper-placement*="left"] &`]: {
228 marginRight: '24px'
229 },
230 [`.${_tooltipClasses.default.popper}[data-popper-placement*="right"] &`]: {
231 marginLeft: '24px'
232 }
233 }
234 }, {
235 props: ({
236 ownerState
237 }) => !!ownerState.isRtl,
238 style: {
239 [`.${_tooltipClasses.default.popper}[data-popper-placement*="left"] &`]: {
240 marginLeft: '14px'
241 },
242 [`.${_tooltipClasses.default.popper}[data-popper-placement*="right"] &`]: {
243 marginRight: '14px'
244 }
245 }
246 }, {
247 props: ({
248 ownerState
249 }) => !!ownerState.isRtl && ownerState.touch,
250 style: {
251 [`.${_tooltipClasses.default.popper}[data-popper-placement*="left"] &`]: {
252 marginLeft: '24px'
253 },
254 [`.${_tooltipClasses.default.popper}[data-popper-placement*="right"] &`]: {
255 marginRight: '24px'
256 }
257 }
258 }, {
259 props: ({
260 ownerState
261 }) => ownerState.touch,
262 style: {
263 [`.${_tooltipClasses.default.popper}[data-popper-placement*="top"] &`]: {
264 marginBottom: '24px'
265 }
266 }
267 }, {
268 props: ({
269 ownerState
270 }) => ownerState.touch,
271 style: {
272 [`.${_tooltipClasses.default.popper}[data-popper-placement*="bottom"] &`]: {
273 marginTop: '24px'
274 }
275 }
276 }]
277})));
278const TooltipArrow = (0, _zeroStyled.styled)('span', {
279 name: 'MuiTooltip',
280 slot: 'Arrow',
281 overridesResolver: (props, styles) => styles.arrow
282})((0, _memoTheme.default)(({
283 theme
284}) => ({
285 overflow: 'hidden',
286 position: 'absolute',
287 width: '1em',
288 height: '0.71em' /* = width / sqrt(2) = (length of the hypotenuse) */,
289 boxSizing: 'border-box',
290 color: theme.vars ? theme.vars.palette.Tooltip.bg : (0, _colorManipulator.alpha)(theme.palette.grey[700], 0.9),
291 '&::before': {
292 content: '""',
293 margin: 'auto',
294 display: 'block',
295 width: '100%',
296 height: '100%',
297 backgroundColor: 'currentColor',
298 transform: 'rotate(45deg)'
299 }
300})));
301let hystersisOpen = false;
302const hystersisTimer = new _useTimeout.Timeout();
303let cursorPosition = {
304 x: 0,
305 y: 0
306};
307function testReset() {
308 hystersisOpen = false;
309 hystersisTimer.clear();
310}
311function composeEventHandler(handler, eventHandler) {
312 return (event, ...params) => {
313 if (eventHandler) {
314 eventHandler(event, ...params);
315 }
316 handler(event, ...params);
317 };
318}
319
320// TODO v6: Remove PopperComponent, PopperProps, TransitionComponent and TransitionProps.
321const Tooltip = /*#__PURE__*/React.forwardRef(function Tooltip(inProps, ref) {
322 const props = (0, _DefaultPropsProvider.useDefaultProps)({
323 props: inProps,
324 name: 'MuiTooltip'
325 });
326 const {
327 arrow = false,
328 children: childrenProp,
329 classes: classesProp,
330 components = {},
331 componentsProps = {},
332 describeChild = false,
333 disableFocusListener = false,
334 disableHoverListener = false,
335 disableInteractive: disableInteractiveProp = false,
336 disableTouchListener = false,
337 enterDelay = 100,
338 enterNextDelay = 0,
339 enterTouchDelay = 700,
340 followCursor = false,
341 id: idProp,
342 leaveDelay = 0,
343 leaveTouchDelay = 1500,
344 onClose,
345 onOpen,
346 open: openProp,
347 placement = 'bottom',
348 PopperComponent: PopperComponentProp,
349 PopperProps = {},
350 slotProps = {},
351 slots = {},
352 title,
353 TransitionComponent: TransitionComponentProp = _Grow.default,
354 TransitionProps,
355 ...other
356 } = props;
357
358 // to prevent runtime errors, developers will need to provide a child as a React element anyway.
359 const children = /*#__PURE__*/React.isValidElement(childrenProp) ? childrenProp : /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
360 children: childrenProp
361 });
362 const theme = (0, _zeroStyled.useTheme)();
363 const isRtl = (0, _RtlProvider.useRtl)();
364 const [childNode, setChildNode] = React.useState();
365 const [arrowRef, setArrowRef] = React.useState(null);
366 const ignoreNonTouchEvents = React.useRef(false);
367 const disableInteractive = disableInteractiveProp || followCursor;
368 const closeTimer = (0, _useTimeout.default)();
369 const enterTimer = (0, _useTimeout.default)();
370 const leaveTimer = (0, _useTimeout.default)();
371 const touchTimer = (0, _useTimeout.default)();
372 const [openState, setOpenState] = (0, _useControlled.default)({
373 controlled: openProp,
374 default: false,
375 name: 'Tooltip',
376 state: 'open'
377 });
378 let open = openState;
379 if (process.env.NODE_ENV !== 'production') {
380 // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
381 // eslint-disable-next-line react-hooks/rules-of-hooks -- process.env never changes
382 const {
383 current: isControlled
384 } = React.useRef(openProp !== undefined);
385
386 // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
387 // eslint-disable-next-line react-hooks/rules-of-hooks -- process.env never changes
388 React.useEffect(() => {
389 if (childNode && childNode.disabled && !isControlled && title !== '' && childNode.tagName.toLowerCase() === 'button') {
390 console.error(['MUI: You are providing a disabled `button` child to the Tooltip component.', 'A disabled element does not fire events.', "Tooltip needs to listen to the child element's events to display the title.", '', 'Add a simple wrapper element, such as a `span`.'].join('\n'));
391 }
392 }, [title, childNode, isControlled]);
393 }
394 const id = (0, _useId.default)(idProp);
395 const prevUserSelect = React.useRef();
396 const stopTouchInteraction = (0, _useEventCallback.default)(() => {
397 if (prevUserSelect.current !== undefined) {
398 document.body.style.WebkitUserSelect = prevUserSelect.current;
399 prevUserSelect.current = undefined;
400 }
401 touchTimer.clear();
402 });
403 React.useEffect(() => stopTouchInteraction, [stopTouchInteraction]);
404 const handleOpen = event => {
405 hystersisTimer.clear();
406 hystersisOpen = true;
407
408 // The mouseover event will trigger for every nested element in the tooltip.
409 // We can skip rerendering when the tooltip is already open.
410 // We are using the mouseover event instead of the mouseenter event to fix a hide/show issue.
411 setOpenState(true);
412 if (onOpen && !open) {
413 onOpen(event);
414 }
415 };
416 const handleClose = (0, _useEventCallback.default)(
417 /**
418 * @param {React.SyntheticEvent | Event} event
419 */
420 event => {
421 hystersisTimer.start(800 + leaveDelay, () => {
422 hystersisOpen = false;
423 });
424 setOpenState(false);
425 if (onClose && open) {
426 onClose(event);
427 }
428 closeTimer.start(theme.transitions.duration.shortest, () => {
429 ignoreNonTouchEvents.current = false;
430 });
431 });
432 const handleMouseOver = event => {
433 if (ignoreNonTouchEvents.current && event.type !== 'touchstart') {
434 return;
435 }
436
437 // Remove the title ahead of time.
438 // We don't want to wait for the next render commit.
439 // We would risk displaying two tooltips at the same time (native + this one).
440 if (childNode) {
441 childNode.removeAttribute('title');
442 }
443 enterTimer.clear();
444 leaveTimer.clear();
445 if (enterDelay || hystersisOpen && enterNextDelay) {
446 enterTimer.start(hystersisOpen ? enterNextDelay : enterDelay, () => {
447 handleOpen(event);
448 });
449 } else {
450 handleOpen(event);
451 }
452 };
453 const handleMouseLeave = event => {
454 enterTimer.clear();
455 leaveTimer.start(leaveDelay, () => {
456 handleClose(event);
457 });
458 };
459 const [, setChildIsFocusVisible] = React.useState(false);
460 const handleBlur = event => {
461 if (!(0, _isFocusVisible.default)(event.target)) {
462 setChildIsFocusVisible(false);
463 handleMouseLeave(event);
464 }
465 };
466 const handleFocus = event => {
467 // Workaround for https://github.com/facebook/react/issues/7769
468 // The autoFocus of React might trigger the event before the componentDidMount.
469 // We need to account for this eventuality.
470 if (!childNode) {
471 setChildNode(event.currentTarget);
472 }
473 if ((0, _isFocusVisible.default)(event.target)) {
474 setChildIsFocusVisible(true);
475 handleMouseOver(event);
476 }
477 };
478 const detectTouchStart = event => {
479 ignoreNonTouchEvents.current = true;
480 const childrenProps = children.props;
481 if (childrenProps.onTouchStart) {
482 childrenProps.onTouchStart(event);
483 }
484 };
485 const handleTouchStart = event => {
486 detectTouchStart(event);
487 leaveTimer.clear();
488 closeTimer.clear();
489 stopTouchInteraction();
490 prevUserSelect.current = document.body.style.WebkitUserSelect;
491 // Prevent iOS text selection on long-tap.
492 document.body.style.WebkitUserSelect = 'none';
493 touchTimer.start(enterTouchDelay, () => {
494 document.body.style.WebkitUserSelect = prevUserSelect.current;
495 handleMouseOver(event);
496 });
497 };
498 const handleTouchEnd = event => {
499 if (children.props.onTouchEnd) {
500 children.props.onTouchEnd(event);
501 }
502 stopTouchInteraction();
503 leaveTimer.start(leaveTouchDelay, () => {
504 handleClose(event);
505 });
506 };
507 React.useEffect(() => {
508 if (!open) {
509 return undefined;
510 }
511
512 /**
513 * @param {KeyboardEvent} nativeEvent
514 */
515 function handleKeyDown(nativeEvent) {
516 if (nativeEvent.key === 'Escape') {
517 handleClose(nativeEvent);
518 }
519 }
520 document.addEventListener('keydown', handleKeyDown);
521 return () => {
522 document.removeEventListener('keydown', handleKeyDown);
523 };
524 }, [handleClose, open]);
525 const handleRef = (0, _useForkRef.default)((0, _getReactElementRef.default)(children), setChildNode, ref);
526
527 // There is no point in displaying an empty tooltip.
528 // So we exclude all falsy values, except 0, which is valid.
529 if (!title && title !== 0) {
530 open = false;
531 }
532 const popperRef = React.useRef();
533 const handleMouseMove = event => {
534 const childrenProps = children.props;
535 if (childrenProps.onMouseMove) {
536 childrenProps.onMouseMove(event);
537 }
538 cursorPosition = {
539 x: event.clientX,
540 y: event.clientY
541 };
542 if (popperRef.current) {
543 popperRef.current.update();
544 }
545 };
546 const nameOrDescProps = {};
547 const titleIsString = typeof title === 'string';
548 if (describeChild) {
549 nameOrDescProps.title = !open && titleIsString && !disableHoverListener ? title : null;
550 nameOrDescProps['aria-describedby'] = open ? id : null;
551 } else {
552 nameOrDescProps['aria-label'] = titleIsString ? title : null;
553 nameOrDescProps['aria-labelledby'] = open && !titleIsString ? id : null;
554 }
555 const childrenProps = {
556 ...nameOrDescProps,
557 ...other,
558 ...children.props,
559 className: (0, _clsx.default)(other.className, children.props.className),
560 onTouchStart: detectTouchStart,
561 ref: handleRef,
562 ...(followCursor ? {
563 onMouseMove: handleMouseMove
564 } : {})
565 };
566 if (process.env.NODE_ENV !== 'production') {
567 childrenProps['data-mui-internal-clone-element'] = true;
568
569 // TODO: uncomment once we enable eslint-plugin-react-compiler // eslint-disable-next-line react-compiler/react-compiler
570 // eslint-disable-next-line react-hooks/rules-of-hooks -- process.env never changes
571 React.useEffect(() => {
572 if (childNode && !childNode.getAttribute('data-mui-internal-clone-element')) {
573 console.error(['MUI: The `children` component of the Tooltip is not forwarding its props correctly.', 'Please make sure that props are spread on the same element that the ref is applied to.'].join('\n'));
574 }
575 }, [childNode]);
576 }
577 const interactiveWrapperListeners = {};
578 if (!disableTouchListener) {
579 childrenProps.onTouchStart = handleTouchStart;
580 childrenProps.onTouchEnd = handleTouchEnd;
581 }
582 if (!disableHoverListener) {
583 childrenProps.onMouseOver = composeEventHandler(handleMouseOver, childrenProps.onMouseOver);
584 childrenProps.onMouseLeave = composeEventHandler(handleMouseLeave, childrenProps.onMouseLeave);
585 if (!disableInteractive) {
586 interactiveWrapperListeners.onMouseOver = handleMouseOver;
587 interactiveWrapperListeners.onMouseLeave = handleMouseLeave;
588 }
589 }
590 if (!disableFocusListener) {
591 childrenProps.onFocus = composeEventHandler(handleFocus, childrenProps.onFocus);
592 childrenProps.onBlur = composeEventHandler(handleBlur, childrenProps.onBlur);
593 if (!disableInteractive) {
594 interactiveWrapperListeners.onFocus = handleFocus;
595 interactiveWrapperListeners.onBlur = handleBlur;
596 }
597 }
598 if (process.env.NODE_ENV !== 'production') {
599 if (children.props.title) {
600 console.error(['MUI: You have provided a `title` prop to the child of <Tooltip />.', `Remove this title prop \`${children.props.title}\` or the Tooltip component.`].join('\n'));
601 }
602 }
603 const popperOptions = React.useMemo(() => {
604 let tooltipModifiers = [{
605 name: 'arrow',
606 enabled: Boolean(arrowRef),
607 options: {
608 element: arrowRef,
609 padding: 4
610 }
611 }];
612 if (PopperProps.popperOptions?.modifiers) {
613 tooltipModifiers = tooltipModifiers.concat(PopperProps.popperOptions.modifiers);
614 }
615 return {
616 ...PopperProps.popperOptions,
617 modifiers: tooltipModifiers
618 };
619 }, [arrowRef, PopperProps]);
620 const ownerState = {
621 ...props,
622 isRtl,
623 arrow,
624 disableInteractive,
625 placement,
626 PopperComponentProp,
627 touch: ignoreNonTouchEvents.current
628 };
629 const classes = useUtilityClasses(ownerState);
630 const PopperComponent = slots.popper ?? components.Popper ?? TooltipPopper;
631 const TransitionComponent = slots.transition ?? components.Transition ?? TransitionComponentProp ?? _Grow.default;
632 const TooltipComponent = slots.tooltip ?? components.Tooltip ?? TooltipTooltip;
633 const ArrowComponent = slots.arrow ?? components.Arrow ?? TooltipArrow;
634 const popperProps = (0, _appendOwnerState.default)(PopperComponent, {
635 ...PopperProps,
636 ...(slotProps.popper ?? componentsProps.popper),
637 className: (0, _clsx.default)(classes.popper, PopperProps?.className, (slotProps.popper ?? componentsProps.popper)?.className)
638 }, ownerState);
639 const transitionProps = (0, _appendOwnerState.default)(TransitionComponent, {
640 ...TransitionProps,
641 ...(slotProps.transition ?? componentsProps.transition)
642 }, ownerState);
643 const tooltipProps = (0, _appendOwnerState.default)(TooltipComponent, {
644 ...(slotProps.tooltip ?? componentsProps.tooltip),
645 className: (0, _clsx.default)(classes.tooltip, (slotProps.tooltip ?? componentsProps.tooltip)?.className)
646 }, ownerState);
647 const tooltipArrowProps = (0, _appendOwnerState.default)(ArrowComponent, {
648 ...(slotProps.arrow ?? componentsProps.arrow),
649 className: (0, _clsx.default)(classes.arrow, (slotProps.arrow ?? componentsProps.arrow)?.className)
650 }, ownerState);
651 return /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
652 children: [/*#__PURE__*/React.cloneElement(children, childrenProps), /*#__PURE__*/(0, _jsxRuntime.jsx)(PopperComponent, {
653 as: PopperComponentProp ?? _Popper.default,
654 placement: placement,
655 anchorEl: followCursor ? {
656 getBoundingClientRect: () => ({
657 top: cursorPosition.y,
658 left: cursorPosition.x,
659 right: cursorPosition.x,
660 bottom: cursorPosition.y,
661 width: 0,
662 height: 0
663 })
664 } : childNode,
665 popperRef: popperRef,
666 open: childNode ? open : false,
667 id: id,
668 transition: true,
669 ...interactiveWrapperListeners,
670 ...popperProps,
671 popperOptions: popperOptions,
672 children: ({
673 TransitionProps: TransitionPropsInner
674 }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(TransitionComponent, {
675 timeout: theme.transitions.duration.shorter,
676 ...TransitionPropsInner,
677 ...transitionProps,
678 children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(TooltipComponent, {
679 ...tooltipProps,
680 children: [title, arrow ? /*#__PURE__*/(0, _jsxRuntime.jsx)(ArrowComponent, {
681 ...tooltipArrowProps,
682 ref: setArrowRef
683 }) : null]
684 })
685 })
686 })]
687 });
688});
689process.env.NODE_ENV !== "production" ? Tooltip.propTypes /* remove-proptypes */ = {
690 // ┌────────────────────────────── Warning ──────────────────────────────┐
691 // │ These PropTypes are generated from the TypeScript type definitions. │
692 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
693 // └─────────────────────────────────────────────────────────────────────┘
694 /**
695 * If `true`, adds an arrow to the tooltip.
696 * @default false
697 */
698 arrow: _propTypes.default.bool,
699 /**
700 * Tooltip reference element.
701 */
702 children: _elementAcceptingRef.default.isRequired,
703 /**
704 * Override or extend the styles applied to the component.
705 */
706 classes: _propTypes.default.object,
707 /**
708 * @ignore
709 */
710 className: _propTypes.default.string,
711 /**
712 * The components used for each slot inside.
713 *
714 * @deprecated use the `slots` prop instead. This prop will be removed in v7. [How to migrate](https://mui.com/material-ui/migration/migrating-from-deprecated-apis/).
715 *
716 * @default {}
717 */
718 components: _propTypes.default.shape({
719 Arrow: _propTypes.default.elementType,
720 Popper: _propTypes.default.elementType,
721 Tooltip: _propTypes.default.elementType,
722 Transition: _propTypes.default.elementType
723 }),
724 /**
725 * The extra props for the slot components.
726 * You can override the existing props or add new ones.
727 *
728 * @deprecated use the `slotProps` prop instead. This prop will be removed in v7. [How to migrate](https://mui.com/material-ui/migration/migrating-from-deprecated-apis/).
729 *
730 * @default {}
731 */
732 componentsProps: _propTypes.default.shape({
733 arrow: _propTypes.default.object,
734 popper: _propTypes.default.object,
735 tooltip: _propTypes.default.object,
736 transition: _propTypes.default.object
737 }),
738 /**
739 * Set to `true` if the `title` acts as an accessible description.
740 * By default the `title` acts as an accessible label for the child.
741 * @default false
742 */
743 describeChild: _propTypes.default.bool,
744 /**
745 * Do not respond to focus-visible events.
746 * @default false
747 */
748 disableFocusListener: _propTypes.default.bool,
749 /**
750 * Do not respond to hover events.
751 * @default false
752 */
753 disableHoverListener: _propTypes.default.bool,
754 /**
755 * Makes a tooltip not interactive, i.e. it will close when the user
756 * hovers over the tooltip before the `leaveDelay` is expired.
757 * @default false
758 */
759 disableInteractive: _propTypes.default.bool,
760 /**
761 * Do not respond to long press touch events.
762 * @default false
763 */
764 disableTouchListener: _propTypes.default.bool,
765 /**
766 * The number of milliseconds to wait before showing the tooltip.
767 * This prop won't impact the enter touch delay (`enterTouchDelay`).
768 * @default 100
769 */
770 enterDelay: _propTypes.default.number,
771 /**
772 * The number of milliseconds to wait before showing the tooltip when one was already recently opened.
773 * @default 0
774 */
775 enterNextDelay: _propTypes.default.number,
776 /**
777 * The number of milliseconds a user must touch the element before showing the tooltip.
778 * @default 700
779 */
780 enterTouchDelay: _propTypes.default.number,
781 /**
782 * If `true`, the tooltip follow the cursor over the wrapped element.
783 * @default false
784 */
785 followCursor: _propTypes.default.bool,
786 /**
787 * This prop is used to help implement the accessibility logic.
788 * If you don't provide this prop. It falls back to a randomly generated id.
789 */
790 id: _propTypes.default.string,
791 /**
792 * The number of milliseconds to wait before hiding the tooltip.
793 * This prop won't impact the leave touch delay (`leaveTouchDelay`).
794 * @default 0
795 */
796 leaveDelay: _propTypes.default.number,
797 /**
798 * The number of milliseconds after the user stops touching an element before hiding the tooltip.
799 * @default 1500
800 */
801 leaveTouchDelay: _propTypes.default.number,
802 /**
803 * Callback fired when the component requests to be closed.
804 *
805 * @param {React.SyntheticEvent} event The event source of the callback.
806 */
807 onClose: _propTypes.default.func,
808 /**
809 * Callback fired when the component requests to be open.
810 *
811 * @param {React.SyntheticEvent} event The event source of the callback.
812 */
813 onOpen: _propTypes.default.func,
814 /**
815 * If `true`, the component is shown.
816 */
817 open: _propTypes.default.bool,
818 /**
819 * Tooltip placement.
820 * @default 'bottom'
821 */
822 placement: _propTypes.default.oneOf(['bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),
823 /**
824 * The component used for the popper.
825 * @default Popper
826 */
827 PopperComponent: _propTypes.default.elementType,
828 /**
829 * Props applied to the [`Popper`](https://mui.com/material-ui/api/popper/) element.
830 * @default {}
831 */
832 PopperProps: _propTypes.default.object,
833 /**
834 * The extra props for the slot components.
835 * You can override the existing props or add new ones.
836 *
837 * This prop is an alias for the `componentsProps` prop, which will be deprecated in the future.
838 *
839 * @default {}
840 */
841 slotProps: _propTypes.default.shape({
842 arrow: _propTypes.default.object,
843 popper: _propTypes.default.object,
844 tooltip: _propTypes.default.object,
845 transition: _propTypes.default.object
846 }),
847 /**
848 * The components used for each slot inside.
849 *
850 * This prop is an alias for the `components` prop, which will be deprecated in the future.
851 *
852 * @default {}
853 */
854 slots: _propTypes.default.shape({
855 arrow: _propTypes.default.elementType,
856 popper: _propTypes.default.elementType,
857 tooltip: _propTypes.default.elementType,
858 transition: _propTypes.default.elementType
859 }),
860 /**
861 * The system prop that allows defining system overrides as well as additional CSS styles.
862 */
863 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]),
864 /**
865 * Tooltip title. Zero-length titles string, undefined, null and false are never displayed.
866 */
867 title: _propTypes.default.node,
868 /**
869 * The component used for the transition.
870 * [Follow this guide](https://mui.com/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.
871 * @default Grow
872 */
873 TransitionComponent: _propTypes.default.elementType,
874 /**
875 * Props applied to the transition element.
876 * By default, the element is based on this [`Transition`](https://reactcommunity.org/react-transition-group/transition/) component.
877 */
878 TransitionProps: _propTypes.default.object
879} : void 0;
880var _default = exports.default = Tooltip;
\No newline at end of file