import * as React from "react";
import * as System from "~/components/system";
import * as Constants from "~/common/constants";
import * as Events from "~/common/custom-events";
import Group from "~/components/system/Group";
import SystemPage from "~/components/system/SystemPage";
import ViewSourceLink from "~/components/system/ViewSourceLink";
import CodeBlock from "~/components/system/CodeBlock";
import { css } from "@emotion/core";
const STYLES_DEMO_TOOLTIP = {
display: "flex",
justifyContent: "center",
alignItems: "center",
};
const STYLES_TOOLTIP_BUBBLE = css`
display: inline-flex;
align-items: center;
background-color: ${Constants.system.black};
color: ${Constants.system.white};
opacity: 70%;
border-radius: 4px;
padding: 4px 8px;
height: 48px;
width: 160px;
font-size: 0.8em;
`;
export default class SystemPageTooltips extends React.Component {
state = {
horizontal: "center",
vertical: "above",
show: true,
};
_handleClick = (e, orientation, dir) => {
this.setState({ show: false, [orientation]: dir }, () => {
this.setState({ show: true }, () => {
Events.dispatchCustomEvent({
name: "show-tooltip",
detail: {
id: "orientation-tester-tooltip",
type: "body",
},
});
});
});
};
componentWillUnmount = () => {
Events.dispatchCustomEvent({
name: "remove-tooltip",
detail: {
id: "orientation-tester-tooltip",
type: "body",
},
});
};
render() {
let content = (
horizontal: "{this.state.horizontal}", vertical: "{this.state.vertical}"
);
return (
Tooltips
The Tooltip component is used to provide the user with more information in a message that
appears when they interact with an element.
Imports
Import the GlobalTooltip, TooltipWrapper, and optionally the TooltipAnchor Components.
{`import * as React from "react";
import { GlobalTooltip, TooltipWrapper, TooltipAnchor } from "slate-react-system";`}
Tooltip
Declare the GlobalTooltip at the root level of your
document (e.g. in index.js or App.js) so it is accessible throughout and will not get
buried in the DOM tree.
{`class App extends React.Component {
render() {
return (
);
}
}`}
Then, wrap your desired anchor with a TooltipWrapper.
The wrapper's id should match the id in the dispatchCustomEvent call. This id must be
unique for each tooltip.
The tooltip component, passed in as content to{" "}
TooltipWrapper, will be displayed when a
dispatchCustomEvent is called with its id.
{`class ExampleOne extends React.Component {
_handleMouseEnter = (e) => {
dispatchCustomEvent({
name: "show-tooltip",
detail: {
id: "unique-tooltip-id",
},
});
};
_handleMouseLeave = (e) => {
dispatchCustomEvent({
name: "hide-tooltip",
detail: {
id: "unique-tooltip-id",
},
});
};
render() {
let content = (
{this.props.tooltip}
);
return (
)
}
}`}
Tooltip Anchor
For a pre-styled tooltip that accepts a string and handles dispatchCustomEvent and styling
for you, use the TooltipAnchor component. Be sure to
give it a unique id.
{`class ExampleTwo extends React.Component {
render() {
return ;
}
}`}
Setting an Orientation
You can set a tooltip to appear in a set orientation using the{" "}
horizontal and{" "}
vertical props. These can be applied to both the{" "}
TooltipWrapper and the{" "}
TooltipAnchor components.
Horizontal
{["far-left", "left", "center", "right", "far-right"].map((dir) => (
{
this._handleClick(e, "horizontal", dir);
}}
>
{dir}
))}
{this.state.show ? (
) : null}
Vertical
{["above", "up", "center", "down", "below"].map((dir) => (
{
this._handleClick(e, "vertical", dir);
}}
>
{dir}
))}
{`class ExampleThree extends React.Component {
render() {
return (
);
}
}`}
Accepted React Properties
id,
b: "string",
c: "null",
d: "Unique id to identify the tooltip.",
},
{
id: 2,
a: "tooltip",
b: "string",
c: "null",
d: "Output text on the tooltip bubble.",
},
{
id: 3,
a: "height",
b: "number",
c: "24px",
d: "Height of the tooltip anchor icon.",
},
{
id: 4,
a: "style",
b: "Object",
c: "null",
d: "Style applied to the tooltip bubble.",
},
{
id: 5,
a: "anchorStyle",
b: "Object",
c: "null",
d: "Style applied to the tooltip anchor.",
},
{
id: 6,
a: "children",
b: "Object",
c: "null",
d:
"Will be rendered instead of the default question mark SVG as the tooltip anchor.",
},
{
id: 7,
a: "horizontal",
b: "string",
c: "center",
d:
"Horizontal positioning of the tooltip relative to the anchor (far-left, left, center, right, far-right)",
},
{
id: 8,
a: "vertical",
b: "string",
c: "above",
d:
"Vertical positioning of the tooltip relative to the anchor (above, up, center, down, below)",
},
],
}}
/>
id,
b: "string",
c: "null",
d: "Unique id to identify the tooltip.",
},
{
id: 2,
a: "content",
b: "Component",
c: "null",
d: "Component rendered as the tooltip bubble.",
},
{
id: 3,
a: "horizontal",
b: "string",
c: "center",
d:
"Horizontal positioning of the tooltip relative to the anchor (far-left, left, center, right, far-right)",
},
{
id: 4,
a: "vertical",
b: "string",
c: "above",
d:
"Vertical positioning of the tooltip relative to the anchor (above, up, center, down, below)",
},
{
id: 5,
a: "children",
b: "Component",
c: "null",
d: "The tooltip anchor",
},
],
}}
/>
);
}
}