@scrabble-solver/scrabble-solver 2.17.0 → 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 (328) 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/routes-manifest.json +1 -1
  21. package/.next/server/chunks/309.js +1 -0
  22. package/.next/server/chunks/{785.js → 316.js} +1 -1
  23. package/.next/server/chunks/344.js +1 -0
  24. package/.next/server/chunks/371.js +1 -0
  25. package/.next/server/chunks/465.js +1 -0
  26. package/.next/server/chunks/546.js +1 -0
  27. package/.next/server/chunks/623.js +1 -0
  28. package/.next/server/chunks/624.js +1 -0
  29. package/.next/server/chunks/641.js +1 -0
  30. package/.next/server/chunks/671.js +1 -1
  31. package/.next/server/chunks/692.js +1 -0
  32. package/.next/server/chunks/705.js +1 -0
  33. package/.next/server/chunks/712.js +1 -1
  34. package/.next/server/chunks/846.js +1 -0
  35. package/.next/server/chunks/853.js +15 -0
  36. package/.next/server/chunks/886.js +1 -0
  37. package/.next/server/chunks/916.js +1 -0
  38. package/.next/server/chunks/953.js +1 -0
  39. package/.next/server/chunks/961.js +1 -0
  40. package/.next/server/chunks/968.js +1 -0
  41. package/.next/server/dynamic-css-manifest.js +1 -1
  42. package/.next/server/middleware-build-manifest.js +1 -1
  43. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  44. package/.next/server/pages/404.html +28 -1
  45. package/.next/server/pages/500.html +28 -1
  46. package/.next/server/pages/_app.js +1 -1
  47. package/.next/server/pages/_app.js.nft.json +1 -1
  48. package/.next/server/pages/_document.js +28 -1
  49. package/.next/server/pages/_document.js.nft.json +1 -1
  50. package/.next/server/pages/_error.js +28 -1
  51. package/.next/server/pages/_error.js.nft.json +1 -1
  52. package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  53. package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  54. package/.next/server/pages/api/solve.js +1 -1
  55. package/.next/server/pages/api/solve.js.nft.json +1 -1
  56. package/.next/server/pages/api/verify.js.nft.json +1 -1
  57. package/.next/server/pages/api/visit.js.nft.json +1 -1
  58. package/.next/server/pages/index.html +28 -1
  59. package/.next/server/pages/index.js +30 -1
  60. package/.next/server/pages/index.js.nft.json +1 -1
  61. package/.next/server/pages/index.json +1 -1
  62. package/.next/server/pages/not-found.html +28 -1
  63. package/.next/server/pages/not-found.js.nft.json +1 -1
  64. package/.next/server/pages-manifest.json +1 -1
  65. package/.next/server/webpack-api-runtime.js +1 -1
  66. package/.next/server/webpack-runtime.js +1 -1
  67. package/.next/static/FL82obwzFHRzvV6z76I-U/_buildManifest.js +1 -0
  68. package/.next/static/chunks/101-829ab8a8d310e7a0.js +3 -0
  69. package/.next/static/chunks/106.e414e88694add27f.js +1 -0
  70. package/.next/static/chunks/127.125d896a19061d71.js +1 -0
  71. package/.next/static/chunks/18.8b91e137d239e15c.js +1 -0
  72. package/.next/static/chunks/277.6785dfaf22fdb0b7.js +1 -0
  73. package/.next/static/chunks/307.67f52f13e3d60d4e.js +1 -0
  74. package/.next/static/chunks/341.79535ba85bf1986f.js +1 -0
  75. package/.next/static/chunks/363.01eed3233f92b6a4.js +1 -0
  76. package/.next/static/chunks/422.1559ae6756912ca5.js +1 -0
  77. package/.next/static/chunks/541.dcd9e8b804f88da5.js +1 -0
  78. package/.next/static/chunks/631.98d42abad0a60af6.js +1 -0
  79. package/.next/static/chunks/663.d2c9ca36b26695b8.js +1 -0
  80. package/.next/static/chunks/711.ba7b8f900dfd40d0.js +1 -0
  81. package/.next/static/chunks/744.b06c9a3de4a1d877.js +1 -0
  82. package/.next/static/chunks/820.97b82f751ca49579.js +1 -0
  83. package/.next/static/chunks/865.a9b563a45848a83c.js +1 -0
  84. package/.next/static/chunks/912.ff8037ba9d4db5c8.js +1 -0
  85. package/.next/static/chunks/939.19b33a3d3c351d73.js +1 -0
  86. package/.next/static/chunks/990.61296e5870b91f11.js +1 -0
  87. package/.next/static/chunks/framework-626cbd48ac5aca57.js +1 -0
  88. package/.next/static/chunks/main-b92e08f3fc96dd8d.js +5 -0
  89. package/.next/static/chunks/pages/_app-ba5d628e81a15461.js +1 -0
  90. package/.next/static/chunks/pages/{_error-afeda7c5231b6c3c.js → _error-f0290a98eb3ed0ec.js} +1 -1
  91. package/.next/static/chunks/pages/index-5f9fa6ac3cd3d97b.js +1 -0
  92. package/.next/static/chunks/pages/not-found-23d61fd3ed791cad.js +1 -0
  93. package/.next/static/chunks/webpack-e34c3ae12275e978.js +1 -0
  94. package/.next/static/css/2d03f0da2c678dfc.css +1 -0
  95. package/.next/static/css/7b6724d2df70f48f.css +1 -0
  96. package/.next/static/css/abc2425d3ba607bc.css +1 -0
  97. package/.next/static/css/b736be3bd02b5d99.css +1 -0
  98. package/.next/static/css/b74cd7de82dabcdd.css +1 -0
  99. package/.next/static/css/c403ce739a9c0d83.css +1 -0
  100. package/.next/static/css/ca311e6c030663d4.css +1 -0
  101. package/.next/static/css/dee878eb64099d92.css +1 -0
  102. package/.next/static/css/fbfdce70731d0d2b.css +1 -0
  103. package/.next/trace +21 -21
  104. package/.next/trace-build +1 -1
  105. package/empty-module.js +2 -0
  106. package/next.config.js +13 -2
  107. package/package.json +34 -15
  108. package/public/llms.txt +11 -0
  109. package/public/robots.txt +4 -0
  110. package/scripts/generate-scss-types.ts +112 -0
  111. package/src/@types/scss.d.ts +6 -9
  112. package/src/@types/svg.d.ts +1 -1
  113. package/src/components/Alert/Alert.module.scss.d.ts +13 -0
  114. package/src/components/Alert/Alert.tsx +4 -1
  115. package/src/components/Badge/Badge.module.scss.d.ts +6 -0
  116. package/src/components/Board/Board.module.scss +10 -0
  117. package/src/components/Board/Board.module.scss.d.ts +17 -0
  118. package/src/components/Board/Board.tsx +14 -26
  119. package/src/components/Board/BoardPure.tsx +54 -49
  120. package/src/components/Board/components/Actions/Actions.module.scss +18 -18
  121. package/src/components/Board/components/Actions/Actions.module.scss.d.ts +7 -0
  122. package/src/components/Board/components/Actions/Actions.tsx +6 -3
  123. package/src/components/Board/components/Actions/lib.ts +3 -1
  124. package/src/components/Board/components/Cell/Cell.module.scss.d.ts +13 -0
  125. package/src/components/Board/components/Cell/Cell.tsx +28 -33
  126. package/src/components/Board/components/InputPrompt/InputPrompt.module.scss.d.ts +10 -0
  127. package/src/components/Board/components/InputPrompt/InputPrompt.tsx +1 -1
  128. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.module.scss.d.ts +8 -0
  129. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +2 -2
  130. package/src/components/Board/getBoardBackground.ts +175 -0
  131. package/src/components/Board/hooks/index.ts +0 -1
  132. package/src/components/Board/hooks/useBoardStyle.ts +10 -20
  133. package/src/components/Board/hooks/useFloatingActions.ts +3 -6
  134. package/src/components/Board/hooks/useGrid.ts +6 -3
  135. package/src/components/Board/selectors.ts +1 -1
  136. package/src/components/Button/Button.module.scss.d.ts +12 -0
  137. package/src/components/Dictionary/Dictionary.module.scss +1 -0
  138. package/src/components/Dictionary/Dictionary.module.scss.d.ts +14 -0
  139. package/src/components/Dictionary/Dictionary.tsx +1 -3
  140. package/src/components/DictionaryInput/DictionaryInput.module.scss.d.ts +7 -0
  141. package/src/components/DictionaryInput/DictionaryInput.tsx +1 -1
  142. package/src/components/EmptyState/EmptyState.module.scss.d.ts +7 -0
  143. package/src/components/EmptyState/EmptyState.tsx +1 -1
  144. package/src/components/IconButton/IconButton.module.scss.d.ts +8 -0
  145. package/src/components/Key/Key.module.scss.d.ts +6 -0
  146. package/src/components/Keys/Arrows/Arrows.module.scss.d.ts +11 -0
  147. package/src/components/Keys/Arrows/Arrows.tsx +4 -1
  148. package/src/components/Keys/index.tsx +1 -1
  149. package/src/components/Loading/Loading.module.scss.d.ts +9 -0
  150. package/src/components/Loading/Loading.tsx +1 -1
  151. package/src/components/Logo/Logo.tsx +4 -9
  152. package/src/components/Logo/LogoBlueprint.tsx +1 -0
  153. package/src/components/Modal/Modal.module.scss.d.ts +15 -0
  154. package/src/components/Modal/Modal.tsx +16 -3
  155. package/src/components/Modal/components/Section/Section.module.scss.d.ts +7 -0
  156. package/src/components/NavButtons/NavButtons.module.scss +20 -0
  157. package/src/components/NavButtons/NavButtons.module.scss.d.ts +13 -0
  158. package/src/components/NavButtons/NavButtons.tsx +29 -45
  159. package/src/components/NotFound/NotFound.module.scss.d.ts +9 -0
  160. package/src/components/NotFound/NotFound.tsx +1 -1
  161. package/src/components/PlainTiles/PlainTiles.module.scss.d.ts +11 -0
  162. package/src/components/PlainTiles/PlainTiles.tsx +0 -1
  163. package/src/components/PlainTiles/Tile.tsx +3 -4
  164. package/src/components/PlainTiles/lib.ts +4 -19
  165. package/src/components/PlainTiles/types.ts +0 -1
  166. package/src/components/Progress/Progress.module.scss +7 -0
  167. package/src/components/Progress/Progress.module.scss.d.ts +6 -0
  168. package/src/components/Progress/Progress.tsx +2 -11
  169. package/src/components/Rack/Rack.module.scss +3 -0
  170. package/src/components/Rack/Rack.module.scss.d.ts +10 -0
  171. package/src/components/Rack/Rack.tsx +8 -11
  172. package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss +2 -0
  173. package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss.d.ts +7 -0
  174. package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +1 -13
  175. package/src/components/Rack/components/InputPrompt/lib.ts +1 -1
  176. package/src/components/Rack/components/RackTile/RackTile.module.scss.d.ts +6 -0
  177. package/src/components/Rack/components/RackTile/RackTile.tsx +5 -4
  178. package/src/components/Rack/selectors.ts +1 -1
  179. package/src/components/Radio/Radio.module.scss.d.ts +12 -0
  180. package/src/components/Results/Cell.tsx +3 -12
  181. package/src/components/Results/Header.tsx +9 -18
  182. package/src/components/Results/HeaderButton.tsx +4 -5
  183. package/src/components/Results/Result.tsx +4 -12
  184. package/src/components/Results/Results.module.scss +4 -6
  185. package/src/components/Results/Results.module.scss.d.ts +27 -0
  186. package/src/components/Results/Results.tsx +4 -3
  187. package/src/components/Results/SolveButton.tsx +1 -1
  188. package/src/components/ResultsInput/ResultsInput.module.scss.d.ts +7 -0
  189. package/src/components/ResultsInput/ResultsInput.tsx +1 -1
  190. package/src/components/Solver/Solver.module.scss +6 -5
  191. package/src/components/Solver/Solver.module.scss.d.ts +20 -0
  192. package/src/components/Solver/Solver.tsx +19 -21
  193. package/src/components/Solver/components/InsertButton/InsertButton.module.scss.d.ts +7 -0
  194. package/src/components/Solver/components/InsertButton/InsertButton.tsx +1 -1
  195. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.module.scss.d.ts +18 -0
  196. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +3 -1
  197. package/src/components/Spinner/Spinner.module.scss.d.ts +10 -0
  198. package/src/components/Tile/Tile.module.scss +3 -0
  199. package/src/components/Tile/Tile.module.scss.d.ts +19 -0
  200. package/src/components/Tile/Tile.tsx +5 -14
  201. package/src/components/Tile/TilePure.tsx +2 -12
  202. package/src/components/Tooltip/Tooltip.module.scss.d.ts +7 -0
  203. package/src/components/Tooltip/Tooltip.tsx +14 -3
  204. package/src/components/Tooltip/useTooltip.ts +1 -0
  205. package/src/hooks/useColumns.ts +4 -7
  206. package/src/hooks/useDeferredRender.ts +20 -0
  207. package/src/hooks/useDirection.ts +4 -3
  208. package/src/hooks/useLanguage.ts +2 -2
  209. package/src/hooks/useLocalStorage.ts +32 -8
  210. package/src/hooks/useMedia.ts +26 -26
  211. package/src/i18n/constants.ts +2 -15
  212. package/src/i18n/i18n.ts +18 -17
  213. package/src/i18n/languages/english.json +0 -1
  214. package/src/i18n/languages/french.json +0 -1
  215. package/src/i18n/languages/german.json +0 -1
  216. package/src/i18n/languages/persian.json +0 -1
  217. package/src/i18n/languages/polish.json +0 -1
  218. package/src/i18n/languages/romanian.json +0 -1
  219. package/src/i18n/languages/spanish.json +0 -1
  220. package/src/i18n/languages/turkish.json +0 -1
  221. package/src/i18n/localeIcons.ts +24 -0
  222. package/src/lib/localeTransliterate.test.ts +5 -0
  223. package/src/lib/localeTransliterate.ts +26 -6
  224. package/src/lib/waitForIdleOrFirstIntent.ts +33 -0
  225. package/src/modals/DictionaryModal/DictionaryModal.module.scss.d.ts +8 -0
  226. package/src/modals/DictionaryModal/DictionaryModal.tsx +3 -1
  227. package/src/modals/KeyMapModal/KeyMapModal.tsx +3 -1
  228. package/src/modals/KeyMapModal/components/Mapping/Mapping.module.scss.d.ts +11 -0
  229. package/src/modals/MenuModal/MenuModal.module.scss +5 -0
  230. package/src/modals/MenuModal/MenuModal.module.scss.d.ts +10 -0
  231. package/src/modals/MenuModal/MenuModal.tsx +16 -5
  232. package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss +4 -1
  233. package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss.d.ts +9 -0
  234. package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +4 -6
  235. package/src/modals/RemainingTilesModal/components/Character/Character.module.scss +1 -0
  236. package/src/modals/RemainingTilesModal/components/Character/Character.module.scss.d.ts +12 -0
  237. package/src/modals/RemainingTilesModal/components/Character/Character.tsx +5 -12
  238. package/src/modals/ResultsModal/ResultsModal.module.scss.d.ts +8 -0
  239. package/src/modals/ResultsModal/ResultsModal.tsx +8 -4
  240. package/src/modals/SettingsModal/SettingsModal.tsx +2 -2
  241. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.module.scss.d.ts +7 -0
  242. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -1
  243. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.module.scss.d.ts +7 -0
  244. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +1 -1
  245. package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.module.scss.d.ts +7 -0
  246. package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.tsx +1 -1
  247. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.module.scss.d.ts +7 -0
  248. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +1 -1
  249. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.module.scss.d.ts +8 -0
  250. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +24 -21
  251. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.module.scss.d.ts +7 -0
  252. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.tsx +1 -1
  253. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.module.scss.d.ts +7 -0
  254. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +1 -5
  255. package/src/modals/WordsModal/WordsModal.module.scss.d.ts +11 -0
  256. package/src/modals/WordsModal/WordsModal.tsx +4 -2
  257. package/src/modals/preload.ts +24 -0
  258. package/src/pages/_app.tsx +5 -8
  259. package/src/pages/_document.tsx +91 -5
  260. package/src/pages/api/solve.ts +1 -1
  261. package/src/pages/index.module.scss +1 -0
  262. package/src/pages/index.module.scss.d.ts +11 -0
  263. package/src/pages/index.tsx +98 -38
  264. package/src/pages/not-found.tsx +1 -1
  265. package/src/parameters/index.ts +24 -93
  266. package/src/serviceWorkerManager.ts +5 -2
  267. package/src/state/actions.ts +1 -1
  268. package/src/state/app/index.ts +4 -0
  269. package/src/state/app/initialState.ts +6 -0
  270. package/src/state/app/selectors.ts +5 -0
  271. package/src/state/app/slice.ts +20 -0
  272. package/src/state/app/types.ts +4 -0
  273. package/src/state/board/initialState.ts +1 -2
  274. package/src/state/i18n/index.ts +4 -0
  275. package/src/state/i18n/initialState.ts +5 -0
  276. package/src/state/i18n/selectors.ts +3 -0
  277. package/src/state/i18n/slice.ts +16 -0
  278. package/src/state/i18n/types.ts +7 -0
  279. package/src/state/index.ts +2 -0
  280. package/src/state/lib.ts +1 -1
  281. package/src/state/localStorage.ts +86 -29
  282. package/src/state/rack/initialState.ts +1 -2
  283. package/src/state/rack/slice.ts +4 -1
  284. package/src/state/results/lib.ts +5 -5
  285. package/src/state/results/selectors.ts +1 -1
  286. package/src/state/sagas.ts +125 -9
  287. package/src/state/selectors.ts +1 -1
  288. package/src/state/settings/initialState.ts +7 -10
  289. package/src/state/settings/selectors.ts +7 -2
  290. package/src/state/settings/slice.ts +5 -2
  291. package/src/state/store.ts +4 -0
  292. package/src/state/types.ts +4 -0
  293. package/src/styles/_tokens.scss +1 -0
  294. package/src/styles/global.scss +9 -0
  295. package/src/styles/variables.module.scss +0 -21
  296. package/src/styles/variables.module.scss.d.ts +27 -0
  297. package/src/styles/variables.scss +46 -2
  298. package/src/types/index.ts +1 -2
  299. package/tsconfig.tsbuildinfo +1 -1
  300. package/.next/server/chunks/129.js +0 -1
  301. package/.next/server/chunks/318.js +0 -3
  302. package/.next/server/chunks/791.js +0 -15
  303. package/.next/static/OLE8_ZInlGH7ENU0NIOpf/_buildManifest.js +0 -1
  304. package/.next/static/chunks/830.661816bf0de8c2f1.js +0 -1
  305. package/.next/static/chunks/framework-3cf15b8041c59dd3.js +0 -1
  306. package/.next/static/chunks/main-5b999f3f24ebfa84.js +0 -5
  307. package/.next/static/chunks/pages/_app-7024e7a27ffbb2fa.js +0 -7
  308. package/.next/static/chunks/pages/index-8b398b0a5d870773.js +0 -1
  309. package/.next/static/chunks/pages/not-found-9e076427bad69d90.js +0 -1
  310. package/.next/static/chunks/webpack-3943d624bbb47a64.js +0 -1
  311. package/.next/static/css/a78e04fe95452380.css +0 -1
  312. package/.next/static/css/aedeaada218d7280.css +0 -2
  313. package/src/app-layout/AppLayoutContext.tsx +0 -25
  314. package/src/app-layout/index.ts +0 -1
  315. package/src/app-layout/useAppLayoutValue.ts +0 -112
  316. package/src/components/Board/hooks/useBackgroundImage.tsx +0 -279
  317. package/src/components/index.ts +0 -26
  318. package/src/hooks/index.ts +0 -12
  319. package/src/hooks/useOnWindowResize.ts +0 -11
  320. package/src/hooks/useViewportSize.ts +0 -17
  321. package/src/i18n/index.ts +0 -2
  322. package/src/icons/Flag.svg +0 -4
  323. package/src/icons/Star.svg +0 -4
  324. package/src/icons/index.ts +0 -49
  325. package/src/lib/getTileSizes.ts +0 -13
  326. package/src/lib/index.ts +0 -24
  327. package/src/modals/index.ts +0 -7
  328. /package/.next/static/{OLE8_ZInlGH7ENU0NIOpf → FL82obwzFHRzvV6z76I-U}/_ssgManifest.js +0 -0
