@scrabble-solver/scrabble-solver 2.10.0 → 2.10.1

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 (48) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +5 -5
  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/edge-server-production/0.pack +0 -0
  9. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  10. package/.next/cache/webpack/server-production/0.pack +0 -0
  11. package/.next/cache/webpack/server-production/index.pack +0 -0
  12. package/.next/next-server.js.nft.json +1 -1
  13. package/.next/prerender-manifest.json +1 -1
  14. package/.next/routes-manifest.json +1 -1
  15. package/.next/server/chunks/413.js +49 -31
  16. package/.next/server/chunks/515.js +97 -71
  17. package/.next/server/chunks/939.js +1 -0
  18. package/.next/server/middleware-build-manifest.js +1 -1
  19. package/.next/server/pages/404.html +2 -2
  20. package/.next/server/pages/404.js.nft.json +1 -1
  21. package/.next/server/pages/500.html +2 -2
  22. package/.next/server/pages/_app.js.nft.json +1 -1
  23. package/.next/server/pages/_error.js.nft.json +1 -1
  24. package/.next/server/pages/api/dictionary/[locale]/[word].js +1 -1
  25. package/.next/server/pages/api/solve.js +20 -23
  26. package/.next/server/pages/index.html +2 -2
  27. package/.next/server/pages/index.js.nft.json +1 -1
  28. package/.next/server/pages/index.json +1 -1
  29. package/.next/server/pages-manifest.json +1 -1
  30. package/.next/static/chunks/368-8b386c3106556f62.js +1 -0
  31. package/.next/static/chunks/pages/_app-8f0df20f771045ed.js +1 -0
  32. package/.next/static/hf94cues-LcXZRCpAzQ6w/_buildManifest.js +1 -0
  33. package/.next/static/{vscqn7BEtAxJteWSwNnas → hf94cues-LcXZRCpAzQ6w}/_ssgManifest.js +0 -0
  34. package/.next/trace +52 -52
  35. package/package.json +9 -9
  36. package/src/components/Board/hooks/useGrid.ts +6 -6
  37. package/src/components/Rack/Rack.tsx +16 -4
  38. package/src/components/Results/Results.tsx +2 -2
  39. package/src/components/Settings/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +2 -2
  40. package/src/components/Settings/components/LocaleSetting/options.ts +9 -1
  41. package/src/i18n/fr.json +1 -1
  42. package/src/lib/getRemainingTilesGroups.ts +24 -26
  43. package/src/sdk/findWordDefinitions.ts +1 -1
  44. package/src/state/sagas.ts +19 -5
  45. package/src/state/selectors.ts +10 -2
  46. package/.next/static/chunks/368-d423e70be6c0c473.js +0 -1
  47. package/.next/static/chunks/pages/_app-3f5508a5f544d9eb.js +0 -1
  48. package/.next/static/vscqn7BEtAxJteWSwNnas/_buildManifest.js +0 -1
@@ -1005,11 +1005,12 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1005
1005
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
1006
1006
  /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(69755);
1007
1007
  /* harmony import */ var react_use__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_use__WEBPACK_IMPORTED_MODULE_4__);
1008
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(30459);
1009
- /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51413);
1010
- /* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(95137);
1011
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_6__]);
1012
- state__WEBPACK_IMPORTED_MODULE_6__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
1008
+ /* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(43898);
1009
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(30459);
1010
+ /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(51413);
1011
+ /* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(95137);
1012
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_7__]);
1013
+ state__WEBPACK_IMPORTED_MODULE_7__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
1013
1014
  /* eslint-disable max-lines, max-statements */
1014
1015
 
1015
1016
 
@@ -1018,13 +1019,15 @@ state__WEBPACK_IMPORTED_MODULE_6__ = (__webpack_async_dependencies__.then ? (awa
1018
1019
 
1019
1020
 
1020
1021
 
1022
+
1021
1023
  const toggleDirection = (direction)=>direction === "vertical" ? "horizontal" : "vertical";
1022
1024
  const useGrid = (rows)=>{
1023
1025
  const height = rows.length;
1024
1026
  const width = rows[0].length;
1025
1027
  const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();
1026
- const config = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectConfig */ .$o);
1027
- 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)()), [
1028
+ const config = (0,state__WEBPACK_IMPORTED_MODULE_7__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_7__/* .selectConfig */ .$o);
1029
+ const locale = (0,state__WEBPACK_IMPORTED_MODULE_7__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_7__/* .selectLocale */ .fN);
1030
+ const refs = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_6__/* .createGridOf */ .DI)(width, height, ()=>(0,react__WEBPACK_IMPORTED_MODULE_2__.createRef)()), [
1028
1031
  width,
1029
1032
  height
1030
1033
  ]);
@@ -1047,7 +1050,7 @@ const useGrid = (rows)=>{
1047
1050
  refs
1048
1051
  ]);
1049
1052
  const getInputRefPosition = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((inputRef)=>{
1050
- return (0,_lib__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z)(refs, (ref)=>ref.current === inputRef);
1053
+ return (0,_lib__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .Z)(refs, (ref)=>ref.current === inputRef);
1051
1054
  }, [
1052
1055
  refs
1053
1056
  ]);
