@scrabble-solver/scrabble-solver 2.8.9 → 2.8.10

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.
Files changed (73) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +10 -10
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/eslint/.cache_8dgz12 +1 -1
  5. package/.next/cache/next-server.js.nft.json +1 -1
  6. package/.next/cache/webpack/client-production/0.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack +0 -0
  8. package/.next/cache/webpack/server-production/0.pack +0 -0
  9. package/.next/cache/webpack/server-production/index.pack +0 -0
  10. package/.next/next-server.js.nft.json +1 -1
  11. package/.next/prerender-manifest.json +1 -1
  12. package/.next/routes-manifest.json +1 -1
  13. package/.next/server/chunks/413.js +181 -39
  14. package/.next/server/chunks/429.js +2 -13
  15. package/.next/server/chunks/515.js +408 -227
  16. package/.next/server/chunks/911.js +25 -3
  17. package/.next/server/middleware-build-manifest.js +1 -1
  18. package/.next/server/pages/404.html +2 -2
  19. package/.next/server/pages/404.js.nft.json +1 -1
  20. package/.next/server/pages/500.html +2 -2
  21. package/.next/server/pages/_app.js.nft.json +1 -1
  22. package/.next/server/pages/_document.js.nft.json +1 -1
  23. package/.next/server/pages/_error.js.nft.json +1 -1
  24. package/.next/server/pages/api/solve.js +52 -19
  25. package/.next/server/pages/index.html +3 -3
  26. package/.next/server/pages/index.js +1 -1
  27. package/.next/server/pages/index.js.nft.json +1 -1
  28. package/.next/server/pages/index.json +1 -1
  29. package/.next/static/A8A_Lmg8cM-Bkf-Jo1CLh/_buildManifest.js +1 -0
  30. package/.next/static/{yCxjzzYpw5JjJE53PO_s6 → A8A_Lmg8cM-Bkf-Jo1CLh}/_ssgManifest.js +0 -0
  31. package/.next/static/chunks/317-95ab9051449362fa.js +1 -0
  32. package/.next/static/chunks/758-eff80059a1365d5d.js +1 -0
  33. package/.next/static/chunks/pages/_app-0e358b5622cf9e66.js +1 -0
  34. package/.next/static/chunks/pages/index-0cc5e6eda5adac73.js +1 -0
  35. package/.next/static/css/9ac903004135f4b1.css +1 -0
  36. package/.next/trace +42 -42
  37. package/package.json +12 -12
  38. package/src/components/Badge/Badge.module.scss +1 -1
  39. package/src/components/Board/Board.tsx +4 -2
  40. package/src/components/Board/BoardPure.tsx +25 -5
  41. package/src/components/Board/hooks/useGrid.ts +212 -91
  42. package/src/components/Dictionary/Dictionary.tsx +8 -1
  43. package/src/components/Rack/Rack.tsx +51 -11
  44. package/src/components/Rack/RackTile.tsx +33 -16
  45. package/src/components/Results/Results.tsx +19 -3
  46. package/src/components/SquareButton/Link.tsx +1 -1
  47. package/src/components/Tile/Tile.module.scss +4 -0
  48. package/src/components/Tile/Tile.tsx +13 -4
  49. package/src/components/Tile/TilePure.tsx +3 -4
  50. package/src/lib/extractCharacters.ts +26 -0
  51. package/src/lib/extractInputValue.ts +17 -0
  52. package/src/lib/index.ts +2 -0
  53. package/src/lib/isCtrl.ts +1 -1
  54. package/src/lib/memoize.ts +15 -1
  55. package/src/pages/api/solve.ts +1 -1
  56. package/src/sdk/fetchJson.ts +36 -0
  57. package/src/sdk/findWordDefinitions.ts +4 -3
  58. package/src/sdk/solve.ts +8 -7
  59. package/src/sdk/verify.ts +5 -6
  60. package/src/state/sagas.ts +3 -3
  61. package/src/state/selectors.ts +9 -1
  62. package/src/state/slices/dictionaryInitialState.ts +10 -2
  63. package/src/state/slices/dictionarySlice.ts +10 -16
  64. package/src/state/slices/rackSlice.ts +7 -0
  65. package/src/state/slices/solveInitialState.ts +14 -2
  66. package/src/state/slices/solveSlice.ts +7 -4
  67. package/src/types/index.ts +2 -0
  68. package/.next/static/chunks/317-a33dd38e9b9a17ed.js +0 -1
  69. package/.next/static/chunks/758-f333b1dcdb941547.js +0 -1
  70. package/.next/static/chunks/pages/_app-f8f360878e1c2aff.js +0 -1
  71. package/.next/static/chunks/pages/index-ecea697d3e5d8a6f.js +0 -1
  72. package/.next/static/css/64dc2ce1811912f1.css +0 -1
  73. package/.next/static/yCxjzzYpw5JjJE53PO_s6/_buildManifest.js +0 -1
@@ -540,18 +540,20 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([stat
540
540
  const Board = ({ cellSize , className , innerRef })=>{
541
541
  const rows = (0,state__WEBPACK_IMPORTED_MODULE_1__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_1__/* .selectRowsWithCandidate */ .ZA);
542
542
  const board = (0,state__WEBPACK_IMPORTED_MODULE_1__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_1__/* .selectBoard */ .ZO);
543
- const [{ lastDirection , refs }, { onDirectionToggle , onFocus , onKeyDown }] = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__/* .useGrid */ .N)(rows);
543
+ const [{ direction , refs }, { onChange , onDirectionToggle , onFocus , onKeyDown , onPaste }] = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__/* .useGrid */ .N)(rows);
544
544
  return /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_BoardPure__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .Z, {
545
545
  className: className,
546
546
  cellSize: cellSize,
547
547
  center: board.center,
548
+ direction: direction,
548
549
  innerRef: innerRef,
549
- lastDirection: lastDirection,
550
550
  refs: refs,
551
551
  rows: rows,
552
+ onChange: onChange,
552
553
  onDirectionToggle: onDirectionToggle,
553
554
  onFocus: onFocus,
554
- onKeyDown: onKeyDown
555
+ onKeyDown: onKeyDown,
556
+ onPaste: onPaste
555
557
  });
556
558
  };
557
559
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Board);
@@ -585,16 +587,18 @@ _components__WEBPACK_IMPORTED_MODULE_3__ = (__webpack_async_dependencies__.then
585
587
 
586
588
 
587
589
 
588
- const BoardPure = ({ className , cellSize , center , innerRef , lastDirection , refs , rows , onDirectionToggle , onFocus , onKeyDown , })=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
590
+ const BoardPure = ({ className , cellSize , center , direction , innerRef , refs , rows , onChange , onDirectionToggle , onFocus , onKeyDown , onPaste , })=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
589
591
  className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Board_module_scss__WEBPACK_IMPORTED_MODULE_4___default().board), className),
