Skip to content

Commit cd75caa

Browse files
authoredDec 12, 2024··
Fix v11.0.0 types that removed the default export (#1406)
* Fix v11.0.0 types that removed the default export Fixes #1396 My original intent was to remove the default export (a breaking change) as part of the major 11.0.0 release but I totally flopped on that by not also actually providing the named export in the code. Now that the major release ship has sailed, this change fixes the types by reinstating the default export in the typings but marking it deprecated, while also providing the new named export alternative as the way forward. * Props no longer extend from AllHTMLAttributes
1 parent ea9d453 commit cd75caa

16 files changed

+79
-31
lines changed
 

Diff for: ‎.changeset/brown-buttons-do.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'focus-trap-react': patch
3+
---
4+
5+
Fix missing default export in typings; props no longer extend `React.AllHTMLAttributes<any>` to allow things like `className` (those extra props have always been ignored anyway); deprecate default export; add named export in code ([#1396](https://github.com/focus-trap/focus-trap-react/issues/1396))

Diff for: ‎README.md

+8-11
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,9 @@ You can read further code examples in `demo/` (it's very simple), and [see how i
8484
Here's one more simple example:
8585

8686
```jsx
87-
const React = require('react');
88-
const ReactDOM = require('react-dom'); // React 16-17
89-
const { createRoot } = require('react-dom/client'); // React 18
90-
const FocusTrap = require('focus-trap-react');
87+
import React from 'react';
88+
import { createRoot } from 'react-dom/client';
89+
import { FocusTrap } from 'focus-trap-react';
9190

9291
class Demo extends React.Component {
9392
constructor(props) {
@@ -150,7 +149,6 @@ class Demo extends React.Component {
150149
}
151150
}
152151

153-
ReactDOM.render(<Demo />, document.getElementById('root')); // React 16-17
154152
createRoot(document.getElementById('root')).render(<Demo />); // React 18
155153
```
156154

@@ -192,14 +190,13 @@ The result can be that (depending on how you render the trap) in Strict Mode, th
192190
Example:
193191

194192
```jsx
195-
const React = require('react');
196-
const { createRoot } = require('react-dom/client');
197-
const propTypes = require('prop-types');
198-
const FocusTrap = require('../../dist/focus-trap-react');
193+
import { forwardRef, Component } from 'react';
194+
import { createRoot } from 'react-dom/client';
195+
import { FocusTrap } from 'focus-trap-react';
199196

200197
const container = document.getElementById('demo-function-child');
201198

202-
const TrapChild = React.forwardRef(function ({ onDeactivate }, ref) {
199+
const TrapChild = forwardRef(function ({ onDeactivate }, ref) {
203200
return (
204201
<div ref={ref}>
205202
<p>
@@ -223,7 +220,7 @@ TrapChild.propTypes = {
223220
onDeactivate: propTypes.func,
224221
};
225222

226-
class DemoFunctionChild extends React.Component {
223+
class DemoFunctionChild extends Component {
227224
constructor(props) {
228225
super(props);
229226

Diff for: ‎demo/js/demo-animated-dialog.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { useState } = require('react');
22
const React = require('react');
33
const { createRoot } = require('react-dom/client');
4-
const FocusTrap = require('../../dist/focus-trap-react');
4+
const { FocusTrap } = require('../../dist/focus-trap-react');
55

66
const container = document.getElementById('demo-animated-dialog');
77

Diff for: ‎demo/js/demo-animated-trigger.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { useState } = require('react');
22
const React = require('react');
33
const { createRoot } = require('react-dom/client');
4-
const FocusTrap = require('../../dist/focus-trap-react');
4+
const { FocusTrap } = require('../../dist/focus-trap-react');
55

66
const container = document.getElementById('demo-animated-trigger');
77

Diff for: ‎demo/js/demo-autofocus.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const container = document.getElementById('demo-autofocus');
66

Diff for: ‎demo/js/demo-containerelements-childless.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const container = document.getElementById('demo-containerelements-childless');
66

Diff for: ‎demo/js/demo-containerelements.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const container = document.getElementById('demo-containerelements');
66

Diff for: ‎demo/js/demo-defaults.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const container = document.getElementById('demo-defaults');
66

Diff for: ‎demo/js/demo-ffne.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const container = document.getElementById('demo-ffne');
66

Diff for: ‎demo/js/demo-iframe.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const React = require('react');
22
const ReactDOM = require('react-dom');
33
const { createRoot } = require('react-dom/client');
44
const PropTypes = require('prop-types');
5-
const FocusTrap = require('../../dist/focus-trap-react');
5+
const { FocusTrap } = require('../../dist/focus-trap-react');
66

77
const { useRef, useState, useEffect } = React;
88
const container = document.getElementById('demo-iframe');

Diff for: ‎demo/js/demo-setReturnFocus.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { useState, useMemo } = require('react');
22
const React = require('react');
33
const { createRoot } = require('react-dom/client');
4-
const FocusTrap = require('../../dist/focus-trap-react');
4+
const { FocusTrap } = require('../../dist/focus-trap-react');
55

66
const container = document.getElementById('demo-setReturnFocus');
77

Diff for: ‎demo/js/demo-special-element.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const container = document.getElementById('demo-special-element');
66

Diff for: ‎demo/js/demo-with-shadow-dom.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const { createRoot } = require('react-dom/client');
3-
const FocusTrap = require('../../dist/focus-trap-react');
3+
const { FocusTrap } = require('../../dist/focus-trap-react');
44

55
const createShadow = function (hostEl, isOpen) {
66
const containerEl = document.createElement('div');

Diff for: ‎index.d.ts

+50-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,56 @@
11
import { Options as FocusTrapOptions } from 'focus-trap';
22
import * as React from 'react';
33

4+
export interface FocusTrapProps {
5+
/**
6+
* __Single container child__ for the trap. Use `containerElements` instead
7+
* if you need a trap with multiple containers.
8+
*/
9+
children?: React.ReactNode;
10+
11+
/**
12+
* By default, the trap will be active when it mounts, so it's activated by
13+
* mounting, and deactivated by unmounting. Use this prop to control when
14+
* it's active while it's mounted, or if it's initially inactive.
15+
*/
16+
active?: boolean;
17+
18+
/**
19+
* To pause or unpause the trap while it's `active`. Primarily for use when
20+
* you need to manage multiple traps in the same view. When paused, the trap
21+
* retains its various event listeners, but ignores all events.
22+
*/
23+
paused?: boolean;
24+
25+
/**
26+
* See Focus-trap's [createOptions](https://github.com/focus-trap/focus-trap?tab=readme-ov-file#createoptions)
27+
* for more details on available options.
28+
*/
29+
focusTrapOptions?: FocusTrapOptions;
30+
31+
/**
32+
* If specified, these elements will be used as the boundaries for the
33+
* trap, __instead of the child__ specified in `children` (though
34+
* `children` will still be rendered).
35+
*/
36+
containerElements?: Array<HTMLElement>;
37+
}
38+
39+
export declare class FocusTrap extends React.Component<FocusTrapProps> { }
40+
41+
/**
42+
* Default export of the FocusTrap component.
43+
* @deprecated 🔺 Use the named import `{ FocusTrap }` instead.
44+
* @description 🔺 The default export will be removed in a future release. Migrate to the named
45+
* import `{ FocusTrap }` today to ensure future compatibility.
46+
*/
447
declare namespace FocusTrap {
5-
export interface Props extends React.AllHTMLAttributes<any> {
6-
children?: React.ReactNode;
7-
active?: boolean;
8-
paused?: boolean;
9-
focusTrapOptions?: FocusTrapOptions;
10-
containerElements?: Array<HTMLElement>;
11-
}
48+
export type Props = FocusTrapProps;
1249
}
1350

14-
export declare class FocusTrap extends React.Component<FocusTrap.Props> { }
51+
/**
52+
* @deprecated 🔺 Use the named import `{ FocusTrap }` instead.
53+
* @description 🔺 The default export will be removed in a future release. Migrate to the named
54+
* import `{ FocusTrap }` today to ensure future compatibility.
55+
*/
56+
export default FocusTrap;

Diff for: ‎src/focus-trap-react.js

+4
Original file line numberDiff line numberDiff line change
@@ -425,4 +425,8 @@ FocusTrap.defaultProps = {
425425
_createFocusTrap: createFocusTrap,
426426
};
427427

428+
// 🔺 DEPRECATED: default export
428429
module.exports = FocusTrap;
430+
431+
// named export
432+
module.exports.FocusTrap = FocusTrap;

Diff for: ‎test/focus-trap-react.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const {
66
waitFor,
77
} = require('@testing-library/react');
88
const { default: userEvent } = require('@testing-library/user-event');
9-
const FocusTrap = require('../src/focus-trap-react');
9+
const { FocusTrap } = require('../src/focus-trap-react');
1010

1111
const getTestFocusTrapOptions = function (focusTrapOptions) {
1212
const { tabbableOptions, ...rest } = focusTrapOptions || {};

0 commit comments

Comments
 (0)
Please sign in to comment.