arevdata 0.1.17

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 (289) hide show
  1. package/README.md +499 -0
  2. package/dist/arevdata.cjs +38955 -0
  3. package/dist/arevdata.cjs.map +1 -0
  4. package/dist/arevdata.js +38955 -0
  5. package/dist/arevdata.js.map +1 -0
  6. package/dist/assets/flags/LICENSE.flag-icons.txt +21 -0
  7. package/dist/assets/flags/README.md +11 -0
  8. package/dist/assets/flags/index.html +88 -0
  9. package/dist/assets/flags/overrides/xn.svg +6 -0
  10. package/dist/assets/flags/svg/ad.svg +150 -0
  11. package/dist/assets/flags/svg/ae.svg +6 -0
  12. package/dist/assets/flags/svg/af.svg +81 -0
  13. package/dist/assets/flags/svg/ag.svg +14 -0
  14. package/dist/assets/flags/svg/al.svg +5 -0
  15. package/dist/assets/flags/svg/am.svg +5 -0
  16. package/dist/assets/flags/svg/ao.svg +13 -0
  17. package/dist/assets/flags/svg/ar.svg +32 -0
  18. package/dist/assets/flags/svg/at.svg +4 -0
  19. package/dist/assets/flags/svg/au.svg +8 -0
  20. package/dist/assets/flags/svg/az.svg +8 -0
  21. package/dist/assets/flags/svg/ba.svg +12 -0
  22. package/dist/assets/flags/svg/bb.svg +6 -0
  23. package/dist/assets/flags/svg/bd.svg +4 -0
  24. package/dist/assets/flags/svg/be.svg +7 -0
  25. package/dist/assets/flags/svg/bf.svg +7 -0
  26. package/dist/assets/flags/svg/bg.svg +5 -0
  27. package/dist/assets/flags/svg/bh.svg +4 -0
  28. package/dist/assets/flags/svg/bi.svg +15 -0
  29. package/dist/assets/flags/svg/bj.svg +14 -0
  30. package/dist/assets/flags/svg/bn.svg +36 -0
  31. package/dist/assets/flags/svg/bo.svg +673 -0
  32. package/dist/assets/flags/svg/br.svg +45 -0
  33. package/dist/assets/flags/svg/bs.svg +13 -0
  34. package/dist/assets/flags/svg/bt.svg +89 -0
  35. package/dist/assets/flags/svg/bw.svg +7 -0
  36. package/dist/assets/flags/svg/by.svg +18 -0
  37. package/dist/assets/flags/svg/bz.svg +145 -0
  38. package/dist/assets/flags/svg/ca.svg +4 -0
  39. package/dist/assets/flags/svg/cd.svg +5 -0
  40. package/dist/assets/flags/svg/cf.svg +15 -0
  41. package/dist/assets/flags/svg/cg.svg +12 -0
  42. package/dist/assets/flags/svg/ch.svg +9 -0
  43. package/dist/assets/flags/svg/cl.svg +13 -0
  44. package/dist/assets/flags/svg/cm.svg +15 -0
  45. package/dist/assets/flags/svg/cn.svg +11 -0
  46. package/dist/assets/flags/svg/co.svg +7 -0
  47. package/dist/assets/flags/svg/cr.svg +7 -0
  48. package/dist/assets/flags/svg/cu.svg +13 -0
  49. package/dist/assets/flags/svg/cv.svg +13 -0
  50. package/dist/assets/flags/svg/cy.svg +6 -0
  51. package/dist/assets/flags/svg/cz.svg +5 -0
  52. package/dist/assets/flags/svg/de.svg +5 -0
  53. package/dist/assets/flags/svg/dj.svg +13 -0
  54. package/dist/assets/flags/svg/dk.svg +5 -0
  55. package/dist/assets/flags/svg/dm.svg +152 -0
  56. package/dist/assets/flags/svg/do.svg +121 -0
  57. package/dist/assets/flags/svg/dz.svg +5 -0
  58. package/dist/assets/flags/svg/ec.svg +138 -0
  59. package/dist/assets/flags/svg/ee.svg +5 -0
  60. package/dist/assets/flags/svg/eg.svg +38 -0
  61. package/dist/assets/flags/svg/er.svg +8 -0
  62. package/dist/assets/flags/svg/es.svg +544 -0
  63. package/dist/assets/flags/svg/et.svg +14 -0
  64. package/dist/assets/flags/svg/fi.svg +5 -0
  65. package/dist/assets/flags/svg/fj.svg +120 -0
  66. package/dist/assets/flags/svg/fm.svg +11 -0
  67. package/dist/assets/flags/svg/fr.svg +5 -0
  68. package/dist/assets/flags/svg/ga.svg +7 -0
  69. package/dist/assets/flags/svg/gb.svg +7 -0
  70. package/dist/assets/flags/svg/gd.svg +27 -0
  71. package/dist/assets/flags/svg/ge.svg +6 -0
  72. package/dist/assets/flags/svg/gh.svg +6 -0
  73. package/dist/assets/flags/svg/gm.svg +14 -0
  74. package/dist/assets/flags/svg/gn.svg +7 -0
  75. package/dist/assets/flags/svg/gq.svg +23 -0
  76. package/dist/assets/flags/svg/gr.svg +16 -0
  77. package/dist/assets/flags/svg/gt.svg +204 -0
  78. package/dist/assets/flags/svg/gw.svg +13 -0
  79. package/dist/assets/flags/svg/gy.svg +9 -0
  80. package/dist/assets/flags/svg/hn.svg +18 -0
  81. package/dist/assets/flags/svg/hr.svg +58 -0
  82. package/dist/assets/flags/svg/ht.svg +116 -0
  83. package/dist/assets/flags/svg/hu.svg +7 -0
  84. package/dist/assets/flags/svg/id.svg +4 -0
  85. package/dist/assets/flags/svg/ie.svg +7 -0
  86. package/dist/assets/flags/svg/il.svg +14 -0
  87. package/dist/assets/flags/svg/in.svg +25 -0
  88. package/dist/assets/flags/svg/iq.svg +10 -0
  89. package/dist/assets/flags/svg/ir.svg +219 -0
  90. package/dist/assets/flags/svg/is.svg +12 -0
  91. package/dist/assets/flags/svg/it.svg +7 -0
  92. package/dist/assets/flags/svg/jm.svg +8 -0
  93. package/dist/assets/flags/svg/jo.svg +16 -0
  94. package/dist/assets/flags/svg/jp.svg +11 -0
  95. package/dist/assets/flags/svg/ke.svg +23 -0
  96. package/dist/assets/flags/svg/kg.svg +4 -0
  97. package/dist/assets/flags/svg/kh.svg +61 -0
  98. package/dist/assets/flags/svg/ki.svg +36 -0
  99. package/dist/assets/flags/svg/km.svg +16 -0
  100. package/dist/assets/flags/svg/kn.svg +14 -0
  101. package/dist/assets/flags/svg/kp.svg +15 -0
  102. package/dist/assets/flags/svg/kr.svg +24 -0
  103. package/dist/assets/flags/svg/kw.svg +13 -0
  104. package/dist/assets/flags/svg/kz.svg +36 -0
  105. package/dist/assets/flags/svg/la.svg +12 -0
  106. package/dist/assets/flags/svg/lb.svg +15 -0
  107. package/dist/assets/flags/svg/lc.svg +8 -0
  108. package/dist/assets/flags/svg/li.svg +43 -0
  109. package/dist/assets/flags/svg/lk.svg +22 -0
  110. package/dist/assets/flags/svg/lr.svg +14 -0
  111. package/dist/assets/flags/svg/ls.svg +8 -0
  112. package/dist/assets/flags/svg/lt.svg +7 -0
  113. package/dist/assets/flags/svg/lu.svg +5 -0
  114. package/dist/assets/flags/svg/lv.svg +6 -0
  115. package/dist/assets/flags/svg/ly.svg +13 -0
  116. package/dist/assets/flags/svg/ma.svg +4 -0
  117. package/dist/assets/flags/svg/mc.svg +6 -0
  118. package/dist/assets/flags/svg/md.svg +70 -0
  119. package/dist/assets/flags/svg/me.svg +116 -0
  120. package/dist/assets/flags/svg/mg.svg +7 -0
  121. package/dist/assets/flags/svg/mh.svg +7 -0
  122. package/dist/assets/flags/svg/mk.svg +5 -0
  123. package/dist/assets/flags/svg/ml.svg +7 -0
  124. package/dist/assets/flags/svg/mm.svg +12 -0
  125. package/dist/assets/flags/svg/mn.svg +14 -0
  126. package/dist/assets/flags/svg/mr.svg +6 -0
  127. package/dist/assets/flags/svg/mt.svg +58 -0
  128. package/dist/assets/flags/svg/mu.svg +8 -0
  129. package/dist/assets/flags/svg/mv.svg +6 -0
  130. package/dist/assets/flags/svg/mw.svg +10 -0
  131. package/dist/assets/flags/svg/mx.svg +382 -0
  132. package/dist/assets/flags/svg/my.svg +26 -0
  133. package/dist/assets/flags/svg/mz.svg +21 -0
  134. package/dist/assets/flags/svg/na.svg +16 -0
  135. package/dist/assets/flags/svg/ne.svg +6 -0
  136. package/dist/assets/flags/svg/ng.svg +6 -0
  137. package/dist/assets/flags/svg/ni.svg +129 -0
  138. package/dist/assets/flags/svg/nl.svg +5 -0
  139. package/dist/assets/flags/svg/no.svg +7 -0
  140. package/dist/assets/flags/svg/np.svg +13 -0
  141. package/dist/assets/flags/svg/nr.svg +12 -0
  142. package/dist/assets/flags/svg/nz.svg +36 -0
  143. package/dist/assets/flags/svg/om.svg +115 -0
  144. package/dist/assets/flags/svg/pa.svg +14 -0
  145. package/dist/assets/flags/svg/pe.svg +4 -0
  146. package/dist/assets/flags/svg/pg.svg +9 -0
  147. package/dist/assets/flags/svg/ph.svg +6 -0
  148. package/dist/assets/flags/svg/pk.svg +15 -0
  149. package/dist/assets/flags/svg/pl.svg +6 -0
  150. package/dist/assets/flags/svg/ps.svg +6 -0
  151. package/dist/assets/flags/svg/pt.svg +57 -0
  152. package/dist/assets/flags/svg/pw.svg +11 -0
  153. package/dist/assets/flags/svg/py.svg +157 -0
  154. package/dist/assets/flags/svg/qa.svg +4 -0
  155. package/dist/assets/flags/svg/ro.svg +7 -0
  156. package/dist/assets/flags/svg/rs.svg +292 -0
  157. package/dist/assets/flags/svg/ru.svg +5 -0
  158. package/dist/assets/flags/svg/rw.svg +13 -0
  159. package/dist/assets/flags/svg/sa.svg +25 -0
  160. package/dist/assets/flags/svg/sb.svg +13 -0
  161. package/dist/assets/flags/svg/sc.svg +7 -0
  162. package/dist/assets/flags/svg/sd.svg +13 -0
  163. package/dist/assets/flags/svg/se.svg +4 -0
  164. package/dist/assets/flags/svg/sg.svg +13 -0
  165. package/dist/assets/flags/svg/si.svg +18 -0
  166. package/dist/assets/flags/svg/sk.svg +9 -0
  167. package/dist/assets/flags/svg/sl.svg +7 -0
  168. package/dist/assets/flags/svg/sm.svg +75 -0
  169. package/dist/assets/flags/svg/sn.svg +8 -0
  170. package/dist/assets/flags/svg/so.svg +11 -0
  171. package/dist/assets/flags/svg/sr.svg +6 -0
  172. package/dist/assets/flags/svg/ss.svg +8 -0
  173. package/dist/assets/flags/svg/st.svg +16 -0
  174. package/dist/assets/flags/svg/sv.svg +593 -0
  175. package/dist/assets/flags/svg/sy.svg +6 -0
  176. package/dist/assets/flags/svg/sz.svg +34 -0
  177. package/dist/assets/flags/svg/td.svg +7 -0
  178. package/dist/assets/flags/svg/tg.svg +14 -0
  179. package/dist/assets/flags/svg/th.svg +7 -0
  180. package/dist/assets/flags/svg/tj.svg +22 -0
  181. package/dist/assets/flags/svg/tl.svg +13 -0
  182. package/dist/assets/flags/svg/tm.svg +204 -0
  183. package/dist/assets/flags/svg/tn.svg +4 -0
  184. package/dist/assets/flags/svg/to.svg +10 -0
  185. package/dist/assets/flags/svg/tr.svg +8 -0
  186. package/dist/assets/flags/svg/tt.svg +5 -0
  187. package/dist/assets/flags/svg/tv.svg +9 -0
  188. package/dist/assets/flags/svg/tw.svg +34 -0
  189. package/dist/assets/flags/svg/tz.svg +13 -0
  190. package/dist/assets/flags/svg/ua.svg +6 -0
  191. package/dist/assets/flags/svg/ug.svg +30 -0
  192. package/dist/assets/flags/svg/us.svg +9 -0
  193. package/dist/assets/flags/svg/uy.svg +28 -0
  194. package/dist/assets/flags/svg/uz.svg +30 -0
  195. package/dist/assets/flags/svg/va.svg +190 -0
  196. package/dist/assets/flags/svg/vc.svg +8 -0
  197. package/dist/assets/flags/svg/ve.svg +26 -0
  198. package/dist/assets/flags/svg/vn.svg +11 -0
  199. package/dist/assets/flags/svg/vu.svg +21 -0
  200. package/dist/assets/flags/svg/ws.svg +7 -0
  201. package/dist/assets/flags/svg/xk.svg +5 -0
  202. package/dist/assets/flags/svg/xn.svg +6 -0
  203. package/dist/assets/flags/svg/ye.svg +7 -0
  204. package/dist/assets/flags/svg/za.svg +17 -0
  205. package/dist/assets/flags/svg/zm.svg +27 -0
  206. package/dist/assets/flags/svg/zw.svg +21 -0
  207. package/dist/data/languages/index.html +86 -0
  208. package/dist/docs/api-worker-plan/index.html +439 -0
  209. package/dist/docs/cities/index.html +193 -0
  210. package/dist/docs/continents-currencies/index.html +306 -0
  211. package/dist/docs/countries/index.html +274 -0
  212. package/dist/docs/country-maps/index.html +262 -0
  213. package/dist/docs/flags/index.html +300 -0
  214. package/dist/docs/geography/index.html +454 -0
  215. package/dist/docs/languages/index.html +304 -0
  216. package/dist/docs/phone-codes/index.html +152 -0
  217. package/dist/docs/states/index.html +334 -0
  218. package/dist/docs/world-map/index.html +345 -0
  219. package/dist/examples/vue-app/index.html +208 -0
  220. package/dist/index.html +784 -0
  221. package/dist/robots.txt +2 -0
  222. package/dist/style/app.css +1 -0
  223. package/dist/types/__tests__/cities.test.d.ts +1 -0
  224. package/dist/types/__tests__/continents.test.d.ts +1 -0
  225. package/dist/types/__tests__/countries.test.d.ts +1 -0
  226. package/dist/types/__tests__/countryMaps.test.d.ts +1 -0
  227. package/dist/types/__tests__/geography.test.d.ts +1 -0
  228. package/dist/types/__tests__/index.test.d.ts +1 -0
  229. package/dist/types/__tests__/phoneCodes.test.d.ts +1 -0
  230. package/dist/types/__tests__/states.test.d.ts +1 -0
  231. package/dist/types/__tests__/translations.test.d.ts +1 -0
  232. package/dist/types/api/index.d.ts +5 -0
  233. package/dist/types/api/index.test.d.ts +1 -0
  234. package/dist/types/api/query.d.ts +3 -0
  235. package/dist/types/api/response.d.ts +16 -0
  236. package/dist/types/api/router.d.ts +1 -0
  237. package/dist/types/api/routes/cities.d.ts +2 -0
  238. package/dist/types/api/routes/countries.d.ts +2 -0
  239. package/dist/types/api/routes/health.d.ts +1 -0
  240. package/dist/types/api/routes/maps.d.ts +1 -0
  241. package/dist/types/api/routes/meta.d.ts +1 -0
  242. package/dist/types/api/routes/phoneCodes.d.ts +1 -0
  243. package/dist/types/data/cities.d.ts +22 -0
  244. package/dist/types/data/continents.d.ts +9 -0
  245. package/dist/types/data/countries.d.ts +23 -0
  246. package/dist/types/data/countryMaps.d.ts +104 -0
  247. package/dist/types/data/currencies.d.ts +13 -0
  248. package/dist/types/data/flags.d.ts +37 -0
  249. package/dist/types/data/geography.d.ts +48 -0
  250. package/dist/types/data/languages/index.d.ts +2 -0
  251. package/dist/types/data/languages/language.test.d.ts +1 -0
  252. package/dist/types/data/languages/languageData.d.ts +6 -0
  253. package/dist/types/data/languages/languageFunctions.d.ts +43 -0
  254. package/dist/types/data/languages/translations/ar.d.ts +1189 -0
  255. package/dist/types/data/languages/translations/de.d.ts +1189 -0
  256. package/dist/types/data/languages/translations/es.d.ts +1189 -0
  257. package/dist/types/data/languages/translations/fr.d.ts +1189 -0
  258. package/dist/types/data/languages/translations/hi.d.ts +1189 -0
  259. package/dist/types/data/languages/translations/it.d.ts +1189 -0
  260. package/dist/types/data/languages/translations/ja.d.ts +1189 -0
  261. package/dist/types/data/languages/translations/ko.d.ts +1189 -0
  262. package/dist/types/data/languages/translations/nl.d.ts +1189 -0
  263. package/dist/types/data/languages/translations/pl.d.ts +1189 -0
  264. package/dist/types/data/languages/translations/pt.d.ts +1189 -0
  265. package/dist/types/data/languages/translations/ru.d.ts +1189 -0
  266. package/dist/types/data/languages/translations/tr.d.ts +1189 -0
  267. package/dist/types/data/languages/translations/zh.d.ts +1189 -0
  268. package/dist/types/data/phoneCodes.d.ts +16 -0
  269. package/dist/types/data/states.d.ts +18 -0
  270. package/dist/types/data/translations/ar.d.ts +1832 -0
  271. package/dist/types/data/translations/de.d.ts +2005 -0
  272. package/dist/types/data/translations/es.d.ts +1852 -0
  273. package/dist/types/data/translations/fr.d.ts +1860 -0
  274. package/dist/types/data/translations/hi.d.ts +1816 -0
  275. package/dist/types/data/translations/it.d.ts +1824 -0
  276. package/dist/types/data/translations/ja.d.ts +1833 -0
  277. package/dist/types/data/translations/ko.d.ts +1832 -0
  278. package/dist/types/data/translations/nl.d.ts +1826 -0
  279. package/dist/types/data/translations/pl.d.ts +1818 -0
  280. package/dist/types/data/translations/pt.d.ts +1829 -0
  281. package/dist/types/data/translations/ru.d.ts +1838 -0
  282. package/dist/types/data/translations/tr.d.ts +1818 -0
  283. package/dist/types/data/translations/zh.d.ts +1834 -0
  284. package/dist/types/data/translations.d.ts +73 -0
  285. package/dist/types/data/worldMap.d.ts +122 -0
  286. package/dist/types/index.d.ts +33 -0
  287. package/dist/types/types/index.d.ts +348 -0
  288. package/dist/types/utils/geo.d.ts +101 -0
  289. package/package.json +67 -0
