scrabble-solver 2.10.2 → 2.10.4

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 (235) hide show
  1. package/README.md +29 -18
  2. package/lerna.json +1 -1
  3. package/package.json +2 -2
  4. package/packages/configs/package-lock.json +4 -4
  5. package/packages/configs/package.json +3 -3
  6. package/packages/constants/package-lock.json +2 -2
  7. package/packages/constants/package.json +1 -1
  8. package/packages/dictionaries/package-lock.json +2 -2
  9. package/packages/dictionaries/package.json +4 -4
  10. package/packages/logger/package-lock.json +2 -2
  11. package/packages/logger/package.json +1 -1
  12. package/packages/scrabble-solver/.next/BUILD_ID +1 -1
  13. package/packages/scrabble-solver/.next/build-manifest.json +31 -19
  14. package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
  15. package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
  16. package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +1 -1
  17. package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
  18. package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
  19. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/0.pack +0 -0
  20. package/packages/scrabble-solver/.next/cache/webpack/edge-server-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/176.js +1269 -1559
  27. package/packages/scrabble-solver/.next/server/chunks/579.js +50 -26
  28. package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
  29. package/packages/scrabble-solver/.next/server/middleware-react-loadable-manifest.js +1 -1
  30. package/packages/scrabble-solver/.next/server/pages/404.html +2 -2
  31. package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
  32. package/packages/scrabble-solver/.next/server/pages/500.html +2 -2
  33. package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
  34. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js +2 -1
  35. package/packages/scrabble-solver/.next/server/pages/api/solve.js +22 -6
  36. package/packages/scrabble-solver/.next/server/pages/index.html +2 -2
  37. package/packages/scrabble-solver/.next/server/pages/index.js +1539 -52
  38. package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
  39. package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
  40. package/packages/scrabble-solver/.next/server/pages-manifest.json +1 -1
  41. package/packages/scrabble-solver/.next/static/P7XhuDLmwJJqC8kgPjX42/_buildManifest.js +1 -0
  42. package/packages/scrabble-solver/.next/static/{FjrbXpI5fkt4lmko-vL_7 → P7XhuDLmwJJqC8kgPjX42}/_ssgManifest.js +0 -0
  43. package/packages/scrabble-solver/.next/static/chunks/490-d29992f1c264d70e.js +5 -0
  44. package/packages/scrabble-solver/.next/static/chunks/528-9942ddad0031ff79.js +1 -0
  45. package/packages/scrabble-solver/.next/static/chunks/pages/{404-24f9617eeb8d6dc1.js → 404-6c99a0c91257c60b.js} +1 -1
  46. package/packages/scrabble-solver/.next/static/chunks/pages/_app-fa0661b072fc6af9.js +24 -0
  47. package/packages/scrabble-solver/.next/static/chunks/pages/index-d761f0af070273d2.js +1 -0
  48. package/packages/scrabble-solver/.next/static/css/78e42ad01f580f64.css +1 -0
  49. package/packages/scrabble-solver/.next/static/css/97eb6ee0c4300c83.css +1 -0
  50. package/packages/scrabble-solver/.next/static/css/dcca0c1a39cf5ef5.css +1 -0
  51. package/packages/scrabble-solver/.next/trace +55 -52
  52. package/packages/scrabble-solver/package-lock.json +27 -2
  53. package/packages/scrabble-solver/package.json +10 -8
  54. package/packages/scrabble-solver/src/components/Badge/Badge.module.scss +4 -5
  55. package/packages/scrabble-solver/src/components/Board/BoardPure.tsx +5 -5
  56. package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.module.scss +15 -2
  57. package/packages/scrabble-solver/src/components/Button/Button.module.scss +10 -38
  58. package/packages/scrabble-solver/src/components/Button/Button.tsx +6 -5
  59. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.module.scss +1 -2
  60. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.tsx +2 -6
  61. package/packages/scrabble-solver/src/components/DictionaryInput/DictionaryInput.module.scss +1 -3
  62. package/packages/scrabble-solver/src/components/EmptyState/EmptyState.module.scss +6 -7
  63. package/packages/scrabble-solver/src/components/EmptyState/EmptyState.tsx +6 -6
  64. package/packages/scrabble-solver/src/components/Key/Key.module.scss +0 -1
  65. package/packages/scrabble-solver/src/components/{Splash/Splash.module.scss → LogoSplashScreen/LogoSplashScreen.module.scss} +1 -1
  66. package/packages/scrabble-solver/src/components/{Splash/Splash.tsx → LogoSplashScreen/LogoSplashScreen.tsx} +7 -7
  67. package/packages/scrabble-solver/src/components/LogoSplashScreen/index.ts +1 -0
  68. package/packages/scrabble-solver/src/components/{Sidebar/Sidebar.module.scss → Modal/Modal.module.scss} +25 -20
  69. package/packages/scrabble-solver/src/components/{Sidebar/Sidebar.tsx → Modal/Modal.tsx} +9 -9
  70. package/packages/scrabble-solver/src/components/{Sidebar → Modal}/components/Section/Section.module.scss +0 -0
  71. package/packages/scrabble-solver/src/components/{Sidebar → Modal}/components/Section/Section.tsx +0 -0
  72. package/packages/scrabble-solver/src/components/{Sidebar → Modal}/components/Section/index.ts +0 -0
  73. package/packages/scrabble-solver/src/components/{Sidebar → Modal}/components/index.ts +0 -0
  74. package/packages/scrabble-solver/src/components/Modal/index.ts +1 -0
  75. package/packages/scrabble-solver/src/components/NavButtons/NavButtons.tsx +22 -3
  76. package/packages/scrabble-solver/src/components/Progress/Progress.module.scss +9 -0
  77. package/packages/scrabble-solver/src/components/Progress/Progress.tsx +38 -0
  78. package/packages/scrabble-solver/src/components/Progress/index.ts +1 -0
  79. package/packages/scrabble-solver/src/components/Rack/Rack.module.scss +2 -0
  80. package/packages/scrabble-solver/src/components/Rack/Rack.tsx +3 -1
  81. package/packages/scrabble-solver/src/components/Rack/RackTile.tsx +3 -2
  82. package/packages/scrabble-solver/src/components/ResultCandidatePicker/ResultCandidatePicker.module.scss +76 -0
  83. package/packages/scrabble-solver/src/components/ResultCandidatePicker/ResultCandidatePicker.tsx +38 -0
  84. package/packages/scrabble-solver/src/components/ResultCandidatePicker/index.ts +1 -0
  85. package/packages/scrabble-solver/src/components/Results/Result.tsx +64 -43
  86. package/packages/scrabble-solver/src/components/Results/Results.module.scss +9 -16
  87. package/packages/scrabble-solver/src/components/Results/Results.tsx +45 -28
  88. package/packages/scrabble-solver/src/components/Results/SolveButton.tsx +9 -7
  89. package/packages/scrabble-solver/src/components/Results/{getColumns.ts → getLocaleColumns.ts} +2 -2
  90. package/packages/scrabble-solver/src/components/Results/types.ts +16 -0
  91. package/packages/scrabble-solver/src/components/Results/useColumns.ts +44 -0
  92. package/packages/scrabble-solver/src/components/ResultsInput/ResultsInput.module.scss +1 -3
  93. package/packages/scrabble-solver/src/components/Sizer/Sizer.module.scss +10 -0
  94. package/packages/scrabble-solver/src/components/Sizer/Sizer.tsx +10 -0
  95. package/packages/scrabble-solver/src/components/Sizer/index.ts +1 -0
  96. package/packages/scrabble-solver/src/components/Solver/Solver.module.scss +83 -27
  97. package/packages/scrabble-solver/src/components/Solver/Solver.tsx +157 -24
  98. package/packages/scrabble-solver/src/components/Solver/components/ApplyButton/ApplyButton.module.scss +5 -0
  99. package/packages/scrabble-solver/src/components/Solver/components/ApplyButton/ApplyButton.tsx +37 -0
  100. package/packages/scrabble-solver/src/components/Solver/components/ApplyButton/index.ts +1 -0
  101. package/packages/scrabble-solver/src/components/Solver/components/EmptyState/EmptyState.module.scss +59 -0
  102. package/packages/scrabble-solver/src/components/Solver/components/EmptyState/EmptyState.tsx +41 -0
  103. package/packages/scrabble-solver/src/components/Solver/components/EmptyState/index.ts +1 -0
  104. package/packages/scrabble-solver/src/components/Solver/components/SolveButton/SolveButton.module.scss +4 -0
  105. package/packages/scrabble-solver/src/components/Solver/components/SolveButton/SolveButton.tsx +42 -0
  106. package/packages/scrabble-solver/src/components/Solver/components/SolveButton/index.ts +1 -0
  107. package/packages/scrabble-solver/src/components/Solver/components/index.ts +3 -0
  108. package/packages/scrabble-solver/src/components/{Screen/Screen.module.scss → SplashScreen/SplashScreen.module.scss} +2 -12
  109. package/packages/scrabble-solver/src/components/{Screen/Screen.tsx → SplashScreen/SplashScreen.tsx} +4 -4
  110. package/packages/scrabble-solver/src/components/SplashScreen/index.ts +1 -0
  111. package/packages/scrabble-solver/src/components/SquareButton/SquareButton.module.scss +3 -3
  112. package/packages/scrabble-solver/src/components/Tile/Tile.module.scss +7 -15
  113. package/packages/scrabble-solver/src/components/Tooltip/Tooltip.module.scss +0 -1
  114. package/packages/scrabble-solver/src/components/index.ts +6 -7
  115. package/packages/scrabble-solver/src/hooks/index.ts +1 -1
  116. package/packages/scrabble-solver/src/hooks/useMediaQuery.ts +11 -0
  117. package/packages/scrabble-solver/src/hooks/usePortal.tsx +1 -1
  118. package/packages/scrabble-solver/src/i18n/de.json +2 -0
  119. package/packages/scrabble-solver/src/i18n/en.json +2 -0
  120. package/packages/scrabble-solver/src/i18n/es.json +2 -0
  121. package/packages/scrabble-solver/src/i18n/fa.json +2 -0
  122. package/packages/scrabble-solver/src/i18n/fr.json +2 -0
  123. package/packages/scrabble-solver/src/i18n/pl.json +2 -0
  124. package/packages/scrabble-solver/src/icons/CardChecklist.svg +5 -0
  125. package/packages/scrabble-solver/src/icons/Check.svg +2 -2
  126. package/packages/scrabble-solver/src/icons/ChevronDown.svg +4 -0
  127. package/packages/scrabble-solver/src/icons/CrossCircleFill.svg +4 -0
  128. package/packages/scrabble-solver/src/icons/{CrossFill.svg → CrossSquareFill.svg} +0 -0
  129. package/packages/scrabble-solver/src/icons/ExclamationTriangleFill.svg +4 -0
  130. package/packages/scrabble-solver/src/icons/InfoCircleFill.svg +4 -0
  131. package/packages/scrabble-solver/src/icons/List.svg +4 -0
  132. package/packages/scrabble-solver/src/icons/Search.svg +4 -0
  133. package/packages/scrabble-solver/src/icons/index.ts +8 -2
  134. package/packages/scrabble-solver/src/{components/KeyMap/KeyMap.tsx → modals/KeyMapModal/KeyMapModal.tsx} +11 -13
  135. package/packages/scrabble-solver/src/{components/KeyMap → modals/KeyMapModal}/components/Mapping/Mapping.module.scss +0 -0
  136. package/packages/scrabble-solver/src/{components/KeyMap → modals/KeyMapModal}/components/Mapping/Mapping.tsx +0 -0
  137. package/packages/scrabble-solver/src/{components/KeyMap → modals/KeyMapModal}/components/Mapping/index.ts +0 -0
  138. package/packages/scrabble-solver/src/{components/KeyMap → modals/KeyMapModal}/components/index.ts +0 -0
  139. package/packages/scrabble-solver/src/modals/KeyMapModal/index.ts +1 -0
  140. package/packages/scrabble-solver/src/{components/KeyMap → modals/KeyMapModal}/keys.tsx +1 -2
  141. package/packages/scrabble-solver/src/modals/MenuModal/MenuModal.module.scss +46 -0
  142. package/packages/scrabble-solver/src/modals/MenuModal/MenuModal.tsx +54 -0
  143. package/packages/scrabble-solver/src/modals/MenuModal/index.ts +1 -0
  144. package/packages/scrabble-solver/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss +28 -0
  145. package/packages/scrabble-solver/src/{components/RemainingTiles/RemainingTiles.tsx → modals/RemainingTilesModal/RemainingTilesModal.tsx} +14 -12
  146. package/packages/scrabble-solver/src/{components/RemainingTiles → modals/RemainingTilesModal/components/Character}/Character.module.scss +6 -2
  147. package/packages/scrabble-solver/src/{components/RemainingTiles → modals/RemainingTilesModal/components/Character}/Character.tsx +11 -3
  148. package/packages/scrabble-solver/src/modals/RemainingTilesModal/components/Character/index.ts +1 -0
  149. package/packages/scrabble-solver/src/modals/RemainingTilesModal/components/index.ts +1 -0
  150. package/packages/scrabble-solver/src/modals/RemainingTilesModal/index.ts +1 -0
  151. package/packages/scrabble-solver/src/modals/ResultsModal/ResultsModal.module.scss +7 -0
  152. package/packages/scrabble-solver/src/modals/ResultsModal/ResultsModal.tsx +58 -0
  153. package/packages/scrabble-solver/src/modals/ResultsModal/index.ts +1 -0
  154. package/packages/scrabble-solver/src/modals/SettingsModal/SettingsModal.tsx +34 -0
  155. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/AutoGroupTilesSetting/AutoGroupTilesSetting.module.scss +0 -0
  156. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -2
  157. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/AutoGroupTilesSetting/constants.ts +0 -0
  158. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/AutoGroupTilesSetting/index.ts +0 -0
  159. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/AutoGroupTilesSetting/lib.ts +0 -0
  160. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/ConfigSetting/ConfigSetting.module.scss +0 -0
  161. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/ConfigSetting/ConfigSetting.tsx +1 -2
  162. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/ConfigSetting/index.ts +0 -0
  163. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/ConfigSetting/options.ts +0 -0
  164. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/ConfigSetting/types.ts +0 -0
  165. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/LocaleSetting/LocaleSetting.module.scss +0 -0
  166. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/LocaleSetting/LocaleSetting.tsx +1 -2
  167. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/LocaleSetting/index.ts +0 -0
  168. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/LocaleSetting/options.ts +0 -0
  169. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/LocaleSetting/types.ts +0 -0
  170. package/packages/scrabble-solver/src/{components/Settings → modals/SettingsModal}/components/index.ts +0 -0
  171. package/packages/scrabble-solver/src/modals/SettingsModal/index.ts +1 -0
  172. package/packages/scrabble-solver/src/{components/Words/Words.module.scss → modals/WordsModal/WordsModal.module.scss} +7 -1
  173. package/packages/scrabble-solver/src/{components/Words/Words.tsx → modals/WordsModal/WordsModal.tsx} +10 -12
  174. package/packages/scrabble-solver/src/modals/WordsModal/index.ts +1 -0
  175. package/packages/scrabble-solver/src/modals/index.ts +6 -0
  176. package/packages/scrabble-solver/src/pages/api/dictionary/[locale]/[word].ts +2 -1
  177. package/packages/scrabble-solver/src/pages/index.module.scss +6 -4
  178. package/packages/scrabble-solver/src/pages/index.tsx +63 -26
  179. package/packages/scrabble-solver/src/parameters/index.ts +28 -6
  180. package/packages/scrabble-solver/src/state/createAppStore.ts +7 -4
  181. package/packages/scrabble-solver/src/styles/mixins.scss +15 -13
  182. package/packages/scrabble-solver/src/styles/variables.scss +15 -17
  183. package/packages/scrabble-solver/src/types/index.ts +2 -0
  184. package/packages/scrabble-solver/tsconfig.json +1 -0
  185. package/packages/solver/package-lock.json +2 -2
  186. package/packages/solver/package.json +5 -5
  187. package/packages/types/package-lock.json +3 -3
  188. package/packages/types/package.json +2 -2
  189. package/packages/word-definitions/package-lock.json +8 -8
  190. package/packages/word-definitions/package.json +2 -2
  191. package/packages/word-lists/package-lock.json +2 -2
  192. package/packages/word-lists/package.json +2 -2
  193. package/packages/scrabble-solver/.next/cache/webpack/client-development/0.pack +0 -0
  194. package/packages/scrabble-solver/.next/cache/webpack/client-development/1.pack +0 -0
  195. package/packages/scrabble-solver/.next/cache/webpack/client-development/2.pack +0 -0
  196. package/packages/scrabble-solver/.next/cache/webpack/client-development/3.pack +0 -0
  197. package/packages/scrabble-solver/.next/cache/webpack/client-development/4.pack +0 -0
  198. package/packages/scrabble-solver/.next/cache/webpack/client-development/index.pack +0 -0
  199. package/packages/scrabble-solver/.next/cache/webpack/client-development/index.pack.old +0 -0
  200. package/packages/scrabble-solver/.next/cache/webpack/server-development/0.pack +0 -0
  201. package/packages/scrabble-solver/.next/cache/webpack/server-development/10.pack_ +0 -0
  202. package/packages/scrabble-solver/.next/cache/webpack/server-development/5.pack_ +0 -0
  203. package/packages/scrabble-solver/.next/cache/webpack/server-development/8.pack_ +0 -0
  204. package/packages/scrabble-solver/.next/cache/webpack/server-development/index.pack +0 -0
  205. package/packages/scrabble-solver/.next/static/FjrbXpI5fkt4lmko-vL_7/_buildManifest.js +0 -1
  206. package/packages/scrabble-solver/.next/static/chunks/361-d16f336a9752a55a.js +0 -1
  207. package/packages/scrabble-solver/.next/static/chunks/724-eb48df4d1ba3df8b.js +0 -5
  208. package/packages/scrabble-solver/.next/static/chunks/amp.js +0 -720
  209. package/packages/scrabble-solver/.next/static/chunks/main.js +0 -1076
  210. package/packages/scrabble-solver/.next/static/chunks/pages/_app-959e495f0f221247.js +0 -24
  211. package/packages/scrabble-solver/.next/static/chunks/pages/_app.js +0 -2121
  212. package/packages/scrabble-solver/.next/static/chunks/pages/_error.js +0 -28
  213. package/packages/scrabble-solver/.next/static/chunks/pages/index-1e30dafa41bddb80.js +0 -1
  214. package/packages/scrabble-solver/.next/static/chunks/pages/index.js +0 -5314
  215. package/packages/scrabble-solver/.next/static/chunks/react-refresh.js +0 -62
  216. package/packages/scrabble-solver/.next/static/chunks/webpack.js +0 -1237
  217. package/packages/scrabble-solver/.next/static/css/aafd07997120f1e4.css +0 -1
  218. package/packages/scrabble-solver/.next/static/css/c8d26240c04079b9.css +0 -1
  219. package/packages/scrabble-solver/.next/static/css/eb9d57f7103525ab.css +0 -1
  220. package/packages/scrabble-solver/.next/static/development/_buildManifest.js +0 -1
  221. package/packages/scrabble-solver/.next/static/development/_ssgManifest.js +0 -1
  222. package/packages/scrabble-solver/.next/static/webpack/fb4b50d5e70ee127.webpack.hot-update.json +0 -1
  223. package/packages/scrabble-solver/.next/static/webpack/pages/index.fb4b50d5e70ee127.hot-update.js +0 -171
  224. package/packages/scrabble-solver/.next/static/webpack/webpack.fb4b50d5e70ee127.hot-update.js +0 -18
  225. package/packages/scrabble-solver/src/components/KeyMap/index.ts +0 -1
  226. package/packages/scrabble-solver/src/components/RemainingTiles/RemainingTiles.module.scss +0 -16
  227. package/packages/scrabble-solver/src/components/RemainingTiles/index.ts +0 -1
  228. package/packages/scrabble-solver/src/components/Screen/index.ts +0 -1
  229. package/packages/scrabble-solver/src/components/Settings/Settings.tsx +0 -35
  230. package/packages/scrabble-solver/src/components/Settings/index.ts +0 -1
  231. package/packages/scrabble-solver/src/components/Sidebar/index.ts +0 -1
  232. package/packages/scrabble-solver/src/components/Splash/index.ts +0 -1
  233. package/packages/scrabble-solver/src/components/Words/index.ts +0 -1
  234. package/packages/scrabble-solver/src/hooks/useIsTablet.ts +0 -10
  235. package/packages/scrabble-solver/src/icons/Play.svg +0 -4