@@ -1062,7 +1065,7 @@ const useGrid = (rows)=>{
1062
1065
  directionRef
1063
1066
  ]);
1064
1067
  const insertValue = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((position, value)=>{
1065
- const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractCharacters */ .nK)(config, value).filter((character)=>character !== _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.BLANK) : [
1068
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_6__/* .extractCharacters */ .nK)(config, value).filter((character)=>character !== _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.BLANK) : [
1066
1069
  _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.BLANK
1067
1070
  ];
1068
1071
  const actions = [];
@@ -1089,12 +1092,12 @@ const useGrid = (rows)=>{
1089
1092
  const cellUp = board.rows[y - 1][x];
1090
1093
  const twoCharacterCandidate = cellUp.tile.character + character;
1091
1094
  if (!cellUp.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate)) {
1092
- const action = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1095
+ const action = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1093
1096
  x,
1094
1097
  y: y - 1,
1095
1098
  value: twoCharacterCandidate
1096
1099
  });
1097
- board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, action);
1100
+ board = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(board, action);
1098
1101
  actions.push(action);
1099
1102
  return;
1100
1103
  }
@@ -1103,17 +1106,17 @@ const useGrid = (rows)=>{
1103
1106
  const cellDown = board.rows[y + 1][x];
1104
1107
  const twoCharacterCandidate1 = character + cellDown.tile.character;
1105
1108
  if (!cellDown.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate1)) {
1106
- const action1 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1109
+ const action1 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1107
1110
  x,
1108
1111
  y,
1109
1112
  value: character
1110
1113
  });
1111
- const action2 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1114
+ const action2 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1112
1115
  x,
1113
1116
  y: y + 1,
1114
1117
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1115
1118
  });
1116
- board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, action1), action2);
1119
+ board = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(board, action1), action2);
1117
1120
  actions.push(action1, action2);
1118
1121
  scheduleMoveFocus();
1119
1122
  return;
@@ -1123,12 +1126,12 @@ const useGrid = (rows)=>{
1123
1126
  const cellLeft = board.rows[y][x - 1];
1124
1127
  const twoCharacterCandidate2 = cellLeft.tile.character + character;
1125
1128
  if (!cellLeft.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate2)) {
1126
- const action3 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1129
+ const action3 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1127
1130
  x: x - 1,
1128
1131
  y,
1129
1132
  value: twoCharacterCandidate2
1130
1133
  });
1131
- board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, action3);
1134
+ board = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(board, action3);
1132
1135
  actions.push(action3);
1133
1136
  return;
1134
1137
  }
@@ -1137,17 +1140,17 @@ const useGrid = (rows)=>{
1137
1140
  const cellRight = board.rows[y][x + 1];
1138
1141
  const twoCharacterCandidate3 = character + cellRight.tile.character;
1139
1142
  if (!cellRight.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate3)) {
1140
- const action11 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1143
+ const action11 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1141
1144
  x,
1142
1145
  y,
1143
1146
  value: character
1144
1147
  });
1145
- const action21 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1148
+ const action21 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1146
1149
  x: x + 1,
1147
1150
  y,
1148
1151
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1149
1152
  });
1150
- board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, action11), action21);
1153
+ board = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(board, action11), action21);
1151
1154
  actions.push(action11, action21);
1152
1155
  scheduleMoveFocus();
1153
1156
  return;
@@ -1157,22 +1160,22 @@ const useGrid = (rows)=>{
1157
1160
  const cell = board.rows[y][x];
1158
1161
  const twoCharacterCandidate4 = cell.tile.character + character;
1159
1162
  if (!cell.tile.isBlank && config.twoCharacterTiles.includes(twoCharacterCandidate4)) {
1160
- const action4 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1163
+ const action4 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1161
1164
  x,
1162
1165
  y,
1163
1166
  value: twoCharacterCandidate4
1164
1167
  });
1165
- board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, action4);
1168
+ board = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(board, action4);
1166
1169
  actions.push(action4);
1167
1170
  return;
1168
1171
  }
1169
1172
  }
1170
- const action5 = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1173
+ const action5 = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1171
1174
  x,
1172
1175
  y,
1173
1176
  value: character
1174
1177
  });
1175
- board = state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.reducer */ .I8.reducer(board, action5);
1178
+ board = state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.reducer */ .I8.reducer(board, action5);
1176
1179
  actions.push(action5);
1177
1180
  scheduleMoveFocus();
1178
1181
  });
@@ -1190,9 +1193,9 @@ const useGrid = (rows)=>{
1190
1193
  if (!position) {
1191
1194
  return;
1192
1195
  }
1193
- const value = (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractInputValue */ .WM)(event.target);
1196
+ const value = (0,lib__WEBPACK_IMPORTED_MODULE_6__/* .extractInputValue */ .WM)(event.target);
1194
1197
  if (!value) {
1195
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1198
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1196
1199
  ...position,
1197
1200
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1198
1201
  }));
@@ -1203,7 +1206,7 @@ const useGrid = (rows)=>{
1203
1206
  const { x , y } = position;
1204
1207
  const cell = rows[y][x];
1205
1208
  if (cell.hasTile()) {
1206
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1209
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1207
1210
  return;
1208
1211
  }
1209
1212
  }
