@scrabble-solver/scrabble-solver 2.10.0 → 2.10.2

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 (144) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +19 -31
  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-development/0.pack +0 -0
  7. package/.next/cache/webpack/client-development/1.pack +0 -0
  8. package/.next/cache/webpack/client-development/2.pack +0 -0
  9. package/.next/cache/webpack/client-development/3.pack +0 -0
  10. package/.next/cache/webpack/client-development/4.pack +0 -0
  11. package/.next/cache/webpack/client-development/index.pack +0 -0
  12. package/.next/cache/webpack/client-development/index.pack.old +0 -0
  13. package/.next/cache/webpack/client-production/0.pack +0 -0
  14. package/.next/cache/webpack/client-production/index.pack +0 -0
  15. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  16. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  17. package/.next/cache/webpack/server-development/0.pack +0 -0
  18. package/.next/cache/webpack/server-development/10.pack_ +0 -0
  19. package/.next/cache/webpack/server-development/5.pack_ +0 -0
  20. package/.next/cache/webpack/server-development/8.pack_ +0 -0
  21. package/.next/cache/webpack/server-development/index.pack +0 -0
  22. package/.next/cache/webpack/server-production/0.pack +0 -0
  23. package/.next/cache/webpack/server-production/index.pack +0 -0
  24. package/.next/images-manifest.json +1 -1
  25. package/.next/next-server.js.nft.json +1 -1
  26. package/.next/prerender-manifest.json +1 -1
  27. package/.next/required-server-files.json +1 -1
  28. package/.next/routes-manifest.json +1 -1
  29. package/.next/server/chunks/131.js +1399 -117
  30. package/.next/server/chunks/{515.js → 176.js} +850 -732
  31. package/.next/server/chunks/210.js +122 -0
  32. package/.next/server/chunks/{939.js → 290.js} +4 -3
  33. package/.next/server/chunks/44.js +33 -33
  34. package/.next/server/chunks/50.js +5 -9
  35. package/.next/server/chunks/{413.js → 579.js} +184 -117
  36. package/.next/server/chunks/664.js +537 -350
  37. package/.next/server/chunks/859.js +56 -23
  38. package/.next/server/chunks/865.js +1 -1
  39. package/.next/server/middleware-build-manifest.js +1 -1
  40. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  41. package/.next/server/pages/404.html +2 -2
  42. package/.next/server/pages/404.js.nft.json +1 -1
  43. package/.next/server/pages/500.html +2 -2
  44. package/.next/server/pages/_app.js +23 -5
  45. package/.next/server/pages/_app.js.nft.json +1 -1
  46. package/.next/server/pages/_document.js +2 -2
  47. package/.next/server/pages/_error.js +206 -25
  48. package/.next/server/pages/_error.js.nft.json +1 -1
  49. package/.next/server/pages/api/dictionary/[locale]/[word].js +11 -11
  50. package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  51. package/.next/server/pages/api/dictionary/[locale].js +10 -10
  52. package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  53. package/.next/server/pages/api/solve.js +34 -36
  54. package/.next/server/pages/api/solve.js.nft.json +1 -1
  55. package/.next/server/pages/api/verify.js +10 -10
  56. package/.next/server/pages/api/verify.js.nft.json +1 -1
  57. package/.next/server/pages/api/visit.js +3 -3
  58. package/.next/server/pages/api/visit.js.nft.json +1 -1
  59. package/.next/server/pages/index.html +2 -2
  60. package/.next/server/pages/index.js +44 -128
  61. package/.next/server/pages/index.js.nft.json +1 -1
  62. package/.next/server/pages/index.json +1 -1
  63. package/.next/server/pages-manifest.json +4 -4
  64. package/.next/static/FjrbXpI5fkt4lmko-vL_7/_buildManifest.js +1 -0
  65. package/.next/static/{vscqn7BEtAxJteWSwNnas → FjrbXpI5fkt4lmko-vL_7}/_ssgManifest.js +0 -0
  66. package/.next/static/chunks/361-d16f336a9752a55a.js +1 -0
  67. package/.next/static/chunks/724-eb48df4d1ba3df8b.js +5 -0
  68. package/.next/static/chunks/amp.js +720 -0
  69. package/.next/static/chunks/framework-2c79e2a64abdb08b.js +33 -0
  70. package/.next/static/chunks/main-f11614d8aa7ee555.js +1 -0
  71. package/.next/static/chunks/main.js +1076 -0
  72. package/.next/static/chunks/pages/404-24f9617eeb8d6dc1.js +1 -0
  73. package/.next/static/chunks/pages/_app-959e495f0f221247.js +24 -0
  74. package/.next/static/chunks/pages/_app.js +2121 -0
  75. package/.next/static/chunks/pages/_error-8353112a01355ec2.js +1 -0
  76. package/.next/static/chunks/pages/_error.js +28 -0
  77. package/.next/static/chunks/pages/index-1e30dafa41bddb80.js +1 -0
  78. package/.next/static/chunks/pages/index.js +5314 -0
  79. package/.next/static/chunks/react-refresh.js +62 -0
  80. package/.next/static/chunks/webpack-59c5c889f52620d6.js +1 -0
  81. package/.next/static/chunks/webpack.js +1237 -0
  82. package/.next/static/css/aafd07997120f1e4.css +1 -0
  83. package/.next/static/css/c8d26240c04079b9.css +1 -0
  84. package/.next/static/css/eb9d57f7103525ab.css +1 -0
  85. package/.next/static/development/_buildManifest.js +1 -0
  86. package/.next/static/development/_ssgManifest.js +1 -0
  87. package/.next/static/webpack/fb4b50d5e70ee127.webpack.hot-update.json +1 -0
  88. package/.next/static/webpack/pages/index.fb4b50d5e70ee127.hot-update.js +171 -0
  89. package/.next/static/webpack/webpack.fb4b50d5e70ee127.hot-update.js +18 -0
  90. package/.next/trace +52 -52
  91. package/package.json +21 -21
  92. package/public/og.png +0 -0
  93. package/src/components/Board/Board.module.scss +1 -2
  94. package/src/components/Board/BoardPure.tsx +2 -0
  95. package/src/components/Board/components/Cell/Cell.module.scss +65 -55
  96. package/src/components/Board/components/Cell/Cell.tsx +9 -0
  97. package/src/components/Board/components/Cell/CellPure.tsx +11 -2
  98. package/src/components/Board/hooks/useGrid.ts +6 -6
  99. package/src/components/NavButtons/NavButtons.tsx +11 -1
  100. package/src/components/Rack/Rack.tsx +16 -4
  101. package/src/components/Rack/RackTile.tsx +10 -1
  102. package/src/components/RemainingTiles/Character.module.scss +0 -1
  103. package/src/components/RemainingTiles/Character.tsx +1 -0
  104. package/src/components/Results/Results.tsx +2 -2
  105. package/src/components/Settings/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +2 -2
  106. package/src/components/Settings/components/LocaleSetting/options.ts +9 -1
  107. package/src/components/Solver/Solver.module.scss +85 -0
  108. package/src/components/Solver/Solver.tsx +75 -0
  109. package/src/components/Solver/index.ts +1 -0
  110. package/src/components/Tile/Tile.module.scss +51 -7
  111. package/src/components/Tile/Tile.tsx +3 -0
  112. package/src/components/Tile/TilePure.tsx +8 -1
  113. package/src/components/index.ts +1 -0
  114. package/src/hooks/index.ts +1 -0
  115. package/src/hooks/useIsTouchDevice.ts +7 -0
  116. package/src/i18n/fr.json +1 -1
  117. package/src/icons/ExclamationSquareFill.svg +4 -0
  118. package/src/icons/index.ts +1 -0
  119. package/src/lib/getRemainingTilesGroups.ts +24 -26
  120. package/src/pages/index.module.scss +1 -75
  121. package/src/pages/index.tsx +11 -73
  122. package/src/parameters/index.ts +2 -0
  123. package/src/sdk/findWordDefinitions.ts +1 -1
  124. package/src/service-worker/average.ts +9 -0
  125. package/src/service-worker/routeSolveRequests.ts +46 -7
  126. package/src/state/sagas.ts +19 -5
  127. package/src/state/selectors.ts +30 -2
  128. package/src/state/slices/boardInitialState.ts +27 -0
  129. package/src/styles/mixins.scss +6 -1
  130. package/src/styles/variables.scss +6 -3
  131. package/.next/InjectManifest.js.nft.json +0 -1
  132. package/.next/static/chunks/368-d423e70be6c0c473.js +0 -1
  133. package/.next/static/chunks/546-447e243fc9de2c59.js +0 -1
  134. package/.next/static/chunks/framework-4556c45dd113b893.js +0 -1
  135. package/.next/static/chunks/main-a75cf611e061d8f8.js +0 -1
  136. package/.next/static/chunks/pages/404-932294135c3206dd.js +0 -1
  137. package/.next/static/chunks/pages/_app-3f5508a5f544d9eb.js +0 -1
  138. package/.next/static/chunks/pages/_error-a4ba2246ff8fb532.js +0 -1
  139. package/.next/static/chunks/pages/index-8af7a9d7a2cd98a7.js +0 -1
  140. package/.next/static/chunks/webpack-5752944655d749a0.js +0 -1
  141. package/.next/static/css/6b1833fd19d3a74a.css +0 -1
  142. package/.next/static/css/a6154e4ca046ca13.css +0 -1
  143. package/.next/static/css/bad53af6f8616677.css +0 -1
  144. package/.next/static/vscqn7BEtAxJteWSwNnas/_buildManifest.js +0 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- exports.id = 413;
