@scrabble-solver/scrabble-solver 2.13.13 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +5 -5
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/eslint/.cache_8dgz12 +1 -1
  5. package/.next/cache/webpack/client-production/0.pack +0 -0
  6. package/.next/cache/webpack/client-production/index.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  8. package/.next/cache/webpack/edge-server-production/0.pack +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/prerender-manifest.js +1 -1
  15. package/.next/prerender-manifest.json +1 -1
  16. package/.next/routes-manifest.json +1 -1
  17. package/.next/server/chunks/807.js +1 -1
  18. package/.next/server/chunks/911.js +1 -1
  19. package/.next/server/chunks/977.js +1 -1
  20. package/.next/server/middleware-build-manifest.js +1 -1
  21. package/.next/server/pages/404.html +1 -1
  22. package/.next/server/pages/404.js.nft.json +1 -1
  23. package/.next/server/pages/500.html +1 -1
  24. package/.next/server/pages/_app.js.nft.json +1 -1
  25. package/.next/server/pages/api/dictionary/[locale]/[word].js +2 -2
  26. package/.next/server/pages/index.html +1 -1
  27. package/.next/server/pages/index.js +1 -1
  28. package/.next/server/pages/index.js.nft.json +1 -1
  29. package/.next/server/pages/index.json +1 -1
  30. package/.next/server/pages-manifest.json +1 -1
  31. package/.next/static/{qwJjm2FeDHHGY92CY5oQQ → C0yfLTukP3L3iDqdXbbBv}/_buildManifest.js +1 -1
  32. package/.next/static/chunks/pages/_app-e73bbdbc75537614.js +17 -0
  33. package/.next/static/chunks/pages/index-4143525ec0fa83bb.js +1 -0
  34. package/.next/static/css/{2adc9736d823979b.css → ac3349339fcf58f2.css} +1 -1
  35. package/.next/trace +45 -45
  36. package/package.json +12 -12
  37. package/src/components/Alert/Alert.tsx +1 -1
  38. package/src/components/Board/Board.tsx +3 -3
  39. package/src/components/Board/BoardPure.tsx +1 -1
  40. package/src/components/Button/Button.tsx +1 -1
  41. package/src/components/IconButton/IconButton.tsx +1 -1
  42. package/src/components/IconButton/Link.tsx +1 -1
  43. package/src/components/Keys/Arrows/Arrows.tsx +4 -4
  44. package/src/components/NotFound/NotFound.tsx +1 -1
  45. package/src/components/Radio/Radio.module.scss +3 -2
  46. package/src/components/Radio/Radio.tsx +1 -1
  47. package/src/components/Results/HeaderButton.tsx +1 -1
  48. package/src/components/Results/Results.module.scss +5 -8
  49. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +1 -1
  50. package/src/components/Tile/TilePure.tsx +1 -1
  51. package/src/i18n/constants.ts +12 -1
  52. package/src/i18n/i18n.ts +2 -0
  53. package/src/i18n/languages/turkish.json +78 -0
  54. package/src/icons/FlagTr.svg +4 -0
  55. package/src/icons/index.ts +1 -0
  56. package/src/modals/MenuModal/MenuModal.tsx +1 -1
  57. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +1 -1
  58. package/src/modals/WordsModal/WordsModal.tsx +2 -2
  59. package/src/pages/_app.tsx +11 -2
  60. package/.next/static/chunks/pages/_app-42ce6b4032e931ff.js +0 -17
  61. package/.next/static/chunks/pages/index-3718075f2ba2220c.js +0 -1
  62. /package/.next/static/{qwJjm2FeDHHGY92CY5oQQ → C0yfLTukP3L3iDqdXbbBv}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/scrabble-solver",
3
- "version": "2.13.13",
3
+ "version": "2.15.0",
4
4
  "description": "Scrabble Solver 2 - App",
5
5
  "engines": {
6
6
  "node": ">=16"
@@ -27,16 +27,16 @@
27
27
  "start": "env-cmd next start -p 3333"
28
28
  },
