@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/src/i18n/i18n.ts CHANGED
@@ -3,22 +3,23 @@ import { Locale } from '@scrabble-solver/types';
3
3
  import { type Translations } from '@/types';
4
4
 
5
5
  import english from './languages/english.json';
6
- import french from './languages/french.json';
7
- import german from './languages/german.json';
8
- import persian from './languages/persian.json';
9
- import polish from './languages/polish.json';
10
- import romanian from './languages/romanian.json';
11
- import spanish from './languages/spanish.json';
12
- import turkish from './languages/turkish.json';
13
6
 
14
- export const i18n: Record<Locale, Translations> = {
15
- [Locale.DE_DE]: german,
16
- [Locale.EN_GB]: english,
17
- [Locale.EN_US]: english,
18
- [Locale.ES_ES]: spanish,
19
- [Locale.FA_IR]: persian,
20
- [Locale.FR_FR]: french,
21
- [Locale.PL_PL]: polish,
22
- [Locale.RO_RO]: romanian,
23
- [Locale.TR_TR]: turkish,
7
+ /**
8
+ * English ships in the main bundle so the SSR and the pre-hydration UI
9
+ * always have complete translations.
10
+ */
11
+ export const englishTranslations: Translations = english;
12
+
13
+ const loadTranslationsPerLocale: Record<Locale, () => Promise<Translations>> = {
14
+ [Locale.DE_DE]: async () => (await import('./languages/german.json')).default,
15
+ [Locale.EN_GB]: async () => english,
16
+ [Locale.EN_US]: async () => english,
17
+ [Locale.ES_ES]: async () => (await import('./languages/spanish.json')).default,
18
+ [Locale.FA_IR]: async () => (await import('./languages/persian.json')).default,
19
+ [Locale.FR_FR]: async () => (await import('./languages/french.json')).default,
20
+ [Locale.PL_PL]: async () => (await import('./languages/polish.json')).default,
21
+ [Locale.RO_RO]: async () => (await import('./languages/romanian.json')).default,
22
+ [Locale.TR_TR]: async () => (await import('./languages/turkish.json')).default,
24
23
  };
24
+
25
+ export const loadTranslations = (locale: Locale): Promise<Translations> => loadTranslationsPerLocale[locale]();
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Never",
77
77
  "settings.showCoordinates": "Coordinates",
78
78
  "settings.showCoordinates.alternative": "Alternative",
79
- "settings.showCoordinates.hidden": "Hidden",
80
79
  "settings.showCoordinates.original": "Original",
81
80
  "words": "Created words",
82
81
  "words.invalid": "Invalid",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Jamais",
77
77
  "settings.showCoordinates": "Coordonnés",
78
78
  "settings.showCoordinates.alternative": "Alternative",
79
- "settings.showCoordinates.hidden": "Caché",
80
79
  "settings.showCoordinates.original": "Original",
81
80
  "words": "Mots créés",
82
81
  "words.invalid": "Incorrect",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Nie",
77
77
  "settings.showCoordinates": "Koordinaten",
78
78
  "settings.showCoordinates.alternative": "Alternative",
79
- "settings.showCoordinates.hidden": "Versteckt",
80
79
  "settings.showCoordinates.original": "Original",
81
80
  "words": "Gebildete Wörter",
82
81
  "words.invalid": "Falsch",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "هرگز",
77
77
  "settings.showCoordinates": "مختصات",
78
78
  "settings.showCoordinates.alternative": "بديل",
79
- "settings.showCoordinates.hidden": "مختفي",
80
79
  "settings.showCoordinates.original": "إبداعي",
81
80
  "words": "کلمات ساخته شده",
82
81
  "words.invalid": "نا معتبر",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Nigdy",
77
77
  "settings.showCoordinates": "Współrzędne",
78
78
  "settings.showCoordinates.alternative": "Alternatywne",
79
- "settings.showCoordinates.hidden": "Ukryte",
80
79
  "settings.showCoordinates.original": "Oryginalne",
81
80
  "words": "Utworzone słowa",
82
81
  "words.invalid": "Niepoprawne",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Niciodată",
77
77
  "settings.showCoordinates": "Coordonate",
78
78
  "settings.showCoordinates.alternative": "Alternativă",
79
- "settings.showCoordinates.hidden": "Ascuns",
80
79
  "settings.showCoordinates.original": "Original",
81
80
  "words": "Cuvinte create",
82
81
  "words.invalid": "Invalid",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Nunca",
77
77
  "settings.showCoordinates": "Coordenadas",
78
78
  "settings.showCoordinates.alternative": "Alternativa",
79
- "settings.showCoordinates.hidden": "Oculto",
80
79
  "settings.showCoordinates.original": "Original",
81
80
  "words": "Palabras creadas",
82
81
  "words.invalid": "Incorrecto",
@@ -76,7 +76,6 @@
76
76
  "settings.removeCellFilters.never": "Asla",
77
77
  "settings.showCoordinates": "Koordinatlar",
78
78
  "settings.showCoordinates.alternative": "Alternatif",
79
- "settings.showCoordinates.hidden": "Gizlenmiş",
80
79
  "settings.showCoordinates.original": "Orijinal",
81
80
  "words": "Oluşturulan kelimeler",
82
81
  "words.invalid": "Geçersiz",
@@ -0,0 +1,24 @@
1
+ import { Locale } from '@scrabble-solver/types';
2
+ import { type FunctionComponent, type SVGAttributes } from 'react';
3
+
4
+ import FlagDe from '@/icons/FlagDe.svg';
5
+ import FlagEs from '@/icons/FlagEs.svg';
6
+ import FlagFa from '@/icons/FlagFa.svg';
7
+ import FlagFr from '@/icons/FlagFr.svg';
8
+ import FlagGb from '@/icons/FlagGb.svg';
9
+ import FlagPl from '@/icons/FlagPl.svg';
10
+ import FlagRo from '@/icons/FlagRo.svg';
11
+ import FlagTr from '@/icons/FlagTr.svg';
12
+ import FlagUs from '@/icons/FlagUs.svg';
13
+
14
+ export const LOCALE_ICONS: Record<Locale, FunctionComponent<SVGAttributes<SVGElement>>> = {
15
+ [Locale.DE_DE]: FlagDe,
16
+ [Locale.EN_GB]: FlagGb,
17
+ [Locale.EN_US]: FlagUs,
18
+ [Locale.ES_ES]: FlagEs,
19
+ [Locale.FA_IR]: FlagFa,
20
+ [Locale.FR_FR]: FlagFr,
21
+ [Locale.PL_PL]: FlagPl,
22
+ [Locale.RO_RO]: FlagRo,
23
+ [Locale.TR_TR]: FlagTr,
24
+ };
@@ -5,9 +5,14 @@ import { localeTransliterate } from './localeTransliterate';
5
5
  describe('localeTransliterate', () => {
6
6
  it.each([
7
7
  { locale: Locale.ES_ES, word: 'bañó', expected: 'baño' },
8
+ { locale: Locale.ES_ES, word: 'pingüino', expected: 'pinguino' },
8
9
  { locale: Locale.FR_FR, word: 'très', expected: 'tres' },
10
+ { locale: Locale.FR_FR, word: 'garçon', expected: 'garcon' },
11
+ { locale: Locale.FR_FR, word: 'œuf', expected: 'oeuf' },
12
+ { locale: Locale.FR_FR, word: 'ex æquo', expected: 'ex aequo' },
9
13
  { locale: Locale.PL_PL, word: 'źdźbło', expected: 'źdźbło' },
10
14
  { locale: Locale.RO_RO, word: 'mămăligă', expected: 'mamaliga' },
15
+ { locale: Locale.RO_RO, word: 'așteaptă', expected: 'asteapta' },
11
16
  ])(`[$locale] "$word"`, ({ locale, word, expected }) => {
12
17
  expect(localeTransliterate(locale, word)).toEqual(expected);
13
18
  });
@@ -1,18 +1,38 @@
1
1
  import { Locale } from '@scrabble-solver/types';
2
- import { transliterate } from 'transliteration';
2
+
3
+ const COMBINING_MARKS = /[̀-ͯ]/g;
4
+
5
+ const NON_DECOMPOSABLE: Record<string, string> = {
6
+ Æ: 'AE',
7
+ Œ: 'OE',
8
+ æ: 'ae',
9
+ œ: 'oe',
10
+ };
3
11
 
4
12
  const transliteratePerLocale: Record<Locale, (word: string) => string> = {
5
13
  [Locale.DE_DE]: (word) => word,
6
14
  [Locale.EN_GB]: (word) => word,
7
15
  [Locale.EN_US]: (word) => word,
8
- [Locale.ES_ES]: (word) => transliterate(word, { ignore: ['ñ', 'Ñ'] }),
16
+ [Locale.ES_ES]: (word) => foldDiacritics(word, ['ñ', 'Ñ']),
9
17
  [Locale.FA_IR]: (word) => word,
10
- [Locale.FR_FR]: (word) => transliterate(word),
18
+ [Locale.FR_FR]: (word) => foldDiacritics(word),
11
19
  [Locale.PL_PL]: (word) => word,
12
- [Locale.RO_RO]: (word) => transliterate(word),
20
+ [Locale.RO_RO]: (word) => foldDiacritics(word),
13
21
  [Locale.TR_TR]: (word) => word,
14
22
  };
15
23
 
16
- export const localeTransliterate = (locale: Locale, value: string): string => {
24
+ export function localeTransliterate(locale: Locale, value: string): string {
17
25
  return transliteratePerLocale[locale](value);
18
- };
26
+ }
27
+
28
+ function foldDiacritics(word: string, ignore: readonly string[] = []): string {
29
+ return Array.from(word)
30
+ .map((character) => {
31
+ if (ignore.includes(character)) {
32
+ return character;
33
+ }
34
+
35
+ return NON_DECOMPOSABLE[character] ?? character.normalize('NFD').replace(COMBINING_MARKS, '');
36
+ })
37
+ .join('');
38
+ }
@@ -0,0 +1,44 @@
1
+ export function waitForIdleOrFirstIntent(): Promise<void> {
2
+ return new Promise((resolve) => {
3
+ const settle = onFirstIntent(resolve);
4
+ whenIdle(settle);
5
+ });
6
+ }
7
+
8
+ export function waitForFirstIntent(): Promise<void> {
9
+ return new Promise((resolve) => {
10
+ onFirstIntent(resolve);
11
+ });
12
+ }
13
+
14
+ export function waitForIdle(): Promise<void> {
15
+ return new Promise((resolve) => whenIdle(resolve));
16
+ }
17
+
18
+ function onFirstIntent(callback: () => void): () => void {
19
+ const settle = () => {
20
+ window.removeEventListener('pointerdown', settle);
21
+ window.removeEventListener('keydown', settle);
22
+ callback();
23
+ };
24
+
25
+ window.addEventListener('pointerdown', settle, { once: true });
26
+ window.addEventListener('keydown', settle, { once: true });
27
+ return settle;
28
+ }
29
+
30
+ function whenIdle(callback: () => void): void {
31
+ const requestIdle = () => {
32
+ if ('requestIdleCallback' in window) {
33
+ window.requestIdleCallback(callback, { timeout: 5000 });
34
+ } else {
35
+ setTimeout(callback, 5000);
36
+ }
37
+ };
38
+
39
+ if (document.readyState === 'complete') {
40
+ requestIdle();
41
+ } else {
42
+ window.addEventListener('load', requestIdle, { once: true });
43
+ }
44
+ }
@@ -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 dictionary: string;
5
+ readonly dictionaryInput: string;
6
+ };
7
+
8
+ export default styles;
@@ -1,6 +1,8 @@
1
1
  import { type FunctionComponent, memo } from 'react';
2
2
 
3
- import { Dictionary, DictionaryInput, Modal } from '@/components';
3
+ import { Dictionary } from '@/components/Dictionary';
4
+ import { DictionaryInput } from '@/components/DictionaryInput';
5
+ import { Modal } from '@/components/Modal';
4
6
  import { useTranslate } from '@/state';
5
7
 
6
8
  import styles from './DictionaryModal.module.scss';
@@ -1,6 +1,8 @@
1
1
  import { type FunctionComponent, memo } from 'react';
2
2
 
3
- import { Arrows, Backspace, Ctrl, Del, Enter, Key, Modal, Space } from '@/components';
3
+ import { Key } from '@/components/Key';
4
+ import { Arrows, Backspace, Ctrl, Del, Enter, Space } from '@/components/Keys';
5
+ import { Modal } from '@/components/Modal';
4
6
  import { selectConfig, useTranslate, useTypedSelector } from '@/state';
5
7
 
6
8
  import { Mapping } from './components';
@@ -0,0 +1,11 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly description: string;
4
+ readonly group: string;
5
+ readonly keys: string;
6
+ readonly mapping: string;
7
+ readonly plus: string;
8
+ readonly slash: string;
9
+ };
10
+
11
+ export default styles;
@@ -1,5 +1,10 @@
1
1
  @use 'styles/mixins' as *;
2
2
 
3
+ .modal {
4
+ // on mobile, every modal opened from the menu must cover it
5
+ z-index: calc(var(--z-index--modal) - 1);
6
+ }
7
+
3
8
  .button {
4
9
  width: 100%;
5
10
  text-transform: none;
@@ -0,0 +1,10 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly button: string;
4
+ readonly flag: string;
5
+ readonly modal: string;
6
+ readonly settings: string;
7
+ readonly settingsLabel: string;
8
+ };
9
+
10
+ export default styles;
@@ -1,8 +1,13 @@
1
1
  import { type FunctionComponent, memo } from 'react';
2
2
 
3
- import { Button, Modal } from '@/components';
4
- import { LOCALE_FEATURES } from '@/i18n';
5
- import { BookHalf, CardChecklist, Cog, Github, Sack } from '@/icons';
3
+ import { Button } from '@/components/Button';
4
+ import { Modal } from '@/components/Modal';
5
+ import { LOCALE_ICONS } from '@/i18n/localeIcons';
6
+ import BookHalf from '@/icons/BookHalf.svg';
7
+ import CardChecklist from '@/icons/CardChecklist.svg';
8
+ import Cog from '@/icons/Cog.svg';
9
+ import Github from '@/icons/Github.svg';
10
+ import Sack from '@/icons/Sack.svg';
6
11
  import { GITHUB_PROJECT_URL } from '@/parameters';
7
12
  import { selectLocale, useTranslate, useTypedSelector } from '@/state';
8
13
 
@@ -29,10 +34,16 @@ const MenuModalBase: FunctionComponent<Props> = ({
29
34
  }) => {
30
35
  const translate = useTranslate();
31
36
  const locale = useTypedSelector(selectLocale);
32
- const { Icon } = LOCALE_FEATURES[locale];
37
+ const Icon = LOCALE_ICONS[locale];
33
38
 
34
39
  return (
35
- <Modal className={className} isOpen={isOpen} title={translate('menu')} onClose={onClose}>
40
+ <Modal
41
+ className={className}
42
+ isOpen={isOpen}
43
+ modalClassName={styles.modal}
44
+ title={translate('menu')}
45
+ onClose={onClose}
46
+ >
36
47
  <Button
37
48
  aria-label={translate('remaining-tiles')}
38
49
  className={styles.button}
@@ -6,9 +6,12 @@
6
6
  }
7
7
 
8
8
  .content {
9
+ --tile-size: 50px;
10
+
9
11
  display: flex;
10
12
  flex-wrap: wrap;
11
13
  gap: var(--spacing--l);
14
+ font-size: calc(var(--tile-size) * 0.6);
12
15
  }
13
16
 
14
17
  .badge {
@@ -18,5 +21,5 @@
18
21
  .character {
19
22
  display: flex;
20
23
  flex: 0 1;
21
- max-width: 50px;
24
+ max-width: var(--tile-size);
22
25
  }
@@ -0,0 +1,9 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly badge: string;
4
+ readonly character: string;
5
+ readonly content: string;
6
+ readonly title: string;
7
+ };
8
+
9
+ export default styles;
@@ -1,9 +1,8 @@
1
1
  import { type FunctionComponent, memo } from 'react';
2
2
 
3
- import { Badge, Modal } from '@/components';
4
- import { LOCALE_FEATURES } from '@/i18n';
5
- import { getTileSizes } from '@/lib';
6
- import { REMAINING_TILES_TILE_SIZE } from '@/parameters';
3
+ import { Badge } from '@/components/Badge';
4
+ import { Modal } from '@/components/Modal';
5
+ import { LOCALE_FEATURES } from '@/i18n/constants';
7
6
  import { selectLocale, useTranslate, useTypedSelector } from '@/state';
8
7
 
9
8
  import { Character } from './components';
@@ -20,7 +19,6 @@ const RemainingTilesModalBase: FunctionComponent<Props> = ({ className, isOpen,
20
19
  const translate = useTranslate();
21
20
  const locale = useTypedSelector(selectLocale);
22
21
  const groups = useTypedSelector(selectRemainingTilesGroups);
23
- const { tileFontSize } = getTileSizes(REMAINING_TILES_TILE_SIZE);
24
22
  const { direction } = LOCALE_FEATURES[locale];
25
23
 
26
24
  return (
@@ -42,7 +40,7 @@ const RemainingTilesModalBase: FunctionComponent<Props> = ({ className, isOpen,
42
40
  </span>
43
41
  }
44
42
  >
45
- <div className={styles.content} style={{ fontSize: tileFontSize }}>
43
+ <div className={styles.content}>
46
44
  {tiles.map((tile) => {
47
45
  return (
48
46
  <div className={styles.character} key={tile.character}>
@@ -29,6 +29,7 @@
29
29
  }
30
30
 
31
31
  .remaining {
32
+ width: var(--tile-size);
32
33
  height: 6px;
33
34
  margin-top: var(--spacing--m);
34
35
  box-shadow: var(--box-shadow--raised);
@@ -0,0 +1,12 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly character: string;
4
+ readonly count: string;
5
+ readonly finished: string;
6
+ readonly overused: string;
7
+ readonly remaining: string;
8
+ readonly tile: string;
9
+ readonly unused: string;
10
+ };
11
+
12
+ export default styles;
@@ -3,9 +3,9 @@ import classNames from 'classnames';
3
3
  import { type FunctionComponent, useCallback, useEffect } from 'react';
4
4
  import { useDispatch } from 'react-redux';
5
5
 
6
- import { Progress, Tile } from '@/components';
7
- import { LOCALE_FEATURES } from '@/i18n';
8
- import { REMAINING_TILES_TILE_SIZE } from '@/parameters';
6
+ import { Progress } from '@/components/Progress';
7
+ import { Tile } from '@/components/Tile';
8
+ import { LOCALE_FEATURES } from '@/i18n/constants';
9
9
  import {
10
10
  hoveredTileSlice,
11
11
  selectCharacterPoints,
@@ -75,19 +75,12 @@ export const Character: FunctionComponent<Props> = ({ tile }) => {
75
75
  highlighted={isHovered}
76
76
  isBlank={character === BLANK}
77
77
  isValid={remainingCount >= 0}
78
+ locale={locale}
78
79
  points={points}
79
80
  raised
80
- size={REMAINING_TILES_TILE_SIZE}
81
81
  />
82
82
 
83
- <Progress
84
- className={styles.remaining}
85
- max={count}
86
- style={{
87
- width: REMAINING_TILES_TILE_SIZE,
88
- }}
89
- value={remainingCount}
90
- />
83
+ <Progress className={styles.remaining} max={count} value={remainingCount} />
91
84
 
92
85
  <div className={styles.count}>
93
86
  {current.toLocaleString(locale)} / {total.toLocaleString(locale)}
@@ -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 dictionary: string;
5
+ readonly results: string;
6
+ };
7
+
8
+ export default styles;
@@ -2,9 +2,13 @@ import { type Result } from '@scrabble-solver/types';
2
2
  import { type FunctionComponent, memo, useEffect, useMemo } from 'react';
3
3
  import { useDispatch } from 'react-redux';
4
4
 
5
- import { useAppLayout } from '@/app-layout';
6
- import { Button, Dictionary, Modal, Results } from '@/components';
7
- import { Check, EyeFill } from '@/icons';
5
+ import { Button } from '@/components/Button';
6
+ import { Dictionary } from '@/components/Dictionary';
7
+ import { Modal } from '@/components/Modal';
8
+ import { Results } from '@/components/Results';
9
+ import { useMediaQuery } from '@/hooks/useMediaQuery';
10
+ import Check from '@/icons/Check.svg';
11
+ import EyeFill from '@/icons/EyeFill.svg';
8
12
  import { resultsSlice, selectProcessedResults, selectResultCandidate, useTranslate, useTypedSelector } from '@/state';
9
13
 
10
14
  import styles from './ResultsModal.module.scss';
@@ -18,7 +22,7 @@ interface Props {
18
22
  const ResultsModalBase: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
19
23
  const dispatch = useDispatch();
20
24
  const translate = useTranslate();
21
- const { showResultsInModal } = useAppLayout();
25
+ const showResultsInModal = useMediaQuery('<l');
22
26
  const results = useTypedSelector(selectProcessedResults);
23
27
  const resultCandidate = useTypedSelector(selectResultCandidate);
24
28
  const index = results ? results.findIndex((result) => result.id === resultCandidate?.id) : -1;
@@ -1,7 +1,7 @@
1
1
  import { type FunctionComponent, memo } from 'react';
2
2
 
3
- import { Modal } from '@/components';
4
- import { useIsTouchDevice } from '@/hooks';
3
+ import { Modal } from '@/components/Modal';
4
+ import { useIsTouchDevice } from '@/hooks/useIsTouchDevice';
5
5
  import { useTranslate } from '@/state';
6
6
 
7
7
  import {
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly label: string;
4
+ readonly option: string;
5
+ };
6
+
7
+ export default styles;
@@ -1,7 +1,7 @@
1
1
  import { type ChangeEvent, type FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
- import { Radio } from '@/components';
4
+ import { Radio } from '@/components/Radio';
5
5
  import { selectAutoGroupTiles, settingsSlice, useTranslate, useTypedSelector } from '@/state';
6
6
 
7
7
  import styles from './AutoGroupTilesSetting.module.scss';
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly label: string;
4
+ readonly option: string;
5
+ };
6
+
7
+ export default styles;
@@ -2,7 +2,7 @@ import { isGame } from '@scrabble-solver/types';
2
2
  import { type ChangeEvent, type FunctionComponent, useMemo } from 'react';
3
3
  import { useDispatch } from 'react-redux';
4
4
 
5
- import { Radio } from '@/components';
5
+ import { Radio } from '@/components/Radio';
6
6
  import { selectGame, selectLocale, settingsSlice, useTypedSelector } from '@/state';
7
7
 
8
8
  import styles from './ConfigSetting.module.scss';
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly label: string;
4
+ readonly option: string;
5
+ };
6
+
7
+ export default styles;
@@ -1,7 +1,7 @@
1
1
  import { type ChangeEvent, type FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
- import { Radio } from '@/components';
4
+ import { Radio } from '@/components/Radio';
5
5
  import { selectHighlightUnreachableCells, settingsSlice, useTranslate, useTypedSelector } from '@/state';
6
6
 
7
7
  import styles from './HighlightUnreachableCellsSetting.module.scss';
@@ -0,0 +1,7 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly label: string;
4
+ readonly option: string;
5
+ };
6
+
7
+ export default styles;
@@ -1,7 +1,7 @@
1
1
  import { type ChangeEvent, type FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
- import { Radio } from '@/components';
4
+ import { Radio } from '@/components/Radio';
5
5
  import { selectInputMode, settingsSlice, useTranslate, useTypedSelector } from '@/state';
6
6
 
7
7
  import styles from './InputModeSetting.module.scss';
@@ -0,0 +1,8 @@
1
+ // Generated by scripts/generate-scss-types.ts - do not edit.
2
+ declare const styles: {
3
+ readonly flag: string;
4
+ readonly label: string;
5
+ readonly option: string;
6
+ };
7
+
8
+ export default styles;