@@ -1222,10 +1225,10 @@ const useGrid = (rows)=>{
1222
1225
  };
1223
1226
  }, []);
1224
1227
  const onKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>{
1225
- return (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .createKeyboardNavigation */ .np)({
1228
+ return (0,lib__WEBPACK_IMPORTED_MODULE_6__/* .createKeyboardNavigation */ .np)({
1226
1229
  onArrowDown: (event)=>{
1227
1230
  event.preventDefault();
1228
- if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1231
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event)) {
1229
1232
  onDirectionToggle();
1230
1233
  } else {
1231
1234
  changeActiveIndex(0, 1);
@@ -1233,25 +1236,23 @@ const useGrid = (rows)=>{
1233
1236
  },
1234
1237
  onArrowLeft: (event)=>{
1235
1238
  event.preventDefault();
1236
- if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1239
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event)) {
1237
1240
  onDirectionToggle();
1238
1241
  } else {
1239
- const isRtl = document.body.parentElement?.dir === "rtl";
1240
- changeActiveIndex(isRtl ? 1 : -1, 0);
1242
+ changeActiveIndex(i18n__WEBPACK_IMPORTED_MODULE_5__/* .LOCALE_FEATURES */ .q[locale].direction === "ltr" ? -1 : 1, 0);
1241
1243
  }
1242
1244
  },
1243
1245
  onArrowRight: (event)=>{
1244
1246
  event.preventDefault();
1245
- if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1247
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event)) {
1246
1248
  onDirectionToggle();
1247
1249
  } else {
1248
- const isRtl = document.body.parentElement?.dir === "rtl";
1249
- changeActiveIndex(isRtl ? -1 : 1, 0);
1250
+ changeActiveIndex(i18n__WEBPACK_IMPORTED_MODULE_5__/* .LOCALE_FEATURES */ .q[locale].direction === "ltr" ? 1 : -1, 0);
1250
1251
  }
1251
1252
  },
1252
1253
  onArrowUp: (event)=>{
1253
1254
  event.preventDefault();
1254
- if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event)) {
1255
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event)) {
1255
1256
  onDirectionToggle();
1256
1257
  } else {
1257
1258
  changeActiveIndex(0, -1);
@@ -1263,7 +1264,7 @@ const useGrid = (rows)=>{
1263
1264
  return;
1264
1265
  }
1265
1266
  event.preventDefault();
1266
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1267
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1267
1268
  ...position,
1268
1269
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1269
1270
  }));
@@ -1275,7 +1276,7 @@ const useGrid = (rows)=>{
1275
1276
  return;
1276
1277
  }
1277
1278
  event.preventDefault();
1278
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1279
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1279
1280
  ...position,
1280
1281
  value: _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_0__.EMPTY_CELL
1281
1282
  }));
@@ -1288,16 +1289,16 @@ const useGrid = (rows)=>{
1288
1289
  }
1289
1290
  const { x , y } = position;
1290
1291
  const character = event.key.toLowerCase();
1291
- const isTogglingBlank = (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event) && character === "b";
1292
+ const isTogglingBlank = (0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event) && character === "b";
1292
1293
  const twoCharacterTile = config.getTwoCharacterTileByPrefix(character);
1293
1294
  if (isTogglingBlank) {
1294
1295
  event.preventDefault();
1295
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1296
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1296
1297
  return;
1297
1298
  }
1298
- if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event) && twoCharacterTile) {
1299
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event) && twoCharacterTile) {
1299
1300
  event.preventDefault();
1300
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1301
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1301
1302
  x,
1302
1303
  y,
1303
1304
  value: twoCharacterTile
@@ -1309,7 +1310,7 @@ const useGrid = (rows)=>{
1309
1310
  const twoCharacterCandidate = cell.tile.character + character;
1310
1311
  if (config.twoCharacterTiles.includes(twoCharacterCandidate)) {
1311
1312
  event.preventDefault();
1312
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1313
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.changeCellValue */ .I8.actions.changeCellValue({
1313
1314
  ...position,
1314
1315
  value: twoCharacterCandidate
1315
1316
  }));
@@ -1329,13 +1330,14 @@ const useGrid = (rows)=>{
1329
1330
  return;
1330
1331
  }
1331
1332
  event.preventDefault();
1332
- dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1333
+ dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
1333
1334
  }
1334
1335
  });
1335
1336
  }, [
1336
1337
  changeActiveIndex,
1337
1338
  config,
1338
1339
  dispatch,
1340
+ locale,
1339
1341
  onDirectionToggle,
1340
1342
  rows
1341
1343
  ]);
@@ -2804,13 +2806,15 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
2804
2806
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
2805
2807
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6022);
2806
2808
  /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_3__);