3
- exports.ids = [413];
2
+ exports.id = 579;
3
+ exports.ids = [579];
4
4
  exports.modules = {
5
5
 
6
6
  /***/ 57079:
@@ -937,6 +937,7 @@ exports.CONSONANTS = [
937
937
  'm',
938
938
  'n',
939
939
  'ń',
940
+ 'ñ',
940
941
  'p',
941
942
  'q',
942
943
  'r',
@@ -955,7 +956,7 @@ exports.VOWELS = ['a', 'ą', 'ä', 'e', 'ę', 'i', 'o', 'ó', 'ö', 'u', 'ü', '
955
956
 
956
957
  /***/ }),
957
958
 
958
- /***/ 43898:
959
+ /***/ 77586:
959
960
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
960
961
 
961
962
 
@@ -976,7 +977,7 @@ const es_namespaceObject = JSON.parse('{"cell.filter-cell":"Destino objetivo: ha
976
977
  ;// CONCATENATED MODULE: ./src/i18n/fa.json
977
978
  const fa_namespaceObject = JSON.parse('{"cell.filter-cell":"مقصد - کلیک برای تغییر","cell.set-blank":"علامت گذاری به عنوان خالی","cell.set-not-blank":"علامت گذاری به عنوان غیر خالی","cell.toggle-direction":"جهت تایپ - کلیک برای تغییر","common.blanks":"خالی","common.clear":"پاک کردن","common.close":"بستن","common.consonants":"حروف صامت","common.loading":"در حال بارگزاری","common.points":"امتیازات","common.tiles":"کاشی ها","common.two-letter-tiles":"دو حرفی","common.vowels":"حروف مصوت","common.word":"کلمه","common.words":"کلمات","dictionary.empty-state.no-definitions":"کلمه در فرهنگ لغت وجود دارد، ولی معنایی برای آن ثبت نشده است.","dictionary.empty-state.no-results":"کلمه در فرهنگ لغت یافت نشد.","dictionary.empty-state.not-allowed":"این کلمه مجاز نیست.","dictionary.empty-state.uninitialized":"معنی لغت اینجا نمایش داده خواهد شد.","dictionary.input.placeholder":"جستجو در فرهنگ لغت ...","empty-state.error":"خطا","empty-state.info":"اطلاعات","empty-state.success":"حله!","empty-state.warning":"اوووخ!","github":"به این پروژه در گیتهاب سر بزنید","keyMap":"میانبر های کیبورد","keyMap.board":"صفحه","keyMap.board.toggle-blank":"علامت/عدم علامت گذاری کاشی به عنوان خالی","keyMap.board.toggle-direction":"تغییر جهت تایپ","keyMap.board-and-rack":"صفحه و طاقچه","keyMap.board-and-rack.insert-two-letter-tile":"وارد کردن کاشی دو حرفی","keyMap.board-and-rack.navigate":"حرکت","keyMap.board-and-rack.remove-tile":"حذف کاشی","keyMap.board-and-rack.submit":"حل کردن","keyMap.rack":"طاقچه","keyMap.rack.insert-blank":"وارد کردن کاشی خالی (دکمه اسپیس)","rack.placeholder":"لیستحرف","remaining-tiles":"کاشی های باقی مانده","results.empty-state.no-filtered-results":"پاسخی یافت نشد.","results.empty-state.no-results":"کلمه قابل استفاده پیدا نشد.","results.empty-state.outdated":"نتایج به روز نیستند، برای بروز رسانی کلیک کنید.","results.empty-state.uninitialized":"کلمات تولید شده از حروف شما اینجا نمایش داده خواهد شد.","results.input.placeholder":"جستجو در نتایج (RegExp)","results.solve":"حل کن","settings":"تنظیمات","settings.autoGroupTiles":"کاشی های باقی مانده ی طاقچه را کنار هم قرار بده","settings.autoGroupTiles.left":"در سمت چپ","settings.autoGroupTiles.right":"در سمت راست","settings.autoGroupTiles.null":"کنار هم قرار نده","settings.game":"بازی","settings.language":"زبان","words":"کلمات ساخته شده","words.invalid":"نا معتبر","words.valid":"معتبر"}');
978
979
  ;// CONCATENATED MODULE: ./src/i18n/fr.json
979
- const fr_namespaceObject = JSON.parse('{"cell.filter-cell":"Destination cible - cliquer pour changer","cell.set-blank":"Marquer comme vide","cell.set-not-blank":"Marquer comme non vide","cell.toggle-direction":"Direction d\'écriture - cliquer pour changer","common.blanks":"Cases vides","common.clear":"Effacer","common.close":"Fermer","common.consonants":"Consonnes","common.loading":"Chargement","common.points":"Points","common.tiles":"Cases","common.two-letter-tiles":"Deux lettres","common.vowels":"Voyelles","common.word":"Mot","common.words":"Mots","dictionary.empty-state.no-definitions":"Le mot existe dans le dictionary mais n\'a pas de définition.","dictionary.empty-state.no-results":"Impossible de trouver une définition pour ce mot dans le dictionaire.","dictionary.empty-state.not-allowed":"Ce mot n\'est pas pas acceptable.","dictionary.empty-state.uninitialized":"La définition dictionaire du dernier mot surligné sera affichée ici.","dictionary.input.placeholder":"Rechercher dans le dictionnaire...","empty-state.error":"Erreur","empty-state.info":"Info","empty-state.success":"Ouais!","empty-state.warning":"Oups!","github":"Voir ce projet sur GitHub","keyMap":"Raccourcis clavier","keyMap.board":"Plateau","keyMap.board.toggle-blank":"Marqué/Démarqué la case en tant que vide","keyMap.board.toggle-direction":"Faire basculer la direction d\'écriture","keyMap.board-and-rack":"Plateau & chevalet","keyMap.board-and-rack.insert-two-letter-tile":"Insérer une tuile de deux lettres","keyMap.board-and-rack.navigate":"Naviguer","keyMap.board-and-rack.remove-tile":"Supprimer une case","keyMap.board-and-rack.submit":"Commencer la résolution","keyMap.rack":"Chevalet","keyMap.rack.insert-blank":"Inserer une case vide (spacebar)","rack.placeholder":"Lettres","remaining-tiles":"Cases restantes","results.empty-state.no-filtered-results":"Aucun résultat ne correspond à cette requête","results.empty-state.no-results":"Pas de résultats - impossible de générer des mots.","results.empty-state.outdated":"Les résultats sont dépassé. Cliquer ci-dessous pour mettre à jour.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Rechercher les résultats... (RegExp)","results.solve":"Résoudre","settings":"Options","settings.autoGroupTiles":"Grouper les cases restantes","settings.autoGroupTiles.left":"Vers la droite","settings.autoGroupTiles.right":"Vers la gauche","settings.autoGroupTiles.null":"Ne pas grouper","settings.game":"Jeu","settings.language":"Langue","words":"Mots créés","words.invalid":"Incorrect","words.valid":"Corriger"}');
980
+ const fr_namespaceObject = JSON.parse('{"cell.filter-cell":"Destination cible - cliquer pour changer","cell.set-blank":"Marquer comme vide","cell.set-not-blank":"Marquer comme non vide","cell.toggle-direction":"Direction d\'écriture - cliquer pour changer","common.blanks":"Cases vides","common.clear":"Effacer","common.close":"Fermer","common.consonants":"Consonnes","common.loading":"Chargement","common.points":"Points","common.tiles":"Cases","common.two-letter-tiles":"Deux lettres","common.vowels":"Voyelles","common.word":"Mot","common.words":"Mots","dictionary.empty-state.no-definitions":"Le mot existe dans le dictionary mais n\'a pas de définition.","dictionary.empty-state.no-results":"Impossible de trouver une définition pour ce mot dans le dictionaire.","dictionary.empty-state.not-allowed":"Ce mot n\'est pas pas acceptable.","dictionary.empty-state.uninitialized":"La définition dictionaire du dernier mot surligné sera affichée ici.","dictionary.input.placeholder":"Rechercher dans le dictionnaire...","empty-state.error":"Erreur","empty-state.info":"Info","empty-state.success":"Ouais!","empty-state.warning":"Oups!","github":"Voir ce projet sur GitHub","keyMap":"Raccourcis clavier","keyMap.board":"Plateau","keyMap.board.toggle-blank":"Marqué/Démarqué la case en tant que vide","keyMap.board.toggle-direction":"Faire basculer la direction d\'écriture","keyMap.board-and-rack":"Plateau & chevalet","keyMap.board-and-rack.insert-two-letter-tile":"Insérer une tuile de deux lettres","keyMap.board-and-rack.navigate":"Naviguer","keyMap.board-and-rack.remove-tile":"Supprimer une case","keyMap.board-and-rack.submit":"Commencer la résolution","keyMap.rack":"Chevalet","keyMap.rack.insert-blank":"Inserer une case vide (spacebar)","rack.placeholder":"Lettres","remaining-tiles":"Cases restantes","results.empty-state.no-filtered-results":"Aucun résultat ne correspond à cette requête","results.empty-state.no-results":"Pas de résultats - impossible de générer des mots.","results.empty-state.outdated":"Les résultats sont dépassé. Cliquer ci-dessous pour mettre à jour.","results.empty-state.uninitialized":"Les mots générés à partir de vos lettres seront affichés ici.","results.input.placeholder":"Rechercher les résultats... (RegExp)","results.solve":"Résoudre","settings":"Options","settings.autoGroupTiles":"Grouper les cases restantes","settings.autoGroupTiles.left":"Vers la droite","settings.autoGroupTiles.right":"Vers la gauche","settings.autoGroupTiles.null":"Ne pas grouper","settings.game":"Jeu","settings.language":"Langue","words":"Mots créés","words.invalid":"Incorrect","words.valid":"Corriger"}');
980
981
  ;// CONCATENATED MODULE: ./src/i18n/pl.json
981
982
  const pl_namespaceObject = JSON.parse('{"cell.filter-cell":"Miejsce docelowe - kliknij aby zmienić","cell.set-blank":"Oznacz jako blank","cell.set-not-blank":"Oznacz jako nie blank","cell.toggle-direction":"Kierunek wpisywania - kliknij aby zmienić","common.blanks":"Blanki","common.clear":"Wyczyść","common.close":"Zamknij","common.consonants":"Spółgłoski","common.loading":"Ładowanie","common.points":"Punkty","common.tiles":"Płytki","common.two-letter-tiles":"Dwuliterowe","common.vowels":"Samogłoski","common.word":"Słowo","common.words":"Słowa","dictionary.empty-state.no-definitions":"Słowo istnieje w słowniku ale nie posiada definicji.","dictionary.empty-state.no-results":"Nie udało się znaleźć definicji słowa w słowniku.","dictionary.empty-state.not-allowed":"To słowo nie jest dopuszczalne w grach.","dictionary.empty-state.uninitialized":"Tu zostanie wyświetlona słownikowa definicja ostatnio podświetlonego słowa.","dictionary.input.placeholder":"Szukaj w słowniku...","empty-state.error":"Błąd","empty-state.info":"Info","empty-state.success":"Hurra!","empty-state.warning":"Ups!","github":"Zobacz ten projekt na GitHubie","keyMap":"Skróty klawiszowe","keyMap.board":"Plansza","keyMap.board.toggle-blank":"Oznacz/odznacz płytkę jako blank","keyMap.board.toggle-direction":"Zmień kierunek wpisywania","keyMap.board-and-rack":"Plansza i stojak","keyMap.board-and-rack.insert-two-letter-tile":"Wstaw dwuliterową płytkę","keyMap.board-and-rack.navigate":"Nawigacja","keyMap.board-and-rack.remove-tile":"Zdejmij płytkę","keyMap.board-and-rack.submit":"Rozpocznij wyszukiwanie","keyMap.rack":"Stojak","keyMap.rack.insert-blank":"Wstaw blanka (spacja)","rack.placeholder":"Literki","remaining-tiles":"Pozostałe płytki","results.empty-state.no-filtered-results":"Żaden wynik nie pasuje do tej kwerendy.","results.empty-state.no-results":"Brak wyników - nie można wygenerować żadnego słowa.","results.empty-state.outdated":"Wyniki są nieaktualne. Kliknij poniżej, aby zaktualizować.","results.empty-state.uninitialized":"Tu zostaną wyświetlone słowa wygenerowane z Twoich liter.","results.input.placeholder":"Szukaj rozwiązania... (RegExp)","results.solve":"Rozwiąż","settings":"Opcje","settings.autoGroupTiles":"Grupuj pozostałe płytki","settings.autoGroupTiles.left":"Po lewej","settings.autoGroupTiles.right":"Po prawej","settings.autoGroupTiles.null":"Nie grupuj","settings.game":"Gra","settings.language":"Język","words":"Utworzone słowa","words.invalid":"Niepoprawne","words.valid":"Poprawne"}');
982
983
  ;// CONCATENATED MODULE: ./src/i18n/i18n.ts
@@ -1052,7 +1053,7 @@ const LOCALE_FEATURES = {
1052
1053
 
1053
1054
  /***/ }),
1054
1055
 
1055
- /***/ 30459:
1056
+ /***/ 95784:
1056
1057
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1057
1058
 
1058
1059
 
@@ -1213,7 +1214,7 @@ const findCell = (cells, x, y)=>{
1213
1214
  /* harmony default export */ const lib_findCell = (findCell);
1214
1215
 
1215
1216
  // EXTERNAL MODULE: ./src/parameters/index.ts
1216
- var parameters = __webpack_require__(90485);
1217
+ var parameters = __webpack_require__(74200);
1217
1218
  ;// CONCATENATED MODULE: ./src/lib/getCellSize.ts
1218
1219
 
1219
1220
  const getCellSize = (config, width, height)=>{
@@ -1272,7 +1273,7 @@ const getRemainingTiles = (config, board, characters, locale)=>{
1272
1273
  };
1273
1274
  const letters = [
1274
1275
  ...letterCells.map((cell)=>cell.tile.character),
1275
- ...characters.filter((letter)=>letter !== constants_build.BLANK),
1276
+ ...characters.filter((letter)=>letter !== constants_build.BLANK)
1276
1277
  ];
1277
1278
  const unknownLetters = letters.filter((letter)=>typeof remainingTiles[letter] === "undefined");
1278
1279
  for (const letter of unknownLetters){
@@ -1283,8 +1284,8 @@ const getRemainingTiles = (config, board, characters, locale)=>{
1283
1284
  usedCount: 0
1284
1285
  };
1285
1286
  }
1286
- for (const letter1 of letters){
1287
- ++remainingTiles[letter1].usedCount;
1287
+ for (const letter of letters){
1288
+ ++remainingTiles[letter].usedCount;
1288
1289
  }
1289
1290
  const comparator = lib_createKeyComparator("character", locale);
1290
1291
  return [
@@ -1313,29 +1314,26 @@ const getTotalRemainingTilesCount = (remainingTiles)=>{
1313
1314
  const getRemainingTilesGroups = (remainingTiles)=>{
1314
1315
  const consonants = remainingTiles.filter(isConsonant);
1315
1316
  const vowels = remainingTiles.filter(isVowel);
1317
+ const other = remainingTiles.filter(isOther);
1316
1318
  const groups = [];
1317
- if (consonants.length + vowels.length > 0) {
1318
- groups.push({
1319
- remainingCount: lib_getRemainingTilesCount(vowels),
1320
- tiles: vowels,
1321
- translationKey: "common.vowels",
1322
- totalCount: lib_getTotalRemainingTilesCount(vowels)
1323
- });
1324
- groups.push({
1325
- remainingCount: lib_getRemainingTilesCount(consonants),
1326
- tiles: consonants,
1327
- translationKey: "common.consonants",
1328
- totalCount: lib_getTotalRemainingTilesCount(consonants)
1329
- });
1330
- } else {
1331
- const tiles = remainingTiles.filter(isLetter);
1332
- groups.push({
1333
- remainingCount: lib_getRemainingTilesCount(tiles),
1334
- tiles,
1335
- translationKey: "common.tiles",
1336
- totalCount: lib_getTotalRemainingTilesCount(tiles)
1337
- });
1338
- }
1319
+ groups.push({
1320
+ remainingCount: lib_getRemainingTilesCount(vowels),
1321
+ tiles: vowels,
1322
+ translationKey: "common.vowels",
1323
+ totalCount: lib_getTotalRemainingTilesCount(vowels)
1324
+ });
1325
+ groups.push({
1326
+ remainingCount: lib_getRemainingTilesCount(consonants),
1327
+ tiles: consonants,
1328
+ translationKey: "common.consonants",
1329
+ totalCount: lib_getTotalRemainingTilesCount(consonants)
1330
+ });
1331
+ groups.push({
1332
+ remainingCount: lib_getRemainingTilesCount(other),
1333
+ tiles: other,
1334
+ translationKey: "common.tiles",
1335
+ totalCount: lib_getTotalRemainingTilesCount(other)
1336
+ });
1339
1337
  const twoCharacterTiles = remainingTiles.filter(isTwoCharacter);
1340
1338
  const blanks = remainingTiles.filter(isBlank);
1341
1339
  groups.push({
@@ -1354,9 +1352,9 @@ const getRemainingTilesGroups = (remainingTiles)=>{
1354
1352
  };
1355
1353
  const isConsonant = (tile)=>constants_build.CONSONANTS.includes(tile.character);
1356
1354
  const isVowel = (tile)=>constants_build.VOWELS.includes(tile.character);
1357
- const isLetter = (tile)=>!isBlank(tile) && !isTwoCharacter(tile);
1358
1355
  const isTwoCharacter = (tile)=>tile.character.length === 2;
1359
1356
  const isBlank = (tile)=>tile.character === constants_build.BLANK;
1357
+ const isOther = (tile)=>!isConsonant(tile) && !isVowel(tile) && !isBlank(tile) && !isTwoCharacter(tile);
1360
1358
  /* harmony default export */ const lib_getRemainingTilesGroups = (getRemainingTilesGroups);
1361
1359
 
1362
1360
  ;// CONCATENATED MODULE: ./src/lib/getTileSizes.ts
@@ -1447,7 +1445,7 @@ const parametersEqual = (a, b)=>{
1447
1445
  /* harmony default export */ const lib_memoize = (memoize);
1448
1446
 
1449
1447
  // EXTERNAL MODULE: ./src/types/index.ts
1450
- var types = __webpack_require__(3620);
1448
+ var types = __webpack_require__(9033);
1451
1449
  ;// CONCATENATED MODULE: ./src/lib/reverseComparator.ts
1452
1450
  const reverseComparator = (comparator)=>{
1453
1451
  return (a, b)=>-comparator(a, b);
@@ -1576,7 +1574,7 @@ const zipCharactersAndTiles = (characters, tiles)=>{
1576
1574
 
1577
1575
  /***/ }),
1578
1576
 
1579
- /***/ 90485:
1577
+ /***/ 74200:
1580
1578
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1581
1579
 
1582
1580
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -1605,11 +1603,13 @@ const zipCharactersAndTiles = (characters, tiles)=>{
1605
1603
  /* harmony export */ "rx": () => (/* binding */ RESULTS_ITEM_HEIGHT),
1606
1604
  /* harmony export */ "tr": () => (/* binding */ COMPONENTS_SPACING),
1607
1605
  /* harmony export */ "uX": () => (/* binding */ PLAIN_TILES_PADDING_VERTICAL),
1606
+ /* harmony export */ "uk": () => (/* binding */ INITIALIZATION_DURATION),
1608
1607
  /* harmony export */ "yg": () => (/* binding */ COLOR_RED),
1609
1608
  /* harmony export */ "yr": () => (/* binding */ COLOR_YELLOW)
1610
1609
  /* harmony export */ });
1611
1610
  /* unused harmony exports TRANSITION_DURATION, PLAIN_TILES_VERSION_TILE_COLOR, PLAIN_TILES_VERSION_TILE_SIZE */
1612
1611
  const GITHUB_PROJECT_URL = "https://github.com/kamilmielnik/scrabble-solver";
1612
+ const INITIALIZATION_DURATION = 100;
1613
1613
  const TRANSITION_DURATION = 100;
1614
1614
  const TRANSITION_DURATION_LONG = 250;
1615
1615
  const COLOR_BLUE = "#c7d8f9";
@@ -1654,7 +1654,7 @@ const RESULTS_INPUT_HEIGHT = 43;
1654
1654
 
1655
1655
  /***/ }),
1656
1656
 
1657
- /***/ 89969:
1657
+ /***/ 64594:
1658
1658
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1659
1659
 
1660
1660
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -1670,7 +1670,7 @@ const reset = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createAction)("re
1670
1670
 
1671
1671
  /***/ }),
1672
1672
 
1673
- /***/ 33282:
1673
+ /***/ 37686:
1674
1674
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
1675
1675
 
1676
1676
  __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
@@ -1680,8 +1680,8 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1680
1680
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86695);
1681
1681
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
1682
1682
  /* harmony import */ var redux_saga__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(75998);
1683
- /* harmony import */ var _rootReducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12935);
1684
- /* harmony import */ var _sagas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(91972);
1683
+ /* harmony import */ var _rootReducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5428);
1684
+ /* harmony import */ var _sagas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(55883);
1685
1685
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([redux_saga__WEBPACK_IMPORTED_MODULE_1__]);
1686
1686
  redux_saga__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
1687
1687
 
@@ -1703,12 +1703,13 @@ __webpack_async_result__();
1703
1703
 
1704
1704
  /***/ }),