29
29
  "dependencies": {
30
- "@floating-ui/react": "^0.26.19",
30
+ "@floating-ui/react": "^0.26.20",
31
31
  "@kamilmielnik/trie": "^3.0.0",
32
- "@reduxjs/toolkit": "^2.2.6",
33
- "@scrabble-solver/configs": "^2.13.13",
34
- "@scrabble-solver/constants": "^2.13.13",
35
- "@scrabble-solver/dictionaries": "^2.13.13",
36
- "@scrabble-solver/logger": "^2.13.13",
37
- "@scrabble-solver/solver": "^2.13.13",
38
- "@scrabble-solver/types": "^2.13.13",
39
- "@scrabble-solver/word-definitions": "^2.13.13",
32
+ "@reduxjs/toolkit": "^2.2.7",
33
+ "@scrabble-solver/configs": "^2.15.0",
34
+ "@scrabble-solver/constants": "^2.15.0",
35
+ "@scrabble-solver/dictionaries": "^2.15.0",
36
+ "@scrabble-solver/logger": "^2.15.0",
37
+ "@scrabble-solver/solver": "^2.15.0",
38
+ "@scrabble-solver/types": "^2.15.0",
39
+ "@scrabble-solver/word-definitions": "^2.15.0",
40
40
  "classnames": "^2.5.1",
41
41
  "env-cmd": "^10.1.0",
42
42
  "include-media": "^2.0.0",
@@ -52,7 +52,7 @@
52
52
  "react-window": "^1.8.10",
53
53
  "redux-saga": "^1.3.0",
54
54
  "store2": "^2.14.3",
55
- "use-debounce": "^10.0.1",
55
+ "use-debounce": "^10.0.2",
56
56
  "workbox-expiration": "^7.1.0",
57
57
  "workbox-precaching": "^7.1.0",
58
58
  "workbox-routing": "^7.1.0",
@@ -73,5 +73,5 @@
73
73
  "@types/redux-saga": "^0.10.5",
74
74
  "sass": "^1.77.8"
75
75
  },
76
- "gitHead": "8cfc206dec35314cd879a3ce8f9b0c60c3fd231a"
76
+ "gitHead": "4c23b3525f7cb2b1fae4ec0d9271cffab810f7d3"
77
77
  }
