Skip to content

Commit 41e0200

Browse files
committed
add focus trigger support
1 parent 9db6eed commit 41e0200

File tree

7 files changed

+84
-15
lines changed

7 files changed

+84
-15
lines changed

.size-snapshot.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"dist/cjs/react-popper-tooltip.js": {
3-
"bundled": 14432,
4-
"minified": 7751,
5-
"gzipped": 2292
3+
"bundled": 14634,
4+
"minified": 7853,
5+
"gzipped": 2322
66
},
77
"dist/esm/react-popper-tooltip.js": {
8-
"bundled": 14393,
9-
"minified": 7727,
10-
"gzipped": 2287,
8+
"bundled": 14595,
9+
"minified": 7829,
10+
"gzipped": 2316,
1111
"treeshaked": {
1212
"rollup": {
1313
"code": 172,
1414
"import_statements": 152
1515
},
1616
"webpack": {
17-
"code": 8447
17+
"code": 8537
1818
}
1919
}
2020
}

.travis.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
dist: xenial
21
language: node_js
32
node_js:
43
- '--lts'
54
cache: yarn
65
before_install:
76
- curl -o- -L https://yarnpkg.com/install.sh | bash
87
- source ~/.bashrc
9-
branches:
10-
except:
11-
- gh-pages
128
script:
139
- yarn typecheck
1410
- yarn lint

docs/readme.mdx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,45 @@ _`followCursor` prop_
5858
</BasicTooltipTrigger>
5959
</Playground>
6060

61+
## `focus` trigger
62+
63+
<Playground>
64+
<div
65+
tabIndex="-1"
66+
style={{
67+
border: '1px solid silver',
68+
padding: 20,
69+
display: 'flex',
70+
justifyContent: 'space-between'
71+
}}
72+
>
73+
<div
74+
style={{
75+
display: 'flex',
76+
flex: 2,
77+
flexDirection: 'column',
78+
justifyContent: 'space-around',
79+
alignItems: 'center'
80+
}}
81+
>
82+
<BasicTooltipTrigger
83+
trigger="focus"
84+
tooltip="Hello, World!"
85+
placement="top"
86+
>
87+
<button>Focus me!</button>
88+
</BasicTooltipTrigger>
89+
<BasicTooltipTrigger trigger="focus" tooltip="Hello, World!">
90+
<button>Focus me too!</button>
91+
</BasicTooltipTrigger>
92+
</div>
93+
<div style={{flex: 3, fontSize: 12, textAlign: 'center', padding: 50}}>
94+
Click inside this area and focus using the Tab key on desktop. On mobile,
95+
just click on the buttons.
96+
</div>
97+
</div>
98+
</Playground>
99+
61100
## Controlled
62101

63102
_`tooltipShown` prop_

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-popper-tooltip",
3-
"version": "2.8.3",
3+
"version": "2.9.0",
44
"description": "React tooltip library built around react-popper",
55
"homepage": "https://react-popper-tooltip.netlify.com",
66
"repository": {

src/TooltipTrigger.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class TooltipTrigger extends Component<
210210
const isClickTriggered = trigger === 'click';
211211
const isHoverTriggered = trigger === 'hover';
212212
const isRightClickTriggered = trigger === 'right-click';
213+
const isFocusTriggered = trigger === 'focus';
213214

214215
return {
215216
...props,
@@ -227,7 +228,11 @@ class TooltipTrigger extends Component<
227228
...(isHoverTriggered &&
228229
followCursor && {
229230
onMouseMove: callAll(this.showTooltip, props.onMouseMove)
230-
})
231+
}),
232+
...(isFocusTriggered && {
233+
onFocus: callAll(this.showTooltip, props.onFocus),
234+
onBlur: callAll(this.hideTooltip, props.onBlur)
235+
})
231236
};
232237
};
233238
}

src/types.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ import PopperJS from 'popper.js';
22
import React from 'react';
33
import ReactPopper from 'react-popper';
44

5+
export type TriggerTypes = 'none' | 'click' | 'right-click' | 'hover' | 'focus';
6+
57
export interface GetTriggerPropsArg {
68
onTouchEnd?(event: React.SyntheticEvent): void;
79
onClick?(event: React.SyntheticEvent): void;
810
onContextMenu?(event: React.SyntheticEvent): void;
911
onMouseEnter?(event: React.SyntheticEvent): void;
1012
onMouseLeave?(event: React.SyntheticEvent): void;
1113
onMouseMove?(event: React.SyntheticEvent): void;
14+
onFocus?(event: React.SyntheticEvent): void;
15+
onBlur?(event: React.SyntheticEvent): void;
1216
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1317
[key: string]: any;
1418
}
@@ -98,7 +102,7 @@ export interface TooltipTriggerProps {
98102
* Event that triggers the tooltip
99103
* @default hover
100104
*/
101-
trigger: 'none' | 'click' | 'right-click' | 'hover';
105+
trigger: TriggerTypes;
102106
/**
103107
* Whether to use React.createPortal for creating tooltip
104108
* @default true // for browser environments
@@ -132,7 +136,7 @@ export interface TooltipProps {
132136
outOfBoundaries: boolean | null;
133137
placement: PopperJS.Placement;
134138
style: React.CSSProperties;
135-
trigger: 'none' | 'click' | 'right-click' | 'hover';
139+
trigger: TriggerTypes;
136140
clearScheduled(): void;
137141
hideTooltip(): void;
138142
tooltip(arg: TooltipArg): React.ReactNode;

tests/TooltipTrigger.spec.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,31 @@ describe('follow cursor', () => {
178178
});
179179
});
180180

181+
describe('focus trigger', () => {
182+
let container: HTMLElement;
183+
let queryByText: any;
184+
185+
beforeEach(() => {
186+
({container, queryByText} = render(
187+
<BasicTooltipTrigger trigger="focus" tooltip={Tooltip}>
188+
{Trigger}
189+
</BasicTooltipTrigger>
190+
));
191+
fireEvent.focus(container.firstChild as HTMLElement);
192+
jest.runAllTimers();
193+
});
194+
195+
it('opens tooltip on focus', () => {
196+
expect(queryByText(Tooltip)).toBeTruthy();
197+
});
198+
199+
it('closes tooltip on blur', () => {
200+
fireEvent.blur(container.firstChild as HTMLElement);
201+
jest.runAllTimers();
202+
expect(queryByText(Tooltip)).toBeFalsy();
203+
});
204+
});
205+
181206
it('closes on outside click', () => {
182207
const {container, queryByText} = render(
183208
<>

0 commit comments

Comments
 (0)