@scrabble-solver/scrabble-solver 2.16.7 → 2.18.0

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 (370) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +22 -20
  3. package/.next/cache/.previewinfo +1 -1
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/cache/webpack/client-production/0.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack +0 -0
  8. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  9. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  10. package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
  11. package/.next/cache/webpack/server-production/0.pack +0 -0
  12. package/.next/cache/webpack/server-production/index.pack +0 -0
  13. package/.next/cache/webpack/server-production/index.pack.old +0 -0
  14. package/.next/diagnostics/framework.json +1 -1
  15. package/.next/dynamic-css-manifest.json +8 -1
  16. package/.next/next-minimal-server.js.nft.json +1 -1
  17. package/.next/next-server.js.nft.json +1 -1
  18. package/.next/prerender-manifest.json +4 -4
  19. package/.next/react-loadable-manifest.json +176 -1
  20. package/.next/required-server-files.js +3 -2
  21. package/.next/required-server-files.json +3 -2
  22. package/.next/routes-manifest.json +1 -1
  23. package/.next/server/chunks/30.js +1 -1
  24. package/.next/server/chunks/309.js +1 -0
  25. package/.next/server/chunks/316.js +1 -0
  26. package/.next/server/chunks/344.js +1 -0
  27. package/.next/server/chunks/371.js +1 -0
  28. package/.next/server/chunks/392.js +1 -1
  29. package/.next/server/chunks/465.js +1 -0
  30. package/.next/server/chunks/546.js +1 -0
  31. package/.next/server/chunks/623.js +1 -0
  32. package/.next/server/chunks/624.js +1 -0
  33. package/.next/server/chunks/641.js +1 -0
  34. package/.next/server/chunks/671.js +1 -1
  35. package/.next/server/chunks/692.js +1 -0
  36. package/.next/server/chunks/705.js +1 -0
  37. package/.next/server/chunks/712.js +1 -1
  38. package/.next/server/chunks/846.js +1 -0
  39. package/.next/server/chunks/853.js +15 -0
  40. package/.next/server/chunks/886.js +1 -0
  41. package/.next/server/chunks/916.js +1 -0
  42. package/.next/server/chunks/953.js +1 -0
  43. package/.next/server/chunks/961.js +1 -0
  44. package/.next/server/chunks/968.js +1 -0
  45. package/.next/server/dynamic-css-manifest.js +1 -1
  46. package/.next/server/middleware-build-manifest.js +1 -1
  47. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  48. package/.next/server/pages/404.html +28 -1
  49. package/.next/server/pages/500.html +28 -1
  50. package/.next/server/pages/_app.js +1 -1
  51. package/.next/server/pages/_app.js.nft.json +1 -1
  52. package/.next/server/pages/_document.js +28 -1
  53. package/.next/server/pages/_document.js.nft.json +1 -1
  54. package/.next/server/pages/_error.js +28 -1
  55. package/.next/server/pages/_error.js.nft.json +1 -1
  56. package/.next/server/pages/api/dictionary/[locale]/[word].js +1 -1
  57. package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  58. package/.next/server/pages/api/dictionary/[locale].js +1 -1
  59. package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  60. package/.next/server/pages/api/solve.js +1 -1
  61. package/.next/server/pages/api/solve.js.nft.json +1 -1
  62. package/.next/server/pages/api/verify.js +1 -1
  63. package/.next/server/pages/api/verify.js.nft.json +1 -1
  64. package/.next/server/pages/api/visit.js.nft.json +1 -1
  65. package/.next/server/pages/index.html +28 -1
  66. package/.next/server/pages/index.js +30 -1
  67. package/.next/server/pages/index.js.nft.json +1 -1
  68. package/.next/server/pages/index.json +1 -1
  69. package/.next/server/pages/not-found.html +28 -1
  70. package/.next/server/pages/not-found.js.nft.json +1 -1
  71. package/.next/server/pages-manifest.json +1 -1
  72. package/.next/server/webpack-api-runtime.js +1 -1
  73. package/.next/server/webpack-runtime.js +1 -1
  74. package/.next/static/FL82obwzFHRzvV6z76I-U/_buildManifest.js +1 -0
  75. package/.next/static/chunks/101-829ab8a8d310e7a0.js +3 -0
  76. package/.next/static/chunks/106.e414e88694add27f.js +1 -0
  77. package/.next/static/chunks/127.125d896a19061d71.js +1 -0
  78. package/.next/static/chunks/18.8b91e137d239e15c.js +1 -0
  79. package/.next/static/chunks/277.6785dfaf22fdb0b7.js +1 -0
  80. package/.next/static/chunks/307.67f52f13e3d60d4e.js +1 -0
  81. package/.next/static/chunks/341.79535ba85bf1986f.js +1 -0
  82. package/.next/static/chunks/363.01eed3233f92b6a4.js +1 -0
  83. package/.next/static/chunks/422.1559ae6756912ca5.js +1 -0
  84. package/.next/static/chunks/541.dcd9e8b804f88da5.js +1 -0
  85. package/.next/static/chunks/583.7a46807be14c377e.js +1 -0
  86. package/.next/static/chunks/631.98d42abad0a60af6.js +1 -0
  87. package/.next/static/chunks/663.d2c9ca36b26695b8.js +1 -0
  88. package/.next/static/chunks/711.ba7b8f900dfd40d0.js +1 -0
  89. package/.next/static/chunks/744.b06c9a3de4a1d877.js +1 -0
  90. package/.next/static/chunks/820.97b82f751ca49579.js +1 -0
  91. package/.next/static/chunks/865.a9b563a45848a83c.js +1 -0
  92. package/.next/static/chunks/912.ff8037ba9d4db5c8.js +1 -0
  93. package/.next/static/chunks/939.19b33a3d3c351d73.js +1 -0
  94. package/.next/static/chunks/990.61296e5870b91f11.js +1 -0
  95. package/.next/static/chunks/framework-626cbd48ac5aca57.js +1 -0
  96. package/.next/static/chunks/main-b92e08f3fc96dd8d.js +5 -0
  97. package/.next/static/chunks/pages/_app-ba5d628e81a15461.js +1 -0
  98. package/.next/static/chunks/pages/{_error-afeda7c5231b6c3c.js → _error-f0290a98eb3ed0ec.js} +1 -1
  99. package/.next/static/chunks/pages/index-5f9fa6ac3cd3d97b.js +1 -0
  100. package/.next/static/chunks/pages/not-found-23d61fd3ed791cad.js +1 -0
  101. package/.next/static/chunks/webpack-e34c3ae12275e978.js +1 -0
  102. package/.next/static/css/2d03f0da2c678dfc.css +1 -0
  103. package/.next/static/css/7b6724d2df70f48f.css +1 -0
  104. package/.next/static/css/abc2425d3ba607bc.css +1 -0
  105. package/.next/static/css/b736be3bd02b5d99.css +1 -0
  106. package/.next/static/css/b74cd7de82dabcdd.css +1 -0
  107. package/.next/static/css/c403ce739a9c0d83.css +1 -0
  108. package/.next/static/css/ca311e6c030663d4.css +1 -0
  109. package/.next/static/css/dee878eb64099d92.css +1 -0
  110. package/.next/static/css/fbfdce70731d0d2b.css +1 -0
  111. package/.next/trace +21 -21
  112. package/.next/trace-build +1 -1
  113. package/empty-module.js +2 -0
  114. package/next.config.js +13 -8
  115. package/package.json +35 -16
  116. package/public/llms.txt +11 -0
  117. package/public/robots.txt +4 -0
  118. package/scripts/generate-scss-types.ts +112 -0
  119. package/src/@types/scss.d.ts +6 -9
  120. package/src/@types/svg.d.ts +1 -1
  121. package/src/components/Alert/Alert.module.scss.d.ts +13 -0
  122. package/src/components/Alert/Alert.tsx +4 -1
  123. package/src/components/Badge/Badge.module.scss.d.ts +6 -0
  124. package/src/components/Board/Board.module.scss +10 -0
  125. package/src/components/Board/Board.module.scss.d.ts +17 -0
  126. package/src/components/Board/Board.tsx +14 -26
  127. package/src/components/Board/BoardPure.tsx +54 -49
  128. package/src/components/Board/components/Actions/Actions.module.scss +18 -18
  129. package/src/components/Board/components/Actions/Actions.module.scss.d.ts +7 -0
  130. package/src/components/Board/components/Actions/Actions.tsx +6 -3
  131. package/src/components/Board/components/Actions/lib.ts +3 -1
  132. package/src/components/Board/components/Cell/Cell.module.scss.d.ts +13 -0
  133. package/src/components/Board/components/Cell/Cell.tsx +32 -34
  134. package/src/components/Board/components/InputPrompt/InputPrompt.module.scss.d.ts +10 -0
  135. package/src/components/Board/components/InputPrompt/InputPrompt.tsx +1 -1
  136. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.module.scss.d.ts +8 -0
  137. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +2 -2
  138. package/src/components/Board/getBoardBackground.ts +175 -0
  139. package/src/components/Board/hooks/index.ts +0 -1
  140. package/src/components/Board/hooks/useBoardStyle.ts +10 -20
  141. package/src/components/Board/hooks/useFloatingActions.ts +3 -6
  142. package/src/components/Board/hooks/useGrid.ts +23 -9
  143. package/src/components/Board/selectors.ts +1 -1
  144. package/src/components/Button/Button.module.scss.d.ts +12 -0
  145. package/src/components/Dictionary/Dictionary.module.scss +8 -22
  146. package/src/components/Dictionary/Dictionary.module.scss.d.ts +14 -0
  147. package/src/components/Dictionary/Dictionary.tsx +1 -10
  148. package/src/components/DictionaryInput/DictionaryInput.module.scss.d.ts +7 -0
  149. package/src/components/DictionaryInput/DictionaryInput.tsx +1 -1
  150. package/src/components/EmptyState/EmptyState.module.scss.d.ts +7 -0
  151. package/src/components/EmptyState/EmptyState.tsx +1 -1
  152. package/src/components/IconButton/IconButton.module.scss.d.ts +8 -0
  153. package/src/components/Key/Key.module.scss.d.ts +6 -0
  154. package/src/components/Keys/Arrows/Arrows.module.scss.d.ts +11 -0
  155. package/src/components/Keys/Arrows/Arrows.tsx +4 -1
  156. package/src/components/Keys/index.tsx +1 -1
  157. package/src/components/Loading/Loading.module.scss.d.ts +9 -0
  158. package/src/components/Loading/Loading.tsx +1 -1
  159. package/src/components/Logo/Logo.tsx +4 -9
  160. package/src/components/Logo/LogoBlueprint.tsx +1 -0
  161. package/src/components/Modal/Modal.module.scss.d.ts +15 -0
  162. package/src/components/Modal/Modal.tsx +16 -3
  163. package/src/components/Modal/components/Section/Section.module.scss.d.ts +7 -0
  164. package/src/components/NavButtons/NavButtons.module.scss +20 -0
  165. package/src/components/NavButtons/NavButtons.module.scss.d.ts +13 -0
  166. package/src/components/NavButtons/NavButtons.tsx +29 -45
  167. package/src/components/NotFound/NotFound.module.scss.d.ts +9 -0
  168. package/src/components/NotFound/NotFound.tsx +1 -1
  169. package/src/components/PlainTiles/PlainTiles.module.scss.d.ts +11 -0
  170. package/src/components/PlainTiles/PlainTiles.tsx +0 -1
  171. package/src/components/PlainTiles/Tile.tsx +3 -4
  172. package/src/components/PlainTiles/lib.ts +4 -19
  173. package/src/components/PlainTiles/types.ts +0 -1
  174. package/src/components/Progress/Progress.module.scss +7 -0
  175. package/src/components/Progress/Progress.module.scss.d.ts +6 -0
  176. package/src/components/Progress/Progress.tsx +2 -11
  177. package/src/components/Rack/Rack.module.scss +3 -0
  178. package/src/components/Rack/Rack.module.scss.d.ts +10 -0
  179. package/src/components/Rack/Rack.tsx +8 -11
  180. package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss +2 -0
  181. package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss.d.ts +7 -0
  182. package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +1 -13
  183. package/src/components/Rack/components/InputPrompt/lib.ts +1 -1
  184. package/src/components/Rack/components/RackTile/RackTile.module.scss.d.ts +6 -0
  185. package/src/components/Rack/components/RackTile/RackTile.tsx +5 -4
  186. package/src/components/Rack/selectors.ts +1 -1
  187. package/src/components/Radio/Radio.module.scss.d.ts +12 -0
  188. package/src/components/Results/Cell.tsx +3 -12
  189. package/src/components/Results/Header.tsx +9 -18
  190. package/src/components/Results/HeaderButton.tsx +4 -5
  191. package/src/components/Results/Result.tsx +4 -15
  192. package/src/components/Results/Results.module.scss +4 -7
  193. package/src/components/Results/Results.module.scss.d.ts +27 -0
  194. package/src/components/Results/Results.tsx +14 -5
  195. package/src/components/Results/SolveButton.tsx +1 -1
  196. package/src/components/Results/types.ts +3 -3
  197. package/src/components/ResultsInput/ResultsInput.module.scss.d.ts +7 -0
  198. package/src/components/ResultsInput/ResultsInput.tsx +1 -1
  199. package/src/components/Solver/Solver.module.scss +6 -5
  200. package/src/components/Solver/Solver.module.scss.d.ts +20 -0
  201. package/src/components/Solver/Solver.tsx +23 -24
  202. package/src/components/Solver/components/InsertButton/InsertButton.module.scss.d.ts +7 -0
  203. package/src/components/Solver/components/InsertButton/InsertButton.tsx +1 -1
  204. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.module.scss.d.ts +18 -0
  205. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +3 -1
  206. package/src/components/Spinner/Spinner.module.scss.d.ts +10 -0
  207. package/src/components/Tile/Tile.module.scss +3 -0
  208. package/src/components/Tile/Tile.module.scss.d.ts +19 -0
  209. package/src/components/Tile/Tile.tsx +5 -14
  210. package/src/components/Tile/TilePure.tsx +2 -12
  211. package/src/components/Tooltip/Tooltip.module.scss.d.ts +7 -0
  212. package/src/components/Tooltip/Tooltip.tsx +14 -3
  213. package/src/components/Tooltip/useTooltip.ts +2 -1
  214. package/src/hooks/useColumns.ts +4 -7
  215. package/src/hooks/useDeferredRender.ts +20 -0
  216. package/src/hooks/useDirection.ts +4 -3
  217. package/src/hooks/useLanguage.ts +2 -2
  218. package/src/hooks/useLocalStorage.ts +32 -8
  219. package/src/hooks/useMedia.ts +26 -26
  220. package/src/i18n/constants.ts +2 -15
  221. package/src/i18n/i18n.ts +18 -17
  222. package/src/i18n/languages/english.json +0 -1
  223. package/src/i18n/languages/french.json +0 -1
  224. package/src/i18n/languages/german.json +0 -1
  225. package/src/i18n/languages/persian.json +0 -1
  226. package/src/i18n/languages/polish.json +0 -1
  227. package/src/i18n/languages/romanian.json +0 -1
  228. package/src/i18n/languages/spanish.json +0 -1
  229. package/src/i18n/languages/turkish.json +0 -1
  230. package/src/i18n/localeIcons.ts +24 -0
  231. package/src/lib/localeTransliterate.test.ts +5 -0
  232. package/src/lib/localeTransliterate.ts +26 -6
  233. package/src/lib/waitForIdleOrFirstIntent.ts +33 -0
  234. package/src/modals/DictionaryModal/DictionaryModal.module.scss.d.ts +8 -0
  235. package/src/modals/DictionaryModal/DictionaryModal.tsx +3 -1
  236. package/src/modals/KeyMapModal/KeyMapModal.tsx +3 -1
  237. package/src/modals/KeyMapModal/components/Mapping/Mapping.module.scss.d.ts +11 -0
  238. package/src/modals/MenuModal/MenuModal.module.scss +5 -0
  239. package/src/modals/MenuModal/MenuModal.module.scss.d.ts +10 -0
  240. package/src/modals/MenuModal/MenuModal.tsx +16 -5
  241. package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss +4 -1
  242. package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss.d.ts +9 -0
  243. package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +4 -6
  244. package/src/modals/RemainingTilesModal/components/Character/Character.module.scss +1 -0
  245. package/src/modals/RemainingTilesModal/components/Character/Character.module.scss.d.ts +12 -0
  246. package/src/modals/RemainingTilesModal/components/Character/Character.tsx +5 -12
  247. package/src/modals/ResultsModal/ResultsModal.module.scss.d.ts +8 -0
  248. package/src/modals/ResultsModal/ResultsModal.tsx +8 -4
  249. package/src/modals/SettingsModal/SettingsModal.tsx +2 -2
  250. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.module.scss.d.ts +7 -0
  251. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -1
  252. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.module.scss.d.ts +7 -0
  253. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +1 -1
  254. package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.module.scss.d.ts +7 -0
  255. package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.tsx +1 -1
  256. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.module.scss.d.ts +7 -0
  257. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +1 -1
  258. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.module.scss.d.ts +8 -0
  259. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +24 -21
  260. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.module.scss.d.ts +7 -0
  261. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.tsx +1 -1
  262. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.module.scss.d.ts +7 -0
  263. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +1 -5
  264. package/src/modals/WordsModal/WordsModal.module.scss.d.ts +11 -0
  265. package/src/modals/WordsModal/WordsModal.tsx +4 -2
  266. package/src/modals/preload.ts +24 -0
  267. package/src/pages/_app.tsx +5 -8
  268. package/src/pages/_document.tsx +91 -5
  269. package/src/pages/api/dictionary/[locale]/[word].ts +2 -2
  270. package/src/pages/api/dictionary/[locale]/index.ts +80 -3
  271. package/src/pages/api/solve.ts +3 -3
  272. package/src/pages/api/verify.ts +12 -3
  273. package/src/pages/index.module.scss +1 -0
  274. package/src/pages/index.module.scss.d.ts +11 -0
  275. package/src/pages/index.tsx +98 -38
  276. package/src/pages/not-found.tsx +1 -1
  277. package/src/parameters/index.ts +24 -93
  278. package/src/sdk/solve.ts +13 -7
  279. package/src/sdk/verify.ts +12 -6
  280. package/src/service-worker/appShell.test.ts +86 -0
  281. package/src/service-worker/appShell.ts +39 -0
  282. package/src/service-worker/index.ts +4 -5
  283. package/src/serviceWorkerManager.ts +5 -19
  284. package/src/solver-worker/client.test.ts +151 -0
  285. package/src/solver-worker/client.ts +106 -0
  286. package/src/solver-worker/dictionaries/constants.ts +9 -0
  287. package/src/solver-worker/dictionaries/getDictionary.ts +21 -0
  288. package/src/solver-worker/dictionaries/index.ts +2 -0
  289. package/src/solver-worker/dictionaries/revalidateDictionary.test.ts +199 -0
  290. package/src/solver-worker/dictionaries/revalidateDictionary.ts +86 -0
  291. package/src/solver-worker/dictionaries/revalidatedAt.ts +43 -0
  292. package/src/solver-worker/getGaddag.test.ts +109 -0
  293. package/src/solver-worker/getGaddag.ts +62 -0
  294. package/src/solver-worker/index.ts +1 -0
  295. package/src/solver-worker/index.worker.ts +124 -0
  296. package/src/solver-worker/messages.ts +20 -0
  297. package/src/state/actions.ts +1 -1
  298. package/src/state/app/index.ts +4 -0
  299. package/src/state/app/initialState.ts +6 -0
  300. package/src/state/app/selectors.ts +5 -0
  301. package/src/state/app/slice.ts +20 -0
  302. package/src/state/app/types.ts +4 -0
  303. package/src/state/board/initialState.ts +1 -2
  304. package/src/state/i18n/index.ts +4 -0
  305. package/src/state/i18n/initialState.ts +5 -0
  306. package/src/state/i18n/selectors.ts +3 -0
  307. package/src/state/i18n/slice.ts +16 -0
  308. package/src/state/i18n/types.ts +7 -0
  309. package/src/state/index.ts +3 -0
  310. package/src/state/lib.ts +1 -1
  311. package/src/state/localStorage.ts +86 -29
  312. package/src/state/rack/initialState.ts +1 -2
  313. package/src/state/rack/slice.ts +4 -1
  314. package/src/state/results/lib.ts +5 -5
  315. package/src/state/results/selectors.ts +1 -1
  316. package/src/state/sagas.ts +139 -13
  317. package/src/state/selectors.ts +1 -1
  318. package/src/state/settings/initialState.ts +7 -10
  319. package/src/state/settings/selectors.ts +7 -2
  320. package/src/state/settings/slice.ts +5 -2
  321. package/src/state/store.ts +4 -0
  322. package/src/state/types.ts +4 -0
  323. package/src/state/useTypedStore.ts +6 -0
  324. package/src/styles/_tokens.scss +1 -0
  325. package/src/styles/global.scss +9 -0
  326. package/src/styles/variables.module.scss +0 -21
  327. package/src/styles/variables.module.scss.d.ts +27 -0
  328. package/src/styles/variables.scss +46 -2
  329. package/src/types/api.ts +1 -2
  330. package/src/types/index.ts +1 -2
  331. package/tsconfig.json +4 -0
  332. package/tsconfig.tsbuildinfo +1 -1
  333. package/.next/server/chunks/318.js +0 -3
  334. package/.next/server/chunks/791.js +0 -15
  335. package/.next/static/chunks/framework-3cf15b8041c59dd3.js +0 -1
  336. package/.next/static/chunks/main-852475ca502b4e49.js +0 -5
  337. package/.next/static/chunks/pages/_app-a5bbe02710f13d05.js +0 -7
  338. package/.next/static/chunks/pages/index-ec0f6aeeaf7be227.js +0 -1
  339. package/.next/static/chunks/pages/not-found-9e076427bad69d90.js +0 -1
  340. package/.next/static/chunks/webpack-1a7a166b34ed8d24.js +0 -1
  341. package/.next/static/css/0af35adb4bab56f0.css +0 -2
  342. package/.next/static/css/a78e04fe95452380.css +0 -1
  343. package/.next/static/vYpMmuC_yEurZGcyGVnLf/_buildManifest.js +0 -1
  344. package/src/app-layout/AppLayoutContext.tsx +0 -25
  345. package/src/app-layout/index.ts +0 -1
  346. package/src/app-layout/useAppLayoutValue.ts +0 -112
  347. package/src/components/Board/hooks/useBackgroundImage.tsx +0 -279
  348. package/src/components/index.ts +0 -26
  349. package/src/hooks/index.ts +0 -12
  350. package/src/hooks/useOnWindowResize.ts +0 -11
  351. package/src/hooks/useViewportSize.ts +0 -17
  352. package/src/i18n/index.ts +0 -2
  353. package/src/icons/Flag.svg +0 -4
  354. package/src/icons/Star.svg +0 -4
  355. package/src/icons/index.ts +0 -49
  356. package/src/lib/getTileSizes.ts +0 -13
  357. package/src/lib/index.ts +0 -24
  358. package/src/modals/index.ts +0 -7
  359. package/src/sdk/getDictionary.ts +0 -9
  360. package/src/service-worker/average.ts +0 -7
  361. package/src/service-worker/dictionaries/constants.ts +0 -5
  362. package/src/service-worker/dictionaries/getDictionary.ts +0 -20
  363. package/src/service-worker/dictionaries/index.ts +0 -2
  364. package/src/service-worker/dictionaries/revalidateDictionary.ts +0 -33
  365. package/src/service-worker/getTrie.ts +0 -24
  366. package/src/service-worker/routeSolveRequests.ts +0 -91
  367. package/src/service-worker/routeVerifyRequests.ts +0 -37
  368. /package/.next/static/{vYpMmuC_yEurZGcyGVnLf → FL82obwzFHRzvV6z76I-U}/_ssgManifest.js +0 -0
  369. /package/src/{service-worker → solver-worker}/dictionaries/expirationManager.ts +0 -0
  370. /package/src/{service-worker → solver-worker}/dictionaries/getDictionaryUrl.ts +0 -0