@@ -0,0 +1,454 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ <meta name="type" content="content">
6
+ <title>Geography Data &amp;amp; Geo Utilities</title>
7
+ <link href="/style/app.css" rel="stylesheet" type="text/css">
8
+ </head>
9
+ <body class="page--geography">
10
+ <div class="page-container">
11
+ <header class="header">
12
+ <div class="header__container">
13
+ </div>
14
+ </header>
15
+ <main class="main">
16
+ <section class="section">
17
+ <div class="container">
18
+ <div class="content"><h1 id="geography-data-%26-geo-utilities" tabindex="-1">Geography Data &amp; Geo Utilities</h1>
19
+ <p><a href="../README.md">← Back to README</a></p>
20
+ <p><code>arev</code> includes a complete geographic dataset for every country and a set of utility functions designed for <strong>geography games</strong> (Wordle-style country guessing, atlas quizzes, educational tools) and <strong>location-aware UIs</strong>.</p>
21
+ <h2 id="import" tabindex="-1">Import</h2>
22
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span>
23
+ <span class="token comment">// Data</span>
24
+ countryGeography<span class="token punctuation">,</span>
25
+ <span class="token comment">// Lookup helpers</span>
26
+ getCountryGeography<span class="token punctuation">,</span>
27
+ getLandlockedCountries<span class="token punctuation">,</span>
28
+ getCountriesByClimate<span class="token punctuation">,</span>
29
+ getNeighbors<span class="token punctuation">,</span>
30
+ <span class="token comment">// Geo utilities</span>
31
+ haversineDistance<span class="token punctuation">,</span>
32
+ bearing<span class="token punctuation">,</span>
33
+ bearingToCardinal<span class="token punctuation">,</span>
34
+ getDistanceBetweenCountries<span class="token punctuation">,</span>
35
+ getDirectionBetweenCountries<span class="token punctuation">,</span>
36
+ compareTemperature<span class="token punctuation">,</span>
37
+ compareSize<span class="token punctuation">,</span>
38
+ getHemisphere<span class="token punctuation">,</span>
39
+ getGeoHints<span class="token punctuation">,</span>
40
+ <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
41
+
42
+ <span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span>
43
+ CountryGeography<span class="token punctuation">,</span>
44
+ CountryBounds<span class="token punctuation">,</span>
45
+ ClimateZone<span class="token punctuation">,</span>
46
+ CardinalDirection<span class="token punctuation">,</span>
47
+ GeoHint<span class="token punctuation">,</span>
48
+ <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
49
+ </code></pre>
50
+ <hr>
51
+ <h2 id="country-geography-data" tabindex="-1">Country Geography Data</h2>
52
+ <h3 id="data-shape" tabindex="-1">Data shape</h3>
53
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">interface</span> <span class="token class-name">CountryGeography</span> <span class="token punctuation">{</span>
54
+ alpha2<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> <span class="token comment">// "DE"</span>
55
+ lat<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Centroid latitude — geographic centre of the country</span>
56
+ lon<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Centroid longitude</span>
57
+ bounds<span class="token operator">:</span> <span class="token punctuation">{</span>
58
+ north<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Northernmost point</span>
59
+ south<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Southernmost point</span>
60
+ east<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Easternmost point</span>
61
+ west<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Westernmost point</span>
62
+ <span class="token punctuation">}</span><span class="token punctuation">;</span>
63
+ area<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Land area in km²</span>
64
+ landlocked<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span> <span class="token comment">// true if the country has no coastline</span>
65
+ neighbors<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Alpha-2 codes of bordering countries</span>
66
+ climate<span class="token operator">:</span> ClimateZone<span class="token punctuation">;</span> <span class="token comment">// Simplified Köppen classification</span>
67
+ avgTemperature<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// Mean annual temperature in °C</span>
68
+ <span class="token punctuation">}</span>
69
+
70
+ <span class="token keyword">type</span> <span class="token class-name">ClimateZone</span> <span class="token operator">=</span>
71
+ <span class="token operator">|</span> <span class="token string">"tropical"</span> <span class="token comment">// Near equator, high humidity, >18 °C year-round</span>
72
+ <span class="token operator">|</span> <span class="token string">"subtropical"</span> <span class="token comment">// 15–30° latitude, warm, seasonal rainfall</span>
73
+ <span class="token operator">|</span> <span class="token string">"arid"</span> <span class="token comment">// Desert / semi-arid, low precipitation</span>
74
+ <span class="token operator">|</span> <span class="token string">"mediterranean"</span> <span class="token comment">// Hot dry summers, mild wet winters</span>
75
+ <span class="token operator">|</span> <span class="token string">"temperate"</span> <span class="token comment">// Moderate seasons, adequate rainfall</span>
76
+ <span class="token operator">|</span> <span class="token string">"continental"</span> <span class="token comment">// Cold winters, warm summers, interior regions</span>
77
+ <span class="token operator">|</span> <span class="token string">"subarctic"</span> <span class="token comment">// Very cold winters, short summers</span>
78
+ <span class="token operator">|</span> <span class="token string">"arctic"</span><span class="token punctuation">;</span> <span class="token comment">// Polar, permanent ice/snow</span>
79
+ </code></pre>
80
+ <h3 id="accessing-geography-data" tabindex="-1">Accessing geography data</h3>
81
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getCountryGeography<span class="token punctuation">,</span> countryGeography <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
82
+
83
+ <span class="token comment">// Look up by alpha-2</span>
84
+ <span class="token keyword">const</span> de <span class="token operator">=</span> <span class="token function">getCountryGeography</span><span class="token punctuation">(</span><span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
85
+ <span class="token comment">// {</span>
86
+ <span class="token comment">// alpha2: "DE",</span>
87
+ <span class="token comment">// lat: 51.17, lon: 10.45,</span>
88
+ <span class="token comment">// bounds: { north: 55.06, south: 47.27, east: 15.04, west: 5.99 },</span>
89
+ <span class="token comment">// area: 357114,</span>
90
+ <span class="token comment">// landlocked: false,</span>
91
+ <span class="token comment">// neighbors: ["DK","NL","BE","LU","FR","CH","AT","CZ","PL"],</span>
92
+ <span class="token comment">// climate: "temperate",</span>
93
+ <span class="token comment">// avgTemperature: 9,</span>
94
+ <span class="token comment">// }</span>
95
+
96
+ <span class="token comment">// Full array</span>
97
+ <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>countryGeography<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ~195</span>
98
+ </code></pre>
99
+ <h3 id="landlocked-countries" tabindex="-1">Landlocked countries</h3>
100
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getLandlockedCountries <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
101
+
102
+ <span class="token keyword">const</span> landlocked <span class="token operator">=</span> <span class="token function">getLandlockedCountries</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
103
+ <span class="token keyword">const</span> codes <span class="token operator">=</span> landlocked<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span>g <span class="token operator">=></span> g<span class="token punctuation">.</span>alpha2<span class="token punctuation">)</span><span class="token punctuation">;</span>
104
+ <span class="token comment">// ["AF", "AD", "AM", "AT", "AZ", "BY", "BT", "BO", "BW", "BF", "BI",</span>
105
+ <span class="token comment">// "CF", "TD", "CZ", "ET", "HU", "KZ", "XK", "KG", "LA", "LS", "LI",</span>
106
+ <span class="token comment">// "LT", "LU", "MW", "ML", "MD", "MN", "NP", "NE", "MK", "PY", "RW",</span>
107
+ <span class="token comment">// "SM", "RS", "SK", "SS", "SZ", "CH", "TJ", "TM", "UG", "UZ", "VA",</span>
108
+ <span class="token comment">// "ZM", "ZW"] — ~45 countries</span>
109
+ </code></pre>
110
+ <h3 id="countries-by-climate-zone" tabindex="-1">Countries by climate zone</h3>
111
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getCountriesByClimate <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
112
+
113
+ <span class="token comment">// Tropical countries</span>
114
+ <span class="token function">getCountriesByClimate</span><span class="token punctuation">(</span><span class="token string">"tropical"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span>g <span class="token operator">=></span> g<span class="token punctuation">.</span>alpha2<span class="token punctuation">)</span><span class="token punctuation">;</span>
115
+ <span class="token comment">// ["AO", "BJ", "BF", "BI", "CM", "CF", "CI", "CD", "CG", "ET", ...]</span>
116
+
117
+ <span class="token comment">// Countries with arctic climate</span>
118
+ <span class="token function">getCountriesByClimate</span><span class="token punctuation">(</span><span class="token string">"arctic"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
119
+ <span class="token comment">// Polar/extreme-north countries</span>
120
+ </code></pre>
121
+ <h3 id="neighbouring-countries" tabindex="-1">Neighbouring countries</h3>
122
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getNeighbors <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
123
+
124
+ <span class="token keyword">const</span> franceNeighbors <span class="token operator">=</span> <span class="token function">getNeighbors</span><span class="token punctuation">(</span><span class="token string">"FR"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
125
+ <span class="token comment">// Returns CountryGeography[] for: ES, AD, MC, IT, CH, DE, LU, BE</span>
126
+
127
+ <span class="token comment">// Island countries return []</span>
128
+ <span class="token function">getNeighbors</span><span class="token punctuation">(</span><span class="token string">"JP"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// []</span>
129
+ <span class="token function">getNeighbors</span><span class="token punctuation">(</span><span class="token string">"AU"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// []</span>
130
+ </code></pre>
131
+ <hr>
132
+ <h2 id="geo-utility-functions" tabindex="-1">Geo Utility Functions</h2>
133
+ <h3 id="distance-between-countries" tabindex="-1">Distance between countries</h3>
134
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getDistanceBetweenCountries<span class="token punctuation">,</span> haversineDistance <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
135
+
136
+ <span class="token comment">// By alpha-2 code (uses country centroids)</span>
137
+ <span class="token function">getDistanceBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"NL"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ~393 km</span>
138
+ <span class="token function">getDistanceBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"US"</span><span class="token punctuation">,</span> <span class="token string">"AU"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ~15,200 km</span>
139
+ <span class="token function">getDistanceBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"FR"</span><span class="token punctuation">,</span> <span class="token string">"FR"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 0</span>
140
+ <span class="token function">getDistanceBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"XX"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// null — unknown code</span>
141
+
142
+ <span class="token comment">// Raw coordinates</span>
143
+ <span class="token function">haversineDistance</span><span class="token punctuation">(</span><span class="token number">52.37</span><span class="token punctuation">,</span> <span class="token number">4.90</span><span class="token punctuation">,</span> <span class="token number">52.52</span><span class="token punctuation">,</span> <span class="token number">13.40</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Amsterdam → Berlin ≈ 577 km</span>
144
+ </code></pre>
145
+ <h3 id="direction-between-countries" tabindex="-1">Direction between countries</h3>
146
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span>
147
+ getDirectionBetweenCountries<span class="token punctuation">,</span>
148
+ bearing<span class="token punctuation">,</span>
149
+ bearingToCardinal<span class="token punctuation">,</span>
150
+ <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
151
+
152
+ <span class="token comment">// By alpha-2 code</span>
153
+ <span class="token function">getDirectionBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"FR"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "NE"</span>
154
+ <span class="token function">getDirectionBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"US"</span><span class="token punctuation">,</span> <span class="token string">"GB"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "NE"</span>
155
+ <span class="token function">getDirectionBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"AU"</span><span class="token punctuation">,</span> <span class="token string">"NZ"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "E"</span>
156
+ <span class="token function">getDirectionBetweenCountries</span><span class="token punctuation">(</span><span class="token string">"XX"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// null</span>
157
+
158
+ <span class="token comment">// Raw bearing (degrees, 0 = north, clockwise)</span>
159
+ <span class="token keyword">const</span> deg <span class="token operator">=</span> <span class="token function">bearing</span><span class="token punctuation">(</span><span class="token number">52.37</span><span class="token punctuation">,</span> <span class="token number">4.90</span><span class="token punctuation">,</span> <span class="token number">52.52</span><span class="token punctuation">,</span> <span class="token number">13.40</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ~88° (almost due east)</span>
160
+ <span class="token function">bearingToCardinal</span><span class="token punctuation">(</span>deg<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "E"</span>
161
+
162
+ <span class="token comment">// CardinalDirection values</span>
163
+ <span class="token keyword">type</span> <span class="token class-name">CardinalDirection</span> <span class="token operator">=</span> <span class="token string">"N"</span> <span class="token operator">|</span> <span class="token string">"NE"</span> <span class="token operator">|</span> <span class="token string">"E"</span> <span class="token operator">|</span> <span class="token string">"SE"</span> <span class="token operator">|</span> <span class="token string">"S"</span> <span class="token operator">|</span> <span class="token string">"SW"</span> <span class="token operator">|</span> <span class="token string">"W"</span> <span class="token operator">|</span> <span class="token string">"NW"</span><span class="token punctuation">;</span>
164
+ </code></pre>
165
+ <h3 id="temperature-comparison" tabindex="-1">Temperature comparison</h3>
166
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> compareTemperature <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
167
+
168
+ <span class="token function">compareTemperature</span><span class="token punctuation">(</span><span class="token string">"CA"</span><span class="token punctuation">,</span> <span class="token string">"BR"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "hotter" — Brazil (24°C) vs Canada (-5°C)</span>
169
+ <span class="token function">compareTemperature</span><span class="token punctuation">(</span><span class="token string">"BR"</span><span class="token punctuation">,</span> <span class="token string">"CA"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "colder"</span>
170
+ <span class="token function">compareTemperature</span><span class="token punctuation">(</span><span class="token string">"FR"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "similar" — both temperate, within 3 °C</span>
171
+ <span class="token function">compareTemperature</span><span class="token punctuation">(</span><span class="token string">"XX"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// null</span>
172
+ </code></pre>
173
+ <p>Threshold: differences ≤ 3 °C return <code>&quot;similar&quot;</code>.</p>
174
+ <h3 id="size-comparison" tabindex="-1">Size comparison</h3>
175
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> compareSize <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
176
+
177
+ <span class="token function">compareSize</span><span class="token punctuation">(</span><span class="token string">"NL"</span><span class="token punctuation">,</span> <span class="token string">"RU"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "larger" — Russia (17M km²) vs Netherlands (42k km²)</span>
178
+ <span class="token function">compareSize</span><span class="token punctuation">(</span><span class="token string">"RU"</span><span class="token punctuation">,</span> <span class="token string">"NL"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "smaller"</span>
179
+ <span class="token function">compareSize</span><span class="token punctuation">(</span><span class="token string">"DE"</span><span class="token punctuation">,</span> <span class="token string">"FR"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "similar" — within 20% of each other</span>
180
+ <span class="token function">compareSize</span><span class="token punctuation">(</span><span class="token string">"XX"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// null</span>
181
+ </code></pre>
182
+ <p>Threshold: area ratio within 0.8–1.2 returns <code>&quot;similar&quot;</code>.</p>
183
+ <h3 id="hemisphere" tabindex="-1">Hemisphere</h3>
184
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getHemisphere <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
185
+
186
+ <span class="token function">getHemisphere</span><span class="token punctuation">(</span><span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
187
+ <span class="token comment">// { ns: "Northern", ew: "Eastern" }</span>
188
+
189
+ <span class="token function">getHemisphere</span><span class="token punctuation">(</span><span class="token string">"AR"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
190
+ <span class="token comment">// { ns: "Southern", ew: "Western" }</span>
191
+
192
+ <span class="token function">getHemisphere</span><span class="token punctuation">(</span><span class="token string">"XX"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// null</span>
193
+ </code></pre>
194
+ <hr>
195
+ <h2 id="geography-game-hints" tabindex="-1">Geography Game Hints</h2>
196
+ <p><code>getGeoHints()</code> is the primary function for building Wordle-style geography games. Given a player’s guess and the secret target country, it returns all relevant hints in one object.</p>
197
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getGeoHints <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
198
+ <span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span> GeoHint <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
199
+
200
+ <span class="token keyword">interface</span> <span class="token class-name">GeoHint</span> <span class="token punctuation">{</span>
201
+ distanceKm<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> <span class="token comment">// km between centroids</span>
202
+ direction<span class="token operator">:</span> CardinalDirection<span class="token punctuation">;</span> <span class="token comment">// "N"|"NE"|"E"|"SE"|"S"|"SW"|"W"|"NW"</span>
203
+ temperature<span class="token operator">:</span> <span class="token string">"hotter"</span> <span class="token operator">|</span> <span class="token string">"colder"</span> <span class="token operator">|</span> <span class="token string">"similar"</span><span class="token punctuation">;</span> <span class="token comment">// target vs. guess</span>
204
+ size<span class="token operator">:</span> <span class="token string">"larger"</span> <span class="token operator">|</span> <span class="token string">"smaller"</span> <span class="token operator">|</span> <span class="token string">"similar"</span><span class="token punctuation">;</span> <span class="token comment">// target vs. guess</span>
205
+ hemisphere<span class="token operator">:</span> <span class="token punctuation">{</span> ns<span class="token operator">:</span> <span class="token string">"Northern"</span><span class="token operator">|</span><span class="token string">"Southern"</span><span class="token punctuation">;</span> ew<span class="token operator">:</span> <span class="token string">"Eastern"</span><span class="token operator">|</span><span class="token string">"Western"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
206
+ landlocked<span class="token operator">:</span> <span class="token builtin">boolean</span><span class="token punctuation">;</span> <span class="token comment">// is the target landlocked?</span>
207
+ climate<span class="token operator">:</span> ClimateZone<span class="token punctuation">;</span> <span class="token comment">// target's climate zone</span>
208
+ <span class="token punctuation">}</span>
209
+ </code></pre>
210
+ <h3 id="example%3A-single-guess" tabindex="-1">Example: single guess</h3>
211
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">const</span> hints <span class="token operator">=</span> <span class="token function">getGeoHints</span><span class="token punctuation">(</span><span class="token string">"NL"</span><span class="token punctuation">,</span> <span class="token string">"DE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
212
+ <span class="token comment">// {</span>
213
+ <span class="token comment">// distanceKm: 393,</span>
214
+ <span class="token comment">// direction: "E",</span>
215
+ <span class="token comment">// temperature: "similar",</span>
216
+ <span class="token comment">// size: "larger",</span>
217
+ <span class="token comment">// hemisphere: { ns: "Northern", ew: "Eastern" },</span>
218
+ <span class="token comment">// landlocked: false,</span>
219
+ <span class="token comment">// climate: "temperate",</span>
220
+ <span class="token comment">// }</span>
221
+ </code></pre>
222
+ <h3 id="example%3A-geography-guessing-game-loop" tabindex="-1">Example: geography guessing game loop</h3>
223
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> countries<span class="token punctuation">,</span> getGeoHints <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
224
+
225
+ <span class="token comment">// Pick a random target country</span>
226
+ <span class="token keyword">const</span> target <span class="token operator">=</span> countries<span class="token punctuation">[</span>Math<span class="token punctuation">.</span><span class="token function">floor</span><span class="token punctuation">(</span>Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> countries<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
227
+
228
+ <span class="token comment">// Each round: player submits a guess</span>
229
+ <span class="token keyword">function</span> <span class="token function">processGuess</span><span class="token punctuation">(</span>guessAlpha2<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
230
+ <span class="token keyword">const</span> hints <span class="token operator">=</span> <span class="token function">getGeoHints</span><span class="token punctuation">(</span>guessAlpha2<span class="token punctuation">,</span> target<span class="token punctuation">.</span>alpha2<span class="token punctuation">)</span><span class="token punctuation">;</span>
231
+ <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>hints<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">"Unknown country code"</span><span class="token punctuation">;</span>
232
+
233
+ <span class="token keyword">if</span> <span class="token punctuation">(</span>hints<span class="token punctuation">.</span>distanceKm <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
234
+ <span class="token keyword">return</span> <span class="token string">"🎉 Correct!"</span><span class="token punctuation">;</span>
235
+ <span class="token punctuation">}</span>
236
+
237
+ <span class="token keyword">return</span> <span class="token punctuation">[</span>
238
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">📍 </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>distanceKm<span class="token punctuation">.</span><span class="token function">toLocaleString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> km away</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
239
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">🧭 Head </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>direction<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> (</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token function">cardinalToWord</span><span class="token punctuation">(</span>hints<span class="token punctuation">.</span>direction<span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">)</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
240
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">🌡️ The target country is </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>temperature<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
241
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">📐 The target country is </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>size<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
242
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">🌍 </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>hemisphere<span class="token punctuation">.</span>ns<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>hemisphere<span class="token punctuation">.</span>ew<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> hemisphere</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
243
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">🏔️ </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>landlocked <span class="token operator">?</span> <span class="token string">"Landlocked"</span> <span class="token operator">:</span> <span class="token string">"Has coastline"</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
244
+ <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">☀️ Climate: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>climate<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span>
245
+ <span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
246
+ <span class="token punctuation">}</span>
247
+
248
+ <span class="token comment">// Helper to expand a CardinalDirection abbreviation to a full word</span>
249
+ <span class="token keyword">function</span> <span class="token function">cardinalToWord</span><span class="token punctuation">(</span>dir<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span>
250
+ <span class="token keyword">const</span> map<span class="token operator">:</span> Record<span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token builtin">string</span><span class="token operator">></span> <span class="token operator">=</span> <span class="token punctuation">{</span>
251
+ <span class="token constant">N</span><span class="token operator">:</span> <span class="token string">"north"</span><span class="token punctuation">,</span> <span class="token constant">NE</span><span class="token operator">:</span> <span class="token string">"northeast"</span><span class="token punctuation">,</span> <span class="token constant">E</span><span class="token operator">:</span> <span class="token string">"east"</span><span class="token punctuation">,</span> <span class="token constant">SE</span><span class="token operator">:</span> <span class="token string">"southeast"</span><span class="token punctuation">,</span>
252
+ <span class="token constant">S</span><span class="token operator">:</span> <span class="token string">"south"</span><span class="token punctuation">,</span> <span class="token constant">SW</span><span class="token operator">:</span> <span class="token string">"southwest"</span><span class="token punctuation">,</span> <span class="token constant">W</span><span class="token operator">:</span> <span class="token string">"west"</span><span class="token punctuation">,</span> <span class="token constant">NW</span><span class="token operator">:</span> <span class="token string">"northwest"</span><span class="token punctuation">,</span>
253
+ <span class="token punctuation">}</span><span class="token punctuation">;</span>
254
+ <span class="token keyword">return</span> map<span class="token punctuation">[</span>dir<span class="token punctuation">]</span> <span class="token operator">??</span> dir<span class="token punctuation">;</span>
255
+ <span class="token punctuation">}</span>
256
+
257
+ <span class="token comment">// Player guesses France, target is Germany</span>
258
+ <span class="token function">processGuess</span><span class="token punctuation">(</span><span class="token string">"FR"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
259
+ <span class="token comment">// 📍 393 km away</span>
260
+ <span class="token comment">// 🧭 Head NE (northeast)</span>
261
+ <span class="token comment">// 🌡️ The target country is similar</span>
262
+ <span class="token comment">// 📐 The target country is similar</span>
263
+ <span class="token comment">// 🌍 Northern Eastern hemisphere</span>
264
+ <span class="token comment">// 🏔️ Has coastline</span>
265
+ <span class="token comment">// ☀️ Climate: temperate</span>
266
+ </code></pre>
267
+ <h3 id="example%3A-build-hints-sentence-in-natural-language" tabindex="-1">Example: build hints sentence in natural language</h3>
268
+ <pre class="language-ts"><code class="language-ts"><span class="token keyword">import</span> <span class="token punctuation">{</span> getGeoHints<span class="token punctuation">,</span> getCountryByCode <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"arev"</span><span class="token punctuation">;</span>
269
+
270
+ <span class="token keyword">function</span> <span class="token function">buildHintSentence</span><span class="token punctuation">(</span>guess<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> target<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span>
271
+ <span class="token keyword">const</span> hints <span class="token operator">=</span> <span class="token function">getGeoHints</span><span class="token punctuation">(</span>guess<span class="token punctuation">,</span> target<span class="token punctuation">)</span><span class="token punctuation">;</span>
272
+ <span class="token keyword">const</span> targetCountry <span class="token operator">=</span> <span class="token function">getCountryByCode</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span><span class="token punctuation">;</span>
273
+ <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>hints <span class="token operator">||</span> <span class="token operator">!</span>targetCountry<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">""</span><span class="token punctuation">;</span>
274
+
275
+ <span class="token keyword">const</span> parts<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
276
+ parts<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">You are </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>distanceKm<span class="token punctuation">.</span><span class="token function">toLocaleString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> km away.</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
277
+ parts<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">The target country is to the </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>direction<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">.</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
278
+ <span class="token keyword">if</span> <span class="token punctuation">(</span>hints<span class="token punctuation">.</span>temperature <span class="token operator">!==</span> <span class="token string">"similar"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
279
+ parts<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">It is a </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hints<span class="token punctuation">.</span>temperature<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> country than your guess.</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
280
+ <span class="token punctuation">}</span>
281
+ <span class="token keyword">if</span> <span class="token punctuation">(</span>hints<span class="token punctuation">.</span>landlocked<span class="token punctuation">)</span> <span class="token punctuation">{</span>
282
+ parts<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">"It is landlocked."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
283
+ <span class="token punctuation">}</span>
284
+ <span class="token keyword">return</span> parts<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
285
+ <span class="token punctuation">}</span>
286
+
287
+ <span class="token function">buildHintSentence</span><span class="token punctuation">(</span><span class="token string">"NL"</span><span class="token punctuation">,</span> <span class="token string">"MN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
288
+ <span class="token comment">// "You are 7,432 km away. The target country is to the E. It is a colder country than your guess. It is landlocked."</span>
289
+ </code></pre>
290
+ <hr>
291
+ <h2 id="climate-zones-explained" tabindex="-1">Climate zones explained</h2>
292
+ <table>
293
+ <thead>
294
+ <tr>
295
+ <th>Zone</th>
296
+ <th>Typical regions</th>
297
+ <th>Avg temp range</th>
298
+ </tr>
299
+ </thead>
300
+ <tbody>
301
+ <tr>
302
+ <td><code>tropical</code></td>
303
+ <td>Central Africa, SE Asia, Amazon basin</td>
304
+ <td>24–30 °C</td>
305
+ </tr>
306
+ <tr>
307
+ <td><code>subtropical</code></td>
308
+ <td>North Africa coast, Southern USA, Southern China</td>
309
+ <td>18–26 °C</td>
310
+ </tr>
311
+ <tr>
312
+ <td><code>arid</code></td>
313
+ <td>Sahara, Arabian Peninsula, Central Australia</td>
314
+ <td>14–30 °C</td>
315
+ </tr>
316
+ <tr>
317
+ <td><code>mediterranean</code></td>
318
+ <td>Mediterranean basin, California, SW Australia</td>
319
+ <td>14–20 °C</td>
320
+ </tr>
321
+ <tr>
322
+ <td><code>temperate</code></td>
323
+ <td>Western/Central Europe, Eastern USA, New Zealand</td>
324
+ <td>7–14 °C</td>
325
+ </tr>
326
+ <tr>
327
+ <td><code>continental</code></td>
328
+ <td>Eastern Europe, Central Asia, interior Canada/US</td>
329
+ <td>−5 to 12 °C</td>
330
+ </tr>
331
+ <tr>
332
+ <td><code>subarctic</code></td>
333
+ <td>Northern Russia, Scandinavia, Northern Canada</td>
334
+ <td>−10 to 3 °C</td>
335
+ </tr>
336
+ <tr>
337
+ <td><code>arctic</code></td>
338
+ <td>Polar regions</td>
339
+ <td>&lt; −10 °C</td>
340
+ </tr>
341
+ </tbody>
342
+ </table>
343
+ <h2 id="related" tabindex="-1">Related</h2>
344
+ <ul>
345
+ <li><a href="countries.md">Countries</a> — the base <code>countries</code> array (name, code, emoji flag)</li>
346
+ <li><a href="flags.md">Flags</a> — <code>getSimilarFlags()</code> to add flag-guessing to geography games</li>
347
+ <li><a href="cities.md">Cities</a> — capital cities with precise coordinates</li>
348
+ </ul>
349
+
350
+ </div>
351
+ </div>
352
+ </section>
353
+ </main>
354
+ </div>
355
+ <footer class="footer">
356
+ <div class="footer__container">
357
+ <div class="footer__controls">
358
+ <div class="footer__control"><span class="footer__label">Theme</span>
359
+ <button class="color-mode-toggle" type="button" data-color-mode-toggle aria-label="Toggle color mode"><span class="color-mode-toggle__value"></span></button>
360
+ </div>
361
+ </div>
362
+ </div>
363
+ </footer>
364
+ </body>
365
+ <script>const isDarkMode = window.matchMedia("prefers-color-scheme: dark").matches;
366
+ let localMode = isDarkMode ? "dark" : "light";
367
+
368
+ const updateColorModeToggle = () => {
369
+ const toggle = document.querySelector("[data-color-mode-toggle]");
370
+ if (!toggle) return;
371
+
372
+ const value = toggle.querySelector(".color-mode-toggle__value");
373
+ if (!value) return;
374
+
375
+ value.textContent = localMode === "dark" ? "Dark" : "Light";
376
+ };
377
+
378
+ const initColorMode = () => {
379
+ localMode = localStorage.getItem("colorMode");
380
+ setCurrentMode(localMode ? localMode : isDarkMode ? "dark" : "light");
381
+ };
382
+
383
+ const setCurrentMode = (mode) => {
384
+ localMode = mode;
385
+ localStorage.setItem("colorMode", localMode);
386
+ document.body.setAttribute("color-mode", mode);
387
+ updateColorModeToggle();
388
+ };
389
+
390
+ const switchMode = () => {
391
+ if (localMode == "dark") setCurrentMode("light");
392
+ else setCurrentMode("dark");
393
+ };
394
+
395
+ const bindColorModeToggle = () => {
396
+ const toggle = document.querySelector("[data-color-mode-toggle]");
397
+ if (!toggle) return;
398
+
399
+ toggle.addEventListener("click", () => {
400
+ switchMode();
401
+ });
402
+ };
403
+
404
+ initColorMode();
405
+ bindColorModeToggle();
406
+ const tables = document.querySelectorAll("table");
407
+ let initTableWrap = false;
408
+
409
+ const wrapTables = (tables) => {
410
+ tables &&
411
+ tables.forEach((table) => {
412
+ if (table.getBoundingClientRect().width > window.screen.width) {
413
+ table.classList.add("wrap");
414
+ initTableWrap = true;
415
+ }
416
+ });
417
+ };
418
+
419
+ const labelTables = (tables) => {
420
+ tables &&
421
+ tables.forEach((table) => {
422
+ // Set all headers as attributes to td's
423
+ const headerElements = table.querySelectorAll("thead th");
424
+ const bodyElementRows = table.querySelectorAll("tbody tr");
425
+ const heads = [];
426
+
427
+ if (headerElements && bodyElementRows) {
428
+ // Get TH heads
429
+ headerElements.forEach((th) => {
430
+ heads.push(th.textContent);
431
+ });
432
+ }
433
+
434
+ if (heads.length) {
435
+ bodyElementRows.forEach((tr) => {
436
+ const tds = tr.querySelectorAll("td");
437
+
438
+ tds.forEach((td, i) => {
439
+ td.setAttribute("data-label", heads[i]);
440
+ });
441
+ });
442
+ }
443
+ });
444
+ };
445
+
446
+ wrapTables(tables);
447
+ labelTables(tables);
448
+
449
+ window.addEventListener("resize", () => {
450
+ if (!initTableWrap) wrapTables(tables);
451
+ });
452
+
453
+ </script>
454
+ </html>