@@ -0,0 +1,54 @@
1
+ import { FunctionComponent } from 'react';
2
+
3
+ import { Modal } from 'components';
4
+ import { CardChecklist, Cog, Github, Sack } from 'icons';
5
+ import { GITHUB_PROJECT_URL } from 'parameters';
6
+ import { useTranslate } from 'state';
7
+
8
+ import styles from './MenuModal.module.scss';
9
+
10
+ interface Props {
11
+ className?: string;
12
+ isOpen: boolean;
13
+ onClose: () => void;
14
+ onShowRemainingTiles: () => void;
15
+ onShowSettings: () => void;
16
+ onShowWords: () => void;
17
+ }
18
+
19
+ const Menu: FunctionComponent<Props> = ({
20
+ className,
21
+ isOpen,
22
+ onClose,
23
+ onShowRemainingTiles,
24
+ onShowSettings,
25
+ onShowWords,
26
+ }) => {
27
+ const translate = useTranslate();
28
+
29
+ return (
30
+ <Modal className={className} isOpen={isOpen} title={translate('menu')} onClose={onClose}>
31
+ <button className={styles.button} onClick={onShowRemainingTiles}>
32
+ <Sack className={styles.icon} />
33
+ <div className={styles.content}>{translate('remaining-tiles')}</div>
34
+ </button>
35
+
36
+ <button className={styles.button} onClick={onShowWords}>
37
+ <CardChecklist className={styles.icon} />
38
+ <div className={styles.content}>{translate('words')}</div>
39
+ </button>
40
+
41
+ <a className={styles.button} href={GITHUB_PROJECT_URL} rel="noopener noreferrer" target="_blank">
42
+ <Github className={styles.icon} />
43
+ <div className={styles.content}>{translate('github')}</div>
44
+ </a>
45
+
46
+ <button className={styles.button} onClick={onShowSettings}>
47
+ <Cog className={styles.icon} />
48
+ <div className={styles.content}>{translate('settings')}</div>
49
+ </button>
50
+ </Modal>
51
+ );
52
+ };
53
+
54
+ export default Menu;
@@ -0,0 +1 @@
1
+ export { default } from './MenuModal';
@@ -0,0 +1,28 @@
1
+ .title {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: space-between;
5
+ flex-wrap: wrap;
6
+ }
7
+
8
+ .content {
9
+ display: flex;
10
+ flex-wrap: wrap;
11
+ gap: var(--spacing--l);
12
+ }
13
+
14
+ .badge {
15
+ [dir='ltr'] & {
16
+ margin-left: var(--spacing--m);
17
+ }
18
+
19
+ [dir='rtl'] & {
20
+ margin-right: var(--spacing--m);
21
+ }
22
+ }
23
+
24
+ .character {
25
+ display: flex;
26
+ flex: 0 1;
27
+ max-width: 50px;
28
+ }
@@ -1,13 +1,11 @@
1
1
  import { FunctionComponent } from 'react';