1705
1705
 
1706
- /***/ 51413:
1706
+ /***/ 64579:
1707
1707
  /***/ ((module, __webpack_exports__, __webpack_require__) => {
1708
1708
 
1709
1709
  __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
1710
1710
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1711
1711
  /* harmony export */ "$o": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.$o),
1712
+ /* harmony export */ "AN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.AN),
1712
1713
  /* harmony export */ "En": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.En),
1713
1714
  /* harmony export */ "HM": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.HM),
1714
1715
  /* harmony export */ "I8": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.I8),
@@ -1731,6 +1732,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1731
1732
  /* harmony export */ "dN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.dN),
1732
1733
  /* harmony export */ "f2": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.f2),
1733
1734
  /* harmony export */ "fN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.fN),
1735
+ /* harmony export */ "fZ": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.fZ),
1734
1736
  /* harmony export */ "id": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.id),
1735
1737
  /* harmony export */ "ix": () => (/* reexport safe */ _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__.Z),
1736
1738
  /* harmony export */ "j2": () => (/* reexport safe */ _actions__WEBPACK_IMPORTED_MODULE_0__.j),
@@ -1748,13 +1750,13 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1748
1750
  /* harmony export */ "xj": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.xj),
1749
1751
  /* harmony export */ "z$": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.z$)
