@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.
Files changed (42) hide show
  1. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
  2. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.js +1 -1
  3. package/dist/_internal/components/data-display/Tooltip/Tooltip.js +1 -1
  4. package/dist/_internal/components/data-display/index.js +3 -3
  5. package/dist/_internal/components/index.js +8 -8
  6. package/dist/_internal/components/layout/SettingCard/SettingCard.js +4 -4
  7. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +3 -3
  8. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +5 -5
  9. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +4 -4
  10. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +5 -5
  11. package/dist/_internal/components/layout/index.js +7 -7
  12. package/dist/{chunk-TQCQCW2P.js → chunk-524PRSSD.js} +3 -3
  13. package/dist/chunk-524PRSSD.js.map +1 -0
  14. package/dist/{chunk-Y5QDXG5N.js → chunk-6WNMVWAV.js} +2 -2
  15. package/dist/chunk-AET54GT6.js +99 -0
  16. package/dist/chunk-AET54GT6.js.map +1 -0
  17. package/dist/{chunk-ZXEDKRRT.js → chunk-ECVNRLKD.js} +2 -2
  18. package/dist/{chunk-OESAYTNG.js → chunk-JDVHNDY3.js} +2 -2
  19. package/dist/{chunk-TYBZ4XZZ.js → chunk-KRIPQUFB.js} +27 -32
  20. package/dist/chunk-KRIPQUFB.js.map +1 -0
  21. package/dist/{chunk-N4R6T5K7.js → chunk-PKSU3RBT.js} +2 -2
  22. package/dist/{chunk-IRNKHHQM.js → chunk-QKMXMBUK.js} +2 -2
  23. package/dist/data-display/InteractiveTooltip.js +2 -2
  24. package/dist/data-display/Tooltip.js +1 -1
  25. package/dist/layout/SettingCard.js +7 -7
  26. package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.d.ts +2 -2
  27. package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.d.ts.map +1 -1
  28. package/dist/types/components/data-display/Tooltip/Tooltip.d.ts +2 -2
  29. package/dist/types/components/data-display/Tooltip/Tooltip.d.ts.map +1 -1
  30. package/package.json +1 -1
  31. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.ts +2 -2
  32. package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +102 -99
  33. package/src/components/data-display/Tooltip/Tooltip.tsx +64 -56
  34. package/dist/chunk-TQCQCW2P.js.map +0 -1
  35. package/dist/chunk-TYBZ4XZZ.js.map +0 -1
  36. package/dist/chunk-XM7QCNZQ.js +0 -110
  37. package/dist/chunk-XM7QCNZQ.js.map +0 -1
  38. /package/dist/{chunk-Y5QDXG5N.js.map → chunk-6WNMVWAV.js.map} +0 -0
  39. /package/dist/{chunk-ZXEDKRRT.js.map → chunk-ECVNRLKD.js.map} +0 -0
  40. /package/dist/{chunk-OESAYTNG.js.map → chunk-JDVHNDY3.js.map} +0 -0
  41. /package/dist/{chunk-N4R6T5K7.js.map → chunk-PKSU3RBT.js.map} +0 -0
  42. /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-OESAYTNG.js";
8
+ } from "../chunk-JDVHNDY3.js";
9
9
  import {
10
10
  SettingToggle
11
- } from "../chunk-IRNKHHQM.js";
11
+ } from "../chunk-QKMXMBUK.js";
12
12
  import {
13
13
  SettingGroup
14
- } from "../chunk-ZXEDKRRT.js";
14
+ } from "../chunk-ECVNRLKD.js";
15
15
  import "../chunk-XJQNSMGA.js";
16
16
  import "../chunk-SALQ65SM.js";
17
- import "../chunk-Y5QDXG5N.js";
18
- import "../chunk-N4R6T5K7.js";
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-XM7QCNZQ.js";
27
- import "../chunk-TQCQCW2P.js";
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 'react';
2
- import type { InteractiveTooltipProps } from './InteractiveTooltip.types';
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;AAU1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAgC1E,eAAO,MAAM,kBAAkB,6GA6E9B,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 'react';
2
- import type { TooltipProps } from './Tooltip.types';
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;AAgIpD,eAAO,MAAM,OAAO,kGA6CnB,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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.54.0",
3
+ "version": "6.54.1",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -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: alpha(neutralTones(theme).inverseSurface, 0.92),
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 alpha(neutralTones(theme).inverseSurface, 0.92);
101
+ return neutralTones(theme).inverseSurface;
102
102
  }
103
103
  };
