focus-trap 6.2.0 → 6.3.0
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/CHANGELOG.md +33 -0
- package/README.md +47 -29
- package/SECURITY.md +37 -0
- package/dist/focus-trap.esm.js +316 -215
- package/dist/focus-trap.esm.js.map +1 -1
- package/dist/focus-trap.esm.min.js +2 -2
- package/dist/focus-trap.esm.min.js.map +1 -1
- package/dist/focus-trap.js +315 -214
- package/dist/focus-trap.js.map +1 -1
- package/dist/focus-trap.min.js +2 -2
- package/dist/focus-trap.min.js.map +1 -1
- package/dist/focus-trap.umd.js +315 -214
- package/dist/focus-trap.umd.js.map +1 -1
- package/dist/focus-trap.umd.min.js +2 -2
- package/dist/focus-trap.umd.min.js.map +1 -1
- package/index.d.ts +7 -6
- package/index.js +381 -271
- package/package.json +35 -30
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 6.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a882d62: `clickOutsideDeactivates` can now also be a function that returns a `boolean`, similar to `allowOutsideClick`. The function receives the `MouseEvent` that triggered the click. (#289)
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 4d67dee: Fix a focus escape when pressing TAB after hiding element with focus (#281)
|
|
12
|
+
- ca32014: Bump tabbable from 5.1.4 to 5.1.5
|
|
13
|
+
|
|
14
|
+
## 6.2.3
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 036a72e: Fix crash in IE due to use of `Array.findIndex()` not supported in that browser (#257)
|
|
19
|
+
|
|
20
|
+
## 6.2.2
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- fd3f2d1: Fix a bug where a multi-container trap would cease to work if all tabbable nodes were removed from one of the containers (fixes #223). As a result, an error is now thrown if the trap is left in a state where none of its containers contain any tabbable nodes (unless a `fallbackFocus` node has been configured in the trap's options). Also, the most-recently-focused node is more reliably tracked now, should focus somehow escape the trap and be brought back in by the trap, resulting in the truly most-recently-focused node to regain focus if that ever happens.
|
|
25
|
+
|
|
26
|
+
## 6.2.1
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- f0c2aff: Bump tabbable to [5.1.4](https://github.com/focus-trap/tabbable/blob/master/CHANGELOG.md#514) for bug fix.
|
|
31
|
+
- 2ba512b:
|
|
32
|
+
- Refactored code to use function declarations instead of hoisted functions (this should have no bearing on functionality in the build output included in `./dist`.
|
|
33
|
+
- Fixed bugs where `trap.activate()` and `trap.deactivate()` would not always return the trap (now they do in all circumstances).
|
|
34
|
+
- d26d2e1: Refactoring to use const/let, and simplify a few lines. This does NOT impact the build output published in `./dist`, however, and hence does not impact browser support.
|
|
35
|
+
|
|
3
36
|
## 6.2.0
|
|
4
37
|
|
|
5
38
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# focus-trap [](https://github.com/focus-trap/focus-trap/actions?query=workflow:CI+branch:master) [](./LICENSE)
|
|
2
2
|
|
|
3
3
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
4
|
-
[](#contributors)
|
|
5
5
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
6
6
|
|
|
7
7
|
Trap focus within a DOM node.
|
|
@@ -12,13 +12,13 @@ You will definitely face this challenge when you are trying to build **accessibl
|
|
|
12
12
|
|
|
13
13
|
This module is a little, modular **vanilla JS** solution to that problem.
|
|
14
14
|
|
|
15
|
-
Use it in your higher-level components. For example, if you are using React check out [focus-trap-react](https://github.com/
|
|
15
|
+
Use it in your higher-level components. For example, if you are using React check out [focus-trap-react](https://github.com/focus-trap/focus-trap-react), a light wrapper around this library. If you are not a React user, consider creating light wrappers in your framework-of-choice.
|
|
16
16
|
|
|
17
17
|
## What it does
|
|
18
18
|
|
|
19
19
|
When a focus trap is activated, this is what should happen:
|
|
20
20
|
|
|
21
|
-
- Some element within the focus trap receives focus. By default, this will be the first element in the focus trap's tab order (as determined by [tabbable](https://github.com/
|
|
21
|
+
- Some element within the focus trap receives focus. By default, this will be the first element in the focus trap's tab order (as determined by [tabbable](https://github.com/focus-trap/tabbable)). Alternately, you can specify an element that should receive this initial focus.
|
|
22
22
|
- The `Tab` and `Shift+Tab` keys will cycle through the focus trap's tabbable elements *but will not leave the focus trap*.
|
|
23
23
|
- Clicks within the focus trap behave normally; but clicks *outside* the focus trap are blocked.
|
|
24
24
|
- The `Escape` key will deactivate the focus trap.
|
|
@@ -38,7 +38,18 @@ For more advanced usage (e.g. focus traps within focus traps), you can also paus
|
|
|
38
38
|
npm install focus-trap
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
### UMD
|
|
42
|
+
|
|
43
|
+
You can also use a UMD version published to `unpkg.com` as `dist/focus-trap.umd.js` and `dist/focus-trap.umd.min.js`.
|
|
44
|
+
|
|
45
|
+
> NOTE: The UMD build does not bundle the `tabbable` dependency. Therefore you will have to also include that one, and include it _before_ `focus-trap`.
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<head>
|
|
49
|
+
<script src="https://unpkg.com/tabbable/dist/index.umd.js"></script>
|
|
50
|
+
<script src="https://unpkg.com/focus-trap/dist/focus-trap.umd.js"></script>
|
|
51
|
+
</head>
|
|
52
|
+
```
|
|
42
53
|
|
|
43
54
|
## Browser Support
|
|
44
55
|
|
|
@@ -46,41 +57,45 @@ IE9+
|
|
|
46
57
|
|
|
47
58
|
Why?
|
|
48
59
|
Because this module uses [`EventTarget.addEventListener()`](document.createElement('button')).
|
|
49
|
-
And its only dependency, tabbable, uses [a couple of IE9+ functions](https://github.com/
|
|
60
|
+
And its only dependency, tabbable, uses [a couple of IE9+ functions](https://github.com/focus-trap/tabbable#browser-support).
|
|
50
61
|
|
|
51
62
|
## Usage
|
|
52
63
|
|
|
53
64
|
### createFocusTrap(element[, createOptions])
|
|
54
65
|
|
|
55
66
|
```javascript
|
|
56
|
-
import
|
|
57
|
-
const
|
|
67
|
+
import * as focusTrap from 'focus-trap'; // ESM
|
|
68
|
+
const focusTrap = require('focus-trap'); // CJS
|
|
69
|
+
// UMD: `focusTrap` is defined as a global on `window`
|
|
58
70
|
|
|
59
|
-
|
|
71
|
+
trap = focusTrap.createFocusTrap(element[, createOptions]);
|
|
60
72
|
```
|
|
61
73
|
|
|
62
|
-
Returns a new focus trap on `element
|
|
74
|
+
Returns a new focus trap on `element` (one or more "containers" of tabbable nodes that, together, form the total set of nodes that can be visited, with clicks or the tab key, within the trap).
|
|
63
75
|
|
|
64
76
|
`element` can be
|
|
65
|
-
- a DOM node (the focus trap itself)
|
|
66
|
-
- a selector string (which will be passed to `document.querySelector()` to find the DOM node) or
|
|
77
|
+
- a DOM node (the focus trap itself);
|
|
78
|
+
- a selector string (which will be passed to `document.querySelector()` to find the DOM node); or
|
|
67
79
|
- an array of DOM nodes or selector strings (where the order determines where the focus will go after the last tabbable element of a DOM node/selector is reached).
|
|
68
80
|
|
|
81
|
+
> A focus trap must have at least one container with at least one tabbable/focusable node in it to be considered valid. While nodes can be added/removed at runtime, with the trap adjusting to added/removed tabbable nodes, __an error will be thrown__ if the trap ever gets into a state where it determines none of its containers have any tabbable nodes in them _and_ the `fallbackFocus` option does not resolve to an alternate node where focus can go.
|
|
82
|
+
|
|
69
83
|
`createOptions`:
|
|
70
84
|
|
|
71
85
|
- **onActivate** {function}: A function that will be called when the focus trap activates.
|
|
72
86
|
- **onDeactivate** {function}: A function that will be called when the focus trap deactivates,
|
|
73
87
|
- **initialFocus** {element|string|function}: By default, when a focus trap is activated the first element in the focus trap's tab order will receive focus. With this option you can specify a different element to receive that initial focus. Can be a DOM node, or a selector string (which will be passed to `document.querySelector()` to find the DOM node), or a function that returns a DOM node.
|
|
74
|
-
- **fallbackFocus** {element|string|function}: By default, an error will be thrown if the focus trap contains no elements in its tab order. With this option you can specify a fallback element to programmatically receive focus if no other tabbable elements are found. For example, you may want a popover's `<div>` to receive focus if the popover's content includes no tabbable elements. *Make sure the fallback element has a negative `tabindex` so it can be programmatically focused.* The option value can be a DOM node, a selector string (which will be passed to `document.querySelector()` to find the DOM node), or
|
|
88
|
+
- **fallbackFocus** {element|string|function}: By default, an error will be thrown if the focus trap contains no elements in its tab order. With this option you can specify a fallback element to programmatically receive focus if no other tabbable elements are found. For example, you may want a popover's `<div>` to receive focus if the popover's content includes no tabbable elements. *Make sure the fallback element has a negative `tabindex` so it can be programmatically focused.* The option value can be a DOM node, a selector string (which will be passed to `document.querySelector()` to find the DOM node), or a function that returns a DOM node.
|
|
75
89
|
- **escapeDeactivates** {boolean}: Default: `true`. If `false`, the `Escape` key will not trigger deactivation of the focus trap. This can be useful if you want to force the user to make a decision instead of allowing an easy way out.
|
|
76
|
-
- **clickOutsideDeactivates** {boolean
|
|
77
|
-
-
|
|
90
|
+
- **clickOutsideDeactivates** {boolean|(e: MouseEvent) => boolean}: If `true` or returns `true`, a click outside the focus trap will deactivate the focus trap and allow the click event to do its thing (i.e. to pass-through to the element that was clicked). This option **takes precedence** over `allowOutsideClick` when it's set to `true`. Default: `false`.
|
|
91
|
+
- ⚠️ If you're using a password manager such as 1Password, where the app adds a clickable icon to all fillable fields, you should avoid using this option, and instead use the `allowOutsideClick` option to better control exactly when the focus trap can be deactivated. The clickable icons are usually positioned absolutely, floating on top of the fields, and therefore _not_ part of the container the trap is managing. When using the `clickOutsideDeactivates` option, clicking on a field's 1Password icon will likely cause the trap to be unintentionally deactivated.
|
|
92
|
+
- **allowOutsideClick** {boolean|(e: MouseEvent) => boolean}: If set and is or returns `true`, a click outside the focus trap will not be prevented, even when `clickOutsideDeactivates` is `false`. When `clickOutsideDeactivates` is `true`, this option is **ignored** (i.e. if it's a function, it will not be called). Use this option to control if (and even which) clicks are allowed outside the trap in conjunction with `clickOutsideDeactivates: false`. Default: `false`.
|
|
78
93
|
- **returnFocusOnDeactivate** {boolean}: Default: `true`. If `false`, when the trap is deactivated, focus will *not* return to the element that had focus before activation.
|
|
79
94
|
- **setReturnFocus** {element|string|function}: By default, focus trap on deactivation will return to the element that was focused before activation. With this option you can specify another element to programmatically receive focus after deactivation. Can be a DOM node, or a selector string (which will be passed to `document.querySelector()` to find the DOM node), or a function that returns a DOM node.
|
|
80
95
|
- **preventScroll** {boolean}: By default, focus() will scroll to the element if not in viewport. It can produce unintended effects like scrolling back to the top of a modal. If set to `true`, no scroll will happen.
|
|
81
96
|
- **delayInitialFocus** {boolean}: Default: `true`. Delays the autofocus when the focus trap is activated. This prevents elements within the focusable element from capturing the event that triggered the focus trap activation.
|
|
82
97
|
|
|
83
|
-
###
|
|
98
|
+
### trap.activate([activateOptions])
|
|
84
99
|
|
|
85
100
|
Activates the focus trap, adding various event listeners to the document.
|
|
86
101
|
|
|
@@ -92,7 +107,7 @@ If focus is already within it the trap, it remains unaffected. Otherwise, focus-
|
|
|
92
107
|
|
|
93
108
|
If none of the above exist, an error will be thrown. You cannot have a focus trap that lacks focus.
|
|
94
109
|
|
|
95
|
-
Returns the `
|
|
110
|
+
Returns the `trap`.
|
|
96
111
|
|
|
97
112
|
`activateOptions`:
|
|
98
113
|
|
|
@@ -100,11 +115,11 @@ These options are used to override the focus trap's default behavior for this pa
|
|
|
100
115
|
|
|
101
116
|
- **onActivate** {function | null | false}: Default: whatever you chose for `createOptions.onActivate`. `null` or `false` are the equivalent of a `noop`.
|
|
102
117
|
|
|
103
|
-
###
|
|
118
|
+
### trap.deactivate([deactivateOptions])
|
|
104
119
|
|
|
105
120
|
Deactivates the focus trap.
|
|
106
121
|
|
|
107
|
-
Returns the `
|
|
122
|
+
Returns the `trap`.
|
|
108
123
|
|
|
109
124
|
`deactivateOptions`:
|
|
110
125
|
|
|
@@ -113,19 +128,19 @@ These options are used to override the focus trap's default behavior for this pa
|
|
|
113
128
|
- **returnFocus** {boolean}: Default: whatever you chose for `createOptions.returnFocusOnDeactivate`.
|
|
114
129
|
- **onDeactivate** {function | null | false}: Default: whatever you chose for `createOptions.onDeactivate`. `null` or `false` are the equivalent of a `noop`.
|
|
115
130
|
|
|
116
|
-
###
|
|
131
|
+
### trap.pause()
|
|
117
132
|
|
|
118
133
|
Pause an active focus trap's event listening without deactivating the trap.
|
|
119
134
|
|
|
120
135
|
If the focus trap has not been activated, nothing happens.
|
|
121
136
|
|
|
122
|
-
Returns the `
|
|
137
|
+
Returns the `trap`.
|
|
123
138
|
|
|
124
139
|
Any `onDeactivate` callback will not be called, and focus will not return to the element that was focused before the trap's activation. But the trap's behavior will be paused.
|
|
125
140
|
|
|
126
141
|
This is useful in various cases, one of which is when you want one focus trap within another. `demo-six` exemplifies how you can implement this.
|
|
127
142
|
|
|
128
|
-
###
|
|
143
|
+
### trap.unpause()
|
|
129
144
|
|
|
130
145
|
Unpause an active focus trap. (See `pause()`, above.)
|
|
131
146
|
|
|
@@ -133,9 +148,9 @@ Focus is forced into the trap just as described for `focusTrap.activate()`.
|
|
|
133
148
|
|
|
134
149
|
If the focus trap has not been activated or has not been paused, nothing happens.
|
|
135
150
|
|
|
136
|
-
Returns the `
|
|
151
|
+
Returns the `trap`.
|
|
137
152
|
|
|
138
|
-
###
|
|
153
|
+
### trap.updateContainerElements()
|
|
139
154
|
|
|
140
155
|
Update the element(s) that are used as containers for the focus trap.
|
|
141
156
|
|
|
@@ -143,20 +158,20 @@ When you call the function `createFocusTrap`, you pass in an element (or selecto
|
|
|
143
158
|
|
|
144
159
|
A use case for this is found in focus-trap-react, where React `ref`'s may not be initialized yet, but when they are you want to have them be a container element.
|
|
145
160
|
|
|
146
|
-
Returns the `
|
|
161
|
+
Returns the `trap`.
|
|
147
162
|
|
|
148
163
|
## Examples
|
|
149
164
|
|
|
150
|
-
Read code in `demo/` and [see how it works](http://
|
|
165
|
+
Read code in `demo/` and [see how it works](http://focus-trap.github.io/focus-trap/demo/).
|
|
151
166
|
|
|
152
167
|
Here's what happens in `default.js` (the "default behavior" demo):
|
|
153
168
|
|
|
154
169
|
```js
|
|
155
|
-
|
|
170
|
+
const { createFocusTrap } = require('../../dist/focus-trap');
|
|
156
171
|
|
|
157
|
-
|
|
172
|
+
const container = document.getElementById('default');
|
|
158
173
|
|
|
159
|
-
|
|
174
|
+
const focusTrap = createFocusTrap('#default', {
|
|
160
175
|
onActivate: function () {
|
|
161
176
|
container.className = 'trap is-active';
|
|
162
177
|
},
|
|
@@ -192,7 +207,7 @@ The focus trap will work best if the *first* and *last* focusable elements in yo
|
|
|
192
207
|
|
|
193
208
|
Tabbing will work as expected with trickier, less predictable elements — like iframes, shadow trees, audio and video elements, etc. — as long as they are *between* more predictable elements (that is, if they are not the first or last tabbable element in the trap).
|
|
194
209
|
|
|
195
|
-
This limitation is ultimately rooted in browser inconsistencies and inadequacies, but it comes to focus-trap through its dependency [Tabbable](https://github.com/
|
|
210
|
+
This limitation is ultimately rooted in browser inconsistencies and inadequacies, but it comes to focus-trap through its dependency [Tabbable](https://github.com/focus-trap/tabbable). You can read about more details [in the Tabbable documentation](https://github.com/focus-trap/tabbable#more-details).
|
|
196
211
|
|
|
197
212
|
### Your trap should include a tabbable element or a focusable container
|
|
198
213
|
|
|
@@ -230,6 +245,9 @@ In alphabetical order:
|
|
|
230
245
|
<td align="center"><a href="https://github.com/bparish628"><img src="https://avatars1.githubusercontent.com/u/8492971?v=4" width="100px;" alt=""/><br /><sub><b>Benjamin Parish</b></sub></a><br /><a href="https://github.com/focus-trap/focus-trap/issues?q=author%3Abparish628" title="Bug reports">🐛</a></td>
|
|
231
246
|
<td align="center"><a href="https://scottblinch.me/"><img src="https://avatars2.githubusercontent.com/u/4682114?v=4" width="100px;" alt=""/><br /><sub><b>Scott Blinch</b></sub></a><br /><a href="https://github.com/focus-trap/focus-trap/commits?author=scottblinch" title="Documentation">📖</a></td>
|
|
232
247
|
<td align="center"><a href="https://clintgoodman.com"><img src="https://avatars3.githubusercontent.com/u/5473697?v=4" width="100px;" alt=""/><br /><sub><b>Clint Goodman</b></sub></a><br /><a href="https://github.com/focus-trap/focus-trap/commits?author=cgood92" title="Code">💻</a> <a href="https://github.com/focus-trap/focus-trap/commits?author=cgood92" title="Documentation">📖</a> <a href="#example-cgood92" title="Examples">💡</a> <a href="https://github.com/focus-trap/focus-trap/commits?author=cgood92" title="Tests">⚠️</a></td>
|
|
248
|
+
<td align="center"><a href="https://github.com/zioth"><img src="https://avatars3.githubusercontent.com/u/945603?v=4" width="100px;" alt=""/><br /><sub><b>Zioth</b></sub></a><br /><a href="#ideas-zioth" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/focus-trap/focus-trap/issues?q=author%3Azioth" title="Bug reports">🐛</a></td>
|
|
249
|
+
<td align="center"><a href="https://github.com/randypuro"><img src="https://avatars2.githubusercontent.com/u/2579?v=4" width="100px;" alt=""/><br /><sub><b>Randy Puro</b></sub></a><br /><a href="https://github.com/focus-trap/focus-trap/issues?q=author%3Arandypuro" title="Bug reports">🐛</a></td>
|
|
250
|
+
<td align="center"><a href="http://tylerhawkins.info/201R/"><img src="https://avatars0.githubusercontent.com/u/13806458?v=4" width="100px;" alt=""/><br /><sub><b>Tyler Hawkins</b></sub></a><br /><a href="#tool-thawkin3" title="Tools">🔧</a> <a href="https://github.com/focus-trap/focus-trap/commits?author=thawkin3" title="Tests">⚠️</a> <a href="https://github.com/focus-trap/focus-trap/commits?author=thawkin3" title="Documentation">📖</a></td>
|
|
233
251
|
</tr>
|
|
234
252
|
</table>
|
|
235
253
|
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
The most recently published version is the only supported version. We simply do not have the maintainer capacity to support multiple versions.
|
|
6
|
+
|
|
7
|
+
## Security Releases
|
|
8
|
+
|
|
9
|
+
The most recently published version is the only supported version. If there's a security issue in that version, then we will fix it by publishing a new version that addresses the vulnerability, but we will not support or update any previous versions.
|
|
10
|
+
|
|
11
|
+
__Example Scenario__
|
|
12
|
+
|
|
13
|
+
Let's say we publish 9.0.0 and a security issue is found in 8.1.3, and it's still in 9.0.0, then we will fix it in 9.0.1 or 9.1.0 (or possibly 10.0.0 if it requires breaking backward compatibility for some reason -- this should be rare), but we will not also publish 8.1.4 or 8.2.1 to fix it.
|
|
14
|
+
|
|
15
|
+
There could also be a scenario where we're in a pre-release on a new major and a security issue is discovered in the current 8.1.3 release. In that case, we would try to fix it in the current non-pre-release, and bring that forward into the pre-release, but that's as far back as we would go (though we don't consider that going back because the latest release isn't a "full" release, it's still in pre-release stage, so we don't expect everyone to want to adopt a pre-release to get security fix).
|
|
16
|
+
|
|
17
|
+
## Release Cadence
|
|
18
|
+
|
|
19
|
+
This happens whenever there's something new to publish, regardless of the [Semver](https://semver.org/) bump, though we try to avoid breaking changes (majors) as much as possible. That time may come, however, and the major version change is an indication that there _may_ be a large change/break in functionality. We may also publish a major out of an abundance of caution, even if there are technically no known backward compatibility breaks, if there have been many internal changes.
|
|
20
|
+
|
|
21
|
+
When planning a major break in functionality for a new major release where we wish to gather feedback from the community prior to officially publishing it, we would leverage the pre-release version indicator by publishing 9.0.0-alpha.1, for example. After gathering some feedback, we may publishing additional pre-release versions, until we would finally officially publish as 9.0.0.
|
|
22
|
+
|
|
23
|
+
We may not always leverage pre-releases for breaking changes, however. One scenario would be a complex security issue that would force a breaking change, and needs immediate fixing.
|
|
24
|
+
|
|
25
|
+
## Backwards Compatibility
|
|
26
|
+
|
|
27
|
+
This is only guaranteed _within_ a major, not from one major to the next. [Semver](https://semver.org/) states that, "the major version is incremented if any backwards _incompatible_ changes are introduced." That is what we respect for this package. Patches are bug fixes that remain backward compatible (to the current major), minors for new features (or significant internal changes) that remain backward-compatible (to the current major), and majors are for breaking changes (from the previous major).
|
|
28
|
+
|
|
29
|
+
## Reporting Vulnerabilities
|
|
30
|
+
|
|
31
|
+
If you believe you have found a security vulnerability in this package, please contact one of the maintainers directly and provide them with details, severity, and a reproduction. We would also welcome a suggested fix if you have one.
|
|
32
|
+
|
|
33
|
+
Any verified and accepted security vulnerabilities will be rewarded with a listing in a special "Hall of Fame" section of our README, similar to our [Contributors](./README.md#contributors) section. We do NOT offer any type of reward whatsoever other than this listing, and we do NOT guarantee that the listing will remain in the repository for any release made after the one which will address the vulnerability.
|
|
34
|
+
|
|
35
|
+
### Maintainers
|
|
36
|
+
|
|
37
|
+
- [Stefan Cameron](mailto:stefan@stefcameron.com)
|