1750
1752
  /* harmony export */ });
1751
- /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(89969);
1752
- /* harmony import */ var _createAppStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(33282);
1753
- /* harmony import */ var _localStorage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(83773);
1754
- /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(40897);
1755
- /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(99134);
1756
- /* harmony import */ var _useTranslate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(41573);
1757
- /* harmony import */ var _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(53872);
1753
+ /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64594);
1754
+ /* harmony import */ var _createAppStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(37686);
1755
+ /* harmony import */ var _localStorage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(65723);
1756
+ /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(30391);
1757
+ /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(58995);
1758
+ /* harmony import */ var _useTranslate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(92645);
1759
+ /* harmony import */ var _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20106);
1758
1760
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_createAppStore__WEBPACK_IMPORTED_MODULE_1__]);
1759
1761
  _createAppStore__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
1760
1762
 
@@ -1770,7 +1772,7 @@ __webpack_async_result__();
1770
1772
 
1771
1773
  /***/ }),
1772
1774
 
1773
- /***/ 83773:
1775
+ /***/ 65723:
1774
1776
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1775
1777
 
1776
1778
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -1827,7 +1829,7 @@ const localStorage = {
1827
1829
 
1828
1830
  /***/ }),
1829
1831
 
1830
- /***/ 12935:
1832
+ /***/ 5428:
1831
1833
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1832
1834
 