590
592
  ref: innerRef,
593
+ onChange: onChange,
591
594
  onKeyDown: onKeyDown,
595
+ onPaste: onPaste,
592
596
  children: rows.map((cells, y)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
593
597
  className: (_Board_module_scss__WEBPACK_IMPORTED_MODULE_4___default().row),
594
598
  children: cells.map((cell, x)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_components__WEBPACK_IMPORTED_MODULE_3__/* .Cell */ .b, {
595
599
  className: (_Board_module_scss__WEBPACK_IMPORTED_MODULE_4___default().cell),
596
600
  cell: cell,
597
- direction: lastDirection,
601
+ direction: direction,
598
602
  inputRef: refs[y][x],
599
603
  isCenter: center.x === x && center.y === y,
600
604
  size: cellSize,
@@ -666,7 +670,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
666
670
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
667
671
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6022);
668
672
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
669
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92237);
673
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75558);
670
674
  /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51413);
671
675
  /* harmony import */ var _CellPure__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(80640);
672
676
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_5__, _CellPure__WEBPACK_IMPORTED_MODULE_6__]);
@@ -978,17 +982,19 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
978
982
  /* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__)
979
983
  /* harmony export */ });
980
984
  /* harmony import */ var _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7618);
981
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16689);
982
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
983
- /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6022);
984
- /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
985
- /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69755);
986
- /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_use__WEBPACK_IMPORTED_MODULE_3__);
987
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92237);
988
- /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51413);
989
- /* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(95137);
990
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_5__]);
991
- state__WEBPACK_IMPORTED_MODULE_5__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
985
+ /* harmony import */ var _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34046);
986
+ /* harmony import */ var _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_1__);
987
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16689);
988
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
989
+ /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6022);
990
+ /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
991
+ /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(69755);
992
+ /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_use__WEBPACK_IMPORTED_MODULE_4__);
993
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(75558);
994
+ /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51413);
995
+ /* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(95137);
996
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_6__]);
997
+ state__WEBPACK_IMPORTED_MODULE_6__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
992
998
  /* eslint-disable max-lines, max-statements */
993
999
 
994
1000
 
@@ -996,22 +1002,24 @@ state__WEBPACK_IMPORTED_MODULE_5__ = (__webpack_async_dependencies__.then ? (awa
996
1002
 
997
1003
 
998
1004
 
1005
+
1006
+ const toggleDirection = (direction)=>direction === "vertical" ? "horizontal" : "vertical";
999
1007
  const useGrid = (rows)=>{
1000
1008
  const height = rows.length;
1001
1009
  const width = rows[0].length;
1002
- const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useDispatch)();
1003
- const config = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectConfig */ .$o);
1004
- const refs = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createGridOf */ .DI)(width, height, ()=>(0,react__WEBPACK_IMPORTED_MODULE_1__.createRef)()), [
1010
+ const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();
1011
+ const config = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectConfig */ .$o);
1012
+ const refs = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_5__/* .createGridOf */ .DI)(width, height, ()=>(0,react__WEBPACK_IMPORTED_MODULE_2__.createRef)()), [
1005
1013
  width,
1006
1014
  height
1007
1015
  ]);
