scrabble-solver 2.11.0 → 2.11.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 (107) hide show
  1. package/lerna.json +1 -1
  2. package/package.json +1 -1
  3. package/packages/configs/package.json +3 -3
  4. package/packages/constants/package.json +1 -1
  5. package/packages/dictionaries/package-lock.json +2 -2
  6. package/packages/dictionaries/package.json +4 -4
  7. package/packages/logger/package-lock.json +2 -2
  8. package/packages/logger/package.json +1 -1
  9. package/packages/scrabble-solver/.next/BUILD_ID +1 -1
  10. package/packages/scrabble-solver/.next/build-manifest.json +7 -7
  11. package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
  12. package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
  13. package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +1 -1
  14. package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
  15. package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
  16. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/0.pack +0 -0
  17. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/index.pack +0 -0
  18. package/packages/scrabble-solver/.next/cache/webpack/server-production/0.pack +0 -0
  19. package/packages/scrabble-solver/.next/cache/webpack/server-production/index.pack +0 -0
  20. package/packages/scrabble-solver/.next/next-server.js.nft.json +1 -1
  21. package/packages/scrabble-solver/.next/prerender-manifest.json +1 -1
  22. package/packages/scrabble-solver/.next/routes-manifest.json +1 -1
  23. package/packages/scrabble-solver/.next/server/chunks/277.js +341 -459
  24. package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
  25. package/packages/scrabble-solver/.next/server/pages/404.html +2 -2
  26. package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
  27. package/packages/scrabble-solver/.next/server/pages/500.html +1 -1
  28. package/packages/scrabble-solver/.next/server/pages/_app.js +0 -24
  29. package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
  30. package/packages/scrabble-solver/.next/server/pages/_document.js.nft.json +1 -1
  31. package/packages/scrabble-solver/.next/server/pages/api/solve.js +0 -1
  32. package/packages/scrabble-solver/.next/server/pages/index.html +1 -1
  33. package/packages/scrabble-solver/.next/server/pages/index.js +4 -52
  34. package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
  35. package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
  36. package/packages/scrabble-solver/.next/static/chunks/pages/{404-e0f30450e9920dc3.js → 404-448ba28510855455.js} +1 -1
  37. package/packages/scrabble-solver/.next/static/chunks/pages/_app-270526803bc274eb.js +28 -0
  38. package/packages/scrabble-solver/.next/static/chunks/pages/index-c6e7754ccf3532df.js +1 -0
  39. package/packages/scrabble-solver/.next/static/css/ad39b36eab07e613.css +1 -0
  40. package/packages/scrabble-solver/.next/static/css/e5803e581e4c0451.css +2 -0
  41. package/packages/scrabble-solver/.next/static/esK8DG-6aS5V7QFRtR3YE/_buildManifest.js +1 -0
  42. package/packages/scrabble-solver/.next/trace +53 -55
  43. package/packages/scrabble-solver/package-lock.json +2 -79
  44. package/packages/scrabble-solver/package.json +8 -13
  45. package/packages/scrabble-solver/src/components/{Solver/components/EmptyState/EmptyState.module.scss → Alert/Alert.module.scss} +11 -7
  46. package/packages/scrabble-solver/src/components/{Solver/components/EmptyState/EmptyState.tsx → Alert/Alert.tsx} +8 -6
  47. package/packages/scrabble-solver/src/components/Alert/index.ts +1 -0
  48. package/packages/scrabble-solver/src/components/Board/Board.module.scss +55 -0
  49. package/packages/scrabble-solver/src/components/Board/BoardPure.tsx +4 -0
  50. package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.module.scss +41 -0
  51. package/packages/scrabble-solver/src/components/Board/components/Cell/Cell.tsx +12 -0
  52. package/packages/scrabble-solver/src/components/Board/components/Cell/CellPure.tsx +12 -0
  53. package/packages/scrabble-solver/src/components/Board/hooks/useGrid.ts +8 -24
  54. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.module.scss +4 -0
  55. package/packages/scrabble-solver/src/components/DictionaryInput/DictionaryInput.module.scss +1 -0
  56. package/packages/scrabble-solver/src/components/EmptyState/EmptyState.module.scss +2 -1
  57. package/packages/scrabble-solver/src/components/EmptyState/EmptyState.tsx +1 -2
  58. package/packages/scrabble-solver/src/components/Loading/Loading.module.scss +1 -1
  59. package/packages/scrabble-solver/src/components/Logo/Logo.tsx +5 -0
  60. package/packages/scrabble-solver/src/components/Modal/Modal.module.scss +2 -0
  61. package/packages/scrabble-solver/src/components/PlainTiles/PlainTiles.module.scss +1 -1
  62. package/packages/scrabble-solver/src/components/PlainTiles/Tile.tsx +3 -3
  63. package/packages/scrabble-solver/src/components/Rack/Rack.module.scss +25 -0
  64. package/packages/scrabble-solver/src/components/Rack/Rack.tsx +5 -4
  65. package/packages/scrabble-solver/src/components/Rack/RackTile.tsx +6 -13
  66. package/packages/scrabble-solver/src/components/Results/Results.module.scss +28 -0
  67. package/packages/scrabble-solver/src/components/ResultsInput/ResultsInput.module.scss +1 -0
  68. package/packages/scrabble-solver/src/components/Solver/Solver.module.scss +5 -4
  69. package/packages/scrabble-solver/src/components/Solver/Solver.tsx +8 -7
  70. package/packages/scrabble-solver/src/components/Solver/components/index.ts +0 -1
  71. package/packages/scrabble-solver/src/components/Tile/Tile.module.scss +14 -2
  72. package/packages/scrabble-solver/src/components/Tooltip/Tooltip.module.scss +1 -72
  73. package/packages/scrabble-solver/src/components/Tooltip/useTooltip.tsx +25 -35
  74. package/packages/scrabble-solver/src/components/index.ts +1 -0
  75. package/packages/scrabble-solver/src/hooks/index.ts +0 -1
  76. package/packages/scrabble-solver/src/lib/index.ts +0 -1
  77. package/packages/scrabble-solver/src/modals/DictionaryModal/DictionaryModal.module.scss +6 -1
  78. package/packages/scrabble-solver/src/modals/KeyMapModal/KeyMapModal.tsx +5 -21
  79. package/packages/scrabble-solver/src/modals/KeyMapModal/components/Mapping/Mapping.module.scss +4 -0
  80. package/packages/scrabble-solver/src/modals/RemainingTilesModal/components/Character/Character.module.scss +1 -0
  81. package/packages/scrabble-solver/src/modals/ResultsModal/ResultsModal.module.scss +1 -0
  82. package/packages/scrabble-solver/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.module.scss +2 -0
  83. package/packages/scrabble-solver/src/modals/WordsModal/WordsModal.module.scss +8 -1
  84. package/packages/scrabble-solver/src/state/createAppStore.ts +26 -10
  85. package/packages/scrabble-solver/src/state/types.ts +20 -2
  86. package/packages/scrabble-solver/src/styles/mixins.scss +22 -0
  87. package/packages/scrabble-solver/src/styles/variables.scss +16 -1
  88. package/packages/solver/package-lock.json +2 -2
  89. package/packages/solver/package.json +5 -5
  90. package/packages/types/build/Bonus.d.ts +2 -1
  91. package/packages/types/package.json +2 -2
  92. package/packages/types/src/Bonus.ts +3 -1
  93. package/packages/word-definitions/package-lock.json +2 -2
  94. package/packages/word-definitions/package.json +2 -2
  95. package/packages/word-lists/package-lock.json +2 -2
  96. package/packages/word-lists/package.json +2 -2
  97. package/packages/scrabble-solver/.next/static/45ye7793DY705HOcuK9lJ/_buildManifest.js +0 -1
  98. package/packages/scrabble-solver/.next/static/chunks/pages/_app-d7acee5e526752d9.js +0 -28
  99. package/packages/scrabble-solver/.next/static/chunks/pages/index-35d2c1c79a201ae2.js +0 -1
  100. package/packages/scrabble-solver/.next/static/css/a48caa6f57de6e98.css +0 -1
  101. package/packages/scrabble-solver/.next/static/css/c49bbe944ddd1b39.css +0 -2
  102. package/packages/scrabble-solver/src/components/Solver/components/EmptyState/index.ts +0 -1
  103. package/packages/scrabble-solver/src/components/Tooltip/constants.ts +0 -28
  104. package/packages/scrabble-solver/src/hooks/useUniqueId.ts +0 -9
  105. package/packages/scrabble-solver/src/lib/isCtrl.ts +0 -7
  106. package/packages/scrabble-solver/src/state/rootReducer.ts +0 -25
  107. /package/packages/scrabble-solver/.next/static/{45ye7793DY705HOcuK9lJ → esK8DG-6aS5V7QFRtR3YE}/_ssgManifest.js +0 -0