1833
1835
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -1835,7 +1837,7 @@ const localStorage = {
1835
1837
  /* harmony export */ });
1836
1838
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86695);
1837
1839
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
1838
- /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(99134);
1840
+ /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(58995);
1839
1841
 
1840
1842
 
1841
1843
  const rootReducer = (0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)({
@@ -1853,7 +1855,7 @@ const rootReducer = (0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)({
1853
1855
 
1854
1856
  /***/ }),
1855
1857
 
1856
- /***/ 91972:
1858
+ /***/ 55883:
1857
1859
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1858
1860
 
1859
1861
 
@@ -1865,7 +1867,7 @@ __webpack_require__.d(__webpack_exports__, {
1865
1867
  // EXTERNAL MODULE: external "redux-saga/effects"
1866
1868
  var effects_ = __webpack_require__(56477);
1867
1869
  // EXTERNAL MODULE: ./src/lib/index.ts + 29 modules
1868
- var lib = __webpack_require__(30459);
1870
+ var lib = __webpack_require__(95784);
1869
1871
  // EXTERNAL MODULE: ../types/build/index.js
1870
1872
  var build = __webpack_require__(34046);
1871
1873
  ;// CONCATENATED MODULE: ./src/sdk/fetch.ts
@@ -1911,7 +1913,7 @@ const fetchJson = async (input, init)=>{
1911
1913
 
1912
1914
 
1913
1915
  const findWordDefinitions = async (locale, word)=>{
1914
- const json = await sdk_fetchJson(`/api/dictionary/${locale}/${word}`);
1916
+ const json = await sdk_fetchJson(`/api/dictionary/${locale}/${encodeURIComponent(word)}`);
1915
1917
  return json.map(build.WordDefinition.fromJson);
1916
1918
  };
1917
1919
  /* harmony default export */ const sdk_findWordDefinitions = (findWordDefinitions);
@@ -1962,11 +1964,11 @@ const visit = ()=>{
1962
1964
 
1963
1965
 
1964
1966
  // EXTERNAL MODULE: ./src/state/actions.ts
1965
- var actions = __webpack_require__(89969);
1967
+ var actions = __webpack_require__(64594);
1966
1968
  // EXTERNAL MODULE: ./src/state/selectors.ts
1967
- var selectors = __webpack_require__(40897);
1969
+ var selectors = __webpack_require__(30391);
1968
1970
  // EXTERNAL MODULE: ./src/state/slices/index.ts + 16 modules
1969
- var slices = __webpack_require__(99134);
1971
+ var slices = __webpack_require__(58995);
1970
1972
  ;// CONCATENATED MODULE: ./src/state/sagas.ts
1971
1973
 
1972
1974
 
@@ -2004,7 +2006,7 @@ function* onRackValueChange() {
2004
2006
  yield (0,effects_.put)(slices/* resultsSlice.actions.changeResultCandidate */._C.actions.changeResultCandidate(null));
2005
2007
  }
2006
2008
  function* onApplyResult({ payload: result }) {
2007
- const autoGroupTiles = yield (0,effects_.select)(selectors/* selectAutoGroupTiles */.uz);
2009
+ const autoGroupTiles = yield (0,effects_.select)(selectors/* selectLocaleAutoGroupTiles */.lP);
2008
2010
  yield (0,effects_.put)(slices/* boardSlice.actions.applyResult */.I8.actions.applyResult(result));
2009
2011
  yield (0,effects_.put)(slices/* cellFilterSlice.actions.reset */.mO.actions.reset());
2010
2012
  yield (0,effects_.put)(slices/* rackSlice.actions.removeTiles */.O_.actions.removeTiles(result.tiles));
@@ -2012,8 +2014,13 @@ function* onApplyResult({ payload: result }) {
2012
2014
  yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
2013
2015
  }
2014
2016
  function* onConfigIdChange() {
2017
+ const characters = yield (0,effects_.select)(selectors/* selectCharacters */.yp);
2018
+ if (characters.length > 0) {
2019
+ yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
2020
+ } else {
2021
+ yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
2022
+ }
2015
2023
  yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
2016
- yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
2017
2024
  yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
2018
2025
  yield* ensureProperTilesCount();
2019
2026
  }
@@ -2044,9 +2051,14 @@ function* onReset() {
2044
2051
  yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
2045
2052
  }
2046
2053
  function* onLocaleChange() {
2054
+ const characters = yield (0,effects_.select)(selectors/* selectCharacters */.yp);
2055
+ if (characters.length > 0) {
2056
+ yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
2057
+ } else {
2058
+ yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
2059
+ }
2047
2060
  yield (0,effects_.put)(slices/* dictionarySlice.actions.reset */.lj.actions.reset());
2048
2061
  yield (0,effects_.put)(slices/* resultsSlice.actions.changeResultCandidate */._C.actions.changeResultCandidate(null));
2049
- yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
2050
2062
  yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
2051
2063
  }
2052
2064
  function* onResultCandidateChange({ payload: result }) {
@@ -2116,11 +2128,11 @@ function* ensureProperTilesCount() {
2116
2128
  ]));
2117
2129
  } else if (config.maximumCharactersCount < characters.length) {
2118
2130
  const nonNulls = characters.filter(Boolean).slice(0, config.maximumCharactersCount);
2119
- const differenceCount1 = Math.abs(config.maximumCharactersCount - nonNulls.length);
2120
- const autoGroupTiles = yield (0,effects_.select)(selectors/* selectAutoGroupTiles */.uz);
2131
+ const differenceCount = Math.abs(config.maximumCharactersCount - nonNulls.length);
2132
+ const autoGroupTiles = yield (0,effects_.select)(selectors/* selectLocaleAutoGroupTiles */.lP);
2121
2133
  yield (0,effects_.put)(slices/* rackSlice.actions.init */.O_.actions.init([
2122
2134
  ...nonNulls,
2123
- ...Array(differenceCount1).fill(null)
2135
+ ...Array(differenceCount).fill(null)
2124
2136
  ]));
2125
2137
  yield (0,effects_.put)(slices/* rackSlice.actions.groupTiles */.O_.actions.groupTiles(autoGroupTiles));
2126
2138
  }
@@ -2129,11 +2141,12 @@ function* ensureProperTilesCount() {
2129
2141
 
2130
2142
  /***/ }),
2131
2143
 
2132
- /***/ 40897:
2144
+ /***/ 30391:
2133
2145
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2134
2146
 
2135
2147
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2136
2148
  /* harmony export */ "$o": () => (/* binding */ selectConfig),
2149
+ /* harmony export */ "AN": () => (/* binding */ selectCharacterIsValid),
2137
2150
  /* harmony export */ "En": () => (/* binding */ selectHasOverusedTiles),
2138
2151
  /* harmony export */ "HM": () => (/* binding */ selectVerify),
2139
2152
  /* harmony export */ "Mj": () => (/* binding */ selectAreResultsOutdated),
@@ -2151,7 +2164,9 @@ function* ensureProperTilesCount() {
2151
2164
  /* harmony export */ "dN": () => (/* binding */ selectSortedFilteredResults),
2152
2165
  /* harmony export */ "f2": () => (/* binding */ selectSortedResults),
2153
2166
  /* harmony export */ "fN": () => (/* binding */ selectLocale),
2167
+ /* harmony export */ "fZ": () => (/* binding */ selectCellIsValid),
2154
2168
  /* harmony export */ "id": () => (/* binding */ selectCellIsFiltered),
2169
+ /* harmony export */ "lP": () => (/* binding */ selectLocaleAutoGroupTiles),
2155
2170
  /* harmony export */ "mK": () => (/* binding */ selectDictionaryError),
2156
2171
  /* harmony export */ "md": () => (/* binding */ selectConfigId),
2157
2172
  /* harmony export */ "nb": () => (/* binding */ selectTranslations),
@@ -2167,10 +2182,12 @@ function* ensureProperTilesCount() {
2167
2182
  /* harmony import */ var _reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__);
2168
2183
  /* harmony import */ var _scrabble_solver_configs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89418);
2169
2184
  /* harmony import */ var _scrabble_solver_configs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_scrabble_solver_configs__WEBPACK_IMPORTED_MODULE_1__);
2170
- /* harmony import */ var _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34046);
2171
- /* harmony import */ var _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_2__);
2172
- /* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43898);
2173
- /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(30459);
2185
+ /* harmony import */ var _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7618);
2186
+ /* harmony import */ var _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34046);
2187
+ /* harmony import */ var _scrabble_solver_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_3__);
2188
+ /* harmony import */ var i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(77586);
2189
+ /* harmony import */ var lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(95784);
2190
+
2174
2191
 