@@ -32,7 +32,7 @@ const Alert: FunctionComponent<Props> = ({ children, className, variant, ...prop
32
32
  {...props}
33
33
  >
34
34
  <div className={styles.iconContainer}>
35
- <Icon className={styles.icon} />
35
+ <Icon aria-hidden="true" className={styles.icon} role="img" />
36
36
  </div>
37
37
 
38
38
  <div className={styles.content}>{children}</div>
@@ -9,7 +9,7 @@ import { useDispatch } from 'react-redux';
9
9
 
10
10
  import { useAppLayout } from 'hooks';
11
11
  import { LOCALE_FEATURES } from 'i18n';
12
- import { BORDER_WIDTH, TRANSITION } from 'parameters';
12
+ import { TRANSITION } from 'parameters';
13
13
  import {
14
14
  boardSlice,
15
15
  cellFilterSlice,
@@ -176,8 +176,8 @@ const Board: FunctionComponent<Props> = ({ className }) => {
176
176
  ref={floatingFocus.refs.setFloating}
177
177
  style={{
178
178
  position: floatingFocus.strategy,
179
- top: floatingFocus.y + cellSize - (showCoordinates === 'hidden' ? 0 : BORDER_WIDTH),
180
- left: floatingFocus.x - (showCoordinates === 'hidden' ? 0 : BORDER_WIDTH),
179
+ top: floatingFocus.y + cellSize,
180
+ left: floatingFocus.x,
181
181
  width: cellSize,
182
182
  height: cellSize,
183
183
  opacity: hasFocus ? 1 : 0,
@@ -108,7 +108,7 @@ const BoardPure = forwardRef<HTMLDivElement, Props>(
108
108
  }}
109
109
  >
110
110
  <div className={styles.iconBackground} />
111
- <Icon className={styles.icon} />
111
+ <Icon aria-hidden="true" className={styles.icon} role="img" />
112
112
  </div>
113
113
  );
114
114
  })}
@@ -34,7 +34,7 @@ const Button: FunctionComponent<Props> = ({
34
34
  {...props}
35
35
  >
36
36
  <span className={styles.content}>
37
- {Icon && <Icon className={classNames(styles.icon, iconClassName)} />}
37
+ {Icon && <Icon aria-hidden="true" className={classNames(styles.icon, iconClassName)} role="img" />}
38
38
  {children && <span className={styles.label}>{children}</span>}
39
39
  </span>
40
40
  </button>
@@ -19,7 +19,7 @@ const IconButton: FunctionComponent<Props> = ({ className, Icon, tooltip, ...pro
19
19
  <Tooltip tooltip={tooltip}>
20
20
  <button className={classNames(styles.iconButton, className)} type="button" {...props}>
21
21
  <span className={styles.content}>
22
- <Icon className={styles.icon} />
22
+ <Icon aria-hidden="true" className={styles.icon} role="img" />
23
23
  </span>
24
24
  </button>
25
25
  </Tooltip>
@@ -18,7 +18,7 @@ const Link: FunctionComponent<Props> = ({ className, Icon, tooltip, ...props })
18
18
  <Tooltip tooltip={tooltip}>
19
19
  <a className={classNames(styles.iconButton, className)} {...props}>
20
20
  <span className={styles.content}>
21
- <Icon className={styles.icon} />
21
+ <Icon aria-hidden="true" className={styles.icon} role="img" />
22
22
  </span>
23
23
  </a>
24
24
  </Tooltip>
@@ -14,16 +14,16 @@ interface Props {
14
14
  const Arrows: FunctionComponent<Props> = ({ className }) => (
15
15
  <div className={classNames(styles.arrows, className)}>
16
16
  <Key className={classNames(styles.arrow, styles.left)}>
17
- <ArrowLeft />
17
+ <ArrowLeft aria-hidden="true" role="img" />
18
18
  </Key>
19
19
  <Key className={classNames(styles.arrow, styles.up)}>
20
- <ArrowUp />
20
+ <ArrowUp aria-hidden="true" role="img" />
21
21
  </Key>
22
22
  <Key className={classNames(styles.arrow, styles.right)}>
23
- <ArrowRight />
23
+ <ArrowRight aria-hidden="true" role="img" />
24
24
  </Key>
25
25
  <Key className={classNames(styles.arrow, styles.down)}>
26
- <ArrowDown />
26
+ <ArrowDown aria-hidden="true" role="img" />
27
27
  </Key>
28
28
  </div>
29
29
  );
@@ -11,7 +11,7 @@ const CONTENT = [['HTTP', '404']];
11
11
  const NotFound: FunctionComponent = () => (
12
12
  <div className={styles.notFound}>
13
13
  <a className={styles.link} href="/">
14
- <DashCircleFill className={styles.icon} />
14
+ <DashCircleFill aria-hidden="true" className={styles.icon} role="img" />
15
15
  <PlainTiles className={styles.tiles} content={CONTENT} />
16
16
  </a>
17
17
  </div>
@@ -51,8 +51,9 @@ $radio-box-size: $radio-size + 2 * $radio-inner-border;
51
51
  &::after {
52
52
  content: ' ';
53
53
  position: absolute;
54
- top: $radio-inner-border;
55
- left: $radio-inner-border;
54
+ top: 50%;
55
+ left: 50%;
56
+ transform: translate(-50%, -50%);
56
57
  width: $radio-inner-size;
57
58
  height: $radio-inner-size;
58
59
  background-color: transparent;
@@ -30,7 +30,7 @@ const Radio: FunctionComponent<Props> = ({ checked, children, className, disable
30
30
  onChange={onChange}
31
31
  />
32
32
 
33
- <div className={styles.icon} />
33
+ <div aria-hidden="true" className={styles.icon} role="img" />
34
34
 
35
35
  <div className={styles.content}>{children}</div>
36
36
  </label>
@@ -37,7 +37,7 @@ const HeaderButton = ({ className, Icon, id, translationKey, style }: Props): Re
37
37
  onClick={handleClick}
38
38
  >
39
39
  <span className={styles.cell}>
40
- {Icon && <Icon className={styles.headerButtonIcon} />}
40
+ {Icon && <Icon aria-hidden="true" className={styles.headerButtonIcon} role="img" />}
41
41
 
42
42
  {!Icon && <span className={styles.headerButtonLabel}>{translate(translationKey)}</span>}
43
43
 
@@ -56,7 +56,9 @@ $row-padding-horizontal: calc(var(--spacing--m) + var(--spacing--s));
56
56
  cursor: pointer;
57
57
 
58
58
  text-transform: uppercase;
59
- transition: var(--transition);
59
+ transition:
60
+ background-color var(--transition--duration) var(--transition--easing),
61
+ color var(--transition--duration) var(--transition--easing);
60
62
  background-color: var(--color--background);
61
63
  height: 100%;
62
64
 
@@ -138,6 +140,7 @@ $row-padding-horizontal: calc(var(--spacing--m) + var(--spacing--s));
138
140
 
139
141
  .word {
140
142
  @include ellipsis;
143
+
141
144
  display: flex;
142
145
  }
143
146
  }
@@ -147,17 +150,12 @@ $row-padding-horizontal: calc(var(--spacing--m) + var(--spacing--s));
147
150
  align-items: center;
148
151
  justify-content: center;
149
152
  height: 100%;
150
- padding: 0 var(--spacing--s);
151
153
  gap: var(--spacing--s);
152
154
  line-height: var(--results--item--height);
153
155
 
154
- &.word,
156
+ .result &.word,
155
157
  .headerButton.word & {
156
158
  justify-content: flex-start;
157
- }
158
-
159
- .result &.word:first-child,
160
- .headerButton.word:first-child & {
161
159
  padding-inline-start: $row-padding-horizontal;
162
160
  }
163
161
 
@@ -183,7 +181,6 @@ $row-padding-horizontal: calc(var(--spacing--m) + var(--spacing--s));
183
181
  $width: 80px;
184
182
 
185
183
  flex: 1 0 $width;
186
- max-width: $width;
187
184
  font-weight: bold;
188
185
  }
189
186
 
@@ -90,7 +90,7 @@ const ResultCandidatePicker: FunctionComponent<Props> = ({ className, onResultCl
90
90
 
91
91
  <div className={styles.iconContainer}>
92
92
  {isLoading && <Spinner className={styles.loading} />}
93
- {!isLoading && <ChevronDown className={styles.icon} />}
93
+ {!isLoading && <ChevronDown aria-hidden="true" className={styles.icon} role="img" />}
94
94
  </div>
95
95
  </button>
96
96
 
@@ -107,7 +107,7 @@ const TilePure: FunctionComponent<Props> = ({
107
107
  </span>
108
108
  )}
109
109
 
110
- {!isValid && <ExclamationSquareFill className={styles.alert} />}
110
+ {!isValid && <ExclamationSquareFill aria-hidden="true" className={styles.alert} role="img" />}
111
111
  </div>
112
112
  );
113
113
 
@@ -2,7 +2,7 @@ import { COMMA_ARABIC, COMMA_LATIN } from '@scrabble-solver/constants';
2
2
  import { Locale } from '@scrabble-solver/types';
3
3
  import { FunctionComponent, SVGAttributes } from 'react';
4
4
 
5
- import { FlagDe, FlagEs, FlagFa, FlagFr, FlagGb, FlagPl, FlagRo, FlagUs } from 'icons';
5
+ import { FlagDe, FlagEs, FlagFa, FlagFr, FlagGb, FlagPl, FlagRo, FlagTr, FlagUs } from 'icons';
6
6
 
7
7
  interface LocaleFeatures {
8
8
  comma: string;
@@ -105,4 +105,15 @@ export const LOCALE_FEATURES: Record<Locale, LocaleFeatures> = {
105
105
  separator: `${COMMA_LATIN} `,
106
106
  vowels: true,
107
107
  },
108
+ [Locale.TR_TR]: {
109
+ comma: COMMA_LATIN,
110
+ consonants: true,
111
+ direction: 'ltr',
112
+ Icon: FlagTr,
113
+ label: 'Türkçe',
114
+ locale: Locale.TR_TR,
115
+ name: 'Turkish',
116
+ separator: `${COMMA_LATIN} `,
117
+ vowels: true,
118
+ },
108
119
  };
package/src/i18n/i18n.ts CHANGED
@@ -9,6 +9,7 @@ import persian from './languages/persian.json';
9
9
  import polish from './languages/polish.json';
10
10
  import romanian from './languages/romanian.json';
11
11
  import spanish from './languages/spanish.json';
12
+ import turkish from './languages/turkish.json';
12
13
 
13
14
  const i18n: Record<Locale, Translations> = {
14
15
  [Locale.DE_DE]: german,
@@ -19,6 +20,7 @@ const i18n: Record<Locale, Translations> = {
19
20
  [Locale.FR_FR]: french,
20
21
  [Locale.PL_PL]: polish,
21
22
  [Locale.RO_RO]: romanian,
23
+ [Locale.TR_TR]: turkish,
22
24
  };
23
25
 
24
26
  export default i18n;
@@ -0,0 +1,78 @@
1
+ {
2
+ "cell.enter-word": "Kelimeyi girin",
3
+ "cell.filter-cell.exclude": "Hedefi hariç tut",
4
+ "cell.filter-cell.include": "Hedef varış noktası",
5
+ "cell.set-blank": "Boş olarak işaretle",
6
+ "cell.set-not-blank": "Boş değil olarak işaretle",
7
+ "cell.tile.location": "Tahta: harfler ({{x}}, {{y}})",
8
+ "cell.toggle-direction": "Yazma yönü - geçiş yapmak için tıklayın",
9
+ "common.arrows": "Ok tuşları",
10
+ "common.blanks": "Jokerler",
11
+ "common.clear": "Sıfırla",
12
+ "common.close": "Kapat",
13
+ "common.consonants": "Ünlü harfler",
14
+ "common.loading": "Yükleniyor",
15
+ "common.next": "Sonraki",
16
+ "common.points": "Puanlar",
17
+ "common.previous": "Öncesi",
18
+ "common.space": "Boşluk çubuğu",
19
+ "common.tiles": "Taşlar",
20
+ "common.two-letter-tiles": "İki Harfli",
21
+ "common.vowels": "Ünsüz harfler",
22
+ "common.word": "Kelime",
23
+ "common.words": "Kelimeler",
24
+ "dictionary": "Sözlük",
25
+ "dictionary.empty-state.no-definitions": "Kelime sözlükte var ama tanımı yok.",
26
+ "dictionary.empty-state.no-results": "Sözlükte kelime tanımı bulunamadı.",
27
+ "dictionary.empty-state.not-allowed": "Bu kelimeye izin verilmiyor.",
28
+ "dictionary.empty-state.uninitialized": "En son vurgulanan kelimenin sözlük tanımı burada gösterilecektir.",
29
+ "dictionary.input.placeholder": "Sözlükte ara...",
30
+ "dictionary.input.title": "Virgülle ayrılmış kelimeler",
31
+ "empty-state.error": "Hata",
32
+ "empty-state.info": "Bilgi",
33
+ "empty-state.success": "Evet!",
34
+ "empty-state.warning": "Aman hayır!",
35
+ "github": "GitHub'da bu projeye bakın",
36
+ "keyMap": "Klavye Kısayolları",
37
+ "keyMap.board": "Tahta",
38
+ "keyMap.board.toggle-blank": "Taşı joker olarak işaretle/olmaktan çıkar",
39
+ "keyMap.board.toggle-cell-filter": "Hedef filtresini değiştir",
40
+ "keyMap.board.toggle-direction": "Yazma yönünü değiştir",
41
+ "keyMap.board-and-rack": "Tahta ve Deste",
42
+ "keyMap.board-and-rack.insert-two-letter-tile": "İki harfli kutucuğu ekle",
43
+ "keyMap.board-and-rack.navigate": "Gezinme",
44
+ "keyMap.board-and-rack.remove-tile": "Taşı kaldır",
45
+ "keyMap.board-and-rack.submit": "Çözmeye başla",
46
+ "keyMap.rack": "Deste",
47
+ "keyMap.rack.insert-blank": "Joker ekle (spacebar)",
48
+ "menu": "Menü",
49
+ "rack.placeholder": "Taşlar…",
50
+ "rack.tile.location": "Deste: harfler ({{index}})",
51
+ "rack.touchscreen.placeholder": "Taşlar…",
52
+ "remaining-tiles": "Kalan taşlar",
53
+ "results": "Sonuçlar",
54
+ "results.empty-state.no-results": "Sonuç bulunamadı - kelime üretilemedi.",
55
+ "results.empty-state.outdated": "Sonuçlar güncelliğini yitirmiştir.",
56
+ "results.empty-state.uninitialized": "Harflerinizden oluşturulan kelimeler burada gösterilecektir.",
57
+ "results.input.placeholder": "Sonuçları Ara... (RegExp)",
58
+ "results.insert": "Sokmak",
59
+ "results.preview": "Önizleme",
60
+ "results.solve": "Çöz",
61
+ "settings": "Ayarlar",
62
+ "settings.autoGroupTiles": "Kalan taşları grupla",
63
+ "settings.autoGroupTiles.left": "Soldaki",
64
+ "settings.autoGroupTiles.right": "Sağdaki",
65
+ "settings.autoGroupTiles.null": "Gruplamayın",
66
+ "settings.game": "Oyun",
67
+ "settings.inputMode": "Giriş Methodu",
68
+ "settings.inputMode.keyboard": "Klavye",
69
+ "settings.inputMode.touchscreen": "Dokunmatik ekran",
70
+ "settings.language": "Dil",
71
+ "settings.showCoordinates": "Koordinatlar",
72
+ "settings.showCoordinates.alternative": "Alternatif",
73
+ "settings.showCoordinates.hidden": "Gizlenmiş",
74
+ "settings.showCoordinates.original": "Orijinal",
75
+ "words": "Oluşturulan kelimeler",
76
+ "words.invalid": "Geçersiz",
77
+ "words.valid": "Geçerli"
78
+ }
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -30000 90000 60000">
2
+ <path fill="#e30a17" d="m0-30000h90000v60000H0z" />
3
+ <path fill="#fff" d="m41750 0 13568-4408-8386 11541V-7133l8386 11541zm925 8021a15000 15000 0 1 1 0-16042 12000 12000 0 1 0 0 16042z" />
4
+ </svg>
@@ -27,6 +27,7 @@ export { default as FlagFr } from './FlagFr.svg';
27
27
  export { default as FlagGb } from './FlagGb.svg';
28
28
  export { default as FlagPl } from './FlagPl.svg';
29
29
  export { default as FlagRo } from './FlagRo.svg';
30
+ export { default as FlagTr } from './FlagTr.svg';
30
31
  export { default as FlagUs } from './FlagUs.svg';
31
32
  export { default as GeoAlt } from './GeoAlt.svg';
32
33
  export { default as Github } from './Github.svg';
@@ -64,7 +64,7 @@ const MenuModal: FunctionComponent<Props> = ({
64
64
  <Button aria-label={translate('settings')} className={styles.button} Icon={Cog} onClick={onShowSettings}>
65
65
  <div className={styles.settings}>
66
66
  <div className={styles.settingsLabel}>{translate('settings')}</div>
67
- <Icon className={styles.flag} />
67
+ <Icon aria-hidden="true" className={styles.flag} role="img" />
68
68
  </div>
69
69
  </Button>
70
70
  </Modal>
@@ -40,7 +40,7 @@ const LocaleSetting: FunctionComponent<Props> = ({ className, disabled }) => {
40
40
  onChange={handleChange}
41
41
  >
42
42
  <span className={styles.label}>
43
- <Icon className={styles.flag} />
43
+ <Icon aria-hidden="true" className={styles.flag} role="img" />
44
44
 
45
45
  <span>{option.label}</span>
46
46
  </span>
@@ -31,7 +31,7 @@ const WordsModal: FunctionComponent<Props> = ({ className, isOpen, onClose }) =>
31
31
  >
32
32
  {invalidWords.map((word, index) => (
33
33
  <div className={styles.word} key={index}>
34
- <Cross className={classNames(styles.icon, styles.invalid)} /> {word}
34
+ <Cross aria-hidden="true" className={classNames(styles.icon, styles.invalid)} role="img" /> {word}
35
35
  </div>
36
36
  ))}
37
37
  </Modal.Section>
@@ -47,7 +47,7 @@ const WordsModal: FunctionComponent<Props> = ({ className, isOpen, onClose }) =>
47
47
  >
48
48
  {validWords.map((word, index) => (
49
49
  <div className={styles.word} key={index}>
50
- <Check className={classNames(styles.icon, styles.valid)} /> {word}
50
+ <Check aria-hidden="true" className={classNames(styles.icon, styles.valid)} role="img" /> {word}
51
51
  </div>
52
52
  ))}
53
53
  </Modal.Section>
@@ -18,7 +18,8 @@ const KEYWORDS = [
18
18
  'Scrabble',
19
19
  'Solver',
20
20
  'Super Scrabble',
21
- 'Super Scrabble Solver',
21
+ 'Kelimelik',
22
+ 'Literaki',
22
23
  'Board',
23
24
  'Open-source',
24
25
  'Open',
@@ -26,14 +27,22 @@ const KEYWORDS = [
26
27
  'Word',
27
28
  'Finder',
28
29
  'Cheating',
29
- 'Literaki',
30
30
  'Word',
31
31
  'English',
32
32
  'Français',
33
+ 'French',
33
34
  'Deutsch',
35
+ 'German',
34
36
  'Polski',
37
+ 'Polish',
35
38
  'فارسی',
39
+ 'Farsi',
36
40
  'Español',
41
+ 'Spanish',
42
+ 'Română',
43
+ 'Romanian',
44
+ 'Türkçe',
45
+ 'Turkish',
37
46
  'SOWPODS',
38
47
  'TWL06',
39
48
  'SJP',