1008
- const activeIndexRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)({
1016
+ const activeIndexRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)({
1009
1017
  x: 0,
1010
1018
  y: 0
1011
1019
  });
1012
- const { 0: lastDirection , 1: setLastDirection } = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)("horizontal");
1013
- const lastDirectionRef = (0,react_use__WEBPACK_IMPORTED_MODULE_3__.useLatest)(lastDirection);
1014
- const changeActiveIndex = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((offsetX, offsetY)=>{
1020
+ const { 0: direction , 1: setLastDirection } = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)("horizontal");
1021
+ const directionRef = (0,react_use__WEBPACK_IMPORTED_MODULE_4__.useLatest)(direction);
1022
+ const changeActiveIndex = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((offsetX, offsetY)=>{
1015
1023
  const x = Math.min(Math.max(activeIndexRef.current.x + offsetX, 0), width - 1);
1016
1024
  const y = Math.min(Math.max(activeIndexRef.current.y + offsetY, 0), height - 1);
1017
1025
  activeIndexRef.current = {
@@ -1023,58 +1031,197 @@ const useGrid = (rows)=>{
1023
1031
  activeIndexRef,
1024
1032
  refs
1025
1033
  ]);
1026
- const getInputRefPosition = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((inputRef)=>{
1027
- return (0,_lib__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z)(refs, (ref)=>ref.current === inputRef);
1034
+ const getInputRefPosition = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((inputRef)=>{
1035
+ return (0,_lib__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z)(refs, (ref)=>ref.current === inputRef);
1028
1036
  }, [
1029
1037
  refs
1030
1038
  ]);
1031
- const onDirectionToggle = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>{
1032
- setLastDirection((direction)=>{
1033
- return direction === "vertical" ? "horizontal" : "vertical";
1034
- });
1035
- }, []);
1036
- const onFocus = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((x, y)=>{
1037
- activeIndexRef.current = {
1038
- x,
1039
- y
1040
- };
1041
- }, []);
1042
- const onMoveFocus = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)((direction)=>{
1043
- const offset = direction === "forward" ? 1 : -1;
1044
- if (lastDirectionRef.current === "horizontal") {
1039
+ const moveFocus = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((offset)=>{
1040
+ if (directionRef.current === "horizontal") {
1045
1041
  changeActiveIndex(offset, 0);
1046
1042
  } else {
1047
1043
  changeActiveIndex(0, offset);
1048
1044
  }
1049
1045
  }, [
1050
1046
  changeActiveIndex,
1051
- lastDirectionRef
1047
+ directionRef
1052
1048
  ]);
1053
- const onKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{
1054
- return (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createKeyboardNavigation */ .np)({
1049
+ const insertValue = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((position, value)=>{
1050
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractCharacters */ .nK)(config, value).filter((character)=>character !== _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.BLANK) : [
1051
+ _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.BLANK
1052
+ ];
1053
+ let board = new _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_1__.Board({
1054
+ rows: rows.map((row)=>row.map((cell)=>cell.clone()))
1055
+ });
1056
+ let { x , y } = position;
1057
+ const scheduleMoveFocus = ()=>{
1058
+ if (directionRef.current === "horizontal") {
1059
+ ++x;
1060
+ } else {
1061
+ ++y;
1062
+ }
1063
+ };
1064
+ characters.forEach((character)=>{
1065
+ if (x >= config.boardWidth || y >= config.boardHeight) {
1066
+ return;
1067
+ }
1068
+ const canCheckUp = y - 1 > 0;
1069
+ const canCheckLeft = x > 0;
1070
+ const canCheckRight = x + 1 < width;
1071
+ const canCheckDown = y + 1 < height;
1072
+ if (canCheckUp) {
1073
+ const cellUp = board.rows[y - 1][x];
1074
+ const twoCharacterCandidate = cellUp.tile.character + character;
1075
+ if (!cellUp.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate)) {
1076
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1077
+ x,
1078
+ y: y - 1,
1079
+ value: twoCharacterCandidate
1080
+ }));
1081
+ return;
1082
+ }
1083
+ }
1084
+ if (canCheckDown) {
1085
+ const cellDown = board.rows[y + 1][x];
1086
+ const twoCharacterCandidate1 = character + cellDown.tile.character;
1087
+ if (!cellDown.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate1)) {
1088
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1089
+ x,
1090
+ y,
1091
+ value: character
1092
+ }));
1093
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1094
+ x,
1095
+ y: y + 1,
1096
+ value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1097
+ }));
1098
+ scheduleMoveFocus();
1099
+ return;
1100
+ }
1101
+ }
1102
+ if (canCheckLeft) {
1103
+ const cellLeft = board.rows[y][x - 1];
1104
+ const twoCharacterCandidate2 = cellLeft.tile.character + character;
1105
+ if (!cellLeft.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate2)) {
1106
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1107
+ x: x - 1,
1108
+ y,
1109
+ value: twoCharacterCandidate2
1110
+ }));
1111
+ return;
1112
+ }
1113
+ }
1114
+ if (canCheckRight) {
1115
+ const cellRight = board.rows[y][x + 1];
1116
+ const twoCharacterCandidate3 = character + cellRight.tile.character;
1117
+ if (!cellRight.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate3)) {
1118
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1119
+ x,
1120
+ y,
1121
+ value: character
1122
+ }));
1123
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1124
+ x: x + 1,
1125
+ y,
1126
+ value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1127
+ }));
1128
+ scheduleMoveFocus();
1129
+ return;
1130
+ }
1131
+ }
1132
+ if (!canCheckDown || !canCheckRight) {
1133
+ const cell = board.rows[y][x];
1134
+ const twoCharacterCandidate4 = cell.tile.character + character;
1135
+ if (!cell.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate4)) {
1136
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1137
+ x,
1138
+ y,
1139
+ value: twoCharacterCandidate4
1140
+ }));
1141
+ return;
1142
+ }
1143
+ }
1144
+ board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1145
+ x,
1146
+ y,
1147
+ value: character
1148
+ }));
1149
+ scheduleMoveFocus();
1150
+ });
1151
+ moveFocus(Math.abs(position.x - x) + Math.abs(position.y - y));
1152
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.change */ .I8.actions.change(board));
1153
+ }, [
1154
+ config,
1155
+ directionRef,
1156
+ dispatch,
1157
+ moveFocus,
1158
+ rows
1159
+ ]);
1160
+ const onChange = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((event)=>{
1161
+ const position = getInputRefPosition(event.target);
1162
+ if (!position) {
1163
+ return;
1164
+ }
1165
+ const value = (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractInputValue */ .WM)(event.target);
1166
+ if (!value) {
1167
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1168
+ ...position,
1169
+ value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1170
+ }));
1171
+ moveFocus(-1);
1172
+ return;
1173
+ }
1174
+ if (value === _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL) {
1175
+ const { x , y } = position;
1176
+ const cell = rows[y][x];
1177
+ if (cell.hasTile()) {
1178
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1179
+ return;
1180
+ }
1181
+ }
1182
+ insertValue(position, value);
1183
+ }, [
1184
+ dispatch,
1185
+ insertValue,
1186
+ moveFocus,
1187
+ rows
1188
+ ]);
1189
+ const onDirectionToggle = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(()=>setLastDirection(toggleDirection), []);
1190
+ const onFocus = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((x, y)=>{
1191
+ activeIndexRef.current = {
1192
+ x,
1193
+ y
1194
+ };
1195
+ }, []);
1196
+ const onKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>{
1197
+ return (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .createKeyboardNavigation */ .np)({
1055
1198
  onArrowDown: (event)=>{
1056
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event)) {
1199
+ event.preventDefault();
1200
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1057
1201
  onDirectionToggle();
1058
1202
  } else {
1059
1203
  changeActiveIndex(0, 1);
1060
1204
  }
1061
1205
  },
1062
1206
  onArrowLeft: (event)=>{
1063
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event)) {
1207
+ event.preventDefault();
1208
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1064
1209
  onDirectionToggle();
1065
1210
  } else {
1066
1211
  changeActiveIndex(-1, 0);
1067
1212
  }
1068
1213
  },
1069
1214
  onArrowRight: (event)=>{
1070
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event)) {
1215
+ event.preventDefault();
1216
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1071
1217
  onDirectionToggle();
1072
1218
  } else {
1073
1219
  changeActiveIndex(1, 0);
1074
1220
  }
1075
1221
  },
1076
1222
  onArrowUp: (event)=>{
1077
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event)) {
1223
+ event.preventDefault();
1224
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1078
1225
  onDirectionToggle();
1079
1226
  } else {
1080
1227
  changeActiveIndex(0, -1);
@@ -1085,22 +1232,24 @@ const useGrid = (rows)=>{
1085
1232
  if (!position) {
1086
1233
  return;
1087
1234
  }
1088
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1235
+ event.preventDefault();
1236
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1089
1237
  ...position,
1090
1238
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1091
1239
  }));
1092
- onMoveFocus("backward");
1240
+ moveFocus(-1);
1093
1241
  },
1094
1242
  onDelete: (event)=>{
1095
1243
  const position = getInputRefPosition(event.target);
1096
1244
  if (!position) {
1097
1245
  return;
1098
1246
  }
1099
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1247
+ event.preventDefault();
1248
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1100
1249
  ...position,
1101
1250
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1102
1251
  }));
1103
- onMoveFocus("forward");
1252
+ moveFocus(1);
1104
1253
  },
1105
1254
  onKeyDown: (event)=>{
1106
1255
  const position = getInputRefPosition(event.target);
@@ -1109,129 +1258,82 @@ const useGrid = (rows)=>{
1109
1258
  }
1110
1259
  const { x , y } = position;
1111
1260
  const character = event.key.toLowerCase();
1112
- const isTogglingBlank = (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event) && character === "b";
1261
+ const isTogglingBlank = (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event) && character === "b";
1113
1262
  const twoCharacterTile = config.getTwoCharacterTileByPrefix(character);
1114
1263
  if (isTogglingBlank) {
1115
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1264
+ event.preventDefault();
1265
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1116
1266
  return;
1117
1267
  }
1118
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event) && twoCharacterTile) {
1268
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event) && twoCharacterTile) {
1119
1269
  event.preventDefault();
1120
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1270
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1121
1271
  x,
1122
1272
  y,
1123
1273
  value: twoCharacterTile
1124
1274
  }));