2175
2192
 
2176
2193
 
@@ -2192,14 +2209,23 @@ const selectDictionary = selectDictionaryRoot;
2192
2209
  const selectDictionaryError = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2193
2210
  selectDictionaryRoot
2194
2211
  ], (dictionary)=>{
2195
- return (0,_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_2__.isError)(dictionary.error) ? dictionary.error : undefined;
2212
+ return (0,_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_3__.isError)(dictionary.error) ? dictionary.error : undefined;
2196
2213
  });
2214
+ const selectLocale = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2215
+ selectSettingsRoot
2216
+ ], (settings)=>settings.locale);
2197
2217
  const selectAutoGroupTiles = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2198
2218
  selectSettingsRoot
2199
2219
  ], (settings)=>settings.autoGroupTiles);
2200
- const selectLocale = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2220
+ const selectLocaleAutoGroupTiles = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2221
+ selectLocale,
2201
2222
  selectSettingsRoot
2202
- ], (settings)=>settings.locale);
2223
+ ], (locale, settings)=>{
2224
+ if (i18n__WEBPACK_IMPORTED_MODULE_4__/* .LOCALE_FEATURES */ .q[locale].direction === "ltr" || settings.autoGroupTiles === null) {
2225
+ return settings.autoGroupTiles;
2226
+ }
2227
+ return settings.autoGroupTiles === "left" ? "right" : "left";
2228
+ });
2203
2229
  const selectBoard = selectBoardRoot;
2204
2230
  const selectConfigId = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2205
2231
  selectSettingsRoot
@@ -2215,6 +2241,15 @@ const selectCellIsFiltered = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.cr
2215
2241
  ], (cellFilter, { x , y })=>{
2216
2242
  return cellFilter.some((cell)=>cell.x === x && cell.y === y);
2217
2243
  });
2244
+ const selectCellIsValid = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2245
+ selectConfig,
2246
+ selectCell
2247
+ ], (config, cell)=>{
2248
+ if (!cell.hasTile()) {
2249
+ return true;
2250
+ }
2251
+ return config.tiles.some((tile)=>tile.character === cell.tile.character);
2252
+ });
2218
2253
  const selectResults = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2219
2254
  selectResultsRoot
2220
2255
  ], (results)=>results.results);
@@ -2232,7 +2267,7 @@ const selectSortedResults = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.cre
2232
2267
  selectResultsSortColumn,
2233
2268
  selectResultsSortDirection,
2234
2269
  selectLocale
