235 | {renderPopover ? (
236 | typeof renderPopover === "function" ? (
237 | renderPopover()
238 | ) : (
239 | renderPopover
240 | )
241 | ) : (
242 | <>
243 | {showArrow && (
244 |
248 | )}
249 | {title && (
250 |
253 | )}
254 |
255 | {typeof renderContent === "function"
256 | ? renderContent()
257 | : renderContent ?? null}
258 |
259 | >
260 | )}
261 |
,
262 | getPopoverContainer()
263 | )}
264 | >
265 | );
266 | }
267 |
268 | PopoverOnSvg.defaultProps = {
269 | trigger: "click",
270 | placement: "top",
271 | showArrow: true,
272 | };
273 |
274 | export default React.memo(PopoverOnSvg);
275 |
--------------------------------------------------------------------------------
/src/component/PopoverOnSvg/index.module.css:
--------------------------------------------------------------------------------
1 | .popover {
2 | position: absolute;
3 | border-radius: 4px;
4 | box-shadow: 0 1px 8px rgba(0, 0, 0, 0.15);
5 | background-color: white;
6 | min-width: 32px;
7 | }
8 | :global(.dark).popover {
9 | background-color: black;
10 | color: white;
11 | }
12 | .arrow {
13 | display: block;
14 | position: absolute;
15 | z-index: -1;
16 | border: 8px solid white;
17 | background-color: white;
18 | width: 8px;
19 | height: 8px;
20 | }
21 | :global(.dark).arrow {
22 | border-color: black;
23 | background-color: black;
24 | }
25 | :global(.left).arrow {
26 | right: -12px;
27 | transform: translate(-50%, -50%) rotate(135deg);
28 | box-shadow: -2px -2px 6px -2px rgba(0, 0, 0, 0.06);
29 | }
30 | :global(.right).arrow {
31 | left: 4px;
32 | transform: translate(-50%, -50%) rotate(-45deg);
33 | box-shadow: -2px -2px 6px -2px rgba(0, 0, 0, 0.06);
34 | }
35 | :global(.top).arrow {
36 | bottom: -12px;
37 | transform: translate(-50%, -50%) rotate(45deg);
38 | box-shadow: 3px 3px 7px -2px rgba(0, 0, 0, 0.07);
39 | }
40 | :global(.bottom).arrow {
41 | top: 4px;
42 | transform: translate(-50%, -50%) rotate(45deg);
43 | box-shadow: -3px -3px 8px -2px rgba(0, 0, 0, 0.07);
44 | }
45 | .content {
46 | padding: 4px 8px;
47 | }
48 | .header {
49 | border-bottom: 1px solid rgba(0, 0, 0, 0.08);
50 | padding: 4px 8px;
51 | line-height: 22px;
52 | }
53 | :global(.dark).header {
54 | border-bottom: 1px solid rgba(255, 255, 255, 0.35);
55 | }
56 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import "antd/dist/antd.css";
4 | import App from "./App";
5 | import reportWebVitals from "./reportWebVitals";
6 | import "./index.css";
7 |
8 | ReactDOM.render(
9 |