2
2
 
3
+ import { Badge, Modal } from 'components';
3
4
  import { LOCALE_FEATURES } from 'i18n';
4
5
  import { selectLocale, selectRemainingTilesGroups, useTranslate, useTypedSelector } from 'state';
5
6
 
6
- import Badge from '../Badge';
7
- import Sidebar from '../Sidebar';
8
-
9
- import Character from './Character';
10
- import styles from './RemainingTiles.module.scss';
7
+ import { Character } from './components';
8
+ import styles from './RemainingTilesModal.module.scss';
11
9
 
12
10
  interface Props {
13
11
  className?: string;
@@ -15,20 +13,20 @@ interface Props {
15
13
  onClose: () => void;
16
14
  }
17
15
 
18
- const RemainingTiles: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
16
+ const RemainingTilesModal: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
19
17
  const translate = useTranslate();
20
18
  const locale = useTypedSelector(selectLocale);
21
19
  const groups = useTypedSelector(selectRemainingTilesGroups);
22
20
  const { direction } = LOCALE_FEATURES[locale];
23
21
 
24
22
  return (
25
- <Sidebar className={className} isOpen={isOpen} title={translate('remaining-tiles')} onClose={onClose}>
23
+ <Modal className={className} isOpen={isOpen} title={translate('remaining-tiles')} onClose={onClose}>
26
24
  {groups.map(({ remainingCount, tiles, translationKey, totalCount }) => {
27
25
  const current = direction === 'ltr' ? remainingCount : totalCount;
28
26
  const total = direction === 'ltr' ? totalCount : remainingCount;
29
27
 
30
28
  return (
31
- <Sidebar.Section
29
+ <Modal.Section
32
30
  key={translationKey}
33
31
  title={
34
32
  <span className={styles.title}>
@@ -41,14 +39,18 @@ const RemainingTiles: FunctionComponent<Props> = ({ className, isOpen, onClose }
41
39
  >
42
40
  <div className={styles.content}>
43
41
  {tiles.map((tile) => {
44
- return <Character key={tile.character} tile={tile} />;
42
+ return (
43
+ <div className={styles.character} key={tile.character}>
44
+ <Character tile={tile} />
45
+ </div>
46
+ );
45
47
  })}
46
48
  </div>
47
- </Sidebar.Section>
49
+ </Modal.Section>
48
50
  );
49
51
  })}
50
- </Sidebar>
52
+ </Modal>
51
53
  );
52
54
  };
53
55
 
54
- export default RemainingTiles;
56
+ export default RemainingTilesModal;
@@ -25,8 +25,12 @@
25
25
  }
26
26
  }