2235
- ], lib__WEBPACK_IMPORTED_MODULE_4__/* .sortResults */ .uj);
2270
+ ], lib__WEBPACK_IMPORTED_MODULE_5__/* .sortResults */ .uj);
2236
2271
  const filterResultsByQuery = (results, query)=>{
2237
2272
  if (query.trim().length === 0) {
2238
2273
  return results;
@@ -2277,7 +2312,7 @@ const selectRowsWithCandidate = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__
2277
2312
  selectBoardRoot,
2278
2313
  selectResultCandidateCells
2279
2314
  ], (board, cells)=>{
2280
- return board.rows.map((row, y)=>row.map((cell, x)=>(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .findCell */ .Jp)(cells, x, y) || cell));
2315
+ return board.rows.map((row, y)=>row.map((cell, x)=>(0,lib__WEBPACK_IMPORTED_MODULE_5__/* .findCell */ .Jp)(cells, x, y) || cell));
2281
2316
  });
2282
2317
  const selectCellBonus = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2283
2318
  selectConfig,
@@ -2291,6 +2326,15 @@ const selectCharacterPoints = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.c
2291
2326
  ], (config, character)=>{
2292
2327
  return config.getCharacterPoints(character);
2293
2328
  });
2329
+ const selectCharacterIsValid = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2330
+ selectConfig,
2331
+ selectCharacter
2332
+ ], (config, character)=>{
2333
+ if (character === null || character === _scrabble_solver_constants__WEBPACK_IMPORTED_MODULE_2__.BLANK) {
2334
+ return true;
2335
+ }
2336
+ return config.tiles.some((tile)=>tile.character === character);
2337
+ });
2294
2338
  const selectTilePoints = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2295
2339
  selectConfig,
2296
2340
  selectTile
@@ -2299,7 +2343,7 @@ const selectTilePoints = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.create
2299
2343
  });
2300
2344
  const selectTranslations = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2301
2345
  selectLocale
2302
- ], (locale)=>i18n__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .Z[locale]);
2346
+ ], (locale)=>i18n__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .Z[locale]);
2303
2347
  const selectTranslation = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2304
2348
  selectTranslations,
2305
2349
  selectLocale,
@@ -2322,14 +2366,14 @@ const selectIsLoading = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createS
2322
2366
  const selectSolveError = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2323
2367
  selectSolveRoot
2324
2368
  ], (solve)=>{
2325
- return (0,_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_2__.isError)(solve.error) ? solve.error : undefined;
2369
+ return (0,_scrabble_solver_types__WEBPACK_IMPORTED_MODULE_3__.isError)(solve.error) ? solve.error : undefined;
2326
2370
  });
2327
2371
  const selectHaveCharactersChanged = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2328
2372
  selectLastSolvedParameters,
2329
2373
  selectCharacters,
2330
2374
  selectLocale
2331
2375
  ], (lastSolvedParameters, characters, locale)=>{
2332
- return !(0,lib__WEBPACK_IMPORTED_MODULE_4__/* .unorderedArraysEqual */ .DR)(lastSolvedParameters.characters, characters, locale);
2376
+ return !(0,lib__WEBPACK_IMPORTED_MODULE_5__/* .unorderedArraysEqual */ .DR)(lastSolvedParameters.characters, characters, locale);
2333
2377
  });
2334
2378
  const selectHasBoardChanged = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2335
2379
  selectLastSolvedParameters,
@@ -2344,7 +2388,7 @@ const selectRemainingTiles = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.cr
2344
2388
  selectBoardRoot,
2345
2389
  selectCharacters,
2346
2390
  selectLocale
2347
- ], lib__WEBPACK_IMPORTED_MODULE_4__/* .getRemainingTiles */ .ZM);
2391
+ ], lib__WEBPACK_IMPORTED_MODULE_5__/* .getRemainingTiles */ .ZM);
2348
2392
  const selectHasOverusedTiles = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2349
2393
  selectRemainingTiles
2350
2394
  ], (remainingTiles)=>{
@@ -2352,7 +2396,7 @@ const selectHasOverusedTiles = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.
2352
2396
  });
2353
2397
  const selectRemainingTilesGroups = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2354
2398
  selectRemainingTiles
2355
- ], lib__WEBPACK_IMPORTED_MODULE_4__/* .getRemainingTilesGroups */ .op);
2399
+ ], lib__WEBPACK_IMPORTED_MODULE_5__/* .getRemainingTilesGroups */ .op);
2356
2400
  const selectVerify = selectVerifyRoot;
2357
2401
  const selectHasInvalidWords = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.createSelector)([
2358
2402
  selectVerify
@@ -2363,7 +2407,7 @@ const selectHasInvalidWords = (0,_reduxjs_toolkit__WEBPACK_IMPORTED_MODULE_0__.c
2363
2407
 
2364
2408
  /***/ }),
2365
2409
 
2366
- /***/ 99134:
2410
+ /***/ 58995:
2367
2411
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2368
2412
 
2369
2413
 
@@ -2416,6 +2460,29 @@ const settingsInitialState = {
2416
2460
  const { configId , locale } = slices_settingsInitialState;
2417
2461
  const { boardHeight , boardWidth } = (0,build.getLocaleConfig)(configId, locale);
2418
2462
  const boardInitialState = types_build.Board.create(boardWidth, boardHeight);
2463
+ // const createOxyphenbutazone = () => {
2464
+ // // Tiles: oypbaze
2465
+ // const board = Board.fromStringArray([
2466
+ // ' x hen ut on ',
2467
+ // 'puer or amas j',
2468
+ // 'a led a er a',
2469
+ // 'c ki i elf c',
2470
+ // 'i snot n is u',
2471
+ // 'f t o w do l',
2472
+ // 'y e moa er a',
2473
+ // 'i r solar t',
2474
+ // 'n v h t i',
2475
+ // 'g i i bitten',
2476
+ // ' e n v g',
2477
+ // ' w g e ',
2478
+ // ' e ',
2479
+ // ' d ',
2480
+ // ' ',
2481
+ // ]);
2482
+ // board.rows[4][3].tile.isBlank = true;
2483
+ // board.rows[9][11].tile.isBlank = true;
2484
+ // return board;
2485
+ // };
2419
2486
  /* harmony default export */ const slices_boardInitialState = (boardInitialState);
2420
2487
 
2421
2488
  // EXTERNAL MODULE: external "@reduxjs/toolkit"
@@ -2573,7 +2640,7 @@ const dictionarySlice = (0,toolkit_.createSlice)({
2573
2640
  /* harmony default export */ const slices_dictionarySlice = (dictionarySlice);
2574
2641
 
2575
2642
  // EXTERNAL MODULE: ./src/lib/index.ts + 29 modules
2576
- var lib = __webpack_require__(30459);
2643
+ var lib = __webpack_require__(95784);
2577
2644
  ;// CONCATENATED MODULE: ./src/state/slices/rackInitialState.ts
2578
2645
  const rackInitialState = [
2579
2646
  null,
@@ -2639,7 +2706,7 @@ const rackSlice = (0,toolkit_.createSlice)({
2639
2706
  /* harmony default export */ const slices_rackSlice = (rackSlice);
2640
2707
 
2641
2708
  // EXTERNAL MODULE: ./src/types/index.ts
2642
- var types = __webpack_require__(3620);
2709
+ var types = __webpack_require__(9033);
2643
2710
  ;// CONCATENATED MODULE: ./src/state/slices/resultsInitialState.ts
2644
2711
 
2645
2712
  const resultsInitialState = {
@@ -2861,7 +2928,7 @@ const verifySlice = (0,toolkit_.createSlice)({
2861
2928
 
2862
2929
  /***/ }),
2863
2930
 
2864
- /***/ 41573:
2931
+ /***/ 92645:
2865
2932
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2866
2933
 
2867
2934
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -2869,8 +2936,8 @@ const verifySlice = (0,toolkit_.createSlice)({
2869
2936
  /* harmony export */ });
2870
2937
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16689);
2871
2938
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
2872
- /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(40897);
2873
- /* harmony import */ var _useTypedSelector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(53872);
2939
+ /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30391);
2940
+ /* harmony import */ var _useTypedSelector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20106);
2874
2941
 
2875
2942
 
2876
2943
 
@@ -2894,7 +2961,7 @@ const useTranslate = ()=>{
2894
2961
 
2895
2962
  /***/ }),
2896
2963
 
2897
- /***/ 53872:
2964
+ /***/ 20106:
2898
2965
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2899
2966
 
2900
2967
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -2909,7 +2976,7 @@ const useTypedSelector = react_redux__WEBPACK_IMPORTED_MODULE_0__.useSelector;
2909
2976
 
2910
2977
  /***/ }),
2911
2978
 
2912
- /***/ 3620:
2979
+ /***/ 9033:
2913
2980
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2914
2981
 
2915
2982
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -2947,11 +3014,6 @@ const constants_1 = __webpack_require__(7618);
2947
3014
  const Cell_1 = __importDefault(__webpack_require__(52251));
2948
3015
  const Tile_1 = __importDefault(__webpack_require__(25275));
2949
3016
  class Board {
2950
- constructor({ rows }) {
2951
- this.rows = rows;
2952
- this.columnsCount = rows[0].length;
2953
- this.rowsCount = rows.length;
2954
- }
2955
3017
  static create(width, height) {
2956
3018
  return Board.fromStringArray(Array(height).fill(Array(width).fill(' ').join('')));
2957
3019
  }
@@ -2970,6 +3032,11 @@ class Board {
2970
3032
  }))),
