@12-apps/ui 6.54.0 → 6.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.js +1 -1
- package/dist/_internal/components/data-display/Tooltip/Tooltip.js +1 -1
- package/dist/_internal/components/data-display/index.js +3 -3
- package/dist/_internal/components/index.js +8 -8
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +3 -3
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +5 -5
- package/dist/_internal/components/layout/index.js +7 -7
- package/dist/{chunk-TQCQCW2P.js → chunk-524PRSSD.js} +3 -3
- package/dist/chunk-524PRSSD.js.map +1 -0
- package/dist/{chunk-Y5QDXG5N.js → chunk-6WNMVWAV.js} +2 -2
- package/dist/chunk-AET54GT6.js +99 -0
- package/dist/chunk-AET54GT6.js.map +1 -0
- package/dist/{chunk-ZXEDKRRT.js → chunk-ECVNRLKD.js} +2 -2
- package/dist/{chunk-OESAYTNG.js → chunk-JDVHNDY3.js} +2 -2
- package/dist/{chunk-TYBZ4XZZ.js → chunk-KRIPQUFB.js} +27 -32
- package/dist/chunk-KRIPQUFB.js.map +1 -0
- package/dist/{chunk-N4R6T5K7.js → chunk-PKSU3RBT.js} +2 -2
- package/dist/{chunk-IRNKHHQM.js → chunk-QKMXMBUK.js} +2 -2
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/Tooltip.js +1 -1
- package/dist/layout/SettingCard.js +7 -7
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.d.ts +2 -2
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.d.ts.map +1 -1
- package/dist/types/components/data-display/Tooltip/Tooltip.d.ts +2 -2
- package/dist/types/components/data-display/Tooltip/Tooltip.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.ts +2 -2
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +102 -99
- package/src/components/data-display/Tooltip/Tooltip.tsx +64 -56
- package/dist/chunk-TQCQCW2P.js.map +0 -1
- package/dist/chunk-TYBZ4XZZ.js.map +0 -1
- package/dist/chunk-XM7QCNZQ.js +0 -110
- package/dist/chunk-XM7QCNZQ.js.map +0 -1
- /package/dist/{chunk-Y5QDXG5N.js.map → chunk-6WNMVWAV.js.map} +0 -0
- /package/dist/{chunk-ZXEDKRRT.js.map → chunk-ECVNRLKD.js.map} +0 -0
- /package/dist/{chunk-OESAYTNG.js.map → chunk-JDVHNDY3.js.map} +0 -0
- /package/dist/{chunk-N4R6T5K7.js.map → chunk-PKSU3RBT.js.map} +0 -0
- /package/dist/{chunk-IRNKHHQM.js.map → chunk-QKMXMBUK.js.map} +0 -0
|
@@ -5,17 +5,17 @@ import {
|
|
|
5
5
|
} from "../chunk-WAKGVAOB.js";
|
|
6
6
|
import {
|
|
7
7
|
SettingCard
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-JDVHNDY3.js";
|
|
9
9
|
import {
|
|
10
10
|
SettingToggle
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-QKMXMBUK.js";
|
|
12
12
|
import {
|
|
13
13
|
SettingGroup
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-ECVNRLKD.js";
|
|
15
15
|
import "../chunk-XJQNSMGA.js";
|
|
16
16
|
import "../chunk-SALQ65SM.js";
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
17
|
+
import "../chunk-6WNMVWAV.js";
|
|
18
|
+
import "../chunk-PKSU3RBT.js";
|
|
19
19
|
import "../chunk-2JTZWQ25.js";
|
|
20
20
|
import "../chunk-WE2LNTR6.js";
|
|
21
21
|
import "../chunk-BFRVMCQM.js";
|
|
@@ -23,8 +23,8 @@ import "../chunk-RN7UJI7S.js";
|
|
|
23
23
|
import "../chunk-JYWF76Z5.js";
|
|
24
24
|
import "../chunk-GGMB6LJH.js";
|
|
25
25
|
import "../chunk-TAF3YYMK.js";
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-AET54GT6.js";
|
|
27
|
+
import "../chunk-524PRSSD.js";
|
|
28
28
|
import "../chunk-QYJ25FWM.js";
|
|
29
29
|
import "../chunk-2GTORM5E.js";
|
|
30
30
|
import "../chunk-OZPLAOI4.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import type { InteractiveTooltipProps } from
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { InteractiveTooltipProps } from "./InteractiveTooltip.types";
|
|
3
3
|
export declare const InteractiveTooltip: React.ForwardRefExoticComponent<Omit<InteractiveTooltipProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
4
|
//# sourceMappingURL=InteractiveTooltip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractiveTooltip.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"InteractiveTooltip.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AA8B1E,eAAO,MAAM,kBAAkB,6GA8E7B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import type { TooltipProps } from
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { TooltipProps } from "./Tooltip.types";
|
|
3
3
|
export declare const Tooltip: React.ForwardRefExoticComponent<Omit<TooltipProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
4
|
//# sourceMappingURL=Tooltip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Tooltip/Tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/Tooltip/Tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAsIpD,eAAO,MAAM,OAAO,kGA+CnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -34,7 +34,7 @@ export const variantStyles = (theme: Theme, variant?: string): CSSObject => {
|
|
|
34
34
|
switch (variant) {
|
|
35
35
|
case 'default':
|
|
36
36
|
return {
|
|
37
|
-
backgroundColor:
|
|
37
|
+
backgroundColor: neutralTones(theme).inverseSurface,
|
|
38
38
|
color: absoluteInk(theme).white,
|
|
39
39
|
boxShadow: `${rems(theme, 0, 4, 12)} ${shadowInk(theme, 0.3)}`,
|
|
40
40
|
};
|
|
@@ -98,6 +98,6 @@ export const arrowColor = (theme: Theme, variant?: string): string => {
|
|
|
98
98
|
case 'dark':
|
|
99
99
|
return absoluteInk(theme).black;
|
|
100
100
|
default:
|
|
101
|
-
return
|
|
101
|
+
return neutralTones(theme).inverseSurface;
|
|
102
102
|
}
|
|
103
103
|
};
|
|
@@ -1,124 +1,127 @@
|
|
|
1
|
-
import MuiTooltip from
|
|
2
|
-
import {
|
|
3
|
-
import React from
|
|
1
|
+
import MuiTooltip from "@mui/material/Tooltip/index.js";
|
|
2
|
+
import type { CSSObject, Theme } from "@mui/material/styles/index.js";
|
|
3
|
+
import React from "react";
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
resolveTooltipProps,
|
|
7
|
+
useHoverOpen,
|
|
8
|
+
usePinnedTooltip,
|
|
9
|
+
} from "./InteractiveTooltip.hooks";
|
|
6
10
|
import {
|
|
7
11
|
arrowColor,
|
|
8
12
|
emphasisStyles,
|
|
9
13
|
getSizeStyles,
|
|
10
14
|
tooltipCap,
|
|
11
15
|
variantStyles,
|
|
12
|
-
} from
|
|
13
|
-
import type { InteractiveTooltipProps } from
|
|
14
|
-
|
|
15
|
-
const StyledTooltip = styled(MuiTooltip, {
|
|
16
|
-
shouldForwardProp: (prop) =>
|
|
17
|
-
!['customVariant', 'customSize', 'glow', 'pulse'].includes(prop as string),
|
|
18
|
-
})<{
|
|
19
|
-
customVariant?: string;
|
|
20
|
-
customSize?: string;
|
|
21
|
-
glow?: boolean;
|
|
22
|
-
pulse?: boolean;
|
|
23
|
-
}>(({ theme, customVariant, customSize, glow, pulse }) => {
|
|
24
|
-
const sizeStyles = getSizeStyles(customSize);
|
|
16
|
+
} from "./InteractiveTooltip.styles";
|
|
17
|
+
import type { InteractiveTooltipProps } from "./InteractiveTooltip.types";
|
|
25
18
|
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
/**
|
|
20
|
+
* The bubble's own look, applied to the BUBBLE (FUT-3093) — see `Tooltip`'s
|
|
21
|
+
* `bubbleSx`: a `& .MuiTooltip-tooltip` rule on the root never reached the
|
|
22
|
+
* portalled bubble, so the variants had never been on screen.
|
|
23
|
+
*/
|
|
24
|
+
const bubbleSx =
|
|
25
|
+
(
|
|
26
|
+
variant: string | undefined,
|
|
27
|
+
size: string | undefined,
|
|
28
|
+
glow: boolean | undefined,
|
|
29
|
+
pulse: boolean | undefined,
|
|
30
|
+
maxWidth: number | undefined,
|
|
31
|
+
) =>
|
|
32
|
+
(theme: Theme): CSSObject => {
|
|
33
|
+
const sizeStyles = getSizeStyles(size);
|
|
34
|
+
return {
|
|
28
35
|
borderRadius: theme.spacing(1),
|
|
29
36
|
fontSize: sizeStyles.fontSize(theme),
|
|
30
37
|
padding: sizeStyles.padding(theme),
|
|
31
38
|
fontWeight: 500,
|
|
32
|
-
transition:
|
|
33
|
-
position:
|
|
34
|
-
|
|
35
|
-
...variantStyles(theme,
|
|
39
|
+
transition: "all 0.3s ease",
|
|
40
|
+
position: "relative",
|
|
41
|
+
maxWidth: tooltipCap(maxWidth)(theme),
|
|
42
|
+
...variantStyles(theme, variant),
|
|
36
43
|
...emphasisStyles(theme, glow, pulse),
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
'& .MuiTooltip-arrow': {
|
|
40
|
-
color: arrowColor(theme, customVariant),
|
|
41
|
-
},
|
|
44
|
+
};
|
|
42
45
|
};
|
|
43
|
-
});
|
|
44
46
|
|
|
45
|
-
export const InteractiveTooltip = React.forwardRef<
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
47
|
+
export const InteractiveTooltip = React.forwardRef<
|
|
48
|
+
HTMLDivElement,
|
|
49
|
+
InteractiveTooltipProps
|
|
50
|
+
>((rawProps, ref) => {
|
|
51
|
+
const {
|
|
52
|
+
variant,
|
|
53
|
+
size,
|
|
54
|
+
glow,
|
|
55
|
+
pulse,
|
|
56
|
+
maxWidth,
|
|
57
|
+
dataTestId,
|
|
58
|
+
hoverContent,
|
|
59
|
+
pinnedContent,
|
|
60
|
+
clickable,
|
|
61
|
+
onPin,
|
|
62
|
+
onUnpin,
|
|
63
|
+
className,
|
|
64
|
+
children,
|
|
65
|
+
onOpen,
|
|
66
|
+
onClose,
|
|
67
|
+
...props
|
|
68
|
+
} = resolveTooltipProps(rawProps);
|
|
65
69
|
|
|
66
|
-
|
|
70
|
+
const { isPinned, isControlledOpen, wrapperRef, handleClick } =
|
|
71
|
+
usePinnedTooltip({
|
|
67
72
|
clickable,
|
|
68
73
|
onPin,
|
|
69
74
|
onUnpin,
|
|
70
75
|
});
|
|
71
|
-
|
|
76
|
+
const hover = useHoverOpen(isPinned, onOpen, onClose);
|
|
72
77
|
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
// Determine which content to show
|
|
79
|
+
const tooltipContent = isPinned ? pinnedContent : hoverContent;
|
|
75
80
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
// Child with click handler and ref
|
|
82
|
+
const childElement = children as React.ReactElement<{
|
|
83
|
+
onClick?: (e: React.MouseEvent) => void;
|
|
84
|
+
"data-testid"?: string;
|
|
85
|
+
}>;
|
|
81
86
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
const childWithProps = React.cloneElement(childElement, {
|
|
88
|
+
onClick: (e: React.MouseEvent) => {
|
|
89
|
+
handleClick(e);
|
|
90
|
+
// Call original onClick if it exists
|
|
91
|
+
childElement.props.onClick?.(e);
|
|
92
|
+
},
|
|
93
|
+
"data-testid": dataTestId ? `${dataTestId}-trigger` : undefined,
|
|
94
|
+
});
|
|
90
95
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
},
|
|
122
|
-
);
|
|
96
|
+
return (
|
|
97
|
+
<div ref={wrapperRef} className={className}>
|
|
98
|
+
<MuiTooltip
|
|
99
|
+
ref={ref}
|
|
100
|
+
title={tooltipContent}
|
|
101
|
+
open={isPinned ? isControlledOpen : hover.open}
|
|
102
|
+
onOpen={hover.onOpen}
|
|
103
|
+
onClose={hover.onClose}
|
|
104
|
+
enterDelay={isPinned ? 0 : 100}
|
|
105
|
+
leaveDelay={0}
|
|
106
|
+
disableHoverListener={isPinned}
|
|
107
|
+
disableFocusListener={isPinned}
|
|
108
|
+
disableTouchListener={isPinned}
|
|
109
|
+
slotProps={{
|
|
110
|
+
tooltip: {
|
|
111
|
+
sx: bubbleSx(variant, size, glow, pulse, maxWidth),
|
|
112
|
+
role: "tooltip",
|
|
113
|
+
...(dataTestId && { "data-testid": `${dataTestId}-content` }),
|
|
114
|
+
},
|
|
115
|
+
arrow: {
|
|
116
|
+
sx: (theme: Theme) => ({ color: arrowColor(theme, variant) }),
|
|
117
|
+
},
|
|
118
|
+
}}
|
|
119
|
+
{...props}
|
|
120
|
+
>
|
|
121
|
+
{childWithProps}
|
|
122
|
+
</MuiTooltip>
|
|
123
|
+
</div>
|
|
124
|
+
);
|
|
125
|
+
});
|
|
123
126
|
|
|
124
|
-
InteractiveTooltip.displayName =
|
|
127
|
+
InteractiveTooltip.displayName = "InteractiveTooltip";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import MuiTooltip from
|
|
2
|
-
import { alpha, keyframes
|
|
3
|
-
import type { CSSObject, Theme } from
|
|
4
|
-
import React from
|
|
1
|
+
import MuiTooltip from "@mui/material/Tooltip/index.js";
|
|
2
|
+
import { alpha, keyframes } from "@mui/material/styles/index.js";
|
|
3
|
+
import type { CSSObject, Theme } from "@mui/material/styles/index.js";
|
|
4
|
+
import React from "react";
|
|
5
5
|
|
|
6
|
-
import type { TooltipProps } from
|
|
7
|
-
import { absoluteInk, neutralTones } from
|
|
8
|
-
import { rem, rems, sxRem } from
|
|
6
|
+
import type { TooltipProps } from "./Tooltip.types";
|
|
7
|
+
import { absoluteInk, neutralTones } from "../../../tokens/ink";
|
|
8
|
+
import { rem, rems, sxRem } from "../../../tokens/relative";
|
|
9
9
|
|
|
10
10
|
// Define pulse animation
|
|
11
11
|
const pulseAnimation = keyframes`
|
|
@@ -36,24 +36,24 @@ const getSizeStyles = (
|
|
|
36
36
|
|
|
37
37
|
const variantStyles = (theme: Theme, variant?: string): CSSObject => {
|
|
38
38
|
switch (variant) {
|
|
39
|
-
case
|
|
39
|
+
case "default":
|
|
40
40
|
return {
|
|
41
|
-
backgroundColor:
|
|
41
|
+
backgroundColor: neutralTones(theme).inverseSurface,
|
|
42
42
|
color: absoluteInk(theme).white,
|
|
43
43
|
};
|
|
44
|
-
case
|
|
44
|
+
case "dark":
|
|
45
45
|
return {
|
|
46
46
|
backgroundColor: neutralTones(theme).inverseSurface,
|
|
47
47
|
color: absoluteInk(theme).white,
|
|
48
48
|
};
|
|
49
|
-
case
|
|
49
|
+
case "light":
|
|
50
50
|
return {
|
|
51
51
|
backgroundColor: absoluteInk(theme).white,
|
|
52
52
|
color: theme.palette.text.primary,
|
|
53
53
|
border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
|
|
54
54
|
boxShadow: theme.shadows[4],
|
|
55
55
|
};
|
|
56
|
-
case
|
|
56
|
+
case "glass":
|
|
57
57
|
return {
|
|
58
58
|
backgroundColor: alpha(theme.palette.background.paper, 0.1),
|
|
59
59
|
backdropFilter: `blur(${rem(theme, 20)})`,
|
|
@@ -67,10 +67,14 @@ const variantStyles = (theme: Theme, variant?: string): CSSObject => {
|
|
|
67
67
|
|
|
68
68
|
// glow and pulse are independent flags. The three combinations used to be spelled
|
|
69
69
|
// out one by one, but each is just the union of whichever flags are set.
|
|
70
|
-
const emphasisStyles = (
|
|
70
|
+
const emphasisStyles = (
|
|
71
|
+
theme: Theme,
|
|
72
|
+
glow?: boolean,
|
|
73
|
+
pulse?: boolean,
|
|
74
|
+
): CSSObject => ({
|
|
71
75
|
...(glow && {
|
|
72
76
|
boxShadow: `${rems(theme, 0, 0, 15, 3)} ${alpha(theme.palette.primary.main, 0.4)} !important`,
|
|
73
|
-
filter:
|
|
77
|
+
filter: "brightness(1.05)",
|
|
74
78
|
}),
|
|
75
79
|
...(pulse && {
|
|
76
80
|
animation: `${pulseAnimation} 2s infinite`,
|
|
@@ -79,46 +83,48 @@ const emphasisStyles = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObjec
|
|
|
79
83
|
|
|
80
84
|
const arrowColor = (theme: Theme, variant?: string): string => {
|
|
81
85
|
switch (variant) {
|
|
82
|
-
case
|
|
86
|
+
case "light":
|
|
83
87
|
return absoluteInk(theme).white;
|
|
84
|
-
case
|
|
88
|
+
case "glass":
|
|
85
89
|
return alpha(theme.palette.background.paper, 0.1);
|
|
86
|
-
case
|
|
90
|
+
case "dark":
|
|
87
91
|
return neutralTones(theme).inverseSurface;
|
|
88
92
|
default:
|
|
89
|
-
return
|
|
93
|
+
return neutralTones(theme).inverseSurface;
|
|
90
94
|
}
|
|
91
95
|
};
|
|
92
96
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
97
|
+
/**
|
|
98
|
+
* The bubble's own look, applied to the BUBBLE (FUT-3093).
|
|
99
|
+
*
|
|
100
|
+
* It used to sit on a `styled(MuiTooltip)` root as `& .MuiTooltip-tooltip`, but
|
|
101
|
+
* MUI renders the bubble in a portal, outside that root — so none of it ever
|
|
102
|
+
* reached the screen, and every tooltip wore MUI's see-through grey instead of
|
|
103
|
+
* the variant it asked for. `slotProps.tooltip.sx` lands on the bubble itself.
|
|
104
|
+
* No `overflow: hidden`: now that it applies, it would clip an `arrow`.
|
|
105
|
+
*/
|
|
106
|
+
const bubbleSx =
|
|
107
|
+
(
|
|
108
|
+
variant: string,
|
|
109
|
+
size: string,
|
|
110
|
+
glow: boolean,
|
|
111
|
+
pulse: boolean,
|
|
112
|
+
maxWidth: number | undefined,
|
|
113
|
+
) =>
|
|
114
|
+
(theme: Theme): CSSObject => {
|
|
115
|
+
const sizeStyles = getSizeStyles(size);
|
|
116
|
+
return {
|
|
106
117
|
borderRadius: theme.spacing(1),
|
|
107
118
|
fontSize: sizeStyles.fontSize(theme),
|
|
108
119
|
padding: sizeStyles.padding(theme),
|
|
109
120
|
fontWeight: 500,
|
|
110
|
-
transition:
|
|
111
|
-
position:
|
|
112
|
-
|
|
113
|
-
...variantStyles(theme,
|
|
121
|
+
transition: "all 0.3s ease",
|
|
122
|
+
position: "relative",
|
|
123
|
+
maxWidth: tooltipCap(maxWidth)(theme),
|
|
124
|
+
...variantStyles(theme, variant),
|
|
114
125
|
...emphasisStyles(theme, glow, pulse),
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
'& .MuiTooltip-arrow': {
|
|
118
|
-
color: arrowColor(theme, customVariant),
|
|
119
|
-
},
|
|
126
|
+
};
|
|
120
127
|
};
|
|
121
|
-
});
|
|
122
128
|
|
|
123
129
|
/**
|
|
124
130
|
* The tooltip's cap: 300 design px unless the caller says otherwise. `sx` has
|
|
@@ -134,8 +140,8 @@ const tooltipCap =
|
|
|
134
140
|
export const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(
|
|
135
141
|
(
|
|
136
142
|
{
|
|
137
|
-
variant =
|
|
138
|
-
size =
|
|
143
|
+
variant = "default",
|
|
144
|
+
size = "md",
|
|
139
145
|
glow = false,
|
|
140
146
|
pulse = false,
|
|
141
147
|
maxWidth,
|
|
@@ -146,18 +152,17 @@ export const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(
|
|
|
146
152
|
ref,
|
|
147
153
|
) => {
|
|
148
154
|
const childWithTestId = dataTestId
|
|
149
|
-
? React.cloneElement(
|
|
150
|
-
|
|
151
|
-
|
|
155
|
+
? React.cloneElement(
|
|
156
|
+
children as React.ReactElement<{ "data-testid"?: string }>,
|
|
157
|
+
{
|
|
158
|
+
"data-testid": `${dataTestId}-trigger`,
|
|
159
|
+
},
|
|
160
|
+
)
|
|
152
161
|
: children;
|
|
153
162
|
|
|
154
163
|
return (
|
|
155
|
-
<
|
|
164
|
+
<MuiTooltip
|
|
156
165
|
ref={ref}
|
|
157
|
-
customVariant={variant}
|
|
158
|
-
customSize={size}
|
|
159
|
-
glow={glow}
|
|
160
|
-
pulse={pulse}
|
|
161
166
|
enterDelay={0}
|
|
162
167
|
leaveDelay={0}
|
|
163
168
|
disableHoverListener={false}
|
|
@@ -165,17 +170,20 @@ export const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(
|
|
|
165
170
|
disableTouchListener={false}
|
|
166
171
|
slotProps={{
|
|
167
172
|
tooltip: {
|
|
168
|
-
sx:
|
|
169
|
-
role:
|
|
170
|
-
...(dataTestId && {
|
|
173
|
+
sx: bubbleSx(variant, size, glow, pulse, maxWidth),
|
|
174
|
+
role: "tooltip",
|
|
175
|
+
...(dataTestId && { "data-testid": `${dataTestId}-content` }),
|
|
176
|
+
},
|
|
177
|
+
arrow: {
|
|
178
|
+
sx: (theme: Theme) => ({ color: arrowColor(theme, variant) }),
|
|
171
179
|
},
|
|
172
180
|
}}
|
|
173
181
|
{...props}
|
|
174
182
|
>
|
|
175
183
|
{childWithTestId}
|
|
176
|
-
</
|
|
184
|
+
</MuiTooltip>
|
|
177
185
|
);
|
|
178
186
|
},
|
|
179
187
|
);
|
|
180
188
|
|
|
181
|
-
Tooltip.displayName =
|
|
189
|
+
Tooltip.displayName = "Tooltip";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.ts"],"sourcesContent":["import { alpha, keyframes } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { absoluteInk, neutralTones, shadowInk, sheen } from '../../../tokens/ink';\nimport { rem, rems, sxRem } from '../../../tokens/relative';\n\nconst pulseAnimation = keyframes`\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 70% {\n transform: scale(1.05);\n opacity: 0.8;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n`;\n\nconst SIZE_MAP = {\n sm: { fontSize: sxRem(12), padding: (theme: Theme) => rems(theme, 4, 8) },\n md: { fontSize: sxRem(14), padding: (theme: Theme) => rems(theme, 6, 12) },\n lg: { fontSize: sxRem(16), padding: (theme: Theme) => rems(theme, 8, 16) },\n} as const;\n\nexport const getSizeStyles = (\n size?: string,\n): { fontSize: (theme: Theme) => string; padding: (theme: Theme) => string } =>\n SIZE_MAP[size as keyof typeof SIZE_MAP] || SIZE_MAP.md;\n\nexport const variantStyles = (theme: Theme, variant?: string): CSSObject => {\n switch (variant) {\n case 'default':\n return {\n backgroundColor: alpha(neutralTones(theme).inverseSurface, 0.92),\n color: absoluteInk(theme).white,\n boxShadow: `${rems(theme, 0, 4, 12)} ${shadowInk(theme, 0.3)}`,\n };\n case 'dark':\n return {\n backgroundColor: absoluteInk(theme).black,\n color: absoluteInk(theme).white,\n boxShadow: `${rems(theme, 0, 6, 16)} ${shadowInk(theme, 0.5)}`,\n border: `1px solid ${sheen(theme, 0.1)}`,\n };\n case 'light':\n return {\n backgroundColor: absoluteInk(theme).white,\n color: neutralTones(theme).inverseSurface,\n border: `1px solid ${alpha(neutralTones(theme).subtle, 0.4)}`,\n boxShadow: `${rems(theme, 0, 4, 16)} ${shadowInk(theme, 0.15)}`,\n };\n case 'glass':\n return {\n backgroundColor: alpha(theme.palette.background.paper, 0.75),\n backdropFilter: `blur(${rem(theme, 24)}) saturate(180%)`,\n WebkitBackdropFilter: `blur(${rem(theme, 24)}) saturate(180%)`,\n border: `1px solid ${alpha(theme.palette.divider, 0.3)}`,\n color: theme.palette.text.primary,\n boxShadow: `${rems(theme, 0, 8, 32)} ${shadowInk(theme, 0.12)}`,\n };\n default:\n return {};\n }\n};\n\n// glow and pulse are independent flags. The three combinations used to be spelled\n// out one by one, but each is just the union of whichever flags are set.\nexport const emphasisStyles = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObject => ({\n ...(glow && {\n boxShadow: `${rems(theme, 0, 0, 15, 3)} ${alpha(theme.palette.primary.main, 0.4)} !important`,\n filter: 'brightness(1.05)',\n }),\n ...(pulse && {\n animation: `${pulseAnimation} 2s infinite`,\n }),\n});\n\n/**\n * The tooltip's cap: 300 design px unless the caller says otherwise. `sx` has\n * always read a number of 1 or less as a fraction of the parent, and that stays so.\n */\nexport const tooltipCap =\n (maxWidth: number | undefined) =>\n (theme: Theme): string => {\n const cap = maxWidth ?? 300;\n return cap <= 1 && cap !== 0 ? `${cap * 100}%` : rem(theme, cap);\n };\n\nexport const arrowColor = (theme: Theme, variant?: string): string => {\n switch (variant) {\n case 'light':\n return absoluteInk(theme).white;\n case 'glass':\n return alpha(theme.palette.background.paper, 0.75);\n case 'dark':\n return absoluteInk(theme).black;\n default:\n return alpha(neutralTones(theme).inverseSurface, 0.92);\n }\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Tooltip/Tooltip.tsx"],"sourcesContent":["import MuiTooltip from '@mui/material/Tooltip/index.js';\nimport { alpha, keyframes, styled } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { TooltipProps } from './Tooltip.types';\nimport { absoluteInk, neutralTones } from '../../../tokens/ink';\nimport { rem, rems, sxRem } from '../../../tokens/relative';\n\n// Define pulse animation\nconst pulseAnimation = keyframes`\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 70% {\n transform: scale(1.05);\n opacity: 0.8;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n`;\n\nconst SIZE_MAP = {\n sm: { fontSize: sxRem(12), padding: (theme: Theme) => rems(theme, 4, 8) },\n md: { fontSize: sxRem(14), padding: (theme: Theme) => rems(theme, 6, 12) },\n lg: { fontSize: sxRem(16), padding: (theme: Theme) => rems(theme, 8, 16) },\n} as const;\n\nconst getSizeStyles = (\n size?: string,\n): { fontSize: (theme: Theme) => string; padding: (theme: Theme) => string } =>\n SIZE_MAP[size as keyof typeof SIZE_MAP] || SIZE_MAP.md;\n\nconst variantStyles = (theme: Theme, variant?: string): CSSObject => {\n switch (variant) {\n case 'default':\n return {\n backgroundColor: alpha(neutralTones(theme).inverseSurface, 0.9),\n color: absoluteInk(theme).white,\n };\n case 'dark':\n return {\n backgroundColor: neutralTones(theme).inverseSurface,\n color: absoluteInk(theme).white,\n };\n case 'light':\n return {\n backgroundColor: absoluteInk(theme).white,\n color: theme.palette.text.primary,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[4],\n };\n case 'glass':\n return {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: `blur(${rem(theme, 20)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n color: theme.palette.text.primary,\n };\n default:\n return {};\n }\n};\n\n// glow and pulse are independent flags. The three combinations used to be spelled\n// out one by one, but each is just the union of whichever flags are set.\nconst emphasisStyles = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObject => ({\n ...(glow && {\n boxShadow: `${rems(theme, 0, 0, 15, 3)} ${alpha(theme.palette.primary.main, 0.4)} !important`,\n filter: 'brightness(1.05)',\n }),\n ...(pulse && {\n animation: `${pulseAnimation} 2s infinite`,\n }),\n});\n\nconst arrowColor = (theme: Theme, variant?: string): string => {\n switch (variant) {\n case 'light':\n return absoluteInk(theme).white;\n case 'glass':\n return alpha(theme.palette.background.paper, 0.1);\n case 'dark':\n return neutralTones(theme).inverseSurface;\n default:\n return alpha(neutralTones(theme).inverseSurface, 0.9);\n }\n};\n\nconst StyledTooltip = styled(MuiTooltip, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'customSize', 'glow', 'pulse'].includes(prop as string),\n})<{\n customVariant?: string;\n customSize?: string;\n glow?: boolean;\n pulse?: boolean;\n}>(({ theme, customVariant, customSize, glow, pulse }) => {\n const sizeStyles = getSizeStyles(customSize);\n\n return {\n '& .MuiTooltip-tooltip': {\n borderRadius: theme.spacing(1),\n fontSize: sizeStyles.fontSize(theme),\n padding: sizeStyles.padding(theme),\n fontWeight: 500,\n transition: 'all 0.3s ease',\n position: 'relative',\n overflow: 'hidden',\n ...variantStyles(theme, customVariant),\n ...emphasisStyles(theme, glow, pulse),\n },\n\n '& .MuiTooltip-arrow': {\n color: arrowColor(theme, customVariant),\n },\n };\n});\n\n/**\n * The tooltip's cap: 300 design px unless the caller says otherwise. `sx` has\n * always read a number of 1 or less as a fraction of the parent, and that stays so.\n */\nconst tooltipCap =\n (maxWidth: number | undefined) =>\n (theme: Theme): string => {\n const cap = maxWidth ?? 300;\n return cap <= 1 && cap !== 0 ? `${cap * 100}%` : rem(theme, cap);\n };\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n (\n {\n variant = 'default',\n size = 'md',\n glow = false,\n pulse = false,\n maxWidth,\n dataTestId,\n children,\n ...props\n },\n ref,\n ) => {\n const childWithTestId = dataTestId\n ? React.cloneElement(children as React.ReactElement<{ 'data-testid'?: string }>, {\n 'data-testid': `${dataTestId}-trigger`,\n })\n : children;\n\n return (\n <StyledTooltip\n ref={ref}\n customVariant={variant}\n customSize={size}\n glow={glow}\n pulse={pulse}\n enterDelay={0}\n leaveDelay={0}\n disableHoverListener={false}\n disableFocusListener={false}\n disableTouchListener={false}\n slotProps={{\n tooltip: {\n sx: { maxWidth: tooltipCap(maxWidth) },\n role: 'tooltip',\n ...(dataTestId && { 'data-testid': `${dataTestId}-content` }),\n },\n }}\n {...props}\n >\n {childWithTestId}\n </StyledTooltip>\n );\n },\n);\n\nTooltip.displayName = 'Tooltip';\n"],"mappings":"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","names":[]}
|