@@ -1,17 +1,16 @@
1
1
  {
2
2
  "name": "@scrabble-solver/scrabble-solver",
3
- "version": "2.11.0",
3
+ "version": "2.11.1",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/scrabble-solver",
9
- "version": "2.11.0",
9
+ "version": "2.11.1",
10
10
  "license": "CC BY-NC-ND 4.0",
11
11
  "dependencies": {
12
12
  "@floating-ui/react": "^0.20.1",
13
13
  "@kamilmielnik/trie": "^2.0.1",
14
- "@popperjs/core": "^2.11.6",
15
14
  "@reduxjs/toolkit": "^1.9.3",
16
15
  "classnames": "^2.3.2",
17
16
  "include-media": "^2.0.0",
@@ -21,15 +20,12 @@
21
20
  "react": "^18.2.0",
22
21
  "react-dom": "^18.2.0",
23
22
  "react-modal": "^3.16.1",
24
- "react-popper": "^2.3.0",
25
23
  "react-portal": "^4.2.2",
26
24
  "react-redux": "^8.0.5",
27
25
  "react-use": "^17.4.0",
28
26
  "react-window": "^1.8.8",
29
- "redux": "^4.2.1",
30
27
  "redux-saga": "^1.2.2",
31
28
  "store2": "^2.14.2",
32
- "uuid": "^9.0.0",
33
29
  "workbox-expiration": "^6.5.4",
34
30
  "workbox-precaching": "^6.5.4",
35
31
  "workbox-routing": "^6.5.4",
@@ -46,7 +42,6 @@
46
42
  "@types/react-window": "^1.8.5",
47
43
  "@types/redux": "^3.6.31",
48
44
  "@types/redux-saga": "^0.10.5",
49
- "@types/uuid": "^9.0.1",
50
45
  "env-cmd": "^10.1.0",
51
46
  "sass": "^1.59.2",
52
47
  "workbox-webpack-plugin": "^6.5.4"
@@ -2143,15 +2138,6 @@
2143
2138
  "node": ">= 10"
2144
2139
  }
2145
2140
  },