1125
- onMoveFocus("forward");
1275
+ moveFocus(1);
1126
1276
  return;
1127
1277
  }
1128
- if (!config.hasCharacter(character)) {
1278
+ const cell = rows[y][x];
1279
+ const twoCharacterCandidate = cell.tile.character + character;
1280
+ if (config.twoCharacterTiles.includes(twoCharacterCandidate)) {
1281
+ event.preventDefault();
1282
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1283
+ ...position,
1284
+ value: twoCharacterCandidate
1285
+ }));
1286
+ moveFocus(1);
1129
1287
  return;
1130
1288
  }
1131
- const canCheckUp = y - 1 > 0;
1132
- const canCheckLeft = x > 0;
1133
- const canCheckRight = x + 1 < width;
1134
- const canCheckDown = y + 1 < height;
1135
- if (canCheckUp) {
1136
- const cellUp = rows[y - 1][x];
1137
- const twoCharacterCandidate = cellUp.tile.character + character;
1138
- if (config.twoCharacterTiles.includes(twoCharacterCandidate)) {
1139
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1140
- ...position,
1141
- y: y - 1,
1142
- value: twoCharacterCandidate
1143
- }));
1144
- return;
1145
- }
1146
- }
1147
- if (canCheckDown) {
1148
- const cellDown = rows[y + 1][x];
1149
- const twoCharacterCandidate1 = character + cellDown.tile.character;
1150
- if (config.twoCharacterTiles.includes(twoCharacterCandidate1)) {
1151
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1152
- ...position,
1153
- value: character
1154
- }));
1155
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1156
- ...position,
1157
- y: y + 1,
1158
- value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1159
- }));
1160
- onMoveFocus("forward");
1161
- return;
1162
- }
1163
- }
1164
- if (canCheckLeft) {
1165
- const cellLeft = rows[y][x - 1];
1166
- const twoCharacterCandidate2 = cellLeft.tile.character + character;
1167
- if (config.twoCharacterTiles.includes(twoCharacterCandidate2)) {
1168
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1169
- ...position,
1170
- x: x - 1,
1171
- value: twoCharacterCandidate2
1172
- }));
1173
- return;
1174
- }
1175
- }
1176
- if (canCheckRight) {
1177
- const cellRight = rows[y][x + 1];
1178
- const twoCharacterCandidate3 = character + cellRight.tile.character;
1179
- if (config.twoCharacterTiles.includes(twoCharacterCandidate3)) {
1180
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1181
- ...position,
1182
- value: character
1183
- }));
1184
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1185
- ...position,
1186
- x: x + 1,
1187
- value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1188
- }));
1189
- onMoveFocus("forward");
1190
- return;
1191
- }
1192
- }
1193
- if (!canCheckDown || !canCheckRight) {
1194
- const cell = rows[y][x];
1195
- const twoCharacterCandidate4 = cell.tile.character + character;
1196
- if (config.twoCharacterTiles.includes(twoCharacterCandidate4)) {
1197
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1198
- ...position,
1199
- value: twoCharacterCandidate4
1200
- }));
1201
- return;
1202
- }
1289
+ if (event.target instanceof HTMLInputElement && event.target.value === event.key) {
1290
+ // change event did not fire because the same character was typed over the current one
1291
+ // but we still want to move the caret
1292
+ event.preventDefault();
1293
+ moveFocus(1);
1203
1294
  }
1204
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1205
- ...position,
1206
- value: character
1207
- }));
1208
- onMoveFocus("forward");
1209
1295
  },
1210
1296
  onSpace: (event)=>{
1211
1297
  const position = getInputRefPosition(event.target);
1212
1298
  if (!position) {
1213
1299
  return;
1214
1300
  }
1215
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1301
+ event.preventDefault();
1302
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1216
1303
  }
1217
1304
  });
1218
1305
  }, [
1219
1306
  changeActiveIndex,
1220
1307
  config,
1221
1308
  dispatch,
1222
- lastDirectionRef,
1223
1309
  onDirectionToggle,
1224
1310
  rows
1225
1311
  ]);
1312
+ const onPaste = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((event)=>{
1313
+ if (!(event.target instanceof HTMLInputElement)) {
1314
+ return;
1315
+ }
1316
+ const position = getInputRefPosition(event.target);
1317
+ if (!position) {
1318
+ return;
1319
+ }
1320
+ event.preventDefault();
1321
+ const value = event.clipboardData.getData("text/plain").toLocaleLowerCase();
1322
+ insertValue(position, value);
1323
+ }, [
1324
+ insertValue
1325
+ ]);
1226
1326
  return [
1227
1327
  {
1228
- lastDirection,
1328
+ direction,
1229
1329
  refs
1230
1330
  },
1231
1331
  {
1332
+ onChange,
1232
1333
  onDirectionToggle,
1233
1334
  onFocus,
1234
- onKeyDown
1335
+ onKeyDown,
1336
+ onPaste
1235
1337
  },
1236
1338
  ];
1237
1339
  };
@@ -1432,6 +1534,7 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([stat
1432
1534
  const Dictionary = ({ className })=>{
1433
1535
  const translate = (0,state__WEBPACK_IMPORTED_MODULE_2__/* .useTranslate */ .qM)();
1434
1536
  const { results , isLoading } = (0,state__WEBPACK_IMPORTED_MODULE_2__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_2__/* .selectDictionary */ .w1);
1537
+ const error = (0,state__WEBPACK_IMPORTED_MODULE_2__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_2__/* .selectDictionaryError */ .mK);
1435
1538
  const isFirstAllowed = results.length > 0 ? results[0].isAllowed : undefined;
1436
1539
  return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
1437
1540
  className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Dictionary_module_scss__WEBPACK_IMPORTED_MODULE_5___default().dictionary), className, {
@@ -1439,6 +1542,11 @@ const Dictionary = ({ className })=>{
1439
1542
  [(_Dictionary_module_scss__WEBPACK_IMPORTED_MODULE_5___default().isNotAllowed)]: isFirstAllowed === false
1440
1543
  }),
1441
1544
  children: [
1545
+ typeof error !== "undefined" && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_EmptyState__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .Z, {
1546
+ className: (_Dictionary_module_scss__WEBPACK_IMPORTED_MODULE_5___default().emptyState),
1547
+ type: "error",
1548
+ children: error.message
1549
+ }),
1442
1550
  results.map(({ definitions , isAllowed , word })=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
1443
1551
  className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Dictionary_module_scss__WEBPACK_IMPORTED_MODULE_5___default().result), {
1444
1552
  [(_Dictionary_module_scss__WEBPACK_IMPORTED_MODULE_5___default().isAllowed)]: isAllowed === true,
@@ -1927,7 +2035,7 @@ __webpack_async_result__();
1927
2035
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16689);
1928
2036
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
1929
2037
  /* harmony import */ var icons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6942);
1930
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(92237);
2038
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(75558);
1931
2039
  /* harmony import */ var _Key__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(50237);
1932
2040
 
1933
2041
 
@@ -2475,12 +2583,13 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
2475
2583
  /* harmony export */ });
