scrabble-solver 2.8.6 → 2.8.8

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 (180) hide show
  1. package/README.md +10 -9
  2. package/lerna.json +1 -1
  3. package/package.json +1 -1
  4. package/packages/configs/build/literaki/literaki.js +2 -2
  5. package/packages/configs/build/scrabble/scrabble.js +2 -2
  6. package/packages/configs/package.json +3 -3
  7. package/packages/configs/src/literaki/literaki.ts +2 -2
  8. package/packages/configs/src/scrabble/scrabble.ts +2 -2
  9. package/packages/constants/package.json +1 -1
  10. package/packages/dictionaries/package-lock.json +2 -2
  11. package/packages/dictionaries/package.json +4 -4
  12. package/packages/logger/package-lock.json +2 -2
  13. package/packages/logger/package.json +1 -1
  14. package/packages/scrabble-solver/.next/BUILD_ID +1 -1
  15. package/packages/scrabble-solver/.next/build-manifest.json +10 -10
  16. package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
  17. package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
  18. package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +1 -1
  19. package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
  20. package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
  21. package/packages/scrabble-solver/.next/cache/webpack/server-production/0.pack +0 -0
  22. package/packages/scrabble-solver/.next/cache/webpack/server-production/index.pack +0 -0
  23. package/packages/scrabble-solver/.next/next-server.js.nft.json +1 -1
  24. package/packages/scrabble-solver/.next/prerender-manifest.json +1 -1
  25. package/packages/scrabble-solver/.next/routes-manifest.json +1 -1
  26. package/packages/scrabble-solver/.next/server/chunks/413.js +266 -110
  27. package/packages/scrabble-solver/.next/server/chunks/{206.js → 429.js} +2 -4137
  28. package/packages/scrabble-solver/.next/server/chunks/515.js +197 -91
  29. package/packages/scrabble-solver/.next/server/chunks/{907.js → 911.js} +134 -367
  30. package/packages/scrabble-solver/.next/server/chunks/939.js +218 -0
  31. package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
  32. package/packages/scrabble-solver/.next/server/pages/404.html +2 -2
  33. package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
  34. package/packages/scrabble-solver/.next/server/pages/500.html +2 -2
  35. package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
  36. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js +33 -17
  37. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  38. package/packages/scrabble-solver/.next/server/pages/api/solve.js +399 -56
  39. package/packages/scrabble-solver/.next/server/pages/api/solve.js.nft.json +1 -1
  40. package/packages/scrabble-solver/.next/server/pages/api/visit.js +3 -2
  41. package/packages/scrabble-solver/.next/server/pages/api/visit.js.nft.json +1 -1
  42. package/packages/scrabble-solver/.next/server/pages/index.html +3 -7
  43. package/packages/scrabble-solver/.next/server/pages/index.js +12 -14
  44. package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
  45. package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
  46. package/packages/scrabble-solver/.next/static/chunks/615-d258f6c528c18622.js +1 -0
  47. package/packages/scrabble-solver/.next/static/chunks/pages/{404-30c06e61d256c5b2.js → 404-8eb3ba4f0ba17e08.js} +1 -1
  48. package/packages/scrabble-solver/.next/static/chunks/pages/_app-4a663fd3d5ca4524.js +1 -0
  49. package/packages/scrabble-solver/.next/static/chunks/pages/index-1a9826d740cc8830.js +1 -0
  50. package/packages/scrabble-solver/.next/static/css/180c6c26317ac90f.css +1 -0
  51. package/packages/scrabble-solver/.next/static/css/751e8a14776d05d8.css +1 -0
  52. package/packages/scrabble-solver/.next/static/z3J3qmq1nazbDv_ENIkCo/_buildManifest.js +1 -0
  53. package/packages/scrabble-solver/.next/static/{VjSpyGDWyVaO0muz54q_j → z3J3qmq1nazbDv_ENIkCo}/_ssgManifest.js +0 -0
  54. package/packages/scrabble-solver/.next/trace +41 -42
  55. package/packages/scrabble-solver/package-lock.json +2 -2
  56. package/packages/scrabble-solver/package.json +8 -8
  57. package/packages/scrabble-solver/src/api/index.ts +3 -9
  58. package/packages/scrabble-solver/src/api/isBoardValid.ts +43 -0
  59. package/packages/scrabble-solver/src/api/isCellValid.ts +26 -0
  60. package/packages/scrabble-solver/src/api/isRowValid.ts +19 -0
  61. package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.module.scss +34 -9
  62. package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.tsx +23 -4
  63. package/packages/scrabble-solver/src/components/Board/components/Cell/CellPure.tsx +29 -1
  64. package/packages/scrabble-solver/src/components/Board/hooks/useGrid.ts +1 -0
  65. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.module.scss +20 -0
  66. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.tsx +40 -29
  67. package/packages/scrabble-solver/src/components/Results/Cell.tsx +3 -2
  68. package/packages/scrabble-solver/src/components/Results/Result.tsx +16 -6
  69. package/packages/scrabble-solver/src/components/ResultsInput/ResultsInput.tsx +11 -3
  70. package/packages/scrabble-solver/src/hooks/useIsTablet.ts +2 -2
  71. package/packages/scrabble-solver/src/i18n/de.json +1 -0
  72. package/packages/scrabble-solver/src/i18n/en.json +1 -0
  73. package/packages/scrabble-solver/src/i18n/es.json +1 -0
  74. package/packages/scrabble-solver/src/i18n/fr.json +1 -0
  75. package/packages/scrabble-solver/src/i18n/pl.json +1 -0
  76. package/packages/scrabble-solver/src/icons/Flag.svg +4 -0
  77. package/packages/scrabble-solver/src/icons/Star.svg +4 -0
  78. package/packages/scrabble-solver/src/icons/index.ts +2 -0
  79. package/packages/scrabble-solver/src/lib/getRemainingTiles.ts +1 -1
  80. package/packages/scrabble-solver/src/lib/index.ts +2 -1
  81. package/packages/scrabble-solver/src/lib/isRegExp.ts +11 -0
  82. package/packages/scrabble-solver/src/lib/isStringArray.ts +5 -0
  83. package/packages/scrabble-solver/src/lib/sortResults.ts +5 -5
  84. package/packages/scrabble-solver/src/pages/api/dictionary/[locale]/[word].ts +35 -11
  85. package/packages/scrabble-solver/src/pages/api/solve.ts +39 -19
  86. package/packages/scrabble-solver/src/pages/api/visit.ts +1 -0
  87. package/packages/scrabble-solver/src/pages/index.module.scss +5 -11
  88. package/packages/scrabble-solver/src/pages/index.tsx +5 -5
  89. package/packages/scrabble-solver/src/sdk/{findWordDefinition.ts → findWordDefinitions.ts} +3 -3
  90. package/packages/scrabble-solver/src/sdk/index.ts +1 -1
  91. package/packages/scrabble-solver/src/state/rootReducer.ts +10 -1
  92. package/packages/scrabble-solver/src/state/sagas.ts +32 -12
  93. package/packages/scrabble-solver/src/state/selectors.ts +41 -7
  94. package/packages/scrabble-solver/src/state/slices/cellFilterInitialState.ts +7 -0
  95. package/packages/scrabble-solver/src/state/slices/cellFilterSlice.ts +24 -0
  96. package/packages/scrabble-solver/src/state/slices/dictionaryInitialState.ts +3 -3
  97. package/packages/scrabble-solver/src/state/slices/dictionarySlice.ts +4 -10
  98. package/packages/scrabble-solver/src/state/slices/index.ts +2 -0
  99. package/packages/scrabble-solver/src/types/index.ts +1 -0
  100. package/packages/solver/build/PatternsFiller.js +1 -1
  101. package/packages/solver/build/PatternsGenerator.d.ts +4 -4
  102. package/packages/solver/build/PatternsGenerator.js +6 -6
  103. package/packages/solver/build/ScoresCalculator.js +1 -1
  104. package/packages/solver/build/Solver.js +3 -3
  105. package/packages/solver/build/getUniquePatterns.d.ts +3 -0
  106. package/packages/solver/build/getUniquePatterns.js +25 -0
  107. package/packages/solver/package-lock.json +3 -29
  108. package/packages/solver/package.json +5 -7
  109. package/packages/solver/src/PatternsFiller.ts +1 -1
  110. package/packages/solver/src/PatternsGenerator.test.ts +2 -2
  111. package/packages/solver/src/PatternsGenerator.ts +8 -8
  112. package/packages/solver/src/ScoresCalculator.ts +1 -1
  113. package/packages/solver/src/Solver.ts +3 -3
  114. package/packages/solver/src/getUniquePatterns.ts +30 -0
  115. package/packages/types/build/Board.d.ts +2 -2
  116. package/packages/types/build/Board.js +8 -8
  117. package/packages/types/build/BoardJson.d.ts +2 -1
  118. package/packages/types/build/BoardJson.js +19 -0
  119. package/packages/types/build/Cell.d.ts +2 -3
  120. package/packages/types/build/Cell.js +0 -15
  121. package/packages/types/build/CellJson.d.ts +1 -0
  122. package/packages/types/build/CellJson.js +14 -0
  123. package/packages/types/build/Collision.d.ts +3 -0
  124. package/packages/types/build/Collision.js +2 -0
  125. package/packages/types/build/CollisionJson.d.ts +3 -0
  126. package/packages/types/build/CollisionJson.js +2 -0
  127. package/packages/types/build/Config.d.ts +2 -2
  128. package/packages/types/build/Config.js +5 -5
  129. package/packages/types/build/ConfigJson.d.ts +2 -2
  130. package/packages/types/build/Locale.d.ts +1 -0
  131. package/packages/types/build/Locale.js +4 -0
  132. package/packages/types/build/Pattern.d.ts +1 -1
  133. package/packages/types/build/Pattern.js +4 -4
  134. package/packages/types/build/PatternJson.d.ts +1 -1
  135. package/packages/types/build/Result.d.ts +10 -8
  136. package/packages/types/build/Result.js +15 -10
  137. package/packages/types/build/ResultJson.d.ts +3 -2
  138. package/packages/types/build/TileJson.d.ts +1 -0
  139. package/packages/types/build/TileJson.js +9 -0
  140. package/packages/types/build/index.d.ts +7 -4
  141. package/packages/types/build/index.js +10 -1
  142. package/packages/types/build/isObject.d.ts +2 -0
  143. package/packages/types/build/isObject.js +6 -0
  144. package/packages/types/package.json +2 -2
  145. package/packages/types/src/Board.ts +11 -11
  146. package/packages/types/src/BoardJson.ts +22 -2
  147. package/packages/types/src/Cell.ts +2 -19
  148. package/packages/types/src/CellJson.ts +12 -1
  149. package/packages/types/src/Collision.ts +5 -0
  150. package/packages/types/src/CollisionJson.ts +5 -0
  151. package/packages/types/src/Config.ts +6 -6
  152. package/packages/types/src/ConfigJson.ts +2 -2
  153. package/packages/types/src/Locale.ts +4 -0
  154. package/packages/types/src/Pattern.ts +4 -5
  155. package/packages/types/src/PatternJson.ts +1 -1
  156. package/packages/types/src/Result.ts +33 -23
  157. package/packages/types/src/ResultJson.ts +3 -2
  158. package/packages/types/src/TileJson.ts +6 -0
  159. package/packages/types/src/index.ts +7 -4
  160. package/packages/types/src/isObject.ts +5 -0
  161. package/packages/word-definitions/package-lock.json +8 -8
  162. package/packages/word-definitions/package.json +2 -2
  163. package/packages/word-lists/package-lock.json +2 -2
  164. package/packages/word-lists/package.json +2 -2
  165. package/packages/scrabble-solver/.next/static/VjSpyGDWyVaO0muz54q_j/_buildManifest.js +0 -1
  166. package/packages/scrabble-solver/.next/static/chunks/56-e2797384ae4b0fc0.js +0 -1
  167. package/packages/scrabble-solver/.next/static/chunks/pages/_app-5136d33b9b007fd7.js +0 -1
  168. package/packages/scrabble-solver/.next/static/chunks/pages/index-13ea7770a65c69ee.js +0 -1
  169. package/packages/scrabble-solver/.next/static/css/3159cfe62ff742a3.css +0 -1
  170. package/packages/scrabble-solver/.next/static/css/729bb37fe8f9bee6.css +0 -1
  171. package/packages/scrabble-solver/src/api/validateBoard.ts +0 -45
  172. package/packages/scrabble-solver/src/api/validateCell.ts +0 -40
  173. package/packages/scrabble-solver/src/api/validateCharacter.ts +0 -14
  174. package/packages/scrabble-solver/src/api/validateCharacters.ts +0 -24
  175. package/packages/scrabble-solver/src/api/validateConfigId.ts +0 -9
  176. package/packages/scrabble-solver/src/api/validateLocale.ts +0 -15
  177. package/packages/scrabble-solver/src/api/validateRow.ts +0 -17
  178. package/packages/scrabble-solver/src/api/validateTile.ts +0 -21
  179. package/packages/scrabble-solver/src/api/validateWord.ts +0 -11
  180. package/packages/scrabble-solver/src/lib/isLocale.ts +0 -7
