@scrabble-solver/scrabble-solver 2.17.0 → 2.18.1

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 (331) 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 +29 -1
  45. package/.next/server/pages/500.html +29 -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 +29 -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 +29 -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/5KOWzYqfY1Z2rjrzptr8D/_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-2e607dcd4135f340.js +1 -0
  90. package/.next/static/chunks/pages/{_error-afeda7c5231b6c3c.js → _error-f0290a98eb3ed0ec.js} +1 -1
  91. package/.next/static/chunks/pages/index-e0087247c995328d.js +1 -0
  92. package/.next/static/chunks/pages/not-found-a59f9deeeff63d17.js +1 -0
  93. package/.next/static/chunks/webpack-cfb34d175e081981.js +1 -0
  94. package/.next/static/css/2d03f0da2c678dfc.css +1 -0
  95. package/.next/static/css/4dbcacc1122ac6b9.css +2 -0
  96. package/.next/static/css/7b6724d2df70f48f.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 +43 -17
  108. package/public/llms.txt +11 -0
  109. package/public/robots.txt +5 -0
  110. package/public/site.webmanifest +14 -0
  111. package/scripts/generate-scss-types.ts +112 -0
  112. package/src/@types/scss.d.ts +6 -9
  113. package/src/@types/svg.d.ts +1 -1
  114. package/src/components/Alert/Alert.module.scss.d.ts +13 -0
  115. package/src/components/Alert/Alert.tsx +4 -1
  116. package/src/components/Badge/Badge.module.scss.d.ts +6 -0
  117. package/src/components/Board/Board.module.scss +10 -0
  118. package/src/components/Board/Board.module.scss.d.ts +17 -0
  119. package/src/components/Board/Board.tsx +14 -26
  120. package/src/components/Board/BoardPure.tsx +54 -49
  121. package/src/components/Board/components/Actions/Actions.module.scss +18 -18
  122. package/src/components/Board/components/Actions/Actions.module.scss.d.ts +7 -0
  123. package/src/components/Board/components/Actions/Actions.tsx +6 -3
  124. package/src/components/Board/components/Actions/lib.ts +3 -1
  125. package/src/components/Board/components/Cell/Cell.module.scss.d.ts +13 -0
  126. package/src/components/Board/components/Cell/Cell.tsx +28 -33
  127. package/src/components/Board/components/InputPrompt/InputPrompt.module.scss.d.ts +10 -0
  128. package/src/components/Board/components/InputPrompt/InputPrompt.tsx +1 -1
  129. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.module.scss.d.ts +8 -0
  130. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +2 -2
  131. package/src/components/Board/getBoardBackground.ts +175 -0
  132. package/src/components/Board/hooks/index.ts +0 -1
  133. package/src/components/Board/hooks/useBoardStyle.ts +10 -20
  134. package/src/components/Board/hooks/useFloatingActions.ts +3 -6
  135. package/src/components/Board/hooks/useGrid.ts +6 -3
  136. package/src/components/Board/selectors.ts +1 -1
  137. package/src/components/Button/Button.module.scss.d.ts +12 -0
  138. package/src/components/Dictionary/Dictionary.module.scss +1 -0
  139. package/src/components/Dictionary/Dictionary.module.scss.d.ts +14 -0
  140. package/src/components/Dictionary/Dictionary.tsx +1 -3
  141. package/src/components/DictionaryInput/DictionaryInput.module.scss.d.ts +7 -0
  142. package/src/components/DictionaryInput/DictionaryInput.tsx +1 -1
  143. package/src/components/EmptyState/EmptyState.module.scss.d.ts +7 -0
  144. package/src/components/EmptyState/EmptyState.tsx +1 -1
  145. package/src/components/IconButton/IconButton.module.scss.d.ts +8 -0
  146. package/src/components/Key/Key.module.scss.d.ts +6 -0
  147. package/src/components/Keys/Arrows/Arrows.module.scss.d.ts +11 -0
  148. package/src/components/Keys/Arrows/Arrows.tsx +4 -1
  149. package/src/components/Keys/index.tsx +1 -1
  150. package/src/components/Loading/Loading.module.scss.d.ts +9 -0
  151. package/src/components/Loading/Loading.tsx +1 -1
  152. package/src/components/Logo/Logo.tsx +4 -9
  153. package/src/components/Logo/LogoBlueprint.tsx +1 -0
  154. package/src/components/Modal/Modal.module.scss.d.ts +15 -0
  155. package/src/components/Modal/Modal.tsx +16 -3
  156. package/src/components/Modal/components/Section/Section.module.scss.d.ts +7 -0
  157. package/src/components/NavButtons/NavButtons.module.scss +20 -0
  158. package/src/components/NavButtons/NavButtons.module.scss.d.ts +13 -0
  159. package/src/components/NavButtons/NavButtons.tsx +29 -45
  160. package/src/components/NotFound/NotFound.module.scss.d.ts +9 -0
  161. package/src/components/NotFound/NotFound.tsx +1 -1
  162. package/src/components/PlainTiles/PlainTiles.module.scss.d.ts +11 -0
  163. package/src/components/PlainTiles/PlainTiles.tsx +0 -1
  164. package/src/components/PlainTiles/Tile.tsx +3 -4
  165. package/src/components/PlainTiles/lib.ts +4 -19
  166. package/src/components/PlainTiles/types.ts +0 -1
  167. package/src/components/Progress/Progress.module.scss +7 -0
  168. package/src/components/Progress/Progress.module.scss.d.ts +6 -0
  169. package/src/components/Progress/Progress.tsx +2 -11
  170. package/src/components/Rack/Rack.module.scss +3 -0
  171. package/src/components/Rack/Rack.module.scss.d.ts +10 -0
  172. package/src/components/Rack/Rack.tsx +8 -11
  173. package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss +2 -0
  174. package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss.d.ts +7 -0
  175. package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +1 -13
  176. package/src/components/Rack/components/InputPrompt/lib.ts +1 -1
  177. package/src/components/Rack/components/RackTile/RackTile.module.scss.d.ts +6 -0
  178. package/src/components/Rack/components/RackTile/RackTile.tsx +5 -4
  179. package/src/components/Rack/selectors.ts +1 -1
  180. package/src/components/Radio/Radio.module.scss.d.ts +12 -0
  181. package/src/components/Results/Cell.tsx +3 -12
  182. package/src/components/Results/Header.tsx +9 -18
  183. package/src/components/Results/HeaderButton.tsx +4 -5
  184. package/src/components/Results/Result.tsx +4 -12
  185. package/src/components/Results/Results.module.scss +4 -6
  186. package/src/components/Results/Results.module.scss.d.ts +27 -0
  187. package/src/components/Results/Results.tsx +4 -3
  188. package/src/components/Results/SolveButton.tsx +1 -1
  189. package/src/components/ResultsInput/ResultsInput.module.scss.d.ts +7 -0
  190. package/src/components/ResultsInput/ResultsInput.tsx +1 -1
  191. package/src/components/Solver/Solver.module.scss +6 -5
  192. package/src/components/Solver/Solver.module.scss.d.ts +20 -0
  193. package/src/components/Solver/Solver.tsx +19 -21
  194. package/src/components/Solver/components/InsertButton/InsertButton.module.scss.d.ts +7 -0
  195. package/src/components/Solver/components/InsertButton/InsertButton.tsx +1 -1
  196. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.module.scss.d.ts +18 -0
  197. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +3 -1
  198. package/src/components/Spinner/Spinner.module.scss.d.ts +10 -0
  199. package/src/components/Tile/Tile.module.scss +3 -0
  200. package/src/components/Tile/Tile.module.scss.d.ts +19 -0
  201. package/src/components/Tile/Tile.tsx +5 -14
  202. package/src/components/Tile/TilePure.tsx +2 -12
  203. package/src/components/Tooltip/Tooltip.module.scss.d.ts +7 -0
  204. package/src/components/Tooltip/Tooltip.tsx +14 -3
  205. package/src/components/Tooltip/useTooltip.ts +1 -0
  206. package/src/hooks/useColumns.ts +4 -7
  207. package/src/hooks/useDeferredRender.ts +20 -0
  208. package/src/hooks/useDirection.ts +4 -3
  209. package/src/hooks/useLanguage.ts +2 -2
  210. package/src/hooks/useLocalStorage.ts +32 -8
  211. package/src/hooks/useMedia.ts +26 -26
  212. package/src/i18n/constants.ts +2 -15
  213. package/src/i18n/i18n.ts +18 -17
  214. package/src/i18n/languages/english.json +0 -1
  215. package/src/i18n/languages/french.json +0 -1
  216. package/src/i18n/languages/german.json +0 -1
  217. package/src/i18n/languages/persian.json +0 -1
  218. package/src/i18n/languages/polish.json +0 -1
  219. package/src/i18n/languages/romanian.json +0 -1
  220. package/src/i18n/languages/spanish.json +0 -1
  221. package/src/i18n/languages/turkish.json +0 -1
  222. package/src/i18n/localeIcons.ts +24 -0
  223. package/src/lib/localeTransliterate.test.ts +5 -0
  224. package/src/lib/localeTransliterate.ts +26 -6
  225. package/src/lib/waitForIdleOrFirstIntent.ts +44 -0
  226. package/src/modals/DictionaryModal/DictionaryModal.module.scss.d.ts +8 -0
  227. package/src/modals/DictionaryModal/DictionaryModal.tsx +3 -1
  228. package/src/modals/KeyMapModal/KeyMapModal.tsx +3 -1
  229. package/src/modals/KeyMapModal/components/Mapping/Mapping.module.scss.d.ts +11 -0
  230. package/src/modals/MenuModal/MenuModal.module.scss +5 -0
  231. package/src/modals/MenuModal/MenuModal.module.scss.d.ts +10 -0
  232. package/src/modals/MenuModal/MenuModal.tsx +16 -5
  233. package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss +4 -1
  234. package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss.d.ts +9 -0
  235. package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +4 -6
  236. package/src/modals/RemainingTilesModal/components/Character/Character.module.scss +1 -0
  237. package/src/modals/RemainingTilesModal/components/Character/Character.module.scss.d.ts +12 -0
  238. package/src/modals/RemainingTilesModal/components/Character/Character.tsx +5 -12
  239. package/src/modals/ResultsModal/ResultsModal.module.scss.d.ts +8 -0
  240. package/src/modals/ResultsModal/ResultsModal.tsx +8 -4
  241. package/src/modals/SettingsModal/SettingsModal.tsx +2 -2
  242. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.module.scss.d.ts +7 -0
  243. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -1
  244. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.module.scss.d.ts +7 -0
  245. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +1 -1
  246. package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.module.scss.d.ts +7 -0
  247. package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.tsx +1 -1
  248. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.module.scss.d.ts +7 -0
  249. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +1 -1
  250. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.module.scss.d.ts +8 -0
  251. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +24 -21
  252. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.module.scss.d.ts +7 -0
  253. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.tsx +1 -1
  254. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.module.scss.d.ts +7 -0
  255. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +1 -5
  256. package/src/modals/WordsModal/WordsModal.module.scss.d.ts +11 -0
  257. package/src/modals/WordsModal/WordsModal.tsx +4 -2
  258. package/src/modals/preload.ts +24 -0
  259. package/src/pages/_app.tsx +37 -76
  260. package/src/pages/_document.tsx +112 -24
  261. package/src/pages/api/solve.ts +1 -1
  262. package/src/pages/index.module.scss +1 -0
  263. package/src/pages/index.module.scss.d.ts +11 -0
  264. package/src/pages/index.tsx +127 -40
  265. package/src/pages/not-found.tsx +14 -3
  266. package/src/parameters/index.ts +31 -93
  267. package/src/serviceWorkerManager.ts +5 -2
  268. package/src/state/actions.ts +1 -1
  269. package/src/state/app/index.ts +4 -0
  270. package/src/state/app/initialState.ts +6 -0
  271. package/src/state/app/selectors.ts +5 -0
  272. package/src/state/app/slice.ts +20 -0
  273. package/src/state/app/types.ts +4 -0
  274. package/src/state/board/initialState.ts +1 -2
  275. package/src/state/i18n/index.ts +4 -0
  276. package/src/state/i18n/initialState.ts +5 -0
  277. package/src/state/i18n/selectors.ts +3 -0
  278. package/src/state/i18n/slice.ts +16 -0
  279. package/src/state/i18n/types.ts +7 -0
  280. package/src/state/index.ts +2 -0
  281. package/src/state/lib.ts +1 -1
  282. package/src/state/localStorage.ts +86 -29
  283. package/src/state/rack/initialState.ts +1 -2
  284. package/src/state/rack/slice.ts +4 -1
  285. package/src/state/results/lib.ts +5 -5
  286. package/src/state/results/selectors.ts +1 -1
  287. package/src/state/sagas.ts +125 -9
  288. package/src/state/selectors.ts +1 -1
  289. package/src/state/settings/initialState.ts +7 -10
  290. package/src/state/settings/selectors.ts +7 -2
  291. package/src/state/settings/slice.ts +5 -2
  292. package/src/state/store.ts +4 -0
  293. package/src/state/types.ts +4 -0
  294. package/src/styles/_tokens.scss +1 -0
  295. package/src/styles/global.scss +9 -0
  296. package/src/styles/variables.module.scss +0 -21
  297. package/src/styles/variables.module.scss.d.ts +27 -0
  298. package/src/styles/variables.scss +46 -2
  299. package/src/types/index.ts +1 -2
  300. package/tsconfig.tsbuildinfo +1 -1
  301. package/.next/server/chunks/129.js +0 -1
  302. package/.next/server/chunks/318.js +0 -3
  303. package/.next/server/chunks/791.js +0 -15
  304. package/.next/static/OLE8_ZInlGH7ENU0NIOpf/_buildManifest.js +0 -1
  305. package/.next/static/chunks/830.661816bf0de8c2f1.js +0 -1
  306. package/.next/static/chunks/framework-3cf15b8041c59dd3.js +0 -1
  307. package/.next/static/chunks/main-5b999f3f24ebfa84.js +0 -5
  308. package/.next/static/chunks/pages/_app-7024e7a27ffbb2fa.js +0 -7
  309. package/.next/static/chunks/pages/index-8b398b0a5d870773.js +0 -1
  310. package/.next/static/chunks/pages/not-found-9e076427bad69d90.js +0 -1
  311. package/.next/static/chunks/webpack-3943d624bbb47a64.js +0 -1
  312. package/.next/static/css/a78e04fe95452380.css +0 -1
  313. package/.next/static/css/aedeaada218d7280.css +0 -2
  314. package/src/app-layout/AppLayoutContext.tsx +0 -25
  315. package/src/app-layout/index.ts +0 -1
  316. package/src/app-layout/useAppLayoutValue.ts +0 -112
  317. package/src/components/Board/hooks/useBackgroundImage.tsx +0 -279
  318. package/src/components/SeoMessage/SeoMessage.tsx +0 -18
  319. package/src/components/SeoMessage/index.ts +0 -1
  320. package/src/components/index.ts +0 -26
  321. package/src/hooks/index.ts +0 -12
  322. package/src/hooks/useOnWindowResize.ts +0 -11
  323. package/src/hooks/useViewportSize.ts +0 -17
  324. package/src/i18n/index.ts +0 -2
  325. package/src/icons/Flag.svg +0 -4
  326. package/src/icons/Star.svg +0 -4
  327. package/src/icons/index.ts +0 -49
  328. package/src/lib/getTileSizes.ts +0 -13
  329. package/src/lib/index.ts +0 -24
  330. package/src/modals/index.ts +0 -7
  331. /package/.next/static/{OLE8_ZInlGH7ENU0NIOpf → 5KOWzYqfY1Z2rjrzptr8D}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-typescript","duration":169366,"timestamp":26528773671,"id":13,"parentId":1,"tags":{},"startTime":1786055166126,"traceId":"c15733d8168a03e3"},{"name":"run-webpack","duration":6699896,"timestamp":26528944927,"id":15,"parentId":1,"tags":{},"startTime":1786055166298,"traceId":"c15733d8168a03e3"},{"name":"static-check","duration":225589,"timestamp":26535727438,"id":2014,"parentId":1,"tags":{},"startTime":1786055173080,"traceId":"c15733d8168a03e3"},{"name":"static-generation","duration":240386,"timestamp":26535961329,"id":2032,"parentId":1,"tags":{},"startTime":1786055173314,"traceId":"c15733d8168a03e3"},{"name":"collect-build-traces","duration":4253048,"timestamp":26535953473,"id":2029,"parentId":1,"tags":{},"startTime":1786055173306,"traceId":"c15733d8168a03e3"},{"name":"telemetry-flush","duration":19,"timestamp":26540207730,"id":2039,"parentId":1,"tags":{},"startTime":1786055177561,"traceId":"c15733d8168a03e3"},{"name":"next-build","duration":11677867,"timestamp":26528529886,"id":1,"tags":{"buildMode":"default","version":"16.3.0","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1786055165883,"traceId":"c15733d8168a03e3"}]
