@the-inclusionist/engine 10.0.0 → 11.0.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 (528) hide show
  1. package/README.md +32 -1
  2. package/app/css/style.css +216 -42
  3. package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
  4. package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
  5. package/app/public/vendor/fonts.css +11 -1175
  6. package/dist-pkg/boot/create-game.d.ts +84 -33
  7. package/dist-pkg/boot/create-game.js +708 -307
  8. package/dist-pkg/core/a11y-sr.d.ts +1 -1
  9. package/dist-pkg/core/a11y-sr.js +3 -5
  10. package/dist-pkg/core/accommodations.d.ts +26 -8
  11. package/dist-pkg/core/accommodations.js +27 -10
  12. package/dist-pkg/core/actions.d.ts +39 -10
  13. package/dist-pkg/core/actions.js +28 -6
  14. package/dist-pkg/core/contract.d.ts +0 -2
  15. package/dist-pkg/core/contract.js +0 -2
  16. package/dist-pkg/core/i18n.d.ts +36 -71
  17. package/dist-pkg/core/i18n.js +131 -198
  18. package/dist-pkg/core/session-clock.d.ts +23 -0
  19. package/dist-pkg/core/session-clock.js +37 -0
  20. package/dist-pkg/i18n/en.js +44 -49
  21. package/dist-pkg/i18n/es.js +44 -49
  22. package/dist-pkg/i18n/pt.js +49 -54
  23. package/dist-pkg/input/gamepad.d.ts +42 -11
  24. package/dist-pkg/input/gamepad.js +50 -15
  25. package/dist-pkg/input/key-default.d.ts +30 -0
  26. package/dist-pkg/input/key-default.js +60 -0
  27. package/dist-pkg/input/keyboard-runtime.d.ts +0 -4
  28. package/dist-pkg/input/keyboard.d.ts +0 -1
  29. package/dist-pkg/input/keydown.d.ts +5 -11
  30. package/dist-pkg/input/keydown.js +3 -3
  31. package/dist-pkg/input/latch-edge.d.ts +10 -2
  32. package/dist-pkg/input/latch-edge.js +4 -3
  33. package/dist-pkg/input/latch-scope.d.ts +27 -22
  34. package/dist-pkg/input/latch-scope.js +25 -37
  35. package/dist-pkg/input/latch-store.d.ts +9 -12
  36. package/dist-pkg/input/latch-store.js +13 -18
  37. package/dist-pkg/input/latch-sync.d.ts +5 -4
  38. package/dist-pkg/input/latch-sync.js +5 -5
  39. package/dist-pkg/input/pad-reading.js +7 -2
  40. package/dist-pkg/input/pad-wizard.d.ts +4 -1
  41. package/dist-pkg/input/pad-wizard.js +60 -9
  42. package/dist-pkg/input/switch-scan.d.ts +29 -12
  43. package/dist-pkg/input/switch-scan.js +15 -2
  44. package/dist-pkg/input/touch-bindings.d.ts +3 -6
  45. package/dist-pkg/input/touch.d.ts +17 -2
  46. package/dist-pkg/input/touch.js +55 -17
  47. package/dist-pkg/input/transport-in-use.d.ts +5 -5
  48. package/dist-pkg/input/transport-in-use.js +5 -5
  49. package/dist-pkg/input/transports.d.ts +0 -9
  50. package/dist-pkg/input/transports.js +1 -1
  51. package/dist-pkg/input/virtual-controller.d.ts +39 -3
  52. package/dist-pkg/input/virtual-controller.js +32 -4
  53. package/dist-pkg/input/voice-map.d.ts +27 -11
  54. package/dist-pkg/input/voice-map.js +41 -43
  55. package/dist-pkg/platform/audio-ambient.d.ts +0 -1
  56. package/dist-pkg/platform/audio-ambient.js +3 -1
  57. package/dist-pkg/platform/audio-mixer.js +4 -9
  58. package/dist-pkg/platform/audio-sonar.d.ts +8 -94
  59. package/dist-pkg/platform/audio-sonar.js +22 -207
  60. package/dist-pkg/platform/audio.d.ts +10 -1
  61. package/dist-pkg/platform/audio.js +35 -2
  62. package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
  63. package/dist-pkg/platform/choose-by-voice.js +157 -0
  64. package/dist-pkg/platform/font-library.d.ts +77 -0
  65. package/dist-pkg/platform/font-library.js +98 -0
  66. package/dist-pkg/platform/font-library.json +721 -0
  67. package/dist-pkg/platform/heavy-catalogue.d.ts +46 -0
  68. package/dist-pkg/platform/heavy-catalogue.js +47 -14
  69. package/dist-pkg/platform/heavy-mirror.d.ts +3 -9
  70. package/dist-pkg/platform/heavy-mirror.js +14 -17
  71. package/dist-pkg/platform/heavy.d.ts +40 -8
  72. package/dist-pkg/platform/heavy.js +177 -22
  73. package/dist-pkg/platform/interruptible-speech.d.ts +15 -8
  74. package/dist-pkg/platform/interruptible-speech.js +37 -13
  75. package/dist-pkg/platform/listener-scope.js +22 -13
  76. package/dist-pkg/platform/locale-host.d.ts +7 -3
  77. package/dist-pkg/platform/locale-host.js +13 -2
  78. package/dist-pkg/platform/reading-in-worker.d.ts +24 -0
  79. package/dist-pkg/platform/reading-in-worker.js +38 -0
  80. package/dist-pkg/platform/reading-model.d.ts +21 -0
  81. package/dist-pkg/platform/reading-model.js +25 -0
  82. package/dist-pkg/platform/reading-runtime.js +13 -8
  83. package/dist-pkg/platform/reading.d.ts +12 -1
  84. package/dist-pkg/platform/reading.js +9 -1
  85. package/dist-pkg/platform/speech-recognition.d.ts +10 -1
  86. package/dist-pkg/platform/speech-recognition.js +29 -9
  87. package/dist-pkg/platform/speech.d.ts +10 -1
  88. package/dist-pkg/platform/speech.js +24 -13
  89. package/dist-pkg/platform/tts.d.ts +37 -4
  90. package/dist-pkg/platform/tts.js +279 -57
  91. package/dist-pkg/platform/voice-listener.d.ts +6 -2
  92. package/dist-pkg/platform/voice-listener.js +1 -1
  93. package/dist-pkg/platform/voice-plan.d.ts +13 -0
  94. package/dist-pkg/platform/voice-plan.js +57 -2
  95. package/dist-pkg/platform/vosk-runtime.d.ts +25 -0
  96. package/dist-pkg/platform/vosk-runtime.js +59 -1
  97. package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
  98. package/dist-pkg/platform/vosk-vocabulary.js +178 -0
  99. package/dist-pkg/render/crt.d.ts +11 -9
  100. package/dist-pkg/render/crt.js +6 -10
  101. package/dist-pkg/render/cvd-matrices.d.ts +5 -1
  102. package/dist-pkg/render/cvd-matrices.js +5 -1
  103. package/dist-pkg/render/high-contrast.d.ts +1 -2
  104. package/dist-pkg/render/high-contrast.js +5 -1
  105. package/dist-pkg/render/viz-axes.d.ts +9 -0
  106. package/dist-pkg/render/viz-axes.js +15 -2
  107. package/dist-pkg/ui/aac-sets.d.ts +29 -24
  108. package/dist-pkg/ui/aac-sets.js +22 -30
  109. package/dist-pkg/ui/audio-choices.d.ts +10 -5
  110. package/dist-pkg/ui/audio-choices.js +14 -10
  111. package/dist-pkg/ui/camera-control.d.ts +47 -0
  112. package/dist-pkg/ui/camera-control.js +35 -1
  113. package/dist-pkg/ui/declared-words.d.ts +21 -0
  114. package/dist-pkg/ui/declared-words.js +66 -0
  115. package/dist-pkg/ui/drawing-problems.js +4 -3
  116. package/dist-pkg/ui/eye-control.js +17 -17
  117. package/dist-pkg/ui/face-control.js +15 -15
  118. package/dist-pkg/ui/fonts.d.ts +42 -8
  119. package/dist-pkg/ui/fonts.js +58 -24
  120. package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
  121. package/dist-pkg/ui/footer-scroll-driver.js +201 -0
  122. package/dist-pkg/ui/footer-scroll.d.ts +38 -0
  123. package/dist-pkg/ui/footer-scroll.js +55 -0
  124. package/dist-pkg/ui/game-options.d.ts +14 -9
  125. package/dist-pkg/ui/game-options.js +41 -21
  126. package/dist-pkg/ui/hand-control.js +15 -15
  127. package/dist-pkg/ui/help-panel.d.ts +19 -8
  128. package/dist-pkg/ui/help-panel.js +15 -5
  129. package/dist-pkg/ui/hud-bands.d.ts +29 -12
  130. package/dist-pkg/ui/hud-bands.js +63 -25
  131. package/dist-pkg/ui/hud-row.d.ts +34 -0
  132. package/dist-pkg/ui/hud-row.js +80 -0
  133. package/dist-pkg/ui/hud.d.ts +0 -3
  134. package/dist-pkg/ui/layout.js +5 -2
  135. package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
  136. package/dist-pkg/ui/libras-avatar-clip.js +86 -0
  137. package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
  138. package/dist-pkg/ui/libras-avatar-load.js +134 -0
  139. package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
  140. package/dist-pkg/ui/libras-avatar-plan.js +211 -0
  141. package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
  142. package/dist-pkg/ui/libras-avatar-player.js +226 -0
  143. package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
  144. package/dist-pkg/ui/libras-avatar-stage.js +208 -0
  145. package/dist-pkg/ui/libras-glosses.d.ts +28 -0
  146. package/dist-pkg/ui/libras-glosses.js +161 -0
  147. package/dist-pkg/ui/menu-intent.d.ts +29 -0
  148. package/dist-pkg/ui/menu-intent.js +35 -1
  149. package/dist-pkg/ui/menu-items.d.ts +10 -0
  150. package/dist-pkg/ui/menu-items.js +29 -0
  151. package/dist-pkg/ui/menu-nav.d.ts +40 -4
  152. package/dist-pkg/ui/menu-nav.js +132 -47
  153. package/dist-pkg/ui/panel-widgets.d.ts +34 -0
  154. package/dist-pkg/ui/panel-widgets.js +86 -0
  155. package/dist-pkg/ui/pause-icons.d.ts +30 -14
  156. package/dist-pkg/ui/pause-icons.js +106 -45
  157. package/dist-pkg/ui/scan-overlay.d.ts +3 -3
  158. package/dist-pkg/ui/scan-overlay.js +11 -3
  159. package/dist-pkg/ui/screen-text.d.ts +25 -0
  160. package/dist-pkg/ui/screen-text.js +152 -0
  161. package/dist-pkg/ui/session-clock.d.ts +32 -0
  162. package/dist-pkg/ui/session-clock.js +67 -0
  163. package/dist-pkg/ui/settings-aac.d.ts +3 -1
  164. package/dist-pkg/ui/settings-aac.js +32 -13
  165. package/dist-pkg/ui/settings-audio.d.ts +10 -5
  166. package/dist-pkg/ui/settings-audio.js +101 -35
  167. package/dist-pkg/ui/settings-controls.d.ts +0 -4
  168. package/dist-pkg/ui/settings-mobility.d.ts +3 -6
  169. package/dist-pkg/ui/settings-mobility.js +4 -46
  170. package/dist-pkg/ui/settings-motion.js +2 -2
  171. package/dist-pkg/ui/settings-panel.d.ts +10 -0
  172. package/dist-pkg/ui/settings-panel.js +25 -1
  173. package/dist-pkg/ui/settings-typo.d.ts +5 -6
  174. package/dist-pkg/ui/settings-typo.js +20 -11
  175. package/dist-pkg/ui/settings-visual.js +2 -2
  176. package/dist-pkg/ui/shell.d.ts +1 -3
  177. package/dist-pkg/ui/shell.js +8 -4
  178. package/dist-pkg/ui/title.d.ts +2 -11
  179. package/dist-pkg/ui/title.js +39 -6
  180. package/dist-pkg/ui/top-band.d.ts +5 -3
  181. package/dist-pkg/ui/top-band.js +21 -25
  182. package/dist-pkg/ui/typo-choices.d.ts +3 -3
  183. package/dist-pkg/ui/typo-choices.js +9 -8
  184. package/dist-pkg/ui/vlibras.d.ts +71 -27
  185. package/dist-pkg/ui/vlibras.js +116 -44
  186. package/dist-pkg/ui/voice-control.d.ts +23 -1
  187. package/dist-pkg/ui/voice-control.js +149 -16
  188. package/dist-pkg/ui/voice-settings.d.ts +2 -3
  189. package/dist-pkg/ui/voice-settings.js +53 -3
  190. package/dist-pkg/ui/where-the-child-is.js +2 -2
  191. package/docs/CREDITS.md +122 -10
  192. package/docs/LICENSES.md +36 -7
  193. package/package.json +34 -9
  194. package/scripts/check-cartridge.mjs +78 -0
  195. package/scripts/game-build.d.mts +25 -0
  196. package/scripts/game-build.mjs +144 -0
  197. package/scripts/heavy-into-the-delivery.mjs +284 -40
  198. package/scripts/libras-avatar.json +680 -0
  199. package/scripts/libras-avatar.mjs +246 -0
  200. package/scripts/libras-glosses/gloss.py +95 -0
  201. package/scripts/libras-glosses/pyproject.toml +32 -0
  202. package/scripts/libras-glosses/uv.lock +781 -0
  203. package/scripts/libras-glosses.mjs +351 -0
  204. package/scripts/licences/OFL-1.1.txt +86 -0
  205. package/scripts/licences/UFL-1.0.txt +96 -0
  206. package/scripts/licences/fonts.mjs +389 -0
  207. package/scripts/licences/third-party.mjs +35 -21
  208. package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
  209. package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
  210. package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
  211. package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
  212. package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
  213. package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
  214. package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
  215. package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
  216. package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
  217. package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
  218. package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
  219. package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
  220. package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
  221. package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
  222. package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
  223. package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
  224. package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
  225. package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
  226. package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
  227. package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
  228. package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
  229. package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
  230. package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
  231. package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
  232. package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
  233. package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
  234. package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
  235. package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
  236. package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
  237. package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
  238. package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
  239. package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
  240. package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
  241. package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
  242. package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
  243. package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
  244. package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
  245. package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
  246. package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
  247. package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
  248. package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
  249. package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
  250. package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
  251. package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
  252. package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
  253. package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
  254. package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
  255. package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
  256. package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
  257. package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
  258. package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
  259. package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
  260. package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
  261. package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
  262. package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
  263. package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
  264. package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
  265. package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
  266. package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
  267. package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
  268. package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
  269. package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
  270. package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
  271. package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
  272. package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
  273. package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
  274. package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
  275. package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
  276. package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
  277. package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
  278. package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
  279. package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
  280. package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
  281. package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
  282. package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
  283. package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
  284. package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
  285. package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
  286. package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
  287. package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
  288. package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
  289. package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
  290. package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
  291. package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
  292. package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
  293. package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
  294. package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
  295. package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
  296. package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
  297. package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
  298. package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
  299. package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
  300. package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
  301. package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
  302. package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
  303. package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
  304. package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
  305. package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
  306. package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
  307. package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
  308. package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
  309. package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
  310. package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
  311. package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
  312. package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
  313. package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
  314. package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
  315. package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
  316. package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
  317. package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
  318. package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
  319. package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
  320. package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
  321. package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
  322. package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
  323. package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
  324. package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
  325. package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
  326. package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
  327. package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
  328. package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
  329. package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
  330. package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
  331. package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
  332. package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
  333. package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
  334. package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
  335. package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
  336. package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
  337. package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
  338. package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
  339. package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
  340. package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
  341. package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
  342. package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
  343. package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
  344. package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
  345. package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
  346. package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
  347. package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
  348. package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
  349. package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
  350. package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
  351. package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
  352. package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
  353. package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
  354. package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
  355. package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
  356. package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
  357. package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
  358. package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
  359. package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
  360. package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
  361. package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
  362. package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
  363. package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
  364. package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
  365. package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
  366. package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
  367. package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
  368. package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
  369. package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
  370. package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
  371. package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
  372. package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
  373. package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
  374. package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
  375. package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
  376. package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
  377. package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
  378. package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
  379. package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
  380. package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
  381. package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
  382. package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
  383. package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
  384. package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
  385. package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
  386. package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
  387. package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
  388. package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
  389. package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
  390. package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
  391. package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
  392. package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
  393. package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
  394. package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
  395. package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
  396. package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
  397. package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
  398. package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
  399. package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
  400. package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
  401. package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
  402. package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
  403. package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
  404. package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
  405. package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
  406. package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
  407. package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
  408. package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
  409. package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
  410. package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
  411. package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
  412. package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
  413. package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
  414. package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
  415. package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
  416. package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
  417. package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
  418. package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
  419. package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
  420. package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
  421. package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
  422. package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
  423. package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
  424. package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
  425. package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
  426. package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
  427. package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
  428. package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
  429. package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
  430. package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
  431. package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
  432. package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
  433. package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
  434. package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
  435. package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
  436. package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
  437. package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
  438. package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
  439. package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
  440. package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
  441. package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
  442. package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
  443. package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
  444. package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
  445. package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
  446. package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
  447. package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
  448. package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
  449. package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
  450. package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
  451. package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
  452. package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
  453. package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
  454. package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
  455. package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
  456. package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
  457. package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
  458. package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
  459. package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
  460. package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
  461. package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
  462. package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
  463. package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
  464. package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
  465. package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
  466. package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
  467. package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
  468. package/app/public/vendor/fonts/domine-var.woff2 +0 -0
  469. package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
  470. package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
  471. package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
  472. package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
  473. package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
  474. package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
  475. package/app/public/vendor/fonts/inter-400.woff2 +0 -0
  476. package/app/public/vendor/fonts/inter-700.woff2 +0 -0
  477. package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
  478. package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
  479. package/app/public/vendor/fonts/lato-400.woff2 +0 -0
  480. package/app/public/vendor/fonts/lato-700.woff2 +0 -0
  481. package/app/public/vendor/fonts/literata-400.woff2 +0 -0
  482. package/app/public/vendor/fonts/literata-700.woff2 +0 -0
  483. package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
  484. package/app/public/vendor/fonts/lora-var.woff2 +0 -0
  485. package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
  486. package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
  487. package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
  488. package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
  489. package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
  490. package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
  491. package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
  492. package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
  493. package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
  494. package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
  495. package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
  496. package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
  497. package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
  498. package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
  499. package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
  500. package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
  501. package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
  502. package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
  503. package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
  504. package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
  505. package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
  506. package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
  507. package/app/public/vendor/fonts/sora-var.woff2 +0 -0
  508. package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
  509. package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
  510. package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
  511. package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
  512. package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
  513. package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
  514. package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
  515. package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
  516. package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
  517. package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
  518. package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
  519. package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
  520. package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
  521. package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
  522. package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
  523. package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
  524. package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
  525. package/dist-pkg/platform/guide-intensity.d.ts +0 -39
  526. package/dist-pkg/platform/guide-intensity.js +0 -71
  527. package/dist-pkg/ui/latch-refusal.d.ts +0 -33
  528. package/dist-pkg/ui/latch-refusal.js +0 -60