@@ -1 +0,0 @@
1
- .Tile_tile__14nuL{position:relative;background-color:transparent;transition:var(--transition)}.Tile_tile__14nuL.Tile_raised__WKori{box-shadow:inset -2px -2px 2px -1px rgba(34,34,34,.8)}.Tile_tile__14nuL.Tile_points1__yl4Jl{background-color:var(--color--yellow)}.Tile_tile__14nuL.Tile_points2__Xsbcp{background-color:var(--color--green)}.Tile_tile__14nuL.Tile_points3__lJKOJ,.Tile_tile__14nuL.Tile_points4__IylBI{background-color:var(--color--blue)}.Tile_tile__14nuL.Tile_points5__Kzick{background-color:var(--color--red)}.Tile_tile__14nuL.Tile_blank__q2Ujv{background-color:#fff}.Tile_tile__14nuL.Tile_blank__q2Ujv .Tile_character__2XzcR{color:#000}.Tile_tile__14nuL.Tile_highlighted__eg00X{background-color:var(--color--primary);color:#fff}.Tile_tile__14nuL.Tile_highlighted__eg00X .Tile_character__2XzcR,.Tile_tile__14nuL.Tile_highlighted__eg00X .Tile_points__z39vV{color:inherit}.Tile_character__2XzcR{width:100%;height:100%;padding:0;box-sizing:border-box;background-color:transparent;border:none;font-weight:700;text-transform:uppercase;text-align:center;caret-color:transparent}.Tile_character__2XzcR::-moz-placeholder{color:var(--color--inactive)}.Tile_character__2XzcR:-ms-input-placeholder{color:var(--color--inactive)}.Tile_character__2XzcR::placeholder{color:var(--color--inactive)}.Tile_character__2XzcR:disabled{color:inherit}.Tile_points__z39vV{position:absolute;right:9%;bottom:1%;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;letter-spacing:-1px}.Tooltip_tooltip__98Sw9{padding:var(--spacing--s) var(--spacing--m);box-shadow:var(--box-shadow);border-radius:var(--border--radius);background-color:var(--tooltip--background);color:var(--tooltip--foreground);font-size:var(--font--size--s);z-index:200}.Tooltip_tooltip__98Sw9.Tooltip_top__Vk7yg .Tooltip_arrow__9oy08{bottom:-4px}.Tooltip_tooltip__98Sw9.Tooltip_top__Vk7yg .Tooltip_arrow__9oy08:after{left:0;bottom:0;border-top-color:var(--tooltip--background);border-bottom:none}.Tooltip_tooltip__98Sw9.Tooltip_right__kORxq .Tooltip_arrow__9oy08{left:-4px}.Tooltip_tooltip__98Sw9.Tooltip_right__kORxq .Tooltip_arrow__9oy08:after{left:0;top:0;border-right-color:var(--tooltip--background);border-left:none}.Tooltip_tooltip__98Sw9.Tooltip_bottom__QwH6o .Tooltip_arrow__9oy08{top:-4px}.Tooltip_tooltip__98Sw9.Tooltip_bottom__QwH6o .Tooltip_arrow__9oy08:after{top:0;left:0;border-bottom-color:var(--tooltip--background);border-top:none}.Tooltip_tooltip__98Sw9.Tooltip_left__bSM_7 .Tooltip_arrow__9oy08{right:-4px}.Tooltip_tooltip__98Sw9.Tooltip_left__bSM_7 .Tooltip_arrow__9oy08:after{right:0;top:0;border-left-color:var(--tooltip--background);border-right:none}.Tooltip_arrow__9oy08{position:absolute;width:8px;height:8px}.Tooltip_arrow__9oy08:after{content:" ";position:absolute;height:0;width:0;pointer-events:none;border:4px solid transparent}.Cell_cell__2GOSl{position:relative;display:table-cell;background-color:#fff;border-right:var(--border);border-bottom:var(--border);transition:var(--transition);background-clip:padding-box}.Cell_cell__2GOSl:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.Cell_cell__2GOSl:focus-within,.Cell_cell__2GOSl:focus-within *{outline:none}.Cell_cell__2GOSl:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.Cell_cell__2GOSl.Cell_bonusStart__zy3BV,.Cell_cell__2GOSl.Cell_bonusWord2__Ztd1C,.Cell_cell__2GOSl.Cell_bonusWord3__eTB6G{position:relative}.Cell_cell__2GOSl.Cell_bonusStart__zy3BV:before,.Cell_cell__2GOSl.Cell_bonusWord2__Ztd1C:before,.Cell_cell__2GOSl.Cell_bonusWord3__eTB6G:before{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;font-weight:700;pointer-events:none}.Cell_cell__2GOSl.Cell_bonusStart__zy3BV{background-color:var(--color--red--light)}.Cell_cell__2GOSl.Cell_bonusStart__zy3BV:before{content:"★";color:var(--color--foreground--secondary)}.Cell_cell__2GOSl.Cell_bonusCharacter1__zJUuA{background-color:var(--color--yellow--light)}.Cell_cell__2GOSl.Cell_bonusCharacter2__HZDn8{background-color:var(--color--green--light)}.Cell_cell__2GOSl.Cell_bonusCharacter3__pWf1f{background-color:var(--color--blue--light)}.Cell_cell__2GOSl.Cell_bonusCharacter5__LdDrj{background-color:var(--color--red--light)}.Cell_cell__2GOSl.Cell_bonusCharacterMultiplier2__Qpcd7{background-color:var(--color--light-blue--light)}.Cell_cell__2GOSl.Cell_bonusCharacterMultiplier3__0qtZY{background-color:var(--color--dark-blue--light)}.Cell_cell__2GOSl.Cell_bonusWord2__Ztd1C,.Cell_cell__2GOSl.Cell_bonusWord3__eTB6G{background-color:var(--color--inactive)}.Cell_cell__2GOSl.Cell_bonusWord2__Ztd1C:before,.Cell_cell__2GOSl.Cell_bonusWord3__eTB6G:before{font-size:75%;color:#fff}.Cell_cell__2GOSl.Cell_bonusWord2__Ztd1C:before{content:"x2"}.Cell_cell__2GOSl.Cell_bonusWord3__eTB6G:before{content:"x3"}.Cell_cell__2GOSl.Cell_characterPoints1__CKxm0{background-color:var(--color--yellow)}.Cell_cell__2GOSl.Cell_characterPoints2__QkYnj{background-color:var(--color--green)}.Cell_cell__2GOSl.Cell_characterPoints3___SyO2{background-color:var(--color--blue)}.Cell_cell__2GOSl.Cell_characterPoints5___OS_7{background-color:var(--color--red)}.Cell_cell__2GOSl.Cell_candidate__qGOhc{background-color:var(--color--primary)}.Cell_cell__2GOSl.Cell_candidate__qGOhc:before{display:none}.Cell_cell__2GOSl:focus-within{z-index:1}.Cell_cell__2GOSl:focus-within .Cell_actions__YOyrG{display:flex}.Cell_cell__2GOSl:focus-within .Cell_action___13Yo{-webkit-user-select:initial;-moz-user-select:initial;-ms-user-select:initial;user-select:auto;pointer-events:auto}.Cell_actions__YOyrG{display:none;position:absolute;left:calc(100% + var(--spacing--s) - 16px);top:-16px;z-index:2;box-shadow:var(--box-shadow);border-radius:var(--border--radius)}.Cell_action___13Yo,.Cell_actions__YOyrG{transition:var(--transition);pointer-events:none}.Cell_action___13Yo{padding:0;border:none;outline:none;font:inherit;color:inherit;background:none;display:flex;justify-content:center;padding:var(--spacing--s);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box;background-color:#fff;border:var(--border);border-top-left-radius:var(--border--radius);border-bottom-left-radius:var(--border--radius);font-size:var(--font--size--m);line-height:16px;color:var(--color--foreground--secondary);cursor:pointer}.Cell_action___13Yo+.Cell_action___13Yo{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.Cell_action___13Yo:last-child{border-top-right-radius:var(--border--radius);border-bottom-right-radius:var(--border--radius)}.Cell_action___13Yo,.Cell_action___13Yo .Cell_toggleDirection__1WgpQ{width:16px;height:16px}.Cell_action___13Yo:active,.Cell_action___13Yo:hover{color:var(--color--foreground)}.Cell_toggleDirection__1WgpQ{transition:var(--transition)}.Cell_toggleDirection__1WgpQ.Cell_right__ItPQR{transform:rotate(-90deg)}.Cell_blank__n7TRD{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.Cell_blank__n7TRD.Cell_active__L88UB{font-weight:700}.Board_board__eA_bB{display:table;box-shadow:var(--box-shadow);border-top:var(--border);border-left:var(--border)}.Board_row__mezHN{display:table-row}.Button_button__PjVhE{padding:0;border:none;outline:none;font:inherit;color:inherit;background:none;position:relative;display:inline-block;box-shadow:none;color:var(--color--inactive);cursor:pointer;opacity:.9}.Button_button__PjVhE,.Button_button__PjVhE:after{transition:var(--transition);border-radius:var(--border--radius)}.Button_button__PjVhE:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.Button_button__PjVhE:focus-within,.Button_button__PjVhE:focus-within *{outline:none}.Button_button__PjVhE:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.Button_button__PjVhE,.Button_button__PjVhE:active,.Button_button__PjVhE:focus,.Button_button__PjVhE:hover{background-color:var(--color--primary);box-shadow:var(--box-shadow);color:#fff}.Button_button__PjVhE:active:not(:disabled) .Button_content__XZA3a{position:relative;top:1px}.Button_button__PjVhE:disabled{background-color:var(--color--background);color:var(--color--inactive);box-shadow:none;cursor:not-allowed}.Button_button__PjVhE:disabled .Button_icon__DJGKY{transform:scale(1)}.Button_button__PjVhE:hover{opacity:1}.Button_button__PjVhE:hover:not(:disabled) .Button_icon__DJGKY{transform:scale(1.1)}.Button_content__XZA3a{display:flex;align-items:center;padding:var(--spacing--xs) var(--spacing--m)}.Button_icon__DJGKY,.Button_label__vFl5U{transition:var(--transition)}.Button_icon__DJGKY{width:32px;height:32px;transform:scale(1);color:inherit}.Button_icon__DJGKY,.Button_label__vFl5U{pointer-events:none;transition:var(--transition)}.Button_label__vFl5U{padding:0 var(--spacing--m);font-size:var(--font--size--m);text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@-webkit-keyframes PlainTiles_hide__ZXQ7t{0%{opacity:1}to{opacity:0}}@keyframes PlainTiles_hide__ZXQ7t{0%{opacity:1}to{opacity:0}}@-webkit-keyframes PlainTiles_progress__GEq5G{0%{-webkit-clip-path:polygon(0 0,0 0,0 100%,0 100%);clip-path:polygon(0 0,0 0,0 100%,0 100%)}to{-webkit-clip-path:polygon(0 0,100% 0,100% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,0 100%)}}@keyframes PlainTiles_progress__GEq5G{0%{-webkit-clip-path:polygon(0 0,0 0,0 100%,0 100%);clip-path:polygon(0 0,0 0,0 100%,0 100%)}to{-webkit-clip-path:polygon(0 0,100% 0,100% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,0 100%)}}@-webkit-keyframes PlainTiles_pulse__MTQRB{0%{transform:scale(1)}to{transform:scale(1.2)}}@keyframes PlainTiles_pulse__MTQRB{0%{transform:scale(1)}to{transform:scale(1.2)}}@-webkit-keyframes PlainTiles_wave__MUPo5{0%{transform:translateY(0)}25%{transform:translateY(6px)}75%{transform:translateY(-6px)}to{transform:translateY(0)}}@keyframes PlainTiles_wave__MUPo5{0%{transform:translateY(0)}25%{transform:translateY(6px)}75%{transform:translateY(-6px)}to{transform:translateY(0)}}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX{-webkit-animation:PlainTiles_wave__MUPo5 .75s infinite;animation:PlainTiles_wave__MUPo5 .75s infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:first-child{-webkit-animation-delay:-2.85s;animation-delay:-2.85s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(2){-webkit-animation-delay:-2.7s;animation-delay:-2.7s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(3){-webkit-animation-delay:-2.55s;animation-delay:-2.55s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(4){-webkit-animation-delay:-2.4s;animation-delay:-2.4s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(5){-webkit-animation-delay:-2.25s;animation-delay:-2.25s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(6){-webkit-animation-delay:-2.1s;animation-delay:-2.1s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(7){-webkit-animation-delay:-1.95s;animation-delay:-1.95s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(8){-webkit-animation-delay:-1.8s;animation-delay:-1.8s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(9){-webkit-animation-delay:-1.65s;animation-delay:-1.65s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(10){-webkit-animation-delay:-1.5s;animation-delay:-1.5s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(11){-webkit-animation-delay:-1.35s;animation-delay:-1.35s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(12){-webkit-animation-delay:-1.2s;animation-delay:-1.2s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(13){-webkit-animation-delay:-1.05s;animation-delay:-1.05s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(14){-webkit-animation-delay:-.9s;animation-delay:-.9s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(15){-webkit-animation-delay:-.75s;animation-delay:-.75s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(16){-webkit-animation-delay:-.6s;animation-delay:-.6s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(17){-webkit-animation-delay:-.45s;animation-delay:-.45s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(18){-webkit-animation-delay:-.3s;animation-delay:-.3s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(19){-webkit-animation-delay:-.15s;animation-delay:-.15s}.PlainTiles_wave__MUPo5 .PlainTiles_tile__4eIjX:nth-child(20){-webkit-animation-delay:0ms;animation-delay:0ms}.PlainTiles_dropShadow__TjPAL{filter:drop-shadow(0 0 4px rgba(0,0,0,.4))}.EmptyState_emptyState__iOAMZ{margin:0 auto;max-width:calc(2*var(--sidebar--width)/3);padding:var(--spacing--xl);font-family:var(--font--family);color:var(--color--foreground--secondary);text-align:center;text-transform:none}.EmptyState_emptyState__iOAMZ .EmptyState_tiles____Cln{margin-bottom:var(--spacing--m);height:32px;overflow:visible}.Loading_dim__H3eXg,.Loading_loading__RkVCa{position:absolute;top:0;bottom:0;left:0;right:0}.Loading_loading__RkVCa{display:flex;align-items:center;justify-content:center}.Loading_dim__H3eXg{background-color:var(--color--background--overlay);z-index:1;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.Loading_logo__1hwt4{position:relative;z-index:2;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.Loading_tiles__RNn33{width:298px;height:100%}.Dictionary_dictionary__0CM4j{position:relative;min-height:calc(var(--dictionary--height) - var(--text-input--height));overflow-y:auto;word-break:break-word;transition:var(--transition);font-size:var(--font--size--s)}.Dictionary_content__Ehz1U{padding:var(--spacing--l)}.Dictionary_word__Y2PlX{margin-bottom:var(--spacing--m);font-family:var(--font--family--title);font-size:var(--font--size--h2);text-transform:uppercase}.Dictionary_isAllowed__VfACe{background-color:var(--color--green--light)}.Dictionary_isNotAllowed__HvWIM{background-color:var(--color--red--light)}.Dictionary_definitions__UBslC{margin:0;padding-left:var(--spacing--l)}.Dictionary_definition__lU1Vz{margin-bottom:var(--spacing--s)}.Dictionary_definition__lU1Vz:last-child{margin-bottom:0}.DictionaryInput_dictionaryInput__fsGZD:focus-within{position:relative}.DictionaryInput_dictionaryInput__fsGZD:focus-within:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.DictionaryInput_dictionaryInput__fsGZD:focus-within:focus-within,.DictionaryInput_dictionaryInput__fsGZD:focus-within:focus-within *{outline:none}.DictionaryInput_dictionaryInput__fsGZD:focus-within:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.DictionaryInput_input__0ed6F{width:100%;min-height:var(--text-input--height);height:var(--text-input--height);max-height:var(--text-input--height);padding:0 var(--spacing--l);transition:var(--transition);font-size:var(--font--size--s);font-family:var(--font--family);border:none}.Key_key__JS7L0{position:relative;top:calc(0px - 2*var(--border--width));display:inline-block;min-width:28px;height:28px;padding:var(--spacing--s) var(--spacing--m);background-color:#fff;border:var(--border);border-radius:var(--border--radius);box-shadow:var(--box-shadow);font-family:var(--font--family--monospace);font-size:var(--font--size--s);line-height:calc(28px - 2 * (var(--spacing--s) + var(--border--width)));vertical-align:middle;text-align:center;white-space:nowrap}.Key_key__JS7L0+.Key_key__JS7L0{margin-left:var(--spacing--xs)}.Key_key__JS7L0 svg{position:absolute;top:calc(6.5px - var(--border--width));left:calc(6.5px - var(--border--width));width:15px;height:15px}.SquareButton_squareButton__qwR9a{padding:0;border:none;outline:none;font:inherit;color:inherit;background:none;position:relative;display:inline-block;color:var(--color--inactive);cursor:pointer;transition:var(--transition)}.SquareButton_squareButton__qwR9a:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.SquareButton_squareButton__qwR9a:focus-within,.SquareButton_squareButton__qwR9a:focus-within *{outline:none}.SquareButton_squareButton__qwR9a:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.SquareButton_squareButton__qwR9a:focus,.SquareButton_squareButton__qwR9a:hover{text-decoration:none;color:var(--color--foreground--secondary)}.SquareButton_squareButton__qwR9a:active{color:var(--color--foreground)}.SquareButton_content__1ucqM{display:flex;align-items:center;justify-content:center}.SquareButton_icon__t5YSC{width:var(--square-button-size);height:var(--square-button-size);pointer-events:none;color:inherit;transition:var(--transition)}.Section_section__Rd7qk+.Section_section__Rd7qk{margin-top:var(--spacing--xl)}.Section_heading___PU_r{margin-bottom:var(--spacing--m);font-size:var(--font--size--h2);font-family:var(--font--family--title);font-weight:300}.Sidebar_modal__pavmk{position:fixed;top:0;right:0;z-index:100;height:100vh;width:370px;padding:0;border-radius:0;border:none}.Sidebar_modal__pavmk:focus{outline:none}.Sidebar_afterOpen__Y7kOz .Sidebar_sidebar__pTTPu{transform:translateX(0);opacity:1}.Sidebar_beforeClose__vzZNQ .Sidebar_sidebar__pTTPu{transform:translateX(370px);opacity:0}.Sidebar_overlay__fZ2ki{background-color:transparent}.Sidebar_sidebar__pTTPu{display:flex;flex-direction:column;height:100%;background-color:var(--color--background);box-shadow:var(--box-shadow--left);transition:var(--transition);transition-duration:var(--transition--duration--long);transform:translateX(370px);opacity:0}.Sidebar_header__6FiSo{flex:0 0 auto;position:relative;padding:var(--spacing--l)}.Sidebar_title__pzTL8{padding-right:calc(var(--square-button-size) + var(--spacing--s));font-size:var(--font--size--h1);font-weight:300}.Sidebar_closeButton__TjUpw{position:absolute!important;top:0;right:0;z-index:101;margin:var(--spacing--l)}.Sidebar_content__lLjwZ{flex:1 1;position:relative;padding:var(--spacing--l);padding-top:0;overflow:auto}.Mapping_mapping__GQrAe{margin-bottom:var(--spacing--l)}.Mapping_mapping__GQrAe:last-child{margin-bottom:0}.Mapping_description__osefE{margin-bottom:var(--spacing--m);font-size:var(--font--size--h3);font-family:var(--font--family--title);font-weight:300}.Mapping_group__4H8Aw,.Mapping_keys__BBLHM{display:flex;flex-wrap:wrap}.Mapping_group__4H8Aw,.Mapping_plus__aoyZw{margin:0 var(--spacing--s)}.Mapping_slash__xSLL1{margin:0 var(--spacing--m)}.Mapping_group__4H8Aw:first-child{margin-left:0}.Mapping_group__4H8Aw:last-child{margin-right:0}.NavButtons_navButtons__2jdaO{display:flex;align-items:center}.NavButtons_button__1mjyl,.NavButtons_separator__4FwOF{margin-right:calc(var(--spacing--l) - 2*var(--spacing--xs))}.NavButtons_button__1mjyl:last-child,.NavButtons_separator__4FwOF:last-child{margin-right:0}.NavButtons_separator__4FwOF{margin-right:calc(var(--spacing--l) - var(--spacing--xs));margin-left:var(--spacing--xs);border-right:var(--border);border-color:var(--color--inactive);height:calc(32px - 2 * var(--spacing--xs))}.NavButtons_error__UMVHy,.NavButtons_error__UMVHy:active,.NavButtons_error__UMVHy:focus,.NavButtons_error__UMVHy:hover{color:var(--color--error)}.NotFound_notFound__yhPFA{height:100%;padding:var(--spacing--l)}.NotFound_link__a1OqI,.NotFound_notFound__yhPFA{display:flex;align-items:center;justify-content:center}.NotFound_link__a1OqI{flex-direction:column;padding:var(--spacing--xxl)}.NotFound_icon__zBP4O{height:204px;width:204px;margin-bottom:var(--spacing--xxl);color:var(--color--red)}.NotFound_tiles__Nxd8Z{height:60px}.Rack_rack__uEE8X{display:flex;box-shadow:var(--box-shadow)}.Rack_tile__kMzR_{position:relative}.Rack_tile__kMzR_:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.Rack_tile__kMzR_:focus-within,.Rack_tile__kMzR_:focus-within *{outline:none}.Rack_tile__kMzR_:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.Radio_radio__06IBr{position:relative;display:flex;align-items:center;padding:var(--spacing--m);transition:var(--transition);cursor:pointer}.Radio_radio__06IBr:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.Radio_radio__06IBr:focus-within,.Radio_radio__06IBr:focus-within *{outline:none}.Radio_radio__06IBr:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.Radio_radio__06IBr.Radio_checked__MlqJv .Radio_icon__ORxR0,.Radio_radio__06IBr:hover .Radio_icon__ORxR0{box-shadow:var(--box-shadow)}.Radio_radio__06IBr.Radio_checked__MlqJv .Radio_icon__ORxR0:after{background-color:var(--color--primary)}.Radio_input__PFpGB{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer}.Radio_icon__ORxR0{flex:0 0 auto;position:relative;width:22px;height:22px;border-radius:50%;border:2px solid var(--color--primary);box-shadow:var(--box-shadow--null);pointer-events:none}.Radio_icon__ORxR0:after{content:" ";position:absolute;top:2px;left:2px;width:14px;height:14px;background-color:transparent;border-radius:50%;transition:var(--transition)}.Radio_content__08chi{flex:1 1;margin-left:var(--spacing--l)}.Character_character__FN97z{display:flex;flex-direction:column;align-items:center;transition:var(--transition)}.Character_character__FN97z.Character_finished__DsFyj{opacity:.2}.Character_character__FN97z.Character_overused__PEXhw{color:red;opacity:1}.Character_character__FN97z.Character_overused__PEXhw .Character_tile__lqZEb:after{position:absolute;top:0;left:0;width:100%;height:100%;content:" ";box-shadow:var(--box-shadow--error)}.Character_count__SSxGA{padding:var(--spacing--xs) 0;text-align:center;font-size:var(--font--size--s)}.RemainingTiles_group___8ILF{margin-bottom:var(--spacing--l)}.RemainingTiles_title__QQYTv{margin-bottom:var(--spacing--m);font-size:var(--font--size--h2);font-weight:300}.RemainingTiles_content__5cnQv{display:grid;grid-template-columns:repeat(5,1fr);grid-gap:var(--spacing--m);gap:var(--spacing--m)}.ResultsInput_resultsInput__geMao:focus-within{position:relative}.ResultsInput_resultsInput__geMao:focus-within:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.ResultsInput_resultsInput__geMao:focus-within:focus-within,.ResultsInput_resultsInput__geMao:focus-within:focus-within *{outline:none}.ResultsInput_resultsInput__geMao:focus-within:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.ResultsInput_input__dc2PT{width:100%;min-height:var(--text-input--height);height:var(--text-input--height);max-height:var(--text-input--height);padding:0 var(--spacing--l);transition:var(--transition);font-size:var(--font--size--s);font-family:var(--font--family);border:none}.Results_results__258ah{position:relative;display:flex;flex-direction:column;height:100%;font-family:var(--font--family--title);font-size:var(--font--size--s)}.Results_emptyState__qSRMr{flex:1 1}.Results_list__zp7CV{transition:var(--transition)}.Results_list__zp7CV.Results_outdated__4j0Ql{filter:blur(2px)}.Results_header__RmHXo{position:relative;z-index:1;display:flex;align-items:center;justify-content:space-between;border-bottom:var(--border);font-size:var(--font--size--s);font-weight:700}.Results_headerButton__qNx0w{padding:0;border:none;outline:none;font:inherit;color:inherit;background:none;position:relative;cursor:pointer;text-transform:uppercase;transition:var(--transition)}.Results_headerButton__qNx0w:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;transition:var(--transition);border-radius:var(--border--radius);box-shadow:0 0 0 var(--focus--box-shadow--size) transparent;pointer-events:none}.Results_headerButton__qNx0w:focus-within,.Results_headerButton__qNx0w:focus-within *{outline:none}.Results_headerButton__qNx0w:focus-within:after{box-shadow:0 0 0 var(--focus--box-shadow--size) var(--color--focus)}.Results_headerButton__qNx0w:focus,.Results_headerButton__qNx0w:hover{background-color:var(--color--primary);color:#fff}.Results_headerButtonLabel__XQiIP{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;flex:0 1 auto;text-align:left}.Results_result__bpPGb{padding:0;border:none;outline:none;font:inherit;color:inherit;background:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:var(--transition);cursor:pointer;font-weight:400}.Results_result__bpPGb:focus:not(:disabled),.Results_result__bpPGb:hover:not(:disabled){background-color:var(--color--primary);color:#fff}.Results_resultContent__fynvQ{display:flex;align-items:center;justify-content:space-between}.Results_resultContent__fynvQ .Results_word__j20u_{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Results_cell__13BH5{display:flex;align-items:center;justify-content:center;padding:var(--spacing--s)}.Results_headerButton__qNx0w:first-child .Results_cell__13BH5,.Results_result__bpPGb .Results_cell__13BH5:first-child{padding-left:calc(var(--spacing--m) + var(--spacing--s));justify-content:flex-start;text-align:left}.Results_headerButton__qNx0w:last-child .Results_cell__13BH5,.Results_result__bpPGb .Results_cell__13BH5:last-child{padding-right:calc(var(--spacing--m) + var(--spacing--s))}.Results_cell__13BH5:last-child{flex:1 1}.Results_word__j20u_{flex:0 0 180px;max-width:180px;text-transform:uppercase}.Results_stat__EguZM{flex:0 0 50px;max-width:50px;justify-content:center}.Results_points__7BAKE{flex:1 0 80px;font-weight:700}.Results_outdatedButton__5fzwS{display:block;margin:0 auto;margin-top:var(--spacing--xxl)}@media(max-width:1024px){.Results_outdatedButton__5fzwS{margin-top:var(--spacing--l)}}@media(max-height:800px){.Results_outdatedButton__5fzwS{margin-top:var(--spacing--l)}}.Results_sortIcon__y02RA{flex:0 0 auto;width:15px;height:15px;margin-left:var(--spacing--s)}.Results_input__B3K40{border-top:var(--border)}.Screen_screen__VnMC9{position:fixed;top:0;bottom:0;left:0;right:0;background-color:var(--color--background);opacity:1;z-index:100}.Screen_closeButton__0QT6U{position:fixed;top:0;right:0;z-index:101;margin:var(--spacing--l)}.Screen_content__t2VCW{position:relative}.AutoGroupTilesSetting_option__cNX7P{margin-bottom:var(--spacing--m)}.AutoGroupTilesSetting_option__cNX7P:last-child{margin-bottom:0}.AutoGroupTilesSetting_label__njnKi{display:flex;align-items:center}.ConfigSetting_option__T_XJr{margin-bottom:var(--spacing--m)}.ConfigSetting_option__T_XJr:last-child{margin-bottom:0}.ConfigSetting_label__SKiut{display:flex;align-items:center}.LocaleSetting_option__86eJS{margin-bottom:var(--spacing--m)}.LocaleSetting_option__86eJS:last-child{margin-bottom:0}.LocaleSetting_option__86eJS.LocaleSetting_checked__9aDcB .LocaleSetting_flag__B1FNp,.LocaleSetting_option__86eJS:hover .LocaleSetting_flag__B1FNp{box-shadow:var(--box-shadow)}.LocaleSetting_label__Nl2tL{display:flex;align-items:center}.LocaleSetting_flag__B1FNp{height:32px;margin-right:var(--spacing--l);box-shadow:var(--box-shadow--null);transition:var(--transition)}.LocaleSetting_flag__B1FNp.LocaleSetting_es__o6mp8{width:48px}.LocaleSetting_flag__B1FNp.LocaleSetting_fr__h7FxL{width:51.2px}.LocaleSetting_flag__B1FNp.LocaleSetting_gb__qt9o9{width:64px}.LocaleSetting_flag__B1FNp.LocaleSetting_pl__Xg3Ib{width:51.2px}.LocaleSetting_flag__B1FNp.LocaleSetting_us__ov8al{width:60.8px}.LocaleSetting_flag__B1FNp.LocaleSetting_de__73PFW{width:51.2px}@-webkit-keyframes Splash_hide__4sfov{0%{opacity:1}to{opacity:0}}@keyframes Splash_hide__4sfov{0%{opacity:1}to{opacity:0}}@-webkit-keyframes Splash_progress__82M_I{0%{-webkit-clip-path:polygon(0 0,0 0,0 100%,0 100%);clip-path:polygon(0 0,0 0,0 100%,0 100%)}to{-webkit-clip-path:polygon(0 0,100% 0,100% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,0 100%)}}@keyframes Splash_progress__82M_I{0%{-webkit-clip-path:polygon(0 0,0 0,0 100%,0 100%);clip-path:polygon(0 0,0 0,0 100%,0 100%)}to{-webkit-clip-path:polygon(0 0,100% 0,100% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,0 100%)}}@-webkit-keyframes Splash_pulse__bc8xX{0%{transform:scale(1)}to{transform:scale(1.2)}}@keyframes Splash_pulse__bc8xX{0%{transform:scale(1)}to{transform:scale(1.2)}}@-webkit-keyframes Splash_wave___xjSZ{0%{transform:translateY(0)}25%{transform:translateY(6px)}75%{transform:translateY(-6px)}to{transform:translateY(0)}}@keyframes Splash_wave___xjSZ{0%{transform:translateY(0)}25%{transform:translateY(6px)}75%{transform:translateY(-6px)}to{transform:translateY(0)}}.Splash_splash__DJBx_{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.Splash_splash__DJBx_.Splash_animated__p0GNp{-webkit-animation:Splash_hide__4sfov;animation:Splash_hide__4sfov;-webkit-animation-delay:.55s;animation-delay:.55s;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.Splash_splash__DJBx_.Splash_animated__p0GNp .Splash_logos__pFer4{-webkit-animation:Splash_pulse__bc8xX;animation:Splash_pulse__bc8xX;-webkit-animation-delay:.55s;animation-delay:.55s;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.Splash_splash__DJBx_.Splash_animated__p0GNp .Splash_logoColor__InOR_{-webkit-animation:Splash_progress__82M_I;animation:Splash_progress__82M_I;-webkit-animation-duration:.45s;animation-duration:.45s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.Splash_logos__pFer4{position:relative;width:50vw;max-width:688px;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:var(--transition)}.Splash_logoGrayscale__qe_QT{filter:grayscale(1);opacity:.3}.Splash_logoColor__InOR_{position:absolute;top:0;left:0;-webkit-clip-path:polygon(0 0,0 0,0 100%,0 100%);clip-path:polygon(0 0,0 0,0 100%,0 100%)}.Splash_author__0gDgp{margin-top:var(--spacing--l);font-family:var(--font--family--title);font-size:var(--font--size--h1);font-weight:300;text-align:center}.Well_well__WTn5e{position:relative;background:#fff;border:var(--border);box-shadow:var(--box-shadow)}
@@ -1,45 +0,0 @@
1
- import { CellJson, Config } from '@scrabble-solver/types';
2
-
3
- import validateRow from './validateRow';
4
-
5
- const validateBoard = (board: unknown, config: Config): void => {
6
- if (!Array.isArray(board)) {
7
- throw new Error('Invalid "board" parameter: not an array');
8
- }
9
-
10
- if (board.length !== config.boardHeight) {
11
- throw new Error(`Invalid "board" parameter: does not have ${config.boardHeight} rows`);
12
- }
13
-
14
- try {
15
- board.forEach((row, rowIndex) => validateRow(row, rowIndex, config));
16
- validateTwoCharacterTiles(board, config);
17
- } catch (error) {
18
- const message = error instanceof Error ? error.message : 'unknown';
19
- throw new Error(`Invalid "board" parameter: ${message}`);
20
- }
21
- };
22
-
23
- const validateTwoCharacterTiles = (board: CellJson[][], config: Config): void => {
24
- const cells: CellJson[] = board
25
- .flat()
26
- .filter((cell) => cell.tile && config.isTwoCharacterTilePrefix(cell.tile.character));
27
-
28
- for (const cell of cells) {
29
- for (const characters of config.twoCharacterTiles) {
30
- const canCheckDown = cell.y + 1 < board.length;
31
- const canCheckRight = cell.x + 1 < board[0].length;
32
- const cellDown = board[cell.y + 1][cell.x];
33
- const cellRight = board[cell.y][cell.x + 1];
34
- const collidesDown = canCheckDown && cellDown.tile && cellDown.tile.character === characters[1];
35
- const collidesRight = canCheckRight && cellRight.tile && cellRight.tile.character === characters[1];
36
- const collides = collidesDown || collidesRight;
37
-
38
- if (cell.tile && characters.startsWith(cell.tile.character) && collides) {
39
- throw new Error(`${characters} can only be used as a single tile`);
40
- }
41
- }
42
- }
43
- };
44
-
45
- export default validateBoard;
@@ -1,40 +0,0 @@
1
- import { Config } from '@scrabble-solver/types';
2
-
3
- import validateTile from './validateTile';
4
-
5
- const validateCell = (cell: unknown, rowIndex: number, cellIndex: number, config: Config): void => {
6
- if (typeof cell !== 'object') {
7
- throw new Error(`board[${rowIndex}][${cellIndex}] is not an object`);
8
- }
9
-
10
- const { x, y, tile, isEmpty } = cell as Record<string, unknown>;
11
-
12
- if (typeof x !== 'number') {
13
- throw new Error(`board[${rowIndex}][${cellIndex}].x is not a number`);
14
- }
15
-
16
- if (x < 0 || x >= config.boardWidth) {
17
- throw new Error(`board[${rowIndex}][${cellIndex}].x is out of bounds`);
18
- }
19
-
20
- if (typeof y !== 'number') {
21
- throw new Error(`board[${rowIndex}][${cellIndex}].y is not a number`);
22
- }
23
-
24
- if (y < 0 || y >= config.boardHeight) {
25
- throw new Error(`board[${rowIndex}][${cellIndex}].y is out of bounds`);
26
- }
27
-
28
- if (typeof isEmpty !== 'boolean') {
29
- throw new Error(`board[${rowIndex}][${cellIndex}].isEmpty is not a boolean`);
30
- }
31
-
32
- try {
33
- validateTile(tile, config);
34
- } catch (error) {
35
- const message = error instanceof Error ? error.message : 'unknown';
36
- throw new Error(`board[${rowIndex}][${cellIndex}].tile ${message}`);
37
- }
38
- };
39
-
40
- export default validateCell;
@@ -1,14 +0,0 @@
1
- import { BLANK } from '@scrabble-solver/constants';
2
- import { Config } from '@scrabble-solver/types';
3
-
4
- const validateCharacter = (character: unknown, config: Config): void => {
5
- if (typeof character !== 'string') {
6
- throw new Error('character is not a string');
7
- }
8
-
9
- if (!config.hasCharacter(character) && character !== BLANK) {
10
- throw new Error('character is not valid');
11
- }
12
- };
13
-
14
- export default validateCharacter;
@@ -1,24 +0,0 @@
1
- import { Config } from '@scrabble-solver/types';
2
-
3
- import validateCharacter from './validateCharacter';
4
-
5
- const validateCharacters = (characters: unknown, config: Config): void => {
6
- if (!Array.isArray(characters)) {
7
- throw new Error('Invalid "characters" parameter: not an array');
8
- }
9
-
10
- if (characters.length === 0) {
11
- throw new Error('Invalid "characters" parameter: empty array');
12
- }
13
-
14
- characters.forEach((character, characterIndex) => {
15
- try {
16
- validateCharacter(character, config);
17
- } catch (error) {
18
- const message = error instanceof Error ? error.message : 'unknown';
19
- throw new Error(`Invalid "characters" parameter: characters[${characterIndex}] ${message}`);
20
- }
21
- });
22
- };
23
-
24
- export default validateCharacters;
@@ -1,9 +0,0 @@
1
- import { isConfigId } from '@scrabble-solver/configs';
2
-
3
- const validateConfigId = (configId: unknown): void => {
4
- if (!isConfigId(configId)) {
5
- throw new Error('Invalid "configId" parameter');
6
- }
7
- };
8
-
9
- export default validateConfigId;
@@ -1,15 +0,0 @@
1
- import { Locale } from '@scrabble-solver/types';
2
-
3
- const locales = Object.values(Locale);
4
-
5
- const validateLocale = (locale: unknown): void => {
6
- if (typeof locale !== 'string') {
7
- throw new Error('Invalid "locale" parameter: not a string');
8
- }
9
-
10
- if (!locales.includes(locale as Locale)) {
11
- throw new Error(`Invalid "locale" parameter: must be one of: ${locales.join(', ')}`);
12
- }
13
- };
14
-
15
- export default validateLocale;
@@ -1,17 +0,0 @@
1
- import { Config } from '@scrabble-solver/types';
2
-
3
- import validateCell from './validateCell';
4
-
5
- const validateRow = (row: unknown, rowIndex: number, config: Config): void => {
6
- if (!Array.isArray(row)) {
7
- throw new Error(`board[${rowIndex}] is not an array`);
8
- }
9
-
10
- if (row.length !== config.boardWidth) {
11
- throw new Error(`board[${rowIndex}] does not have ${config.boardWidth} cells`);
12
- }
13
-
14
- row.forEach((cell, cellIndex) => validateCell(cell, rowIndex, cellIndex, config));
15
- };
16
-
17
- export default validateRow;
@@ -1,21 +0,0 @@
1
- import { Config } from '@scrabble-solver/types';
2
-
3
- import validateCharacter from './validateCharacter';
4
-
5
- const validateTile = (tile: unknown, config: Config): void => {
6
- if (typeof tile !== 'object') {
7
- throw new Error('is not an object');
8
- }
9
-
10
- if (tile !== null) {
11
- const { character, isBlank } = tile as Record<string, unknown>;
12
-
13
- validateCharacter(character, config);
14
-
15
- if (typeof isBlank !== 'boolean') {
16
- throw new Error('isBlank is not a boolean');
17
- }
18
- }
19
- };
20
-
21
- export default validateTile;
@@ -1,11 +0,0 @@
1
- const validateWord = (word: unknown): void => {
2
- if (typeof word !== 'string') {
3
- throw new Error('"word" is not a string');
4
- }
5
-
6
- if (word.length === 0) {
7
- throw new Error('"word" is an empty string');
8
- }
9
- };
10
-
11
- export default validateWord;
@@ -1,7 +0,0 @@
1
- import { Locale } from '@scrabble-solver/types';
2
-
3
- const locales = Object.values(Locale);
4
-
5
- const isLocale = (locale: unknown): locale is Locale => locales.includes(locale as Locale);
6
-
7
- export default isLocale;