@scrabble-solver/scrabble-solver 2.8.2 → 2.8.4
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +10 -10
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/eslint/.cache_8dgz12 +1 -1
- package/.next/cache/next-server.js.nft.json +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/206.js +98 -97
- package/.next/server/chunks/413.js +396 -677
- package/.next/server/chunks/515.js +546 -550
- package/.next/server/chunks/907.js +399 -681
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +5 -1
- package/.next/server/pages/404.js.nft.json +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/pages/_app.js +7 -10
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js +0 -3
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/dictionary/[locale]/[word].js +114 -171
- package/.next/server/pages/api/solve.js +426 -1206
- package/.next/server/pages/index.html +17 -1
- package/.next/server/pages/index.js +7 -14
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/index.json +1 -1
- package/.next/static/-UOLkxdxU0PlKbXa09-xO/_buildManifest.js +1 -0
- package/.next/static/{nXSSCVI5pGlS_NxEidxkS → -UOLkxdxU0PlKbXa09-xO}/_ssgManifest.js +0 -0
- package/.next/static/chunks/56-2d34867599a0ac66.js +1 -0
- package/.next/static/chunks/pages/{404-02d949d2fe59e960.js → 404-30c06e61d256c5b2.js} +1 -1
- package/.next/static/chunks/pages/_app-6ffa2ab900772b67.js +1 -0
- package/.next/static/chunks/pages/{index-75517525489ab316.js → index-13ea7770a65c69ee.js} +1 -1
- package/.next/static/css/{d676d43c6b9c9a57.css → 551d09cac435debb.css} +1 -1
- package/.next/static/css/{6a9e5ba3f77c27f2.css → cdbc9e0afcff5473.css} +1 -1
- package/.next/trace +42 -42
- package/package.json +14 -14
- package/src/components/Board/Board.tsx +1 -1
- package/src/components/Board/BoardPure.tsx +1 -1
- package/src/components/Board/components/Cell/Button.tsx +1 -1
- package/src/components/Board/components/Cell/Cell.tsx +1 -1
- package/src/components/Board/components/Cell/CellPure.tsx +1 -1
- package/src/components/Board/hooks/useGrid.ts +9 -0
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/Checkbox/Checkbox.tsx +1 -1
- package/src/components/Dictionary/Dictionary.tsx +1 -1
- package/src/components/DictionaryInput/DictionaryInput.tsx +1 -1
- package/src/components/EmptyState/EmptyState.tsx +1 -1
- package/src/components/Key/Key.tsx +1 -1
- package/src/components/KeyMap/KeyMap.tsx +2 -2
- package/src/components/KeyMap/components/Mapping/Mapping.module.scss +4 -0
- package/src/components/KeyMap/components/Mapping/Mapping.tsx +16 -12
- package/src/components/Loading/Loading.tsx +1 -1
- package/src/components/Logo/Logo.tsx +1 -1
- package/src/components/NavButtons/NavButtons.tsx +1 -1
- package/src/components/NotFound/NotFound.tsx +1 -1
- package/src/components/PlainTiles/PlainTiles.tsx +5 -1
- package/src/components/PlainTiles/Tile.tsx +1 -1
- package/src/components/Rack/Rack.tsx +1 -1
- package/src/components/Rack/RackTile.tsx +1 -1
- package/src/components/Radio/Radio.tsx +1 -1
- package/src/components/RemainingTiles/Character.tsx +1 -1
- package/src/components/RemainingTiles/RemainingTiles.tsx +1 -1
- package/src/components/Results/Cell.tsx +1 -1
- package/src/components/Results/HeaderButton.tsx +1 -1
- package/src/components/Results/Result.tsx +1 -1
- package/src/components/Results/Results.tsx +1 -1
- package/src/components/Results/SolveButton.tsx +1 -1
- package/src/components/ResultsInput/ResultsInput.tsx +1 -1
- package/src/components/Screen/Screen.tsx +1 -1
- package/src/components/Settings/Settings.tsx +1 -1
- package/src/components/Settings/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -1
- package/src/components/Settings/components/ConfigSetting/ConfigSetting.tsx +1 -1
- package/src/components/Settings/components/LocaleSetting/LocaleSetting.tsx +1 -1
- package/src/components/Sidebar/Sidebar.tsx +1 -1
- package/src/components/Sidebar/components/Section/Section.tsx +1 -1
- package/src/components/Splash/Splash.tsx +1 -1
- package/src/components/SquareButton/Link.tsx +1 -1
- package/src/components/SquareButton/SquareButton.tsx +1 -1
- package/src/components/SvgFontCss/SvgFontCss.tsx +12 -0
- package/src/components/SvgFontCss/index.ts +1 -0
- package/src/components/Tile/Tile.tsx +1 -1
- package/src/components/Tile/TilePure.tsx +2 -2
- package/src/components/Tooltip/useTooltip.tsx +1 -1
- package/src/components/Well/Well.tsx +1 -1
- package/src/components/index.ts +1 -0
- package/src/hooks/usePortal.tsx +19 -9
- package/src/lib/createKeyboardNavigation.ts +3 -0
- package/src/lib/memoize.ts +1 -1
- package/src/pages/_app.tsx +1 -1
- package/src/pages/_document.tsx +1 -1
- package/src/pages/index.tsx +6 -15
- package/src/styles/global.scss +3 -0
- package/.next/static/chunks/195-fcadef5c6eed8338.js +0 -1
- package/.next/static/chunks/pages/_app-f4030148d742bcd2.js +0 -1
- package/.next/static/nXSSCVI5pGlS_NxEidxkS/_buildManifest.js +0 -1
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/scrabble-solver",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.4",
|
|
4
4
|
"description": "Scrabble Solver 2 - App",
|
|
5
5
|
"engines": {
|
|
6
|
-
"node": ">=16
|
|
6
|
+
"node": ">=16"
|
|
7
7
|
},
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@popperjs/core": "^2.11.6",
|
|
32
32
|
"@reduxjs/toolkit": "^1.8.5",
|
|
33
|
-
"@scrabble-solver/configs": "^2.8.
|
|
34
|
-
"@scrabble-solver/constants": "^2.8.
|
|
35
|
-
"@scrabble-solver/dictionaries": "^2.8.
|
|
36
|
-
"@scrabble-solver/logger": "^2.8.
|
|
37
|
-
"@scrabble-solver/solver": "^2.8.
|
|
38
|
-
"@scrabble-solver/types": "^2.8.
|
|
39
|
-
"@scrabble-solver/word-definitions": "^2.8.
|
|
33
|
+
"@scrabble-solver/configs": "^2.8.4",
|
|
34
|
+
"@scrabble-solver/constants": "^2.8.4",
|
|
35
|
+
"@scrabble-solver/dictionaries": "^2.8.4",
|
|
36
|
+
"@scrabble-solver/logger": "^2.8.4",
|
|
37
|
+
"@scrabble-solver/solver": "^2.8.4",
|
|
38
|
+
"@scrabble-solver/types": "^2.8.4",
|
|
39
|
+
"@scrabble-solver/word-definitions": "^2.8.4",
|
|
40
40
|
"classnames": "^2.3.2",
|
|
41
41
|
"next": "^12.3.1",
|
|
42
42
|
"normalize.css": "^8.0.1",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"react-modal": "^3.15.1",
|
|
46
46
|
"react-popper": "^2.3.0",
|
|
47
47
|
"react-portal": "^4.2.2",
|
|
48
|
-
"react-redux": "^8.0.
|
|
48
|
+
"react-redux": "^8.0.4",
|
|
49
49
|
"react-use": "^17.4.0",
|
|
50
50
|
"react-window": "^1.8.7",
|
|
51
51
|
"redux": "^4.2.0",
|
|
@@ -54,9 +54,9 @@
|
|
|
54
54
|
"uuid": "^9.0.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@svgr/webpack": "^6.
|
|
57
|
+
"@svgr/webpack": "^6.4.0",
|
|
58
58
|
"@types/classnames": "^2.3.0",
|
|
59
|
-
"@types/react": "^18.0.
|
|
59
|
+
"@types/react": "^18.0.21",
|
|
60
60
|
"@types/react-dom": "^18.0.6",
|
|
61
61
|
"@types/react-modal": "^3.13.1",
|
|
62
62
|
"@types/react-portal": "^4.0.4",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"@types/redux-saga": "^0.10.5",
|
|
67
67
|
"@types/uuid": "^8.3.4",
|
|
68
68
|
"env-cmd": "^10.1.0",
|
|
69
|
-
"sass": "^1.
|
|
69
|
+
"sass": "^1.55.0"
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "3b0c4c9d7987e456f34f7e2918931b0024b8a393"
|
|
72
72
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Cell } from '@scrabble-solver/types';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import
|
|
3
|
+
import { FunctionComponent, KeyboardEventHandler, memo, Ref, RefObject } from 'react';
|
|
4
4
|
|
|
5
5
|
import styles from './Board.module.scss';
|
|
6
6
|
import { Cell as CellComponent } from './components';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { ButtonHTMLAttributes, FunctionComponent, MouseEventHandler, ReactNode } from 'react';
|
|
3
3
|
|
|
4
4
|
import { useTooltip } from '../../../Tooltip';
|
|
5
5
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EMPTY_CELL } from '@scrabble-solver/constants';
|
|
2
2
|
import { Cell as CellModel } from '@scrabble-solver/types';
|
|
3
|
-
import
|
|
3
|
+
import { FunctionComponent, RefObject, useCallback, useMemo } from 'react';
|
|
4
4
|
import { useDispatch } from 'react-redux';
|
|
5
5
|
|
|
6
6
|
import { getTileSizes } from 'lib';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Bonus, Cell, Tile as TileModel } from '@scrabble-solver/types';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import
|
|
3
|
+
import { CSSProperties, FocusEventHandler, FunctionComponent, memo, MouseEventHandler, RefObject } from 'react';
|
|
4
4
|
|
|
5
5
|
import { ArrowDown } from 'icons';
|
|
6
6
|
import { Translate } from 'types';
|
|
@@ -214,6 +214,15 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
214
214
|
dispatch(boardSlice.actions.changeCellValue({ ...position, value: character }));
|
|
215
215
|
onMoveFocus('forward');
|
|
216
216
|
},
|
|
217
|
+
onSpace: (event) => {
|
|
218
|
+
const position = getInputRefPosition(event.target as HTMLInputElement);
|
|
219
|
+
|
|
220
|
+
if (!position) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
dispatch(boardSlice.actions.toggleCellIsBlank(position));
|
|
225
|
+
},
|
|
217
226
|
});
|
|
218
227
|
}, [changeActiveIndex, config, dispatch, lastDirectionRef, onDirectionToggle, rows]);
|
|
219
228
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { ButtonHTMLAttributes, FunctionComponent, MouseEventHandler, ReactNode, SVGAttributes } from 'react';
|
|
3
3
|
|
|
4
4
|
import { useTooltip } from '../Tooltip';
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { ChangeEvent, FormEvent, FunctionComponent } from 'react';
|
|
3
3
|
import { useDispatch } from 'react-redux';
|
|
4
4
|
|
|
5
5
|
import { dictionarySlice, selectDictionary, useTranslate, useTypedSelector } from 'state';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { FunctionComponent, ReactNode, useMemo } from 'react';
|
|
3
3
|
|
|
4
4
|
import { COLOR_BLUE, COLOR_GREEN, COLOR_RED, COLOR_YELLOW } from 'parameters';
|
|
5
5
|
import { useTranslate } from 'state';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
2
|
|
|
3
3
|
import { selectConfig, useTranslate, useTypedSelector } from 'state';
|
|
4
4
|
|
|
@@ -42,7 +42,7 @@ const KeyMap: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
|
|
|
42
42
|
</Sidebar.Section>
|
|
43
43
|
|
|
44
44
|
<Sidebar.Section title={translate('keyMap.board')}>
|
|
45
|
-
<Mapping description={translate('keyMap.board.toggle-blank')} mapping={[[CTRL, <Key key="b">B</Key>]]} />
|
|
45
|
+
<Mapping description={translate('keyMap.board.toggle-blank')} mapping={[SPACE, [CTRL, <Key key="b">B</Key>]]} />
|
|
46
46
|
<Mapping description={translate('keyMap.board.toggle-direction')} mapping={[[CTRL, ARROWS]]} />
|
|
47
47
|
</Sidebar.Section>
|
|
48
48
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { Fragment, FunctionComponent, ReactNode } from 'react';
|
|
3
3
|
|
|
4
4
|
import styles from './Mapping.module.scss';
|
|
5
5
|
|
|
@@ -15,17 +15,21 @@ const Mapping: FunctionComponent<Props> = ({ className, description, mapping })
|
|
|
15
15
|
|
|
16
16
|
<div className={styles.keys}>
|
|
17
17
|
{mapping.map((key, index) => (
|
|
18
|
-
<
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
<Fragment key={index}>
|
|
19
|
+
<div className={styles.group}>
|
|
20
|
+
{Array.isArray(key) ? (
|
|
21
|
+
<>
|
|
22
|
+
{key[0]}
|
|
23
|
+
<span className={styles.plus}>+</span>
|
|
24
|
+
{key[1]}
|
|
25
|
+
</>
|
|
26
|
+
) : (
|
|
27
|
+
key
|
|
28
|
+
)}
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
{mapping.length > 1 && index < mapping.length - 1 && <span className={styles.slash}>/</span>}
|
|
32
|
+
</Fragment>
|
|
29
33
|
))}
|
|
30
34
|
</div>
|
|
31
35
|
</div>
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { CSSProperties, FunctionComponent, useMemo } from 'react';
|
|
3
|
+
|
|
4
|
+
import SvgFontCss from '../SvgFontCss';
|
|
3
5
|
|
|
4
6
|
import { createPlainTiles, getViewbox } from './lib';
|
|
5
7
|
import styles from './PlainTiles.module.scss';
|
|
@@ -28,6 +30,8 @@ const PlainTiles: FunctionComponent<Props> = ({ className, color, content, dropS
|
|
|
28
30
|
viewBox={getViewbox(content)}
|
|
29
31
|
xmlns="http://www.w3.org/2000/svg"
|
|
30
32
|
>
|
|
33
|
+
<SvgFontCss />
|
|
34
|
+
|
|
31
35
|
{tiles.map((tile, index) => (
|
|
32
36
|
<Tile
|
|
33
37
|
character={tile.character}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BLANK } from '@scrabble-solver/constants';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import
|
|
3
|
+
import { createRef, FunctionComponent, useCallback, useMemo, useRef } from 'react';
|
|
4
4
|
|
|
5
5
|
import { createArray, createKeyboardNavigation, zipCharactersAndTiles } from 'lib';
|
|
6
6
|
import { selectConfig, selectRack, selectResultCandidateTiles, useTypedSelector } from 'state';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BLANK } from '@scrabble-solver/constants';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import
|
|
3
|
+
import { FunctionComponent } from 'react';
|
|
4
4
|
|
|
5
5
|
import { REMAINING_TILES_TILE_SIZE } from 'parameters';
|
|
6
6
|
import { selectCharacterPoints, useTypedSelector } from 'state';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { FunctionComponent } from 'react';
|
|
3
3
|
import { FixedSizeList } from 'react-window';
|
|
4
4
|
|
|
5
5
|
import { RESULTS_HEADER_HEIGHT, RESULTS_INPUT_HEIGHT, RESULTS_ITEM_HEIGHT } from 'parameters';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { ChangeEvent, FunctionComponent } from 'react';
|
|
3
3
|
import { useDispatch } from 'react-redux';
|
|
4
4
|
|
|
5
5
|
import { resultsSlice, selectResultsQuery, useTranslate, useTypedSelector } from 'state';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Locale } from '@scrabble-solver/types';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import
|
|
3
|
+
import { ChangeEvent, FunctionComponent } from 'react';
|
|
4
4
|
import { useDispatch } from 'react-redux';
|
|
5
5
|
|
|
6
6
|
import { selectLocale, settingsSlice, useTypedSelector } from 'state';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import { ButtonHTMLAttributes, FunctionComponent, MouseEventHandler, SVGAttributes } from 'react';
|
|
3
3
|
|
|
4
4
|
import { useTooltip } from '../Tooltip';
|
|
5
5
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line max-len
|
|
4
|
+
const CSS = `@import url('https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&family=Open+Sans:wght@400;700&family=Roboto+Mono&display=swap');
|
|
5
|
+
|
|
6
|
+
text {
|
|
7
|
+
font-family: 'Open Sans';
|
|
8
|
+
}`;
|
|
9
|
+
|
|
10
|
+
const SvgFontCss: FunctionComponent = () => <style type="text/css">{CSS}</style>;
|
|
11
|
+
|
|
12
|
+
export default SvgFontCss;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './SvgFontCss';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import
|
|
2
|
+
import {
|
|
3
3
|
ChangeEventHandler,
|
|
4
4
|
CSSProperties,
|
|
5
5
|
FocusEventHandler,
|
|
@@ -66,7 +66,7 @@ const TilePure: FunctionComponent<Props> = ({
|
|
|
66
66
|
style={style}
|
|
67
67
|
>
|
|
68
68
|
<input
|
|
69
|
-
autoCapitalize="
|
|
69
|
+
autoCapitalize="none"
|
|
70
70
|
autoComplete="off"
|
|
71
71
|
autoCorrect="off"
|
|
72
72
|
autoFocus={autoFocus}
|
package/src/components/index.ts
CHANGED
|
@@ -21,6 +21,7 @@ export { default as Settings } from './Settings';
|
|
|
21
21
|
export { default as Sidebar } from './Sidebar';
|
|
22
22
|
export { default as Splash } from './Splash';
|
|
23
23
|
export { default as SquareButton } from './SquareButton';
|
|
24
|
+
export { default as SvgFontCss } from './SvgFontCss';
|
|
24
25
|
export { default as Tile } from './Tile';
|
|
25
26
|
export { useTooltip } from './Tooltip';
|
|
26
27
|
export { default as Well } from './Well';
|
package/src/hooks/usePortal.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { ReactNode, useLayoutEffect, useRef } from 'react';
|
|
2
|
+
import { createRoot, Root } from 'react-dom/client';
|
|
3
3
|
import { Portal } from 'react-portal';
|
|
4
4
|
|
|
5
5
|
import { canUseDom, noop } from 'lib';
|
|
@@ -12,26 +12,36 @@ interface Props {
|
|
|
12
12
|
type TagName = Parameters<typeof document.createElement>[0];
|
|
13
13
|
|
|
14
14
|
const usePortal = (children: ReactNode, { disabled = false, tagName = 'div' }: Props = {}): void => {
|
|
15
|
-
const
|
|
15
|
+
const rootRef = useRef<Root | null>(null);
|
|
16
16
|
|
|
17
17
|
useLayoutEffect(() => {
|
|
18
18
|
if (disabled) {
|
|
19
19
|
return noop;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
const element = document.createElement(tagName);
|
|
22
23
|
document.body.appendChild(element);
|
|
24
|
+
const root = createRoot(element);
|
|
25
|
+
rootRef.current = root;
|
|
23
26
|
|
|
24
27
|
return () => {
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
// We need setTimeout for async unmount, otherwise we get this warning:
|
|
29
|
+
// "Attempted to synchronously unmount a root while React was already
|
|
30
|
+
// rendering. React cannot finish unmounting the root until the current
|
|
31
|
+
// render has completed, which may lead to a race condition.""
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
rootRef.current = null;
|
|
34
|
+
root.unmount();
|
|
35
|
+
element.remove();
|
|
36
|
+
}, 0);
|
|
27
37
|
};
|
|
28
|
-
}, [disabled,
|
|
38
|
+
}, [disabled, tagName]);
|
|
29
39
|
|
|
30
40
|
useLayoutEffect(() => {
|
|
31
|
-
if (
|
|
32
|
-
render(<Portal>{children}</Portal
|
|
41
|
+
if (rootRef.current) {
|
|
42
|
+
rootRef.current.render(<Portal>{children}</Portal>);
|
|
33
43
|
}
|
|
34
|
-
}, [children, disabled,
|
|
44
|
+
}, [children, disabled, rootRef]);
|
|
35
45
|
};
|
|
36
46
|
|
|
37
47
|
export default canUseDom ? usePortal : noop;
|
|
@@ -11,6 +11,7 @@ interface Parameters {
|
|
|
11
11
|
onDelete?: KeyboardEventHandler<HTMLInputElement>;
|
|
12
12
|
onEnter?: KeyboardEventHandler<HTMLInputElement>;
|
|
13
13
|
onKeyDown?: KeyboardEventHandler<HTMLInputElement>;
|
|
14
|
+
onSpace?: KeyboardEventHandler<HTMLInputElement>;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
const createKeyboardNavigation = ({
|
|
@@ -22,6 +23,7 @@ const createKeyboardNavigation = ({
|
|
|
22
23
|
onDelete = noop,
|
|
23
24
|
onEnter = noop,
|
|
24
25
|
onKeyDown = noop,
|
|
26
|
+
onSpace = noop,
|
|
25
27
|
}: Parameters): KeyboardEventHandler<HTMLInputElement> => {
|
|
26
28
|
const handlers: Record<string, KeyboardEventHandler<HTMLInputElement>> = {
|
|
27
29
|
ArrowUp: onArrowUp,
|
|
@@ -31,6 +33,7 @@ const createKeyboardNavigation = ({
|
|
|
31
33
|
Backspace: onBackspace,
|
|
32
34
|
Delete: onDelete,
|
|
33
35
|
Enter: onEnter,
|
|
36
|
+
' ': onSpace,
|
|
34
37
|
};
|
|
35
38
|
|
|
36
39
|
const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {
|
package/src/lib/memoize.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
interface AnyFunction {
|
|
2
|
-
(...parameters: any): any; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
2
|
+
(...parameters: any[]): any; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
interface AnyCachedFunction<T extends AnyFunction> extends AnyFunction {
|
package/src/pages/_app.tsx
CHANGED