@scrabble-solver/scrabble-solver 2.16.7 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +22 -20
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/.next/diagnostics/framework.json +1 -1
- package/.next/dynamic-css-manifest.json +8 -1
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +4 -4
- package/.next/react-loadable-manifest.json +176 -1
- package/.next/required-server-files.js +3 -2
- package/.next/required-server-files.json +3 -2
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/30.js +1 -1
- package/.next/server/chunks/309.js +1 -0
- package/.next/server/chunks/316.js +1 -0
- package/.next/server/chunks/344.js +1 -0
- package/.next/server/chunks/371.js +1 -0
- package/.next/server/chunks/392.js +1 -1
- package/.next/server/chunks/465.js +1 -0
- package/.next/server/chunks/546.js +1 -0
- package/.next/server/chunks/623.js +1 -0
- package/.next/server/chunks/624.js +1 -0
- package/.next/server/chunks/641.js +1 -0
- package/.next/server/chunks/671.js +1 -1
- package/.next/server/chunks/692.js +1 -0
- package/.next/server/chunks/705.js +1 -0
- package/.next/server/chunks/712.js +1 -1
- package/.next/server/chunks/846.js +1 -0
- package/.next/server/chunks/853.js +15 -0
- package/.next/server/chunks/886.js +1 -0
- package/.next/server/chunks/916.js +1 -0
- package/.next/server/chunks/953.js +1 -0
- package/.next/server/chunks/961.js +1 -0
- package/.next/server/chunks/968.js +1 -0
- package/.next/server/dynamic-css-manifest.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +28 -1
- package/.next/server/pages/500.html +28 -1
- package/.next/server/pages/_app.js +1 -1
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js +28 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +28 -1
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/dictionary/[locale]/[word].js +1 -1
- package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
- package/.next/server/pages/api/dictionary/[locale].js +1 -1
- package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
- package/.next/server/pages/api/solve.js +1 -1
- package/.next/server/pages/api/solve.js.nft.json +1 -1
- package/.next/server/pages/api/verify.js +1 -1
- package/.next/server/pages/api/verify.js.nft.json +1 -1
- package/.next/server/pages/api/visit.js.nft.json +1 -1
- package/.next/server/pages/index.html +28 -1
- package/.next/server/pages/index.js +30 -1
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/index.json +1 -1
- package/.next/server/pages/not-found.html +28 -1
- package/.next/server/pages/not-found.js.nft.json +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/webpack-api-runtime.js +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/FL82obwzFHRzvV6z76I-U/_buildManifest.js +1 -0
- package/.next/static/chunks/101-829ab8a8d310e7a0.js +3 -0
- package/.next/static/chunks/106.e414e88694add27f.js +1 -0
- package/.next/static/chunks/127.125d896a19061d71.js +1 -0
- package/.next/static/chunks/18.8b91e137d239e15c.js +1 -0
- package/.next/static/chunks/277.6785dfaf22fdb0b7.js +1 -0
- package/.next/static/chunks/307.67f52f13e3d60d4e.js +1 -0
- package/.next/static/chunks/341.79535ba85bf1986f.js +1 -0
- package/.next/static/chunks/363.01eed3233f92b6a4.js +1 -0
- package/.next/static/chunks/422.1559ae6756912ca5.js +1 -0
- package/.next/static/chunks/541.dcd9e8b804f88da5.js +1 -0
- package/.next/static/chunks/583.7a46807be14c377e.js +1 -0
- package/.next/static/chunks/631.98d42abad0a60af6.js +1 -0
- package/.next/static/chunks/663.d2c9ca36b26695b8.js +1 -0
- package/.next/static/chunks/711.ba7b8f900dfd40d0.js +1 -0
- package/.next/static/chunks/744.b06c9a3de4a1d877.js +1 -0
- package/.next/static/chunks/820.97b82f751ca49579.js +1 -0
- package/.next/static/chunks/865.a9b563a45848a83c.js +1 -0
- package/.next/static/chunks/912.ff8037ba9d4db5c8.js +1 -0
- package/.next/static/chunks/939.19b33a3d3c351d73.js +1 -0
- package/.next/static/chunks/990.61296e5870b91f11.js +1 -0
- package/.next/static/chunks/framework-626cbd48ac5aca57.js +1 -0
- package/.next/static/chunks/main-b92e08f3fc96dd8d.js +5 -0
- package/.next/static/chunks/pages/_app-ba5d628e81a15461.js +1 -0
- package/.next/static/chunks/pages/{_error-afeda7c5231b6c3c.js → _error-f0290a98eb3ed0ec.js} +1 -1
- package/.next/static/chunks/pages/index-5f9fa6ac3cd3d97b.js +1 -0
- package/.next/static/chunks/pages/not-found-23d61fd3ed791cad.js +1 -0
- package/.next/static/chunks/webpack-e34c3ae12275e978.js +1 -0
- package/.next/static/css/2d03f0da2c678dfc.css +1 -0
- package/.next/static/css/7b6724d2df70f48f.css +1 -0
- package/.next/static/css/abc2425d3ba607bc.css +1 -0
- package/.next/static/css/b736be3bd02b5d99.css +1 -0
- package/.next/static/css/b74cd7de82dabcdd.css +1 -0
- package/.next/static/css/c403ce739a9c0d83.css +1 -0
- package/.next/static/css/ca311e6c030663d4.css +1 -0
- package/.next/static/css/dee878eb64099d92.css +1 -0
- package/.next/static/css/fbfdce70731d0d2b.css +1 -0
- package/.next/trace +21 -21
- package/.next/trace-build +1 -1
- package/empty-module.js +2 -0
- package/next.config.js +13 -8
- package/package.json +35 -16
- package/public/llms.txt +11 -0
- package/public/robots.txt +4 -0
- package/scripts/generate-scss-types.ts +112 -0
- package/src/@types/scss.d.ts +6 -9
- package/src/@types/svg.d.ts +1 -1
- package/src/components/Alert/Alert.module.scss.d.ts +13 -0
- package/src/components/Alert/Alert.tsx +4 -1
- package/src/components/Badge/Badge.module.scss.d.ts +6 -0
- package/src/components/Board/Board.module.scss +10 -0
- package/src/components/Board/Board.module.scss.d.ts +17 -0
- package/src/components/Board/Board.tsx +14 -26
- package/src/components/Board/BoardPure.tsx +54 -49
- package/src/components/Board/components/Actions/Actions.module.scss +18 -18
- package/src/components/Board/components/Actions/Actions.module.scss.d.ts +7 -0
- package/src/components/Board/components/Actions/Actions.tsx +6 -3
- package/src/components/Board/components/Actions/lib.ts +3 -1
- package/src/components/Board/components/Cell/Cell.module.scss.d.ts +13 -0
- package/src/components/Board/components/Cell/Cell.tsx +32 -34
- package/src/components/Board/components/InputPrompt/InputPrompt.module.scss.d.ts +10 -0
- package/src/components/Board/components/InputPrompt/InputPrompt.tsx +1 -1
- package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.module.scss.d.ts +8 -0
- package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +2 -2
- package/src/components/Board/getBoardBackground.ts +175 -0
- package/src/components/Board/hooks/index.ts +0 -1
- package/src/components/Board/hooks/useBoardStyle.ts +10 -20
- package/src/components/Board/hooks/useFloatingActions.ts +3 -6
- package/src/components/Board/hooks/useGrid.ts +23 -9
- package/src/components/Board/selectors.ts +1 -1
- package/src/components/Button/Button.module.scss.d.ts +12 -0
- package/src/components/Dictionary/Dictionary.module.scss +8 -22
- package/src/components/Dictionary/Dictionary.module.scss.d.ts +14 -0
- package/src/components/Dictionary/Dictionary.tsx +1 -10
- package/src/components/DictionaryInput/DictionaryInput.module.scss.d.ts +7 -0
- package/src/components/DictionaryInput/DictionaryInput.tsx +1 -1
- package/src/components/EmptyState/EmptyState.module.scss.d.ts +7 -0
- package/src/components/EmptyState/EmptyState.tsx +1 -1
- package/src/components/IconButton/IconButton.module.scss.d.ts +8 -0
- package/src/components/Key/Key.module.scss.d.ts +6 -0
- package/src/components/Keys/Arrows/Arrows.module.scss.d.ts +11 -0
- package/src/components/Keys/Arrows/Arrows.tsx +4 -1
- package/src/components/Keys/index.tsx +1 -1
- package/src/components/Loading/Loading.module.scss.d.ts +9 -0
- package/src/components/Loading/Loading.tsx +1 -1
- package/src/components/Logo/Logo.tsx +4 -9
- package/src/components/Logo/LogoBlueprint.tsx +1 -0
- package/src/components/Modal/Modal.module.scss.d.ts +15 -0
- package/src/components/Modal/Modal.tsx +16 -3
- package/src/components/Modal/components/Section/Section.module.scss.d.ts +7 -0
- package/src/components/NavButtons/NavButtons.module.scss +20 -0
- package/src/components/NavButtons/NavButtons.module.scss.d.ts +13 -0
- package/src/components/NavButtons/NavButtons.tsx +29 -45
- package/src/components/NotFound/NotFound.module.scss.d.ts +9 -0
- package/src/components/NotFound/NotFound.tsx +1 -1
- package/src/components/PlainTiles/PlainTiles.module.scss.d.ts +11 -0
- package/src/components/PlainTiles/PlainTiles.tsx +0 -1
- package/src/components/PlainTiles/Tile.tsx +3 -4
- package/src/components/PlainTiles/lib.ts +4 -19
- package/src/components/PlainTiles/types.ts +0 -1
- package/src/components/Progress/Progress.module.scss +7 -0
- package/src/components/Progress/Progress.module.scss.d.ts +6 -0
- package/src/components/Progress/Progress.tsx +2 -11
- package/src/components/Rack/Rack.module.scss +3 -0
- package/src/components/Rack/Rack.module.scss.d.ts +10 -0
- package/src/components/Rack/Rack.tsx +8 -11
- package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss +2 -0
- package/src/components/Rack/components/InputPrompt/InputPrompt.module.scss.d.ts +7 -0
- package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +1 -13
- package/src/components/Rack/components/InputPrompt/lib.ts +1 -1
- package/src/components/Rack/components/RackTile/RackTile.module.scss.d.ts +6 -0
- package/src/components/Rack/components/RackTile/RackTile.tsx +5 -4
- package/src/components/Rack/selectors.ts +1 -1
- package/src/components/Radio/Radio.module.scss.d.ts +12 -0
- package/src/components/Results/Cell.tsx +3 -12
- package/src/components/Results/Header.tsx +9 -18
- package/src/components/Results/HeaderButton.tsx +4 -5
- package/src/components/Results/Result.tsx +4 -15
- package/src/components/Results/Results.module.scss +4 -7
- package/src/components/Results/Results.module.scss.d.ts +27 -0
- package/src/components/Results/Results.tsx +14 -5
- package/src/components/Results/SolveButton.tsx +1 -1
- package/src/components/Results/types.ts +3 -3
- package/src/components/ResultsInput/ResultsInput.module.scss.d.ts +7 -0
- package/src/components/ResultsInput/ResultsInput.tsx +1 -1
- package/src/components/Solver/Solver.module.scss +6 -5
- package/src/components/Solver/Solver.module.scss.d.ts +20 -0
- package/src/components/Solver/Solver.tsx +23 -24
- package/src/components/Solver/components/InsertButton/InsertButton.module.scss.d.ts +7 -0
- package/src/components/Solver/components/InsertButton/InsertButton.tsx +1 -1
- package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.module.scss.d.ts +18 -0
- package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +3 -1
- package/src/components/Spinner/Spinner.module.scss.d.ts +10 -0
- package/src/components/Tile/Tile.module.scss +3 -0
- package/src/components/Tile/Tile.module.scss.d.ts +19 -0
- package/src/components/Tile/Tile.tsx +5 -14
- package/src/components/Tile/TilePure.tsx +2 -12
- package/src/components/Tooltip/Tooltip.module.scss.d.ts +7 -0
- package/src/components/Tooltip/Tooltip.tsx +14 -3
- package/src/components/Tooltip/useTooltip.ts +2 -1
- package/src/hooks/useColumns.ts +4 -7
- package/src/hooks/useDeferredRender.ts +20 -0
- package/src/hooks/useDirection.ts +4 -3
- package/src/hooks/useLanguage.ts +2 -2
- package/src/hooks/useLocalStorage.ts +32 -8
- package/src/hooks/useMedia.ts +26 -26
- package/src/i18n/constants.ts +2 -15
- package/src/i18n/i18n.ts +18 -17
- package/src/i18n/languages/english.json +0 -1
- package/src/i18n/languages/french.json +0 -1
- package/src/i18n/languages/german.json +0 -1
- package/src/i18n/languages/persian.json +0 -1
- package/src/i18n/languages/polish.json +0 -1
- package/src/i18n/languages/romanian.json +0 -1
- package/src/i18n/languages/spanish.json +0 -1
- package/src/i18n/languages/turkish.json +0 -1
- package/src/i18n/localeIcons.ts +24 -0
- package/src/lib/localeTransliterate.test.ts +5 -0
- package/src/lib/localeTransliterate.ts +26 -6
- package/src/lib/waitForIdleOrFirstIntent.ts +33 -0
- package/src/modals/DictionaryModal/DictionaryModal.module.scss.d.ts +8 -0
- package/src/modals/DictionaryModal/DictionaryModal.tsx +3 -1
- package/src/modals/KeyMapModal/KeyMapModal.tsx +3 -1
- package/src/modals/KeyMapModal/components/Mapping/Mapping.module.scss.d.ts +11 -0
- package/src/modals/MenuModal/MenuModal.module.scss +5 -0
- package/src/modals/MenuModal/MenuModal.module.scss.d.ts +10 -0
- package/src/modals/MenuModal/MenuModal.tsx +16 -5
- package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss +4 -1
- package/src/modals/RemainingTilesModal/RemainingTilesModal.module.scss.d.ts +9 -0
- package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +4 -6
- package/src/modals/RemainingTilesModal/components/Character/Character.module.scss +1 -0
- package/src/modals/RemainingTilesModal/components/Character/Character.module.scss.d.ts +12 -0
- package/src/modals/RemainingTilesModal/components/Character/Character.tsx +5 -12
- package/src/modals/ResultsModal/ResultsModal.module.scss.d.ts +8 -0
- package/src/modals/ResultsModal/ResultsModal.tsx +8 -4
- package/src/modals/SettingsModal/SettingsModal.tsx +2 -2
- package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.module.scss.d.ts +7 -0
- package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -1
- package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.module.scss.d.ts +7 -0
- package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +1 -1
- package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.module.scss.d.ts +7 -0
- package/src/modals/SettingsModal/components/HighlightUnreachableCellsSetting/HighlightUnreachableCellsSetting.tsx +1 -1
- package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.module.scss.d.ts +7 -0
- package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +1 -1
- package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.module.scss.d.ts +8 -0
- package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +24 -21
- package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.module.scss.d.ts +7 -0
- package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.tsx +1 -1
- package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.module.scss.d.ts +7 -0
- package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +1 -5
- package/src/modals/WordsModal/WordsModal.module.scss.d.ts +11 -0
- package/src/modals/WordsModal/WordsModal.tsx +4 -2
- package/src/modals/preload.ts +24 -0
- package/src/pages/_app.tsx +5 -8
- package/src/pages/_document.tsx +91 -5
- package/src/pages/api/dictionary/[locale]/[word].ts +2 -2
- package/src/pages/api/dictionary/[locale]/index.ts +80 -3
- package/src/pages/api/solve.ts +3 -3
- package/src/pages/api/verify.ts +12 -3
- package/src/pages/index.module.scss +1 -0
- package/src/pages/index.module.scss.d.ts +11 -0
- package/src/pages/index.tsx +98 -38
- package/src/pages/not-found.tsx +1 -1
- package/src/parameters/index.ts +24 -93
- package/src/sdk/solve.ts +13 -7
- package/src/sdk/verify.ts +12 -6
- package/src/service-worker/appShell.test.ts +86 -0
- package/src/service-worker/appShell.ts +39 -0
- package/src/service-worker/index.ts +4 -5
- package/src/serviceWorkerManager.ts +5 -19
- package/src/solver-worker/client.test.ts +151 -0
- package/src/solver-worker/client.ts +106 -0
- package/src/solver-worker/dictionaries/constants.ts +9 -0
- package/src/solver-worker/dictionaries/getDictionary.ts +21 -0
- package/src/solver-worker/dictionaries/index.ts +2 -0
- package/src/solver-worker/dictionaries/revalidateDictionary.test.ts +199 -0
- package/src/solver-worker/dictionaries/revalidateDictionary.ts +86 -0
- package/src/solver-worker/dictionaries/revalidatedAt.ts +43 -0
- package/src/solver-worker/getGaddag.test.ts +109 -0
- package/src/solver-worker/getGaddag.ts +62 -0
- package/src/solver-worker/index.ts +1 -0
- package/src/solver-worker/index.worker.ts +124 -0
- package/src/solver-worker/messages.ts +20 -0
- package/src/state/actions.ts +1 -1
- package/src/state/app/index.ts +4 -0
- package/src/state/app/initialState.ts +6 -0
- package/src/state/app/selectors.ts +5 -0
- package/src/state/app/slice.ts +20 -0
- package/src/state/app/types.ts +4 -0
- package/src/state/board/initialState.ts +1 -2
- package/src/state/i18n/index.ts +4 -0
- package/src/state/i18n/initialState.ts +5 -0
- package/src/state/i18n/selectors.ts +3 -0
- package/src/state/i18n/slice.ts +16 -0
- package/src/state/i18n/types.ts +7 -0
- package/src/state/index.ts +3 -0
- package/src/state/lib.ts +1 -1
- package/src/state/localStorage.ts +86 -29
- package/src/state/rack/initialState.ts +1 -2
- package/src/state/rack/slice.ts +4 -1
- package/src/state/results/lib.ts +5 -5
- package/src/state/results/selectors.ts +1 -1
- package/src/state/sagas.ts +139 -13
- package/src/state/selectors.ts +1 -1
- package/src/state/settings/initialState.ts +7 -10
- package/src/state/settings/selectors.ts +7 -2
- package/src/state/settings/slice.ts +5 -2
- package/src/state/store.ts +4 -0
- package/src/state/types.ts +4 -0
- package/src/state/useTypedStore.ts +6 -0
- package/src/styles/_tokens.scss +1 -0
- package/src/styles/global.scss +9 -0
- package/src/styles/variables.module.scss +0 -21
- package/src/styles/variables.module.scss.d.ts +27 -0
- package/src/styles/variables.scss +46 -2
- package/src/types/api.ts +1 -2
- package/src/types/index.ts +1 -2
- package/tsconfig.json +4 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/.next/server/chunks/318.js +0 -3
- package/.next/server/chunks/791.js +0 -15
- package/.next/static/chunks/framework-3cf15b8041c59dd3.js +0 -1
- package/.next/static/chunks/main-852475ca502b4e49.js +0 -5
- package/.next/static/chunks/pages/_app-a5bbe02710f13d05.js +0 -7
- package/.next/static/chunks/pages/index-ec0f6aeeaf7be227.js +0 -1
- package/.next/static/chunks/pages/not-found-9e076427bad69d90.js +0 -1
- package/.next/static/chunks/webpack-1a7a166b34ed8d24.js +0 -1
- package/.next/static/css/0af35adb4bab56f0.css +0 -2
- package/.next/static/css/a78e04fe95452380.css +0 -1
- package/.next/static/vYpMmuC_yEurZGcyGVnLf/_buildManifest.js +0 -1
- package/src/app-layout/AppLayoutContext.tsx +0 -25
- package/src/app-layout/index.ts +0 -1
- package/src/app-layout/useAppLayoutValue.ts +0 -112
- package/src/components/Board/hooks/useBackgroundImage.tsx +0 -279
- package/src/components/index.ts +0 -26
- package/src/hooks/index.ts +0 -12
- package/src/hooks/useOnWindowResize.ts +0 -11
- package/src/hooks/useViewportSize.ts +0 -17
- package/src/i18n/index.ts +0 -2
- package/src/icons/Flag.svg +0 -4
- package/src/icons/Star.svg +0 -4
- package/src/icons/index.ts +0 -49
- package/src/lib/getTileSizes.ts +0 -13
- package/src/lib/index.ts +0 -24
- package/src/modals/index.ts +0 -7
- package/src/sdk/getDictionary.ts +0 -9
- package/src/service-worker/average.ts +0 -7
- package/src/service-worker/dictionaries/constants.ts +0 -5
- package/src/service-worker/dictionaries/getDictionary.ts +0 -20
- package/src/service-worker/dictionaries/index.ts +0 -2
- package/src/service-worker/dictionaries/revalidateDictionary.ts +0 -33
- package/src/service-worker/getTrie.ts +0 -24
- package/src/service-worker/routeSolveRequests.ts +0 -91
- package/src/service-worker/routeVerifyRequests.ts +0 -37
- /package/.next/static/{vYpMmuC_yEurZGcyGVnLf → FL82obwzFHRzvV6z76I-U}/_ssgManifest.js +0 -0
- /package/src/{service-worker → solver-worker}/dictionaries/expirationManager.ts +0 -0
- /package/src/{service-worker → solver-worker}/dictionaries/getDictionaryUrl.ts +0 -0
|
@@ -1,33 +1,23 @@
|
|
|
1
1
|
import { type CSSProperties, useMemo } from 'react';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { BORDER_WIDTH } from '@/parameters';
|
|
6
|
-
import { selectConfig, selectShowCoordinates, useTypedSelector } from '@/state';
|
|
3
|
+
import { LOCALE_FEATURES } from '@/i18n/constants';
|
|
4
|
+
import { selectConfig, selectLocale, useTypedSelector } from '@/state';
|
|
7
5
|
|
|
8
|
-
import {
|
|
6
|
+
import { getBoardBackground } from '../getBoardBackground';
|
|
9
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Everything here is derived from Redux state only, so the style on the server matches the client
|
|
10
|
+
*/
|
|
10
11
|
export const useBoardStyle = () => {
|
|
11
12
|
const config = useTypedSelector(selectConfig);
|
|
12
|
-
const
|
|
13
|
-
const {
|
|
14
|
-
const
|
|
15
|
-
const backgroundImage = useBackgroundImage();
|
|
16
|
-
const coordinatesSize = 0.5 * cellSize - BORDER_WIDTH;
|
|
13
|
+
const locale = useTypedSelector(selectLocale);
|
|
14
|
+
const { direction } = LOCALE_FEATURES[locale];
|
|
15
|
+
const backgroundImage = getBoardBackground({ config, direction });
|
|
17
16
|
const boardStyle = useMemo<CSSProperties>(
|
|
18
17
|
() => ({
|
|
19
18
|
backgroundImage: `url(${backgroundImage})`,
|
|
20
|
-
fontSize: tileFontSize,
|
|
21
|
-
gridTemplateColumns:
|
|
22
|
-
showCoordinates === 'hidden'
|
|
23
|
-
? `repeat(${config.boardWidth}, 1fr)`
|
|
24
|
-
: `${coordinatesSize}px repeat(${config.boardWidth}, 1fr)`,
|
|
25
|
-
gridTemplateRows:
|
|
26
|
-
showCoordinates === 'hidden'
|
|
27
|
-
? `repeat(${config.boardHeight}, 1fr)`
|
|
28
|
-
: `${coordinatesSize}px repeat(${config.boardHeight}, 1fr)`,
|
|
29
19
|
}),
|
|
30
|
-
[backgroundImage
|
|
20
|
+
[backgroundImage],
|
|
31
21
|
);
|
|
32
22
|
|
|
33
23
|
return boardStyle;
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { autoUpdate, offset, shift, useFloating } from '@floating-ui/react';
|
|
2
2
|
|
|
3
|
-
import { useAppLayout } from '@/app-layout';
|
|
4
3
|
import { BOARD_CELL_ACTIONS_OFFSET } from '@/parameters';
|
|
5
4
|
|
|
6
5
|
export const useFloatingActions = () => {
|
|
7
|
-
const { actionsWidth } = useAppLayout();
|
|
8
|
-
|
|
9
6
|
return useFloating({
|
|
10
7
|
middleware: [
|
|
11
|
-
offset({
|
|
8
|
+
offset(({ rects }) => ({
|
|
12
9
|
mainAxis: -BOARD_CELL_ACTIONS_OFFSET,
|
|
13
|
-
alignmentAxis: BOARD_CELL_ACTIONS_OFFSET -
|
|
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
|
|
18
|
+
import { useLatest } from '@/hooks/useLatest';
|
|
19
|
+
import { LOCALE_FEATURES } from '@/i18n/constants';
|
|
20
|
+
import { createKeyboardNavigation } from '@/lib/createKeyboardNavigation';
|
|
21
|
+
import { extractCharacters } from '@/lib/extractCharacters';
|
|
22
|
+
import { extractInputValue } from '@/lib/extractInputValue';
|
|
23
|
+
import { isCtrl } from '@/lib/isCtrl';
|
|
21
24
|
import { boardSlice, cellFiltersSlice, selectConfig, selectLocale, useTypedSelector } from '@/state';
|
|
22
25
|
import { type Direction, type Point } from '@/types';
|
|
23
26
|
|
|
@@ -53,6 +56,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
53
56
|
const [activeIndex, setActiveIndex] = useState<Point>({ x: 0, y: 0 });
|
|
54
57
|
const [direction, setLastDirection] = useState<Direction>('horizontal');
|
|
55
58
|
const directionRef = useLatest(direction);
|
|
59
|
+
const rowsRef = useLatest(rows);
|
|
56
60
|
|
|
57
61
|
const safeActiveIndex = useMemo(
|
|
58
62
|
() => ({
|
|
@@ -94,7 +98,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
94
98
|
(position: Point, value: string) => {
|
|
95
99
|
const characters = value ? extractCharacters(config, value).filter((character) => character !== BLANK) : [BLANK];
|
|
96
100
|
const actions: PayloadAction<unknown>[] = [];
|
|
97
|
-
let board = new Board({ rows:
|
|
101
|
+
let board = new Board({ rows: rowsRef.current.map((row) => row.map((cell) => cell.clone())) });
|
|
98
102
|
let { x, y } = position;
|
|
99
103
|
|
|
100
104
|
const scheduleMoveFocus = () => {
|
|
@@ -188,7 +192,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
188
192
|
moveFocus(Math.abs(position.x - x) + Math.abs(position.y - y));
|
|
189
193
|
actions.forEach(dispatch);
|
|
190
194
|
},
|
|
191
|
-
[config, directionRef, dispatch, height, moveFocus,
|
|
195
|
+
[config, directionRef, dispatch, height, moveFocus, rowsRef, width],
|
|
192
196
|
);
|
|
193
197
|
|
|
194
198
|
const onChange = useCallback(
|
|
@@ -209,7 +213,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
209
213
|
|
|
210
214
|
if (value === EMPTY_CELL) {
|
|
211
215
|
const { x, y } = position;
|
|
212
|
-
const cell =
|
|
216
|
+
const cell = rowsRef.current[y][x];
|
|
213
217
|
|
|
214
218
|
if (cell.hasTile()) {
|
|
215
219
|
dispatch(boardSlice.actions.toggleCellIsBlank(position));
|
|
@@ -219,7 +223,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
219
223
|
|
|
220
224
|
insertValue(position, value);
|
|
221
225
|
},
|
|
222
|
-
[dispatch, insertValue, moveFocus,
|
|
226
|
+
[dispatch, insertValue, moveFocus, rowsRef, getInputRefPosition],
|
|
223
227
|
);
|
|
224
228
|
|
|
225
229
|
const onDirectionToggle = useCallback(() => setLastDirection(toggleDirection), []);
|
|
@@ -308,7 +312,7 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
308
312
|
return;
|
|
309
313
|
}
|
|
310
314
|
|
|
311
|
-
const cell =
|
|
315
|
+
const cell = rowsRef.current[y][x];
|
|
312
316
|
|
|
313
317
|
if (isCtrl(event) && character === 'g') {
|
|
314
318
|
event.preventDefault();
|
|
@@ -347,7 +351,17 @@ export const useGrid = (rows: Cell[][]): [State, Actions] => {
|
|
|
347
351
|
dispatch(boardSlice.actions.toggleCellIsBlank(position));
|
|
348
352
|
},
|
|
349
353
|
});
|
|
350
|
-
}, [
|
|
354
|
+
}, [
|
|
355
|
+
changeActiveIndex,
|
|
356
|
+
config,
|
|
357
|
+
direction,
|
|
358
|
+
dispatch,
|
|
359
|
+
getInputRefPosition,
|
|
360
|
+
locale,
|
|
361
|
+
moveFocus,
|
|
362
|
+
onDirectionToggle,
|
|
363
|
+
rowsRef,
|
|
364
|
+
]);
|
|
351
365
|
|
|
352
366
|
const onPaste = useCallback<ClipboardEventHandler>(
|
|
353
367
|
(event) => {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Generated by scripts/generate-scss-types.ts - do not edit.
|
|
2
|
+
declare const styles: {
|
|
3
|
+
readonly button: string;
|
|
4
|
+
readonly content: string;
|
|
5
|
+
readonly default: string;
|
|
6
|
+
readonly icon: string;
|
|
7
|
+
readonly label: string;
|
|
8
|
+
readonly primary: string;
|
|
9
|
+
readonly wide: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default styles;
|
|
@@ -2,17 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
.dictionary {
|
|
4
4
|
position: relative;
|
|
5
|
-
|
|
5
|
+
min-height: 0;
|
|
6
6
|
word-break: break-word;
|
|
7
7
|
|
|
8
|
-
&.isAllowed {
|
|
9
|
-
background-color: var(--color--green--light);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
&.isNotAllowed {
|
|
13
|
-
background-color: var(--color--red--light);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
8
|
&:focus-within {
|
|
17
9
|
@include focus-effect;
|
|
18
10
|
}
|
|
@@ -21,6 +13,8 @@
|
|
|
21
13
|
.content {
|
|
22
14
|
@include scrollbars;
|
|
23
15
|
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
24
18
|
height: 100%;
|
|
25
19
|
overflow-y: auto;
|
|
26
20
|
border-radius: inherit;
|
|
@@ -31,26 +25,18 @@
|
|
|
31
25
|
}
|
|
32
26
|
|
|
33
27
|
.result {
|
|
34
|
-
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
|
|
30
|
+
&:last-child {
|
|
31
|
+
flex-grow: 1;
|
|
32
|
+
}
|
|
35
33
|
|
|
36
34
|
&.isAllowed {
|
|
37
35
|
background-color: var(--color--green--light);
|
|
38
|
-
|
|
39
|
-
& + & {
|
|
40
|
-
.content {
|
|
41
|
-
padding-top: 0;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
36
|
}
|
|
45
37
|
|
|
46
38
|
&.isNotAllowed {
|
|
47
39
|
background-color: var(--color--red--light);
|
|
48
|
-
|
|
49
|
-
& + & {
|
|
50
|
-
.content {
|
|
51
|
-
padding-top: 0;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
40
|
}
|
|
55
41
|
}
|
|
56
42
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Generated by scripts/generate-scss-types.ts - do not edit.
|
|
2
|
+
declare const styles: {
|
|
3
|
+
readonly content: string;
|
|
4
|
+
readonly definition: string;
|
|
5
|
+
readonly definitions: string;
|
|
6
|
+
readonly dictionary: string;
|
|
7
|
+
readonly isAllowed: string;
|
|
8
|
+
readonly isNotAllowed: string;
|
|
9
|
+
readonly result: string;
|
|
10
|
+
readonly resultContent: string;
|
|
11
|
+
readonly word: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default styles;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
2
|
import { type FunctionComponent } from 'react';
|
|
3
3
|
|
|
4
|
-
import { useAppLayout } from '@/app-layout';
|
|
5
4
|
import {
|
|
6
5
|
selectDictionaryError,
|
|
7
6
|
selectDictionaryIsLoading,
|
|
@@ -21,20 +20,12 @@ interface Props {
|
|
|
21
20
|
|
|
22
21
|
export const Dictionary: FunctionComponent<Props> = ({ className }) => {
|
|
23
22
|
const translate = useTranslate();
|
|
24
|
-
const { dictionaryResultsHeight } = useAppLayout();
|
|
25
23
|
const results = useTypedSelector(selectDictionaryResults);
|
|
26
24
|
const isLoading = useTypedSelector(selectDictionaryIsLoading);
|
|
27
25
|
const error = useTypedSelector(selectDictionaryError);
|
|
28
|
-
const isLastAllowed = results.at(-1)?.isAllowed;
|
|
29
26
|
|
|
30
27
|
return (
|
|
31
|
-
<div
|
|
32
|
-
className={classNames(styles.dictionary, className, {
|
|
33
|
-
[styles.isAllowed]: isLastAllowed === true,
|
|
34
|
-
[styles.isNotAllowed]: isLastAllowed === false,
|
|
35
|
-
})}
|
|
36
|
-
style={{ height: dictionaryResultsHeight }}
|
|
37
|
-
>
|
|
28
|
+
<div className={classNames(styles.dictionary, className)}>
|
|
38
29
|
<div className={styles.content}>
|
|
39
30
|
{typeof error !== 'undefined' && !isLoading && <EmptyState variant="error">{error.message}</EmptyState>}
|
|
40
31
|
|
|
@@ -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';
|
|
@@ -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,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
|
|
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,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 {
|
|
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
|
-
|
|
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
|
|
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> = ({
|
|
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}
|
|
@@ -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
|
|
5
|
-
import
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
};
|