2476
2584
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20997);
2477
2585
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__);
2478
- /* harmony import */ var _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7618);
2479
- /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(59003);
2480
- /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
2481
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16689);
2482
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
2483
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92237);
2586
+ /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(59003);
2587
+ /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
2588
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16689);
2589
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
2590
+ /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6022);
2591
+ /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
2592
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75558);
2484
2593
  /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51413);
2485
2594
  /* harmony import */ var _Rack_module_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(42687);
2486
2595
  /* harmony import */ var _Rack_module_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Rack_module_scss__WEBPACK_IMPORTED_MODULE_7__);
@@ -2496,19 +2605,20 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([stat
2496
2605
 
2497
2606
 
2498
2607
  const Rack = ({ className })=>{
2608
+ const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();
2499
2609
  const config = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectConfig */ .$o);
2500
2610
  const rack = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectRack */ .QB);
2501
2611
  const resultCandidateTiles = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectResultCandidateTiles */ .z$);
2502
- const tiles = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .zipCharactersAndTiles */ .gV)(rack, resultCandidateTiles), [
2612
+ const tiles = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .zipCharactersAndTiles */ .gV)(rack, resultCandidateTiles), [
2503
2613
  rack,
2504
2614
  resultCandidateTiles
2505
2615
  ]);
2506
2616
  const tilesCount = tiles.length;
2507
- const tilesRefs = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createArray */ .Ri)(tilesCount).map(()=>/*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_3__.createRef)()), [
2617
+ const tilesRefs = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createArray */ .Ri)(tilesCount).map(()=>/*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.createRef)()), [
2508
2618
  tilesCount
2509
2619
  ]);
2510
- const activeIndexRef = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)();
2511
- const changeActiveIndex = (0,react__WEBPACK_IMPORTED_MODULE_3__.useCallback)((offset)=>{
2620
+ const activeIndexRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)();
2621
+ const changeActiveIndex = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((offset)=>{
2512
2622
  const nextActiveIndex = Math.min(Math.max((activeIndexRef.current || 0) + offset, 0), tilesCount - 1);
2513
2623
  const tileRef = tilesRefs[nextActiveIndex].current;
2514
2624
  if (tileRef) {
@@ -2520,7 +2630,33 @@ const Rack = ({ className })=>{
2520
2630
  tilesCount,
2521
2631
  tilesRefs
2522
2632
  ]);
2523
- const onKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(()=>{
2633
+ const handleChange = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((event)=>{
2634
+ const value = (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractInputValue */ .WM)(event.target);
2635
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractCharacters */ .nK)(config, value) : [];
2636
+ changeActiveIndex(value ? characters.length : -1);
2637
+ }, [
2638
+ changeActiveIndex,
2639
+ config
2640
+ ]);
2641
+ const handlePaste = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((event)=>{
2642
+ const index = activeIndexRef.current;
2643
+ if (typeof index === "undefined") {
2644
+ return;
2645
+ }
2646
+ event.preventDefault();
2647
+ const value = event.clipboardData.getData("text/plain").toLocaleLowerCase();
2648
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractCharacters */ .nK)(config, value) : [];
2649
+ changeActiveIndex(value ? characters.length : -1);
2650
+ dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .rackSlice.actions.changeCharacters */ .O_.actions.changeCharacters({
2651
+ characters,
2652
+ index
2653
+ }));
2654
+ }, [
2655
+ changeActiveIndex,
2656
+ config,
2657
+ dispatch
2658
+ ]);
2659
+ const handleKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>{
2524
2660
  return (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createKeyboardNavigation */ .np)({
2525
2661
  onArrowLeft: (event)=>{
2526
2662
  event.preventDefault();
@@ -2530,12 +2666,18 @@ const Rack = ({ className })=>{
2530
2666
  event.preventDefault();
2531
2667
  changeActiveIndex(1);
2532
2668
  },
2533
- onBackspace: ()=>{
2669
+ onBackspace: (event)=>{
2670
+ event.preventDefault();
2534
2671
  changeActiveIndex(-1);
2535
2672
  },
2536
2673
  onKeyDown: (event)=>{
2537
- const character = event.key.toLowerCase();
2538
- if (config.hasCharacter(character) || character === _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_1__.BLANK) {
2674
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event) && config.isTwoCharacterTilePrefix(event.key)) {
2675
+ changeActiveIndex(1);
2676
+ } else if (event.currentTarget.value === event.key) {
2677
+ // change event did not fire because the same character was typed over the current one
2678
+ // but we still want to move the caret
2679
+ event.preventDefault();
2680
+ event.stopPropagation();
2539
2681
  changeActiveIndex(1);
2540
2682
  }
2541
2683
  }
@@ -2545,14 +2687,16 @@ const Rack = ({ className })=>{
2545
2687
  config
2546
2688
  ]);
2547
2689
  return /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
2548
- className: classnames__WEBPACK_IMPORTED_MODULE_2___default()((_Rack_module_scss__WEBPACK_IMPORTED_MODULE_7___default().rack), className),
2690
+ className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Rack_module_scss__WEBPACK_IMPORTED_MODULE_7___default().rack), className),
2691
+ onPaste: handlePaste,
2549
2692
  children: tiles.map(({ character , tile }, index)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_RackTile__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
2550
2693
  activeIndexRef: activeIndexRef,
2551
2694
  character: character,
2552
2695
  index: index,
2553
2696
  inputRef: tilesRefs[index],
2554
2697
  tile: tile,
2555
- onKeyDown: onKeyDown
2698
+ onChange: handleChange,
2699
+ onKeyDown: handleKeyDown
2556
2700
  }, index))
2557
2701
  });
2558
2702
  };
@@ -2578,7 +2722,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
2578
2722
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
2579
2723
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6022);
2580
2724
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
2581
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92237);
2725
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75558);
2582
2726
  /* harmony import */ var parameters__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(90485);
2583
2727
  /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51413);
2584
2728
  /* harmony import */ var _Tile__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(54031);