27
27
 
28
+ .remaining {
29
+ height: 6px;
30
+ margin-top: var(--spacing--m);
31
+ }
32
+
28
33
  .count {
29
34
  padding: var(--spacing--xs) 0;
30
- text-align: center;
31
- font-size: var(--font--size--s);
35
+ white-space: nowrap;
32
36
  }
@@ -2,13 +2,12 @@ import { BLANK } from '@scrabble-solver/constants';
2
2
  import classNames from 'classnames';
3
3
  import { FunctionComponent } from 'react';
4
4
 
5
+ import { Progress, Tile } from 'components';
5
6
  import { LOCALE_FEATURES } from 'i18n';
6
7
  import { REMAINING_TILES_TILE_SIZE } from 'parameters';
7
8
  import { selectCharacterPoints, selectLocale, useTypedSelector } from 'state';
8
9
  import { RemainingTile } from 'types';
9
10
 
10
- import Tile from '../Tile';
11
-
12
11
  import styles from './Character.module.scss';
13
12
 
14
13
  interface Props {
@@ -30,7 +29,6 @@ const Character: FunctionComponent<Props> = ({ tile }) => {
30
29
  [styles.finished]: remainingCount <= 0,
31
30
  [styles.overused]: remainingCount < 0,
32
31
  })}
