Skip to content

Commit 12300d3

Browse files
committed
add follow cursor functionality
1 parent 4557330 commit 12300d3

File tree

11 files changed

+540
-536
lines changed

11 files changed

+540
-536
lines changed

.size-snapshot.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
{
22
"dist/index.js": {
3-
"bundled": 6537,
4-
"minified": 6537,
5-
"gzipped": 2070
3+
"bundled": 7445,
4+
"minified": 7445,
5+
"gzipped": 2208
66
},
77
"lib/cjs/index.js": {
8-
"bundled": 12566,
9-
"minified": 6825,
10-
"gzipped": 2015
8+
"bundled": 14012,
9+
"minified": 7765,
10+
"gzipped": 2141
1111
},
1212
"lib/esm/index.js": {
13-
"bundled": 12524,
14-
"minified": 6807,
15-
"gzipped": 2017,
13+
"bundled": 13960,
14+
"minified": 7732,
15+
"gzipped": 2138,
1616
"treeshaked": {
1717
"rollup": {
18-
"code": 6285,
19-
"import_statements": 361
18+
"code": 7171,
19+
"import_statements": 331
2020
},
2121
"webpack": {
22-
"code": 7592
22+
"code": 8405
2323
}
2424
}
2525
}

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ import React from 'react';
9494
import TooltipTrigger from 'react-popper-tooltip';
9595
import 'react-popper-tooltip/dist/styles.css';
9696

97-
const Tooltip = ({ tooltip, children, ...props }) => (
97+
const Tooltip = ({ tooltip, children, hideArrow ...props }) => (
9898
<TooltipTrigger
9999
{...props}
100100
tooltip={({
@@ -110,13 +110,13 @@ const Tooltip = ({ tooltip, children, ...props }) => (
110110
className: 'tooltip-container'
111111
})}
112112
>
113-
<div
113+
{!hideArrow && <div
114114
{...getArrowProps({
115115
ref: arrowRef,
116116
'data-placement': placement,
117117
className: 'tooltip-arrow'
118118
})}
119-
/>
119+
/>}
120120
{tooltip}
121121
</div>
122122
)}
@@ -247,6 +247,14 @@ Whether to use `React.createPortal` for creating tooltip.
247247
248248
Element to be used as portal container
249249

250+
### followCursor
251+
252+
> `boolean` | defaults to `false`
253+
254+
Whether to spawn the tooltip at the cursor position.
255+
256+
Recommended usage with hover trigger and no arrow element
257+
250258
### modifiers
251259

252260
> `object`

babel.config.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,8 @@ module.exports = {
99
],
1010
'@babel/react'
1111
],
12-
plugins: [['@babel/proposal-class-properties', { loose: true }]]
12+
plugins: [
13+
['@babel/proposal-class-properties', { loose: true }],
14+
['transform-react-remove-prop-types', { removeImport: true }]
15+
]
1316
};
Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,48 @@
1-
import React from 'react';
1+
import React, { memo } from 'react';
22
import TooltipTrigger from '../../src';
33
import '../../src/styles.css';
44