@@ -2595,7 +2739,7 @@ state__WEBPACK_IMPORTED_MODULE_6__ = (__webpack_async_dependencies__.then ? (awa
2595
2739
 
2596
2740
 
2597
2741
 
2598
- const RackTile = ({ activeIndexRef , character , index , inputRef , tile , onKeyDown })=>{
2742
+ const RackTile = ({ activeIndexRef , character , index , inputRef , tile , onChange , onKeyDown , })=>{
2599
2743
  const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();
2600
2744
  const translate = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTranslate */ .qM)();
2601
2745
  const config = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectConfig */ .$o);
@@ -2605,33 +2749,48 @@ const RackTile = ({ activeIndexRef , character , index , inputRef , tile , onKey
2605
2749
  }, [
2606
2750
  index
2607
2751
  ]);
2608
- const handleCharacterChange = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((value)=>{
2609
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .rackSlice.actions.changeCharacter */ .O_.actions.changeCharacter({
2610
- character: value,
2752
+ const handleChange = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((event)=>{
2753
+ event.preventDefault();
2754
+ event.stopPropagation();
2755
+ const value = (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractInputValue */ .WM)(event.target);
2756
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractCharacters */ .nK)(config, value) : [
2757
+ null
2758
+ ];
2759
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .rackSlice.actions.changeCharacters */ .O_.actions.changeCharacters({
2760
+ characters,
2611
2761
  index
2612
2762
  }));
2763
+ onChange(event);
2613
2764
  }, [
2614
- index
2765
+ config,
2766
+ index,
2767
+ onChange
2615
2768
  ]);
2616
2769
  const handleKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>{
2617
2770
  return (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createKeyboardNavigation */ .np)({
2618
- onBackspace: ()=>handleCharacterChange(null),
2619
- onDelete: ()=>handleCharacterChange(null),
2771
+ onBackspace: (event)=>{
2772
+ event.preventDefault();
2773
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .rackSlice.actions.changeCharacter */ .O_.actions.changeCharacter({
2774
+ character: null,
2775
+ index
2776
+ }));
2777
+ },
2620
2778
  onKeyDown: (event)=>{
2621
- const newCharacter = event.key.toLowerCase();
2622
- const twoCharacterTile = config.getTwoCharacterTileByPrefix(newCharacter);
2623
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event) && twoCharacterTile) {
2779
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event) && config.isTwoCharacterTilePrefix(event.key)) {
2624
2780
  event.preventDefault();
2625
- handleCharacterChange(twoCharacterTile);
2626
- } else if (config.hasCharacter(newCharacter) || newCharacter === _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_1__.BLANK) {
2627
- handleCharacterChange(newCharacter);
2781
+ event.stopPropagation();
2782
+ const twoTilesCharacter = config.getTwoCharacterTileByPrefix(event.key);
2783
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
2784
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .rackSlice.actions.changeCharacter */ .O_.actions.changeCharacter({
2785
+ character: twoTilesCharacter,
2786
+ index
2787
+ }));
2628
2788
  }
2629
2789
  onKeyDown(event);
2630
2790
  }
2631
2791
  });
2632
2792
  }, [
2633
- config,
2634
- handleCharacterChange,
2793
+ index,
2635
2794
  onKeyDown
2636
2795
  ]);
2637
2796
  return /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_Tile__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {
@@ -2646,6 +2805,7 @@ const RackTile = ({ activeIndexRef , character , index , inputRef , tile , onKey
2646
2805
  raised: true,
2647
2806
  size: parameters__WEBPACK_IMPORTED_MODULE_5__/* .TILE_SIZE */ .I_,
2648
2807
  tabIndex: index === 0 ? undefined : -1,
2808
+ onChange: handleChange,
2649
2809
  onFocus: handleFocus,
2650
2810
  onKeyDown: handleKeyDown
2651
2811
  }, index);
@@ -3105,21 +3265,24 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
3105
3265
  /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__);
3106
3266
  /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(59003);
3107
3267
  /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
3108
- /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(80551);
3109
- /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_window__WEBPACK_IMPORTED_MODULE_2__);
3110
- /* harmony import */ var parameters__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(90485);
3111
- /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(51413);
3112
- /* harmony import */ var _EmptyState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(79590);
3113
- /* harmony import */ var _Loading__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(85907);
3114
- /* harmony import */ var _ResultsInput__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(57345);
3115
- /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(61157);
3116
- /* harmony import */ var _HeaderButton__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(53236);
3117
- /* harmony import */ var _Result__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(73829);
3118
- /* harmony import */ var _Results_module_scss__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(81177);
3119
- /* harmony import */ var _Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_Results_module_scss__WEBPACK_IMPORTED_MODULE_12__);
3120
- /* harmony import */ var _SolveButton__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(17290);
3121
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_4__, _EmptyState__WEBPACK_IMPORTED_MODULE_5__, _Loading__WEBPACK_IMPORTED_MODULE_6__, _ResultsInput__WEBPACK_IMPORTED_MODULE_7__, _HeaderButton__WEBPACK_IMPORTED_MODULE_9__, _Result__WEBPACK_IMPORTED_MODULE_10__, _SolveButton__WEBPACK_IMPORTED_MODULE_11__]);
3122
- ([state__WEBPACK_IMPORTED_MODULE_4__, _EmptyState__WEBPACK_IMPORTED_MODULE_5__, _Loading__WEBPACK_IMPORTED_MODULE_6__, _ResultsInput__WEBPACK_IMPORTED_MODULE_7__, _HeaderButton__WEBPACK_IMPORTED_MODULE_9__, _Result__WEBPACK_IMPORTED_MODULE_10__, _SolveButton__WEBPACK_IMPORTED_MODULE_11__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
3268
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16689);
3269
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
3270
+ /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(80551);
3271
+ /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_window__WEBPACK_IMPORTED_MODULE_3__);
3272
+ /* harmony import */ var parameters__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(90485);
3273
+ /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51413);
3274
+ /* harmony import */ var _EmptyState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(79590);
3275
+ /* harmony import */ var _Loading__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(85907);
3276
+ /* harmony import */ var _ResultsInput__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(57345);
3277
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(61157);
3278
+ /* harmony import */ var _HeaderButton__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(53236);
3279
+ /* harmony import */ var _Result__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(73829);
3280
+ /* harmony import */ var _Results_module_scss__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(81177);
3281
+ /* harmony import */ var _Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_Results_module_scss__WEBPACK_IMPORTED_MODULE_13__);
3282
+ /* harmony import */ var _SolveButton__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(17290);
3283
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_5__, _EmptyState__WEBPACK_IMPORTED_MODULE_6__, _Loading__WEBPACK_IMPORTED_MODULE_7__, _ResultsInput__WEBPACK_IMPORTED_MODULE_8__, _HeaderButton__WEBPACK_IMPORTED_MODULE_10__, _Result__WEBPACK_IMPORTED_MODULE_11__, _SolveButton__WEBPACK_IMPORTED_MODULE_12__]);
3284
+ ([state__WEBPACK_IMPORTED_MODULE_5__, _EmptyState__WEBPACK_IMPORTED_MODULE_6__, _Loading__WEBPACK_IMPORTED_MODULE_7__, _ResultsInput__WEBPACK_IMPORTED_MODULE_8__, _HeaderButton__WEBPACK_IMPORTED_MODULE_10__, _Result__WEBPACK_IMPORTED_MODULE_11__, _SolveButton__WEBPACK_IMPORTED_MODULE_12__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
3285
+
3123
3286
 
3124
3287
 
3125
3288
 
@@ -3134,68 +3297,84 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([stat
3134
3297
 
3135
3298
 
3136
3299
  const Results = ({ height , width })=>{
3137
- const translate = (0,state__WEBPACK_IMPORTED_MODULE_4__/* .useTranslate */ .qM)();
3138
- const allResults = (0,state__WEBPACK_IMPORTED_MODULE_4__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_4__/* .selectSortedResults */ .f2);
3139
- const results = (0,state__WEBPACK_IMPORTED_MODULE_4__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_4__/* .selectSortedFilteredResults */ .dN);
3140
- const isLoading = (0,state__WEBPACK_IMPORTED_MODULE_4__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_4__/* .selectIsLoading */ .xU);
3141
- const isOutdated = (0,state__WEBPACK_IMPORTED_MODULE_4__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_4__/* .selectAreResultsOutdated */ .Mj);
3300
+ const translate = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTranslate */ .qM)();
3301
+ const allResults = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectSortedResults */ .f2);
3302
+ const results = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectSortedFilteredResults */ .dN);
3303
+ const isLoading = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectIsLoading */ .xU);
3304
+ const isOutdated = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectAreResultsOutdated */ .Mj);
3305
+ const error = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectSolveError */ .Rn);
3306
+ const listRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)();
3307
+ (0,react__WEBPACK_IMPORTED_MODULE_2__.useLayoutEffect)(()=>{
3308
+ if (listRef.current) {
3309
+ listRef.current.scrollTo(0, 0);
3310
+ }
3311
+ }, [
3312
+ listRef,
3313
+ results
3314
+ ]);
3142
3315
  return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