@@ -1,33 +1,23 @@
1
1
  import { type CSSProperties, useMemo } from 'react';
2
2
 
3
- import { useAppLayout } from '@/app-layout';
4
- import { getTileSizes } from '@/lib';
5
- import { BORDER_WIDTH } from '@/parameters';
6
- import { selectConfig, selectShowCoordinates, useTypedSelector } from '@/state';
3
+ import { LOCALE_FEATURES } from '@/i18n/constants';
4
+ import { selectConfig, selectLocale, useTypedSelector } from '@/state';
7
5
 
8
- import { useBackgroundImage } from './useBackgroundImage';
6
+ import { getBoardBackground } from '../getBoardBackground';
9
7
 
8
+ /**
9
+ * Everything here is derived from Redux state only, so the style on the server matches the client
10
+ */
10
11
  export const useBoardStyle = () => {
11
12
  const config = useTypedSelector(selectConfig);
12
- const { cellSize } = useAppLayout();
13
- const { tileFontSize } = getTileSizes(cellSize);
14
- const showCoordinates = useTypedSelector(selectShowCoordinates);
15
- const backgroundImage = useBackgroundImage();
16
- const coordinatesSize = 0.5 * cellSize - BORDER_WIDTH;
13
+ const locale = useTypedSelector(selectLocale);
14
+ const { direction } = LOCALE_FEATURES[locale];
15
+ const backgroundImage = getBoardBackground({ config, direction });
17
16
  const boardStyle = useMemo<CSSProperties>(
18
17
  () => ({
19
18
  backgroundImage: `url(${backgroundImage})`,
20
- fontSize: tileFontSize,
21
- gridTemplateColumns:
22
- showCoordinates === 'hidden'
23
- ? `repeat(${config.boardWidth}, 1fr)`
24
- : `${coordinatesSize}px repeat(${config.boardWidth}, 1fr)`,
25
- gridTemplateRows:
26
- showCoordinates === 'hidden'
27
- ? `repeat(${config.boardHeight}, 1fr)`
28
- : `${coordinatesSize}px repeat(${config.boardHeight}, 1fr)`,
29
19
  }),
30
- [backgroundImage, config.boardHeight, config.boardWidth, coordinatesSize, showCoordinates, tileFontSize],
20
+ [backgroundImage],
31
21
  );
32
22
 
33
23
  return boardStyle;
@@ -1,17 +1,14 @@
1
1
  import { autoUpdate, offset, shift, useFloating } from '@floating-ui/react';
2
2
 
3
- import { useAppLayout } from '@/app-layout';
4
3
  import { BOARD_CELL_ACTIONS_OFFSET } from '@/parameters';
5
4
 
6
5
  export const useFloatingActions = () => {
7
- const { actionsWidth } = useAppLayout();
8
-
9
6
  return useFloating({
10
7
  middleware: [
11
- offset({
8
+ offset(({ rects }) => ({
12
9
  mainAxis: -BOARD_CELL_ACTIONS_OFFSET,
13
- alignmentAxis: BOARD_CELL_ACTIONS_OFFSET - actionsWidth,
14
- }),
10
+ alignmentAxis: BOARD_CELL_ACTIONS_OFFSET - rects.floating.width,
11
+ })),
15
12
  shift(),
16
13
  ],
17
14
  placement: 'top-end',
@@ -15,9 +15,12 @@ import {
15
15
  } from 'react';
16
16
  import { useDispatch } from 'react-redux';
17
17
 
18
- import { useLatest } from '@/hooks';
19
- import { LOCALE_FEATURES } from '@/i18n';
20
- import { createKeyboardNavigation, extractCharacters, extractInputValue, isCtrl } from '@/lib';
18
+ import { useLatest } from '@/hooks/useLatest';
19
+ import { LOCALE_FEATURES } from '@/i18n/constants';
20
+ import { createKeyboardNavigation } from '@/lib/createKeyboardNavigation';
21
+ import { extractCharacters } from '@/lib/extractCharacters';
22
+ import { extractInputValue } from '@/lib/extractInputValue';
23
+ import { isCtrl } from '@/lib/isCtrl';
21
24
  import { boardSlice, cellFiltersSlice, selectConfig, selectLocale, useTypedSelector } from '@/state';
22
25
  import { type Direction, type Point } from '@/types';
23
26
 
@@ -53,6 +56,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
53
56
  const [activeIndex, setActiveIndex] = useState<Point>({ x: 0, y: 0 });
54
57
  const [direction, setLastDirection] = useState<Direction>('horizontal');
55
58
  const directionRef = useLatest(direction);
59
+ const rowsRef = useLatest(rows);
56
60
 
57
61
  const safeActiveIndex = useMemo(
58
62
  () => ({
@@ -94,7 +98,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
94
98
  (position: Point, value: string) => {
95
99
  const characters = value ? extractCharacters(config, value).filter((character) => character !== BLANK) : [BLANK];
96
100
  const actions: PayloadAction<unknown>[] = [];
97
- let board = new Board({ rows: rows.map((row) => row.map((cell) => cell.clone())) });
101
+ let board = new Board({ rows: rowsRef.current.map((row) => row.map((cell) => cell.clone())) });
98
102
  let { x, y } = position;
99
103
 
100
104
  const scheduleMoveFocus = () => {
@@ -188,7 +192,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
188
192
  moveFocus(Math.abs(position.x - x) + Math.abs(position.y - y));
189
193
  actions.forEach(dispatch);
190
194
  },
191
- [config, directionRef, dispatch, height, moveFocus, rows, width],
195
+ [config, directionRef, dispatch, height, moveFocus, rowsRef, width],
192
196
  );
193
197
 
194
198
  const onChange = useCallback(
@@ -209,7 +213,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
209
213
 
210
214
  if (value === EMPTY_CELL) {
211
215
  const { x, y } = position;
212
- const cell = rows[y][x];
216
+ const cell = rowsRef.current[y][x];
213
217
 
214
218
  if (cell.hasTile()) {
215
219
  dispatch(boardSlice.actions.toggleCellIsBlank(position));
@@ -219,7 +223,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
219
223
 
220
224
  insertValue(position, value);
221
225
  },
222
- [dispatch, insertValue, moveFocus, rows, getInputRefPosition],
226
+ [dispatch, insertValue, moveFocus, rowsRef, getInputRefPosition],
223
227
  );
224
228
 
225
229
  const onDirectionToggle = useCallback(() => setLastDirection(toggleDirection), []);
@@ -308,7 +312,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
308
312
  return;
309
313
  }
310
314
 
311
- const cell = rows[y][x];
315
+ const cell = rowsRef.current[y][x];
312
316
 
313
317
  if (isCtrl(event) && character === 'g') {
314
318
  event.preventDefault();
@@ -347,7 +351,17 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
347
351
  dispatch(boardSlice.actions.toggleCellIsBlank(position));
348
352
  },
349
353
  });
350
- }, [changeActiveIndex, config, direction, dispatch, getInputRefPosition, locale, moveFocus, onDirectionToggle, rows]);
354
+ }, [
355
+ changeActiveIndex,
356
+ config,
357
+ direction,
358
+ dispatch,
359
+ getInputRefPosition,
360
+ locale,
361
+ moveFocus,
362
+ onDirectionToggle,
363
+ rowsRef,
364
+ ]);
351
365
 
352
366
  const onPaste = useCallback<ClipboardEventHandler>(
353
367
  (event) => {
@@ -1,6 +1,6 @@
1
1
  import { createSelector } from '@reduxjs/toolkit';
2
2
 
3
- import { findCell } from '@/lib';
3
+ import { findCell } from '@/lib/findCell';
4
4
  import {
5
5
  selectBoard,
6
6
  selectCharacters,
@@ -0,0 +1,12 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly button: string;
4
+ readonly content: string;
5
+ readonly default: string;
6
+ readonly icon: string;
7
+ readonly label: string;
8
+ readonly primary: string;
9
+ readonly wide: string;
10
+ };
11
+
12
+ export default styles;
@@ -2,17 +2,9 @@
2
2
 
3
3
  .dictionary {
4
4
  position: relative;
5
- transition: var(--transition);
5
+ min-height: 0;
6
6
  word-break: break-word;
7
7
 
8
- &.isAllowed {
9
- background-color: var(--color--green--light);
10
- }
11
-
12
- &.isNotAllowed {
13
- background-color: var(--color--red--light);
14
- }
15
-
16
8
  &:focus-within {
17
9
  @include focus-effect;
18
10
  }
@@ -21,6 +13,8 @@
21
13
  .content {
22
14
  @include scrollbars;
23
15
 
16
+ display: flex;
17
+ flex-direction: column;
24
18
  height: 100%;
25
19
  overflow-y: auto;
26
20
  border-radius: inherit;
@@ -31,26 +25,18 @@
31
25
  }
32
26
 
33
27
  .result {
34
- transition: var(--transition);
28
+ flex-shrink: 0;
29
+
30
+ &:last-child {
31
+ flex-grow: 1;
32
+ }
35
33
 
36
34
  &.isAllowed {
37
35
  background-color: var(--color--green--light);
38
-
39
- & + & {
40
- .content {
41
- padding-top: 0;
42
- }
43
- }
44
36
  }
45
37
 
46
38
  &.isNotAllowed {
47
39
  background-color: var(--color--red--light);
48
-
49
- & + & {
50
- .content {
51
- padding-top: 0;
52
- }
53
- }
54
40
  }
55
41
  }
56
42
 
@@ -0,0 +1,14 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly content: string;
4
+ readonly definition: string;
5
+ readonly definitions: string;
6
+ readonly dictionary: string;
7
+ readonly isAllowed: string;
8
+ readonly isNotAllowed: string;
9
+ readonly result: string;
10
+ readonly resultContent: string;
11
+ readonly word: string;
12
+ };
13
+
14
+ export default styles;
@@ -1,7 +1,6 @@
1
1
  import classNames from 'classnames';
2
2
  import { type FunctionComponent } from 'react';
3
3
 
4
- import { useAppLayout } from '@/app-layout';
5
4
  import {
6
5
  selectDictionaryError,
7
6
  selectDictionaryIsLoading,
@@ -21,20 +20,12 @@ interface Props {
21
20
 
22
21
  export const Dictionary: FunctionComponent<Props> = ({ className }) => {
23
22
  const translate = useTranslate();
24
- const { dictionaryResultsHeight } = useAppLayout();
25
23
  const results = useTypedSelector(selectDictionaryResults);
26
24
  const isLoading = useTypedSelector(selectDictionaryIsLoading);
27
25
  const error = useTypedSelector(selectDictionaryError);
28
- const isLastAllowed = results.at(-1)?.isAllowed;
29
26
 
30
27
  return (
31
- <div
32
- className={classNames(styles.dictionary, className, {
33
- [styles.isAllowed]: isLastAllowed === true,
34
- [styles.isNotAllowed]: isLastAllowed === false,
35
- })}
36
- style={{ height: dictionaryResultsHeight }}
37
- >
28
+ <div className={classNames(styles.dictionary, className)}>
38
29
  <div className={styles.content}>
39
30
  {typeof error !== 'undefined' && !isLoading && <EmptyState variant="error">{error.message}</EmptyState>}
40
31
 
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly dictionaryInput: string;
4
+ readonly input: string;
5
+ };
6
+
7
+ export default styles;
@@ -2,7 +2,7 @@ import classNames from 'classnames';
2
2
  import { type ChangeEvent, type FunctionComponent, type SubmitEvent } from 'react';
3
3
  import { useDispatch } from 'react-redux';
4
4
 
5
- import { LOCALE_FEATURES } from '@/i18n';
5
+ import { LOCALE_FEATURES } from '@/i18n/constants';
6
6
  import { dictionarySlice, selectDictionary, selectLocale, useTranslate, useTypedSelector } from '@/state';
7
7
 
8
8
  import styles from './DictionaryInput.module.scss';
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly emptyState: string;
4
+ readonly tiles: string;
5
+ };
6
+
7
+ export default styles;
@@ -1,7 +1,7 @@
1
1
  import classNames from 'classnames';
2
2
  import { type FunctionComponent, type ReactNode, useMemo } from 'react';
3
3
 
4
- import { LOCALE_FEATURES } from '@/i18n';
4
+ import { LOCALE_FEATURES } from '@/i18n/constants';
5
5
  import { COLOR_BLUE, COLOR_GREEN, COLOR_RED, COLOR_YELLOW } from '@/parameters';
6
6
  import { selectLocale, useTranslate, useTypedSelector } from '@/state';
7
7
  import { type Translations } from '@/types';
@@ -0,0 +1,8 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly content: string;
4
+ readonly icon: string;
5
+ readonly iconButton: string;
6
+ };
7
+
8
+ export default styles;
@@ -0,0 +1,6 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly key: string;
4
+ };
5
+
6
+ export default styles;
@@ -0,0 +1,11 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly arrow: string;
4
+ readonly arrows: string;
5
+ readonly down: string;
6
+ readonly left: string;
7
+ readonly right: string;
8
+ readonly up: string;
9
+ };
10
+
11
+ export default styles;
@@ -1,7 +1,10 @@
1
1
  import classNames from 'classnames';
2
2
  import { type FunctionComponent } from 'react';
3
3
 
4
- import { ArrowDown, ArrowLeft, ArrowRight, ArrowUp } from '@/icons';
4
+ import ArrowDown from '@/icons/ArrowDown.svg';
5
+ import ArrowLeft from '@/icons/ArrowLeft.svg';
6
+ import ArrowRight from '@/icons/ArrowRight.svg';
7
+ import ArrowUp from '@/icons/ArrowUp.svg';
5
8
 
6
9
  import { Key } from '../../Key';
7
10
 
@@ -1,6 +1,6 @@
1
1
  import { type FunctionComponent } from 'react';
2
2
 
3
- import { isMac } from '@/lib';
3
+ import { isMac } from '@/lib/isMac';
4
4
  import { useTranslate } from '@/state';
5
5
 
6
6
  import { Key } from '../Key';
@@ -0,0 +1,9 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly dim: string;
4
+ readonly loading: string;
5
+ readonly text: string;
6
+ readonly tiles: string;
7
+ };
8
+
9
+ export default styles;
@@ -1,7 +1,7 @@
1
1
  import classNames from 'classnames';
2
2
  import { type FunctionComponent, useMemo } from 'react';
3
3
 
4
- import { LOCALE_FEATURES } from '@/i18n';
4
+ import { LOCALE_FEATURES } from '@/i18n/constants';
5
5
  import { selectLocale, useTranslate, useTypedSelector } from '@/state';
6
6
 
7
7
  import { PlainTiles } from '../PlainTiles';
@@ -1,17 +1,12 @@
1
1
  import Image from 'next/image';
2
2
  import { forwardRef } from 'react';
3
3
 
4
- import { useAppLayout } from '@/app-layout';
5
- import { LOGO_SRC } from '@/parameters';
4
+ import { LOGO_HEIGHT, LOGO_SRC, LOGO_WIDTH } from '@/parameters';
6
5
 
7
6
  interface Props {
8
7
  className?: string;
9
8
  }
10
9
 
11
- export const Logo = forwardRef<HTMLImageElement, Props>((props, ref) => {
12
- const { logoHeight, logoWidth } = useAppLayout();
13
-
14
- return (
15
- <Image {...props} alt="Scrabble Solver 2" height={logoHeight} priority ref={ref} src={LOGO_SRC} width={logoWidth} />
16
- );
17
- });
10
+ export const Logo = forwardRef<HTMLImageElement, Props>((props, ref) => (
11
+ <Image {...props} alt="Scrabble Solver 2" height={LOGO_HEIGHT} priority ref={ref} src={LOGO_SRC} width={LOGO_WIDTH} />
12
+ ));
@@ -4,6 +4,7 @@
4
4
  * - using font-family: Open Sans
5
5
  * - transformed into paths (manually with Inkscape)
6
6
  * - arranged (centered vertically against respective rows)
7
+ * - tile fills substituted with concrete colors
7
8
  */
8
9
  import { type CSSProperties, type FunctionComponent } from 'react';
9
10
 
@@ -0,0 +1,15 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly afterOpen: string;
4
+ readonly beforeClose: string;
5
+ readonly closeButton: string;
6
+ readonly container: string;
7
+ readonly content: string;
8
+ readonly footer: string;
9
+ readonly header: string;
10
+ readonly modal: string;
11
+ readonly overlay: string;
12
+ readonly title: string;
13
+ };
14
+
15
+ export default styles;
@@ -2,7 +2,7 @@ import classNames from 'classnames';
2
2
  import { type FunctionComponent, type ReactNode, useCallback, useEffect, useState } from 'react';