5-
const BasicTooltipTrigger = ({ tooltip, children, ...props }) => (
6-
<TooltipTrigger
7-
{...props}
8-
tooltip={({
9-
getTooltipProps,
10-
getArrowProps,
11-
tooltipRef,
12-
arrowRef,
13-
placement
14-
}) => (
15-
<span
16-
{...getTooltipProps({
17-
ref: tooltipRef,
18-
className: 'tooltip-container'
19-
})}
20-
>
5+
const BasicTooltipTrigger = memo(
6+
({ tooltip, children, hideArrow, ...props }) => (
7+
<TooltipTrigger
8+
{...props}
9+
tooltip={({
10+
getTooltipProps,
11+
getArrowProps,
12+
tooltipRef,
13+
arrowRef,
14+
placement
15+
}) => (
2116
<span
22-
{...getArrowProps({
23-
ref: arrowRef,
24-
'data-placement': placement,
25-
className: 'tooltip-arrow'
17+
{...getTooltipProps({
18+
ref: tooltipRef,
19+
className: 'tooltip-container'
2620
})}
27-
/>
28-
{tooltip}
29-
</span>
30-
)}
31-
>
32-
{({ getTriggerProps, triggerRef }) => (
33-
<span
34-
{...getTriggerProps({
35-
ref: triggerRef
36-
})}
37-
>
38-
{children}
39-
</span>
40-
)}
41-
</TooltipTrigger>
21+
>
22+
{!hideArrow && (
23+
<span
24+
{...getArrowProps({
25+
ref: arrowRef,
26+
'data-placement': placement,
27+
className: 'tooltip-arrow'
28+
})}
29+
/>
30+
)}
31+
{tooltip}
32+
</span>
33+
)}
34+
>
35+
{({ getTriggerProps, triggerRef }) => (
36+
<span
37+
{...getTriggerProps({
38+
ref: triggerRef
39+
})}
40+
>
41+
{children}
42+
</span>
43+
)}
44+
</TooltipTrigger>
45+
)
4246
);
4347

4448
export default BasicTooltipTrigger;

docs/readme.mdx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,11 @@ Note: `StateContainer` is for demo purpose only and used for state management.
111111
One
112112
</BasicTooltipTrigger>
113113
</Playground>
114+
115+
## Follow cursor example
116+
117+
<Playground>
118+
<BasicTooltipTrigger followCursor hideArrow tooltip="Hello, Cursor!">
119+
<span style={{display: 'inline-block', padding: 10, width: 200, height:100, border: '1px solid silver'}}>Hover over here</span>
120+
</BasicTooltipTrigger>
121+
</Playground>

package.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,11 @@
100100
"docs"
101101
],
102102
"peerDependencies": {
103-
"react": "^16.3.0",
104-
"react-dom": "^16.3.0"
103+
"react": "^16.6.0",
104+
"react-dom": "^16.6.0"
105105
},
106106
"dependencies": {
107107
"@babel/runtime": "^7.1.2",
108-
"prop-types": "^15.6.2",
109108
"react-popper": "^1.0.2"
110109
},
111110
"devDependencies": {
@@ -116,18 +115,20 @@
116115
"@babel/preset-env": "^7.1.0",
117116
"@babel/preset-react": "^7.0.0",
118117
"babel-eslint": "^10.0.1",
118+
"babel-plugin-transform-react-remove-prop-types": "^0.4.19",
119119
"docz": "^0.12.5",
120120
"docz-plugin-css": "^0.11.0",
121-
"eslint": "^5.7.0",
121+
"eslint": "^5.8.0",
122122
"eslint-config-prettier": "^3.1.0",
123123
"eslint-plugin-jsx-a11y": "^6.1.2",
124124
"eslint-plugin-prettier": "^3.0.0",
125125
"eslint-plugin-react": "^7.11.1",
126126
"gh-pages": "^2.0.1",
127127
"pre-commit": "^1.2.2",
128128
"prettier": "^1.14.3",
129-
"react": "^16.5.2",
130-
"react-dom": "^16.5.2",
129+
"prop-types": "^15.6.2",
130+
"react": "^16.6.0",
131+
"react-dom": "^16.6.0",
131132
"rimraf": "^2.6.2",
132133
"rollup": "^0.66.6",
133134
"rollup-plugin-babel": "^4.0.3",

rollup.config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const name = 'TooltipTrigger';
1010
const globals = {
1111
react: 'React',
1212
'react-dom': 'ReactDOM',
13-
'prop-types': 'PropTypes',
1413
'react-popper': 'ReactPopper'
1514
};
1615
const external = id => !id.startsWith('.') && !id.startsWith('/');

src/Tooltip.js

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable react/no-find-dom-node */
2-
import React, { PureComponent } from 'react';
2+
import React, { Component } from 'react';
33
import { findDOMNode } from 'react-dom';
44
import T from 'prop-types';
55
import { TooltipContext } from './utils';
@@ -13,7 +13,7 @@ const MUTATION_OBSERVER_CONFIG = {
1313
/**
1414
* @private
1515
*/
16-
export default class Tooltip extends PureComponent {
16+
export default class Tooltip extends Component {
1717
static propTypes = {
1818
innerRef: T.func,
1919
style: T.object,
@@ -23,10 +23,13 @@ export default class Tooltip extends PureComponent {
2323
clearScheduled: T.func,
2424
tooltip: T.func,
2525
hideTooltip: T.func,
26-
parentOutsideClickHandler: T.func,
2726
scheduleUpdate: T.func,
27+
parentOutsideClickHandler: T.func,
2828
removeParentOutsideClickHandler: T.func,
2929
addParentOutsideClickHandler: T.func,
30+
parentOutsideRightClickHandler: T.func,
31+
removeParentOutsideRightClickHandler: T.func,
32+
addParentOutsideRightClickHandler: T.func,
3033
closeOnOutOfBoundaries: T.bool,
3134
outOfBoundaries: T.bool
3235
};
@@ -45,12 +48,32 @@ export default class Tooltip extends PureComponent {
4548
}
4649
};
4750

51+
_handleOutsideRightClick = e => {
52+
if (!findDOMNode(this).contains(e.target)) {
53+
const {
54+
hideTooltip,
55+
clearScheduled,
56+
parentOutsideRightClickHandler
57+
} = this.props;
58+
59+
clearScheduled();
60+
hideTooltip();
61+
parentOutsideRightClickHandler && parentOutsideRightClickHandler(e);
62+
}
63+
};
64+
4865
_addOutsideClickHandler = () =>
4966
document.addEventListener('click', this._handleOutsideClick);
5067

5168
_removeOutsideClickHandler = () =>
5269
document.removeEventListener('click', this._handleOutsideClick);
5370

71+
_addOutsideRightClickHandler = () =>
72+
document.addEventListener('contextmenu', this._handleOutsideRightClick);
73+
74+
_removeOutsideRightClickHandler = () =>
75+
document.removeEventListener('contextmenu', this._handleOutsideRightClick);
76+
5477
componentDidMount() {
5578
const { trigger } = this.props;
5679
const observer = (this.observer = new MutationObserver(() => {
@@ -59,9 +82,15 @@ export default class Tooltip extends PureComponent {
5982
observer.observe(findDOMNode(this), MUTATION_OBSERVER_CONFIG);
6083

6184
if (trigger === 'click' || trigger === 'right-click') {
62-
const { removeParentOutsideClickHandler } = this.props;
85+
const {
86+
removeParentOutsideClickHandler,
87+
removeParentOutsideRightClickHandler
88+
} = this.props;
6389
document.addEventListener('click', this._handleOutsideClick);
90+
document.addEventListener('contextmenu', this._handleOutsideRightClick);
6491
removeParentOutsideClickHandler && removeParentOutsideClickHandler();
92+
removeParentOutsideRightClickHandler &&
93+
removeParentOutsideRightClickHandler();
6594
}
6695
}
6796

@@ -70,10 +99,19 @@ export default class Tooltip extends PureComponent {
7099
this.observer.disconnect();
71100

72101
if (trigger === 'click' || trigger === 'right-click') {
73-
const { addParentOutsideClickHandler } = this.props;
102+
const {
103+
addParentOutsideClickHandler,
104+
addParentOutsideRightClickHandler
105+
} = this.props;
74106
document.removeEventListener('click', this._handleOutsideClick);
107+
document.removeEventListener(
108+
'contextmenu',
109+
this._handleOutsideRightClick
110+
);
75111
this._handleOutsideClick = undefined;
112+
this._handleOutsideRightClick = undefined;
76113
addParentOutsideClickHandler && addParentOutsideClickHandler();
114+
addParentOutsideRightClickHandler && addParentOutsideRightClickHandler();
77115
}
78116
}
79117

@@ -111,9 +149,13 @@ export default class Tooltip extends PureComponent {
111149
return (
112150
<TooltipContext.Provider
113151
value={{
152+
parentOutsideClickHandler: this._handleOutsideClick,
114153
addParentOutsideClickHandler: this._addOutsideClickHandler,
115154
removeParentOutsideClickHandler: this._removeOutsideClickHandler,
116-
parentOutsideClickHandler: this._handleOutsideClick
155+
parentOutsideRightClickHandler: this._handleOutsideRightClick,
156+
addParentOutsideRightClickHandler: this._addOutsideRightClickHandler,
157+
removeParentOutsideRightClickHandler: this
158+
._removeOutsideRightClickHandler
117159
}}
118160
>
119161
{tooltip({

0 commit comments

Comments
 (0)