2971
3033
  });
2972
3034
  }
3035
+ constructor({ rows }) {
3036
+ this.rows = rows;
3037
+ this.columnsCount = rows[0].length;
3038
+ this.rowsCount = rows.length;
3039
+ }
2973
3040
  get center() {
2974
3041
  const x = Math.floor(this.columnsCount / 2);
2975
3042
  const y = Math.floor(this.rowsCount / 2);
@@ -3133,13 +3200,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3133
3200
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3134
3201
  const Tile_1 = __importDefault(__webpack_require__(25275));
3135
3202
  class Cell {
3136
- // eslint-disable-next-line no-undef
3137
- constructor({ isEmpty = true, tile = Tile_1.default.Null, x, y }) {
3138
- this.isEmpty = isEmpty;
3139
- this.tile = tile;
3140
- this.x = x;
3141
- this.y = y;
3142
- }
3143
3203
  static fromJson(json) {
3144
3204
  return new Cell({
3145
3205
  isEmpty: json.isEmpty,
@@ -3148,6 +3208,13 @@ class Cell {
3148
3208
  y: json.y,
3149
3209
  });
3150
3210
  }
3211
+ // eslint-disable-next-line no-undef
3212
+ constructor({ isEmpty = true, tile = Tile_1.default.Null, x, y }) {
3213
+ this.isEmpty = isEmpty;
3214
+ this.tile = tile;
3215
+ this.x = x;
3216
+ this.y = y;
3217
+ }
3151
3218
  clone() {
3152
3219
  return new Cell({
3153
3220
  isEmpty: this.isEmpty,
@@ -3253,14 +3320,14 @@ const constants_1 = __webpack_require__(7618);
3253
3320
  const CharacterBonus_1 = __importDefault(__webpack_require__(19582));
3254
3321
  const WordBonus_1 = __importDefault(__webpack_require__(58627));
3255
3322
  class Config {
3323
+ static fromJson(json) {
3324
+ return new Config(json);
3325
+ }
3256
3326
  constructor(config) {
3257
3327
  this.bonuses = getBonuses(config);
3258
3328
  this.config = config;
3259
3329
  this.pointsMap = getPointsMap(this.config);
3260
3330
  }
3261
- static fromJson(json) {
3262
- return new Config(json);
3263
- }
3264
3331
  get allTilesBonusScore() {
3265
3332
  return this.config.allTilesBonusScore;
3266
3333
  }
@@ -3504,6 +3571,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
3504
3571
  const constants_1 = __webpack_require__(7618);
3505
3572
  const Cell_1 = __importDefault(__webpack_require__(52251));
3506
3573
  class Result {
3574
+ static fromJson(json) {
3575
+ return new Result({
3576
+ id: json.id,
3577
+ cells: json.cells.map(Cell_1.default.fromJson),
3578
+ collisions: json.collisions.map((collision) => collision.map(Cell_1.default.fromJson)),
3579
+ points: json.points,
3580
+ });
3581
+ }
3507
3582
  constructor({ cells, id, collisions, points, }) {
3508
3583
  const tiles = getTiles(cells);
3509
3584
  this.blanksCount = getBlanks(tiles).length;
@@ -3521,14 +3596,6 @@ class Result {
3521
3596
  this.words = getWords(cells, collisions);
3522
3597
  this.wordsCount = 1 + this.collisions.length;
3523
3598
  }
3524
- static fromJson(json) {
3525
- return new Result({
3526
- id: json.id,
3527
- cells: json.cells.map(Cell_1.default.fromJson),
3528
- collisions: json.collisions.map((collision) => collision.map(Cell_1.default.fromJson)),
3529
- points: json.points,
3530
- });
3531
- }
3532
3599
  toJson() {
3533
3600
  return {
3534
3601
  cells: this.cells.map((cell) => cell.toJson()),
@@ -3560,10 +3627,6 @@ exports["default"] = Result;
3560
3627
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3561
3628
  const constants_1 = __webpack_require__(7618);
3562
3629
  class Tile {
3563
- constructor({ character, isBlank = false }) {
3564
- this.character = character;
3565
- this.isBlank = isBlank;
3566
- }
3567
3630
  static fromJson(json) {
3568
3631
  if (!json) {
3569
3632
  return Tile.Null;
@@ -3573,6 +3636,10 @@ class Tile {
3573
3636
  isBlank: json.isBlank,
3574
3637
  });
3575
3638
  }
3639
+ constructor({ character, isBlank = false }) {
3640
+ this.character = character;
3641
+ this.isBlank = isBlank;
3642
+ }
3576
3643
  clone() {
3577
3644
  return new Tile({
3578
3645
  character: this.character,
@@ -3699,12 +3766,6 @@ exports["default"] = WordBonus;
3699
3766
 
3700
3767
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3701
3768
  class WordDefinition {
3702
- constructor({ definitions, exists, isAllowed, word }) {
3703
- this.definitions = definitions;
3704
- this.exists = exists;
3705
- this.isAllowed = isAllowed;
3706
- this.word = word;
3707
- }
3708
3769
  static fromJson(json) {
3709
3770
  if (!json) {
3710
3771
  return WordDefinition.Null;
@@ -3716,6 +3777,12 @@ class WordDefinition {
3716
3777
  word: json.word,
3717
3778
  });
3718
3779
  }
3780
+ constructor({ definitions, exists, isAllowed, word }) {
3781
+ this.definitions = definitions;
3782
+ this.exists = exists;
3783
+ this.isAllowed = isAllowed;
3784
+ this.word = word;
3785
+ }
3719
3786
  toJson() {
3720
3787
  return {
3721
3788
  definitions: this.definitions,