3143
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().results),
3316
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().results),
3144
3317
  children: [
3145
3318
  /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
3146
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().header),
3147
- children: _constants__WEBPACK_IMPORTED_MODULE_8__/* .COLUMNS.map */ .L.map((column)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_HeaderButton__WEBPACK_IMPORTED_MODULE_9__/* ["default"] */ .Z, {
3319
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().header),
3320
+ children: _constants__WEBPACK_IMPORTED_MODULE_9__/* .COLUMNS.map */ .L.map((column)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_HeaderButton__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Z, {
3148
3321
  column: column
3149
3322
  }, column.id))
3150
3323
  }),
3151
- typeof results === "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .Z, {
3152
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().emptyState),
3324
+ typeof error !== "undefined" && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_EmptyState__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
3325
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().emptyState),
3326
+ type: "error",
3327
+ children: error.message
3328
+ }),
3329
+ typeof results === "undefined" && typeof error === "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
3330
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().emptyState),
3153
3331
  type: "info",
3154
3332
  children: [
3155
3333
  translate("results.empty-state.uninitialized"),
3156
- /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_SolveButton__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Z, {})
3334
+ /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_SolveButton__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .Z, {})
3157
3335
  ]
3158
3336
  }),
3159
- typeof results !== "undefined" && typeof allResults !== "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {
3337
+ typeof results !== "undefined" && typeof allResults !== "undefined" && typeof error === "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {
3160
3338
  children: [
3161
- isOutdated && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .Z, {
3162
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().emptyState),
3339
+ isOutdated && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
3340
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().emptyState),
3163
3341
  type: "info",
3164
3342
  children: [
3165
3343
  translate("results.empty-state.outdated"),
3166
- /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_SolveButton__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Z, {})
3344
+ /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_SolveButton__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .Z, {})
3167
3345
  ]
3168
3346
  }),
3169
3347
  !isOutdated && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {
3170
3348
  children: [
3171
- allResults.length === 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_EmptyState__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .Z, {
3172
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().emptyState),
3349
+ allResults.length === 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_EmptyState__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
3350
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().emptyState),
3173
3351
  type: "warning",
3174
3352
  children: translate("results.empty-state.no-results")
3175
3353
  }),
3176
- allResults.length > 0 && results.length === 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_EmptyState__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .Z, {
3177
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().emptyState),
3354
+ allResults.length > 0 && results.length === 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_EmptyState__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
3355
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().emptyState),
3178
3356
  type: "info",
3179
3357
  children: translate("results.empty-state.no-filtered-results")
3180
3358
  }),
3181
- allResults.length > 0 && results.length > 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(react_window__WEBPACK_IMPORTED_MODULE_2__.FixedSizeList, {
3182
- className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().list), {
3183
- [(_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().outdated)]: isOutdated
3359
+ allResults.length > 0 && results.length > 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(react_window__WEBPACK_IMPORTED_MODULE_3__.FixedSizeList, {
3360
+ className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().list), {
3361
+ [(_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().outdated)]: isOutdated
3184
3362
  }),
3185
- height: height - parameters__WEBPACK_IMPORTED_MODULE_3__/* .RESULTS_HEADER_HEIGHT */ .$L - parameters__WEBPACK_IMPORTED_MODULE_3__/* .RESULTS_INPUT_HEIGHT */ .qp,
3363
+ height: height - parameters__WEBPACK_IMPORTED_MODULE_4__/* .RESULTS_HEADER_HEIGHT */ .$L - parameters__WEBPACK_IMPORTED_MODULE_4__/* .RESULTS_INPUT_HEIGHT */ .qp,
3364
+ innerRef: listRef,
3186
3365
  itemCount: results.length,
3187
- itemSize: parameters__WEBPACK_IMPORTED_MODULE_3__/* .RESULTS_ITEM_HEIGHT */ .rx,
3366
+ itemSize: parameters__WEBPACK_IMPORTED_MODULE_4__/* .RESULTS_ITEM_HEIGHT */ .rx,
3188
3367
  width: width,
3189
- children: _Result__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Z
3368
+ children: _Result__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Z
3190
3369
  }),
3191
- allResults.length > 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_ResultsInput__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {
3192
- className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_12___default().input)
3370
+ allResults.length > 0 && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_ResultsInput__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .Z, {
3371
+ className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_13___default().input)
3193
3372
  })
3194
3373
  ]
3195
3374
  })
3196
3375
  ]
3197
3376
  }),
3198
- isLoading && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_Loading__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {})
3377
+ isLoading && /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_Loading__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {})
3199
3378
  ]
3200
3379
  });
3201
3380
  };
@@ -3344,7 +3523,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
3344
3523
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
3345
3524
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6022);
3346
3525
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
3347
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92237);
3526
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75558);
3348
3527
  /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51413);
