@asafarim/shared-i18n 0.8.1 → 0.9.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 (94) hide show
  1. package/README.md +266 -350
  2. package/demo/README.md +119 -148
  3. package/demo/index.html +12 -1
  4. package/demo/node_modules/.bin/kill-port +17 -0
  5. package/demo/node_modules/.bin/tsc +5 -9
  6. package/demo/node_modules/.bin/tsserver +5 -9
  7. package/demo/node_modules/.bin/vite +5 -9
  8. package/demo/package.json +7 -4
  9. package/demo/public/404.html +24 -0
  10. package/demo/public/favicon.svg +4 -4
  11. package/demo/public/logo.svg +24 -24
  12. package/demo/src/App.tsx +178 -129
  13. package/demo/src/components/CountryLanguageSelectorsPage.tsx +240 -0
  14. package/demo/src/components/GetStartedSection.tsx +56 -56
  15. package/demo/src/components/KeyTable.tsx +29 -29
  16. package/demo/src/components/LanguageBar.tsx +145 -103
  17. package/demo/src/components/LanguageSwitcherDemo.module.css +114 -114
  18. package/demo/src/components/LanguageSwitchersPage.tsx +245 -0
  19. package/demo/src/components/Logo.tsx +6 -6
  20. package/demo/src/components/OverviewSection.tsx +58 -43
  21. package/demo/src/components/Panel.tsx +15 -15
  22. package/demo/src/components/RoutingLabPage.tsx +147 -0
  23. package/demo/src/components/StatusCard.tsx +109 -109
  24. package/demo/src/data/countries.ts +48 -0
  25. package/demo/src/i18n/localeAdapter.ts +91 -0
  26. package/demo/src/i18n/localeRouting.ts +77 -0
  27. package/demo/src/index.css +1075 -644
  28. package/demo/src/locales/de/demo.json +202 -84
  29. package/demo/src/locales/en/demo.json +201 -85
  30. package/demo/src/locales/fr/demo.json +203 -85
  31. package/demo/src/locales/it/demo.json +202 -84
  32. package/demo/src/locales/lb/demo.json +201 -0
  33. package/demo/src/locales/nl/demo.json +203 -85
  34. package/demo/src/main.tsx +32 -29
  35. package/demo/tsconfig.json +18 -18
  36. package/demo/tsconfig.node.json +10 -10
  37. package/demo/tsconfig.tsbuildinfo +1 -1
  38. package/demo/vite-env.d.ts +7 -7
  39. package/demo/vite.config.d.ts +2 -2
  40. package/demo/vite.config.js +10 -10
  41. package/dist/components/LanguageSwitcher.module.css +303 -303
  42. package/dist/country-language-selector.css +431 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -0
  46. package/dist/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +8 -5
  48. package/demo/dist/Icon Dropdown_Limited Languages.png +0 -0
  49. package/demo/dist/Select Dropdown_Text Only.png +0 -0
  50. package/demo/dist/assets/favicon-BZYZvBLo.svg +0 -4
  51. package/demo/dist/assets/index-BdjqKw_N.css +0 -1
  52. package/demo/dist/assets/index-C1Tq1uEr.js +0 -191
  53. package/demo/dist/favicon.svg +0 -4
  54. package/demo/dist/index.html +0 -27
  55. package/demo/dist/logo.svg +0 -24
  56. package/demo/node_modules/.bin/browserslist +0 -21
  57. package/demo/node_modules/.bin/browserslist.CMD +0 -12
  58. package/demo/node_modules/.bin/browserslist.ps1 +0 -41
  59. package/demo/node_modules/.bin/tsc.CMD +0 -12
  60. package/demo/node_modules/.bin/tsc.ps1 +0 -41
  61. package/demo/node_modules/.bin/tsserver.CMD +0 -12
  62. package/demo/node_modules/.bin/tsserver.ps1 +0 -41
  63. package/demo/node_modules/.bin/vite.CMD +0 -12
  64. package/demo/node_modules/.bin/vite.ps1 +0 -41
  65. package/demo/node_modules/.vite/deps/@asafarim_country-language-selector.js +0 -848
  66. package/demo/node_modules/.vite/deps/@asafarim_country-language-selector.js.map +0 -7
  67. package/demo/node_modules/.vite/deps/_metadata.json +0 -76
  68. package/demo/node_modules/.vite/deps/chunk-5WRI5ZAA.js +0 -30
  69. package/demo/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +0 -7
  70. package/demo/node_modules/.vite/deps/chunk-B3AHR5EX.js +0 -1004
  71. package/demo/node_modules/.vite/deps/chunk-B3AHR5EX.js.map +0 -7
  72. package/demo/node_modules/.vite/deps/chunk-E6BG6WAU.js +0 -292
  73. package/demo/node_modules/.vite/deps/chunk-E6BG6WAU.js.map +0 -7
  74. package/demo/node_modules/.vite/deps/chunk-MVARZQEG.js +0 -280
  75. package/demo/node_modules/.vite/deps/chunk-MVARZQEG.js.map +0 -7
  76. package/demo/node_modules/.vite/deps/i18next-browser-languagedetector.js +0 -400
  77. package/demo/node_modules/.vite/deps/i18next-browser-languagedetector.js.map +0 -7
  78. package/demo/node_modules/.vite/deps/i18next.js +0 -2392
  79. package/demo/node_modules/.vite/deps/i18next.js.map +0 -7
  80. package/demo/node_modules/.vite/deps/package.json +0 -3
  81. package/demo/node_modules/.vite/deps/react-dom.js +0 -6
  82. package/demo/node_modules/.vite/deps/react-dom.js.map +0 -7
  83. package/demo/node_modules/.vite/deps/react-dom_client.js +0 -20217
  84. package/demo/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  85. package/demo/node_modules/.vite/deps/react-i18next.js +0 -869
  86. package/demo/node_modules/.vite/deps/react-i18next.js.map +0 -7
  87. package/demo/node_modules/.vite/deps/react.js +0 -5
  88. package/demo/node_modules/.vite/deps/react.js.map +0 -7
  89. package/demo/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -278
  90. package/demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  91. package/demo/node_modules/.vite/deps/react_jsx-runtime.js +0 -6
  92. package/demo/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  93. package/demo/src/components/CountryLanguageDemo.tsx +0 -140
  94. package/demo/src/components/LanguageSwitcherDemo.tsx +0 -256
