@overcrow/mcp 0.0.0 → 0.1.1

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 (489) 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 +768 -0
  15. package/dist/content/docs/en/creator-space.md +78 -0
  16. package/dist/content/docs/en/dev-channel.md +130 -0
  17. package/dist/content/docs/en/elements.md +469 -0
  18. package/dist/content/docs/en/forms.md +328 -0
  19. package/dist/content/docs/en/guide.md +252 -0
  20. package/dist/content/docs/en/index.md +85 -0
  21. package/dist/content/docs/en/limits.md +241 -0
  22. package/dist/content/docs/en/logic.md +446 -0
  23. package/dist/content/docs/en/manifest.md +388 -0
  24. package/dist/content/docs/en/mcp.md +165 -0
  25. package/dist/content/docs/en/package.md +131 -0
  26. package/dist/content/docs/en/publish-a-widget.md +94 -0
  27. package/dist/content/docs/en/publish-keys.md +95 -0
  28. package/dist/content/docs/en/publishing.md +167 -0
  29. package/dist/content/docs/en/reference.md +55 -0
  30. package/dist/content/docs/en/result-shapes.md +332 -0
  31. package/dist/content/docs/en/sdk.md +295 -0
  32. package/dist/content/docs/en/security.md +115 -0
  33. package/dist/content/docs/en/service-reference.md +344 -0
  34. package/dist/content/docs/en/services.md +517 -0
  35. package/dist/content/docs/en/style-properties.md +270 -0
  36. package/dist/content/docs/en/style.md +266 -0
  37. package/dist/content/docs/en/testing.md +400 -0
  38. package/dist/content/docs/en/verified-domain.md +46 -0
  39. package/dist/content/docs/en/view.md +338 -0
  40. package/dist/content/docs/en/widget-listing.md +65 -0
  41. package/dist/content/docs/en/widget-review.md +57 -0
  42. package/dist/content/docs/en/widget-statistics.md +134 -0
  43. package/dist/content/docs/en/widgets.md +76 -0
  44. package/dist/content/docs/fr/cli.md +802 -0
  45. package/dist/content/docs/fr/creator-space.md +83 -0
  46. package/dist/content/docs/fr/dev-channel.md +140 -0
  47. package/dist/content/docs/fr/elements.md +475 -0
  48. package/dist/content/docs/fr/forms.md +341 -0
  49. package/dist/content/docs/fr/guide.md +263 -0
  50. package/dist/content/docs/fr/index.md +90 -0
  51. package/dist/content/docs/fr/limits.md +244 -0
  52. package/dist/content/docs/fr/logic.md +461 -0
  53. package/dist/content/docs/fr/manifest.md +401 -0
  54. package/dist/content/docs/fr/mcp.md +173 -0
  55. package/dist/content/docs/fr/package.md +139 -0
  56. package/dist/content/docs/fr/publish-a-widget.md +101 -0
  57. package/dist/content/docs/fr/publish-keys.md +97 -0
  58. package/dist/content/docs/fr/publishing.md +177 -0
  59. package/dist/content/docs/fr/reference.md +59 -0
  60. package/dist/content/docs/fr/result-shapes.md +333 -0
  61. package/dist/content/docs/fr/sdk.md +301 -0
  62. package/dist/content/docs/fr/security.md +129 -0
  63. package/dist/content/docs/fr/service-reference.md +346 -0
  64. package/dist/content/docs/fr/services.md +540 -0
  65. package/dist/content/docs/fr/style-properties.md +272 -0
  66. package/dist/content/docs/fr/style.md +281 -0
  67. package/dist/content/docs/fr/testing.md +417 -0
  68. package/dist/content/docs/fr/verified-domain.md +49 -0
  69. package/dist/content/docs/fr/view.md +352 -0
  70. package/dist/content/docs/fr/widget-listing.md +69 -0
  71. package/dist/content/docs/fr/widget-review.md +59 -0
  72. package/dist/content/docs/fr/widget-statistics.md +141 -0
  73. package/dist/content/docs/fr/widgets.md +81 -0
  74. package/dist/content/examples/clock/LICENSE +21 -0
  75. package/dist/content/examples/clock/README.md +75 -0
  76. package/dist/content/examples/clock/listing.json +19 -0
  77. package/dist/content/examples/clock/locales/en.json +4 -0
  78. package/dist/content/examples/clock/locales/fr.json +4 -0
  79. package/dist/content/examples/clock/logic.ts +85 -0
  80. package/dist/content/examples/clock/manifest.json +44 -0
  81. package/dist/content/examples/clock/package.json +16 -0
  82. package/dist/content/examples/clock/style.ocss +26 -0
  83. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  84. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  85. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  86. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  87. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  88. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  89. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  90. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  91. package/dist/content/examples/clock/tsconfig.json +16 -0
  92. package/dist/content/examples/clock/view.ocml +8 -0
  93. package/dist/content/examples/countdown/LICENSE +20 -0
  94. package/dist/content/examples/countdown/listing.json +10 -0
  95. package/dist/content/examples/countdown/locales/en.json +15 -0
  96. package/dist/content/examples/countdown/locales/fr.json +15 -0
  97. package/dist/content/examples/countdown/logic.ts +179 -0
  98. package/dist/content/examples/countdown/manifest.json +34 -0
  99. package/dist/content/examples/countdown/package.json +15 -0
  100. package/dist/content/examples/countdown/style.ocss +94 -0
  101. package/dist/content/examples/countdown/tsconfig.json +16 -0
  102. package/dist/content/examples/countdown/view.ocml +42 -0
  103. package/dist/content/examples/fps/LICENSE +21 -0
  104. package/dist/content/examples/fps/README.md +64 -0
  105. package/dist/content/examples/fps/listing.json +19 -0
  106. package/dist/content/examples/fps/locales/en.json +11 -0
  107. package/dist/content/examples/fps/locales/fr.json +11 -0
  108. package/dist/content/examples/fps/logic.ts +64 -0
  109. package/dist/content/examples/fps/manifest.json +30 -0
  110. package/dist/content/examples/fps/package.json +16 -0
  111. package/dist/content/examples/fps/style.ocss +31 -0
  112. package/dist/content/examples/fps/submission.json +8 -0
  113. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  114. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  115. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  116. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  117. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  118. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  119. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  120. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  121. package/dist/content/examples/fps/tsconfig.json +16 -0
  122. package/dist/content/examples/fps/view.ocml +11 -0
  123. package/dist/content/examples/media/LICENSE +21 -0
  124. package/dist/content/examples/media/README.md +147 -0
  125. package/dist/content/examples/media/listing.json +19 -0
  126. package/dist/content/examples/media/locales/en.json +11 -0
  127. package/dist/content/examples/media/locales/fr.json +11 -0
  128. package/dist/content/examples/media/logic.ts +191 -0
  129. package/dist/content/examples/media/manifest.json +35 -0
  130. package/dist/content/examples/media/package.json +16 -0
  131. package/dist/content/examples/media/style.ocss +148 -0
  132. package/dist/content/examples/media/submission.json +12 -0
  133. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  134. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  135. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  136. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  137. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  138. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  139. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  140. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  141. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  142. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  143. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  144. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  145. package/dist/content/examples/media/tsconfig.json +16 -0
  146. package/dist/content/examples/media/view.ocml +41 -0
  147. package/dist/content/examples/notes/LICENSE +21 -0
  148. package/dist/content/examples/notes/README.md +219 -0
  149. package/dist/content/examples/notes/listing.json +19 -0
  150. package/dist/content/examples/notes/locales/en.json +25 -0
  151. package/dist/content/examples/notes/locales/fr.json +25 -0
  152. package/dist/content/examples/notes/logic.ts +799 -0
  153. package/dist/content/examples/notes/manifest.json +40 -0
  154. package/dist/content/examples/notes/package.json +16 -0
  155. package/dist/content/examples/notes/style.ocss +469 -0
  156. package/dist/content/examples/notes/submission.json +12 -0
  157. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  158. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  159. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  160. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  161. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  162. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  163. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  164. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  165. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  166. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  167. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  168. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  169. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  170. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  171. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  172. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  173. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  174. package/dist/content/examples/notes/tsconfig.json +16 -0
  175. package/dist/content/examples/notes/view.ocml +154 -0
  176. package/dist/content/examples/performance/LICENSE +21 -0
  177. package/dist/content/examples/performance/README.md +134 -0
  178. package/dist/content/examples/performance/listing.json +19 -0
  179. package/dist/content/examples/performance/locales/en.json +20 -0
  180. package/dist/content/examples/performance/locales/fr.json +20 -0
  181. package/dist/content/examples/performance/logic.ts +210 -0
  182. package/dist/content/examples/performance/manifest.json +83 -0
  183. package/dist/content/examples/performance/package.json +16 -0
  184. package/dist/content/examples/performance/style.ocss +75 -0
  185. package/dist/content/examples/performance/submission.json +12 -0
  186. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  187. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  188. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  189. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  190. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  191. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  192. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  193. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  194. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  195. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  196. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  197. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  198. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  199. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  200. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  201. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  202. package/dist/content/examples/performance/tsconfig.json +16 -0
  203. package/dist/content/examples/performance/view.ocml +18 -0
  204. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  205. package/dist/content/examples/playervox-journal/README.md +150 -0
  206. package/dist/content/examples/playervox-journal/listing.json +19 -0
  207. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  208. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  209. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  210. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  211. package/dist/content/examples/playervox-journal/package.json +16 -0
  212. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  213. package/dist/content/examples/playervox-journal/submission.json +12 -0
  214. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  215. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  216. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  217. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  218. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  219. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  220. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  221. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  222. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  223. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  224. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  225. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  226. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  227. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  228. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  229. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  230. package/dist/content/examples/playervox-rating/README.md +166 -0
  231. package/dist/content/examples/playervox-rating/listing.json +19 -0
  232. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  233. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  234. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  235. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  236. package/dist/content/examples/playervox-rating/package.json +16 -0
  237. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  238. package/dist/content/examples/playervox-rating/submission.json +12 -0
  239. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  240. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  241. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  242. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  243. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  244. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  245. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  246. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  247. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  248. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  249. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  250. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  251. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  252. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  253. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  254. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  255. package/dist/content/examples/playervox-reviews/README.md +194 -0
  256. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  257. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  258. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  259. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  260. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  261. package/dist/content/examples/playervox-reviews/package.json +16 -0
  262. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  263. package/dist/content/examples/playervox-reviews/submission.json +8 -0
  264. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  265. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  266. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  267. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  268. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  269. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  270. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  271. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  272. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  273. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  274. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  275. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  276. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  277. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  278. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  279. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  280. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  281. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  283. package/dist/content/examples/playervox-score/LICENSE +21 -0
  284. package/dist/content/examples/playervox-score/README.md +131 -0
  285. package/dist/content/examples/playervox-score/listing.json +19 -0
  286. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  287. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  288. package/dist/content/examples/playervox-score/logic.ts +430 -0
  289. package/dist/content/examples/playervox-score/manifest.json +47 -0
  290. package/dist/content/examples/playervox-score/package.json +16 -0
  291. package/dist/content/examples/playervox-score/style.ocss +247 -0
  292. package/dist/content/examples/playervox-score/submission.json +8 -0
  293. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  294. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  295. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  296. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  297. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  298. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  299. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  300. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  301. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  302. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  303. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  304. package/dist/content/examples/playervox-score/view.ocml +51 -0
  305. package/dist/content/examples/session/LICENSE +21 -0
  306. package/dist/content/examples/session/README.md +57 -0
  307. package/dist/content/examples/session/listing.json +19 -0
  308. package/dist/content/examples/session/locales/en.json +3 -0
  309. package/dist/content/examples/session/locales/fr.json +3 -0
  310. package/dist/content/examples/session/logic.ts +26 -0
  311. package/dist/content/examples/session/manifest.json +19 -0
  312. package/dist/content/examples/session/package.json +16 -0
  313. package/dist/content/examples/session/style.ocss +16 -0
  314. package/dist/content/examples/session/submission.json +8 -0
  315. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  316. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  318. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  319. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  320. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  321. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  322. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  323. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  324. package/dist/content/examples/session/tsconfig.json +16 -0
  325. package/dist/content/examples/session/view.ocml +11 -0
  326. package/dist/content/examples/stopwatch/LICENSE +21 -0
  327. package/dist/content/examples/stopwatch/README.md +99 -0
  328. package/dist/content/examples/stopwatch/listing.json +19 -0
  329. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  330. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  331. package/dist/content/examples/stopwatch/logic.ts +93 -0
  332. package/dist/content/examples/stopwatch/manifest.json +19 -0
  333. package/dist/content/examples/stopwatch/package.json +16 -0
  334. package/dist/content/examples/stopwatch/style.ocss +54 -0
  335. package/dist/content/examples/stopwatch/submission.json +12 -0
  336. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  337. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  338. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  339. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  340. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  341. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  342. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  343. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  344. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  345. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  346. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  347. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  348. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  349. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  350. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  351. package/dist/content/examples/stopwatch/view.ocml +29 -0
  352. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  353. package/dist/content/examples/twitch-chat/README.md +283 -0
  354. package/dist/content/examples/twitch-chat/listing.json +19 -0
  355. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  356. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  357. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  358. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  359. package/dist/content/examples/twitch-chat/package.json +16 -0
  360. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  361. package/dist/content/examples/twitch-chat/submission.json +12 -0
  362. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  363. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  364. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  365. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  366. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  367. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  368. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  369. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  370. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  371. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  372. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  373. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  374. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  375. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  376. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  377. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  378. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  379. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  380. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  381. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  382. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  383. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  384. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  385. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  386. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  387. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  388. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  389. package/dist/content/examples/warframe-market/LICENSE +21 -0
  390. package/dist/content/examples/warframe-market/README.md +176 -0
  391. package/dist/content/examples/warframe-market/listing.json +19 -0
  392. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  393. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  394. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  395. package/dist/content/examples/warframe-market/manifest.json +92 -0
  396. package/dist/content/examples/warframe-market/package.json +16 -0
  397. package/dist/content/examples/warframe-market/style.ocss +422 -0
  398. package/dist/content/examples/warframe-market/submission.json +24 -0
  399. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  400. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  401. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  402. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  403. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  404. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  405. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  406. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  407. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  408. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  409. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  410. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  411. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  412. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  413. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  414. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  415. package/dist/content/examples/warframe-market/view.ocml +116 -0
  416. package/dist/content/examples/weather/LICENSE +20 -0
  417. package/dist/content/examples/weather/listing.json +10 -0
  418. package/dist/content/examples/weather/locales/en.json +9 -0
  419. package/dist/content/examples/weather/locales/fr.json +9 -0
  420. package/dist/content/examples/weather/logic.ts +62 -0
  421. package/dist/content/examples/weather/manifest.json +51 -0
  422. package/dist/content/examples/weather/package.json +15 -0
  423. package/dist/content/examples/weather/style.ocss +29 -0
  424. package/dist/content/examples/weather/submission.json +17 -0
  425. package/dist/content/examples/weather/tsconfig.json +16 -0
  426. package/dist/content/examples/weather/view.ocml +12 -0
  427. package/dist/content/index.json +3705 -0
  428. package/dist/content/reference/errors.json +1924 -0
  429. package/dist/content/reference/limits.json +1154 -0
  430. package/dist/content/reference/manifest.md +223 -0
  431. package/dist/content/reference/permissions.json +413 -0
  432. package/dist/content/templates/blank/locales/en.json +3 -0
  433. package/dist/content/templates/blank/locales/fr.json +3 -0
  434. package/dist/content/templates/blank/logic.ts +7 -0
  435. package/dist/content/templates/blank/manifest.json +16 -0
  436. package/dist/content/templates/blank/style.ocss +10 -0
  437. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  438. package/dist/content/templates/blank/view.ocml +6 -0
  439. package/dist/content/templates/chart/locales/en.json +3 -0
  440. package/dist/content/templates/chart/locales/fr.json +3 -0
  441. package/dist/content/templates/chart/logic.ts +27 -0
  442. package/dist/content/templates/chart/manifest.json +16 -0
  443. package/dist/content/templates/chart/style.ocss +27 -0
  444. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  445. package/dist/content/templates/chart/view.ocml +10 -0
  446. package/dist/content/templates/counter/locales/en.json +4 -0
  447. package/dist/content/templates/counter/locales/fr.json +4 -0
  448. package/dist/content/templates/counter/logic.ts +20 -0
  449. package/dist/content/templates/counter/manifest.json +16 -0
  450. package/dist/content/templates/counter/style.ocss +26 -0
  451. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  452. package/dist/content/templates/counter/view.ocml +13 -0
  453. package/dist/content/templates/list/locales/en.json +8 -0
  454. package/dist/content/templates/list/locales/fr.json +8 -0
  455. package/dist/content/templates/list/logic.ts +35 -0
  456. package/dist/content/templates/list/manifest.json +16 -0
  457. package/dist/content/templates/list/style.ocss +42 -0
  458. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  459. package/dist/content/templates/list/view.ocml +17 -0
  460. package/dist/content/templates/shared/LICENSE +20 -0
  461. package/dist/content/templates/shared/package.json +14 -0
  462. package/dist/content/templates/shared/tsconfig.json +16 -0
  463. package/dist/content.js +68 -0
  464. package/dist/env.js +156 -0
  465. package/dist/fingerprint.js +32 -0
  466. package/dist/hidden.js +47 -0
  467. package/dist/ids.js +27 -0
  468. package/dist/index.js +82 -0
  469. package/dist/knowledge.js +222 -0
  470. package/dist/npm.js +149 -0
  471. package/dist/prompts.js +47 -0
  472. package/dist/resources.js +82 -0
  473. package/dist/run.js +120 -0
  474. package/dist/server.js +43 -0
  475. package/dist/session.js +205 -0
  476. package/dist/sources.js +218 -0
  477. package/dist/text.js +80 -0
  478. package/dist/texts.js +44 -0
  479. package/dist/tools/audit.js +105 -0
  480. package/dist/tools/build.js +453 -0
  481. package/dist/tools/common.js +122 -0
  482. package/dist/tools/docs.js +196 -0
  483. package/dist/tools/preview.js +87 -0
  484. package/dist/tools/project.js +183 -0
  485. package/dist/tools/setup.js +146 -0
  486. package/dist/tools/submission.js +369 -0
  487. package/dist/version.js +3 -0
  488. package/npm-shrinkwrap.json +402 -0
  489. 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,65 @@