2146
- "node_modules/@popperjs/core": {
2147
- "version": "2.11.6",
2148
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
2149
- "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
2150
- "funding": {
2151
- "type": "opencollective",
2152
- "url": "https://opencollective.com/popperjs"
2153
- }
2154
- },
2155
2141
  "node_modules/@redux-saga/core": {
2156
2142
  "version": "1.2.2",
2157
2143
  "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.2.tgz",
@@ -2766,12 +2752,6 @@
2766
2752
  "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
2767
2753
  "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
2768
2754
  },
2769
- "node_modules/@types/uuid": {
2770
- "version": "9.0.1",
2771
- "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz",
2772
- "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==",
2773
- "dev": true
2774
- },
2775
2755
  "node_modules/@webassemblyjs/ast": {
2776
2756
  "version": "1.11.1",
2777
2757
  "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -5253,11 +5233,6 @@
5253
5233
  "react": "^18.2.0"
5254
5234
  }
5255
5235
  },
5256
- "node_modules/react-fast-compare": {
5257
- "version": "3.2.0",
5258
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
5259
- "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
5260
- },
5261
5236
  "node_modules/react-is": {
5262
5237
  "version": "16.13.1",
5263
5238
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -5286,20 +5261,6 @@
5286
5261
  "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18"
5287
5262
  }
5288
5263
  },
5289
- "node_modules/react-popper": {
5290
- "version": "2.3.0",
5291
- "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
5292
- "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==",
5293
- "dependencies": {
5294
- "react-fast-compare": "^3.0.1",
5295
- "warning": "^4.0.2"
5296
- },
5297
- "peerDependencies": {
5298
- "@popperjs/core": "^2.0.0",
5299
- "react": "^16.8.0 || ^17 || ^18",
5300
- "react-dom": "^16.8.0 || ^17 || ^18"
5301
- }
5302
- },
5303
5264
  "node_modules/react-portal": {
5304
5265
  "version": "4.2.2",
5305
5266
  "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.2.tgz",
@@ -6384,14 +6345,6 @@
6384
6345
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
6385
6346
  }