@@ -0,0 +1,431 @@
1
+ /* =========================================================================
2
+ @asafarim/country-language-selector
3
+ Design tokens are exposed as CSS variables so consumers can re-theme the
4
+ component without overriding individual rules.
5
+ ========================================================================= */
6
+
7
+ .cls-root,
8
+ .cls-root * {
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ .cls-portal {
13
+ position: static;
14
+ display: block;
15
+ }
16
+
17
+ .cls-root {
18
+ --cls-bg: #ffffff;
19
+ --cls-bg-muted: #f6f7f9;
20
+ --cls-bg-hover: #eef1f6;
21
+ --cls-bg-active: #e4e9f2;
22
+ --cls-fg: #111827;
23
+ --cls-fg-muted: #6b7280;
24
+ --cls-fg-subtle: #9ca3af;
25
+ --cls-border: #e5e7eb;
26
+ --cls-border-strong: #d1d5db;
27
+ --cls-accent: #2563eb;
28
+ --cls-accent-fg: #ffffff;
29
+ --cls-radius: 12px;
30
+ --cls-radius-sm: 8px;
31
+ --cls-shadow: 0 10px 32px -8px rgba(15, 23, 42, 0.22),
32
+ 0 4px 12px -4px rgba(15, 23, 42, 0.12);
33
+ --cls-focus: 0 0 0 2px rgba(37, 99, 235, 0.45);
34
+ --cls-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
35
+ "Helvetica Neue", Arial, "Noto Sans", sans-serif;
36
+
37
+ position: relative;
38
+ display: inline-block;
39
+ font-family: var(--cls-font);
40
+ color: var(--cls-fg);
41
+ }
42
+
43
+ @media (prefers-color-scheme: dark) {
44
+ .cls-root {
45
+ --cls-bg: #0f1115;
46
+ --cls-bg-muted: #171a21;
47
+ --cls-bg-hover: #1e222b;
48
+ --cls-bg-active: #262b37;
49
+ --cls-fg: #f3f4f6;
50
+ --cls-fg-muted: #9ca3af;
51
+ --cls-fg-subtle: #6b7280;
52
+ --cls-border: #262b37;
53
+ --cls-border-strong: #323847;
54
+ --cls-accent: #60a5fa;
55
+ --cls-accent-fg: #0f1115;
56
+ --cls-shadow: 0 12px 36px -8px rgba(0, 0, 0, 0.6),
57
+ 0 4px 16px -4px rgba(0, 0, 0, 0.4);
58
+ }
59
+ }
60
+
61
+ /* ---------- Trigger ---------- */
62
+
63
+ .cls-trigger {
64
+ appearance: none;
65
+ display: inline-flex;
66
+ align-items: center;
67
+ gap: 8px;
68
+ padding: 6px 10px;
69
+ background: var(--cls-bg-muted);
70
+ color: var(--cls-fg);
71
+ border: 1px solid var(--cls-border);
72
+ border-radius: var(--cls-radius-sm);
73
+ font: inherit;
74
+ font-size: 13.5px;
75
+ line-height: 1;
76
+ cursor: pointer;
77
+ transition: background 120ms ease, border-color 120ms ease, transform 120ms ease;
78
+ user-select: none;
79
+ -webkit-tap-highlight-color: transparent;
80
+ }
81
+
82
+ .cls-trigger:hover:not(:disabled) {
83
+ background: var(--cls-bg-hover);
84
+ border-color: var(--cls-border-strong);
85
+ }
86
+
87
+ .cls-trigger:active:not(:disabled) {
88
+ transform: translateY(0.5px);
89
+ }
90
+
91
+ .cls-trigger:focus-visible {
92
+ outline: none;
93
+ box-shadow: var(--cls-focus);
94
+ }
95
+
96
+ .cls-trigger:disabled {
97
+ opacity: 0.55;
98
+ cursor: not-allowed;
99
+ }
100
+
101
+ .cls-trigger__flag {
102
+ font-size: 16px;
103
+ line-height: 1;
104
+ }
105
+
106
+ /* ---------- Flag display modes ---------- */
107
+
108
+ .cls-flag {
109
+ display: inline-flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ flex: 0 0 auto;
113
+ }
114
+
115
+ .cls-flag--emoji {
116
+ line-height: 1;
117
+ }
118
+
119
+ .cls-flag--image {
120
+ width: 20px;
121
+ height: 14px;
122
+ object-fit: cover;
123
+ border-radius: 2px;
124
+ box-shadow: 0 0 0 1px rgba(15, 23, 42, 0.08);
125
+ background: var(--cls-bg-muted);
126
+ }
127
+
128
+ .cls-flag--image.cls-flag--sm {
129
+ width: 18px;
130
+ height: 13px;
131
+ }
132
+
133
+ .cls-flag--image.cls-flag--md {
134
+ width: 22px;
135
+ height: 16px;
136
+ border-radius: 3px;
137
+ }
138
+
139
+ .cls-trigger__flag.cls-flag--image {
140
+ width: 20px;
141
+ height: 14px;
142
+ }
143
+
144
+ .cls-trigger__code {
145
+ font-weight: 600;
146
+ letter-spacing: 0.02em;
147
+ }
148
+
149
+ .cls-trigger__sep {
150
+ color: var(--cls-fg-subtle);
151
+ }
152
+
153
+ .cls-trigger__lang {
154
+ font-weight: 500;
155
+ color: var(--cls-fg-muted);
156
+ text-transform: uppercase;
157
+ }
158
+
159
+ .cls-trigger__chev {
160
+ width: 12px;
161
+ height: 12px;
162
+ margin-left: 2px;
163
+ color: var(--cls-fg-muted);
164
+ transition: transform 160ms ease;
165
+ }
166
+
167
+ .cls-trigger[aria-expanded="true"] .cls-trigger__chev {
168
+ transform: rotate(180deg);
169
+ }
170
+
171
+ /* ---------- Popover ---------- */
172
+
173
+ .cls-popover {
174
+ position: absolute;
175
+ top: calc(100% + 8px);
176
+ min-width: 320px;
177
+ max-width: min(380px, calc(100vw - 24px));
178
+ background: var(--cls-bg);
179
+ color: var(--cls-fg);
180
+ border: 1px solid var(--cls-border);
181
+ border-radius: var(--cls-radius);
182
+ box-shadow: var(--cls-shadow);
183
+ z-index: 50;
184
+ overflow: hidden;
185
+ animation: cls-pop-in 140ms ease-out;
186
+ }
187
+
188
+ .cls-popover[data-align="end"] {
189
+ right: 0;
190
+ }
191
+
192
+ .cls-popover[data-align="start"] {
193
+ left: 0;
194
+ }
195
+
196
+ @keyframes cls-pop-in {
197
+ from {
198
+ opacity: 0;
199
+ transform: translateY(-4px) scale(0.98);
200
+ }
201
+ to {
202
+ opacity: 1;
203
+ transform: translateY(0) scale(1);
204
+ }
205
+ }
206
+
207
+ /* ---------- Search ---------- */
208
+
209
+ .cls-search {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 8px;
213
+ padding: 10px 12px;
214
+ border-bottom: 1px solid var(--cls-border);
215
+ background: var(--cls-bg);
216
+ }
217
+
218
+ .cls-search__icon {
219
+ width: 14px;
220
+ height: 14px;
221
+ color: var(--cls-fg-muted);
222
+ flex: 0 0 auto;
223
+ }
224
+
225
+ .cls-search__input {
226
+ flex: 1;
227
+ border: 0;
228
+ background: transparent;
229
+ color: var(--cls-fg);
230
+ font: inherit;
231
+ font-size: 14px;
232
+ outline: none;
233
+ min-width: 0;
234
+ }
235
+
236
+ .cls-search__input::placeholder {
237
+ color: var(--cls-fg-subtle);
238
+ }
239
+
240
+ /* ---------- Lists ---------- */
241
+
242
+ .cls-list {
243
+ list-style: none;
244
+ margin: 0;
245
+ padding: 6px;
246
+ max-height: 320px;
247
+ overflow-y: auto;
248
+ overscroll-behavior: contain;
249
+ scrollbar-width: thin;
250
+ }
251
+
252
+ .cls-section-title {
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: space-between;
256
+ padding: 10px 12px 4px;
257
+ font-size: 11px;
258
+ text-transform: uppercase;
259
+ letter-spacing: 0.08em;
260
+ color: var(--cls-fg-subtle);
261
+ font-weight: 600;
262
+ }
263
+
264
+ .cls-back {
265
+ appearance: none;
266
+ border: 0;
267
+ background: transparent;
268
+ padding: 2px 6px;
269
+ font: inherit;
270
+ font-size: 12px;
271
+ color: var(--cls-accent);
272
+ cursor: pointer;
273
+ border-radius: 6px;
274
+ display: inline-flex;
275
+ align-items: center;
276
+ gap: 4px;
277
+ }
278
+
279
+ .cls-back:hover {
280
+ background: var(--cls-bg-hover);
281
+ }
282
+
283
+ .cls-option {
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 10px;
287
+ padding: 8px 10px;
288
+ border-radius: var(--cls-radius-sm);
289
+ cursor: pointer;
290
+ user-select: none;
291
+ line-height: 1.2;
292
+ }
293
+
294
+ .cls-option[aria-disabled="true"] {
295
+ opacity: 0.5;
296
+ cursor: not-allowed;
297
+ }
298
+
299
+ .cls-option:hover,
300
+ .cls-option[data-active="true"] {
301
+ background: var(--cls-bg-hover);
302
+ }
303
+
304
+ .cls-option[aria-selected="true"] {
305
+ background: var(--cls-bg-active);
306
+ }
307
+
308
+ .cls-option__flag {
309
+ font-size: 18px;
310
+ line-height: 1;
311
+ flex: 0 0 auto;
312
+ }
313
+
314
+ .cls-option__flag.cls-flag--image {
315
+ width: 24px;
316
+ height: 18px;
317
+ }
318
+
319
+ .cls-option__body {
320
+ flex: 1;
321
+ min-width: 0;
322
+ display: flex;
323
+ flex-direction: column;
324
+ }
325
+
326
+ .cls-option__title {
327
+ font-size: 14px;
328
+ font-weight: 500;
329
+ color: var(--cls-fg);
330
+ white-space: nowrap;
331
+ overflow: hidden;
332
+ text-overflow: ellipsis;
333
+ }
334
+
335
+ .cls-option__subtitle {
336
+ font-size: 12px;
337
+ color: var(--cls-fg-muted);
338
+ white-space: nowrap;
339
+ overflow: hidden;
340
+ text-overflow: ellipsis;
341
+ }
342
+
343
+ .cls-option__meta {
344
+ margin-left: auto;
345
+ display: inline-flex;
346
+ align-items: center;
347
+ gap: 6px;
348
+ color: var(--cls-fg-subtle);
349
+ font-size: 11px;
350
+ font-weight: 600;
351
+ letter-spacing: 0.04em;
352
+ text-transform: uppercase;
353
+ }
354
+
355
+ .cls-badge {
356
+ display: inline-flex;
357
+ align-items: center;
358
+ padding: 1px 6px;
359
+ border-radius: 999px;
360
+ background: var(--cls-bg-muted);
361
+ color: var(--cls-fg-muted);
362
+ border: 1px solid var(--cls-border);
363
+ font-size: 10.5px;
364
+ }
365
+
366
+ .cls-check {
367
+ width: 14px;
368
+ height: 14px;
369
+ color: var(--cls-accent);
370
+ }
371
+
372
+ .cls-empty {
373
+ padding: 24px 12px;
374
+ text-align: center;
375
+ color: var(--cls-fg-muted);
376
+ font-size: 13px;
377
+ }
378
+
379
+ /* ---------- Mobile bottom sheet ---------- */
380
+
381
+ @media (max-width: 768px) {
382
+ .cls-popover {
383
+ min-width: min(320px, calc(100vw - 24px));
384
+ max-width: calc(100vw - 24px);
385
+ display: flex;
386
+ flex-direction: column;
387
+ z-index: 1000;
388
+ }
389
+
390
+ .cls-popover .cls-search {
391
+ flex: 0 0 auto;
392
+ position: sticky;
393
+ top: 0;
394
+ z-index: 2;
395
+ }
396
+
397
+ .cls-popover .cls-section-title {
398
+ flex: 0 0 auto;
399
+ }
400
+
401
+ .cls-list {
402
+ flex: 1 1 auto;
403
+ max-height: none;
404
+ min-height: 0;
405
+ }
406
+
407
+ .cls-option {
408
+ padding: 10px 12px;
409
+ }
410
+ }
411
+
412
+ /* ---------- Backdrop used on mobile ---------- */
413
+
414
+ .cls-backdrop {
415
+ position: fixed;
416
+ inset: 0;
417
+ background: rgba(15, 23, 42, 0.55);
418
+ backdrop-filter: blur(2px);
419
+ -webkit-backdrop-filter: blur(2px);
420
+ z-index: 999;
421
+ animation: cls-fade-in 180ms ease-out;
422
+ }
423
+
424
+ @keyframes cls-fade-in {
425
+ from {
426
+ opacity: 0;
427
+ }
428
+ to {
429
+ opacity: 1;
430
+ }
431
+ }
package/dist/index.d.ts CHANGED
@@ -6,4 +6,6 @@ export { getLanguageFromCookie, setLanguageCookie, isSupportedLanguage, getBrows
6
6
  export { LanguageSwitcher } from './components/LanguageSwitcher.js';
7
7
  export type { LanguageSwitcherProps } from './components/LanguageSwitcher.js';
8
8
  export { useTranslation, Trans, Translation } from 'react-i18next';
9
+ export { CountryLanguageSelector, defaultCountries, useCountryLanguage, filterCountries, } from '@asafarim/country-language-selector';
10
+ export type { Country, Locale, Language, CountryCode, LanguageCode, CountryLanguageSelectorProps, LocaleChangeHandler, LocaleChangeMeta, RenderTriggerContext, SelectorStrings, } from '@asafarim/country-language-selector';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACzH,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACzH,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGnE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAE7C,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,GAChB,MAAM,qCAAqC,CAAC"}
package/dist/index.js CHANGED
@@ -8,3 +8,5 @@ export { getLanguageFromCookie, setLanguageCookie, isSupportedLanguage, getBrows
8
8
  export { LanguageSwitcher } from './components/LanguageSwitcher.js';
9
9
  // Re-export react-i18next for convenience
10
10
  export { useTranslation, Trans, Translation } from 'react-i18next';
11
+ // CountryLanguageSelector — re-exported so consumers only install @asafarim/shared-i18n
12
+ export { CountryLanguageSelector, defaultCountries, useCountryLanguage, filterCountries, } from '@asafarim/country-language-selector';