1
+ [{"name":"run-typescript","duration":167919,"timestamp":15741743485,"id":13,"parentId":1,"tags":{},"startTime":1786879882182,"traceId":"09ff88835bed4614"},{"name":"run-webpack","duration":6553601,"timestamp":15741913668,"id":15,"parentId":1,"tags":{},"startTime":1786879882352,"traceId":"09ff88835bed4614"},{"name":"static-check","duration":184131,"timestamp":15748541724,"id":2019,"parentId":1,"tags":{},"startTime":1786879888980,"traceId":"09ff88835bed4614"},{"name":"static-generation","duration":249410,"timestamp":15748736408,"id":2037,"parentId":1,"tags":{},"startTime":1786879889175,"traceId":"09ff88835bed4614"},{"name":"collect-build-traces","duration":4410264,"timestamp":15748726538,"id":2034,"parentId":1,"tags":{},"startTime":1786879889165,"traceId":"09ff88835bed4614"},{"name":"telemetry-flush","duration":21,"timestamp":15753138117,"id":2044,"parentId":1,"tags":{},"startTime":1786879893576,"traceId":"09ff88835bed4614"},{"name":"next-build","duration":11637473,"timestamp":15741500668,"id":1,"tags":{"buildMode":"default","version":"16.3.1","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1786879881939,"traceId":"09ff88835bed4614"}]
@@ -0,0 +1,2 @@
1
+ // Stub for modules webpack is configured to drop from the bundle (see next.config.js)
2
+ module.exports = {};
package/next.config.js CHANGED
@@ -22,19 +22,30 @@ module.exports = {
22
22
  { source: '/not-found', headers: [cacheControl] },
23
23
  ];
24
24
  },
25
- webpack(config, { isServer, dev }) {
25
+ webpack(config, { isServer, dev, webpack }) {
26
26
  config.module.rules.push({
27
27
  test: /\.svg$/i,
28
28
  issuer: /\.[jt]sx?$/,
29
29
  use: ['@svgr/webpack'],
30
30
  });
31
31
 
32
+ if (!isServer) {
33
+ // Next unconditionally bundles ES2019-2022 polyfills into its client runtime,
34
+ // but every browserslist target implements those methods natively.
35
+ config.plugins.push(
36
+ new webpack.NormalModuleReplacementPlugin(
37
+ /polyfills\/polyfill-module/,
38
+ path.join(__dirname, 'empty-module.js'),
39
+ ),
40
+ );
41
+ }
42
+
32
43
  if (!isServer && !dev) {
33
44
  config.plugins.push(
34
45
  new WorkboxPlugin.InjectManifest({
35
46
  swSrc: path.join(__dirname, 'src/service-worker/index.ts'),
36
47
  swDest: path.join(__dirname, 'public/service-worker.js'),
37
- exclude: [/\.map$/, /\.next/, /_next/, /manifest/, /\.htaccess$/, /.*\/static\/.*/, /service-worker\.js$/],
48
+ exclude: [/\.css$/, /\.map$/, /service-worker\.js$/],
38
49
  }),
39
50
  );
40
51
  }
package/package.json CHANGED
@@ -1,7 +1,14 @@
1
1
  {
2
2
  "name": "@scrabble-solver/scrabble-solver",
3
- "version": "2.17.0",
4
- "description": "Scrabble Solver 2 - App",
3
+ "version": "2.18.1",
4
+ "description": "Scrabble Solver web app: free word finder and board solver for Scrabble, Super Scrabble, Literaki, and more.",
5
+ "keywords": [
6
+ "scrabble",
7
+ "word-finder",
8
+ "solver",
9
+ "nextjs",
10
+ "react"
11
+ ],
5
12
  "repository": {
6
13
  "type": "git",
7
14
  "url": "git+https://github.com/kamilmielnik/scrabble-solver.git"
@@ -11,36 +18,55 @@
11
18
  "email": "kamil@kamilmielnik.com",
12
19
  "url": "https://kamilmielnik.com"
13
20
  },
14
- "license": "CC BY-NC-ND 4.0",
21
+ "license": "CC-BY-NC-ND-4.0",
15
22
  "bugs": {
16
23
  "url": "https://github.com/kamilmielnik/scrabble-solver/issues"
17
24
  },
18
25
  "homepage": "https://scrabble-solver.org",
26
+ "sideEffects": [
27
+ "**/*.css",
28
+ "**/*.scss",
29
+ "src/pages/**"
30
+ ],
31
+ "browserslist": [
32
+ "chrome >= 100",
33
+ "and_chr >= 100",
34
+ "edge >= 100",
35
+ "firefox >= 100",
36
+ "safari >= 15.4",
37
+ "ios_saf >= 15.4",
38
+ "samsung >= 17",
39
+ "opera >= 86",
40
+ "op_mob >= 70",
41
+ "android >= 100",
42
+ "and_ff >= 100"
43
+ ],
19
44
  "scripts": {
20
- "build": "env-cmd next build --webpack",
21
- "clean": "rimraf .next/",
45
+ "build": "bun run generate-scss-types && env-cmd next build --webpack",
46
+ "clean": "rimraf --glob .next/ 'src/**/*.module.scss.d.ts'",
22
47
  "debug": "NODE_OPTIONS='--inspect' next dev --webpack",
23
- "dev": "env-cmd next dev --webpack",
48
+ "dev": "concurrently -n scss,next 'bun scripts/generate-scss-types.ts --watch' 'env-cmd next dev --webpack'",
49
+ "generate-scss-types": "bun scripts/generate-scss-types.ts",
24
50
  "start": "env-cmd next start -p 3333",
25
51
  "test": "bun test --timeout 180000 src",
26
- "type-check": "tsc --noEmit"
52
+ "type-check": "bun run generate-scss-types && tsc --noEmit"
27
53
  },
28
54
  "dependencies": {
29
55
  "@floating-ui/react": "^0.27.20",
30
56
  "@kamilmielnik/gaddag": "^2.0.0",
31
57
  "@reduxjs/toolkit": "^2.12.0",
32
- "@scrabble-solver/configs": "^2.17.0",
33
- "@scrabble-solver/constants": "^2.17.0",
34
- "@scrabble-solver/dictionaries": "^2.17.0",
35
- "@scrabble-solver/logger": "^2.17.0",
36
- "@scrabble-solver/solver": "^2.17.0",
37
- "@scrabble-solver/types": "^2.17.0",
38
- "@scrabble-solver/word-definitions": "^2.17.0",
58
+ "@scrabble-solver/configs": "^2.18.1",
59
+ "@scrabble-solver/constants": "^2.18.1",
60
+ "@scrabble-solver/dictionaries": "^2.18.1",
61
+ "@scrabble-solver/logger": "^2.18.1",
62
+ "@scrabble-solver/solver": "^2.18.1",
63
+ "@scrabble-solver/types": "^2.18.1",
64
+ "@scrabble-solver/word-definitions": "^2.18.1",
39
65
  "classnames": "^2.5.1",
40
66
  "env-cmd": "^11.0.0",
41
67
  "include-media": "^2.0.0",
42
68
  "include-media-query-builder": "^1.1.0",
43
- "next": "^16.3.0",
69
+ "next": "^16.3.1",
44
70
  "normalize.css": "^8.0.1",
45
71
  "react": "^19.2.8",
46
72
  "react-cool-onclickoutside": "^1.7.0",
@@ -51,7 +77,6 @@
51
77
  "react-window": "^2.3.0",
52
78
  "redux-saga": "^1.5.1",
53
79
  "store2": "^2.14.4",
54
- "transliteration": "^2.6.1",
55
80
  "use-debounce": "^10.1.1",
56
81
  "workbox-expiration": "^7.4.1",
57
82
  "workbox-precaching": "^7.4.1",
@@ -66,7 +91,8 @@
66
91
  "@types/react-highlight-words": "^0.20.1",
67
92
  "@types/react-modal": "^3.16.3",
68
93
  "@types/react-portal": "^4.0.7",
94
+ "postcss": "^8.5.26",
69
95
  "sass": "^1.102.0"
70
96
  },
71
- "gitHead": "32234a6340029d39dde134edc9e71ff913836931"
97
+ "gitHead": "abd1636f7e2235d0ee06dbf6197de46b703feb44"
72
98
  }
@@ -0,0 +1,11 @@
1
+ # Scrabble Solver
2
+
3
+ > Free and open-source analysis tool for Scrabble, Super Scrabble, Scrabble Duel, Letter League, Crossplay, Literaki, and Kelimelik. Quickly finds top-scoring words for a given board and rack in English, French, German, Persian, Polish, Romanian, Spanish, and Turkish.
4
+
5
+ Scrabble Solver is a single-page web app. Enter the board state and your tiles to get every legal move ranked by score, check whether a word is allowed in the selected language's dictionary, and look up word definitions. Once a dictionary is cached, solving also works offline.
6
+
7
+ ## Resources
8
+
9
+ - [Web app](https://scrabble-solver.org/): the solver itself, free and with no sign-up
10
+ - [Source code](https://github.com/kamilmielnik/scrabble-solver): GitHub repository with documentation and issue tracker
11
+ - [npm package](https://www.npmjs.com/package/scrabble-solver): run the app locally with `bunx scrabble-solver@latest`
@@ -0,0 +1,5 @@
1
+ User-agent: *
2
+ Allow: /
3
+ Disallow: /api/
4
+
5
+ Sitemap: https://scrabble-solver.org/sitemap.xml
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "Scrabble Solver",
3
+ "short_name": "Scrabble Solver",
4
+ "description": "Free Scrabble word finder and board solver.",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "background_color": "#f4f4f4",
8
+ "theme_color": "#efe3ae",
9
+ "icons": [
10
+ { "src": "/icons/favicon-196x196.png", "sizes": "196x196", "type": "image/png" },
11
+ { "src": "/icons/favicon-128.png", "sizes": "128x128", "type": "image/png" },
12
+ { "src": "/icons/favicon.svg", "sizes": "any", "type": "image/svg+xml" }
13
+ ]
14
+ }
@@ -0,0 +1,112 @@
1
+ import { existsSync, readdirSync, readFileSync, unlinkSync, watch, writeFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import postcss from 'postcss';
4
+ import * as sass from 'sass';
5
+
6
+ const packageDirectory = path.join(__dirname, '..');
7
+ const sourceDirectory = path.join(packageDirectory, 'src');
8
+ const loadPaths = [sourceDirectory, path.join(packageDirectory, '../../node_modules/include-media/dist')];
9
+ const compiler = sass.initCompiler();
10
+
11
+ generateAll();
12
+
13
+ if (process.argv.includes('--watch')) {
14
+ watchModuleStylesheets();
15
+ } else {
16
+ compiler.dispose();
17
+ }
18
+
19
+ function generateAll() {
20
+ const files = findModuleStylesheets();
21
+
22
+ for (const file of files) {
23
+ generate(file);
24
+ }
25
+
26
+ console.log(`Generated type definitions for ${files.length} .module.scss files`);
27
+ }
28
+
29
+ function findModuleStylesheets(): string[] {
30
+ return readdirSync(sourceDirectory, { encoding: 'utf8', recursive: true })
31
+ .filter((file) => file.endsWith('.module.scss'))
32
+ .sort()
33
+ .map((file) => path.join(sourceDirectory, file));
34
+ }
35
+
36
+ function watchModuleStylesheets() {
37
+ console.log(`Watching ${sourceDirectory} for .module.scss changes`);
38
+
39
+ watch(sourceDirectory, { recursive: true }, (_event, filename) => {
40
+ if (!filename || !filename.endsWith('.module.scss')) {
41
+ return;
42
+ }
43
+
44
+ const file = path.join(sourceDirectory, filename);
45
+
46
+ try {
47
+ if (existsSync(file)) {
48
+ generate(file);
49
+ } else if (existsSync(getTypesFilepath(file))) {
50
+ unlinkSync(getTypesFilepath(file));
51
+ }
52
+ } catch (error) {
53
+ console.error(String(error));
54
+ }
55
+ });
56
+ }
57
+
58
+ function generate(file: string) {
59
+ const { css } = compiler.compile(file, { loadPaths, quietDeps: true });
60
+ const content = formatTypesFile(extractClassNames(css));
61
+ const typesFilepath = getTypesFilepath(file);
62
+
63
+ if (!existsSync(typesFilepath) || readFileSync(typesFilepath, 'utf8') !== content) {
64
+ writeFileSync(typesFilepath, content);
65
+ console.log(`Generated ${path.relative(packageDirectory, typesFilepath)}`);
66
+ }
67
+ }
68
+
69
+ function extractClassNames(css: string): string[] {
70
+ const classNames = new Set<string>();
71
+ const stylesheet = postcss.parse(css);
72
+
73
+ stylesheet.walkAtRules('keyframes', (atRule) => {
74
+ classNames.add(atRule.params);
75
+ });
76
+
77
+ stylesheet.walkRules((rule) => {
78
+ if (rule.selector === ':export') {
79
+ rule.walkDecls((declaration) => {
80
+ classNames.add(declaration.prop);
81
+ });
82
+ } else {
83
+ const localSelector = rule.selector.replace(/:global\([^)]*\)/g, '');
84
+
85
+ for (const [, className] of localSelector.matchAll(/\.(-?[A-Za-z_][\w-]*)/g)) {
86
+ classNames.add(className);
87
+ }
88
+ }
89
+ });
90
+
91
+ return [...classNames].sort();
92
+ }
93
+
94
+ function formatTypesFile(classNames: string[]): string {
95
+ return [
96
+ '// Generated by scripts/generate-scss-types.ts - do not edit.',
97
+ 'declare const styles: {',
98
+ ...classNames.map((className) => ` readonly ${formatKey(className)}: string;`),
99
+ '};',
100
+ '',
101
+ 'export default styles;',
102
+ '',
103
+ ].join('\n');
104
+ }
105
+
106
+ function formatKey(className: string): string {
107
+ return /^[A-Za-z_$][\w$]*$/.test(className) ? className : `'${className}'`;
108
+ }
109
+
110
+ function getTypesFilepath(file: string): string {
111
+ return `${file}.d.ts`;
112
+ }
@@ -1,9 +1,6 @@
1
- declare module '*.module.scss' {
2
- const classesMap: Record<string, string>;
3
- export default classesMap;
4
- }
5
-
6
- declare module '*.scss' {
7
- const classesMap: Record<string, string>;
8
- export default classesMap;
9
- }
1
+ /**
2
+ * Covers side-effect imports of global stylesheets. Imports of *.module.scss
3
+ * files resolve to their sibling .d.ts files, generated by
4
+ * scripts/generate-scss-types.ts (run via the build, type-check, and dev scripts).
5
+ */
6
+ declare module '*.scss' {}
@@ -1,4 +1,4 @@
1
- declare module 'icons/*.svg' {
1
+ declare module '@/icons/*.svg' {
2
2
  import { FunctionComponent, SVGAttributes } from 'react';
3
3
 
4
4
  const component: FunctionComponent<SVGAttributes<SVGElement>>;
@@ -0,0 +1,13 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly alert: string;
4
+ readonly content: string;
5
+ readonly error: string;
6
+ readonly icon: string;
7
+ readonly iconContainer: string;
8
+ readonly info: string;
9
+ readonly success: string;
10
+ readonly warning: string;
11
+ };
12
+
13
+ export default styles;
@@ -1,7 +1,10 @@
1
1
  import classNames from 'classnames';
2
2
  import { type FunctionComponent, type HTMLProps, type ReactNode, type SVGAttributes } from 'react';
3
3
 
4
- import { Check, CrossCircleFill, ExclamationTriangleFill, InfoCircleFill } from '@/icons';
4
+ import Check from '@/icons/Check.svg';
5
+ import CrossCircleFill from '@/icons/CrossCircleFill.svg';
6
+ import ExclamationTriangleFill from '@/icons/ExclamationTriangleFill.svg';
7
+ import InfoCircleFill from '@/icons/InfoCircleFill.svg';
5
8
 
6
9
  import styles from './Alert.module.scss';
7
10
 
@@ -0,0 +1,6 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly badge: string;
4
+ };
5
+
6
+ export default styles;
@@ -2,12 +2,19 @@
2
2
  @use 'styles/mixins' as *;
3
3
 
4
4
  .board {
5
+ --tile-size: var(--cell-size);
6
+ --coordinate-track-size: calc(var(--coordinate-size) - var(--border--width));
7
+
5
8
  display: grid;
9
+ grid-template-columns: var(--coordinate-track-size) repeat(var(--board-cols), var(--cell-size));
10
+ grid-template-rows: var(--coordinate-track-size) repeat(var(--board-rows), var(--cell-size));
6
11
  gap: var(--border--width);
7
12
  box-shadow: var(--box-shadow);
8
13
  background-color: white;
14
+ background-size: 100% 100%;
9
15
  border: var(--border);
10
16
  border-radius: var(--border--radius);
17
+ font-size: max(14px, calc(var(--cell-size) * 0.6));
11
18
  }
12
19
 
13
20
  .floating {
@@ -21,6 +28,8 @@
21
28
  .focus {
22
29
  @include focus-effect;
23
30
 
31
+ width: var(--cell-size);
32
+ height: var(--cell-size);
24
33
  cursor: text;
25
34
 
26
35
  &::after {
@@ -70,4 +79,5 @@
70
79
  display: flex;
71
80
  align-items: center;
72
81
  justify-content: center;
82
+ font-size: calc(0.3 * var(--cell-size));
73
83
  }
@@ -0,0 +1,17 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly board: string;
4
+ readonly coordinate: string;
5
+ readonly floating: string;
6
+ readonly focus: string;
7
+ readonly hidden: string;
8
+ readonly hide: string;
9
+ readonly icon: string;
10
+ readonly iconBackground: string;
11
+ readonly iconContainer: string;
12
+ readonly rotate: string;
13
+ readonly show: string;
14
+ readonly wave: string;
15
+ };
16
+
17
+ export default styles;
@@ -3,21 +3,22 @@
3
3
  import { FloatingPortal, type ReferenceType } from '@floating-ui/react';
4
4
  import { EMPTY_CELL } from '@scrabble-solver/constants';
5
5
  import classNames from 'classnames';
6
- import { type CSSProperties, type FocusEventHandler, type FunctionComponent, useCallback, useState } from 'react';
6
+ import { type FocusEventHandler, type FunctionComponent, useCallback, useState } from 'react';
7
7
  import useOnclickOutside from 'react-cool-onclickoutside';
8
8
  import { useDispatch } from 'react-redux';
9
9
 
10
- import { useAppLayout } from '@/app-layout';
11
- import { LOCALE_FEATURES } from '@/i18n';
12
- import { TRANSITION } from '@/parameters';
10
+ import { LOCALE_FEATURES } from '@/i18n/constants';
13
11
  import {
14
12
  boardSlice,
15
13
  cellFiltersSlice,
16
14
  selectCellFilters,
15
+ selectConfig,
16
+ selectHoveredCharacter,
17
17
  selectInputMode,
18
18
  selectLocale,
19
19
  selectShowCoordinates,
20
20
  solveSlice,
21
+ useTranslate,
21
22
  useTypedSelector,
22
23
  } from '@/state';
23
24
 
@@ -33,13 +34,15 @@ interface Props {
33
34
 
34
35
  export const Board: FunctionComponent<Props> = ({ className }) => {
35
36
  const dispatch = useDispatch();
37
+ const translate = useTranslate();
36
38
  const locale = useTypedSelector(selectLocale);
39
+ const config = useTypedSelector(selectConfig);
37
40
  const rows = useTypedSelector(selectRowsWithCandidate);
38
41
  const reachableCells = useTypedSelector(selectReachableCells);
39
42
  const inputMode = useTypedSelector(selectInputMode);
40
43
  const cellFilters = useTypedSelector(selectCellFilters);
41
44
  const showCoordinates = useTypedSelector(selectShowCoordinates);
42
- const { cellSize, coordinatesFontSize, coordinatesSize } = useAppLayout();
45
+ const hoveredCharacter = useTypedSelector(selectHoveredCharacter);
43
46
  const [
44
47
  { activeIndex, direction, inputRefs },
45
48
  { insertValue, onChange, onDirectionToggle, onFocus, onKeyDown, onPaste },
@@ -47,7 +50,6 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
47
50
  const boardStyle = useBoardStyle();
48
51
  const [hasFocus, setHasFocus] = useState(false);
49
52
  const [showInputPrompt, setShowInputPrompt] = useState(false);
50
- const [transition, setTransition] = useState<CSSProperties['transition']>(TRANSITION);
51
53
  const inputRef = inputRefs[activeIndex.y][activeIndex.x];
52
54
  const cell = rows[activeIndex.y][activeIndex.x];
53
55
  const floatingActions = useFloatingActions();
@@ -80,8 +82,6 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
80
82
 
81
83
  const handleFocus: typeof onFocus = useCallback(
82
84
  (newX, newY) => {
83
- const isFirstFocus = !hasFocus;
84
- const originalTransition = floatingActions.refs.floating.current?.style.transition || '';
85
85
  const newInputRef = inputRefs[newY][newX].current;
86
86
  const newTileElement = newInputRef?.parentElement || null;
87
87
 
@@ -89,16 +89,8 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
89
89
  onFocus(newX, newY);
90
90
  setHasFocus(true);
91
91
  setShowInputPrompt(false);
92
-
93
- if (isFirstFocus) {
94
- setTransition('none');
95
-
96
- globalThis.setTimeout(() => {
97
- setTransition(originalTransition);
98
- }, 0);
99
- }
100
92
  },
101
- [floatingActions.refs.floating, hasFocus, inputRefs, onFocus, updateFloatingReference],
93
+ [inputRefs, onFocus, updateFloatingReference],
102
94
  );
103
95
 
104
96
  const handleEnterWord = useCallback(() => {
@@ -153,16 +145,17 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
153
145
  <BoardPure
154
146
  className={className}
155
147
  cellFilters={cellFilters}
156
- cellSize={cellSize}
157
- coordinatesFontSize={coordinatesFontSize}
158
- coordinatesSize={coordinatesSize}
148
+ config={config}
159
149
  direction={LOCALE_FEATURES[locale].direction}
150
+ hoveredCharacter={hoveredCharacter}
160
151
  inputRefs={inputRefs}
152
+ locale={locale}
161
153
  reachableCells={reachableCells}
162
154
  ref={ref}
163
155
  rows={rows}
164
156
  showCoordinates={showCoordinates}
165
157
  style={boardStyle}
158
+ translate={translate}
166
159
  onBlur={handleBlur}
167
160
  onChange={onChange}
168
161
  onFocus={handleFocus}
@@ -178,14 +171,11 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
178
171
  ref={floatingFocus.refs.setFloating}
179
172
  style={{
180
173
  position: floatingFocus.strategy,
181
- top: floatingFocus.y + cellSize,
174
+ top: `calc(${floatingFocus.y ?? 0}px + var(--cell-size))`,
182
175
  left: floatingFocus.x,
183
176
  display: floatingFocus.isPositioned ? 'block' : 'none',
184
- width: cellSize,
185
- height: cellSize,
186
177
  opacity: hasFocus ? 1 : 0,
187
178
  visibility: floatingFocus.x === null || floatingFocus.y === null ? 'hidden' : 'visible',
188
- transition,
189
179
  }}
190
180
  tabIndex={0}
191
181
  />
@@ -200,7 +190,6 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
200
190
  position: floatingActions.strategy,
201
191
  top: floatingActions.y ?? 0,
202
192
  left: floatingActions.x ?? 0,
203
- transition,
204
193
  }}
205
194
  onDirectionToggle={handleToggleDirection}
206
195
  onEnterWord={handleEnterWord}
@@ -219,7 +208,6 @@ export const Board: FunctionComponent<Props> = ({ className }) => {
219
208
  position: floatingInputPrompt.strategy,
220
209
  top: floatingInputPrompt.y ?? 0,
221
210
  left: floatingInputPrompt.x ?? 0,
222
- transition,
223
211
  }}
224
212
  onDirectionToggle={handleToggleDirection}
225
213
  onSubmit={handleInsertWord}