@overcrow/mcp 0.0.0 → 0.1.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 (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -1
  3. package/dist/audit/index.js +103 -0
  4. package/dist/audit/lexer.js +417 -0
  5. package/dist/audit/project.js +200 -0
  6. package/dist/audit/rules.js +661 -0
  7. package/dist/bootstrap/download.js +229 -0
  8. package/dist/bootstrap/install.js +280 -0
  9. package/dist/bootstrap/pin.js +85 -0
  10. package/dist/bootstrap/pin.json +119 -0
  11. package/dist/bootstrap/zip.js +258 -0
  12. package/dist/cli.js +200 -0
  13. package/dist/confine.js +244 -0
  14. package/dist/content/docs/en/cli.md +353 -0
  15. package/dist/content/docs/en/dev-channel.md +130 -0
  16. package/dist/content/docs/en/elements.md +469 -0
  17. package/dist/content/docs/en/forms.md +328 -0
  18. package/dist/content/docs/en/guide.md +253 -0
  19. package/dist/content/docs/en/index.md +85 -0
  20. package/dist/content/docs/en/limits.md +241 -0
  21. package/dist/content/docs/en/logic.md +446 -0
  22. package/dist/content/docs/en/manifest.md +381 -0
  23. package/dist/content/docs/en/mcp.md +165 -0
  24. package/dist/content/docs/en/package.md +131 -0
  25. package/dist/content/docs/en/publishing.md +162 -0
  26. package/dist/content/docs/en/reference.md +55 -0
  27. package/dist/content/docs/en/result-shapes.md +332 -0
  28. package/dist/content/docs/en/sdk.md +295 -0
  29. package/dist/content/docs/en/security.md +115 -0
  30. package/dist/content/docs/en/service-reference.md +344 -0
  31. package/dist/content/docs/en/services.md +517 -0
  32. package/dist/content/docs/en/style-properties.md +270 -0
  33. package/dist/content/docs/en/style.md +266 -0
  34. package/dist/content/docs/en/testing.md +400 -0
  35. package/dist/content/docs/en/view.md +338 -0
  36. package/dist/content/docs/en/widgets.md +76 -0
  37. package/dist/content/docs/fr/cli.md +367 -0
  38. package/dist/content/docs/fr/dev-channel.md +140 -0
  39. package/dist/content/docs/fr/elements.md +475 -0
  40. package/dist/content/docs/fr/forms.md +341 -0
  41. package/dist/content/docs/fr/guide.md +264 -0
  42. package/dist/content/docs/fr/index.md +90 -0
  43. package/dist/content/docs/fr/limits.md +244 -0
  44. package/dist/content/docs/fr/logic.md +461 -0
  45. package/dist/content/docs/fr/manifest.md +392 -0
  46. package/dist/content/docs/fr/mcp.md +173 -0
  47. package/dist/content/docs/fr/package.md +139 -0
  48. package/dist/content/docs/fr/publishing.md +172 -0
  49. package/dist/content/docs/fr/reference.md +59 -0
  50. package/dist/content/docs/fr/result-shapes.md +333 -0
  51. package/dist/content/docs/fr/sdk.md +301 -0
  52. package/dist/content/docs/fr/security.md +129 -0
  53. package/dist/content/docs/fr/service-reference.md +346 -0
  54. package/dist/content/docs/fr/services.md +540 -0
  55. package/dist/content/docs/fr/style-properties.md +272 -0
  56. package/dist/content/docs/fr/style.md +281 -0
  57. package/dist/content/docs/fr/testing.md +417 -0
  58. package/dist/content/docs/fr/view.md +352 -0
  59. package/dist/content/docs/fr/widgets.md +81 -0
  60. package/dist/content/examples/clock/LICENSE +21 -0
  61. package/dist/content/examples/clock/README.md +75 -0
  62. package/dist/content/examples/clock/listing.json +19 -0
  63. package/dist/content/examples/clock/locales/en.json +4 -0
  64. package/dist/content/examples/clock/locales/fr.json +4 -0
  65. package/dist/content/examples/clock/logic.ts +85 -0
  66. package/dist/content/examples/clock/manifest.json +44 -0
  67. package/dist/content/examples/clock/package.json +16 -0
  68. package/dist/content/examples/clock/style.ocss +26 -0
  69. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  70. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  71. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  72. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  73. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  74. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  75. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  76. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  77. package/dist/content/examples/clock/tsconfig.json +16 -0
  78. package/dist/content/examples/clock/view.ocml +8 -0
  79. package/dist/content/examples/countdown/LICENSE +20 -0
  80. package/dist/content/examples/countdown/listing.json +10 -0
  81. package/dist/content/examples/countdown/locales/en.json +15 -0
  82. package/dist/content/examples/countdown/locales/fr.json +15 -0
  83. package/dist/content/examples/countdown/logic.ts +179 -0
  84. package/dist/content/examples/countdown/manifest.json +34 -0
  85. package/dist/content/examples/countdown/package.json +15 -0
  86. package/dist/content/examples/countdown/style.ocss +94 -0
  87. package/dist/content/examples/countdown/tsconfig.json +16 -0
  88. package/dist/content/examples/countdown/view.ocml +42 -0
  89. package/dist/content/examples/fps/LICENSE +21 -0
  90. package/dist/content/examples/fps/README.md +64 -0
  91. package/dist/content/examples/fps/listing.json +19 -0
  92. package/dist/content/examples/fps/locales/en.json +11 -0
  93. package/dist/content/examples/fps/locales/fr.json +11 -0
  94. package/dist/content/examples/fps/logic.ts +64 -0
  95. package/dist/content/examples/fps/manifest.json +30 -0
  96. package/dist/content/examples/fps/package.json +16 -0
  97. package/dist/content/examples/fps/style.ocss +31 -0
  98. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  99. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  100. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  101. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  102. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  103. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  104. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  105. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  106. package/dist/content/examples/fps/tsconfig.json +16 -0
  107. package/dist/content/examples/fps/view.ocml +11 -0
  108. package/dist/content/examples/media/LICENSE +21 -0
  109. package/dist/content/examples/media/README.md +147 -0
  110. package/dist/content/examples/media/listing.json +19 -0
  111. package/dist/content/examples/media/locales/en.json +11 -0
  112. package/dist/content/examples/media/locales/fr.json +11 -0
  113. package/dist/content/examples/media/logic.ts +191 -0
  114. package/dist/content/examples/media/manifest.json +35 -0
  115. package/dist/content/examples/media/package.json +16 -0
  116. package/dist/content/examples/media/style.ocss +148 -0
  117. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  118. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  119. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  120. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  121. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  122. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  123. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  124. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  125. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  126. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  127. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  128. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  129. package/dist/content/examples/media/tsconfig.json +16 -0
  130. package/dist/content/examples/media/view.ocml +41 -0
  131. package/dist/content/examples/notes/LICENSE +21 -0
  132. package/dist/content/examples/notes/README.md +219 -0
  133. package/dist/content/examples/notes/listing.json +19 -0
  134. package/dist/content/examples/notes/locales/en.json +25 -0
  135. package/dist/content/examples/notes/locales/fr.json +25 -0
  136. package/dist/content/examples/notes/logic.ts +799 -0
  137. package/dist/content/examples/notes/manifest.json +40 -0
  138. package/dist/content/examples/notes/package.json +16 -0
  139. package/dist/content/examples/notes/style.ocss +469 -0
  140. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  141. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  142. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  143. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  144. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  145. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  146. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  147. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  148. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  149. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  150. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  151. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  152. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  153. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  154. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  155. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  156. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  157. package/dist/content/examples/notes/tsconfig.json +16 -0
  158. package/dist/content/examples/notes/view.ocml +154 -0
  159. package/dist/content/examples/performance/LICENSE +21 -0
  160. package/dist/content/examples/performance/README.md +134 -0
  161. package/dist/content/examples/performance/listing.json +19 -0
  162. package/dist/content/examples/performance/locales/en.json +20 -0
  163. package/dist/content/examples/performance/locales/fr.json +20 -0
  164. package/dist/content/examples/performance/logic.ts +210 -0
  165. package/dist/content/examples/performance/manifest.json +83 -0
  166. package/dist/content/examples/performance/package.json +16 -0
  167. package/dist/content/examples/performance/style.ocss +75 -0
  168. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  169. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  170. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  171. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  172. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  173. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  174. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  175. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  176. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  177. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  178. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  179. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  180. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  181. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  182. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  183. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  184. package/dist/content/examples/performance/tsconfig.json +16 -0
  185. package/dist/content/examples/performance/view.ocml +18 -0
  186. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  187. package/dist/content/examples/playervox-journal/README.md +150 -0
  188. package/dist/content/examples/playervox-journal/listing.json +19 -0
  189. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  190. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  191. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  192. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  193. package/dist/content/examples/playervox-journal/package.json +16 -0
  194. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  195. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  196. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  197. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  198. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  199. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  200. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  201. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  202. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  203. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  204. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  205. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  206. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  207. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  208. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  209. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  210. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  211. package/dist/content/examples/playervox-rating/README.md +166 -0
  212. package/dist/content/examples/playervox-rating/listing.json +19 -0
  213. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  214. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  215. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  216. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  217. package/dist/content/examples/playervox-rating/package.json +16 -0
  218. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  219. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  220. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  221. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  222. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  223. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  224. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  225. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  226. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  227. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  228. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  229. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  230. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  231. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  232. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  233. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  234. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  235. package/dist/content/examples/playervox-reviews/README.md +194 -0
  236. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  237. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  238. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  239. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  240. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  241. package/dist/content/examples/playervox-reviews/package.json +16 -0
  242. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  243. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  244. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  245. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  246. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  247. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  248. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  249. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  250. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  251. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  252. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  253. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  254. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  255. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  256. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  257. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  258. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  259. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  260. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  261. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  262. package/dist/content/examples/playervox-score/LICENSE +21 -0
  263. package/dist/content/examples/playervox-score/README.md +131 -0
  264. package/dist/content/examples/playervox-score/listing.json +19 -0
  265. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  266. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  267. package/dist/content/examples/playervox-score/logic.ts +430 -0
  268. package/dist/content/examples/playervox-score/manifest.json +47 -0
  269. package/dist/content/examples/playervox-score/package.json +16 -0
  270. package/dist/content/examples/playervox-score/style.ocss +247 -0
  271. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  272. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  273. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  274. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  275. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  276. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  277. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  278. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  279. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  280. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  281. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-score/view.ocml +51 -0
  283. package/dist/content/examples/session/LICENSE +21 -0
  284. package/dist/content/examples/session/README.md +57 -0
  285. package/dist/content/examples/session/listing.json +19 -0
  286. package/dist/content/examples/session/locales/en.json +3 -0
  287. package/dist/content/examples/session/locales/fr.json +3 -0
  288. package/dist/content/examples/session/logic.ts +26 -0
  289. package/dist/content/examples/session/manifest.json +19 -0
  290. package/dist/content/examples/session/package.json +16 -0
  291. package/dist/content/examples/session/style.ocss +16 -0
  292. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  293. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  294. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  295. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  296. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  297. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  298. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  299. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  300. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  301. package/dist/content/examples/session/tsconfig.json +16 -0
  302. package/dist/content/examples/session/view.ocml +11 -0
  303. package/dist/content/examples/stopwatch/LICENSE +21 -0
  304. package/dist/content/examples/stopwatch/README.md +99 -0
  305. package/dist/content/examples/stopwatch/listing.json +19 -0
  306. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  307. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  308. package/dist/content/examples/stopwatch/logic.ts +93 -0
  309. package/dist/content/examples/stopwatch/manifest.json +19 -0
  310. package/dist/content/examples/stopwatch/package.json +16 -0
  311. package/dist/content/examples/stopwatch/style.ocss +54 -0
  312. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  313. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  314. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  315. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  316. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  318. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  319. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  320. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  321. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  322. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  323. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  324. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  325. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  326. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  327. package/dist/content/examples/stopwatch/view.ocml +29 -0
  328. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  329. package/dist/content/examples/twitch-chat/README.md +283 -0
  330. package/dist/content/examples/twitch-chat/listing.json +19 -0
  331. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  332. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  333. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  334. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  335. package/dist/content/examples/twitch-chat/package.json +16 -0
  336. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  337. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  338. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  339. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  340. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  341. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  342. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  343. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  344. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  345. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  346. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  347. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  348. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  349. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  350. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  351. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  352. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  353. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  354. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  355. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  356. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  357. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  358. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  359. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  360. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  361. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  362. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  363. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  364. package/dist/content/examples/warframe-market/LICENSE +21 -0
  365. package/dist/content/examples/warframe-market/README.md +176 -0
  366. package/dist/content/examples/warframe-market/listing.json +19 -0
  367. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  368. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  369. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  370. package/dist/content/examples/warframe-market/manifest.json +92 -0
  371. package/dist/content/examples/warframe-market/package.json +16 -0
  372. package/dist/content/examples/warframe-market/style.ocss +422 -0
  373. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  374. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  375. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  376. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  377. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  378. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  379. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  380. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  381. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  382. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  383. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  384. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  385. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  386. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  387. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  388. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  389. package/dist/content/examples/warframe-market/view.ocml +116 -0
  390. package/dist/content/examples/weather/LICENSE +20 -0
  391. package/dist/content/examples/weather/listing.json +10 -0
  392. package/dist/content/examples/weather/locales/en.json +9 -0
  393. package/dist/content/examples/weather/locales/fr.json +9 -0
  394. package/dist/content/examples/weather/logic.ts +62 -0
  395. package/dist/content/examples/weather/manifest.json +51 -0
  396. package/dist/content/examples/weather/package.json +15 -0
  397. package/dist/content/examples/weather/style.ocss +29 -0
  398. package/dist/content/examples/weather/tsconfig.json +16 -0
  399. package/dist/content/examples/weather/view.ocml +12 -0
  400. package/dist/content/index.json +3601 -0
  401. package/dist/content/reference/errors.json +1712 -0
  402. package/dist/content/reference/limits.json +1154 -0
  403. package/dist/content/reference/manifest.md +223 -0
  404. package/dist/content/reference/permissions.json +413 -0
  405. package/dist/content/templates/blank/locales/en.json +3 -0
  406. package/dist/content/templates/blank/locales/fr.json +3 -0
  407. package/dist/content/templates/blank/logic.ts +7 -0
  408. package/dist/content/templates/blank/manifest.json +16 -0
  409. package/dist/content/templates/blank/style.ocss +10 -0
  410. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  411. package/dist/content/templates/blank/view.ocml +6 -0
  412. package/dist/content/templates/chart/locales/en.json +3 -0
  413. package/dist/content/templates/chart/locales/fr.json +3 -0
  414. package/dist/content/templates/chart/logic.ts +27 -0
  415. package/dist/content/templates/chart/manifest.json +16 -0
  416. package/dist/content/templates/chart/style.ocss +27 -0
  417. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  418. package/dist/content/templates/chart/view.ocml +10 -0
  419. package/dist/content/templates/counter/locales/en.json +4 -0
  420. package/dist/content/templates/counter/locales/fr.json +4 -0
  421. package/dist/content/templates/counter/logic.ts +20 -0
  422. package/dist/content/templates/counter/manifest.json +16 -0
  423. package/dist/content/templates/counter/style.ocss +26 -0
  424. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  425. package/dist/content/templates/counter/view.ocml +13 -0
  426. package/dist/content/templates/list/locales/en.json +8 -0
  427. package/dist/content/templates/list/locales/fr.json +8 -0
  428. package/dist/content/templates/list/logic.ts +35 -0
  429. package/dist/content/templates/list/manifest.json +16 -0
  430. package/dist/content/templates/list/style.ocss +42 -0
  431. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  432. package/dist/content/templates/list/view.ocml +17 -0
  433. package/dist/content/templates/shared/LICENSE +20 -0
  434. package/dist/content/templates/shared/package.json +14 -0
  435. package/dist/content/templates/shared/tsconfig.json +16 -0
  436. package/dist/content.js +68 -0
  437. package/dist/env.js +156 -0
  438. package/dist/fingerprint.js +32 -0
  439. package/dist/ids.js +27 -0
  440. package/dist/index.js +82 -0
  441. package/dist/knowledge.js +222 -0
  442. package/dist/npm.js +149 -0
  443. package/dist/prompts.js +47 -0
  444. package/dist/resources.js +82 -0
  445. package/dist/run.js +120 -0
  446. package/dist/server.js +43 -0
  447. package/dist/session.js +205 -0
  448. package/dist/sources.js +218 -0
  449. package/dist/text.js +80 -0
  450. package/dist/texts.js +44 -0
  451. package/dist/tools/audit.js +105 -0
  452. package/dist/tools/build.js +453 -0
  453. package/dist/tools/common.js +122 -0
  454. package/dist/tools/docs.js +196 -0
  455. package/dist/tools/preview.js +87 -0
  456. package/dist/tools/project.js +178 -0
  457. package/dist/tools/setup.js +146 -0
  458. package/dist/tools/submission.js +369 -0
  459. package/dist/version.js +3 -0
  460. package/npm-shrinkwrap.json +402 -0
  461. package/package.json +50 -4
@@ -0,0 +1,338 @@
1
+ # The view
2
+
3
+ `view.ocml` describes what a PlayerVox OverCrow widget shows: a tree of
4
+ elements, bound to the widget's state with `{…}` expressions. It looks like
5
+ HTML or JSX, but it is neither: the set of elements is closed, there is no
6
+ DOM and no script in the view. OverCrow lays out and paints the tree
7
+ itself.
8
+
9
+ <!-- source: templates/list/view.ocml -->
10
+ ```xml
11
+ <box class="checklist">
12
+ <text class="title">{t("title")}</text>
13
+ <list class="items" item-height="32">
14
+ <for each={state.items} as="item" key={item.id}>
15
+ <box class="row">
16
+ <checkbox label={item.text} checked={item.done} on:change={setDone(item.id, event.value)}/>
17
+ <text class={item.done ? "text done" : "text"}>{item.text}</text>
18
+ <button class="remove" label={t("remove")} on:activate={remove(item.id)}>
19
+ <icon name="x"/>
20
+ </button>
21
+ </box>
22
+ </for>
23
+ </list>
24
+ <text class="summary">{t("remaining", { count: remaining(state.items) })}</text>
25
+ </box>
26
+ ```
27
+
28
+ This is the checklist template: a title, a scrolling `list` that repeats a
29
+ row per item, and a summary. The logic exports `setDone`, `remove` and
30
+ `remaining`; `t` reads the messages of `locales/`.
31
+
32
+ The view is compiled when the widget is packaged: `overcrow-widget check`
33
+ reports every mistake with its line and column, and an unknown element,
34
+ attribute or event is an error, never ignored. The source file itself is
35
+ not shipped.
36
+
37
+ ## Markup
38
+
39
+ - The file is UTF-8, without a byte-order mark.
40
+ - The document is a list of top-level nodes: `<component>` declarations and
41
+ the children of the widget's root, which is a `box`.
42
+ - Elements are lowercase: `<name …>…</name>` or `<name …/>`.
43
+ - An attribute value is quoted text (`"…"` or `'…'`), an expression
44
+ (`{…}`), or nothing, which means `true`: `<button submit>`. Attributes
45
+ are separated by whitespace and never repeated.
46
+ - Comments are `<!-- … -->`, without `--` inside.
47
+ - DOCTYPE, processing instructions, CDATA sections and namespaces are
48
+ refused.
49
+
50
+ The entities are `&amp;` `&lt;` `&gt;` `&quot;` `&apos;` `&lbrace;`
51
+ `&rbrace;` `&nbsp;`, and `&#…;` or `&#x…;` for any character that is not a
52
+ control character. A literal `{` or `}` in a quoted value, and a lone `}`
53
+ in text, are refused: write `&lbrace;` and `&rbrace;`.
54
+
55
+ ## Elements
56
+
57
+ Each element has a fixed content, a set of attributes and the events it can
58
+ send. Containers (`box`, `scroll`, `list`, `form`, `popover`, `button`)
59
+ hold other elements; `text` holds text and inline children; the others are
60
+ leaves that OverCrow draws: `icon`, `image`, `toggle`, `slider`, `field`,
61
+ `chart`, `gauge`…
62
+
63
+ <!-- generated:element-list -->
64
+ | Element | Meaning |
65
+ | --- | --- |
66
+ | [`box`](elements.md#box) | Generic container; flex or grid layout comes from style. The root of the view is a `box`. |
67
+ | [`scroll`](elements.md#scroll) | Clipping container scrolled by the host with wheel, drag and keyboard. |
68
+ | [`list`](elements.md#list) | Vertical scrolling list whose children are laid out and painted only when visible. |
69
+ | [`text`](elements.md#text) | Block of wrapped text; its inline children flow with it (chat line with emotes). |
70
+ | [`span`](elements.md#span) | Styled run of text inside `text`. |
71
+ | [`icon`](elements.md#icon) | Lucide icon tinted with `color`, sized by `font-size` unless `width` and `height` are set. |
72
+ | [`image`](elements.md#image) | Raster image from the package, or an image handed by a service (an `asset:` handle); `object-fit` applies. |
73
+ | [`avatar`](elements.md#avatar) | Round image with a text fallback while the image is missing or failed. |
74
+ | [`badge`](elements.md#badge) | Short pill of text. |
75
+ | [`button`](elements.md#button) | Activatable control; its children (icon, text) form its content. |
76
+ | [`toggle`](elements.md#toggle) | On/off switch. |
77
+ | [`checkbox`](elements.md#checkbox) | Check control (checklists). |
78
+ | [`slider`](elements.md#slider) | Numeric range control; dragging is handled by the host. |
79
+ | [`select`](elements.md#select) | Drop-down choice; the open list is drawn by the host. |
80
+ | [`option`](elements.md#option) | Choice of a `select`; its text is the visible label. |
81
+ | [`field`](elements.md#field) | Single-line text input edited by the host, input methods (IME) included. |
82
+ | [`textarea`](elements.md#textarea) | Multi-line text input edited by the host, input methods (IME) included. |
83
+ | [`form`](elements.md#form) | Groups named controls. With `intent`, submitting sends their values to a write service directly from the host; the widget's logic never supplies that content. |
84
+ | [`elapsed`](elements.md#elapsed) | Duration text advanced by the host from an anchor given by a service, so a running stopwatch needs no work from the logic. Styled like `text`; repainted only when the shown text changes, at most at 60 Hz, and never while hidden. |
85
+ | [`progress`](elements.md#progress) | Horizontal progress bar. |
86
+ | [`gauge`](elements.md#gauge) | Ring or arc gauge. |
87
+ | [`chart`](elements.md#chart) | Line, area, bar or sparkline chart drawn by the host. |
88
+ | [`series`](elements.md#series) | One data series of a `chart`, coloured with `color`. |
89
+ | [`separator`](elements.md#separator) | Thin rule between groups. |
90
+ | [`canvas`](elements.md#canvas) | Surface painted by the host from the latest list of commands given to `draw`. |
91
+ | [`popover`](elements.md#popover) | Floating panel anchored to an element, drawn above the content and clipped to the widget's frame (drop-downs, context menus). |
92
+ <!-- /generated:element-list -->
93
+
94
+ [Elements and attributes](elements.md) gives the attributes and events of
95
+ each one.
96
+
97
+ ## Text
98
+
99
+ Text is allowed only in `text`, `span`, `badge` and `option`. A `text` holds
100
+ either text or inline children (`span`, `icon`, `image`), not both: to
101
+ style one word, put every run in a `span`.
102
+
103
+ <!-- source: widgets/performance/view.ocml -->
104
+ ```xml
105
+ <text class={row.valueClass} label={row.name} tooltip={row.hint}><span>{row.value}</span><if test={row.unit != ""}><span class="unit">{row.unit}</span></if></text>
106
+ ```
107
+
108
+ Whitespace follows the rule of JSX:
109
+
110
+ - tabs become spaces;
111
+ - a line break between two words becomes one space;
112
+ - a line break next to a tag or an expression disappears with its
113
+ indentation;
114
+ - a run of whitespace next to a tag is dropped; one between two expressions
115
+ on the same line is kept.
116
+
117
+ So a break before an expression removes the space before it: write
118
+ `you have {state.count} messages` on one line to keep both spaces, or
119
+ write `&#32;` where you need a space that the rule would remove.
120
+
121
+ ## Attributes
122
+
123
+ A quoted value is converted to the attribute's type and checked when the
124
+ view is compiled:
125
+
126
+ | Type | Quoted value |
127
+ | --- | --- |
128
+ | boolean | `true` or `false`; the bare attribute means `true` |
129
+ | integer | a decimal integer, without a leading zero |
130
+ | number | a decimal number, without an exponent |
131
+ | number list | numbers separated by spaces: `values="12 18.5 30"` |
132
+ | text, identifier | the text itself |
133
+ | image | a file of the package: `src="assets/logo.png"` |
134
+
135
+ `attr={expression}` binds the attribute to an expression instead; OverCrow
136
+ checks every value the widget sends. Values that exist only when the widget
137
+ runs, such as an image handed by a service, must be bound.
138
+
139
+ Five attributes exist on every element:
140
+
141
+ <!-- generated:common-attributes -->
142
+ | Attribute | Type | Required | Meaning |
143
+ | --- | --- | --- | --- |
144
+ | `class` | class list | no | Style classes: distinct names separated by one space. |
145
+ | `ref` | static `ref` name | no | Name by which `draw` designates this `canvas` and by which an attribute such as the `anchor` of a `popover` designates this element. Static, unique in the view, and not allowed inside a `for` or a component body, where it would name several elements. |
146
+ | `label` | text ≤ 256 bytes | no | Accessible name; required on icon-only controls. |
147
+ | `tooltip` | text ≤ 256 bytes | no | Plain text drawn by the host on hover or focus. |
148
+ | `on` | sorted event names | no | Events forwarded to the logic; written `on:<event>` in the view. |
149
+ <!-- /generated:common-attributes -->
150
+
151
+ `class` is the hook of the [style](style.md). `label` is the accessible
152
+ name of the element: give one to every control whose content is an icon.
153
+
154
+ ### Names for nodes: `ref`
155
+
156
+ `ref="name"` gives a node a name. Two things use it: `draw(name, commands)`
157
+ paints the `canvas` of that name, and a `popover` is placed against the
158
+ node its `anchor` names.
159
+
160
+ <!-- source: docs/content/examples/countdown/view.ocml -->
161
+ ```xml
162
+ <box ref="panel" class="countdown" on:contextmenu={openMenu}>
163
+ ```
164
+
165
+ <!-- source: docs/content/examples/countdown/view.ocml -->
166
+ ```xml
167
+ <popover anchor="panel" placement="pointer" open={state.menu} on:dismiss={closeMenu}>
168
+ <button class="menu-row" on:activate={resetRounds}>
169
+ <text class="menu-text">{t("reset-rounds")}</text>
170
+ </button>
171
+ </popover>
172
+ ```
173
+
174
+ A `ref` is always quoted, unique in the view, and refused inside a `for` or
175
+ a component, where it would name several nodes.
176
+
177
+ ## Events
178
+
179
+ `on:event={handler}` asks OverCrow to send an event of the element to the
180
+ logic. Without it, the widget does not hear about the event at all: a
181
+ widget is not told about pointer moves or key presses it has not asked for.
182
+
183
+ A handler is written in one of two ways:
184
+
185
+ - **the name of a function** exported by the logic, called with the event's
186
+ detail: `on:activate={increment}`;
187
+ - **a call**, with the arguments you choose; in it, `event` is the event's
188
+ detail: `on:change={setDone(item.id, event.value)}`.
189
+
190
+ <!-- source: templates/list/view.ocml -->
191
+ ```xml
192
+ <checkbox label={item.text} checked={item.done} on:change={setDone(item.id, event.value)}/>
193
+ <text class={item.done ? "text done" : "text"}>{item.text}</text>
194
+ <button class="remove" label={t("remove")} on:activate={remove(item.id)}>
195
+ <icon name="x"/>
196
+ </button>
197
+ ```
198
+
199
+ The events are `activate`, `contextmenu`, `wheel`, `keydown`, `input`,
200
+ `change`, `submit`, `focus`, `blur`, `reachend`, `stick` and `dismiss`;
201
+ [events](elements.md#events) describes each one and the detail it carries,
202
+ and each [element](elements.md#elements) lists the ones it sends. Some of
203
+ them are user actions, during which a widget may call a protected service;
204
+ see [calls that need a user action](services.md#calls-that-need-a-user-action).
205
+ Widgets receive input only in OverCrow's Interactive mode: in Passive mode,
206
+ clicks go through them to the game.
207
+
208
+ ## Conditions, loops and components
209
+
210
+ <!-- generated:constructs -->
211
+ | Syntax | Meaning |
212
+ | --- | --- |
213
+ | `{expr}` | Interpolates an expression into text or an attribute value. |
214
+ | `<if test={expr}> … <else-if test={expr}> … <else>` | Conditional subtree. |
215
+ | `<for each={expr} as="item" key={expr}>` | Repeats a subtree; `key` is mandatory and must be unique among siblings. |
216
+ | `<component name="x" props="a b"> … <slot/> … </component>` | Local component with declared properties and one slot, used as `<x a={…}>`. |
217
+ | `on:<event>={handler}` | Subscribes the element to one of its events and names the handler of the logic. |
218
+ <!-- /generated:constructs -->
219
+
220
+ ### `if`, `else-if`, `else`
221
+
222
+ <!-- source: widgets/stopwatch/view.ocml -->
223
+ ```xml
224
+ <if test={state.stopwatch.running}>
225
+ <icon name="pause"/>
226
+ </if>
227
+ <else>
228
+ <icon name="play"/>
229
+ </else>
230
+ ```
231
+
232
+ `else-if` and `else` follow an `if` directly; only whitespace and comments
233
+ may separate them.
234
+
235
+ ### `for`
236
+
237
+ `for` repeats its children for each item of a list. `each`, `as` and `key`
238
+ are all required, and the key must be unique among the repeated items: it
239
+ is how OverCrow knows which row moved, appeared or went away.
240
+
241
+ <!-- source: widgets/warframe-market/view.ocml -->
242
+ ```xml
243
+ <for each={state.results} as="item" key={item.slug}>
244
+ <button class="result" label={item.name} on:activate={select(item.slug)}>
245
+ <text class="result-name">{item.name}</text>
246
+ <icon class="result-arrow" name="chevron-right"/>
247
+ </button>
248
+ </for>
249
+ ```
250
+
251
+ For a long list, put the `for` in a `list` element: OverCrow lays out and
252
+ paints only the rows that are visible.
253
+
254
+ ### Components
255
+
256
+ A component is a piece of view with a name and declared properties, to
257
+ write once and use several times. It is local to the view.
258
+
259
+ <!-- source: docs/content/examples/countdown/view.ocml -->
260
+ ```xml
261
+ <component name="stat" props="name value">
262
+ <box class="stat">
263
+ <text class="stat-name">{name}</text>
264
+ <text class="stat-value">{value}</text>
265
+ </box>
266
+ </component>
267
+ ```
268
+
269
+ <!-- source: docs/content/examples/countdown/view.ocml -->
270
+ ```xml
271
+ <stat name={t("state")} value={stateText(state.running, state.remainingMs)}/>
272
+ ```
273
+
274
+ - Components are declared at the top level, once each, with a name that is
275
+ not an element's.
276
+ - The body sees only its own properties, not the names around the place
277
+ where it is used. Pass what it needs.
278
+ - A use passes declared properties only. A quoted property is text; bind
279
+ it (`value={5}`) for any other type.
280
+ - A body may contain one `<slot/>`, where the children of each use go.
281
+ - A component cannot contain itself, and a use cannot take `on:` handlers:
282
+ put them on elements inside the body.
283
+
284
+ `if`, `for` and components are transparent for the content rules: their
285
+ children must suit the element around them.
286
+
287
+ ## Expressions
288
+
289
+ Expressions are a small, strict subset of JavaScript:
290
+
291
+ - literals: numbers (`0`, `12`, `1.5`), strings, `true`, `false`, `null`,
292
+ array and object literals;
293
+ - names in scope and their members: `a.b`, `a?.b`, `a[i]`, `a?.[i]`;
294
+ - operators: `!`, unary `-` and `+`, `* / %`, `+ -`, `< <= > >=`,
295
+ `== != === !==`, `&&`, `||`, `??`, and `a ? b : c`. `??` cannot be mixed
296
+ with `&&` or `||` without parentheses;
297
+ - calls of functions exported by the logic, by their bare name:
298
+ `remaining(state.items)`. `t(key, params)` is one of them.
299
+
300
+ The names in scope are `state`, the `as` names of the enclosing `for`s, the
301
+ properties of the enclosing component, and `event` in a handler. A name
302
+ cannot hide another one.
303
+
304
+ There is no assignment, no arrow or function literal, no `new`, `this`,
305
+ template literal, regular expression, method call or global: anything more
306
+ than a simple computation belongs in a function of the logic. This is what
307
+ keeps the view checkable: when a widget is packaged, every expression is
308
+ compiled into a function of `logic.js`, and the view itself carries no
309
+ code.
310
+
311
+ <!-- source: templates/list/view.ocml -->
312
+ ```xml
313
+ <text class={item.done ? "text done" : "text"}>{item.text}</text>
314
+ ```
315
+
316
+ JavaScript reserved words, `constructor`, `prototype`, `eval`, `undefined`,
317
+ `globalThis`, `overcrow` and any name starting with `__` are refused.
318
+
319
+ ## When the view is wrong
320
+
321
+ Every problem is a diagnostic of `overcrow-widget check`, with a stable
322
+ code:
323
+
324
+ | Code | Problem |
325
+ | --- | --- |
326
+ | `view.syntax`, `view.encoding`, `view.size`, `view.invalid_entity` | The file is not well-formed markup. |
327
+ | `view.unknown_element`, `view.invalid_parent` | An element that does not exist, or in a place it cannot be. |
328
+ | `view.unknown_attribute`, `view.duplicate_attribute`, `view.invalid_attribute`, `view.missing_attribute` | An attribute that the element does not have, written twice, with a wrong value, or required and absent. |
329
+ | `view.unknown_event`, `view.invalid_handler` | An event the element does not send (or put on a component use), or a handler that is neither a name nor a call. |
330
+ | `view.expression_syntax`, `view.expression_too_long`, `view.expression_too_deep`, `view.expression_too_many_entries` | An expression outside the subset or its bounds. |
331
+ | `view.reserved_name`, `view.unknown_name` | A refused name, or one that is not in scope. |
332
+ | `view.invalid_text` | Text where the element takes none, or mixed with inline children. |
333
+ | `view.invalid_component`, `view.recursive_component`, `view.invalid_slot`, `view.invalid_construct` | A component, slot, `if` or `for` that breaks its rules. |
334
+ | `view.invalid_ref`, `view.unknown_ref` | A `ref` that is not unique or is inside a `for`, or an `anchor` that names none. |
335
+ | `view.missing_asset` | A static image that is not in `assets/`. |
336
+ | `view.bound_value` | A `value` on a control of a form bound to a write intent; see [forms](forms.md#forms-that-write-user-data). |
337
+ | `view.too_many_elements`, `view.too_many_components`, `view.too_many_children`, `view.too_many_expressions`, `view.too_deep` | A [limit](limits.md) of the view is exceeded. |
338
+ | `logic.missing_export` | The view calls a function that the logic does not export. |
@@ -0,0 +1,76 @@
1
+ # Reference widgets
2
+
3
+ The built-in widgets of PlayerVox OverCrow are ordinary widgets written with
4
+ the public SDK, packaged by `overcrow-widget` and published in the signed
5
+ catalog like yours. Their sources live in
6
+ [`widgets/`](../../../widgets/) of the public repository, under the MIT
7
+ license: read them, copy them, and use them as a starting point.
8
+
9
+ <!-- generated:widgets -->
10
+ | Widget | Description | ID | Permissions | Source |
11
+ | --- | --- | --- | --- | --- |
12
+ | **Clock** | Shows the local time of day and, optionally, the date, in a 24-hour format. | `com.playervox.overcrow.clock` | none | [widgets/clock/](../../../widgets/clock/) |
13
+ | **FPS** | Shows the game’s presented frame rate, when the host has a frame rate source. | `com.playervox.overcrow.fps` | `fps.read` | [widgets/fps/](../../../widgets/fps/) |
14
+ | **Media** | The track your music player is playing, with its cover, and previous, play/pause and next buttons in Interactive mode. | `com.playervox.overcrow.media` | `media.read`, `media.control` | [widgets/media/](../../../widgets/media/) |
15
+ | **Notes** | Your notes and checklists over the game: up to eight notes, each with free text and a checklist, the same for every game. Read them in Passive mode; in Interactive mode choose, create, delete and edit them in the widget, and tick entries off. They stay on this computer. | `com.playervox.overcrow.notes` | `notes.read`, `notes.write` | [widgets/notes/](../../../widgets/notes/) |
16
+ | **Performance** | Game CPU and memory, plus the temperatures this computer exposes. | `com.playervox.overcrow.performance` | `telemetry.read`, `fps.read` | [widgets/performance/](../../../widgets/performance/) |
17
+ | **Session journal** | The finished play sessions of your game, newest first: date, start time and duration, five per page. Recorded on your device without an account, merged with your PlayerVox journal when you sync. Delete a session after confirmation. | `com.playervox.overcrow.playervox.journal` | `journal.read`, `journal.delete` | [widgets/playervox-journal/](../../../widgets/playervox-journal/) |
18
+ | **My rating** | Your own PlayerVox rating of the Steam game you play: its grade and score, and in Interactive mode three criteria and an optional review to publish or update. Needs your PlayerVox account. | `com.playervox.overcrow.playervox.rating` | `playervox.rating.read`, `playervox.rating.write` | [widgets/playervox-rating/](../../../widgets/playervox-rating/) |
19
+ | **Player reviews** | What PlayerVox players think of the game you play: three reviews per page with each player's grade and score, in your language when a translation exists. Limit them to the players you follow from the widget's menu. Needs your PlayerVox account. | `com.playervox.overcrow.playervox.reviews` | `playervox.reviews.read` | [widgets/playervox-reviews/](../../../widgets/playervox-reviews/) |
20
+ | **PlayerVox score** | The PlayerVox community grade of your Steam game, with its score, rating count and three criteria. No account needed; the badge is always shown. | `com.playervox.overcrow.playervox.score` | `playervox.score.read` | [widgets/playervox-score/](../../../widgets/playervox-score/) |
21
+ | **Session** | Shows how long the current game session has lasted. | `com.playervox.overcrow.session` | `session.read` | [widgets/session/](../../../widgets/session/) |
22
+ | **Manual stopwatch** | A stopwatch to the hundredth of a second, started, paused and reset with its buttons or the host’s shortcuts. | `com.playervox.overcrow.stopwatch` | `stopwatch.read`, `stopwatch.control` | [widgets/stopwatch/](../../../widgets/stopwatch/) |
23
+ | **Twitch chat** | Read and send messages in a public Twitch chat you choose: your favorite channels, the scrolling history with emotes and replies in Interactive mode, the last messages fading out in Passive mode. Needs your Twitch account. | `com.playervox.overcrow.twitch.chat` | `twitch.chat.read`, `twitch.chat.compose` | [widgets/twitch-chat/](../../../widgets/twitch-chat/) |
24
+ | **Warframe Market** | Searches public PC items from a cached catalog, shows an item’s online sellers and buyers in two tabs, and copies a trade whisper when you click. | `com.playervox.overcrow.warframe.market` | `network`, `storage`, `clipboardWrite` | [widgets/warframe-market/](../../../widgets/warframe-market/) |
25
+ <!-- /generated:widgets -->
26
+
27
+ ## What a widget directory holds
28
+
29
+ - the package sources: `manifest.json`, `view.ocml`, `style.ocss`,
30
+ `logic.ts`, `locales/`, `LICENSE`;
31
+ - `listing.json`, its marketplace text;
32
+ - `assets/preview.png`, its marketplace preview: the image of its `preview`
33
+ scenario, framed and staged by `node scripts/compose-previews.mjs`;
34
+ - `tests/`: unit tests of the logic, and scenarios with reference images in
35
+ both themes, both languages and two scales, played by
36
+ `overcrow-widget test` in OverCrow's headless runtime;
37
+ - `README.md`: what it shows, its menu, its permissions, how it works and
38
+ what it costs.
39
+
40
+ ## What each one shows
41
+
42
+ | To see how to… | Read |
43
+ | --- | --- |
44
+ | tick at each minute or second of local time, follow a menu option | Clock |
45
+ | subscribe to a service and show a missing value | FPS, Session |
46
+ | lay out a list of values in a grid, hide a menu row the machine cannot serve | Performance |
47
+ | show an image handed by OverCrow, retry a subscription that ended | Media |
48
+ | command a service on a user action, let OverCrow advance a duration | Manual stopwatch |
49
+ | edit text through a form bound to a write intent, keep drafts | Notes, My rating |
50
+ | draw on a canvas | PlayerVox score, My rating |
51
+ | page through a service and react to a revision | Player reviews, Session journal |
52
+ | keep a long scrolling list at its end, send a message | Twitch chat |
53
+ | call an HTTP API, cache it in storage, copy to the clipboard | Warframe Market |
54
+
55
+ Warframe Market is not a built-in: a PlayerVox widget of the catalog,
56
+ installed on request, it shows network routes with a declared response
57
+ bound, storage for a cached catalog and a clipboard copy on a click.
58
+
59
+ ## Work on one
60
+
61
+ From a checkout of the repository, link the SDK of that revision into the
62
+ widgets, then check one, package it and run its unit tests:
63
+
64
+ ```sh
65
+ node scripts/prepare-widgets.mjs
66
+ overcrow-widget check widgets/clock
67
+ overcrow-widget package widgets/clock
68
+ node --test widgets/clock/tests/logic.test.mjs
69
+ ```
70
+
71
+ `prepare-widgets.mjs` needs the SDK built first (`npm ci` then
72
+ `npm run build` in `sdk/`). The four templates of `overcrow-widget init`
73
+ are in [`templates/`](../../../templates/), and two complete examples
74
+ written for these pages in
75
+ [`docs/content/examples/`](../examples/): `weather` calls an HTTP API and
76
+ `countdown` uses a timer, a canvas, a context menu and storage.