@@ -1,124 +1,127 @@
1
- import MuiTooltip from '@mui/material/Tooltip/index.js';
2
- import { styled } from '@mui/material/styles/index.js';
3
- import React from 'react';
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 { resolveTooltipProps, useHoverOpen, usePinnedTooltip } from './InteractiveTooltip.hooks';
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 './InteractiveTooltip.styles';
13
- import type { InteractiveTooltipProps } from './InteractiveTooltip.types';
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
- return {
27
- '& .MuiTooltip-tooltip': {
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: 'all 0.3s ease',
33
- position: 'relative',
34
- overflow: 'hidden',
35
- ...variantStyles(theme, customVariant),
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<HTMLDivElement, InteractiveTooltipProps>(
46
- (rawProps, ref) => {
47
- const {
48
- variant,
49
- size,
50
- glow,
51
- pulse,
52
- maxWidth,
53
- dataTestId,
54
- hoverContent,
55
- pinnedContent,
56
- clickable,
57
- onPin,
58
- onUnpin,
59
- className,
60
- children,
61
- onOpen,
62
- onClose,
63
- ...props
64
- } = resolveTooltipProps(rawProps);
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
- const { isPinned, isControlledOpen, wrapperRef, handleClick } = usePinnedTooltip({
70
+ const { isPinned, isControlledOpen, wrapperRef, handleClick } =
71
+ usePinnedTooltip({
67
72
  clickable,
68
73
  onPin,
69
74
  onUnpin,
70
75
  });
71
- const hover = useHoverOpen(isPinned, onOpen, onClose);
76
+ const hover = useHoverOpen(isPinned, onOpen, onClose);
72
77
 
73
- // Determine which content to show
74
- const tooltipContent = isPinned ? pinnedContent : hoverContent;
78
+ // Determine which content to show
79
+ const tooltipContent = isPinned ? pinnedContent : hoverContent;
75
80
 
76
- // Child with click handler and ref
77
- const childElement = children as React.ReactElement<{
78
- onClick?: (e: React.MouseEvent) => void;
79
- 'data-testid'?: string;
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
- const childWithProps = React.cloneElement(childElement, {
83
- onClick: (e: React.MouseEvent) => {
84
- handleClick(e);
85
- // Call original onClick if it exists
86
- childElement.props.onClick?.(e);
87
- },
88
- 'data-testid': dataTestId ? `${dataTestId}-trigger` : undefined,
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
- return (
92
- <div ref={wrapperRef} className={className}>
93
- <StyledTooltip
94
- ref={ref}
95
- customVariant={variant}
96
- customSize={size}
97
- glow={glow}
98
- pulse={pulse}
99
- title={tooltipContent}
100
- open={isPinned ? isControlledOpen : hover.open}
101
- onOpen={hover.onOpen}
102
- onClose={hover.onClose}
103
- enterDelay={isPinned ? 0 : 100}
104
- leaveDelay={0}
105
- disableHoverListener={isPinned}
106
- disableFocusListener={isPinned}
107
- disableTouchListener={isPinned}
108
- slotProps={{
109
- tooltip: {
110
- sx: { maxWidth: tooltipCap(maxWidth) },
111
- role: 'tooltip',
112
- ...(dataTestId && { 'data-testid': `${dataTestId}-content` }),
113
- },
114
- }}
115
- {...props}
116
- >
117
- {childWithProps}
118
- </StyledTooltip>
119
- </div>
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 = 'InteractiveTooltip';
127
+ InteractiveTooltip.displayName = "InteractiveTooltip";
@@ -1,11 +1,11 @@
1
- import MuiTooltip from '@mui/material/Tooltip/index.js';
2
- import { alpha, keyframes, styled } from '@mui/material/styles/index.js';
3
- import type { CSSObject, Theme } from '@mui/material/styles/index.js';
4
- import React from 'react';
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 './Tooltip.types';
7
- import { absoluteInk, neutralTones } from '../../../tokens/ink';
8
- import { rem, rems, sxRem } from '../../../tokens/relative';
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 'default':
39
+ case "default":
40
40
  return {
41
- backgroundColor: alpha(neutralTones(theme).inverseSurface, 0.9),
41
+ backgroundColor: neutralTones(theme).inverseSurface,
42
42
  color: absoluteInk(theme).white,
43
43
  };
44
- case 'dark':
44
+ case "dark":
45
45
  return {
46
46
  backgroundColor: neutralTones(theme).inverseSurface,
47
47
  color: absoluteInk(theme).white,
48
48
  };
49
- case 'light':
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 'glass':
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 = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObject => ({
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: 'brightness(1.05)',
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 'light':
86
+ case "light":
83
87
  return absoluteInk(theme).white;
84
- case 'glass':
88
+ case "glass":
85
89
  return alpha(theme.palette.background.paper, 0.1);
86
- case 'dark':
90
+ case "dark":
87
91
  return neutralTones(theme).inverseSurface;
88
92
  default:
89
- return alpha(neutralTones(theme).inverseSurface, 0.9);
93
+ return neutralTones(theme).inverseSurface;
90
94
  }
91
95
  };
92
96
 
93
- const StyledTooltip = styled(MuiTooltip, {
94
- shouldForwardProp: (prop) =>
95
- !['customVariant', 'customSize', 'glow', 'pulse'].includes(prop as string),
96
- })<{
97
- customVariant?: string;
98
- customSize?: string;
99
- glow?: boolean;
100
- pulse?: boolean;
101
- }>(({ theme, customVariant, customSize, glow, pulse }) => {
102
- const sizeStyles = getSizeStyles(customSize);
103
-
104
- return {
105
- '& .MuiTooltip-tooltip': {
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: 'all 0.3s ease',
111
- position: 'relative',
112
- overflow: 'hidden',
113
- ...variantStyles(theme, customVariant),
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 = 'default',
138
- size = 'md',
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(children as React.ReactElement<{ 'data-testid'?: string }>, {
150
- 'data-testid': `${dataTestId}-trigger`,
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
- <StyledTooltip
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: { maxWidth: tooltipCap(maxWidth) },
169
- role: 'tooltip',
170
- ...(dataTestId && { 'data-testid': `${dataTestId}-content` }),
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
- </StyledTooltip>
184
+ </MuiTooltip>
177
185
  );
178
186
  },
179
187
  );
180
188
 
181
- Tooltip.displayName = 'Tooltip';
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":[]}