33
- key={character}
34
32
  >
35
33
  <Tile
36
34
  character={character}
@@ -42,6 +40,16 @@ const Character: FunctionComponent<Props> = ({ tile }) => {
42
40
  raised
43
41
  size={REMAINING_TILES_TILE_SIZE}
44
42
  />
43
+
44
+ <Progress
45
+ className={styles.remaining}
46
+ max={count}
47
+ style={{
48
+ width: REMAINING_TILES_TILE_SIZE,
49
+ }}
50
+ value={remainingCount}
51
+ />
52
+
45
53
  <div className={styles.count}>
46
54
  {current.toLocaleString(locale)} / {total.toLocaleString(locale)}
47
55
  </div>
@@ -0,0 +1 @@
1
+ export { default } from './Character';
@@ -0,0 +1 @@
1
+ export { default as Character } from './Character';
@@ -0,0 +1 @@
1
+ export { default } from './RemainingTilesModal';
@@ -0,0 +1,7 @@
1
+ .content {
2
+ position: relative;
3
+ display: flex;
4
+ flex-direction: column;
5
+ height: 100%;
6
+ background-color: white;
7
+ }
@@ -0,0 +1,58 @@
1
+ import { Result } from '@scrabble-solver/types';
2
+ import { FunctionComponent, useMemo } from 'react';
3
+ import { useDispatch } from 'react-redux';
4
+ import { useMeasure } from 'react-use';
5
+
6
+ import { Modal, Results, Sizer, Well } from 'components';
7
+ import { useMediaQuery } from 'hooks';
8
+ import {
9
+ resultsSlice,
10
+ selectResultCandidate,
11
+ selectSortedFilteredResults,
12
+ useTranslate,
13
+ useTypedSelector,
14
+ } from 'state';
15
+
16
+ import styles from './ResultsModal.module.scss';
17
+
18
+ interface Props {
19
+ className?: string;
20
+ isOpen: boolean;
21
+ onClose: () => void;
22
+ }
23
+
24
+ const ResultsModal: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
25
+ const dispatch = useDispatch();
26
+ const translate = useTranslate();
27
+ const [sizerRef, { height, width }] = useMeasure<HTMLDivElement>();
28
+ const isLessThanM = useMediaQuery('<m');
29
+ const results = useTypedSelector(selectSortedFilteredResults);
30
+ const resultCandidate = useTypedSelector(selectResultCandidate);
31
+ const index = (results || []).findIndex((result) => result.id === resultCandidate?.id);
32
+ const highlightedIndex = index === -1 ? undefined : index;
33
+
34
+ const callbacks = useMemo(
35
+ () => ({
36
+ onClick: (result: Result) => {
37
+ dispatch(resultsSlice.actions.changeResultCandidate(result));
38
+
39
+ if (isLessThanM) {
40
+ onClose();
41
+ }
42
+ },
43
+ }),
44
+ [dispatch, isLessThanM, onClose],
45
+ );
46
+
47
+ return (
48
+ <Modal className={className} isOpen={isOpen} title={translate('results')} onClose={onClose}>
49
+ <Well className={styles.content}>
50
+ <Sizer ref={sizerRef} />
51
+
52
+ <Results callbacks={callbacks} height={height} highlightedIndex={highlightedIndex} width={width} />
53
+ </Well>
54
+ </Modal>
55
+ );
56
+ };
57
+
58
+ export default ResultsModal;
@@ -0,0 +1 @@
1
+ export { default } from './ResultsModal';
@@ -0,0 +1,34 @@
1
+ import { FunctionComponent } from 'react';
2
+
3
+ import { Modal } from 'components';
4
+ import { useTranslate } from 'state';
5
+
6
+ import { AutoGroupTilesSetting, ConfigSetting, LocaleSetting } from './components';
7
+
8
+ interface Props {
9
+ className?: string;
10
+ isOpen: boolean;
11
+ onClose: () => void;
12
+ }
13
+
14
+ const SettingsModal: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
15
+ const translate = useTranslate();
16
+
17
+ return (
18
+ <Modal className={className} isOpen={isOpen} title={translate('settings')} onClose={onClose}>
19
+ <Modal.Section title={translate('settings.game')}>
20
+ <ConfigSetting disabled={!isOpen} />
21
+ </Modal.Section>
22
+
23
+ <Modal.Section title={translate('settings.language')}>
24
+ <LocaleSetting disabled={!isOpen} />
25
+ </Modal.Section>
26
+
27
+ <Modal.Section title={translate('settings.autoGroupTiles')}>
28
+ <AutoGroupTilesSetting disabled={!isOpen} />
29
+ </Modal.Section>
30
+ </Modal>
31
+ );
32
+ };
33
+
34
+ export default SettingsModal;
@@ -1,10 +1,9 @@
1
1
  import { ChangeEvent, FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
+ import { Radio } from 'components';
4
5
  import { selectAutoGroupTiles, settingsSlice, useTranslate, useTypedSelector } from 'state';
5
6
 
6
- import Radio from '../../../Radio';
7
-
8
7
  import styles from './AutoGroupTilesSetting.module.scss';
9
8
  import { NULL_VALUE } from './constants';
10
9
  import { parseValue } from './lib';
@@ -1,10 +1,9 @@
1
1
  import { ChangeEvent, FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
+ import { Radio } from 'components';
4
5
  import { selectConfigId, settingsSlice, useTypedSelector } from 'state';
5
6
 
6
- import Radio from '../../../Radio';
7
-
8
7
  import styles from './ConfigSetting.module.scss';
9
8
  import options from './options';
10
9
 
@@ -3,10 +3,9 @@ import classNames from 'classnames';
3
3
  import { ChangeEvent, FunctionComponent } from 'react';
4
4
  import { useDispatch } from 'react-redux';
5
5
 
6
+ import { Radio } from 'components';
6
7
  import { selectLocale, settingsSlice, useTypedSelector } from 'state';
7
8
 
8
- import Radio from '../../../Radio';
9
-
10
9
  import styles from './LocaleSetting.module.scss';
11
10
  import options from './options';
12
11
 
@@ -0,0 +1 @@
1
+ export { default } from './SettingsModal';
@@ -6,7 +6,13 @@
6
6
  }
7
7
 
8
8
  .badge {
9
- margin-left: var(--spacing--m);
9
+ [dir='ltr'] & {
10
+ margin-left: var(--spacing--m);
11
+ }
12
+
13
+ [dir='rtl'] & {
14
+ margin-right: var(--spacing--m);
15
+ }
10
16
  }
11
17
 
12
18
  .word {
@@ -1,13 +1,11 @@
1
1
  import classNames from 'classnames';
2
2
  import { FunctionComponent } from 'react';
3
3
 
4
+ import { Badge, Modal } from 'components';
4
5
  import { Check, Cross } from 'icons';
5
6
  import { selectLocale, selectVerify, useTranslate, useTypedSelector } from 'state';
6
7
 
7
- import Badge from '../Badge';
8
- import Sidebar from '../Sidebar';
9
-
10
- import styles from './Words.module.scss';
8
+ import styles from './WordsModal.module.scss';
11
9
 
12
10
  interface Props {
13
11
  className?: string;
@@ -15,14 +13,14 @@ interface Props {
15
13
  onClose: () => void;
16
14
  }
17
15
 
18
- const Words: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
16
+ const WordsModal: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
19
17
  const translate = useTranslate();
20
18
  const locale = useTypedSelector(selectLocale);
21
19
  const { invalidWords, validWords } = useTypedSelector(selectVerify);
22
20
 
23
21
  return (
24
- <Sidebar className={className} isOpen={isOpen} title={translate('words')} onClose={onClose}>
25
- <Sidebar.Section
22
+ <Modal className={className} isOpen={isOpen} title={translate('words')} onClose={onClose}>
23
+ <Modal.Section
26
24
  title={
27
25
  <span className={styles.title}>
28
26
  <span>{translate('words.invalid')}</span>
@@ -35,9 +33,9 @@ const Words: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
35
33
  <Cross className={classNames(styles.icon, styles.invalid)} /> {word}
36
34
  </div>
37
35
  ))}
38
- </Sidebar.Section>
36
+ </Modal.Section>
39
37
 
40
- <Sidebar.Section
38
+ <Modal.Section
41
39
  title={
42
40
  <span className={styles.title}>
43
41
  <span>{translate('words.valid')}</span>
@@ -50,9 +48,9 @@ const Words: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
50
48
  <Check className={classNames(styles.icon, styles.valid)} /> {word}
51
49
  </div>
52
50
  ))}
