@sproutsocial/seeds-react-tooltip 1.1.33 → 1.1.35
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/esm/index.js +110 -22
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +119 -31
- package/dist/index.js.map +1 -1
- package/dist/tooltip.css +41 -0
- package/package.json +20 -9
- package/.eslintignore +0 -6
- package/.eslintrc.js +0 -4
- package/.turbo/turbo-build.log +0 -21
- package/CHANGELOG.md +0 -403
- package/jest.config.js +0 -9
- package/src/Tooltip.stories.tsx +0 -312
- package/src/Tooltip.tsx +0 -206
- package/src/TooltipTypes.ts +0 -77
- package/src/__tests__/Tooltip.test.tsx +0 -285
- package/src/__tests__/Tooltip.typetest.tsx +0 -27
- package/src/__tests__/mapPlacement.test.ts +0 -56
- package/src/index.ts +0 -5
- package/src/styled.d.ts +0 -7
- package/src/styles.ts +0 -11
- package/tsconfig.json +0 -15
- package/tsup.config.ts +0 -12
package/dist/esm/index.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
// src/Tooltip.tsx
|
|
2
|
-
import * as
|
|
2
|
+
import * as React3 from "react";
|
|
3
3
|
import { useState, useRef, useEffect, useContext } from "react";
|
|
4
4
|
import MOTION from "@sproutsocial/seeds-motion/unitless";
|
|
5
5
|
import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
|
|
6
6
|
import { DisablePortalToBodyContext } from "@sproutsocial/seeds-react-portal";
|
|
7
7
|
import Box2 from "@sproutsocial/seeds-react-box";
|
|
8
8
|
|
|
9
|
+
// src/TooltipHybrid.tsx
|
|
10
|
+
import React2 from "react";
|
|
11
|
+
import { needsStyledComponents } from "@sproutsocial/seeds-react-system-props";
|
|
12
|
+
|
|
9
13
|
// src/styles.ts
|
|
10
14
|
import styled from "styled-components";
|
|
11
15
|
import Box from "@sproutsocial/seeds-react-box";
|
|
@@ -15,11 +19,105 @@ var StyledTooltipContent = styled(Box)`
|
|
|
15
19
|
text-align: ${(props) => props.appearance === "box" ? "left" : "center"};
|
|
16
20
|
`;
|
|
17
21
|
|
|
22
|
+
// src/TooltipTailwind.tsx
|
|
23
|
+
import React from "react";
|
|
24
|
+
import { jsx } from "react/jsx-runtime";
|
|
25
|
+
function cn(...inputs) {
|
|
26
|
+
const classes = [];
|
|
27
|
+
for (const input of inputs) {
|
|
28
|
+
if (!input) continue;
|
|
29
|
+
if (typeof input === "string") {
|
|
30
|
+
classes.push(input);
|
|
31
|
+
} else if (typeof input === "object") {
|
|
32
|
+
for (const [key, value] of Object.entries(input)) {
|
|
33
|
+
if (value) {
|
|
34
|
+
classes.push(key);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return classes.join(" ");
|
|
40
|
+
}
|
|
41
|
+
var TooltipTailwind = React.forwardRef(({ appearance, className, ...rest }, ref) => /* @__PURE__ */ jsx(
|
|
42
|
+
"div",
|
|
43
|
+
{
|
|
44
|
+
ref,
|
|
45
|
+
role: "tooltip",
|
|
46
|
+
className: cn(
|
|
47
|
+
"seeds-tooltip",
|
|
48
|
+
appearance === "box" ? "seeds-tooltip-box" : "seeds-tooltip-pill",
|
|
49
|
+
className
|
|
50
|
+
),
|
|
51
|
+
...rest
|
|
52
|
+
}
|
|
53
|
+
));
|
|
54
|
+
TooltipTailwind.displayName = "TooltipTailwind";
|
|
55
|
+
|
|
56
|
+
// src/TooltipHybrid.tsx
|
|
57
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
58
|
+
var ADDITIONAL_BOX_STYLE_PROPS = [
|
|
59
|
+
"borderRadius",
|
|
60
|
+
"border",
|
|
61
|
+
"borderColor",
|
|
62
|
+
"borderWidth",
|
|
63
|
+
"borderStyle",
|
|
64
|
+
"boxShadow",
|
|
65
|
+
"fontSize",
|
|
66
|
+
"fontWeight",
|
|
67
|
+
"lineHeight",
|
|
68
|
+
"letterSpacing",
|
|
69
|
+
"fontStyle",
|
|
70
|
+
"textAlign",
|
|
71
|
+
"position",
|
|
72
|
+
"top",
|
|
73
|
+
"right",
|
|
74
|
+
"bottom",
|
|
75
|
+
"left",
|
|
76
|
+
"zIndex",
|
|
77
|
+
"opacity",
|
|
78
|
+
"size"
|
|
79
|
+
];
|
|
80
|
+
var hasAdditionalBoxStyleProps = (props) => ADDITIONAL_BOX_STYLE_PROPS.some((prop) => props[prop] !== void 0);
|
|
81
|
+
var TooltipHybrid = React2.forwardRef(
|
|
82
|
+
({ appearance, ...rest }, ref) => {
|
|
83
|
+
if (needsStyledComponents(rest) || hasAdditionalBoxStyleProps(rest)) {
|
|
84
|
+
return /* @__PURE__ */ jsx2(
|
|
85
|
+
StyledTooltipContent,
|
|
86
|
+
{
|
|
87
|
+
ref,
|
|
88
|
+
role: "tooltip",
|
|
89
|
+
appearance,
|
|
90
|
+
borderRadius: appearance === "box" ? 500 : "5000em",
|
|
91
|
+
px: 400,
|
|
92
|
+
py: appearance === "box" ? 400 : 200,
|
|
93
|
+
m: 200,
|
|
94
|
+
color: "text.body",
|
|
95
|
+
bg: "container.background.base",
|
|
96
|
+
boxShadow: "medium",
|
|
97
|
+
border: 500,
|
|
98
|
+
borderColor: "container.border.base",
|
|
99
|
+
...rest
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return /* @__PURE__ */ jsx2(
|
|
104
|
+
TooltipTailwind,
|
|
105
|
+
{
|
|
106
|
+
ref,
|
|
107
|
+
appearance,
|
|
108
|
+
...rest
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
TooltipHybrid.displayName = "TooltipHybrid";
|
|
114
|
+
var TooltipHybrid_default = TooltipHybrid;
|
|
115
|
+
|
|
18
116
|
// src/Tooltip.tsx
|
|
19
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
117
|
+
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
20
118
|
var idCounter = 0;
|
|
21
119
|
var hasAttribute = (child, attribute) => {
|
|
22
|
-
return
|
|
120
|
+
return React3.isValidElement(child) && child.props[attribute] !== void 0;
|
|
23
121
|
};
|
|
24
122
|
function mapPlacement(placement) {
|
|
25
123
|
const parts = placement.split("-");
|
|
@@ -86,7 +184,7 @@ var Tooltip = ({
|
|
|
86
184
|
}
|
|
87
185
|
}, [disablePortalToBody]);
|
|
88
186
|
if (isInvalidContent) {
|
|
89
|
-
return /* @__PURE__ */
|
|
187
|
+
return /* @__PURE__ */ jsx3(
|
|
90
188
|
"span",
|
|
91
189
|
{
|
|
92
190
|
style: truncated ? {
|
|
@@ -106,12 +204,12 @@ var Tooltip = ({
|
|
|
106
204
|
disabled: isInvalidContent,
|
|
107
205
|
disableHoverablePopup: !legacyMouseInteraction,
|
|
108
206
|
children: [
|
|
109
|
-
/* @__PURE__ */
|
|
207
|
+
/* @__PURE__ */ jsx3(
|
|
110
208
|
BaseTooltip.Trigger,
|
|
111
209
|
{
|
|
112
210
|
delay: enterDelay,
|
|
113
211
|
closeDelay: resolvedExitDelay,
|
|
114
|
-
render: /* @__PURE__ */
|
|
212
|
+
render: /* @__PURE__ */ jsx3(
|
|
115
213
|
"span",
|
|
116
214
|
{
|
|
117
215
|
ref: triggerRef,
|
|
@@ -128,37 +226,27 @@ var Tooltip = ({
|
|
|
128
226
|
} : void 0
|
|
129
227
|
}
|
|
130
228
|
),
|
|
131
|
-
children:
|
|
229
|
+
children: React3.isValidElement(children) ? React3.cloneElement(children, {
|
|
132
230
|
"aria-expanded": hasAttribute(children, "aria-expanded") ? children.props["aria-expanded"] : void 0,
|
|
133
231
|
"aria-describedby": open ? id : void 0
|
|
134
232
|
}) : children
|
|
135
233
|
}
|
|
136
234
|
),
|
|
137
|
-
/* @__PURE__ */
|
|
235
|
+
/* @__PURE__ */ jsx3(BaseTooltip.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx3(
|
|
138
236
|
BaseTooltip.Positioner,
|
|
139
237
|
{
|
|
140
238
|
side,
|
|
141
239
|
align,
|
|
142
240
|
sideOffset: 4,
|
|
143
241
|
style: { zIndex },
|
|
144
|
-
children: /* @__PURE__ */
|
|
242
|
+
children: /* @__PURE__ */ jsx3(
|
|
145
243
|
BaseTooltip.Popup,
|
|
146
244
|
{
|
|
147
245
|
id,
|
|
148
|
-
render: /* @__PURE__ */
|
|
149
|
-
|
|
246
|
+
render: /* @__PURE__ */ jsx3(
|
|
247
|
+
TooltipHybrid_default,
|
|
150
248
|
{
|
|
151
|
-
role: "tooltip",
|
|
152
249
|
appearance: defaultAppearance,
|
|
153
|
-
borderRadius: defaultAppearance === "box" ? 500 : "5000em",
|
|
154
|
-
px: 400,
|
|
155
|
-
py: defaultAppearance === "box" ? 400 : 200,
|
|
156
|
-
m: 200,
|
|
157
|
-
color: "text.body",
|
|
158
|
-
bg: "container.background.base",
|
|
159
|
-
boxShadow: "medium",
|
|
160
|
-
border: 500,
|
|
161
|
-
borderColor: "container.border.base",
|
|
162
250
|
tabIndex: legacyMouseInteraction ? 0 : void 0,
|
|
163
251
|
...rest
|
|
164
252
|
}
|
|
@@ -171,7 +259,7 @@ var Tooltip = ({
|
|
|
171
259
|
]
|
|
172
260
|
}
|
|
173
261
|
);
|
|
174
|
-
return hasWrapperProps ? /* @__PURE__ */
|
|
262
|
+
return hasWrapperProps ? /* @__PURE__ */ jsx3(Box2, { ...mergedWrapperProps, children: tooltipTree }) : tooltipTree;
|
|
175
263
|
};
|
|
176
264
|
var Tooltip_default = Tooltip;
|
|
177
265
|
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Tooltip.tsx","../../src/styles.ts","../../src/TooltipTypes.ts","../../src/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport { useState, useRef, useEffect, useContext } from \"react\";\nimport MOTION from \"@sproutsocial/seeds-motion/unitless\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport { DisablePortalToBodyContext } from \"@sproutsocial/seeds-react-portal\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport { StyledTooltipContent } from \"./styles\";\nimport type { TypeTooltipProps } from \"./TooltipTypes\";\n\nlet idCounter = 0;\n\nconst hasAttribute = (child: React.ReactNode, attribute: string) => {\n return React.isValidElement(child) && child.props[attribute] !== undefined;\n};\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\n// `auto`, `auto-start`, and `auto-end` resolve to `side: \"top\"` (with align\n// taken from the suffix) and rely on base-ui's Positioner collision flipping at\n// runtime, rather than Popper's old best-initial-side selection. Exported for\n// unit testing of this mapping.\nexport function mapPlacement(placement: string): { side: Side; align: Align } {\n const parts = placement.split(\"-\");\n let side: Side;\n let align: Align = \"center\";\n\n switch (parts[0]) {\n case \"bottom\":\n side = \"bottom\";\n break;\n case \"left\":\n side = \"left\";\n break;\n case \"right\":\n side = \"right\";\n break;\n case \"top\":\n case \"auto\":\n default:\n side = \"top\";\n break;\n }\n\n if (parts[1] === \"start\") {\n align = \"start\";\n } else if (parts[1] === \"end\") {\n align = \"end\";\n }\n\n return { side, align };\n}\n\nconst Tooltip = ({\n content,\n children,\n enterDelay = MOTION.MOTION_DURATION_FAST * 1000,\n exitDelay,\n placement = \"auto\",\n appearance,\n zIndex = 7,\n qa,\n popoutProps,\n triggerProps,\n truncated = false,\n onFocus,\n onBlur,\n legacyMouseInteraction,\n ...rest\n}: TypeTooltipProps) => {\n const [open, setOpen] = useState(false);\n const [id] = useState(`Racine-tooltip-${idCounter++}`);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const isInvalidContent = content === null || content === undefined;\n const disablePortalToBody = useContext(DisablePortalToBodyContext);\n const [portalContainer, setPortalContainer] = useState<\n HTMLElement | undefined\n >(undefined);\n\n const resolvedExitDelay =\n exitDelay !== undefined\n ? exitDelay\n : legacyMouseInteraction\n ? MOTION.MOTION_DURATION_FAST * 1000\n : 0;\n\n const defaultAppearance =\n appearance || (typeof content === \"object\" ? \"box\" : \"pill\");\n\n const { side, align } = mapPlacement(placement);\n\n const mergedWrapperProps = {\n ...popoutProps,\n ...triggerProps,\n };\n\n const hasWrapperProps = Object.keys(mergedWrapperProps).length > 0;\n\n useEffect(() => {\n if (disablePortalToBody && triggerRef.current) {\n const dialogContent =\n triggerRef.current.closest<HTMLElement>(\"[role='dialog']\");\n setPortalContainer(dialogContent ?? undefined);\n }\n }, [disablePortalToBody]);\n\n if (isInvalidContent) {\n return (\n <span\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }\n : {}\n }\n >\n {children}\n </span>\n );\n }\n\n const tooltipTree = (\n <BaseTooltip.Root\n open={open}\n onOpenChange={setOpen}\n disabled={isInvalidContent}\n disableHoverablePopup={!legacyMouseInteraction}\n >\n <BaseTooltip.Trigger\n delay={enterDelay}\n closeDelay={resolvedExitDelay}\n render={\n <span\n ref={triggerRef}\n onFocus={onFocus}\n onBlur={onBlur}\n data-qa-popout-isopen={open ? \"true\" : \"false\"}\n data-qa-tooltip={id}\n {...(qa || {})}\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n }\n : undefined\n }\n />\n }\n >\n {React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n \"aria-expanded\": hasAttribute(children, \"aria-expanded\")\n ? children.props[\"aria-expanded\"]\n : undefined,\n \"aria-describedby\": open ? id : undefined,\n })\n : children}\n </BaseTooltip.Trigger>\n <BaseTooltip.Portal container={portalContainer}>\n <BaseTooltip.Positioner\n side={side}\n align={align}\n sideOffset={4}\n style={{ zIndex }}\n >\n <BaseTooltip.Popup\n id={id}\n render={\n <StyledTooltipContent\n role=\"tooltip\"\n appearance={defaultAppearance}\n borderRadius={defaultAppearance === \"box\" ? 500 : \"5000em\"}\n px={400}\n py={defaultAppearance === \"box\" ? 400 : 200}\n m={200}\n color=\"text.body\"\n bg=\"container.background.base\"\n boxShadow=\"medium\"\n border={500}\n borderColor=\"container.border.base\"\n tabIndex={legacyMouseInteraction ? 0 : undefined}\n {...rest}\n />\n }\n >\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n\n return hasWrapperProps ? (\n <Box {...mergedWrapperProps}>{tooltipTree}</Box>\n ) : (\n tooltipTree\n );\n};\n\nexport default Tooltip;\n","import styled from \"styled-components\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport type { TypeTooltipContent } from \"./TooltipTypes\";\n\nexport const StyledTooltipContent = styled(Box)<\n Pick<TypeTooltipContent, \"appearance\">\n>`\n font-family: ${(props) => props.theme.fontFamily};\n ${(props) => props.theme.typography[200]}\n text-align: ${(props) => (props.appearance === \"box\" ? \"left\" : \"center\")};\n`;\n","import * as React from \"react\";\nimport type { TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\n\nexport type TypeTooltipPlacement =\n | \"auto\"\n | \"auto-start\"\n | \"auto-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport interface TypeTooltipProps\n extends Omit<\n TypeBoxProps,\n \"children\" | \"content\" | \"onMouseEnter\" | \"onMouseLeave\"\n > {\n /** The content that the tooltip should be attached to. Hovering or focusing this element will cause the tooltip to appear */\n children: React.ReactNode;\n\n /** The content to be displayed within the tooltip. If there is no content, just the children are rendered */\n content: React.ReactNode;\n\n /**\n * The placement of the tooltip in relation to the children.\n *\n * Note: `auto`, `auto-start`, and `auto-end` resolve to the `top` side (with\n * the requested alignment) and rely on base-ui's runtime collision flipping,\n * rather than the legacy Popper.js best-initial-side selection.\n */\n placement?: TypeTooltipPlacement;\n\n /** The time (in ms) that a user has to be hovered/focused before the tooltip will appear */\n enterDelay?: number;\n\n /** The time (in ms) that a user has to leave hovered/focused before the tooltip will disappear */\n exitDelay?: number;\n\n /**\n * When true, enables mouse interaction on tooltip content and sets exitDelay\n * to MOTION_DURATION_FAST * 1000 by default (instead of 0).\n */\n legacyMouseInteraction?: boolean;\n\n /** Used to override the appearance of the Tooltip content. By default, strings will have the 'pill' appearance, and more complex content will have the 'box' appearance. You can change those defaults by setting this prop. */\n appearance?: \"pill\" | \"box\";\n qa?: object;\n zIndex?: number;\n\n /**\n * @deprecated Use `triggerProps` instead. The Tooltip no longer uses Popout internally. This prop is accepted and merged with triggerProps\n */\n popoutProps?: Record<string, unknown>;\n\n /** Props spread onto an outer wrapper Box rendered around the tooltip. Use this to apply layout styles (e.g. `display`, `width`) or other Box props to the element that wraps the tooltip's children. */\n triggerProps?: TypeBoxProps;\n\n /** Truncates text into a single line with ellipsis */\n truncated?: boolean;\n\n ariaProps?: Record<string, string>;\n}\n\nexport interface TypeTooltipContent\n extends Pick<TypeTooltipProps, \"appearance\" | \"children\"> {\n onFocus: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n onBlur: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n legacyMouseInteraction?: boolean;\n}\n","import Tooltip from \"./Tooltip\";\n\nexport default Tooltip;\nexport { Tooltip };\nexport * from \"./TooltipTypes\";\n"],"mappings":"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","names":["Box","Box"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Tooltip.tsx","../../src/TooltipHybrid.tsx","../../src/styles.ts","../../src/TooltipTailwind.tsx","../../src/TooltipTypes.ts","../../src/index.ts"],"sourcesContent":["import * as React from \"react\";\nimport { useState, useRef, useEffect, useContext } from \"react\";\nimport MOTION from \"@sproutsocial/seeds-motion/unitless\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport { DisablePortalToBodyContext } from \"@sproutsocial/seeds-react-portal\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport TooltipHybrid from \"./TooltipHybrid\";\nimport type { TypeTooltipProps } from \"./TooltipTypes\";\n\nlet idCounter = 0;\n\nconst hasAttribute = (child: React.ReactNode, attribute: string) => {\n return React.isValidElement(child) && child.props[attribute] !== undefined;\n};\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\n// `auto`, `auto-start`, and `auto-end` resolve to `side: \"top\"` (with align\n// taken from the suffix) and rely on base-ui's Positioner collision flipping at\n// runtime, rather than Popper's old best-initial-side selection. Exported for\n// unit testing of this mapping.\nexport function mapPlacement(placement: string): { side: Side; align: Align } {\n const parts = placement.split(\"-\");\n let side: Side;\n let align: Align = \"center\";\n\n switch (parts[0]) {\n case \"bottom\":\n side = \"bottom\";\n break;\n case \"left\":\n side = \"left\";\n break;\n case \"right\":\n side = \"right\";\n break;\n case \"top\":\n case \"auto\":\n default:\n side = \"top\";\n break;\n }\n\n if (parts[1] === \"start\") {\n align = \"start\";\n } else if (parts[1] === \"end\") {\n align = \"end\";\n }\n\n return { side, align };\n}\n\nconst Tooltip = ({\n content,\n children,\n enterDelay = MOTION.MOTION_DURATION_FAST * 1000,\n exitDelay,\n placement = \"auto\",\n appearance,\n zIndex = 7,\n qa,\n popoutProps,\n triggerProps,\n truncated = false,\n onFocus,\n onBlur,\n legacyMouseInteraction,\n ...rest\n}: TypeTooltipProps) => {\n const [open, setOpen] = useState(false);\n const [id] = useState(`Racine-tooltip-${idCounter++}`);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const isInvalidContent = content === null || content === undefined;\n const disablePortalToBody = useContext(DisablePortalToBodyContext);\n const [portalContainer, setPortalContainer] = useState<\n HTMLElement | undefined\n >(undefined);\n\n const resolvedExitDelay =\n exitDelay !== undefined\n ? exitDelay\n : legacyMouseInteraction\n ? MOTION.MOTION_DURATION_FAST * 1000\n : 0;\n\n const defaultAppearance =\n appearance || (typeof content === \"object\" ? \"box\" : \"pill\");\n\n const { side, align } = mapPlacement(placement);\n\n const mergedWrapperProps = {\n ...popoutProps,\n ...triggerProps,\n };\n\n const hasWrapperProps = Object.keys(mergedWrapperProps).length > 0;\n\n useEffect(() => {\n if (disablePortalToBody && triggerRef.current) {\n const dialogContent =\n triggerRef.current.closest<HTMLElement>(\"[role='dialog']\");\n setPortalContainer(dialogContent ?? undefined);\n }\n }, [disablePortalToBody]);\n\n if (isInvalidContent) {\n return (\n <span\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }\n : {}\n }\n >\n {children}\n </span>\n );\n }\n\n const tooltipTree = (\n <BaseTooltip.Root\n open={open}\n onOpenChange={setOpen}\n disabled={isInvalidContent}\n disableHoverablePopup={!legacyMouseInteraction}\n >\n <BaseTooltip.Trigger\n delay={enterDelay}\n closeDelay={resolvedExitDelay}\n render={\n <span\n ref={triggerRef}\n onFocus={onFocus}\n onBlur={onBlur}\n data-qa-popout-isopen={open ? \"true\" : \"false\"}\n data-qa-tooltip={id}\n {...(qa || {})}\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n }\n : undefined\n }\n />\n }\n >\n {React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n \"aria-expanded\": hasAttribute(children, \"aria-expanded\")\n ? children.props[\"aria-expanded\"]\n : undefined,\n \"aria-describedby\": open ? id : undefined,\n })\n : children}\n </BaseTooltip.Trigger>\n <BaseTooltip.Portal container={portalContainer}>\n <BaseTooltip.Positioner\n side={side}\n align={align}\n sideOffset={4}\n style={{ zIndex }}\n >\n <BaseTooltip.Popup\n id={id}\n render={\n <TooltipHybrid\n appearance={defaultAppearance}\n tabIndex={legacyMouseInteraction ? 0 : undefined}\n {...rest}\n />\n }\n >\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n\n return hasWrapperProps ? (\n <Box {...mergedWrapperProps}>{tooltipTree}</Box>\n ) : (\n tooltipTree\n );\n};\n\nexport default Tooltip;\n","/**\n * Hybrid Tooltip content\n * Automatically chooses between Tailwind and styled-components based on props.\n *\n * Rendered as the base-ui Tooltip Popup's `render` element, so it must forward\n * the ref and all base-ui-injected props (id, role, aria-*, data-state,\n * positioning style, className) onto its chosen leaf element.\n */\n\nimport React from \"react\";\nimport type { TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\nimport { needsStyledComponents } from \"@sproutsocial/seeds-react-system-props\";\nimport { StyledTooltipContent } from \"./styles\"; // Styled-components version\nimport { TooltipTailwind } from \"./TooltipTailwind\"; // Tailwind version\n\nexport interface TypeTooltipHybridProps extends Omit<TypeBoxProps, \"children\"> {\n appearance?: \"pill\" | \"box\";\n children?: React.ReactNode;\n}\n\n// Box style props NOT covered by `needsStyledComponents`. `TypeTooltipProps`\n// extends `Omit<TypeBoxProps, ...>`, so these are part of the public API; if a\n// consumer passes one it must route to the styled-components (Box) path rather\n// than spread onto the plain Tailwind <div> (which would drop the styling and\n// emit React \"unknown DOM attribute\" warnings). `StyledTooltipContent` is a\n// `styled(Box)`, so it accepts all of these safely.\nconst ADDITIONAL_BOX_STYLE_PROPS = [\n \"borderRadius\",\n \"border\",\n \"borderColor\",\n \"borderWidth\",\n \"borderStyle\",\n \"boxShadow\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"fontStyle\",\n \"textAlign\",\n \"position\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"zIndex\",\n \"opacity\",\n \"size\",\n] as const;\n\nconst hasAdditionalBoxStyleProps = (props: Record<string, any>): boolean =>\n ADDITIONAL_BOX_STYLE_PROPS.some((prop) => props[prop] !== undefined);\n\nconst TooltipHybrid = React.forwardRef<HTMLDivElement, TypeTooltipHybridProps>(\n ({ appearance, ...rest }, ref) => {\n if (needsStyledComponents(rest) || hasAdditionalBoxStyleProps(rest)) {\n // Styled-components path: a consumer passed system props (e.g. bg, mt) or a\n // styled(Tooltip) extension injected theme/forwardedComponent. The inline\n // system props below reproduce the original StyledTooltipContent styling.\n return (\n <StyledTooltipContent\n ref={ref}\n role=\"tooltip\"\n appearance={appearance}\n borderRadius={appearance === \"box\" ? 500 : \"5000em\"}\n px={400}\n py={appearance === \"box\" ? 400 : 200}\n m={200}\n color=\"text.body\"\n bg=\"container.background.base\"\n boxShadow=\"medium\"\n border={500}\n borderColor=\"container.border.base\"\n {...rest}\n />\n );\n }\n\n // Tailwind path (preferred - better performance). The gate above routes any\n // Box system/style prop (every prop enumerated in `needsStyledComponents`\n // plus `ADDITIONAL_BOX_STYLE_PROPS`) to the styled-components branch, so only\n // DOM-safe props (id, role, aria-*, data-*, style, className, tabIndex, ref)\n // remain in `rest` here.\n return (\n <TooltipTailwind\n ref={ref}\n appearance={appearance}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n );\n }\n);\n\nTooltipHybrid.displayName = \"TooltipHybrid\";\nexport default TooltipHybrid;\n","import styled from \"styled-components\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport type { TypeTooltipContent } from \"./TooltipTypes\";\n\nexport const StyledTooltipContent = styled(Box)<\n Pick<TypeTooltipContent, \"appearance\">\n>`\n font-family: ${(props) => props.theme.fontFamily};\n ${(props) => props.theme.typography[200]}\n text-align: ${(props) => (props.appearance === \"box\" ? \"left\" : \"center\")};\n`;\n","/**\n * Tailwind CSS implementation of Tooltip content\n * Uses Seeds tooltip CSS classes from tooltip.css\n */\n\nimport React from \"react\";\n\n// Utility for merging class names properly\nfunction cn(\n ...inputs: (string | undefined | null | false | Record<string, boolean>)[]\n): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === \"string\") {\n classes.push(input);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n\nexport interface TypeTooltipTailwindProps\n extends React.HTMLAttributes<HTMLDivElement> {\n appearance?: \"pill\" | \"box\";\n}\n\nexport const TooltipTailwind = React.forwardRef<\n HTMLDivElement,\n TypeTooltipTailwindProps\n>(({ appearance, className, ...rest }, ref) => (\n <div\n ref={ref}\n role=\"tooltip\"\n className={cn(\n \"seeds-tooltip\",\n appearance === \"box\" ? \"seeds-tooltip-box\" : \"seeds-tooltip-pill\",\n className\n )}\n {...rest}\n />\n));\n\nTooltipTailwind.displayName = \"TooltipTailwind\";\n","import * as React from \"react\";\nimport type { TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\n\nexport type TypeTooltipPlacement =\n | \"auto\"\n | \"auto-start\"\n | \"auto-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport interface TypeTooltipProps\n extends Omit<\n TypeBoxProps,\n \"children\" | \"content\" | \"onMouseEnter\" | \"onMouseLeave\"\n > {\n /** The content that the tooltip should be attached to. Hovering or focusing this element will cause the tooltip to appear */\n children: React.ReactNode;\n\n /** The content to be displayed within the tooltip. If there is no content, just the children are rendered */\n content: React.ReactNode;\n\n /**\n * The placement of the tooltip in relation to the children.\n *\n * Note: `auto`, `auto-start`, and `auto-end` resolve to the `top` side (with\n * the requested alignment) and rely on base-ui's runtime collision flipping,\n * rather than the legacy Popper.js best-initial-side selection.\n */\n placement?: TypeTooltipPlacement;\n\n /** The time (in ms) that a user has to be hovered/focused before the tooltip will appear */\n enterDelay?: number;\n\n /** The time (in ms) that a user has to leave hovered/focused before the tooltip will disappear */\n exitDelay?: number;\n\n /**\n * When true, enables mouse interaction on tooltip content and sets exitDelay\n * to MOTION_DURATION_FAST * 1000 by default (instead of 0).\n */\n legacyMouseInteraction?: boolean;\n\n /** Used to override the appearance of the Tooltip content. By default, strings will have the 'pill' appearance, and more complex content will have the 'box' appearance. You can change those defaults by setting this prop. */\n appearance?: \"pill\" | \"box\";\n qa?: object;\n zIndex?: number;\n\n /**\n * @deprecated Use `triggerProps` instead. The Tooltip no longer uses Popout internally. This prop is accepted and merged with triggerProps\n */\n popoutProps?: Record<string, unknown>;\n\n /** Props spread onto an outer wrapper Box rendered around the tooltip. Use this to apply layout styles (e.g. `display`, `width`) or other Box props to the element that wraps the tooltip's children. */\n triggerProps?: TypeBoxProps;\n\n /** Truncates text into a single line with ellipsis */\n truncated?: boolean;\n\n ariaProps?: Record<string, string>;\n}\n\nexport interface TypeTooltipContent\n extends Pick<TypeTooltipProps, \"appearance\" | \"children\"> {\n onFocus: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n onBlur: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n legacyMouseInteraction?: boolean;\n}\n","import Tooltip from \"./Tooltip\";\n\nexport default Tooltip;\nexport { Tooltip };\nexport * from \"./TooltipTypes\";\n"],"mappings":"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","names":["React","Box","React","jsx","React","jsx","Box"]}
|
package/dist/index.js
CHANGED
|
@@ -36,13 +36,17 @@ __export(index_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
37
|
|
|
38
38
|
// src/Tooltip.tsx
|
|
39
|
-
var
|
|
40
|
-
var
|
|
39
|
+
var React3 = __toESM(require("react"));
|
|
40
|
+
var import_react3 = require("react");
|
|
41
41
|
var import_unitless = __toESM(require("@sproutsocial/seeds-motion/unitless"));
|
|
42
42
|
var import_tooltip = require("@base-ui/react/tooltip");
|
|
43
43
|
var import_seeds_react_portal = require("@sproutsocial/seeds-react-portal");
|
|
44
44
|
var import_seeds_react_box2 = __toESM(require("@sproutsocial/seeds-react-box"));
|
|
45
45
|
|
|
46
|
+
// src/TooltipHybrid.tsx
|
|
47
|
+
var import_react2 = __toESM(require("react"));
|
|
48
|
+
var import_seeds_react_system_props = require("@sproutsocial/seeds-react-system-props");
|
|
49
|
+
|
|
46
50
|
// src/styles.ts
|
|
47
51
|
var import_styled_components = __toESM(require("styled-components"));
|
|
48
52
|
var import_seeds_react_box = __toESM(require("@sproutsocial/seeds-react-box"));
|
|
@@ -52,11 +56,105 @@ var StyledTooltipContent = (0, import_styled_components.default)(import_seeds_re
|
|
|
52
56
|
text-align: ${(props) => props.appearance === "box" ? "left" : "center"};
|
|
53
57
|
`;
|
|
54
58
|
|
|
55
|
-
// src/
|
|
59
|
+
// src/TooltipTailwind.tsx
|
|
60
|
+
var import_react = __toESM(require("react"));
|
|
56
61
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
62
|
+
function cn(...inputs) {
|
|
63
|
+
const classes = [];
|
|
64
|
+
for (const input of inputs) {
|
|
65
|
+
if (!input) continue;
|
|
66
|
+
if (typeof input === "string") {
|
|
67
|
+
classes.push(input);
|
|
68
|
+
} else if (typeof input === "object") {
|
|
69
|
+
for (const [key, value] of Object.entries(input)) {
|
|
70
|
+
if (value) {
|
|
71
|
+
classes.push(key);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return classes.join(" ");
|
|
77
|
+
}
|
|
78
|
+
var TooltipTailwind = import_react.default.forwardRef(({ appearance, className, ...rest }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
ref,
|
|
82
|
+
role: "tooltip",
|
|
83
|
+
className: cn(
|
|
84
|
+
"seeds-tooltip",
|
|
85
|
+
appearance === "box" ? "seeds-tooltip-box" : "seeds-tooltip-pill",
|
|
86
|
+
className
|
|
87
|
+
),
|
|
88
|
+
...rest
|
|
89
|
+
}
|
|
90
|
+
));
|
|
91
|
+
TooltipTailwind.displayName = "TooltipTailwind";
|
|
92
|
+
|
|
93
|
+
// src/TooltipHybrid.tsx
|
|
94
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
95
|
+
var ADDITIONAL_BOX_STYLE_PROPS = [
|
|
96
|
+
"borderRadius",
|
|
97
|
+
"border",
|
|
98
|
+
"borderColor",
|
|
99
|
+
"borderWidth",
|
|
100
|
+
"borderStyle",
|
|
101
|
+
"boxShadow",
|
|
102
|
+
"fontSize",
|
|
103
|
+
"fontWeight",
|
|
104
|
+
"lineHeight",
|
|
105
|
+
"letterSpacing",
|
|
106
|
+
"fontStyle",
|
|
107
|
+
"textAlign",
|
|
108
|
+
"position",
|
|
109
|
+
"top",
|
|
110
|
+
"right",
|
|
111
|
+
"bottom",
|
|
112
|
+
"left",
|
|
113
|
+
"zIndex",
|
|
114
|
+
"opacity",
|
|
115
|
+
"size"
|
|
116
|
+
];
|
|
117
|
+
var hasAdditionalBoxStyleProps = (props) => ADDITIONAL_BOX_STYLE_PROPS.some((prop) => props[prop] !== void 0);
|
|
118
|
+
var TooltipHybrid = import_react2.default.forwardRef(
|
|
119
|
+
({ appearance, ...rest }, ref) => {
|
|
120
|
+
if ((0, import_seeds_react_system_props.needsStyledComponents)(rest) || hasAdditionalBoxStyleProps(rest)) {
|
|
121
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
122
|
+
StyledTooltipContent,
|
|
123
|
+
{
|
|
124
|
+
ref,
|
|
125
|
+
role: "tooltip",
|
|
126
|
+
appearance,
|
|
127
|
+
borderRadius: appearance === "box" ? 500 : "5000em",
|
|
128
|
+
px: 400,
|
|
129
|
+
py: appearance === "box" ? 400 : 200,
|
|
130
|
+
m: 200,
|
|
131
|
+
color: "text.body",
|
|
132
|
+
bg: "container.background.base",
|
|
133
|
+
boxShadow: "medium",
|
|
134
|
+
border: 500,
|
|
135
|
+
borderColor: "container.border.base",
|
|
136
|
+
...rest
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
141
|
+
TooltipTailwind,
|
|
142
|
+
{
|
|
143
|
+
ref,
|
|
144
|
+
appearance,
|
|
145
|
+
...rest
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
TooltipHybrid.displayName = "TooltipHybrid";
|
|
151
|
+
var TooltipHybrid_default = TooltipHybrid;
|
|
152
|
+
|
|
153
|
+
// src/Tooltip.tsx
|
|
154
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
57
155
|
var idCounter = 0;
|
|
58
156
|
var hasAttribute = (child, attribute) => {
|
|
59
|
-
return
|
|
157
|
+
return React3.isValidElement(child) && child.props[attribute] !== void 0;
|
|
60
158
|
};
|
|
61
159
|
function mapPlacement(placement) {
|
|
62
160
|
const parts = placement.split("-");
|
|
@@ -102,12 +200,12 @@ var Tooltip = ({
|
|
|
102
200
|
legacyMouseInteraction,
|
|
103
201
|
...rest
|
|
104
202
|
}) => {
|
|
105
|
-
const [open, setOpen] = (0,
|
|
106
|
-
const [id] = (0,
|
|
107
|
-
const triggerRef = (0,
|
|
203
|
+
const [open, setOpen] = (0, import_react3.useState)(false);
|
|
204
|
+
const [id] = (0, import_react3.useState)(`Racine-tooltip-${idCounter++}`);
|
|
205
|
+
const triggerRef = (0, import_react3.useRef)(null);
|
|
108
206
|
const isInvalidContent = content === null || content === void 0;
|
|
109
|
-
const disablePortalToBody = (0,
|
|
110
|
-
const [portalContainer, setPortalContainer] = (0,
|
|
207
|
+
const disablePortalToBody = (0, import_react3.useContext)(import_seeds_react_portal.DisablePortalToBodyContext);
|
|
208
|
+
const [portalContainer, setPortalContainer] = (0, import_react3.useState)(void 0);
|
|
111
209
|
const resolvedExitDelay = exitDelay !== void 0 ? exitDelay : legacyMouseInteraction ? import_unitless.default.MOTION_DURATION_FAST * 1e3 : 0;
|
|
112
210
|
const defaultAppearance = appearance || (typeof content === "object" ? "box" : "pill");
|
|
113
211
|
const { side, align } = mapPlacement(placement);
|
|
@@ -116,14 +214,14 @@ var Tooltip = ({
|
|
|
116
214
|
...triggerProps
|
|
117
215
|
};
|
|
118
216
|
const hasWrapperProps = Object.keys(mergedWrapperProps).length > 0;
|
|
119
|
-
(0,
|
|
217
|
+
(0, import_react3.useEffect)(() => {
|
|
120
218
|
if (disablePortalToBody && triggerRef.current) {
|
|
121
219
|
const dialogContent = triggerRef.current.closest("[role='dialog']");
|
|
122
220
|
setPortalContainer(dialogContent ?? void 0);
|
|
123
221
|
}
|
|
124
222
|
}, [disablePortalToBody]);
|
|
125
223
|
if (isInvalidContent) {
|
|
126
|
-
return /* @__PURE__ */ (0,
|
|
224
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
127
225
|
"span",
|
|
128
226
|
{
|
|
129
227
|
style: truncated ? {
|
|
@@ -135,7 +233,7 @@ var Tooltip = ({
|
|
|
135
233
|
}
|
|
136
234
|
);
|
|
137
235
|
}
|
|
138
|
-
const tooltipTree = /* @__PURE__ */ (0,
|
|
236
|
+
const tooltipTree = /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
139
237
|
import_tooltip.Tooltip.Root,
|
|
140
238
|
{
|
|
141
239
|
open,
|
|
@@ -143,12 +241,12 @@ var Tooltip = ({
|
|
|
143
241
|
disabled: isInvalidContent,
|
|
144
242
|
disableHoverablePopup: !legacyMouseInteraction,
|
|
145
243
|
children: [
|
|
146
|
-
/* @__PURE__ */ (0,
|
|
244
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
147
245
|
import_tooltip.Tooltip.Trigger,
|
|
148
246
|
{
|
|
149
247
|
delay: enterDelay,
|
|
150
248
|
closeDelay: resolvedExitDelay,
|
|
151
|
-
render: /* @__PURE__ */ (0,
|
|
249
|
+
render: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
152
250
|
"span",
|
|
153
251
|
{
|
|
154
252
|
ref: triggerRef,
|
|
@@ -165,37 +263,27 @@ var Tooltip = ({
|
|
|
165
263
|
} : void 0
|
|
166
264
|
}
|
|
167
265
|
),
|
|
168
|
-
children:
|
|
266
|
+
children: React3.isValidElement(children) ? React3.cloneElement(children, {
|
|
169
267
|
"aria-expanded": hasAttribute(children, "aria-expanded") ? children.props["aria-expanded"] : void 0,
|
|
170
268
|
"aria-describedby": open ? id : void 0
|
|
171
269
|
}) : children
|
|
172
270
|
}
|
|
173
271
|
),
|
|
174
|
-
/* @__PURE__ */ (0,
|
|
272
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Portal, { container: portalContainer, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
175
273
|
import_tooltip.Tooltip.Positioner,
|
|
176
274
|
{
|
|
177
275
|
side,
|
|
178
276
|
align,
|
|
179
277
|
sideOffset: 4,
|
|
180
278
|
style: { zIndex },
|
|
181
|
-
children: /* @__PURE__ */ (0,
|
|
279
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
182
280
|
import_tooltip.Tooltip.Popup,
|
|
183
281
|
{
|
|
184
282
|
id,
|
|
185
|
-
render: /* @__PURE__ */ (0,
|
|
186
|
-
|
|
283
|
+
render: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
284
|
+
TooltipHybrid_default,
|
|
187
285
|
{
|
|
188
|
-
role: "tooltip",
|
|
189
286
|
appearance: defaultAppearance,
|
|
190
|
-
borderRadius: defaultAppearance === "box" ? 500 : "5000em",
|
|
191
|
-
px: 400,
|
|
192
|
-
py: defaultAppearance === "box" ? 400 : 200,
|
|
193
|
-
m: 200,
|
|
194
|
-
color: "text.body",
|
|
195
|
-
bg: "container.background.base",
|
|
196
|
-
boxShadow: "medium",
|
|
197
|
-
border: 500,
|
|
198
|
-
borderColor: "container.border.base",
|
|
199
287
|
tabIndex: legacyMouseInteraction ? 0 : void 0,
|
|
200
288
|
...rest
|
|
201
289
|
}
|
|
@@ -208,12 +296,12 @@ var Tooltip = ({
|
|
|
208
296
|
]
|
|
209
297
|
}
|
|
210
298
|
);
|
|
211
|
-
return hasWrapperProps ? /* @__PURE__ */ (0,
|
|
299
|
+
return hasWrapperProps ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_seeds_react_box2.default, { ...mergedWrapperProps, children: tooltipTree }) : tooltipTree;
|
|
212
300
|
};
|
|
213
301
|
var Tooltip_default = Tooltip;
|
|
214
302
|
|
|
215
303
|
// src/TooltipTypes.ts
|
|
216
|
-
var
|
|
304
|
+
var React4 = require("react");
|
|
217
305
|
|
|
218
306
|
// src/index.ts
|
|
219
307
|
var index_default = Tooltip_default;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/Tooltip.tsx","../src/styles.ts","../src/TooltipTypes.ts"],"sourcesContent":["import Tooltip from \"./Tooltip\";\n\nexport default Tooltip;\nexport { Tooltip };\nexport * from \"./TooltipTypes\";\n","import * as React from \"react\";\nimport { useState, useRef, useEffect, useContext } from \"react\";\nimport MOTION from \"@sproutsocial/seeds-motion/unitless\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport { DisablePortalToBodyContext } from \"@sproutsocial/seeds-react-portal\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport { StyledTooltipContent } from \"./styles\";\nimport type { TypeTooltipProps } from \"./TooltipTypes\";\n\nlet idCounter = 0;\n\nconst hasAttribute = (child: React.ReactNode, attribute: string) => {\n return React.isValidElement(child) && child.props[attribute] !== undefined;\n};\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\n// `auto`, `auto-start`, and `auto-end` resolve to `side: \"top\"` (with align\n// taken from the suffix) and rely on base-ui's Positioner collision flipping at\n// runtime, rather than Popper's old best-initial-side selection. Exported for\n// unit testing of this mapping.\nexport function mapPlacement(placement: string): { side: Side; align: Align } {\n const parts = placement.split(\"-\");\n let side: Side;\n let align: Align = \"center\";\n\n switch (parts[0]) {\n case \"bottom\":\n side = \"bottom\";\n break;\n case \"left\":\n side = \"left\";\n break;\n case \"right\":\n side = \"right\";\n break;\n case \"top\":\n case \"auto\":\n default:\n side = \"top\";\n break;\n }\n\n if (parts[1] === \"start\") {\n align = \"start\";\n } else if (parts[1] === \"end\") {\n align = \"end\";\n }\n\n return { side, align };\n}\n\nconst Tooltip = ({\n content,\n children,\n enterDelay = MOTION.MOTION_DURATION_FAST * 1000,\n exitDelay,\n placement = \"auto\",\n appearance,\n zIndex = 7,\n qa,\n popoutProps,\n triggerProps,\n truncated = false,\n onFocus,\n onBlur,\n legacyMouseInteraction,\n ...rest\n}: TypeTooltipProps) => {\n const [open, setOpen] = useState(false);\n const [id] = useState(`Racine-tooltip-${idCounter++}`);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const isInvalidContent = content === null || content === undefined;\n const disablePortalToBody = useContext(DisablePortalToBodyContext);\n const [portalContainer, setPortalContainer] = useState<\n HTMLElement | undefined\n >(undefined);\n\n const resolvedExitDelay =\n exitDelay !== undefined\n ? exitDelay\n : legacyMouseInteraction\n ? MOTION.MOTION_DURATION_FAST * 1000\n : 0;\n\n const defaultAppearance =\n appearance || (typeof content === \"object\" ? \"box\" : \"pill\");\n\n const { side, align } = mapPlacement(placement);\n\n const mergedWrapperProps = {\n ...popoutProps,\n ...triggerProps,\n };\n\n const hasWrapperProps = Object.keys(mergedWrapperProps).length > 0;\n\n useEffect(() => {\n if (disablePortalToBody && triggerRef.current) {\n const dialogContent =\n triggerRef.current.closest<HTMLElement>(\"[role='dialog']\");\n setPortalContainer(dialogContent ?? undefined);\n }\n }, [disablePortalToBody]);\n\n if (isInvalidContent) {\n return (\n <span\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }\n : {}\n }\n >\n {children}\n </span>\n );\n }\n\n const tooltipTree = (\n <BaseTooltip.Root\n open={open}\n onOpenChange={setOpen}\n disabled={isInvalidContent}\n disableHoverablePopup={!legacyMouseInteraction}\n >\n <BaseTooltip.Trigger\n delay={enterDelay}\n closeDelay={resolvedExitDelay}\n render={\n <span\n ref={triggerRef}\n onFocus={onFocus}\n onBlur={onBlur}\n data-qa-popout-isopen={open ? \"true\" : \"false\"}\n data-qa-tooltip={id}\n {...(qa || {})}\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n }\n : undefined\n }\n />\n }\n >\n {React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n \"aria-expanded\": hasAttribute(children, \"aria-expanded\")\n ? children.props[\"aria-expanded\"]\n : undefined,\n \"aria-describedby\": open ? id : undefined,\n })\n : children}\n </BaseTooltip.Trigger>\n <BaseTooltip.Portal container={portalContainer}>\n <BaseTooltip.Positioner\n side={side}\n align={align}\n sideOffset={4}\n style={{ zIndex }}\n >\n <BaseTooltip.Popup\n id={id}\n render={\n <StyledTooltipContent\n role=\"tooltip\"\n appearance={defaultAppearance}\n borderRadius={defaultAppearance === \"box\" ? 500 : \"5000em\"}\n px={400}\n py={defaultAppearance === \"box\" ? 400 : 200}\n m={200}\n color=\"text.body\"\n bg=\"container.background.base\"\n boxShadow=\"medium\"\n border={500}\n borderColor=\"container.border.base\"\n tabIndex={legacyMouseInteraction ? 0 : undefined}\n {...rest}\n />\n }\n >\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n\n return hasWrapperProps ? (\n <Box {...mergedWrapperProps}>{tooltipTree}</Box>\n ) : (\n tooltipTree\n );\n};\n\nexport default Tooltip;\n","import styled from \"styled-components\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport type { TypeTooltipContent } from \"./TooltipTypes\";\n\nexport const StyledTooltipContent = styled(Box)<\n Pick<TypeTooltipContent, \"appearance\">\n>`\n font-family: ${(props) => props.theme.fontFamily};\n ${(props) => props.theme.typography[200]}\n text-align: ${(props) => (props.appearance === \"box\" ? \"left\" : \"center\")};\n`;\n","import * as React from \"react\";\nimport type { TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\n\nexport type TypeTooltipPlacement =\n | \"auto\"\n | \"auto-start\"\n | \"auto-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport interface TypeTooltipProps\n extends Omit<\n TypeBoxProps,\n \"children\" | \"content\" | \"onMouseEnter\" | \"onMouseLeave\"\n > {\n /** The content that the tooltip should be attached to. Hovering or focusing this element will cause the tooltip to appear */\n children: React.ReactNode;\n\n /** The content to be displayed within the tooltip. If there is no content, just the children are rendered */\n content: React.ReactNode;\n\n /**\n * The placement of the tooltip in relation to the children.\n *\n * Note: `auto`, `auto-start`, and `auto-end` resolve to the `top` side (with\n * the requested alignment) and rely on base-ui's runtime collision flipping,\n * rather than the legacy Popper.js best-initial-side selection.\n */\n placement?: TypeTooltipPlacement;\n\n /** The time (in ms) that a user has to be hovered/focused before the tooltip will appear */\n enterDelay?: number;\n\n /** The time (in ms) that a user has to leave hovered/focused before the tooltip will disappear */\n exitDelay?: number;\n\n /**\n * When true, enables mouse interaction on tooltip content and sets exitDelay\n * to MOTION_DURATION_FAST * 1000 by default (instead of 0).\n */\n legacyMouseInteraction?: boolean;\n\n /** Used to override the appearance of the Tooltip content. By default, strings will have the 'pill' appearance, and more complex content will have the 'box' appearance. You can change those defaults by setting this prop. */\n appearance?: \"pill\" | \"box\";\n qa?: object;\n zIndex?: number;\n\n /**\n * @deprecated Use `triggerProps` instead. The Tooltip no longer uses Popout internally. This prop is accepted and merged with triggerProps\n */\n popoutProps?: Record<string, unknown>;\n\n /** Props spread onto an outer wrapper Box rendered around the tooltip. Use this to apply layout styles (e.g. `display`, `width`) or other Box props to the element that wraps the tooltip's children. */\n triggerProps?: TypeBoxProps;\n\n /** Truncates text into a single line with ellipsis */\n truncated?: boolean;\n\n ariaProps?: Record<string, string>;\n}\n\nexport interface TypeTooltipContent\n extends Pick<TypeTooltipProps, \"appearance\" | \"children\"> {\n onFocus: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n onBlur: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n legacyMouseInteraction?: boolean;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAuB;AACvB,mBAAwD;AACxD,sBAAmB;AACnB,qBAAuC;AACvC,gCAA2C;AAC3C,IAAAA,0BAAgB;;;ACLhB,+BAAmB;AACnB,6BAAgB;AAGT,IAAM,2BAAuB,yBAAAC,SAAO,uBAAAC,OAAG;AAAA,iBAG7B,CAAC,UAAU,MAAM,MAAM,UAAU;AAAA,IAC9C,CAAC,UAAU,MAAM,MAAM,WAAW,GAAG,CAAC;AAAA,gBAC1B,CAAC,UAAW,MAAM,eAAe,QAAQ,SAAS,QAAS;AAAA;;;ADmGrE;AAnGN,IAAI,YAAY;AAEhB,IAAM,eAAe,CAAC,OAAwB,cAAsB;AAClE,SAAa,qBAAe,KAAK,KAAK,MAAM,MAAM,SAAS,MAAM;AACnE;AASO,SAAS,aAAa,WAAiD;AAC5E,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,MAAI;AACJ,MAAI,QAAe;AAEnB,UAAQ,MAAM,CAAC,GAAG;AAAA,IAChB,KAAK;AACH,aAAO;AACP;AAAA,IACF,KAAK;AACH,aAAO;AACP;AAAA,IACF,KAAK;AACH,aAAO;AACP;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO;AACP;AAAA,EACJ;AAEA,MAAI,MAAM,CAAC,MAAM,SAAS;AACxB,YAAQ;AAAA,EACV,WAAW,MAAM,CAAC,MAAM,OAAO;AAC7B,YAAQ;AAAA,EACV;AAEA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA,aAAa,gBAAAC,QAAO,uBAAuB;AAAA,EAC3C;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAwB;AACtB,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,EAAE,QAAI,uBAAS,kBAAkB,WAAW,EAAE;AACrD,QAAM,iBAAa,qBAAwB,IAAI;AAC/C,QAAM,mBAAmB,YAAY,QAAQ,YAAY;AACzD,QAAM,0BAAsB,yBAAW,oDAA0B;AACjE,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAE5C,MAAS;AAEX,QAAM,oBACJ,cAAc,SACV,YACA,yBACA,gBAAAA,QAAO,uBAAuB,MAC9B;AAEN,QAAM,oBACJ,eAAe,OAAO,YAAY,WAAW,QAAQ;AAEvD,QAAM,EAAE,MAAM,MAAM,IAAI,aAAa,SAAS;AAE9C,QAAM,qBAAqB;AAAA,IACzB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,kBAAkB,OAAO,KAAK,kBAAkB,EAAE,SAAS;AAEjE,8BAAU,MAAM;AACd,QAAI,uBAAuB,WAAW,SAAS;AAC7C,YAAM,gBACJ,WAAW,QAAQ,QAAqB,iBAAiB;AAC3D,yBAAmB,iBAAiB,MAAS;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,mBAAmB,CAAC;AAExB,MAAI,kBAAkB;AACpB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OACE,YACI;AAAA,UACE,UAAU;AAAA,UACV,cAAc;AAAA,UACd,YAAY;AAAA,QACd,IACA,CAAC;AAAA,QAGN;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,QAAM,cACJ;AAAA,IAAC,eAAAC,QAAY;AAAA,IAAZ;AAAA,MACC;AAAA,MACA,cAAc;AAAA,MACd,UAAU;AAAA,MACV,uBAAuB,CAAC;AAAA,MAExB;AAAA;AAAA,UAAC,eAAAA,QAAY;AAAA,UAAZ;AAAA,YACC,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QACE;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA,yBAAuB,OAAO,SAAS;AAAA,gBACvC,mBAAiB;AAAA,gBAChB,GAAI,MAAM,CAAC;AAAA,gBACZ,OACE,YACI;AAAA,kBACE,UAAU;AAAA,kBACV,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,SAAS;AAAA,gBACX,IACA;AAAA;AAAA,YAER;AAAA,YAGD,UAAM,qBAAe,QAAQ,IACpB,mBAAa,UAAgC;AAAA,cACjD,iBAAiB,aAAa,UAAU,eAAe,IACnD,SAAS,MAAM,eAAe,IAC9B;AAAA,cACJ,oBAAoB,OAAO,KAAK;AAAA,YAClC,CAAC,IACD;AAAA;AAAA,QACN;AAAA,QACA,4CAAC,eAAAA,QAAY,QAAZ,EAAmB,WAAW,iBAC7B;AAAA,UAAC,eAAAA,QAAY;AAAA,UAAZ;AAAA,YACC;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ,OAAO,EAAE,OAAO;AAAA,YAEhB;AAAA,cAAC,eAAAA,QAAY;AAAA,cAAZ;AAAA,gBACC;AAAA,gBACA,QACE;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,YAAY;AAAA,oBACZ,cAAc,sBAAsB,QAAQ,MAAM;AAAA,oBAClD,IAAI;AAAA,oBACJ,IAAI,sBAAsB,QAAQ,MAAM;AAAA,oBACxC,GAAG;AAAA,oBACH,OAAM;AAAA,oBACN,IAAG;AAAA,oBACH,WAAU;AAAA,oBACV,QAAQ;AAAA,oBACR,aAAY;AAAA,oBACZ,UAAU,yBAAyB,IAAI;AAAA,oBACtC,GAAG;AAAA;AAAA,gBACN;AAAA,gBAGD;AAAA;AAAA,YACH;AAAA;AAAA,QACF,GACF;AAAA;AAAA;AAAA,EACF;AAGF,SAAO,kBACL,4CAAC,wBAAAC,SAAA,EAAK,GAAG,oBAAqB,uBAAY,IAE1C;AAEJ;AAEA,IAAO,kBAAQ;;;AE7Mf,IAAAC,SAAuB;;;AHEvB,IAAO,gBAAQ;","names":["import_seeds_react_box","styled","Box","MOTION","BaseTooltip","Box","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/Tooltip.tsx","../src/TooltipHybrid.tsx","../src/styles.ts","../src/TooltipTailwind.tsx","../src/TooltipTypes.ts"],"sourcesContent":["import Tooltip from \"./Tooltip\";\n\nexport default Tooltip;\nexport { Tooltip };\nexport * from \"./TooltipTypes\";\n","import * as React from \"react\";\nimport { useState, useRef, useEffect, useContext } from \"react\";\nimport MOTION from \"@sproutsocial/seeds-motion/unitless\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport { DisablePortalToBodyContext } from \"@sproutsocial/seeds-react-portal\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport TooltipHybrid from \"./TooltipHybrid\";\nimport type { TypeTooltipProps } from \"./TooltipTypes\";\n\nlet idCounter = 0;\n\nconst hasAttribute = (child: React.ReactNode, attribute: string) => {\n return React.isValidElement(child) && child.props[attribute] !== undefined;\n};\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\n// `auto`, `auto-start`, and `auto-end` resolve to `side: \"top\"` (with align\n// taken from the suffix) and rely on base-ui's Positioner collision flipping at\n// runtime, rather than Popper's old best-initial-side selection. Exported for\n// unit testing of this mapping.\nexport function mapPlacement(placement: string): { side: Side; align: Align } {\n const parts = placement.split(\"-\");\n let side: Side;\n let align: Align = \"center\";\n\n switch (parts[0]) {\n case \"bottom\":\n side = \"bottom\";\n break;\n case \"left\":\n side = \"left\";\n break;\n case \"right\":\n side = \"right\";\n break;\n case \"top\":\n case \"auto\":\n default:\n side = \"top\";\n break;\n }\n\n if (parts[1] === \"start\") {\n align = \"start\";\n } else if (parts[1] === \"end\") {\n align = \"end\";\n }\n\n return { side, align };\n}\n\nconst Tooltip = ({\n content,\n children,\n enterDelay = MOTION.MOTION_DURATION_FAST * 1000,\n exitDelay,\n placement = \"auto\",\n appearance,\n zIndex = 7,\n qa,\n popoutProps,\n triggerProps,\n truncated = false,\n onFocus,\n onBlur,\n legacyMouseInteraction,\n ...rest\n}: TypeTooltipProps) => {\n const [open, setOpen] = useState(false);\n const [id] = useState(`Racine-tooltip-${idCounter++}`);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const isInvalidContent = content === null || content === undefined;\n const disablePortalToBody = useContext(DisablePortalToBodyContext);\n const [portalContainer, setPortalContainer] = useState<\n HTMLElement | undefined\n >(undefined);\n\n const resolvedExitDelay =\n exitDelay !== undefined\n ? exitDelay\n : legacyMouseInteraction\n ? MOTION.MOTION_DURATION_FAST * 1000\n : 0;\n\n const defaultAppearance =\n appearance || (typeof content === \"object\" ? \"box\" : \"pill\");\n\n const { side, align } = mapPlacement(placement);\n\n const mergedWrapperProps = {\n ...popoutProps,\n ...triggerProps,\n };\n\n const hasWrapperProps = Object.keys(mergedWrapperProps).length > 0;\n\n useEffect(() => {\n if (disablePortalToBody && triggerRef.current) {\n const dialogContent =\n triggerRef.current.closest<HTMLElement>(\"[role='dialog']\");\n setPortalContainer(dialogContent ?? undefined);\n }\n }, [disablePortalToBody]);\n\n if (isInvalidContent) {\n return (\n <span\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }\n : {}\n }\n >\n {children}\n </span>\n );\n }\n\n const tooltipTree = (\n <BaseTooltip.Root\n open={open}\n onOpenChange={setOpen}\n disabled={isInvalidContent}\n disableHoverablePopup={!legacyMouseInteraction}\n >\n <BaseTooltip.Trigger\n delay={enterDelay}\n closeDelay={resolvedExitDelay}\n render={\n <span\n ref={triggerRef}\n onFocus={onFocus}\n onBlur={onBlur}\n data-qa-popout-isopen={open ? \"true\" : \"false\"}\n data-qa-tooltip={id}\n {...(qa || {})}\n style={\n truncated\n ? {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n }\n : undefined\n }\n />\n }\n >\n {React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n \"aria-expanded\": hasAttribute(children, \"aria-expanded\")\n ? children.props[\"aria-expanded\"]\n : undefined,\n \"aria-describedby\": open ? id : undefined,\n })\n : children}\n </BaseTooltip.Trigger>\n <BaseTooltip.Portal container={portalContainer}>\n <BaseTooltip.Positioner\n side={side}\n align={align}\n sideOffset={4}\n style={{ zIndex }}\n >\n <BaseTooltip.Popup\n id={id}\n render={\n <TooltipHybrid\n appearance={defaultAppearance}\n tabIndex={legacyMouseInteraction ? 0 : undefined}\n {...rest}\n />\n }\n >\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n\n return hasWrapperProps ? (\n <Box {...mergedWrapperProps}>{tooltipTree}</Box>\n ) : (\n tooltipTree\n );\n};\n\nexport default Tooltip;\n","/**\n * Hybrid Tooltip content\n * Automatically chooses between Tailwind and styled-components based on props.\n *\n * Rendered as the base-ui Tooltip Popup's `render` element, so it must forward\n * the ref and all base-ui-injected props (id, role, aria-*, data-state,\n * positioning style, className) onto its chosen leaf element.\n */\n\nimport React from \"react\";\nimport type { TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\nimport { needsStyledComponents } from \"@sproutsocial/seeds-react-system-props\";\nimport { StyledTooltipContent } from \"./styles\"; // Styled-components version\nimport { TooltipTailwind } from \"./TooltipTailwind\"; // Tailwind version\n\nexport interface TypeTooltipHybridProps extends Omit<TypeBoxProps, \"children\"> {\n appearance?: \"pill\" | \"box\";\n children?: React.ReactNode;\n}\n\n// Box style props NOT covered by `needsStyledComponents`. `TypeTooltipProps`\n// extends `Omit<TypeBoxProps, ...>`, so these are part of the public API; if a\n// consumer passes one it must route to the styled-components (Box) path rather\n// than spread onto the plain Tailwind <div> (which would drop the styling and\n// emit React \"unknown DOM attribute\" warnings). `StyledTooltipContent` is a\n// `styled(Box)`, so it accepts all of these safely.\nconst ADDITIONAL_BOX_STYLE_PROPS = [\n \"borderRadius\",\n \"border\",\n \"borderColor\",\n \"borderWidth\",\n \"borderStyle\",\n \"boxShadow\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"fontStyle\",\n \"textAlign\",\n \"position\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"zIndex\",\n \"opacity\",\n \"size\",\n] as const;\n\nconst hasAdditionalBoxStyleProps = (props: Record<string, any>): boolean =>\n ADDITIONAL_BOX_STYLE_PROPS.some((prop) => props[prop] !== undefined);\n\nconst TooltipHybrid = React.forwardRef<HTMLDivElement, TypeTooltipHybridProps>(\n ({ appearance, ...rest }, ref) => {\n if (needsStyledComponents(rest) || hasAdditionalBoxStyleProps(rest)) {\n // Styled-components path: a consumer passed system props (e.g. bg, mt) or a\n // styled(Tooltip) extension injected theme/forwardedComponent. The inline\n // system props below reproduce the original StyledTooltipContent styling.\n return (\n <StyledTooltipContent\n ref={ref}\n role=\"tooltip\"\n appearance={appearance}\n borderRadius={appearance === \"box\" ? 500 : \"5000em\"}\n px={400}\n py={appearance === \"box\" ? 400 : 200}\n m={200}\n color=\"text.body\"\n bg=\"container.background.base\"\n boxShadow=\"medium\"\n border={500}\n borderColor=\"container.border.base\"\n {...rest}\n />\n );\n }\n\n // Tailwind path (preferred - better performance). The gate above routes any\n // Box system/style prop (every prop enumerated in `needsStyledComponents`\n // plus `ADDITIONAL_BOX_STYLE_PROPS`) to the styled-components branch, so only\n // DOM-safe props (id, role, aria-*, data-*, style, className, tabIndex, ref)\n // remain in `rest` here.\n return (\n <TooltipTailwind\n ref={ref}\n appearance={appearance}\n {...(rest as React.HTMLAttributes<HTMLDivElement>)}\n />\n );\n }\n);\n\nTooltipHybrid.displayName = \"TooltipHybrid\";\nexport default TooltipHybrid;\n","import styled from \"styled-components\";\nimport Box from \"@sproutsocial/seeds-react-box\";\nimport type { TypeTooltipContent } from \"./TooltipTypes\";\n\nexport const StyledTooltipContent = styled(Box)<\n Pick<TypeTooltipContent, \"appearance\">\n>`\n font-family: ${(props) => props.theme.fontFamily};\n ${(props) => props.theme.typography[200]}\n text-align: ${(props) => (props.appearance === \"box\" ? \"left\" : \"center\")};\n`;\n","/**\n * Tailwind CSS implementation of Tooltip content\n * Uses Seeds tooltip CSS classes from tooltip.css\n */\n\nimport React from \"react\";\n\n// Utility for merging class names properly\nfunction cn(\n ...inputs: (string | undefined | null | false | Record<string, boolean>)[]\n): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === \"string\") {\n classes.push(input);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value) {\n classes.push(key);\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n\nexport interface TypeTooltipTailwindProps\n extends React.HTMLAttributes<HTMLDivElement> {\n appearance?: \"pill\" | \"box\";\n}\n\nexport const TooltipTailwind = React.forwardRef<\n HTMLDivElement,\n TypeTooltipTailwindProps\n>(({ appearance, className, ...rest }, ref) => (\n <div\n ref={ref}\n role=\"tooltip\"\n className={cn(\n \"seeds-tooltip\",\n appearance === \"box\" ? \"seeds-tooltip-box\" : \"seeds-tooltip-pill\",\n className\n )}\n {...rest}\n />\n));\n\nTooltipTailwind.displayName = \"TooltipTailwind\";\n","import * as React from \"react\";\nimport type { TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\n\nexport type TypeTooltipPlacement =\n | \"auto\"\n | \"auto-start\"\n | \"auto-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"left\"\n | \"left-start\"\n | \"left-end\"\n | \"right\"\n | \"right-start\"\n | \"right-end\";\n\nexport interface TypeTooltipProps\n extends Omit<\n TypeBoxProps,\n \"children\" | \"content\" | \"onMouseEnter\" | \"onMouseLeave\"\n > {\n /** The content that the tooltip should be attached to. Hovering or focusing this element will cause the tooltip to appear */\n children: React.ReactNode;\n\n /** The content to be displayed within the tooltip. If there is no content, just the children are rendered */\n content: React.ReactNode;\n\n /**\n * The placement of the tooltip in relation to the children.\n *\n * Note: `auto`, `auto-start`, and `auto-end` resolve to the `top` side (with\n * the requested alignment) and rely on base-ui's runtime collision flipping,\n * rather than the legacy Popper.js best-initial-side selection.\n */\n placement?: TypeTooltipPlacement;\n\n /** The time (in ms) that a user has to be hovered/focused before the tooltip will appear */\n enterDelay?: number;\n\n /** The time (in ms) that a user has to leave hovered/focused before the tooltip will disappear */\n exitDelay?: number;\n\n /**\n * When true, enables mouse interaction on tooltip content and sets exitDelay\n * to MOTION_DURATION_FAST * 1000 by default (instead of 0).\n */\n legacyMouseInteraction?: boolean;\n\n /** Used to override the appearance of the Tooltip content. By default, strings will have the 'pill' appearance, and more complex content will have the 'box' appearance. You can change those defaults by setting this prop. */\n appearance?: \"pill\" | \"box\";\n qa?: object;\n zIndex?: number;\n\n /**\n * @deprecated Use `triggerProps` instead. The Tooltip no longer uses Popout internally. This prop is accepted and merged with triggerProps\n */\n popoutProps?: Record<string, unknown>;\n\n /** Props spread onto an outer wrapper Box rendered around the tooltip. Use this to apply layout styles (e.g. `display`, `width`) or other Box props to the element that wraps the tooltip's children. */\n triggerProps?: TypeBoxProps;\n\n /** Truncates text into a single line with ellipsis */\n truncated?: boolean;\n\n ariaProps?: Record<string, string>;\n}\n\nexport interface TypeTooltipContent\n extends Pick<TypeTooltipProps, \"appearance\" | \"children\"> {\n onFocus: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n onBlur: (e: React.FocusEvent<HTMLDivElement, FocusEvent>) => void;\n legacyMouseInteraction?: boolean;\n}\n"],"mappings":"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","names":["React","import_react","import_seeds_react_box","import_react","styled","Box","React","import_jsx_runtime","React","import_jsx_runtime","MOTION","BaseTooltip","Box","React"]}
|
package/dist/tooltip.css
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeds Tooltip component classes
|
|
3
|
+
* Use these instead of writing out individual Tailwind utility classes.
|
|
4
|
+
*
|
|
5
|
+
* Requires @sproutsocial/seeds-react-theme/dist/theme-all.css imported for
|
|
6
|
+
* CSS variable definitions and dark mode support.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* <div class="seeds-tooltip seeds-tooltip-pill" role="tooltip">Label</div>
|
|
10
|
+
* <div class="seeds-tooltip seeds-tooltip-box" role="tooltip">Rich content</div>
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
@layer components {
|
|
14
|
+
.seeds-tooltip {
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
font-family: var(--font-family);
|
|
17
|
+
font-size: var(--font-size-200);
|
|
18
|
+
line-height: var(--line-height-200);
|
|
19
|
+
margin: var(--space-200);
|
|
20
|
+
padding-left: var(--space-400);
|
|
21
|
+
padding-right: var(--space-400);
|
|
22
|
+
color: var(--color-text-body);
|
|
23
|
+
background-color: var(--color-container-bg-base);
|
|
24
|
+
border: 1px solid var(--color-container-border-base);
|
|
25
|
+
box-shadow: var(--shadow-medium);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.seeds-tooltip-box {
|
|
29
|
+
text-align: left;
|
|
30
|
+
border-radius: var(--radius-500);
|
|
31
|
+
padding-top: var(--space-400);
|
|
32
|
+
padding-bottom: var(--space-400);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.seeds-tooltip-pill {
|
|
36
|
+
text-align: center;
|
|
37
|
+
border-radius: 5000em;
|
|
38
|
+
padding-top: var(--space-200);
|
|
39
|
+
padding-bottom: var(--space-200);
|
|
40
|
+
}
|
|
41
|
+
}
|