3
3
  import ReactModal from 'react-modal';
4
4
 
5
- import { CrossSquareFill } from '@/icons';
5
+ import CrossSquareFill from '@/icons/CrossSquareFill.svg';
6
6
  import { TRANSITION_DURATION_LONG } from '@/parameters';
7
7
  import { useTranslate } from '@/state';
8
8
 
@@ -11,16 +11,29 @@ import { IconButton } from '../IconButton';
11
11
  import { Section } from './components';
12
12
  import styles from './Modal.module.scss';
13
13
 
14
+ if (typeof document !== 'undefined') {
15
+ ReactModal.setAppElement('#__next');
16
+ }
17
+
14
18
  export interface Props {
15
19
  children: ReactNode;
16
20
  className?: string;
17
21
  footer?: ReactNode;
18
22
  isOpen: boolean;
23
+ modalClassName?: string;
19
24
  title: string;
20
25
  onClose: () => void;
21
26
  }
22
27
 
23
- const ModalBase: FunctionComponent<Props> = ({ children, className, footer, isOpen, title, onClose }) => {
28
+ const ModalBase: FunctionComponent<Props> = ({
29
+ children,
30
+ className,
31
+ footer,
32
+ isOpen,
33
+ modalClassName,
34
+ title,
35
+ onClose,
36
+ }) => {
24
37
  const translate = useTranslate();
25
38
  const [shouldReturnFocusAfterClose, setShouldReturnFocusAfterClose] = useState(true);
26
39
 
@@ -55,7 +68,7 @@ const ModalBase: FunctionComponent<Props> = ({ children, className, footer, isOp
55
68
  aria={{ modal: true }}
56
69
  className={{
57
70
  afterOpen: styles.afterOpen,
58
- base: styles.modal,
71
+ base: classNames(styles.modal, modalClassName),
59
72
  beforeClose: styles.beforeClose,
60
73
  }}
61
74
  closeTimeoutMS={TRANSITION_DURATION_LONG}
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly heading: string;
4
+ readonly section: string;
5
+ };
6
+
7
+ export default styles;
@@ -1,3 +1,5 @@
1
+ @use 'styles/mixins' as *;
2
+
1
3
  .navButtons {
2
4
  display: flex;
3
5
  align-items: center;
@@ -31,3 +33,21 @@
31
33
  color: var(--color--error);
32
34
  }
33
35
  }
36
+
37
+ .fullNav {
38
+ @include media('<s') {
39
+ display: none;
40
+ }
41
+ }
42
+
43
+ .shortNav {
44
+ @include media('>=s') {
45
+ display: none;
46
+ }
47
+ }
48
+
49
+ .keyMapButton {
50
+ @include media('touch') {
51
+ display: none;
52
+ }
53
+ }
@@ -0,0 +1,13 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly button: string;
4
+ readonly error: string;
5
+ readonly fullNav: string;
6
+ readonly group: string;
7
+ readonly keyMapButton: string;
8
+ readonly navButtons: string;
9
+ readonly separator: string;
10
+ readonly shortNav: string;
11
+ };
12
+
13
+ export default styles;
@@ -1,8 +1,13 @@
1
1
  import classNames from 'classnames';
2
2
  import { type FunctionComponent, memo } from 'react';
3
3
 
4
- import { useAppLayout } from '@/app-layout';
5
- import { CardChecklist, Cog, Eraser, Github, KeyboardFill, List, Sack } from '@/icons';
4
+ import CardChecklist from '@/icons/CardChecklist.svg';
5
+ import Cog from '@/icons/Cog.svg';
6
+ import Eraser from '@/icons/Eraser.svg';
7
+ import Github from '@/icons/Github.svg';
8
+ import KeyboardFill from '@/icons/KeyboardFill.svg';
9
+ import List from '@/icons/List.svg';
10
+ import Sack from '@/icons/Sack.svg';
6
11
  import { GITHUB_PROJECT_URL } from '@/parameters';
7
12
  import { selectConfig, useTranslate, useTypedSelector } from '@/state';
8
13
 
@@ -32,35 +37,6 @@ const NavButtonsBase: FunctionComponent<Props> = ({
32
37
  const config = useTypedSelector(selectConfig);
33
38
  const hasInvalidWords = useTypedSelector(selectHasInvalidWords);
34
39
  const hasOverusedTiles = useTypedSelector(selectHasOverusedTiles);
35
- const { showKeyMap, showShortNav } = useAppLayout();
36
-
37
- if (showShortNav) {
38
- return (
39
- <div className={styles.navButtons}>
40
- <div className={styles.group}>
41
- <IconButton
42
- aria-label={translate('common.clear')}
43
- className={styles.button}
44
- Icon={Eraser}
45
- tooltip={translate('common.clear')}
46
- onClick={onClear}
47
- />
48
- </div>
49
-
50
- <div className={styles.separator} />
51
-
52
- <div className={styles.group}>
53
- <IconButton
54
- aria-label={translate('menu')}
55
- className={styles.button}
56
- Icon={List}
57
- tooltip={translate('menu')}
58
- onClick={onShowMenu}
59
- />
60
- </div>
61
- </div>
62
- );
63
- }
64
40
 
65
41
  return (
66
42
  <div className={styles.navButtons}>
@@ -76,7 +52,7 @@ const NavButtonsBase: FunctionComponent<Props> = ({
76
52
 
77
53
  <div className={styles.separator} />
78
54
 
79
- <div className={styles.group}>
55
+ <div className={classNames(styles.group, styles.fullNav)}>
80
56
  {config.supportsRemainingTiles && (
81
57
  <IconButton
82
58
  aria-label={translate('remaining-tiles')}
@@ -100,9 +76,9 @@ const NavButtonsBase: FunctionComponent<Props> = ({
100
76
  />
101
77
  </div>
102
78
 
103
- <div className={styles.separator} />
79
+ <div className={classNames(styles.separator, styles.fullNav)} />
104
80
 
105
- <div className={styles.group}>
81
+ <div className={classNames(styles.group, styles.fullNav)}>
106
82
  <IconButton.Link
107
83
  aria-label={translate('github')}
108
84
  className={styles.button}
@@ -114,18 +90,16 @@ const NavButtonsBase: FunctionComponent<Props> = ({
114
90
  />
115
91
  </div>
116
92
 
117
- <div className={styles.separator} />
93
+ <div className={classNames(styles.separator, styles.fullNav)} />
118
94
 
119
- <div className={styles.group}>
120
- {showKeyMap && (
121
- <IconButton
122
- aria-label={translate('keyMap')}
123
- className={styles.button}
124
- Icon={KeyboardFill}
125
- tooltip={translate('keyMap')}
126
- onClick={onShowKeyMap}
127
- />
128
- )}
95
+ <div className={classNames(styles.group, styles.fullNav)}>
96
+ <IconButton
97
+ aria-label={translate('keyMap')}
98
+ className={classNames(styles.button, styles.keyMapButton)}
99
+ Icon={KeyboardFill}
100
+ tooltip={translate('keyMap')}
101
+ onClick={onShowKeyMap}
102
+ />
129
103
 
130
104
  <IconButton
131
105
  aria-label={translate('settings')}
@@ -136,6 +110,16 @@ const NavButtonsBase: FunctionComponent<Props> = ({
136
110
  onClick={onShowSettings}
137
111
  />
138
112
  </div>
113
+
114
+ <div className={classNames(styles.group, styles.shortNav)}>
115
+ <IconButton
116
+ aria-label={translate('menu')}
117
+ className={styles.button}
118
+ Icon={List}
119
+ tooltip={translate('menu')}
120
+ onClick={onShowMenu}
121
+ />
122
+ </div>
139
123
  </div>
140
124
  );
141
125
  };
@@ -0,0 +1,9 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly icon: string;
4
+ readonly link: string;
5
+ readonly notFound: string;
6
+ readonly tiles: string;
7
+ };
8
+
9
+ export default styles;