6386
6347
  },
6387
- "node_modules/uuid": {
6388
- "version": "9.0.0",
6389
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
6390
- "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
6391
- "bin": {
6392
- "uuid": "dist/bin/uuid"
6393
- }
6394
- },
6395
6348
  "node_modules/warning": {
6396
6349
  "version": "4.0.3",
6397
6350
  "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
@@ -8230,11 +8183,6 @@
8230
8183
  "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==",
8231
8184
  "optional": true
8232
8185
  },
8233
- "@popperjs/core": {
8234
- "version": "2.11.6",
8235
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
8236
- "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
8237
- },
8238
8186
  "@redux-saga/core": {
8239
8187
  "version": "1.2.2",
8240
8188
  "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.2.tgz",
@@ -8679,12 +8627,6 @@
8679
8627
  "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
8680
8628
  "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
8681
8629
  },
8682
- "@types/uuid": {
8683
- "version": "9.0.1",
8684
- "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz",
8685
- "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==",
8686
- "dev": true
8687
- },
8688
8630
  "@webassemblyjs/ast": {
8689
8631
  "version": "1.11.1",
8690
8632
  "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -10552,11 +10494,6 @@
10552
10494
  "scheduler": "^0.23.0"
10553
10495
  }
10554
10496
  },
10555
- "react-fast-compare": {
10556
- "version": "3.2.0",
10557
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
10558
- "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
10559
- },
10560
10497
  "react-is": {
10561
10498
  "version": "16.13.1",
10562
10499
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -10578,15 +10515,6 @@
10578
10515
  "warning": "^4.0.3"
10579
10516
  }
10580
10517
  },
10581
- "react-popper": {
10582
- "version": "2.3.0",
10583
- "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
10584
- "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==",
10585
- "requires": {
10586
- "react-fast-compare": "^3.0.1",
10587
- "warning": "^4.0.2"
10588
- }
10589
- },
10590
10518
  "react-portal": {
10591
10519
  "version": "4.2.2",
10592
10520
  "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.2.tgz",
@@ -11377,11 +11305,6 @@
11377
11305
  "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
11378
11306
  "requires": {}
11379
11307
  },