@@ -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
 
@@ -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,6 +2,7 @@
2
2
 
3
3
  .dictionary {
4
4
  position: relative;
5
+ min-height: 0;
5
6
  word-break: break-word;
6
7
 
7
8
  &:focus-within {
@@ -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,13 +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
26
 
29
27
  return (
30
- <div className={classNames(styles.dictionary, className)} style={{ height: dictionaryResultsHeight }}>
28
+ <div className={classNames(styles.dictionary, className)}>
31
29
  <div className={styles.content}>
32
30
  {typeof error !== 'undefined' && !isLoading && <EmptyState variant="error">{error.message}</EmptyState>}
33
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;
@@ -1,6 +1,6 @@
1
1
  import { type FunctionComponent } from 'react';
2
2
 
3
- import { DashCircleFill } from '@/icons';
3
+ import DashCircleFill from '@/icons/DashCircleFill.svg';
4
4
 
5
5
  import { PlainTiles } from '../PlainTiles';
6
6
 
@@ -0,0 +1,11 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly dropShadow: string;
4
+ readonly hide: string;
5
+ readonly rotate: string;
6
+ readonly show: string;
7
+ readonly tile: string;
8
+ readonly wave: string;
9
+ };
10
+
11
+ export default styles;
@@ -44,7 +44,6 @@ export const PlainTiles: FunctionComponent<Props> = ({
44
44
  key={index}
45
45
  points={tile.points}
46
46
  size={tile.size}
47
- transform={tile.transform}
48
47
  x={tile.x}
49
48
  y={tile.y}
50
49
  />
@@ -6,14 +6,13 @@ interface Props {
6
6
  color: string;
7
7
  points?: number;
8
8
  size: number;
9
- transform?: string;
10
9
  x: number;
11
10
  y: number;
12
11
  }
13
12
 
14
- export const Tile: FunctionComponent<Props> = ({ character, className, color, points, size, transform, x, y }) => (
15
- <g className={className} fill="#222" transform={transform}>
16
- <rect fill={color} height={size} rx={size * 0.15} width={size} x={x} y={y} />
13
+ export const Tile: FunctionComponent<Props> = ({ character, className, color, points, size, x, y }) => (
14
+ <g className={className} style={{ fill: 'var(--color--foreground)' }}>
15
+ <rect height={size} rx={size * 0.15} style={{ fill: color }} width={size} x={x} y={y} />
17
16
 
18
17
  <text
19
18
  dominantBaseline="central"
@@ -3,12 +3,8 @@ import { Game, Locale } from '@scrabble-solver/types';
3
3
 
4
4
  import {
5
5
  PLAIN_TILES_COLOR_DEFAULT,
6
- PLAIN_TILES_PADDING_HORIZONTAL,
7
- PLAIN_TILES_PADDING_VERTICAL,
8
6
  PLAIN_TILES_POINTS_COLORS,
9
7
  PLAIN_TILES_TILE_MARGIN,
10
- PLAIN_TILES_TILE_MAX_ROTATE,
11
- PLAIN_TILES_TILE_MAX_SCATTER,
12
8
  PLAIN_TILES_TILE_SIZE,
13
9
  } from '@/parameters';
14
10
 
@@ -47,17 +43,14 @@ export const createPlainTile = ({
47
43
  const points = showPoints ? configPoints : undefined;
48
44
  const defaultColor =
49
45
  typeof configPoints === 'number' ? PLAIN_TILES_POINTS_COLORS[configPoints] : PLAIN_TILES_COLOR_DEFAULT;
50
- const x = getX(cellIndex) + PLAIN_TILES_TILE_SIZE / 2;
51
- const y = getY(0) + PLAIN_TILES_TILE_SIZE / 2;
52
46
 
53
47
  return {
54
48
  character,
55
49
  color: color || defaultColor,
56
50
  points,
57
51
  size: PLAIN_TILES_TILE_SIZE,
58
- transform: `rotate(${randomize(0, PLAIN_TILES_TILE_MAX_ROTATE)}, ${x}, ${y})`,
59
- x: randomize(getX(cellIndex), PLAIN_TILES_TILE_MAX_SCATTER),
60
- y: randomize(getY(rowIndex), PLAIN_TILES_TILE_MAX_SCATTER),
52
+ x: getOffset(cellIndex),
53
+ y: getOffset(rowIndex),
61
54
  };
62
55
  };
63
56
 
@@ -77,14 +70,6 @@ export const getViewbox = (content: string[][]): string => {
77
70
  return `0 0 ${width} ${height}`;
78
71
  };
79
72
 
80
- export const getX = (index: number): number => {
81
- return PLAIN_TILES_PADDING_HORIZONTAL + index * (PLAIN_TILES_TILE_SIZE + PLAIN_TILES_TILE_MARGIN);
82
- };
83
-
84
- export const getY = (index: number): number => {
85
- return PLAIN_TILES_PADDING_VERTICAL + index * (PLAIN_TILES_TILE_SIZE + PLAIN_TILES_TILE_MARGIN);
86
- };
87
-
88
- export const randomize = (value: number, maxChange: number): number => {
89
- return value + maxChange * 2 * (0.5 - Math.random());
73
+ const getOffset = (index: number): number => {
74
+ return index * (PLAIN_TILES_TILE_SIZE + PLAIN_TILES_TILE_MARGIN);
90
75
  };
@@ -17,7 +17,6 @@ export interface PlainTile {
17
17
  color: string;
18
18
  points?: number;
19
19
  size: number;
20
- transform: string;
21
20
  x: number;
22
21
  y: number;
23
22
  }
@@ -2,6 +2,13 @@
2
2
  width: 100%;
3
3
  min-height: 1px;
4
4
  border-radius: var(--border--radius);
5
+ background-image: linear-gradient(
6
+ 90deg,
7
+ var(--color--progress) 0%,
8
+ var(--color--progress) var(--progress),
9
+ var(--color--progress--background) var(--progress),
10
+ var(--color--progress--background) 100%
11
+ );
5
12
 
6
13
  [dir='rtl'] & {
7
14
  transform: scaleX(-1);
@@ -0,0 +1,6 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly progress: string;
4
+ };
5
+
6
+ export default styles;