2807
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(30459);
2808
- /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51413);
2809
- /* harmony import */ var _Rack_module_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(42687);
2810
- /* harmony import */ var _Rack_module_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Rack_module_scss__WEBPACK_IMPORTED_MODULE_7__);
2811
- /* harmony import */ var _RackTile__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1971);
2812
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_5__, _RackTile__WEBPACK_IMPORTED_MODULE_6__]);
2813
- ([state__WEBPACK_IMPORTED_MODULE_5__, _RackTile__WEBPACK_IMPORTED_MODULE_6__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
2809
+ /* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(43898);
2810
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(30459);
2811
+ /* harmony import */ var state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51413);
2812
+ /* harmony import */ var _Rack_module_scss__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(42687);
2813
+ /* harmony import */ var _Rack_module_scss__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_Rack_module_scss__WEBPACK_IMPORTED_MODULE_8__);
2814
+ /* harmony import */ var _RackTile__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1971);
2815
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([state__WEBPACK_IMPORTED_MODULE_6__, _RackTile__WEBPACK_IMPORTED_MODULE_7__]);
2816
+ ([state__WEBPACK_IMPORTED_MODULE_6__, _RackTile__WEBPACK_IMPORTED_MODULE_7__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
2817
+
2814
2818
 
2815
2819
 
2816
2820
 
@@ -2821,18 +2825,20 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([stat
2821
2825
 
2822
2826
  const Rack = ({ className })=>{
2823
2827
  const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useDispatch)();
2824
- const config = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectConfig */ .$o);
2825
- const rack = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectRack */ .QB);
2826
- const resultCandidateTiles = (0,state__WEBPACK_IMPORTED_MODULE_5__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_5__/* .selectResultCandidateTiles */ .z$);
2827
- const tiles = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .zipCharactersAndTiles */ .gV)(rack, resultCandidateTiles), [
2828
+ const config = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectConfig */ .$o);
2829
+ const locale = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectLocale */ .fN);
2830
+ const rack = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectRack */ .QB);
2831
+ const resultCandidateTiles = (0,state__WEBPACK_IMPORTED_MODULE_6__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_6__/* .selectResultCandidateTiles */ .z$);
2832
+ const tiles = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_5__/* .zipCharactersAndTiles */ .gV)(rack, resultCandidateTiles), [
2828
2833
  rack,
2829
2834
  resultCandidateTiles
2830
2835
  ]);
2831
2836
  const tilesCount = tiles.length;
