@scrabble-solver/scrabble-solver 2.11.4 → 2.11.6
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 +7 -7
- 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/export-marker.json +1 -1
- 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/131.js +1 -1
- package/.next/server/chunks/277.js +851 -1179
- package/.next/server/chunks/636.js +286 -0
- package/.next/server/chunks/675.js +550 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -5
- package/.next/server/pages/404.js.nft.json +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_app.js +73 -9
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +1 -280
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/solve.js +22 -2
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/index.js +381 -314
- 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/Jmk00rVXCbdjFgP77tKXQ/_buildManifest.js +1 -0
- package/.next/static/chunks/pages/{404-448ba28510855455.js → 404-8176f4acd0cfeb42.js} +1 -1
- package/.next/static/chunks/pages/_app-b4fa92112b8f0385.js +28 -0
- package/.next/static/chunks/pages/index-ccd762f8f5028729.js +1 -0
- package/.next/static/css/1cd302e7648d209c.css +2 -0
- package/.next/static/css/34adfcf12a7d9bb6.css +1 -0
- package/.next/trace +50 -53
- package/next.config.js +1 -0
- package/package.json +12 -13
- package/src/@types/svg.d.ts +1 -1
- package/src/components/Board/Board.tsx +48 -44
- package/src/components/Board/components/Actions/Actions.tsx +4 -2
- package/src/components/Board/components/Cell/Cell.module.scss +59 -5
- package/src/components/Board/hooks/useGrid.ts +5 -3
- package/src/components/Button/Button.module.scss +1 -1
- package/src/components/Dictionary/Dictionary.module.scss +0 -1
- package/src/components/EmptyState/EmptyState.module.scss +0 -1
- package/src/components/Key/Key.module.scss +1 -1
- package/src/components/Loading/Loading.module.scss +1 -1
- package/src/components/Loading/Loading.tsx +1 -1
- package/src/components/Logo/Logo.tsx +10 -12
- package/src/components/Logo/LogoBlueprint.tsx +21 -0
- package/src/components/Logo/index.ts +1 -1
- package/src/components/Modal/Modal.module.scss +1 -6
- package/src/components/Modal/Modal.tsx +15 -8
- package/src/components/NavButtons/NavButtons.tsx +2 -2
- package/src/components/PlainTiles/PlainTiles.tsx +0 -10
- package/src/components/PlainTiles/Tile.tsx +1 -4
- package/src/components/Rack/Rack.module.scss +59 -0
- package/src/components/Results/HeaderButton.tsx +6 -6
- package/src/components/Results/Results.module.scss +3 -1
- package/src/components/Results/Results.tsx +7 -7
- package/src/components/Results/useColumns.ts +2 -5
- package/src/components/Solver/Solver.tsx +6 -23
- package/src/components/Tile/Tile.module.scss +2 -1
- package/src/components/Tile/Tile.tsx +8 -4
- package/src/components/index.ts +0 -5
- package/src/hooks/index.ts +6 -0
- package/src/hooks/useAppLayout.ts +62 -12
- package/src/hooks/useDirection.ts +2 -2
- package/src/hooks/useEffectOnce.ts +5 -0
- package/src/hooks/useIsTouchDevice.ts +1 -1
- package/src/hooks/useLanguage.ts +2 -2
- package/src/hooks/useLatest.ts +13 -0
- package/src/hooks/useLocalStorage.ts +51 -0
- package/src/hooks/useMedia.ts +36 -0
- package/src/hooks/useMediaQueries.ts +13 -0
- package/src/hooks/useMediaQuery.ts +2 -1
- package/src/hooks/useOnWindowResize.ts +13 -0
- package/src/hooks/useViewportSize.ts +19 -0
- package/src/i18n/constants.ts +14 -22
- package/src/lib/arrayEquals.ts +5 -0
- package/src/lib/index.ts +1 -0
- package/src/lib/zipCharactersAndTiles.ts +3 -1
- package/src/modals/DictionaryModal/DictionaryModal.tsx +2 -2
- package/src/modals/KeyMapModal/KeyMapModal.tsx +2 -2
- package/src/modals/KeyMapModal/components/Mapping/Mapping.module.scss +0 -1
- package/src/modals/KeyMapModal/keys.tsx +0 -2
- package/src/modals/MenuModal/MenuModal.module.scss +28 -4
- package/src/modals/MenuModal/MenuModal.tsx +4 -4
- package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +2 -2
- package/src/modals/ResultsModal/ResultsModal.module.scss +1 -5
- package/src/modals/ResultsModal/ResultsModal.tsx +10 -2
- package/src/modals/SettingsModal/SettingsModal.tsx +2 -2
- package/src/modals/SettingsModal/components/AutoGroupTilesSetting/lib.ts +3 -1
- package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.module.scss +0 -1
- package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.module.scss +1 -6
- package/src/modals/WordsModal/WordsModal.tsx +2 -2
- package/src/pages/index.module.scss +3 -21
- package/src/pages/index.tsx +51 -69
- package/src/parameters/index.ts +29 -2
- package/src/state/localStorage.ts +13 -2
- package/src/state/sagas.ts +16 -8
- package/src/state/slices/boardInitialState.ts +5 -1
- package/src/state/slices/boardSlice.ts +2 -2
- package/src/state/slices/rackInitialState.ts +8 -2
- package/src/state/slices/rackSlice.ts +16 -13
- package/src/state/slices/settingsInitialState.ts +9 -4
- package/src/state/slices/settingsSlice.ts +3 -1
- package/src/styles/animations.scss +0 -20
- package/src/styles/global.scss +4 -15
- package/src/styles/mixins.scss +0 -60
- package/src/styles/variables.scss +14 -5
- package/src/types/index.ts +4 -0
- package/.next/static/MvHZRF4XuJ7g8LLLRkf8U/_buildManifest.js +0 -1
- package/.next/static/chunks/pages/_app-66d80a5594aab8dc.js +0 -28
- package/.next/static/chunks/pages/index-0858deea02b2a417.js +0 -1
- package/.next/static/css/885da289cec275b3.css +0 -1
- package/.next/static/css/ea1c8134fe9a143e.css +0 -2
- package/src/components/LogoSplashScreen/LogoSplashScreen.module.scss +0 -65
- package/src/components/LogoSplashScreen/LogoSplashScreen.tsx +0 -31
- package/src/components/LogoSplashScreen/index.ts +0 -1
- package/src/components/Sizer/Sizer.module.scss +0 -10
- package/src/components/Sizer/Sizer.tsx +0 -10
- package/src/components/Sizer/index.ts +0 -1
- package/src/components/SplashScreen/SplashScreen.module.scss +0 -14
- package/src/components/SplashScreen/SplashScreen.tsx +0 -19
- package/src/components/SplashScreen/index.ts +0 -1
- package/src/components/SvgFontCss/SvgFontCss.tsx +0 -14
- package/src/components/SvgFontCss/createCss.ts +0 -11
- package/src/components/SvgFontCss/createStyle.ts +0 -9
- package/src/components/SvgFontCss/createSvg.ts +0 -10
- package/src/components/SvgFontCss/index.ts +0 -1
- package/src/components/SvgFontFix/SvgFontFix.module.scss +0 -5
- package/src/components/SvgFontFix/SvgFontFix.tsx +0 -21
- package/src/components/SvgFontFix/index.ts +0 -1
- package/src/hooks/useLocalStorage/index.ts +0 -1
- package/src/hooks/useLocalStorage/useLocalStorage.ts +0 -13
- package/src/hooks/useLocalStorage/useLocalStorageBoard.ts +0 -29
- package/src/hooks/useLocalStorage/useLocalStorageConfigId.ts +0 -29
- package/src/hooks/useLocalStorage/useLocalStorageLocale.ts +0 -32
- package/src/hooks/useLocalStorage/useLocalStorageRack.ts +0 -29
- /package/.next/static/{MvHZRF4XuJ7g8LLLRkf8U → Jmk00rVXCbdjFgP77tKXQ}/_ssgManifest.js +0 -0
- /package/{src/components/Logo/Logo.svg → public/logo.svg} +0 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
exports.id = 675;
|
|
2
|
+
exports.ids = [675];
|
|
3
|
+
exports.modules = {
|
|
4
|
+
|
|
5
|
+
/***/ 17273:
|
|
6
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
7
|
+
|
|
8
|
+
"use strict";
|
|
9
|
+
var __webpack_unused_export__;
|
|
10
|
+
|
|
11
|
+
__webpack_unused_export__ = ({
|
|
12
|
+
value: true
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(exports, "Z", ({
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function() {
|
|
17
|
+
return _objectWithoutPropertiesLoose;
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
21
|
+
if (source == null) return {};
|
|
22
|
+
var target = {};
|
|
23
|
+
var sourceKeys = Object.keys(source);
|
|
24
|
+
var key, i;
|
|
25
|
+
for(i = 0; i < sourceKeys.length; i++){
|
|
26
|
+
key = sourceKeys[i];
|
|
27
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
28
|
+
target[key] = source[key];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
/***/ }),
|
|
35
|
+
|
|
36
|
+
/***/ 93740:
|
|
37
|
+
/***/ ((module, exports, __webpack_require__) => {
|
|
38
|
+
|
|
39
|
+
"use strict";
|
|
40
|
+
|
|
41
|
+
"use client";
|
|
42
|
+
Object.defineProperty(exports, "__esModule", ({
|
|
43
|
+
value: true
|
|
44
|
+
}));
|
|
45
|
+
exports["default"] = void 0;
|
|
46
|
+
var _extends = (__webpack_require__(6495)/* ["default"] */ .Z);
|
|
47
|
+
var _interop_require_default = (__webpack_require__(92648)/* ["default"] */ .Z);
|
|
48
|
+
var _interop_require_wildcard = (__webpack_require__(91598)/* ["default"] */ .Z);
|
|
49
|
+
var _object_without_properties_loose = (__webpack_require__(17273)/* ["default"] */ .Z);
|
|
50
|
+
var _react = _interop_require_wildcard(__webpack_require__(16689));
|
|
51
|
+
var _head = _interop_require_default(__webpack_require__(42636));
|
|
52
|
+
var _imageBlurSvg = __webpack_require__(64486);
|
|
53
|
+
var _imageConfig = __webpack_require__(35843);
|
|
54
|
+
var _imageConfigContext = __webpack_require__(50744);
|
|
55
|
+
var _warnOnce = __webpack_require__(40618);
|
|
56
|
+
var _imageLoader = _interop_require_default(__webpack_require__(99552));
|
|
57
|
+
const configEnv = {"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","dangerouslyAllowSVG":false,"unoptimized":false};
|
|
58
|
+
const allImgs = new Map();
|
|
59
|
+
let perfObserver;
|
|
60
|
+
if (true) {
|
|
61
|
+
globalThis.__NEXT_IMAGE_IMPORTED = true;
|
|
62
|
+
}
|
|
63
|
+
const VALID_LOADING_VALUES = (/* unused pure expression or super */ null && ([
|
|
64
|
+
"lazy",
|
|
65
|
+
"eager",
|
|
66
|
+
undefined
|
|
67
|
+
]));
|
|
68
|
+
function isStaticRequire(src) {
|
|
69
|
+
return src.default !== undefined;
|
|
70
|
+
}
|
|
71
|
+
function isStaticImageData(src) {
|
|
72
|
+
return src.src !== undefined;
|
|
73
|
+
}
|
|
74
|
+
function isStaticImport(src) {
|
|
75
|
+
return typeof src === "object" && (isStaticRequire(src) || isStaticImageData(src));
|
|
76
|
+
}
|
|
77
|
+
function getWidths({ deviceSizes , allSizes }, width, sizes) {
|
|
78
|
+
if (sizes) {
|
|
79
|
+
// Find all the "vw" percent sizes used in the sizes prop
|
|
80
|
+
const viewportWidthRe = /(^|\s)(1?\d?\d)vw/g;
|
|
81
|
+
const percentSizes = [];
|
|
82
|
+
for(let match; match = viewportWidthRe.exec(sizes); match){
|
|
83
|
+
percentSizes.push(parseInt(match[2]));
|
|
84
|
+
}
|
|
85
|
+
if (percentSizes.length) {
|
|
86
|
+
const smallestRatio = Math.min(...percentSizes) * 0.01;
|
|
87
|
+
return {
|
|
88
|
+
widths: allSizes.filter((s)=>s >= deviceSizes[0] * smallestRatio),
|
|
89
|
+
kind: "w"
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
widths: allSizes,
|
|
94
|
+
kind: "w"
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (typeof width !== "number") {
|
|
98
|
+
return {
|
|
99
|
+
widths: deviceSizes,
|
|
100
|
+
kind: "w"
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const widths = [
|
|
104
|
+
...new Set(// > are actually 3x in the green color, but only 1.5x in the red and
|
|
105
|
+
// > blue colors. Showing a 3x resolution image in the app vs a 2x
|
|
106
|
+
// > resolution image will be visually the same, though the 3x image
|
|
107
|
+
// > takes significantly more data. Even true 3x resolution screens are
|
|
108
|
+
// > wasteful as the human eye cannot see that level of detail without
|
|
109
|
+
// > something like a magnifying glass.
|
|
110
|
+
// https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html
|
|
111
|
+
[
|
|
112
|
+
width,
|
|
113
|
+
width * 2 /*, width * 3*/
|
|
114
|
+
].map((w)=>allSizes.find((p)=>p >= w) || allSizes[allSizes.length - 1]))
|
|
115
|
+
];
|
|
116
|
+
return {
|
|
117
|
+
widths,
|
|
118
|
+
kind: "x"
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function generateImgAttrs({ config , src , unoptimized , width , quality , sizes , loader }) {
|
|
122
|
+
if (unoptimized) {
|
|
123
|
+
return {
|
|
124
|
+
src,
|
|
125
|
+
srcSet: undefined,
|
|
126
|
+
sizes: undefined
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const { widths , kind } = getWidths(config, width, sizes);
|
|
130
|
+
const last = widths.length - 1;
|
|
131
|
+
return {
|
|
132
|
+
sizes: !sizes && kind === "w" ? "100vw" : sizes,
|
|
133
|
+
srcSet: widths.map((w, i)=>`${loader({
|
|
134
|
+
config,
|
|
135
|
+
src,
|
|
136
|
+
quality,
|
|
137
|
+
width: w
|
|
138
|
+
})} ${kind === "w" ? w : i + 1}${kind}`).join(", "),
|
|
139
|
+
// It's intended to keep `src` the last attribute because React updates
|
|
140
|
+
// attributes in order. If we keep `src` the first one, Safari will
|
|
141
|
+
// immediately start to fetch `src`, before `sizes` and `srcSet` are even
|
|
142
|
+
// updated by React. That causes multiple unnecessary requests if `srcSet`
|
|
143
|
+
// and `sizes` are defined.
|
|
144
|
+
// This bug cannot be reproduced in Chrome or Firefox.
|
|
145
|
+
src: loader({
|
|
146
|
+
config,
|
|
147
|
+
src,
|
|
148
|
+
quality,
|
|
149
|
+
width: widths[last]
|
|
150
|
+
})
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function getInt(x) {
|
|
154
|
+
if (typeof x === "number" || typeof x === "undefined") {
|
|
155
|
+
return x;
|
|
156
|
+
}
|
|
157
|
+
if (typeof x === "string" && /^[0-9]+$/.test(x)) {
|
|
158
|
+
return parseInt(x, 10);
|
|
159
|
+
}
|
|
160
|
+
return NaN;
|
|
161
|
+
}
|
|
162
|
+
// See https://stackoverflow.com/q/39777833/266535 for why we use this ref
|
|
163
|
+
// handler instead of the img's onLoad attribute.
|
|
164
|
+
function handleLoading(img, src, placeholder, onLoadRef, onLoadingCompleteRef, setBlurComplete, unoptimized) {
|
|
165
|
+
if (!img || img["data-loaded-src"] === src) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
img["data-loaded-src"] = src;
|
|
169
|
+
const p = "decode" in img ? img.decode() : Promise.resolve();
|
|
170
|
+
p.catch(()=>{}).then(()=>{
|
|
171
|
+
if (!img.parentElement || !img.isConnected) {
|
|
172
|
+
// Exit early in case of race condition:
|
|
173
|
+
// - onload() is called
|
|
174
|
+
// - decode() is called but incomplete
|
|
175
|
+
// - unmount is called
|
|
176
|
+
// - decode() completes
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (placeholder === "blur") {
|
|
180
|
+
setBlurComplete(true);
|
|
181
|
+
}
|
|
182
|
+
if (onLoadRef == null ? void 0 : onLoadRef.current) {
|
|
183
|
+
// Since we don't have the SyntheticEvent here,
|
|
184
|
+
// we must create one with the same shape.
|
|
185
|
+
// See https://reactjs.org/docs/events.html
|
|
186
|
+
const event = new Event("load");
|
|
187
|
+
Object.defineProperty(event, "target", {
|
|
188
|
+
writable: false,
|
|
189
|
+
value: img
|
|
190
|
+
});
|
|
191
|
+
let prevented = false;
|
|
192
|
+
let stopped = false;
|
|
193
|
+
onLoadRef.current(_extends({}, event, {
|
|
194
|
+
nativeEvent: event,
|
|
195
|
+
currentTarget: img,
|
|
196
|
+
target: img,
|
|
197
|
+
isDefaultPrevented: ()=>prevented,
|
|
198
|
+
isPropagationStopped: ()=>stopped,
|
|
199
|
+
persist: ()=>{},
|
|
200
|
+
preventDefault: ()=>{
|
|
201
|
+
prevented = true;
|
|
202
|
+
event.preventDefault();
|
|
203
|
+
},
|
|
204
|
+
stopPropagation: ()=>{
|
|
205
|
+
stopped = true;
|
|
206
|
+
event.stopPropagation();
|
|
207
|
+
}
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
if (onLoadingCompleteRef == null ? void 0 : onLoadingCompleteRef.current) {
|
|
211
|
+
onLoadingCompleteRef.current(img);
|
|
212
|
+
}
|
|
213
|
+
if (false) {}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const ImageElement = /*#__PURE__*/ (0, _react).forwardRef((_param, forwardedRef)=>{
|
|
217
|
+
var { imgAttributes , heightInt , widthInt , qualityInt , className , imgStyle , blurStyle , isLazy , fill , placeholder , loading , srcString , config , unoptimized , loader , onLoadRef , onLoadingCompleteRef , setBlurComplete , setShowAltText , onLoad , onError } = _param, rest = _object_without_properties_loose(_param, [
|
|
218
|
+
"imgAttributes",
|
|
219
|
+
"heightInt",
|
|
220
|
+
"widthInt",
|
|
221
|
+
"qualityInt",
|
|
222
|
+
"className",
|
|
223
|
+
"imgStyle",
|
|
224
|
+
"blurStyle",
|
|
225
|
+
"isLazy",
|
|
226
|
+
"fill",
|
|
227
|
+
"placeholder",
|
|
228
|
+
"loading",
|
|
229
|
+
"srcString",
|
|
230
|
+
"config",
|
|
231
|
+
"unoptimized",
|
|
232
|
+
"loader",
|
|
233
|
+
"onLoadRef",
|
|
234
|
+
"onLoadingCompleteRef",
|
|
235
|
+
"setBlurComplete",
|
|
236
|
+
"setShowAltText",
|
|
237
|
+
"onLoad",
|
|
238
|
+
"onError"
|
|
239
|
+
]);
|
|
240
|
+
loading = isLazy ? "lazy" : loading;
|
|
241
|
+
return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement("img", Object.assign({}, rest, {
|
|
242
|
+
// @ts-ignore - TODO: upgrade to `@types/react@17`
|
|
243
|
+
loading: loading,
|
|
244
|
+
width: widthInt,
|
|
245
|
+
height: heightInt,
|
|
246
|
+
decoding: "async",
|
|
247
|
+
"data-nimg": fill ? "fill" : "1",
|
|
248
|
+
className: className,
|
|
249
|
+
style: _extends({}, imgStyle, blurStyle)
|
|
250
|
+
}, imgAttributes, {
|
|
251
|
+
ref: (0, _react).useCallback((img)=>{
|
|
252
|
+
if (forwardedRef) {
|
|
253
|
+
if (typeof forwardedRef === "function") forwardedRef(img);
|
|
254
|
+
else if (typeof forwardedRef === "object") {
|
|
255
|
+
// @ts-ignore - .current is read only it's usually assigned by react internally
|
|
256
|
+
forwardedRef.current = img;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (!img) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (onError) {
|
|
263
|
+
// If the image has an error before react hydrates, then the error is lost.
|
|
264
|
+
// The workaround is to wait until the image is mounted which is after hydration,
|
|
265
|
+
// then we set the src again to trigger the error handler (if there was an error).
|
|
266
|
+
// eslint-disable-next-line no-self-assign
|
|
267
|
+
img.src = img.src;
|
|
268
|
+
}
|
|
269
|
+
if (false) {}
|
|
270
|
+
if (img.complete) {
|
|
271
|
+
handleLoading(img, srcString, placeholder, onLoadRef, onLoadingCompleteRef, setBlurComplete, unoptimized);
|
|
272
|
+
}
|
|
273
|
+
}, [
|
|
274
|
+
srcString,
|
|
275
|
+
placeholder,
|
|
276
|
+
onLoadRef,
|
|
277
|
+
onLoadingCompleteRef,
|
|
278
|
+
setBlurComplete,
|
|
279
|
+
onError,
|
|
280
|
+
unoptimized,
|
|
281
|
+
forwardedRef
|
|
282
|
+
]),
|
|
283
|
+
onLoad: (event)=>{
|
|
284
|
+
const img = event.currentTarget;
|
|
285
|
+
handleLoading(img, srcString, placeholder, onLoadRef, onLoadingCompleteRef, setBlurComplete, unoptimized);
|
|
286
|
+
},
|
|
287
|
+
onError: (event)=>{
|
|
288
|
+
// if the real image fails to load, this will ensure "alt" is visible
|
|
289
|
+
setShowAltText(true);
|
|
290
|
+
if (placeholder === "blur") {
|
|
291
|
+
// If the real image fails to load, this will still remove the placeholder.
|
|
292
|
+
setBlurComplete(true);
|
|
293
|
+
}
|
|
294
|
+
if (onError) {
|
|
295
|
+
onError(event);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
})));
|
|
299
|
+
});
|
|
300
|
+
const Image = /*#__PURE__*/ (0, _react).forwardRef((_param, forwardedRef)=>{
|
|
301
|
+
var { src , sizes , unoptimized =false , priority =false , loading , className , quality , width , height , fill , style , onLoad , onLoadingComplete , placeholder ="empty" , blurDataURL , layout , objectFit , objectPosition , lazyBoundary , lazyRoot } = _param, all = _object_without_properties_loose(_param, [
|
|
302
|
+
"src",
|
|
303
|
+
"sizes",
|
|
304
|
+
"unoptimized",
|
|
305
|
+
"priority",
|
|
306
|
+
"loading",
|
|
307
|
+
"className",
|
|
308
|
+
"quality",
|
|
309
|
+
"width",
|
|
310
|
+
"height",
|
|
311
|
+
"fill",
|
|
312
|
+
"style",
|
|
313
|
+
"onLoad",
|
|
314
|
+
"onLoadingComplete",
|
|
315
|
+
"placeholder",
|
|
316
|
+
"blurDataURL",
|
|
317
|
+
"layout",
|
|
318
|
+
"objectFit",
|
|
319
|
+
"objectPosition",
|
|
320
|
+
"lazyBoundary",
|
|
321
|
+
"lazyRoot"
|
|
322
|
+
]);
|
|
323
|
+
const configContext = (0, _react).useContext(_imageConfigContext.ImageConfigContext);
|
|
324
|
+
const config = (0, _react).useMemo(()=>{
|
|
325
|
+
const c = configEnv || configContext || _imageConfig.imageConfigDefault;
|
|
326
|
+
const allSizes = [
|
|
327
|
+
...c.deviceSizes,
|
|
328
|
+
...c.imageSizes
|
|
329
|
+
].sort((a, b)=>a - b);
|
|
330
|
+
const deviceSizes = c.deviceSizes.sort((a, b)=>a - b);
|
|
331
|
+
return _extends({}, c, {
|
|
332
|
+
allSizes,
|
|
333
|
+
deviceSizes
|
|
334
|
+
});
|
|
335
|
+
}, [
|
|
336
|
+
configContext
|
|
337
|
+
]);
|
|
338
|
+
let rest = all;
|
|
339
|
+
let loader = rest.loader || _imageLoader.default;
|
|
340
|
+
// Remove property so it's not spread on <img> element
|
|
341
|
+
delete rest.loader;
|
|
342
|
+
// This special value indicates that the user
|
|
343
|
+
// didn't define a "loader" prop or "loader" config.
|
|
344
|
+
const isDefaultLoader = "__next_img_default" in loader;
|
|
345
|
+
if (isDefaultLoader) {
|
|
346
|
+
if (config.loader === "custom") {
|
|
347
|
+
throw new Error(`Image with src "${src}" is missing "loader" prop.` + `\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader`);
|
|
348
|
+
}
|
|
349
|
+
} else {
|
|
350
|
+
// The user defined a "loader" prop or config.
|
|
351
|
+
// Since the config object is internal only, we
|
|
352
|
+
// must not pass it to the user-defined "loader".
|
|
353
|
+
const customImageLoader = loader;
|
|
354
|
+
var _tmp;
|
|
355
|
+
_tmp = (obj)=>{
|
|
356
|
+
const { config: _ } = obj, opts = _object_without_properties_loose(obj, [
|
|
357
|
+
"config"
|
|
358
|
+
]);
|
|
359
|
+
return customImageLoader(opts);
|
|
360
|
+
}, loader = _tmp, _tmp;
|
|
361
|
+
}
|
|
362
|
+
if (layout) {
|
|
363
|
+
if (layout === "fill") {
|
|
364
|
+
fill = true;
|
|
365
|
+
}
|
|
366
|
+
const layoutToStyle = {
|
|
367
|
+
intrinsic: {
|
|
368
|
+
maxWidth: "100%",
|
|
369
|
+
height: "auto"
|
|
370
|
+
},
|
|
371
|
+
responsive: {
|
|
372
|
+
width: "100%",
|
|
373
|
+
height: "auto"
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
const layoutToSizes = {
|
|
377
|
+
responsive: "100vw",
|
|
378
|
+
fill: "100vw"
|
|
379
|
+
};
|
|
380
|
+
const layoutStyle = layoutToStyle[layout];
|
|
381
|
+
if (layoutStyle) {
|
|
382
|
+
style = _extends({}, style, layoutStyle);
|
|
383
|
+
}
|
|
384
|
+
const layoutSizes = layoutToSizes[layout];
|
|
385
|
+
if (layoutSizes && !sizes) {
|
|
386
|
+
sizes = layoutSizes;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
let staticSrc = "";
|
|
390
|
+
let widthInt = getInt(width);
|
|
391
|
+
let heightInt = getInt(height);
|
|
392
|
+
let blurWidth;
|
|
393
|
+
let blurHeight;
|
|
394
|
+
if (isStaticImport(src)) {
|
|
395
|
+
const staticImageData = isStaticRequire(src) ? src.default : src;
|
|
396
|
+
if (!staticImageData.src) {
|
|
397
|
+
throw new Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(staticImageData)}`);
|
|
398
|
+
}
|
|
399
|
+
if (!staticImageData.height || !staticImageData.width) {
|
|
400
|
+
throw new Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(staticImageData)}`);
|
|
401
|
+
}
|
|
402
|
+
blurWidth = staticImageData.blurWidth;
|
|
403
|
+
blurHeight = staticImageData.blurHeight;
|
|
404
|
+
blurDataURL = blurDataURL || staticImageData.blurDataURL;
|
|
405
|
+
staticSrc = staticImageData.src;
|
|
406
|
+
if (!fill) {
|
|
407
|
+
if (!widthInt && !heightInt) {
|
|
408
|
+
widthInt = staticImageData.width;
|
|
409
|
+
heightInt = staticImageData.height;
|
|
410
|
+
} else if (widthInt && !heightInt) {
|
|
411
|
+
const ratio = widthInt / staticImageData.width;
|
|
412
|
+
heightInt = Math.round(staticImageData.height * ratio);
|
|
413
|
+
} else if (!widthInt && heightInt) {
|
|
414
|
+
const ratio = heightInt / staticImageData.height;
|
|
415
|
+
widthInt = Math.round(staticImageData.width * ratio);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
src = typeof src === "string" ? src : staticSrc;
|
|
420
|
+
let isLazy = !priority && (loading === "lazy" || typeof loading === "undefined");
|
|
421
|
+
if (src.startsWith("data:") || src.startsWith("blob:")) {
|
|
422
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
|
|
423
|
+
unoptimized = true;
|
|
424
|
+
isLazy = false;
|
|
425
|
+
}
|
|
426
|
+
if (config.unoptimized) {
|
|
427
|
+
unoptimized = true;
|
|
428
|
+
}
|
|
429
|
+
if (isDefaultLoader && src.endsWith(".svg") && !config.dangerouslyAllowSVG) {
|
|
430
|
+
// Special case to make svg serve as-is to avoid proxying
|
|
431
|
+
// through the built-in Image Optimization API.
|
|
432
|
+
unoptimized = true;
|
|
433
|
+
}
|
|
434
|
+
const [blurComplete, setBlurComplete] = (0, _react).useState(false);
|
|
435
|
+
const [showAltText, setShowAltText] = (0, _react).useState(false);
|
|
436
|
+
const qualityInt = getInt(quality);
|
|
437
|
+
if (false) {}
|
|
438
|
+
const imgStyle = Object.assign(fill ? {
|
|
439
|
+
position: "absolute",
|
|
440
|
+
height: "100%",
|
|
441
|
+
width: "100%",
|
|
442
|
+
left: 0,
|
|
443
|
+
top: 0,
|
|
444
|
+
right: 0,
|
|
445
|
+
bottom: 0,
|
|
446
|
+
objectFit,
|
|
447
|
+
objectPosition
|
|
448
|
+
} : {}, showAltText ? {} : {
|
|
449
|
+
color: "transparent"
|
|
450
|
+
}, style);
|
|
451
|
+
const blurStyle = placeholder === "blur" && blurDataURL && !blurComplete ? {
|
|
452
|
+
backgroundSize: imgStyle.objectFit || "cover",
|
|
453
|
+
backgroundPosition: imgStyle.objectPosition || "50% 50%",
|
|
454
|
+
backgroundRepeat: "no-repeat",
|
|
455
|
+
backgroundImage: `url("data:image/svg+xml;charset=utf-8,${(0, _imageBlurSvg).getImageBlurSvg({
|
|
456
|
+
widthInt,
|
|
457
|
+
heightInt,
|
|
458
|
+
blurWidth,
|
|
459
|
+
blurHeight,
|
|
460
|
+
blurDataURL,
|
|
461
|
+
objectFit: imgStyle.objectFit
|
|
462
|
+
})}")`
|
|
463
|
+
} : {};
|
|
464
|
+
if (false) {}
|
|
465
|
+
const imgAttributes = generateImgAttrs({
|
|
466
|
+
config,
|
|
467
|
+
src,
|
|
468
|
+
unoptimized,
|
|
469
|
+
width: widthInt,
|
|
470
|
+
quality: qualityInt,
|
|
471
|
+
sizes,
|
|
472
|
+
loader
|
|
473
|
+
});
|
|
474
|
+
let srcString = src;
|
|
475
|
+
if (false) {}
|
|
476
|
+
const linkProps = {
|
|
477
|
+
// @ts-expect-error upgrade react types to react 18
|
|
478
|
+
imageSrcSet: imgAttributes.srcSet,
|
|
479
|
+
imageSizes: imgAttributes.sizes,
|
|
480
|
+
crossOrigin: rest.crossOrigin
|
|
481
|
+
};
|
|
482
|
+
const onLoadRef = (0, _react).useRef(onLoad);
|
|
483
|
+
(0, _react).useEffect(()=>{
|
|
484
|
+
onLoadRef.current = onLoad;
|
|
485
|
+
}, [
|
|
486
|
+
onLoad
|
|
487
|
+
]);
|
|
488
|
+
const onLoadingCompleteRef = (0, _react).useRef(onLoadingComplete);
|
|
489
|
+
(0, _react).useEffect(()=>{
|
|
490
|
+
onLoadingCompleteRef.current = onLoadingComplete;
|
|
491
|
+
}, [
|
|
492
|
+
onLoadingComplete
|
|
493
|
+
]);
|
|
494
|
+
const imgElementArgs = _extends({
|
|
495
|
+
isLazy,
|
|
496
|
+
imgAttributes,
|
|
497
|
+
heightInt,
|
|
498
|
+
widthInt,
|
|
499
|
+
qualityInt,
|
|
500
|
+
className,
|
|
501
|
+
imgStyle,
|
|
502
|
+
blurStyle,
|
|
503
|
+
loading,
|
|
504
|
+
config,
|
|
505
|
+
fill,
|
|
506
|
+
unoptimized,
|
|
507
|
+
placeholder,
|
|
508
|
+
loader,
|
|
509
|
+
srcString,
|
|
510
|
+
onLoadRef,
|
|
511
|
+
onLoadingCompleteRef,
|
|
512
|
+
setBlurComplete,
|
|
513
|
+
setShowAltText
|
|
514
|
+
}, rest);
|
|
515
|
+
return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement(ImageElement, Object.assign({}, imgElementArgs, {
|
|
516
|
+
ref: forwardedRef
|
|
517
|
+
})), priority ? // for browsers that do not support `imagesrcset`, and in those cases
|
|
518
|
+
// it would likely cause the incorrect image to be preloaded.
|
|
519
|
+
//
|
|
520
|
+
// https://html.spec.whatwg.org/multipage/semantics.html#attr-link-imagesrcset
|
|
521
|
+
/*#__PURE__*/ _react.default.createElement(_head.default, null, /*#__PURE__*/ _react.default.createElement("link", Object.assign({
|
|
522
|
+
key: "__nimg-" + imgAttributes.src + imgAttributes.srcSet + imgAttributes.sizes,
|
|
523
|
+
rel: "preload",
|
|
524
|
+
as: "image",
|
|
525
|
+
href: imgAttributes.srcSet ? undefined : imgAttributes.src
|
|
526
|
+
}, linkProps))) : null);
|
|
527
|
+
});
|
|
528
|
+
var _default = Image;
|
|
529
|
+
exports["default"] = _default;
|
|
530
|
+
if ((typeof exports.default === "function" || typeof exports.default === "object" && exports.default !== null) && typeof exports.default.__esModule === "undefined") {
|
|
531
|
+
Object.defineProperty(exports.default, "__esModule", {
|
|
532
|
+
value: true
|
|
533
|
+
});
|
|
534
|
+
Object.assign(exports.default, exports);
|
|
535
|
+
module.exports = exports.default;
|
|
536
|
+
} //# sourceMappingURL=image.js.map
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
/***/ }),
|
|
540
|
+
|
|
541
|
+
/***/ 25675:
|
|
542
|
+
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
543
|
+
|
|
544
|
+
module.exports = __webpack_require__(93740)
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
/***/ })
|
|
548
|
+
|
|
549
|
+
};
|
|
550
|
+
;
|
|
@@ -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/Jmk00rVXCbdjFgP77tKXQ/_buildManifest.js","static/Jmk00rVXCbdjFgP77tKXQ/_ssgManifest.js"],rootMainFiles:[],pages:{"/":["static/chunks/webpack-6ef43a8d4a395f49.js","static/chunks/framework-2c79e2a64abdb08b.js","static/chunks/main-0ecb9ccfcb6c9b24.js","static/css/34adfcf12a7d9bb6.css","static/chunks/pages/index-ccd762f8f5028729.js"],"/404":["static/chunks/webpack-6ef43a8d4a395f49.js","static/chunks/framework-2c79e2a64abdb08b.js","static/chunks/main-0ecb9ccfcb6c9b24.js","static/chunks/pages/404-8176f4acd0cfeb42.js"],"/_app":["static/chunks/webpack-6ef43a8d4a395f49.js","static/chunks/framework-2c79e2a64abdb08b.js","static/chunks/main-0ecb9ccfcb6c9b24.js","static/css/1cd302e7648d209c.css","static/chunks/pages/_app-b4fa92112b8f0385.js"],"/_error":["static/chunks/webpack-6ef43a8d4a395f49.js","static/chunks/framework-2c79e2a64abdb08b.js","static/chunks/main-0ecb9ccfcb6c9b24.js","static/chunks/pages/_error-54de1933a164a1ff.js"]},ampFirstPages:[]};
|
|
@@ -1,5 +1 @@
|
|
|
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,Scrabble,Solver,Board,Open-source,Open,Source,Word,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/
|
|
2
|
-
|
|
3
|
-
text {
|
|
4
|
-
font-family: 'Open Sans';
|
|
5
|
-
}</style><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 40, 40)"><rect fill="#f7c2aa" height="80" rx="12" 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" rx="12" 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" rx="12" 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" rx="12" 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" rx="12" 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" rx="12" 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" rx="12" 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":"MvHZRF4XuJ7g8LLLRkf8U","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
|
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,Scrabble,Solver,Board,Open-source,Open,Source,Word,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/1cd302e7648d209c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1cd302e7648d209c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-6ef43a8d4a395f49.js" defer=""></script><script src="/_next/static/chunks/framework-2c79e2a64abdb08b.js" defer=""></script><script src="/_next/static/chunks/main-0ecb9ccfcb6c9b24.js" defer=""></script><script src="/_next/static/chunks/pages/_app-b4fa92112b8f0385.js" defer=""></script><script src="/_next/static/chunks/pages/404-8176f4acd0cfeb42.js" defer=""></script><script src="/_next/static/Jmk00rVXCbdjFgP77tKXQ/_buildManifest.js" defer=""></script><script src="/_next/static/Jmk00rVXCbdjFgP77tKXQ/_ssgManifest.js" defer=""></script></head><body><div id="__next"><p style="color:transparent;pointer-events:none;position:absolute;user-select:none;transform:translateY(-9999px)">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" 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"><g class="PlainTiles_tile__4eIjX" transform="rotate(0, 40, 40)"><rect fill="#f7c2aa" height="80" rx="12" width="80" x="0" y="0"></rect><text dominant-baseline="central" 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" rx="12" width="80" x="86" y="0"></rect><text dominant-baseline="central" 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" rx="12" width="80" x="172" y="0"></rect><text dominant-baseline="central" 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" rx="12" width="80" x="258" y="0"></rect><text dominant-baseline="central" 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" rx="12" width="80" x="430" y="0"></rect><text dominant-baseline="central" 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" rx="12" width="80" x="516" y="0"></rect><text dominant-baseline="central" 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" rx="12" width="80" x="602" y="0"></rect><text dominant-baseline="central" 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":"Jmk00rVXCbdjFgP77tKXQ","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|