3349
3528
  /* harmony import */ var _ResultsInput_module_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(35628);
3350
3529
  /* harmony import */ var _ResultsInput_module_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_ResultsInput_module_scss__WEBPACK_IMPORTED_MODULE_6__);
@@ -4134,7 +4313,6 @@ const Link = ({ className , Icon , tooltip , ...props })=>{
4134
4313
  const triggerProps = (0,_Tooltip__WEBPACK_IMPORTED_MODULE_2__/* .useTooltip */ .l)(tooltip, props);
4135
4314
  return /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("a", {
4136
4315
  className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_SquareButton_module_scss__WEBPACK_IMPORTED_MODULE_3___default().squareButton), className),
4137
- type: "button",
4138
4316
  ...props,
4139
4317
  ...triggerProps,
4140
4318
  children: /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("span", {
@@ -4265,8 +4443,8 @@ var jsx_runtime_ = __webpack_require__(20997);
4265
4443
  var build = __webpack_require__(7618);
4266
4444
  // EXTERNAL MODULE: external "react"
4267
4445
  var external_react_ = __webpack_require__(16689);
4268
- // EXTERNAL MODULE: ./src/lib/index.ts + 27 modules
4269
- var lib = __webpack_require__(92237);
4446
+ // EXTERNAL MODULE: ./src/lib/index.ts + 29 modules
4447
+ var lib = __webpack_require__(75558);
4270
4448
  // EXTERNAL MODULE: external "classnames"
4271
4449
  var external_classnames_ = __webpack_require__(59003);
4272
4450
  var external_classnames_default = /*#__PURE__*/__webpack_require__.n(external_classnames_);
@@ -4278,8 +4456,7 @@ var Tile_module_default = /*#__PURE__*/__webpack_require__.n(Tile_module);
4278
4456
 
4279
4457
 
4280
4458
 
4281
- const handleChange = (event)=>event.preventDefault();
4282
- const TilePure = ({ autoFocus , canShowPoints , character , className , disabled , highlighted , inputRef , inputStyle , isBlank , placeholder , points , pointsStyle , raised , style , tabIndex , onFocus , onKeyDown , })=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
4459
+ const TilePure = ({ autoFocus , canShowPoints , character , className , disabled , highlighted , inputRef , inputStyle , isBlank , placeholder , points , pointsStyle , raised , style , tabIndex , onChange , onFocus , onKeyDown , })=>/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
4283
4460
  className: external_classnames_default()((Tile_module_default()).tile, className, {
4284
4461
  [(Tile_module_default()).highlighted]: highlighted,
4285
4462
  [(Tile_module_default()).blank]: isBlank,
@@ -4299,14 +4476,13 @@ const TilePure = ({ autoFocus , canShowPoints , character , className , disabled
4299
4476
  autoFocus: autoFocus,
4300
4477
  className: (Tile_module_default()).character,
4301
4478
  disabled: disabled,
4302
- maxLength: 1,
4303
4479
  placeholder: placeholder,
4304
4480
  ref: inputRef,
4305
4481
  spellCheck: false,
4306
4482
  style: inputStyle,
4307
4483
  tabIndex: tabIndex,
4308
4484
  value: character || "",
4309
- onChange: handleChange,
4485
+ onChange: onChange,
4310
4486
  onFocus: onFocus,
4311
4487
  onKeyDown: onKeyDown
4312
4488
  }),
@@ -4325,7 +4501,7 @@ const TilePure = ({ autoFocus , canShowPoints , character , className , disabled
4325
4501
 
4326
4502
 
4327
4503
 
4328
- const Tile = ({ autoFocus , className , character ="" , disabled , highlighted , inputRef: ref , isBlank , placeholder , points , raised , size , tabIndex , onFocus , onKeyDown , })=>{
4504
+ const Tile = ({ autoFocus , className , character ="" , disabled , highlighted , inputRef: ref , isBlank , placeholder , points , raised , size , tabIndex , onChange , onFocus =lib/* noop */.ZT , onKeyDown =lib/* noop */.ZT , })=>{
4329
4505
  const { pointsFontSize , tileFontSize , tileSize } = (0,lib/* getTileSizes */.vc)(size);
4330
4506
  const style = (0,external_react_.useMemo)(()=>({
4331
4507
  height: tileSize,
@@ -4348,6 +4524,10 @@ const Tile = ({ autoFocus , className , character ="" , disabled , highlighted ,
4348
4524
  ]);
4349
4525
  const isEmpty = !character || character === build.EMPTY_CELL;
4350
4526
  const canShowPoints = (isBlank || !isEmpty) && typeof points !== "undefined";
4527
+ const handleKeyDown = (event)=>{
4528
+ inputRef.current?.select();
4529
+ onKeyDown(event);
4530
+ };
4351
4531
  (0,external_react_.useEffect)(()=>{
4352
4532
  if (autoFocus && inputRef.current) {
4353
4533
  inputRef.current.focus();
@@ -4372,8 +4552,9 @@ const Tile = ({ autoFocus , className , character ="" , disabled , highlighted ,
4372
4552
  raised: raised,
4373
4553
  style: style,
4374
4554
  tabIndex: tabIndex,
4555
+ onChange: onChange,
4375
4556
  onFocus: onFocus,
4376
- onKeyDown: onKeyDown
4557
+ onKeyDown: handleKeyDown
4377
4558
  });
4378
4559
  };
4379
4560
  /* harmony default export */ const Tile_Tile = (Tile);
@@ -4463,7 +4644,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
4463
4644
  /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(69755);
4464
4645
  /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_use__WEBPACK_IMPORTED_MODULE_4__);
4465
4646
  /* harmony import */ var hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26183);
4466
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(92237);
4647
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(75558);
4467
4648
  /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(8550);
4468
4649
  /* harmony import */ var _Tooltip_module_scss__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(222);
4469
4650
  /* harmony import */ var _Tooltip_module_scss__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_Tooltip_module_scss__WEBPACK_IMPORTED_MODULE_8__);
@@ -5021,7 +5202,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
5021
5202
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
5022
5203
  /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69755);
5023
5204
  /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_use__WEBPACK_IMPORTED_MODULE_2__);
5024
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(92237);
5205
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(75558);
5025
5206
  /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(51413);
5026
5207
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_4__]);
5027
5208
  state__WEBPACK_IMPORTED_MODULE_4__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
@@ -5120,7 +5301,7 @@ __webpack_async_result__();
5120
5301
  /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom_client__WEBPACK_IMPORTED_MODULE_2__);
5121
5302
  /* harmony import */ var react_portal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(63938);
5122
5303
  /* harmony import */ var react_portal__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_portal__WEBPACK_IMPORTED_MODULE_3__);
5123
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92237);
5304
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75558);
5124
5305
 
5125
5306
 
5126
5307