1
+ # The listing: best practices
2
+
3
+ The listing is what players read in the PlayerVox OverCrow catalog before
4
+ they install a widget: its description, its preview, its category, its
5
+ games, its license and its links. You write it in the creator space, in the
6
+ widget's **Listing** tab.
7
+
8
+ ## Saved as you type
9
+
10
+ The listing is a draft, saved by itself as you type.
11
+
12
+ - A widget's first listing goes to review with its first version.
13
+ - Later changes go alone to a quick review: **Submit the listing**. They
14
+ need no new version of the widget. **Cancel the changes** brings the
15
+ draft back to the published listing.
16
+ - The category is the exception: you change it at any time, without a
17
+ review, and the change reaches players with the next publication of the
18
+ catalog.
19
+
20
+ ## Languages
21
+
22
+ English comes first: it is the default, shown when a player's language has
23
+ no description. **Add a language** adds another one, 16 languages at most.
24
+ The widget's name comes from its manifest (`name.en`, `name.fr`): to change
25
+ it, change the manifest and submit a version. The languages of the widget's
26
+ own interface come from its `locales/` files.
27
+
28
+ ## Description
29
+
30
+ - 500 characters at most per language. The first two lines show on the
31
+ catalog card: say what the widget does, plainly.
32
+ - Say when the widget contacts a server, and which one.
33
+ - No advertising and no claim the widget does not keep.
34
+
35
+ ## Preview image
36
+
37
+ One image, in English, for every language: a PNG in 4:3, from 480 × 360 to
38
+ 1,024 × 768 (1,024 × 768 recommended), 256 KiB at most. Show the widget in
39
+ use, without marketing text.
40
+
41
+ ## Category and games
42
+
43
+ The category places the widget in the catalog. Add up to five games it is
44
+ made for: players filter the catalog by game.
45
+
46
+ ## License and links
47
+
48
+ - **License**: "Proprietary, all rights reserved", or an SPDX license such
49
+ as `MIT` or `Apache-2.0`.
50
+ - **Support**: an e-mail address or a web page where players get help.
51
+ Required.
52
+ - **Privacy policy**: required as soon as the widget uses the network.
53
+ - **Public source code**: optional; a public repository adds the "Public
54
+ source code" badge.
55
+
56
+ Type an address as you know it (`example.com/privacy`): `https://` is added
57
+ for you, and a `/` after a bare domain (`example.com` is saved as
58
+ `https://example.com/`). An address in `http://` is refused.
59
+
60
+ ## From listing.json
61
+
62
+ A version's sources may carry a `listing.json`, as the command-line tool
63
+ reads it (see [`admit`](cli.md#admit)). In the
64
+ **Listing** tab, **Import listing.json** applies its descriptions, license
65
+ and source code address to the draft.
@@ -0,0 +1,57 @@
1
+ # Review: types, delays, appeals
2
+
3
+ Every version of a PlayerVox OverCrow widget, and every change of its
4
+ listing, is read by a person at PlayerVox before players get it. This page
5
+ covers the two kinds of review, their delays, the review thread and the
6
+ appeal. To send a version, see [publish a widget](publish-a-widget.md).
7
+
8
+ ## Quick or full
9
+
10
+ | Review | When | Longest delay |
11
+ | --- | --- | --- |
12
+ | Full | The first publication, or an update that adds a permission, a network route or a capability | 5 business days |
13
+ | Quick | Any other update, or a change of the listing alone | 2 business days |
14
+ | Appeal | Once per decision, within six months | 7 days |
15
+ | Publication | After the approval | 24 business hours |
16
+
17
+ Business days run Monday to Friday, except French public holidays. The delay
18
+ is paused while the review waits for your reply or a corrected version.
19
+ A quick review reads the lines that changed since the last approved
20
+ version; a full review reads the whole widget.
21
+
22
+ ## The review thread
23
+
24
+ Each version in review has a thread in the creator space:
25
+
26
+ - A **remark** points to a file and a line, quotes the code the reviewer
27
+ read and cites a numbered rule of the publication rules.
28
+ - You can **reply** to the reviewer. Your reply sends the review back to
29
+ the reviewer when it was waiting for you.
30
+ - A **corrected version** continues the same thread: send it from
31
+ **Submit a version**, with a newer version number.
32
+ - The **decision** is approval, changes requested or a refusal, always
33
+ with its reasons.
34
+
35
+ Reviewers are shown as "PlayerVox reviewer", never by name. Every time a
36
+ reviewer opens your sources, the creator space shows when, which version
37
+ and why, under **Access to your sources**.
38
+
39
+ ## Appeal
40
+
41
+ You can contest a refusal or a suspension once per decision, within six
42
+ months, with **Contest the decision**. PlayerVox re-examines the decision
43
+ entirely and answers within 7 days, with its reasons. You can always send a
44
+ new version instead.
45
+
46
+ ## Suspension
47
+
48
+ When players are at risk (malicious code, a leaked key, a data leak),
49
+ PlayerVox can suspend a widget or a version at once: installed copies are
50
+ turned off. The creator space gives the reason and the rule, and the
51
+ appeal stays open.
52
+
53
+ ## Withdrawal
54
+
55
+ You can withdraw a version or the whole widget at any time: it leaves the
56
+ catalog at the next publication, and installed copies keep working. A
57
+ version in review or approved but not published yet is withdrawn at once.
@@ -0,0 +1,134 @@
1
+ # Statistics: definitions
2
+
3
+ The **Statistics** tab of a widget, in the creator space, shows how players
4
+ use it: installs, daily active players, errors and the players' rating.
5
+ PlayerVox OverCrow sends these figures anonymously. They are trends, not
6
+ exact counts: this page says what each figure counts and what it leaves out.
7
+
8
+ ## Where the figures come from
9
+
10
+ Once a day at most, at a random time, OverCrow sends one anonymous signal
11
+ for each widget installed from the catalog: the widget, its version, the
12
+ day, the system (Windows or Linux), the version of OverCrow, whether the
13
+ widget was shown, installed or uninstalled that day, and its errors (kind,
14
+ place in the code, a rounded count).
15
+
16
+ - **No identifier**: nothing names the player or the computer, and nothing
17
+ links the widgets of one player, each widget being sent apart.
18
+ - **No error message**: only the kind of an error and its place in your
19
+ code. A message may hold personal data.
20
+ - **On by default**: players can turn **Share anonymous statistics** off in
21
+ OverCrow; nothing is sent after that, and they are no longer counted.
22
+
23
+ The figures are added up as the signals arrive. **Updated** gives the time
24
+ of the last one counted.
25
+
26
+ ## The figures
27
+
28
+ | Figure | What it counts |
29
+ | --- | --- |
30
+ | Daily active players | The players who showed the widget at least once that day. The tile gives the mean per day over the period. |
31
+ | Active installs | Installs minus uninstalls, added up since the first signal, never below zero. |
32
+ | Installs · uninstalls | The installs and the uninstalls of the period, and their balance. An update is neither. |
33
+ | Errors | The sum of the errors reported over the period. |
34
+
35
+ Each tile compares its figure with the period just before, of the same
36
+ length: green when it moves the good way (fewer errors, more players), amber
37
+ the other way, grey when it moves by less than 1 %. **First period** means
38
+ there is nothing before to compare with.
39
+
40
+ ## Periods and filters
41
+
42
+ - **Period**: 7 days, 28 days, 90 days or 12 months. Over 12 months, the
43
+ installs and uninstalls chart adds up each week.
44
+ - **Version**: one of your published versions. Active installs show "—"
45
+ with a version: an installation changes version at every update, so that
46
+ figure only makes sense for all versions. **Version adoption** compares
47
+ the versions and does not follow this filter.
48
+ - **System**: Windows or Linux. **Where your widget runs** compares the
49
+ systems and does not follow this filter.
50
+ - The rating follows no filter.
51
+
52
+ Every chart has **View as table**, with the same figures day by day.
53
+
54
+ ## Version adoption and where your widget runs
55
+
56
+ - **Version adoption**: the share of the daily active players on each
57
+ version. The three newest versions keep their colour; the others add up as
58
+ **Older**.
59
+ - **Where your widget runs**: the share of active players on Windows and on
60
+ Linux, and on each version of OverCrow (the two most used, then
61
+ **Others**).
62
+
63
+ ## Errors
64
+
65
+ The errors are grouped by kind and by place in your code: the same kind at
66
+ the same line of the same function is one group, whatever the version. The
67
+ table shows the 50 most frequent groups of the period, with their versions,
68
+ their count and their trend; **Export CSV** saves them.
69
+
70
+ OverCrow reports where an error happened in the package's `logic.js`. The
71
+ creator space traces that position back to your sources (file, line and
72
+ function) with a map of your code built with the package and never
73
+ published.
74
+
75
+ - **Being traced**: the position is shown as `logic.js:line:column` until it
76
+ is traced.
77
+ - **Not traced**: the version has no map, or the position is not in it; the
78
+ raw position stays.
79
+ - **No position in the code**: the widget stopped as a whole (budget
80
+ exceeded, no answer); see its kind.
81
+ - **SDK**: the error happened inside `@overcrow/sdk`, called from your code.
82
+
83
+ | Kind | Meaning |
84
+ | --- | --- |
85
+ | `Error` | Error thrown |
86
+ | `TypeError` | Value of an unexpected type |
87
+ | `RangeError` | Value out of range |
88
+ | `ReferenceError` | Unknown name |
89
+ | `SyntaxError` | Invalid syntax |
90
+ | `URIError` | Invalid address encoding |
91
+ | `EvalError` | Code evaluation refused |
92
+ | `AggregateError` | Several errors at once |
93
+ | `InternalError` | Engine limit reached |
94
+ | Thrown value | A value that is not an error was thrown |
95
+ | Memory or processing budget exceeded | The widget was restarted |
96
+ | Stopped responding | The widget was restarted |
97
+ | Failed to load | The code or the view could not load |
98
+ | Widget process stopped | Without reporting a fault |
99
+ | Network request refused | Address not declared in the manifest |
100
+ | Other error | Of a kind the creator space does not know yet |
101
+
102
+ The kind of an error is the built-in type it was created from, never the
103
+ `name` your code may give it.
104
+
105
+ ## Player rating
106
+
107
+ Players rate a widget from 0 to 100 in the OverCrow Control Center, with
108
+ their PlayerVox account: one rating per account and per widget, which they
109
+ can change or remove.
110
+
111
+ - **Score**: the mean of the ratings, rounded, with its rank: S+ from 90,
112
+ S from 80, A from 70, B from 60, C from 40, D from 20, then F.
113
+ - **From 5 ratings**: below that, the creator space says **Not enough
114
+ ratings yet** and gives the number of ratings; the catalog shows nothing.
115
+ - **Spread by rank**: the number of ratings in each rank, shown only in
116
+ the creator space. Nobody sees who rated.
117
+ - **Since the latest version**: the points gained or lost since your latest
118
+ version was published, when 5 ratings existed before it.
119
+ - The members of your publisher cannot rate its widgets.
120
+
121
+ Players see the score, the rank and the number of ratings in the catalog
122
+ and on the website.
123
+
124
+ ## Trends, not exact counts
125
+
126
+ - Only the players who share their anonymous statistics are counted.
127
+ - OverCrow rounds each error count to a step before sending it, and sends
128
+ at most 10 places in the code per widget and day: the error figures give
129
+ orders of magnitude.
130
+ - A day is the player's own date.
131
+ - A player who clears OverCrow's data, then installs the widget again,
132
+ counts as two installs.
133
+ - Signals that look broken or inflated are set aside before they are
134
+ counted.
@@ -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.