11380
- "uuid": {
11381
- "version": "9.0.0",
11382
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
11383
- "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
11384
- },
11385
11308
  "warning": {
11386
11309
  "version": "4.0.3",
11387
11310
  "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/scrabble-solver",
3
- "version": "2.11.0",
3
+ "version": "2.11.1",
4
4
  "description": "Scrabble Solver 2 - App",
5
5
  "engines": {
6
6
  "node": ">=16"
@@ -30,15 +30,14 @@
30
30
  "dependencies": {
31
31
  "@floating-ui/react": "^0.20.1",
32
32
  "@kamilmielnik/trie": "^2.0.1",
33
- "@popperjs/core": "^2.11.6",
34
33
  "@reduxjs/toolkit": "^1.9.3",
35
- "@scrabble-solver/configs": "^2.11.0",
36
- "@scrabble-solver/constants": "^2.11.0",
37
- "@scrabble-solver/dictionaries": "^2.11.0",
38
- "@scrabble-solver/logger": "^2.11.0",
39
- "@scrabble-solver/solver": "^2.11.0",
40
- "@scrabble-solver/types": "^2.11.0",
41
- "@scrabble-solver/word-definitions": "^2.11.0",
34
+ "@scrabble-solver/configs": "^2.11.1",
35
+ "@scrabble-solver/constants": "^2.11.1",
36
+ "@scrabble-solver/dictionaries": "^2.11.1",
37
+ "@scrabble-solver/logger": "^2.11.1",
38
+ "@scrabble-solver/solver": "^2.11.1",
39
+ "@scrabble-solver/types": "^2.11.1",
40
+ "@scrabble-solver/word-definitions": "^2.11.1",
42
41
  "classnames": "^2.3.2",
43
42
  "include-media": "^2.0.0",
44
43
  "include-media-query-builder": "^1.1.0",
@@ -47,15 +46,12 @@
47
46
  "react": "^18.2.0",
48
47
  "react-dom": "^18.2.0",
49
48
  "react-modal": "^3.16.1",
50
- "react-popper": "^2.3.0",
51
49
  "react-portal": "^4.2.2",
52
50
  "react-redux": "^8.0.5",
53
51
  "react-use": "^17.4.0",
54
52
  "react-window": "^1.8.8",
55
- "redux": "^4.2.1",
56
53
  "redux-saga": "^1.2.2",
57
54
  "store2": "^2.14.2",
58
- "uuid": "^9.0.0",
59
55
  "workbox-expiration": "^6.5.4",
60
56
  "workbox-precaching": "^6.5.4",
61
57
  "workbox-routing": "^6.5.4",
@@ -72,7 +68,6 @@
72
68
  "@types/react-window": "^1.8.5",
73
69
  "@types/redux": "^3.6.31",
74
70
  "@types/redux-saga": "^0.10.5",
75
- "@types/uuid": "^9.0.1",
76
71
  "env-cmd": "^10.1.0",
77
72
  "sass": "^1.59.2",
78
73
  "workbox-webpack-plugin": "^6.5.4"
@@ -1,4 +1,4 @@
1
- .emptyState {
1
+ .alert {
2
2
  display: flex;
3
3
  min-width: 0;
4
4
  width: 100%;
@@ -11,7 +11,6 @@
11
11
  .iconContainer {
12
12
  flex: 0 0 auto;
13
13
  display: flex;
14
- align-items: center;
15
14
  justify-content: center;
16
15
  padding: var(--spacing--m);
17
16
  color: var(--color--foreground--secondary);
@@ -33,15 +32,20 @@
33
32
  color: var(--color--error);
34
33
  }
35
34
 
36
- .warning & {
37
- background-color: var(--color--yellow--light);
38
- color: var(--color--warning);
39
- }
40
-
41
35
  .info & {
42
36
  background-color: var(--color--blue--light);
43
37
  color: var(--color--info);
44
38
  }
39
+
40
+ .success & {
41
+ background-color: var(--color--green--light);
42
+ color: var(--color--success);
43
+ }
44
+
45
+ .warning & {
46
+ background-color: var(--color--yellow--light);
47
+ color: var(--color--warning);
48
+ }
45
49
  }
46
50
 
47
51
  .icon {
@@ -1,30 +1,32 @@
1
1
  import classNames from 'classnames';
2
2
  import { FunctionComponent, HTMLProps, ReactNode, SVGAttributes } from 'react';
3
3
 
4
- import { CrossCircleFill, ExclamationTriangleFill, InfoCircleFill } from 'icons';
4
+ import { Check, CrossCircleFill, ExclamationTriangleFill, InfoCircleFill } from 'icons';
5
5
 
6
- import styles from './EmptyState.module.scss';
6
+ import styles from './Alert.module.scss';
7
7
 
8
8
  interface Props extends HTMLProps<HTMLDivElement> {
9
9
  children: ReactNode;
10
10
  className?: string;
11
- variant: 'error' | 'info' | 'warning';
11
+ variant: 'error' | 'info' | 'success' | 'warning';
12
12
  }
13
13
 
14
14
  const ICON_PER_TYPE: Record<Props['variant'], FunctionComponent<SVGAttributes<SVGElement>>> = {
15
15
  error: CrossCircleFill,
16
16
  info: InfoCircleFill,
17
+ success: Check,
17
18
  warning: ExclamationTriangleFill,
18
19
  };
19
20
 
20
- const EmptyState: FunctionComponent<Props> = ({ children, className, variant, ...props }) => {
21
+ const Alert: FunctionComponent<Props> = ({ children, className, variant, ...props }) => {
21
22
  const Icon = ICON_PER_TYPE[variant];
22
23
 
23
24
  return (
24
25
  <div
25
- className={classNames(styles.emptyState, className, {
26
+ className={classNames(styles.alert, className, {
26
27
  [styles.error]: variant === 'error',
27
28
  [styles.info]: variant === 'info',
29
+ [styles.success]: variant === 'success',
28
30
  [styles.warning]: variant === 'warning',
29
31
  })}
30
32
  {...props}
@@ -38,4 +40,4 @@ const EmptyState: FunctionComponent<Props> = ({ children, className, variant, ..
38
40
  );
39
41
  };
40
42
 
41
- export default EmptyState;
43
+ export default Alert;
@@ -0,0 +1 @@
1
+ export { default } from './Alert';
@@ -4,10 +4,65 @@
4
4
  display: table;
5
5
  box-shadow: var(--box-shadow);
6
6
  border: var(--border);
7
+ border-radius: var(--border--radius);
7
8
  }
8
9
 
9
10
  .row {
10
11
  display: table-row;
12
+
13
+ &:first-child {
14
+ border-top-left-radius: var(--border--radius);
15
+ border-top-right-radius: var(--border--radius);
16
+
17
+ .cell {
18
+ &:first-child {
19
+ [dir='ltr'] & {
20
+ border-top-left-radius: var(--border--radius);
21
+ }
22
+
23
+ [dir='rtl'] & {
24
+ border-top-right-radius: var(--border--radius);
25
+ }
26
+ }
27
+
28
+ &:last-child {
29
+ [dir='ltr'] & {
30
+ border-top-right-radius: var(--border--radius);
31
+ }
32
+
33
+ [dir='rtl'] & {
34
+ border-top-left-radius: var(--border--radius);
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ &:last-child {
41
+ border-bottom-left-radius: var(--border--radius);
42
+ border-bottom-right-radius: var(--border--radius);
43
+
44
+ .cell {
45
+ &:first-child {
46
+ [dir='ltr'] & {
47
+ border-bottom-left-radius: var(--border--radius);
48
+ }
49
+
50
+ [dir='rtl'] & {
51
+ border-bottom-right-radius: var(--border--radius);
52
+ }
53
+ }
54
+
55
+ &:last-child {
56
+ [dir='ltr'] & {
57
+ border-bottom-right-radius: var(--border--radius);
58
+ }
59
+
60
+ [dir='rtl'] & {
61
+ border-bottom-left-radius: var(--border--radius);
62
+ }
63
+ }
64
+ }
65
+ }
11
66
  }
12
67
 
13
68
  .actions {
@@ -45,6 +45,10 @@ const BoardPure: FunctionComponent<Props> = ({
45
45
  <Cell
46
46
  className={styles.cell}
47
47
  cell={cell}
48
+ cellBottom={y < rows.length - 1 ? rows[y + 1][x] : undefined}
49
+ cellLeft={x > 0 ? rows[y][x - 1] : undefined}
50
+ cellRight={x < rows.length - 1 ? rows[y][x + 1] : undefined}
51
+ cellTop={y > 0 ? rows[y - 1][x] : undefined}
48
52
  inputRef={inputRefs[y][x]}
49
53
  isBottom={y === rows.length - 1}
50
54
  isCenter={center.x === x && center.y === y}
@@ -125,6 +125,47 @@
125
125
  }
126
126
  }
127
127
 
128
+ .tile {
129
+ .sharpTopLeft & {
130
+ [dir='ltr'] & {
131
+ border-top-left-radius: 0;
132
+ }
133
+
134
+ [dir='rtl'] & {
135
+ border-top-right-radius: 0;
136
+ }
137
+ }
138
+
139
+ .sharpTopRight & {
140
+ [dir='ltr'] & {
141
+ border-top-right-radius: 0;
142
+ }
143
+
144
+ [dir='rtl'] & {
145
+ border-top-left-radius: 0;
146
+ }
147
+ }
148
+
149
+ .sharpBottomLeft & {
150
+ [dir='ltr'] & {
151
+ border-bottom-left-radius: 0;
152
+ }
153
+
154
+ [dir='rtl'] & {
155
+ border-bottom-right-radius: 0;
156
+ }
157
+ }
158
+
159
+ .sharpBottomRight & {
160
+ [dir='ltr'] & {
161
+ border-bottom-right-radius: 0;
162
+ }
163
+
164
+ [dir='rtl'] & {
165
+ border-bottom-left-radius: 0;
166
+ }
167
+ }
168
+ }
128
169
  .icon {
129
170
  $size: 40%;
130
171
 
@@ -17,6 +17,10 @@ import CellPure from './CellPure';
17
17
 
18
18
  interface Props {
19
19
  cell: CellModel;
20
+ cellBottom?: CellModel;
21
+ cellLeft?: CellModel;
22
+ cellRight?: CellModel;
23
+ cellTop?: CellModel;
20
24
  className?: string;
21
25
  inputRef: RefObject<HTMLInputElement>;
22
26
  isBottom: boolean;
@@ -29,6 +33,10 @@ interface Props {
29
33
 
30
34
  const Cell: FunctionComponent<Props> = ({
31
35
  cell,
36
+ cellBottom,
37
+ cellLeft,
38
+ cellRight,
39
+ cellTop,
32
40
  className,
33
41
  inputRef,
34
42
  isBottom,
@@ -59,6 +67,10 @@ const Cell: FunctionComponent<Props> = ({
59
67
  })}
60
68
  bonus={bonus}
61
69
  cell={cell}
70
+ cellBottom={cellBottom}
71
+ cellLeft={cellLeft}
72
+ cellRight={cellRight}
73
+ cellTop={cellTop}
62
74
  className={className}
63
75
  inputRef={inputRef}
64
76
  isBottom={isBottom}
@@ -13,6 +13,10 @@ interface Props {
13
13
  'aria-label': string;
14
14
  bonus: Bonus | undefined;
15
15
  cell: Cell;
16
+ cellBottom?: Cell;
17
+ cellLeft?: Cell;
18
+ cellRight?: Cell;
19
+ cellTop?: Cell;
16
20
  className?: string;
17
21
  inputRef: RefObject<HTMLInputElement>;
18
22
  isBottom: boolean;
@@ -33,6 +37,10 @@ const CellPure: FunctionComponent<Props> = ({
33
37
  'aria-label': ariaLabel,
34
38
  bonus,
35
39
  cell,
40
+ cellBottom,
41
+ cellLeft,
42
+ cellRight,
43
+ cellTop,
36
44
  className,
37
45
  inputRef,
38
46
  isBottom,
@@ -53,6 +61,10 @@ const CellPure: FunctionComponent<Props> = ({
53
61
  [styles.bottom]: isBottom,
54
62
  [styles.filtered]: isFiltered,
55
63
  [styles.right]: isRight,
64
+ [styles.sharpTopLeft]: cellTop?.hasTile() || cellLeft?.hasTile(),
65
+ [styles.sharpTopRight]: cellTop?.hasTile() || cellRight?.hasTile(),
66
+ [styles.sharpBottomLeft]: cellBottom?.hasTile() || cellLeft?.hasTile(),
67
+ [styles.sharpBottomRight]: cellBottom?.hasTile() || cellRight?.hasTile(),
56
68
  })}
57
69
  style={style}
58
70
  >
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable max-lines, max-statements */
2
+ import { PayloadAction } from '@reduxjs/toolkit';
2
3
  import { BLANK, EMPTY_CELL } from '@scrabble-solver/constants';
3
4
  import { Board, Cell } from '@scrabble-solver/types';
4
5
  import {
@@ -14,10 +15,9 @@ import {
14
15
  } from 'react';
15
16
  import { useDispatch } from 'react-redux';
16
17
  import { useLatest } from 'react-use';
17
- import { AnyAction } from 'redux';
18
18
 
19
19
  import { LOCALE_FEATURES } from 'i18n';
20
- import { createGridOf, createKeyboardNavigation, extractCharacters, extractInputValue, isCtrl } from 'lib';
20
+ import { createGridOf, createKeyboardNavigation, extractCharacters, extractInputValue } from 'lib';
21
21
  import { boardSlice, selectConfig, selectLocale, useTypedSelector } from 'state';
22
22
  import { Direction } from 'types';
23
23
 
@@ -85,7 +85,7 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
85
85
  const insertValue = useCallback(
86
86
  (position: Point, value: string) => {
87
87
  const characters = value ? extractCharacters(config, value).filter((character) => character !== BLANK) : [BLANK];
88
- const actions: AnyAction[] = [];
88
+ const actions: PayloadAction<unknown>[] = [];
89
89
  let board = new Board({ rows: rows.map((row) => row.map((cell) => cell.clone())) });
90
90
  let { x, y } = position;
91
91
 
@@ -225,7 +225,7 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
225
225
  onArrowDown: (event) => {
226
226
  event.preventDefault();
227
227
 
228
- if (isCtrl(event)) {
228
+ if (direction === 'horizontal') {
229
229
  onDirectionToggle();
230
230
  } else {
231
231
  changeActiveIndex(0, 1);
@@ -234,7 +234,7 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
234
234
  onArrowLeft: (event) => {
235
235
  event.preventDefault();
236
236
 
237
- if (isCtrl(event)) {
237
+ if (direction === 'vertical') {
238
238
  onDirectionToggle();
239
239
  } else {
240
240
  changeActiveIndex(LOCALE_FEATURES[locale].direction === 'ltr' ? -1 : 1, 0);
@@ -243,7 +243,7 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
243
243
  onArrowRight: (event) => {
244
244
  event.preventDefault();
245
245
 
246
- if (isCtrl(event)) {
246
+ if (direction === 'vertical') {
247
247
  onDirectionToggle();
248
248
  } else {
249
249
  changeActiveIndex(LOCALE_FEATURES[locale].direction === 'ltr' ? 1 : -1, 0);
@@ -252,7 +252,7 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
252
252
  onArrowUp: (event) => {
253
253
  event.preventDefault();
254
254
 
255
- if (isCtrl(event)) {
255
+ if (direction === 'horizontal') {
256
256
  onDirectionToggle();
257
257
  } else {
258
258
  changeActiveIndex(0, -1);
@@ -289,22 +289,6 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
289
289
 
290
290
  const { x, y } = position;
291
291
  const character = event.key.toLowerCase();
292
- const isTogglingBlank = isCtrl(event) && character === 'b';
293
- const twoCharacterTile = config.getTwoCharacterTileByPrefix(character);
294
-
295
- if (isTogglingBlank) {
296
- event.preventDefault();
297
- dispatch(boardSlice.actions.toggleCellIsBlank(position));
298
- return;
299
- }
300
-
301
- if (isCtrl(event) && twoCharacterTile) {
302
- event.preventDefault();
303
- dispatch(boardSlice.actions.changeCellValue({ x, y, value: twoCharacterTile }));
304
- moveFocus(1);
305
- return;
306
- }
307
-
308
292
  const cell = rows[y][x];
309
293
  const twoCharacterCandidate = cell.tile.character + character;
310
294
 
@@ -333,7 +317,7 @@ const useGrid = (rows: Cell[][]): [State, Actions] => {
333
317
  dispatch(boardSlice.actions.toggleCellIsBlank(position));
334
318
  },
335
319
  });
336
- }, [changeActiveIndex, config, dispatch, locale, moveFocus, onDirectionToggle, rows]);
320
+ }, [changeActiveIndex, config, direction, dispatch, locale, moveFocus, onDirectionToggle, rows]);
337
321
 
338
322
  const onPaste = useCallback<ClipboardEventHandler>(
339
323
  (event) => {
@@ -1,4 +1,8 @@
1
+ @import 'styles/mixins';
2
+
1
3
  .dictionary {
4
+ @include scrollbars;
5
+
2
6
  position: relative;
3
7
  max-height: var(--dictionary--height);
4
8
  height: var(--dictionary--height);
@@ -8,4 +8,5 @@
8
8
  @include text-input;
9
9
 
10
10
  border: none;
11
+ border-radius: inherit;
11
12
  }
@@ -8,7 +8,8 @@
8
8
 
9
9
  .tiles {
10
10
  display: inline-block;
11
+ max-width: 100%;
11
12
  margin-bottom: var(--spacing--m);
12
- height: 40px;
13
+ height: 48px;
13
14
  overflow: visible;
14
15
  }
@@ -41,8 +41,7 @@ const EmptyState: FunctionComponent<Props> = ({ children, className, variant })
41
41
  return (
42
42
  <div className={classNames(styles.emptyState, className)}>
43
43
  <PlainTiles className={styles.tiles} color={COLORS_PER_TYPE[variant]} content={content} />
44
-
45
- <div className={styles.content}>{children}</div>
44
+ <div>{children}</div>
46
45
  </div>
47
46
  );
48
47
  };
@@ -30,6 +30,6 @@
30
30
  }
31
31
 
32
32
  .tiles {
33
- width: 298px;
33
+ width: 100% * 2 / 3;
34
34
  height: 100%;
35
35
  }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * This component is unused, but it serves as a blueprint for the Logo.svg.
3
+ * Logo.svg is what this component generates with all the text nodes transformed
4
+ * into paths (manually with Inkscape), and corner radius removed from tiles.
5
+ */
1
6
  import { CSSProperties, FunctionComponent } from 'react';
2
7
 
3
8
  import PlainTiles from '../PlainTiles';
@@ -112,6 +112,8 @@
112
112
  }
113
113
 
114
114
  .content {
115
+ @include scrollbars;
116
+
115
117
  position: relative;
116
118
  flex: 1;
117
119
  min-height: 0;