53
- </Sidebar.Section>
54
- </Sidebar>
51
+ </Modal.Section>
52
+ </Modal>
55
53
  );
56
54
  };
57
55
 
58
- export default Words;
56
+ export default WordsModal;
@@ -0,0 +1 @@
1
+ export { default } from './WordsModal';
@@ -0,0 +1,6 @@
1
+ export { default as KeyMapModal } from './KeyMapModal';
2
+ export { default as MenuModal } from './MenuModal';
3
+ export { default as RemainingTilesModal } from './RemainingTilesModal';
4
+ export { default as ResultsModal } from './ResultsModal';
5
+ export { default as SettingsModal } from './SettingsModal';
6
+ export { default as WordsModal } from './WordsModal';
@@ -12,7 +12,8 @@ interface RequestData {
12
12
  words: string[];
13
13
  }
14
14
 
15
- const MAXIMUM_WORDS_COUNT = scrabble['en-US'].maximumCharactersCount;
15
+ const MAXIMUM_COLLISIONS_COUNT = scrabble['en-US'].maximumCharactersCount;
16
+ const MAXIMUM_WORDS_COUNT = MAXIMUM_COLLISIONS_COUNT + 1;
16
17
 
17
18
  const dictionary = async (request: NextApiRequest, response: NextApiResponse): Promise<void> => {
18
19
  const meta = getServerLoggingData(request);
@@ -4,10 +4,8 @@
4
4
  display: flex;
5
5
  flex-direction: column;
6
6
  height: 100%;
7
- min-width: 900px;
8
- min-height: 700px;
9
7
  opacity: 0;
10
- overflow: hidden;
8
+ overflow: auto;
11
9
  transition: var(--transition);
12
10
  transition-duration: var(--transition--duration--long);
13
11
 
@@ -20,6 +18,10 @@
20
18
  position: relative;
21
19
  z-index: 1;
22
20
  flex: 0 0 auto;
21
+ }
22
+
23
+ .navContent {
24
+ width: 100%;
23
25
  display: flex;
24
26
  align-items: flex-start;
25
27
  padding: var(--spacing--l);
@@ -38,7 +40,7 @@
38
40
  height: 60px;
39
41
  user-select: none;
40
42
 
41
- @include tablet {
43
+ @include media('<l') {
42
44
  height: 48px;
43
45
  }
44
46
  }