@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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +5 -5
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/eslint/.cache_8dgz12 +1 -1
- package/.next/cache/next-server.js.nft.json +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/413.js +49 -31
- package/.next/server/chunks/515.js +97 -71
- package/.next/server/chunks/939.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/404.js.nft.json +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/dictionary/[locale]/[word].js +1 -1
- package/.next/server/pages/api/solve.js +20 -23
- package/.next/server/pages/index.html +2 -2
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/index.json +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/static/chunks/368-8b386c3106556f62.js +1 -0
- package/.next/static/chunks/pages/_app-8f0df20f771045ed.js +1 -0
- package/.next/static/hf94cues-LcXZRCpAzQ6w/_buildManifest.js +1 -0
- package/.next/static/{vscqn7BEtAxJteWSwNnas → hf94cues-LcXZRCpAzQ6w}/_ssgManifest.js +0 -0
- package/.next/trace +52 -52
- package/package.json +9 -9
- package/src/components/Board/hooks/useGrid.ts +6 -6
- package/src/components/Rack/Rack.tsx +16 -4
- package/src/components/Results/Results.tsx +2 -2
- package/src/components/Settings/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +2 -2
- package/src/components/Settings/components/LocaleSetting/options.ts +9 -1
- package/src/i18n/fr.json +1 -1
- package/src/lib/getRemainingTilesGroups.ts +24 -26
- package/src/sdk/findWordDefinitions.ts +1 -1
- package/src/state/sagas.ts +19 -5
- package/src/state/selectors.ts +10 -2
- package/.next/static/chunks/368-d423e70be6c0c473.js +0 -1
- package/.next/static/chunks/pages/_app-3f5508a5f544d9eb.js +0 -1
- 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
|
|
1009
|
-
/* harmony import */ var
|
|
1010
|
-
/* harmony import */ var
|
|
1011
|
-
var
|
|
1012
|
-
|
|
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,
|
|
1027
|
-
const
|
|
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,
|
|
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,
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
1196
|
+
const value = (0,lib__WEBPACK_IMPORTED_MODULE_6__/* .extractInputValue */ .WM)(event.target);
|
|
1194
1197
|
if (!value) {
|
|
1195
|
-
dispatch(
|
|
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(
|
|
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,
|
|
1228
|
+
return (0,lib__WEBPACK_IMPORTED_MODULE_6__/* .createKeyboardNavigation */ .np)({
|
|
1226
1229
|
onArrowDown: (event)=>{
|
|
1227
1230
|
event.preventDefault();
|
|
1228
|
-
if ((0,
|
|
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,
|
|
1239
|
+
if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event)) {
|
|
1237
1240
|
onDirectionToggle();
|
|
1238
1241
|
} else {
|
|
1239
|
-
|
|
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,
|
|
1247
|
+
if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event)) {
|
|
1246
1248
|
onDirectionToggle();
|
|
1247
1249
|
} else {
|
|
1248
|
-
|
|
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,
|
|
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(
|
|
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(
|
|
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,
|
|
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(
|
|
1296
|
+
dispatch(state__WEBPACK_IMPORTED_MODULE_7__/* .boardSlice.actions.toggleCellIsBlank */ .I8.actions.toggleCellIsBlank(position));
|
|
1296
1297
|
return;
|
|
1297
1298
|
}
|
|
1298
|
-
if ((0,
|
|
1299
|
+
if ((0,lib__WEBPACK_IMPORTED_MODULE_6__/* .isCtrl */ .yl)(event) && twoCharacterTile) {
|
|
1299
1300
|
event.preventDefault();
|
|
1300
|
-
dispatch(
|
|
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(
|
|
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(
|
|
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
|
|
2808
|
-
/* harmony import */ var
|
|
2809
|
-
/* harmony import */ var
|
|
2810
|
-
/* harmony import */ var
|
|
2811
|
-
/* harmony import */ var
|
|
2812
|
-
var
|
|
2813
|
-
|
|
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,
|
|
2825
|
-
const
|
|
2826
|
-
const
|
|
2827
|
-
const
|
|
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,
|
|
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,
|
|
2850
|
-
const characters = value ? (0,
|
|
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,
|
|
2869
|
+
const characters = value ? (0,lib__WEBPACK_IMPORTED_MODULE_5__/* .extractCharacters */ .nK)(config, value) : [];
|
|
2864
2870
|
changeActiveIndex(value ? characters.length : -1);
|
|
2865
|
-
dispatch(
|
|
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,
|
|
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,
|
|
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()((
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-c67a75d1b6f99dc8.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:["static/
|
|
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 & 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 & 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 & 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-
|
|
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 & 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 & 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 & 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 & 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":"
|
|
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>
|