2832
- 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)()), [
2837
+ const tilesRefs = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>(0,lib__WEBPACK_IMPORTED_MODULE_5__/* .createArray */ .Ri)(tilesCount).map(()=>/*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.createRef)()), [
2833
2838
  tilesCount
2834
2839
  ]);
2835
2840
  const activeIndexRef = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)();
2841
+ const { direction } = i18n__WEBPACK_IMPORTED_MODULE_4__/* .LOCALE_FEATURES */ .q[locale];
2836
2842
  const changeActiveIndex = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((offset)=>{
2837
2843
  const nextActiveIndex = Math.min(Math.max((activeIndexRef.current || 0) + offset, 0), tilesCount - 1);
2838
2844
  const tileRef = tilesRefs[nextActiveIndex].current;
@@ -2846,8 +2852,8 @@ const Rack = ({ className })=>{
2846
2852
  tilesRefs
2847
2853
  ]);
2848
2854
  const handleChange = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((event)=>{
2849
- const value = (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractInputValue */ .WM)(event.target);
2850
- const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractCharacters */ .nK)(config, value) : [];
2855
+ const value = (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractInputValue */ .WM)(event.target);
2856
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractCharacters */ .nK)(config, value) : [];
2851
2857
  changeActiveIndex(value ? characters.length : -1);
2852
2858
  }, [
2853
2859
  changeActiveIndex,
@@ -2860,9 +2866,9 @@ const Rack = ({ className })=>{
2860
2866
  }
2861
2867
  event.preventDefault();
2862
2868
  const value = event.clipboardData.getData("text/plain").toLocaleLowerCase();
2863
- const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .extractCharacters */ .nK)(config, value) : [];
2869
+ const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractCharacters */ .nK)(config, value) : [];
2864
2870
  changeActiveIndex(value ? characters.length : -1);
2865
- dispatch(state__WEBPACK_IMPORTED_MODULE_5__/* .rackSlice.actions.changeCharacters */ .O_.actions.changeCharacters({
2871
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .rackSlice.actions.changeCharacters */ .O_.actions.changeCharacters({
2866
2872
  characters,
2867
2873
  index
2868
2874
  }));
@@ -2872,23 +2878,35 @@ const Rack = ({ className })=>{
2872
2878
  dispatch
2873
2879
  ]);
2874
2880
  const handleKeyDown = (0,react__WEBPACK_IMPORTED_MODULE_2__.useMemo)(()=>{
2875
- return (0,lib__WEBPACK_IMPORTED_MODULE_4__/* .createKeyboardNavigation */ .np)({
2881
+ return (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .createKeyboardNavigation */ .np)({
2876
2882
  onArrowLeft: (event)=>{
2877
2883
  event.preventDefault();
2878
- const direction = document.body.parentElement?.dir || "ltr";
2879
2884
  changeActiveIndex(direction === "ltr" ? -1 : 1);
2880
2885
  },
2881
2886
  onArrowRight: (event)=>{
2882
2887
  event.preventDefault();
2883
- const direction = document.body.parentElement?.dir || "ltr";
2884
2888
  changeActiveIndex(direction === "ltr" ? 1 : -1);
2885
2889
  },
2886
2890
  onBackspace: (event)=>{
2887
2891
  event.preventDefault();
2888
2892
  changeActiveIndex(-1);
2889
2893
  },
2894
+ onDelete: (event)=>{
2895
+ const index = activeIndexRef.current;
2896
+ if (typeof index === "undefined") {
2897
+ return;
2898
+ }
2899
+ event.preventDefault();
2900
+ dispatch(state__WEBPACK_IMPORTED_MODULE_6__/* .rackSlice.actions.changeCharacters */ .O_.actions.changeCharacters({
2901
+ characters: [
2902
+ null
2903
+ ],
2904
+ index
2905
+ }));
2906
+ changeActiveIndex(1);
2907
+ },
2890
2908
  onKeyDown: (event)=>{
2891
- if ((0,lib__WEBPACK_IMPORTED_MODULE_4__/* .isCtrl */ .yl)(event) && config.isTwoCharacterTilePrefix(event.key)) {
2909
+ if ((0,lib__WEBPACK_IMPORTED_MODULE_5__/* .isCtrl */ .yl)(event) && config.isTwoCharacterTilePrefix(event.key)) {
2892
2910
  changeActiveIndex(1);
2893
2911
  } else if (event.currentTarget.value === event.key) {
2894
2912
  // change event did not fire because the same character was typed over the current one
@@ -2901,12 +2919,13 @@ const Rack = ({ className })=>{
2901
2919
  });
2902
2920
  }, [
2903
2921
  changeActiveIndex,
2904
- config
2922
+ config,
2923
+ direction
2905
2924
  ]);
2906
2925
  return /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
2907
- className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Rack_module_scss__WEBPACK_IMPORTED_MODULE_7___default().rack), className),
2926
+ className: classnames__WEBPACK_IMPORTED_MODULE_1___default()((_Rack_module_scss__WEBPACK_IMPORTED_MODULE_8___default().rack), className),
2908
2927
  onPaste: handlePaste,
2909
- children: tiles.map(({ character , tile }, index)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_RackTile__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z, {
2928
+ children: tiles.map(({ character , tile }, index)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_RackTile__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {
2910
2929
  activeIndexRef: activeIndexRef,
2911
2930
  character: character,
2912
2931
  index: index,
@@ -3567,7 +3586,7 @@ const Results = ({ height , width })=>{
3567
3586
  type: "error",
3568
3587
  children: error.message
3569
3588
  }),
3570
- typeof results === "undefined" && typeof error === "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {
3589
+ typeof error === "undefined" && typeof results === "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {
3571
3590
  className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_14___default().emptyState),
3572
3591
  type: "info",
3573
3592
  children: [
@@ -3575,7 +3594,7 @@ const Results = ({ height , width })=>{
3575
3594
  /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_SolveButton__WEBPACK_IMPORTED_MODULE_13__/* ["default"] */ .Z, {})
3576
3595
  ]
3577
3596
  }),
3578
- 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, {
3597
+ typeof error === "undefined" && typeof results !== "undefined" && typeof allResults !== "undefined" && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {
3579
3598
  children: [
3580
3599
  isOutdated && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_EmptyState__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .Z, {
3581
3600
  className: (_Results_module_scss__WEBPACK_IMPORTED_MODULE_14___default().emptyState),
@@ -3955,7 +3974,7 @@ state__WEBPACK_IMPORTED_MODULE_2__ = (__webpack_async_dependencies__.then ? (awa
3955
3974
  const AutoGroupTilesSetting = ({ className , disabled })=>{
3956
3975
  const dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();
3957
3976
  const translate = (0,state__WEBPACK_IMPORTED_MODULE_2__/* .useTranslate */ .qM)();
3958
- const configId = (0,state__WEBPACK_IMPORTED_MODULE_2__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_2__/* .selectAutoGroupTiles */ .uz);
3977
+ const value = (0,state__WEBPACK_IMPORTED_MODULE_2__/* .useTypedSelector */ .ix)(state__WEBPACK_IMPORTED_MODULE_2__/* .selectAutoGroupTiles */ .uz);
3959
3978
  const options = [
3960
3979
  {
3961
3980
  label: translate("settings.autoGroupTiles.left"),
@@ -3977,7 +3996,7 @@ const AutoGroupTilesSetting = ({ className , disabled })=>{
3977
3996
  return /*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx("div", {
3978
3997
  className: className,
3979
3998
  children: options.map((option)=>/*#__PURE__*/ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx(_Radio__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .Z, {
3980
- checked: configId === (0,_lib__WEBPACK_IMPORTED_MODULE_5__/* .parseValue */ .H)(option.value),
3999
+ checked: value === (0,_lib__WEBPACK_IMPORTED_MODULE_5__/* .parseValue */ .H)(option.value),
3981
4000
  className: (_AutoGroupTilesSetting_module_scss__WEBPACK_IMPORTED_MODULE_6___default().option),
3982
4001
  disabled: disabled,
3983
4002
  id: "autoGroupTiles",
@@ -4254,45 +4273,52 @@ const options = [
4254
4273
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().gb),
4255
4274
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagGb */ .eP,
4256
4275
  label: "English (GB)",
4276
+ name: "English (GB)",
4257
4277
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.EN_GB
4258
4278
  },
4259
4279
  {
4260
4280
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().us),
4261
4281
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagUs */ .YK,
4262
4282
  label: "English (US)",
4283
+ name: "English (US)",
4263
4284
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.EN_US
4264
4285
  },
4265
4286
  {
4266
4287
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().fa),
4267
4288
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagFa */ .$M,
4268
4289
  label: "فارسی",
4290
+ name: "Persian",
4269
4291
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.FA_IR
4270
4292
  },
4271
4293
  {
4272
4294
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().fr),
4273
4295
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagFr */ .OV,
4274
4296
  label: "Fran\xe7ais",
4297
+ name: "French",
4275
4298
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.FR_FR
4276
4299
  },
4277
4300
  {
4278
4301
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().de),
4279
4302
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagDe */ .rV,
4280
4303
  label: "Deutsch",
4304
+ name: "German",
4281
4305
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.DE_DE
4282
4306
  },
4283
4307
  {
4284
4308
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().pl),
4285
4309
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagPl */ .fd,
4286
4310
  label: "Polski",
4311
+ name: "Polish",
4287
4312
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.PL_PL
4288
4313
  },
4289
4314
  {
4290
4315
  className: (_LocaleSetting_module_scss__WEBPACK_IMPORTED_MODULE_2___default().es),
4291
4316
  Icon: icons__WEBPACK_IMPORTED_MODULE_1__/* .FlagEs */ .d,
4292
4317
  label: "Espa\xf1ol",
4318
+ name: "Spanish",
4293
4319
  value: _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_0__.Locale.ES_ES
4294
4320
  },
4295
- ];
4321
+ ].sort((a, b)=>a.name.localeCompare(b.name));
4296
4322
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (options);
4297
4323
 
4298
4324
 
@@ -29,6 +29,7 @@ exports.CONSONANTS = [
29
29
  'm',
30
30
  'n',
31
31
  'ń',
32
+ 'ñ',
32
33
  'p',
33
34
  'q',
34
35
  'r',
@@ -1 +1 @@
1
- self.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-c67a75d1b6f99dc8.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:["static/vscqn7BEtAxJteWSwNnas/_buildManifest.js","static/vscqn7BEtAxJteWSwNnas/_ssgManifest.js"],rootMainFiles:[],pages:{"/":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/chunks/546-447e243fc9de2c59.js","static/css/a6154e4ca046ca13.css","static/chunks/368-d423e70be6c0c473.js","static/css/6b1833fd19d3a74a.css","static/chunks/pages/index-8af7a9d7a2cd98a7.js"],"/404":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/chunks/546-447e243fc9de2c59.js","static/css/a6154e4ca046ca13.css","static/chunks/368-d423e70be6c0c473.js","static/chunks/pages/404-932294135c3206dd.js"],"/_app":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/css/bad53af6f8616677.css","static/chunks/pages/_app-3f5508a5f544d9eb.js"],"/_error":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/chunks/pages/_error-a4ba2246ff8fb532.js"]},ampFirstPages:[]};
1
+ self.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-c67a75d1b6f99dc8.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:["static/hf94cues-LcXZRCpAzQ6w/_buildManifest.js","static/hf94cues-LcXZRCpAzQ6w/_ssgManifest.js"],rootMainFiles:[],pages:{"/":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/chunks/546-447e243fc9de2c59.js","static/css/a6154e4ca046ca13.css","static/chunks/368-8b386c3106556f62.js","static/css/6b1833fd19d3a74a.css","static/chunks/pages/index-8af7a9d7a2cd98a7.js"],"/404":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/chunks/546-447e243fc9de2c59.js","static/css/a6154e4ca046ca13.css","static/chunks/368-8b386c3106556f62.js","static/chunks/pages/404-932294135c3206dd.js"],"/_app":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/css/bad53af6f8616677.css","static/chunks/pages/_app-8f0df20f771045ed.js"],"/_error":["static/chunks/webpack-5752944655d749a0.js","static/chunks/framework-4556c45dd113b893.js","static/chunks/main-a75cf611e061d8f8.js","static/chunks/pages/_error-a4ba2246ff8fb532.js"]},ampFirstPages:[]};
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en"><head><title>Scrabble Solver 2 by Kamil Mielnik</title><meta charSet="utf-8"/><meta name="author" content="Kamil Mielnik"/><meta name="description" content="Scrabble Solver 2 - Free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish."/><meta name="keywords" content="Scrabble,Solver,Open-source,Finder,Cheating,Literaki,Word,English,Français,Deutsch,Polski,Español,SOWPODS,TWL06,SJP,FISE-2017,FISE-2,CNRTL,Kamil Mielnik"/><meta name="robots" content="index, follow, notranslate, noimageindex"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="Scrabble Solver 2 - Free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish."/><meta property="og:type" content="website"/><meta property="og:url" content="https://scrabble-solver.org"/><meta property="og:image" content="https://scrabble-solver.org/og.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="Scrabble Solver 2 - Free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish."/><meta name="next-head-count" content="15"/><link crossorigin="anonymous" href="https://fonts.gstatic.com" rel="preconnect"/><link rel="apple-touch-icon-precomposed" sizes="57x57" href="icons/apple-touch-icon-57x57.png"/><link rel="apple-touch-icon-precomposed" sizes="114x114" href="icons/apple-touch-icon-114x114.png"/><link rel="apple-touch-icon-precomposed" sizes="72x72" href="icons/apple-touch-icon-72x72.png"/><link rel="apple-touch-icon-precomposed" sizes="144x144" href="icons/apple-touch-icon-144x144.png"/><link rel="apple-touch-icon-precomposed" sizes="60x60" href="icons/apple-touch-icon-60x60.png"/><link rel="apple-touch-icon-precomposed" sizes="120x120" href="icons/apple-touch-icon-120x120.png"/><link rel="apple-touch-icon-precomposed" sizes="76x76" href="icons/apple-touch-icon-76x76.png"/><link rel="apple-touch-icon-precomposed" sizes="152x152" href="icons/apple-touch-icon-152x152.png"/><link rel="icon" type="image/png" href="icons/favicon-196x196.png" sizes="196x196"/><link rel="icon" type="image/png" href="icons/favicon-96x96.png" sizes="96x96"/><link rel="icon" type="image/png" href="icons/favicon-32x32.png" sizes="32x32"/><link rel="icon" type="image/png" href="icons/favicon-16x16.png" sizes="16x16"/><link rel="icon" type="image/png" href="icons/favicon-128.png" sizes="128x128"/><meta name="application-name" content="Scrabble Solver"/><meta name="msapplication-TileColor" content="#EFE3AE"/><meta name="msapplication-TileImage" content="icons/mstile-144x144.png"/><meta name="msapplication-square70x70logo" content="icons/mstile-70x70.png"/><meta name="msapplication-square150x150logo" content="icons/mstile-150x150.png"/><meta name="msapplication-wide310x150logo" content="icons/mstile-310x150.png"/><meta name="msapplication-square310x310logo" content="icons/mstile-310x310.png"/><link rel="preload" href="/_next/static/css/bad53af6f8616677.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bad53af6f8616677.css" data-n-g=""/><link rel="preload" href="/_next/static/css/a6154e4ca046ca13.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a6154e4ca046ca13.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-5752944655d749a0.js" defer=""></script><script src="/_next/static/chunks/framework-4556c45dd113b893.js" defer=""></script><script src="/_next/static/chunks/main-a75cf611e061d8f8.js" defer=""></script><script src="/_next/static/chunks/pages/_app-3f5508a5f544d9eb.js" defer=""></script><script src="/_next/static/chunks/546-447e243fc9de2c59.js" defer=""></script><script src="/_next/static/chunks/368-d423e70be6c0c473.js" defer=""></script><script src="/_next/static/chunks/pages/404-932294135c3206dd.js" defer=""></script><script src="/_next/static/vscqn7BEtAxJteWSwNnas/_buildManifest.js" defer=""></script><script src="/_next/static/vscqn7BEtAxJteWSwNnas/_ssgManifest.js" defer=""></script></head><body><div id="__next"><p style="font-size:0">Scrabble Solver 2 is a free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish. Source code is available on GitHub - contributions are welcome!</p><div class="NotFound_notFound__yhPFA"><a class="NotFound_link__a1OqI" href="/"><svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" role="img" class="NotFound_icon__zBP4O"><path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM4.5 7.5a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1h-7z" fill="currentColor"></path></svg><svg class="NotFound_tiles__Nxd8Z" viewBox="0 0 682 80" xmlns="http://www.w3.org/2000/svg"><style type="text/css">@import url('https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&family=Open+Sans:wght@400;700&family=Vazirmatn:wght@300;400;700&family=Roboto+Mono&display=swap');
1
+ <!DOCTYPE html><html lang="en"><head><title>Scrabble Solver 2 by Kamil Mielnik</title><meta charSet="utf-8"/><meta name="author" content="Kamil Mielnik"/><meta name="description" content="Scrabble Solver 2 - Free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish."/><meta name="keywords" content="Scrabble,Solver,Open-source,Finder,Cheating,Literaki,Word,English,Français,Deutsch,Polski,Español,SOWPODS,TWL06,SJP,FISE-2017,FISE-2,CNRTL,Kamil Mielnik"/><meta name="robots" content="index, follow, notranslate, noimageindex"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="Scrabble Solver 2 - Free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish."/><meta property="og:type" content="website"/><meta property="og:url" content="https://scrabble-solver.org"/><meta property="og:image" content="https://scrabble-solver.org/og.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="Scrabble Solver 2 - Free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish."/><meta name="next-head-count" content="15"/><link crossorigin="anonymous" href="https://fonts.gstatic.com" rel="preconnect"/><link rel="apple-touch-icon-precomposed" sizes="57x57" href="icons/apple-touch-icon-57x57.png"/><link rel="apple-touch-icon-precomposed" sizes="114x114" href="icons/apple-touch-icon-114x114.png"/><link rel="apple-touch-icon-precomposed" sizes="72x72" href="icons/apple-touch-icon-72x72.png"/><link rel="apple-touch-icon-precomposed" sizes="144x144" href="icons/apple-touch-icon-144x144.png"/><link rel="apple-touch-icon-precomposed" sizes="60x60" href="icons/apple-touch-icon-60x60.png"/><link rel="apple-touch-icon-precomposed" sizes="120x120" href="icons/apple-touch-icon-120x120.png"/><link rel="apple-touch-icon-precomposed" sizes="76x76" href="icons/apple-touch-icon-76x76.png"/><link rel="apple-touch-icon-precomposed" sizes="152x152" href="icons/apple-touch-icon-152x152.png"/><link rel="icon" type="image/png" href="icons/favicon-196x196.png" sizes="196x196"/><link rel="icon" type="image/png" href="icons/favicon-96x96.png" sizes="96x96"/><link rel="icon" type="image/png" href="icons/favicon-32x32.png" sizes="32x32"/><link rel="icon" type="image/png" href="icons/favicon-16x16.png" sizes="16x16"/><link rel="icon" type="image/png" href="icons/favicon-128.png" sizes="128x128"/><meta name="application-name" content="Scrabble Solver"/><meta name="msapplication-TileColor" content="#EFE3AE"/><meta name="msapplication-TileImage" content="icons/mstile-144x144.png"/><meta name="msapplication-square70x70logo" content="icons/mstile-70x70.png"/><meta name="msapplication-square150x150logo" content="icons/mstile-150x150.png"/><meta name="msapplication-wide310x150logo" content="icons/mstile-310x150.png"/><meta name="msapplication-square310x310logo" content="icons/mstile-310x310.png"/><link rel="preload" href="/_next/static/css/bad53af6f8616677.css" as="style"/><link rel="stylesheet" href="/_next/static/css/bad53af6f8616677.css" data-n-g=""/><link rel="preload" href="/_next/static/css/a6154e4ca046ca13.css" as="style"/><link rel="stylesheet" href="/_next/static/css/a6154e4ca046ca13.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-5752944655d749a0.js" defer=""></script><script src="/_next/static/chunks/framework-4556c45dd113b893.js" defer=""></script><script src="/_next/static/chunks/main-a75cf611e061d8f8.js" defer=""></script><script src="/_next/static/chunks/pages/_app-8f0df20f771045ed.js" defer=""></script><script src="/_next/static/chunks/546-447e243fc9de2c59.js" defer=""></script><script src="/_next/static/chunks/368-8b386c3106556f62.js" defer=""></script><script src="/_next/static/chunks/pages/404-932294135c3206dd.js" defer=""></script><script src="/_next/static/hf94cues-LcXZRCpAzQ6w/_buildManifest.js" defer=""></script><script src="/_next/static/hf94cues-LcXZRCpAzQ6w/_ssgManifest.js" defer=""></script></head><body><div id="__next"><p style="font-size:0">Scrabble Solver 2 is a free and open-source analysis tool for Scrabble and Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Polish &amp; Spanish. Source code is available on GitHub - contributions are welcome!</p><div class="NotFound_notFound__yhPFA"><a class="NotFound_link__a1OqI" href="/"><svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" role="img" class="NotFound_icon__zBP4O"><path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM4.5 7.5a.5.5 0 0 0 0 1h7a.5.5 0 0 0 0-1h-7z" fill="currentColor"></path></svg><svg class="NotFound_tiles__Nxd8Z" viewBox="0 0 682 80" xmlns="http://www.w3.org/2000/svg"><style type="text/css">@import url('https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&family=Open+Sans:wght@400;700&family=Vazirmatn:wght@300;400;700&family=Roboto+Mono&display=swap');
2
2
 
3
3
  text {
4
4
  font-family: 'Open Sans';
5
- }</style><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 40, 40)"><rect fill="#f7c2aa" height="80" width="80" x="0" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="40" y="40">H</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 126, 40)"><rect fill="#efe3ae" height="80" width="80" x="86" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="126" y="40">T</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 212, 40)"><rect fill="#efe3ae" height="80" width="80" x="172" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="212" y="40">T</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 298, 40)"><rect fill="#c7d8f9" height="80" width="80" x="258" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="298" y="40">P</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 470, 40)"><rect fill="#bae3ba" height="80" width="80" x="430" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="470" y="40">4</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 556, 40)"><rect fill="#bae3ba" height="80" width="80" x="516" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="556" y="40">0</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 642, 40)"><rect fill="#bae3ba" height="80" width="80" x="602" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="642" y="40">4</text></g></svg></a></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"vscqn7BEtAxJteWSwNnas","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
5
+ }</style><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 40, 40)"><rect fill="#f7c2aa" height="80" width="80" x="0" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="40" y="40">H</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 126, 40)"><rect fill="#efe3ae" height="80" width="80" x="86" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="126" y="40">T</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 212, 40)"><rect fill="#efe3ae" height="80" width="80" x="172" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="212" y="40">T</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 298, 40)"><rect fill="#c7d8f9" height="80" width="80" x="258" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="298" y="40">P</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 470, 40)"><rect fill="#bae3ba" height="80" width="80" x="430" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="470" y="40">4</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 556, 40)"><rect fill="#bae3ba" height="80" width="80" x="516" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="556" y="40">0</text></g><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 642, 40)"><rect fill="#bae3ba" height="80" width="80" x="602" y="0"></rect><text dominant-baseline="central" font-family="Open Sans" font-size="48" font-weight="bold" text-anchor="middle" x="642" y="40">4</text></g></svg></a></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"hf94cues-LcXZRCpAzQ6w","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>