@@ -0,0 +1,351 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ //
3
+ // THE BUILD-TIME GLOSSES (ADR-0234, plan item 5b): run by `inclusionist-heavy --libras`, before the avatar is written.
4
+ // The player signs a GLOSS, and the text a child is shown is Portuguese; translating it needs spaCy's Portuguese parser, which
5
+ // does not run in a browser. It does not have to: that text is AUTHORED, so it is glossed here, once, on the build machine, and
6
+ // written beside the avatar as `glosses.json` (`ui/libras-glosses` reads it).
7
+ //
8
+ // WHICH TEXTS, and why these:
9
+ // · THE ENGINE'S OWN PORTUGUESE DICTIONARY, all of it (`dist-pkg/i18n/pt.js`). The sonar reads what is on the screen — a
10
+ // panel, the pause card, a notice, the navigation sentence of a world it cannot read — and which key lands where is decided
11
+ // by the code that renders it, not by the key's name. A filter by prefix would drop a string the day a panel starts showing
12
+ // it, silently; glossing all of it costs build time only.
13
+ // · THE GAME'S OWN DICTIONARY, when the game's delivery names it: `--libras-texts <file>`, repeatable — a JSON object of
14
+ // `key: "pt string"` (what the game hands `registerDict('pt', …)`), a JSON array of strings, or an ES module whose default
15
+ // export is either. A game's text that lives in no dictionary (written straight into its page) is not glossed: the
16
+ // interpreter hands it over by the fallback rule.
17
+ // · NOT en or es: the translator reads Brazilian Portuguese only, and Libras is Brazil's.
18
+ // A string with `{param}` holes is glossed with each hole in place (`JOGADOR {n} ENTRAR [EXCLAMAÇÃO]`): the translator reads a
19
+ // placeholder word where each hole is, and the word is put back as the hole. The VALUE is known only at run time, and there the
20
+ // interpreter looks it up in turn, or fingerspells it (`ui/libras-glosses`). A string that is only holes is not glossed.
21
+ //
22
+ // 🔴 THE RULE-BASED MODE ONLY: `gloss.py` calls `translate(text, neural=False)`. The neural mode fetches LAViD's model, which
23
+ // declares no licence.
24
+ //
25
+ // 🔴 A DELIVERY BUILT WITH `--libras` IS NEVER WRITTEN WITHOUT ITS GLOSSES. No environment, no model, a translator of another
26
+ // version: each THROWS here, saying what is missing and the one command that sets it up, and the delivery stops. The glosser
27
+ // runs in an environment OUTSIDE the repository (`INCLUSIONIST_LIBRAS_ENV`, else `~/.cache/the-inclusionist/libras-glosses`),
28
+ // built from `libras-glosses/uv.lock` by `inclusionist-heavy --libras-setup` — which needs `uv` and Python 3.12 on this machine,
29
+ // and never downloads a Python.
30
+ //
31
+ // WHICH TOKENS HAVE A SIGN is the avatar's answer: a token the delivery carries a clip for (`scripts/libras-avatar.json`, the
32
+ // names the free player signs) stays a sign; any other is fingerspelled. The clips themselves are delivered by
33
+ // `scripts/libras-avatar.mjs`, in the same `--libras` step.
34
+ //
35
+ // 🔴 A WORD WITH NO SIGN IS SPELLED AS IT IS WRITTEN (ADR-0234 erratum; the Dev: «Soletra-se a palavra escrita»). The translator
36
+ // returns LEMMAS, and a token the delivery carries no sign for is fingerspelled — so «entrou» would be spelled E-N-T-R-A-R. So
37
+ // `gloss.py` also reports each text's words as written, with the forms the translator can make of each; every gloss token is
38
+ // aligned back to the word that produced it (`writtenWords`), and a token with no sign carried is replaced by THAT word, in
39
+ // capitals, its accents stripped as the player's letters require and its Ç kept, a letter of its own (`spelledWord`, the
40
+ // run-time fallback's own rule). The child sees spelled what she reads. Measured on the engine's dictionary, and printed by
41
+ // every delivery: see `spellable`.
42
+
43
+ import { spawnSync } from 'node:child_process';
44
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
45
+ import { homedir } from 'node:os';
46
+ import { dirname, join } from 'node:path';
47
+ import { fileURLToPath, pathToFileURL } from 'node:url';
48
+ import { readAvatarPins } from './libras-avatar.mjs';
49
+
50
+ /** The uv project that pins the glosser's environment (`pyproject.toml`, `uv.lock`, `gloss.py`). */
51
+ export const GLOSSER_PROJECT = fileURLToPath(new URL('./libras-glosses/', import.meta.url));
52
+
53
+ /** What the glosses are made with, checked against what the environment reports: another version is refused, not trusted. */
54
+ export const PINNED = Object.freeze({ translator: '1.3.3', model: 'pt_core_news_md', modelVersion: '3.8.0', mode: 'rules' });
55
+
56
+ /** The one command that builds the environment, as a game's delivery and this repository each run it. */
57
+ export const SETUP_COMMAND = '`npx inclusionist-heavy --libras-setup` (in this repository: `npm run libras:setup`)';
58
+
59
+
60
+ /** Where the glosser's environment lives: never inside the repository or `node_modules`. */
61
+ export function glosserEnvironment(env = process.env, home = homedir()) {
62
+ return env.INCLUSIONIST_LIBRAS_ENV || join(home, '.cache', 'the-inclusionist', 'libras-glosses');
63
+ }
64
+
65
+ /** The environment's interpreter. */
66
+ export function glosserPython(envDir, platform = process.platform) {
67
+ return platform === 'win32' ? join(envDir, 'Scripts', 'python.exe') : join(envDir, 'bin', 'python');
68
+ }
69
+
70
+ /**
71
+ * Builds the environment from the lock, or THROWS saying why. `uv sync --locked` refuses a lock that drifted from the project,
72
+ * and `--no-python-downloads` makes a missing Python 3.12 an error instead of a silent download.
73
+ */
74
+ export function setUpGlosser({ envDir = glosserEnvironment(), run = spawnSync, project = GLOSSER_PROJECT, env = process.env } = {}) {
75
+ const done = run('uv', ['sync', '--locked', '--no-python-downloads', '--project', project], {
76
+ stdio: 'inherit', env: { ...env, UV_PROJECT_ENVIRONMENT: envDir },
77
+ });
78
+ if (done.error?.code === 'ENOENT') {
79
+ throw new Error('the Libras glosser needs `uv`, and it is not installed on this machine: install it '
80
+ + '(https://docs.astral.sh/uv/getting-started/installation/) and run the setup again');
81
+ }
82
+ if (done.error || done.status !== 0) {
83
+ throw new Error(`uv could not build the Libras glosser's environment at ${envDir} (exit ${done.status ?? done.error?.message}): `
84
+ + 'it needs Python 3.12 installed on this machine — uv is told never to download one — and the network once, for what '
85
+ + 'libras-glosses/uv.lock pins');
86
+ }
87
+ return envDir;
88
+ }
89
+
90
+ /**
91
+ * The translator, run once over `inputs` in the environment: returns `{ glosses, made }`, one gloss per input — or THROWS,
92
+ * saying what is missing and how to set it up.
93
+ */
94
+ export function runGlosser(inputs, { envDir = glosserEnvironment(), run = spawnSync, exists = existsSync,
95
+ script = join(GLOSSER_PROJECT, 'gloss.py'), pinned = PINNED, env = process.env } = {}) {
96
+ const python = glosserPython(envDir);
97
+ if (!exists(python)) {
98
+ throw new Error(`the Libras glosser's environment is missing (no ${python}): run ${SETUP_COMMAND} once — it needs uv and `
99
+ + 'Python 3.12 — or point INCLUSIONIST_LIBRAS_ENV at one that exists');
100
+ }
101
+ const done = run(python, [script], {
102
+ input: JSON.stringify({ texts: inputs }), encoding: 'utf8', maxBuffer: 256 * 1024 * 1024,
103
+ env: { ...env, PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' },
104
+ });
105
+ const said = String(done.stderr ?? '').trim().split(/\r?\n/).slice(-3).join(' · ');
106
+ if (done.error) throw new Error(`the Libras glosser could not be started (${python}): ${done.error.message}`);
107
+ if (done.status === 3) {
108
+ throw new Error(`spaCy's Portuguese model ${pinned.model} is missing from the Libras glosser's environment: run `
109
+ + `${SETUP_COMMAND} again (${said})`);
110
+ }
111
+ if (done.status === 4) {
112
+ throw new Error(`the translator is missing from the Libras glosser's environment: run ${SETUP_COMMAND} again (${said})`);
113
+ }
114
+ if (done.status !== 0) throw new Error(`the Libras glosser failed (exit ${done.status}): ${said}`);
115
+ let out;
116
+ try { out = JSON.parse(done.stdout); } catch { throw new Error('the Libras glosser answered something that is not JSON'); }
117
+ const got = `vlibras-translator ${out.translator} (${out.mode}) · ${out.model} ${out.modelVersion}`;
118
+ if (out.translator !== pinned.translator || out.model !== pinned.model || out.modelVersion !== pinned.modelVersion
119
+ || out.mode !== pinned.mode) {
120
+ throw new Error(`REFUSED: the Libras glosser's environment has ${got}, and the glosses are made with vlibras-translator `
121
+ + `${pinned.translator} (${pinned.mode}) · ${pinned.model} ${pinned.modelVersion} — run ${SETUP_COMMAND} again`);
122
+ }
123
+ if (!Array.isArray(out.glosses) || out.glosses.length !== inputs.length || out.glosses.some((g) => typeof g !== 'string')) {
124
+ throw new Error(`the Libras glosser answered ${out.glosses?.length} glosses for ${inputs.length} texts`);
125
+ }
126
+ // without the words as written, a token with no sign would be spelled as its lemma — refused, not spelled wrong
127
+ if (!Array.isArray(out.words) || out.words.length !== inputs.length || !out.words.every(isWordList)) {
128
+ throw new Error(`the Libras glosser answered the written words of ${out.words?.length ?? 'no'} texts for ${inputs.length}: `
129
+ + `run ${SETUP_COMMAND} again, or update the package`);
130
+ }
131
+ return { glosses: out.glosses, words: out.words, made: `${got} · spaCy ${out.spacy}` };
132
+ }
133
+
134
+ /** `[[as written, [forms…]], …]`, as `gloss.py` writes the words of one text. */
135
+ function isWordList(words) {
136
+ return Array.isArray(words) && words.every((w) => Array.isArray(w) && typeof w[0] === 'string' && Array.isArray(w[1])
137
+ && w[1].every((f) => typeof f === 'string'));
138
+ }
139
+
140
+ /** A hole of a template, as the engine's dictionaries write it (`core/i18n`). */
141
+ const HOLE = /\{([^{}\s]+)\}/gu;
142
+ const HAS_LETTER = /\p{L}/u;
143
+
144
+ /** The texts of one or more dictionaries (`key: string` objects or arrays), each once, with a letter outside its holes. */
145
+ export function textsToGloss(dictionaries) {
146
+ const texts = new Set();
147
+ for (const dict of dictionaries) {
148
+ for (const text of Array.isArray(dict) ? dict : Object.values(dict ?? {})) {
149
+ if (typeof text !== 'string') continue;
150
+ const trimmed = text.trim();
151
+ if (trimmed && HAS_LETTER.test(trimmed.replace(HOLE, ''))) texts.add(trimmed);
152
+ }
153
+ }
154
+ return [...texts].sort();
155
+ }
156
+
157
+ /** The placeholder word read where hole `i` is: letters only (a digit is read as a number), and no plural `S` at the end. */
158
+ export function placeholderWord(i) {
159
+ let letters = '';
160
+ for (let n = i; ; n = Math.floor(n / 26) - 1) { letters = String.fromCharCode(65 + (n % 26)) + letters; if (n < 26) break; }
161
+ return `ZPARAM${letters}Z`;
162
+ }
163
+
164
+ /** The text with each hole replaced by its placeholder word, and the holes' names in order. */
165
+ function withPlaceholders(text) {
166
+ const names = [];
167
+ const input = text.replace(HOLE, (_, name) => placeholderWord(names.push(name) - 1));
168
+ return { input, names };
169
+ }
170
+
171
+ /** The gloss with each placeholder word put back as its hole — or `null` when the translator lost or doubled one. */
172
+ function withHoles(gloss, names) {
173
+ let out = gloss;
174
+ for (const [i, name] of names.entries()) {
175
+ const word = placeholderWord(i);
176
+ if (out.split(word).length !== 2) return null;
177
+ out = out.replace(word, () => `{${name}}`);
178
+ }
179
+ return out;
180
+ }
181
+
182
+ /** The punctuation marks the translator writes for the player (`[PONTO]`), and a hole — neither is a sign to fetch. */
183
+ const NOT_A_SIGN = /^\[.*\]$|^\{.*\}$/u;
184
+
185
+ const tokensOf = (gloss) => gloss.split(/\s+/u).filter(Boolean);
186
+
187
+ /**
188
+ * THE WORD AS WRITTEN behind each token of a gloss (ADR-0234, erratum «A WORD WITH NO SIGN IS SPELLED AS IT IS WRITTEN»): one
189
+ * entry per token, `[word, how]`. `words` are the text's words as `gloss.py` reports them, each with the forms the translator's
190
+ * rules can make of it; a token is matched to the words whose forms include it.
191
+ * · `one` — the words that match all write it the same way: that word.
192
+ * · `order` — AMBIGUOUS, more than one written form matches (a lemma two words share): the translator's rule-based mode keeps
193
+ * the sentence's order, so the first unused matching word AFTER the last one taken is chosen, else the first
194
+ * unused, else the first.
195
+ * · `stem` — no form matches, but an unused word shares all of the token but its last two letters (📏 the translator's
196
+ * rules re-end a word the lemmatizer does not: «mancha» → MANCHO, «névoa» → NÉVOAR, «película» → PELÍCULO): the
197
+ * word sharing the longest start, the first in the sentence on a tie.
198
+ * · `none` — no word of the text gives this token (the translator made it: a compound, a synonym, a number it read as an
199
+ * hour): `word` is `null`, and the token is spelled as the translator wrote it — nothing better is known.
200
+ * The punctuation marks and the holes are `[null, 'mark']`.
201
+ */
202
+ export function writtenWords(gloss, words = []) {
203
+ const used = new Set();
204
+ let last = -1;
205
+ const take = (j, how) => { used.add(j); last = j; return [words[j][0], how]; };
206
+ return tokensOf(gloss).map((token) => {
207
+ if (NOT_A_SIGN.test(token)) return [null, 'mark'];
208
+ const key = token.normalize('NFC').toUpperCase();
209
+ const hits = [];
210
+ for (const [j, [word, forms]] of words.entries()) {
211
+ if (word.normalize('NFC').toUpperCase() === key || forms.some((f) => f.normalize('NFC') === key)) hits.push(j);
212
+ }
213
+ if (!hits.length) {
214
+ const stem = stemMatch(key, words, used);
215
+ return stem === null ? [null, 'none'] : take(stem, 'stem');
216
+ }
217
+ const spellings = new Set(hits.map((j) => words[j][0].normalize('NFC').toLocaleLowerCase('pt-BR')));
218
+ const j = hits.find((h) => h > last && !used.has(h)) ?? hits.find((h) => !used.has(h)) ?? hits[0];
219
+ return take(j, spellings.size > 1 ? 'order' : 'one');
220
+ });
221
+ }
222
+
223
+ /**
224
+ * The unused word whose start is the longest shared with `key`, at least all of `key` but two letters and three — or `null`.
225
+ * Only for a token with a letter: a number the translator split out («640» of «640×360») is spelled as it is.
226
+ */
227
+ function stemMatch(key, words, used) {
228
+ if (!/\p{L}/u.test(key)) return null;
229
+ const floor = Math.max(3, [...key].length - 2);
230
+ let best = null;
231
+ let bestLength = floor - 1;
232
+ for (const [j, [word]] of words.entries()) {
233
+ if (used.has(j)) continue;
234
+ const a = [...key];
235
+ const b = [...word.normalize('NFC').toUpperCase()];
236
+ let n = 0;
237
+ while (n < a.length && n < b.length && a[n] === b[n]) n += 1;
238
+ if (n > bestLength) { best = j; bestLength = n; }
239
+ }
240
+ return best;
241
+ }
242
+
243
+ /**
244
+ * Glosses `texts` with `translate(inputs) → { glosses, words, made }` (sync or async): returns
245
+ * `{ format: 1, made, glosses: [[text, gloss], …], written: [[[word, how], …], …] }` — `written` holds, per text and per gloss
246
+ * token, the word as written (`writtenWords`), and `spellable` turns the two into the file `ui/libras-glosses` reads. A
247
+ * template whose placeholder the translator dropped is glossed again in pieces — the fixed text between its holes — and the
248
+ * holes put between them. A placeholder word is written as itself, so it aligns to itself, and becoming a hole keeps the tokens
249
+ * where they were.
250
+ */
251
+ export async function glossTexts(texts, translate) {
252
+ const prepared = texts.map(withPlaceholders);
253
+ const first = await translate(prepared.map((p) => p.input));
254
+ const glosses = prepared.map((p, i) => withHoles(first.glosses[i], p.names));
255
+ const written = prepared.map((_, i) => writtenWords(first.glosses[i], first.words?.[i]));
256
+
257
+ const redo = texts.map((text, i) => (glosses[i] === null ? text.split(HOLE) : null));
258
+ const pieces = redo.flatMap((parts) => (parts ? parts.filter((_, i) => i % 2 === 0) : []));
259
+ if (pieces.length) {
260
+ const second = await translate(pieces.map((p) => (HAS_LETTER.test(p) ? p : '')));
261
+ let next = 0;
262
+ for (const [i, parts] of redo.entries()) {
263
+ if (!parts) continue;
264
+ const glossed = parts.map((part, j) => {
265
+ if (j % 2) return { gloss: `{${part}}`, written: [[null, 'mark']] };
266
+ const n = next++;
267
+ return { gloss: second.glosses[n], written: writtenWords(second.glosses[n], second.words?.[n]) };
268
+ });
269
+ glosses[i] = glossed.map((g) => g.gloss).join(' ').replace(/\s+/gu, ' ').trim();
270
+ written[i] = glossed.flatMap((g) => g.written);
271
+ }
272
+ }
273
+ return { format: 1, made: first.made, glosses: texts.map((text, i) => [text, glosses[i]]), written };
274
+ }
275
+
276
+ /** The distinct tokens the glosses ask the player to sign, sorted. */
277
+ export function glossTokens(file) {
278
+ const tokens = new Set();
279
+ for (const [, gloss] of file.glosses) {
280
+ for (const token of gloss.split(/\s+/u)) if (token && !NOT_A_SIGN.test(token)) tokens.add(token);
281
+ }
282
+ return [...tokens].sort();
283
+ }
284
+
285
+ /**
286
+ * A word as the player fingerspells it — the run-time fallback's rule (`ui/libras-glosses` `provisionalGloss`), so a word is
287
+ * spelled the same whether the build or the run time spelled it: capitals, and every mark stripped but Ç's. The avatar has no
288
+ * clip for an accented vowel (its alphabet is A–Z and Ç, `scripts/libras-avatar.json`), so it is spelled as its base letter
289
+ * (Ã → A, É → E); Ç is a letter of the Libras manual alphabet, with its own handshape and movement, and the avatar carries its
290
+ * clip, so it stays Ç: the marks are stripped from each run with no Ç in it. Anything that is not a letter or a digit separates.
291
+ */
292
+ export function spelledWord(word) {
293
+ return word.normalize('NFC').replace(/[^Çç]+/gu, (run) => run.normalize('NFD').replace(/\p{M}+/gu, '')).toUpperCase()
294
+ .split(/[^\p{L}\p{N}]+/u).filter(Boolean).join(' ');
295
+ }
296
+
297
+ /**
298
+ * The glosses as the player can sign them from THIS delivery, and how their spelled tokens were found: a carried sign, a
299
+ * punctuation mark and a hole stay as they are; any other token is FINGERSPELLED, and what is spelled is the word as WRITTEN on
300
+ * the screen (`written`, from `glossTexts`) — «entrou», not the translator's lemma «ENTRAR» (the Dev: «Soletra-se a palavra
301
+ * escrita») — or the token itself where no written word gave it. Returns the file `ui/libras-glosses` reads (`[text, gloss]`
302
+ * pairs, nothing else) and `spelled`: `{ tokens, asWritten, ambiguous, byStem, asTranslated }` over the spelled tokens (`ambiguous`
303
+ * and `byStem` are among `asWritten`; see `writtenWords`).
304
+ */
305
+ export function spellable(file, carried) {
306
+ const spelled = { tokens: 0, asWritten: 0, ambiguous: 0, byStem: 0, asTranslated: 0 };
307
+ const glosses = file.glosses.map(([text, gloss], i) => {
308
+ const tokens = tokensOf(gloss);
309
+ const written = file.written?.[i]?.length === tokens.length ? file.written[i] : [];
310
+ return [text, tokens.map((token, k) => {
311
+ if (NOT_A_SIGN.test(token) || carried.has(token)) return token;
312
+ const [word, how] = written[k] ?? [null, 'none'];
313
+ spelled.tokens += 1;
314
+ if (word === null) { spelled.asTranslated += 1; return spelledWord(token); }
315
+ spelled.asWritten += 1;
316
+ if (how === 'order') spelled.ambiguous += 1;
317
+ if (how === 'stem') spelled.byStem += 1;
318
+ return spelledWord(word);
319
+ }).filter(Boolean).join(' ')];
320
+ });
321
+ return { file: { format: file.format, made: file.made, glosses }, spelled };
322
+ }
323
+
324
+ /** Reads one `--libras-texts` file: JSON (object or array), or an ES module whose default export is one. */
325
+ export async function readTexts(path) {
326
+ if (/\.(m?js)$/i.test(path)) return (await import(pathToFileURL(path).href)).default;
327
+ return JSON.parse(readFileSync(path, 'utf8'));
328
+ }
329
+
330
+ /**
331
+ * THE GLOSSES `--libras` WRITES: glosses the dictionaries and writes `glosses.json` into `folder` (the avatar's), every token
332
+ * the avatar carries no clip for (`carried`: by default the clip names `scripts/libras-avatar.json` pins, which is what the
333
+ * delivery ships) spelled as written (`spellable`). Returns what the build prints: the tokens signed and the tokens
334
+ * fingerspelled (each sorted), and `spelled` — how the spelled tokens were found. THROWS — and writes nothing — when the glosses
335
+ * cannot be made.
336
+ */
337
+ export async function deliverLibrasGlosses({ destino, folder, glossesFile, dictionaries, translate,
338
+ carried = Object.keys(readAvatarPins().clips) }) {
339
+ const texts = textsToGloss(dictionaries);
340
+ if (!texts.length) throw new Error('there is no text to gloss: the engine\'s Portuguese dictionary was not found');
341
+ const signs = new Set(carried);
342
+ if (!signs.size) throw new Error('the avatar carries no clip: every word would be fingerspelled, and there are no letters to spell with');
343
+ const file = await glossTexts(texts, translate);
344
+ const tokens = glossTokens(file);
345
+ const path = `${folder}${glossesFile}`;
346
+ mkdirSync(dirname(join(destino, path)), { recursive: true });
347
+ const { file: playable, spelled } = spellable(file, signs);
348
+ writeFileSync(join(destino, path), `${JSON.stringify(playable, null, 1)}\n`);
349
+ return { path, texts: texts.length, tokens: tokens.length, signed: tokens.filter((t) => signs.has(t)),
350
+ fingerspelled: tokens.filter((t) => !signs.has(t)), spelled };
351
+ }
@@ -0,0 +1,86 @@
1
+ -----------------------------------------------------------
2
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
3
+ -----------------------------------------------------------
4
+
5
+ PREAMBLE
6
+ The goals of the Open Font License (OFL) are to stimulate worldwide
7
+ development of collaborative font projects, to support the font creation
8
+ efforts of academic and linguistic communities, and to provide a free and
9
+ open framework in which fonts may be shared and improved in partnership
10
+ with others.
11
+
12
+ The OFL allows the licensed fonts to be used, studied, modified and
13
+ redistributed freely as long as they are not sold by themselves. The
14
+ fonts, including any derivative works, can be bundled, embedded,
15
+ redistributed and/or sold with any software provided that any reserved
16
+ names are not used by derivative works. The fonts and derivatives,
17
+ however, cannot be released under any other type of license. The
18
+ requirement for fonts to remain under this license does not apply
19
+ to any document created using the fonts or their derivatives.
20
+
21
+ DEFINITIONS
22
+ "Font Software" refers to the set of files released by the Copyright
23
+ Holder(s) under this license and clearly marked as such. This may
24
+ include source files, build scripts and documentation.
25
+
26
+ "Reserved Font Name" refers to any names specified as such after the
27
+ copyright statement(s).
28
+
29
+ "Original Version" refers to the collection of Font Software components as
30
+ distributed by the Copyright Holder(s).
31
+
32
+ "Modified Version" refers to any derivative made by adding to, deleting,
33
+ or substituting -- in part or in whole -- any of the components of the
34
+ Original Version, by changing formats or by porting the Font Software to a
35
+ new environment.
36
+
37
+ "Author" refers to any designer, engineer, programmer, technical
38
+ writer or other person who contributed to the Font Software.
39
+
40
+ PERMISSION & CONDITIONS
41
+ Permission is hereby granted, free of charge, to any person obtaining
42
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
43
+ redistribute, and sell modified and unmodified copies of the Font
44
+ Software, subject to the following conditions:
45
+
46
+ 1) Neither the Font Software nor any of its individual components,
47
+ in Original or Modified Versions, may be sold by itself.
48
+
49
+ 2) Original or Modified Versions of the Font Software may be bundled,
50
+ redistributed and/or sold with any software, provided that each copy
51
+ contains the above copyright notice and this license. These can be
52
+ included either as stand-alone text files, human-readable headers or
53
+ in the appropriate machine-readable metadata fields within text or
54
+ binary files as long as those fields can be easily viewed by the user.
55
+
56
+ 3) No Modified Version of the Font Software may use the Reserved Font
57
+ Name(s) unless explicit written permission is granted by the corresponding
58
+ Copyright Holder. This restriction only applies to the primary font name as
59
+ presented to the users.
60
+
61
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
62
+ Software shall not be used to promote, endorse or advertise any
63
+ Modified Version, except to acknowledge the contribution(s) of the
64
+ Copyright Holder(s) and the Author(s) or with their explicit written
65
+ permission.
66
+
67
+ 5) The Font Software, modified or unmodified, in part or in whole,
68
+ must be distributed entirely under this license, and must not be
69
+ distributed under any other license. The requirement for fonts to
70
+ remain under this license does not apply to any document created
71
+ using the Font Software.
72
+
73
+ TERMINATION
74
+ This license becomes null and void if any of the above conditions are
75
+ not met.
76
+
77
+ DISCLAIMER
78
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
79
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
80
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
81
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
82
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
83
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
84
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
85
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
86
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,96 @@
1
+ -------------------------------
2
+ UBUNTU FONT LICENCE Version 1.0
3
+ -------------------------------
4
+
5
+ PREAMBLE
6
+ This licence allows the licensed fonts to be used, studied, modified and
7
+ redistributed freely. The fonts, including any derivative works, can be
8
+ bundled, embedded, and redistributed provided the terms of this licence
9
+ are met. The fonts and derivatives, however, cannot be released under
10
+ any other licence. The requirement for fonts to remain under this
11
+ licence does not require any document created using the fonts or their
12
+ derivatives to be published under this licence, as long as the primary
13
+ purpose of the document is not to be a vehicle for the distribution of
14
+ the fonts.
15
+
16
+ DEFINITIONS
17
+ "Font Software" refers to the set of files released by the Copyright
18
+ Holder(s) under this licence and clearly marked as such. This may
19
+ include source files, build scripts and documentation.
20
+
21
+ "Original Version" refers to the collection of Font Software components
22
+ as received under this licence.
23
+
24
+ "Modified Version" refers to any derivative made by adding to, deleting,
25
+ or substituting -- in part or in whole -- any of the components of the
26
+ Original Version, by changing formats or by porting the Font Software to
27
+ a new environment.
28
+
29
+ "Copyright Holder(s)" refers to all individuals and companies who have a
30
+ copyright ownership of the Font Software.
31
+
32
+ "Substantially Changed" refers to Modified Versions which can be easily
33
+ identified as dissimilar to the Font Software by users of the Font
34
+ Software comparing the Original Version with the Modified Version.
35
+
36
+ To "Propagate" a work means to do anything with it that, without
37
+ permission, would make you directly or secondarily liable for
38
+ infringement under applicable copyright law, except executing it on a
39
+ computer or modifying a private copy. Propagation includes copying,
40
+ distribution (with or without modification and with or without charging
41
+ a redistribution fee), making available to the public, and in some
42
+ countries other activities as well.
43
+
44
+ PERMISSION & CONDITIONS
45
+ This licence does not grant any rights under trademark law and all such
46
+ rights are reserved.
47
+
48
+ Permission is hereby granted, free of charge, to any person obtaining a
49
+ copy of the Font Software, to propagate the Font Software, subject to
50
+ the below conditions:
51
+
52
+ 1) Each copy of the Font Software must contain the above copyright
53
+ notice and this licence. These can be included either as stand-alone
54
+ text files, human-readable headers or in the appropriate machine-
55
+ readable metadata fields within text or binary files as long as those
56
+ fields can be easily viewed by the user.
57
+
58
+ 2) The font name complies with the following:
59
+ (a) The Original Version must retain its name, unmodified.
60
+ (b) Modified Versions which are Substantially Changed must be renamed to
61
+ avoid use of the name of the Original Version or similar names entirely.
62
+ (c) Modified Versions which are not Substantially Changed must be
63
+ renamed to both (i) retain the name of the Original Version and (ii) add
64
+ additional naming elements to distinguish the Modified Version from the
65
+ Original Version. The name of such Modified Versions must be the name of
66
+ the Original Version, with "derivative X" where X represents the name of
67
+ the new work, appended to that name.
68
+
69
+ 3) The name(s) of the Copyright Holder(s) and any contributor to the
70
+ Font Software shall not be used to promote, endorse or advertise any
71
+ Modified Version, except (i) as required by this licence, (ii) to
72
+ acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
73
+ their explicit written permission.
74
+
75
+ 4) The Font Software, modified or unmodified, in part or in whole, must
76
+ be distributed entirely under this licence, and must not be distributed
77
+ under any other licence. The requirement for fonts to remain under this
78
+ licence does not affect any document created using the Font Software,
79
+ except any version of the Font Software extracted from a document
80
+ created using the Font Software may only be distributed under this
81
+ licence.
82
+
83
+ TERMINATION
84
+ This licence becomes null and void if any of the above conditions are
85
+ not met.
86
+
87
+ DISCLAIMER
88
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
89
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
90
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
91
+ COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
92
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
93
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
94
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
95
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
96
+ DEALINGS IN THE FONT SOFTWARE.