@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,352 @@
1
+ # La vue
2
+
3
+ `view.ocml` décrit ce qu’affiche un widget PlayerVox OverCrow : un arbre
4
+ d’éléments, lié à l’état du widget par des expressions `{…}`. Il ressemble à
5
+ du HTML ou à du JSX, mais ce n’est ni l’un ni l’autre : le jeu d’éléments
6
+ est fermé, il n’y a pas de DOM et la vue ne contient aucun script. OverCrow
7
+ met en page et dessine l’arbre lui-même.
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
+ C’est le template de liste de tâches : un titre, une `list` défilante qui
29
+ répète une ligne par entrée, et un résumé. La logique exporte `setDone`,
30
+ `remove` et `remaining` ; `t` lit les messages de `locales/`.
31
+
32
+ La vue est compilée quand vous empaquetez le widget : `overcrow-widget check`
33
+ signale chaque erreur avec sa ligne et sa colonne. Un élément, un attribut ou
34
+ un événement inconnu est une erreur, jamais ignorée. Le fichier source
35
+ lui-même n’est pas livré.
36
+
37
+ ## Balisage
38
+
39
+ - Le fichier est en UTF-8, sans marque d’ordre des octets.
40
+ - Le document est une liste de nœuds de premier niveau : des déclarations
41
+ `<component>` et les enfants de la racine du widget, qui est une `box`.
42
+ - Les éléments s’écrivent en minuscules : `<name …>…</name>` ou
43
+ `<name …/>`.
44
+ - La valeur d’un attribut est un texte entre guillemets (`"…"` ou `'…'`),
45
+ une expression (`{…}`), ou rien, ce qui vaut `true` : `<button submit>`.
46
+ Les attributs sont séparés par des blancs et ne se répètent jamais.
47
+ - Les commentaires s’écrivent `<!-- … -->`, sans `--` à l’intérieur.
48
+ - DOCTYPE, instructions de traitement, sections CDATA et espaces de noms
49
+ sont refusés.
50
+
51
+ Les entités sont `&amp;` `&lt;` `&gt;` `&quot;` `&apos;` `&lbrace;`
52
+ `&rbrace;` `&nbsp;`, ainsi que `&#…;` ou `&#x…;` pour tout caractère qui
53
+ n’est pas un caractère de contrôle. Un `{` ou un `}` littéral dans une
54
+ valeur entre guillemets, comme un `}` isolé dans du texte, est refusé :
55
+ écrivez `&lbrace;` et `&rbrace;`.
56
+
57
+ ## Éléments
58
+
59
+ Chaque élément a un contenu fixe, un jeu d’attributs et les événements qu’il
60
+ peut envoyer. Les conteneurs (`box`, `scroll`, `list`, `form`, `popover`,
61
+ `button`) contiennent d’autres éléments ; `text` contient du texte et des
62
+ enfants en ligne ; les autres sont des feuilles qu’OverCrow dessine :
63
+ `icon`, `image`, `toggle`, `slider`, `field`, `chart`, `gauge`…
64
+
65
+ <!-- generated:element-list -->
66
+ | Élément | Signification |
67
+ | --- | --- |
68
+ | [`box`](elements.md#box) | Conteneur générique ; la mise en page flex ou grid vient du style. La racine de la vue est un `box`. |
69
+ | [`scroll`](elements.md#scroll) | Conteneur qui rogne son contenu et que l’hôte fait défiler à la molette, par glissement et au clavier. |
70
+ | [`list`](elements.md#list) | Liste à défilement vertical dont les enfants ne sont mis en page et peints que lorsqu’ils sont visibles. |
71
+ | [`text`](elements.md#text) | Bloc de texte avec retour à la ligne ; ses enfants en ligne suivent le texte (une ligne de chat avec des emotes). |
72
+ | [`span`](elements.md#span) | Portion de texte stylée à l’intérieur d’un `text`. |
73
+ | [`icon`](elements.md#icon) | Icône Lucide teintée par `color`, dimensionnée par `font-size` sauf si `width` et `height` sont définis. |
74
+ | [`image`](elements.md#image) | Image matricielle du paquet, ou image remise par un service (identifiant `asset:`) ; `object-fit` s’applique. |
75
+ | [`avatar`](elements.md#avatar) | Image ronde, avec un texte de remplacement tant que l’image manque ou n’a pas pu être chargée. |
76
+ | [`badge`](elements.md#badge) | Courte pastille de texte. |
77
+ | [`button`](elements.md#button) | Contrôle activable ; ses enfants (icône, texte) forment son contenu. |
78
+ | [`toggle`](elements.md#toggle) | Bascule activé/désactivé. |
79
+ | [`checkbox`](elements.md#checkbox) | Case à cocher (listes de tâches). |
80
+ | [`slider`](elements.md#slider) | Curseur sur un intervalle numérique ; le glissement est géré par l’hôte. |
81
+ | [`select`](elements.md#select) | Liste déroulante ; la liste ouverte est dessinée par l’hôte. |
82
+ | [`option`](elements.md#option) | Choix d’un `select` ; son texte est le libellé affiché. |
83
+ | [`field`](elements.md#field) | Champ de texte d’une ligne, édité par l’hôte, méthodes de saisie (IME) comprises. |
84
+ | [`textarea`](elements.md#textarea) | Champ de texte de plusieurs lignes, édité par l’hôte, méthodes de saisie (IME) comprises. |
85
+ | [`form`](elements.md#form) | Regroupe des contrôles nommés. Avec `intent`, la validation envoie leurs valeurs à un service d’écriture directement depuis l’hôte ; la logique du widget ne fournit jamais ce contenu. |
86
+ | [`elapsed`](elements.md#elapsed) | Durée affichée que l’hôte fait avancer à partir d’un repère donné par un service : un chronomètre qui tourne ne demande aucun travail à la logique. Stylé comme `text` ; repeint seulement quand le texte affiché change, au plus à 60 Hz, et jamais quand le widget est masqué. |
87
+ | [`progress`](elements.md#progress) | Barre de progression horizontale. |
88
+ | [`gauge`](elements.md#gauge) | Jauge en anneau ou en arc. |
89
+ | [`chart`](elements.md#chart) | Graphique en ligne, en aire, en barres ou sparkline, dessiné par l’hôte. |
90
+ | [`series`](elements.md#series) | Une série de données d’un `chart`, colorée par `color`. |
91
+ | [`separator`](elements.md#separator) | Filet de séparation entre deux groupes. |
92
+ | [`canvas`](elements.md#canvas) | Surface que l’hôte peint à partir de la dernière liste de commandes passée à `draw`. |
93
+ | [`popover`](elements.md#popover) | Panneau flottant ancré à un élément, dessiné au-dessus du contenu et rogné au cadre du widget (listes déroulantes, menus contextuels). |
94
+ <!-- /generated:element-list -->
95
+
96
+ [Éléments et attributs](elements.md) donne les attributs et les événements
97
+ de chacun.
98
+
99
+ ## Texte
100
+
101
+ Le texte n’est admis que dans `text`, `span`, `badge` et `option`. Un `text`
102
+ contient soit du texte, soit des enfants en ligne (`span`, `icon`, `image`),
103
+ jamais les deux : pour styler un seul mot, placez chaque segment dans un
104
+ `span`.
105
+
106
+ <!-- source: widgets/performance/view.ocml -->
107
+ ```xml
108
+ <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>
109
+ ```
110
+
111
+ Les blancs suivent la règle de JSX :
112
+
113
+ - les tabulations deviennent des espaces ;
114
+ - un saut de ligne entre deux mots devient une espace ;
115
+ - un saut de ligne accolé à une balise ou à une expression disparaît avec
116
+ son indentation ;
117
+ - une suite de blancs accolée à une balise est supprimée ; entre deux
118
+ expressions sur la même ligne, elle est conservée.
119
+
120
+ Un saut de ligne avant une expression supprime donc l’espace qui la
121
+ précède : écrivez `you have {state.count} messages` sur une seule ligne pour
122
+ garder les deux espaces, ou écrivez `&#32;` là où il vous faut une espace
123
+ que la règle supprimerait.
124
+
125
+ ## Attributs
126
+
127
+ Une valeur entre guillemets est convertie dans le type de l’attribut et
128
+ vérifiée à la compilation de la vue :
129
+
130
+ | Type | Valeur entre guillemets |
131
+ | --- | --- |
132
+ | booléen | `true` ou `false` ; l’attribut seul vaut `true` |
133
+ | entier | un entier décimal, sans zéro initial |
134
+ | nombre | un nombre décimal, sans exposant |
135
+ | liste de nombres | des nombres séparés par des espaces : `values="12 18.5 30"` |
136
+ | texte, identifiant | le texte lui-même |
137
+ | image | un fichier du paquet : `src="assets/logo.png"` |
138
+
139
+ `attr={expression}`, en revanche, lie l’attribut à une expression ; OverCrow
140
+ vérifie chaque valeur qu’envoie le widget. Les valeurs qui n’existent qu’à
141
+ l’exécution du widget, comme une image fournie par un service, doivent être
142
+ liées.
143
+
144
+ Cinq attributs existent sur tous les éléments :
145
+
146
+ <!-- generated:common-attributes -->
147
+ | Attribut | Type | Obligatoire | Signification |
148
+ | --- | --- | --- | --- |
149
+ | `class` | liste de classes | non | Classes de style : des noms distincts, séparés par une espace. |
150
+ | `ref` | nom de `ref` statique | non | Nom par lequel `draw` désigne ce `canvas` et par lequel un attribut tel que `anchor` d’un `popover` désigne cet élément. Statique, unique dans la vue, et interdit dans un `for` ou dans le corps d’un composant, où il nommerait plusieurs éléments. |
151
+ | `label` | texte ≤ 256 octets | non | Nom accessible ; obligatoire sur les contrôles qui ne montrent qu’une icône. |
152
+ | `tooltip` | texte ≤ 256 octets | non | Texte brut que l’hôte affiche au survol ou au focus. |
153
+ | `on` | noms d’événements triés | non | Événements transmis à la logique ; s’écrit `on:<event>` dans la vue. |
154
+ <!-- /generated:common-attributes -->
155
+
156
+ `class` est le point d’accroche du [style](style.md). `label` est le nom
157
+ accessible de l’élément : donnez-en un à chaque contrôle dont le contenu est
158
+ une icône.
159
+
160
+ ### Nommer un élément : `ref`
161
+
162
+ `ref="name"` donne un nom à un élément. Ce nom sert à deux choses :
163
+ `draw(name, commands)` dessine dans le `canvas` de ce nom, et un `popover`
164
+ se place contre l’élément que nomme son `anchor`.
165
+
166
+ <!-- source: docs/content/examples/countdown/view.ocml -->
167
+ ```xml
168
+ <box ref="panel" class="countdown" on:contextmenu={openMenu}>
169
+ ```
170
+
171
+ <!-- source: docs/content/examples/countdown/view.ocml -->
172
+ ```xml
173
+ <popover anchor="panel" placement="pointer" open={state.menu} on:dismiss={closeMenu}>
174
+ <button class="menu-row" on:activate={resetRounds}>
175
+ <text class="menu-text">{t("reset-rounds")}</text>
176
+ </button>
177
+ </popover>
178
+ ```
179
+
180
+ Un `ref` s’écrit toujours entre guillemets et il est unique dans la vue. Il
181
+ est refusé dans un `for` ou dans un composant, où il nommerait plusieurs
182
+ éléments.
183
+
184
+ ## Événements
185
+
186
+ `on:event={handler}` demande à OverCrow d’envoyer à la logique un événement
187
+ de l’élément. Sans cela, le widget ignore tout de l’événement : OverCrow ne
188
+ lui signale ni les mouvements du pointeur ni les appuis de touches qu’il n’a
189
+ pas demandés.
190
+
191
+ Un gestionnaire s’écrit de deux façons :
192
+
193
+ - **le nom d’une fonction** exportée par la logique, appelée avec le détail
194
+ de l’événement : `on:activate={increment}` ;
195
+ - **un appel**, avec les arguments de votre choix ; `event` y désigne le
196
+ détail de l’événement : `on:change={setDone(item.id, event.value)}`.
197
+
198
+ <!-- source: templates/list/view.ocml -->
199
+ ```xml
200
+ <checkbox label={item.text} checked={item.done} on:change={setDone(item.id, event.value)}/>
201
+ <text class={item.done ? "text done" : "text"}>{item.text}</text>
202
+ <button class="remove" label={t("remove")} on:activate={remove(item.id)}>
203
+ <icon name="x"/>
204
+ </button>
205
+ ```
206
+
207
+ Les événements sont `activate`, `contextmenu`, `wheel`, `keydown`, `input`,
208
+ `change`, `submit`, `focus`, `blur`, `reachend`, `stick` et `dismiss` ;
209
+ [événements](elements.md#événements) décrit chacun d’eux et le détail qu’il
210
+ transporte, et chaque [élément](elements.md#éléments) liste ceux qu’il
211
+ envoie. Certains sont des actions de l’utilisateur, pendant lesquelles un
212
+ widget peut appeler un service protégé ; voir
213
+ [les appels qui demandent une action de l’utilisateur](services.md#les-appels-qui-demandent-une-action-de-lutilisateur).
214
+ Les widgets ne reçoivent d’entrées qu’en mode interactif d’OverCrow : en
215
+ mode passif, les clics les traversent et atteignent le jeu.
216
+
217
+ ## Conditions, boucles et composants
218
+
219
+ <!-- generated:constructs -->
220
+ | Syntaxe | Signification |
221
+ | --- | --- |
222
+ | `{expr}` | Insère la valeur d’une expression dans du texte ou dans la valeur d’un attribut. |
223
+ | `<if test={expr}> … <else-if test={expr}> … <else>` | Sous-arbre conditionnel. |
224
+ | `<for each={expr} as="item" key={expr}>` | Répète un sous-arbre ; `key` est obligatoire et doit être unique parmi les éléments répétés. |
225
+ | `<component name="x" props="a b"> … <slot/> … </component>` | Composant local, avec ses propriétés déclarées et un emplacement (`slot`), utilisé sous la forme `<x a={…}>`. |
226
+ | `on:<event>={handler}` | Abonne l’élément à l’un de ses événements et nomme le gestionnaire de la logique. |
227
+ <!-- /generated:constructs -->
228
+
229
+ ### `if`, `else-if`, `else`
230
+
231
+ <!-- source: widgets/stopwatch/view.ocml -->
232
+ ```xml
233
+ <if test={state.stopwatch.running}>
234
+ <icon name="pause"/>
235
+ </if>
236
+ <else>
237
+ <icon name="play"/>
238
+ </else>
239
+ ```
240
+
241
+ `else-if` et `else` suivent directement un `if` : seuls des blancs et des
242
+ commentaires peuvent les en séparer.
243
+
244
+ ### `for`
245
+
246
+ `for` répète ses enfants pour chaque entrée d’une liste. `each`, `as` et
247
+ `key` sont tous obligatoires, et la clé doit être unique parmi les entrées
248
+ répétées : c’est grâce à elle qu’OverCrow sait quelle ligne a bougé, est
249
+ apparue ou a disparu.
250
+
251
+ <!-- source: widgets/warframe-market/view.ocml -->
252
+ ```xml
253
+ <for each={state.results} as="item" key={item.slug}>
254
+ <button class="result" label={item.name} on:activate={select(item.slug)}>
255
+ <text class="result-name">{item.name}</text>
256
+ <icon class="result-arrow" name="chevron-right"/>
257
+ </button>
258
+ </for>
259
+ ```
260
+
261
+ Pour une longue liste, placez le `for` dans un élément `list` : OverCrow ne
262
+ met en page et ne dessine que les lignes visibles.
263
+
264
+ ### Composants
265
+
266
+ Un composant est un morceau de vue doté d’un nom et de propriétés déclarées,
267
+ à écrire une fois et à utiliser plusieurs fois. Il est local à la vue.
268
+
269
+ <!-- source: docs/content/examples/countdown/view.ocml -->
270
+ ```xml
271
+ <component name="stat" props="name value">
272
+ <box class="stat">
273
+ <text class="stat-name">{name}</text>
274
+ <text class="stat-value">{value}</text>
275
+ </box>
276
+ </component>
277
+ ```
278
+
279
+ <!-- source: docs/content/examples/countdown/view.ocml -->
280
+ ```xml
281
+ <stat name={t("state")} value={stateText(state.running, state.remainingMs)}/>
282
+ ```
283
+
284
+ - Les composants se déclarent au premier niveau, une seule fois chacun,
285
+ sous un nom qui n’est pas celui d’un élément.
286
+ - Le corps ne voit que ses propres propriétés, pas les noms visibles là où
287
+ le composant est utilisé. Passez-lui ce dont il a besoin.
288
+ - Une utilisation ne passe que des propriétés déclarées. Une propriété entre
289
+ guillemets est un texte ; liez-la (`value={5}`) pour tout autre type.
290
+ - Un corps peut contenir un seul `<slot/>`, où vont les enfants de chaque
291
+ utilisation.
292
+ - Un composant ne peut pas se contenir lui-même, et une utilisation
293
+ n’accepte pas de gestionnaires `on:` : placez-les sur des éléments du
294
+ corps.
295
+
296
+ `if`, `for` et les composants sont transparents pour les règles de contenu :
297
+ leurs enfants doivent convenir à l’élément qui les entoure.
298
+
299
+ ## Expressions
300
+
301
+ Les expressions forment un sous-ensemble de JavaScript, réduit et strict :
302
+
303
+ - les littéraux : nombres (`0`, `12`, `1.5`), chaînes, `true`, `false`,
304
+ `null`, littéraux de tableau et d’objet ;
305
+ - les noms de la portée et leurs membres : `a.b`, `a?.b`, `a[i]`,
306
+ `a?.[i]` ;
307
+ - les opérateurs : `!`, `-` et `+` unaires, `* / %`, `+ -`, `< <= > >=`,
308
+ `== != === !==`, `&&`, `||`, `??`, et `a ? b : c`. `??` ne se combine pas
309
+ avec `&&` ou `||` sans parenthèses ;
310
+ - les appels de fonctions exportées par la logique, par leur nom seul :
311
+ `remaining(state.items)`. `t(key, params)` en fait partie.
312
+
313
+ Les noms de la portée sont `state`, les noms `as` des `for` englobants, les
314
+ propriétés du composant englobant, et `event` dans un gestionnaire. Un nom
315
+ ne peut pas en masquer un autre.
316
+
317
+ Il n’y a ni affectation, ni fonction fléchée ou littérale, ni `new`, ni
318
+ `this`, ni littéral de gabarit, ni expression régulière, ni appel de
319
+ méthode, ni globale : tout ce qui dépasse un calcul simple a sa place dans
320
+ une fonction de la logique. C’est ce qui permet de vérifier la vue : à
321
+ l’empaquetage du widget, chaque expression est compilée en une fonction de
322
+ `logic.js`, et la vue elle-même ne contient aucun code.
323
+
324
+ <!-- source: templates/list/view.ocml -->
325
+ ```xml
326
+ <text class={item.done ? "text done" : "text"}>{item.text}</text>
327
+ ```
328
+
329
+ Les mots réservés de JavaScript, `constructor`, `prototype`, `eval`,
330
+ `undefined`, `globalThis`, `overcrow` et tout nom qui commence par `__` sont
331
+ refusés.
332
+
333
+ ## Quand la vue est incorrecte
334
+
335
+ Chaque problème est un diagnostic de `overcrow-widget check`, doté d’un code
336
+ stable :
337
+
338
+ | Code | Problème |
339
+ | --- | --- |
340
+ | `view.syntax`, `view.encoding`, `view.size`, `view.invalid_entity` | Le fichier n’est pas un balisage bien formé. |
341
+ | `view.unknown_element`, `view.invalid_parent` | Un élément qui n’existe pas, ou placé là où il ne peut pas être. |
342
+ | `view.unknown_attribute`, `view.duplicate_attribute`, `view.invalid_attribute`, `view.missing_attribute` | Un attribut que l’élément n’a pas, écrit deux fois, de valeur incorrecte, ou obligatoire et absent. |
343
+ | `view.unknown_event`, `view.invalid_handler` | Un événement que l’élément n’envoie pas (ou posé sur l’utilisation d’un composant), ou un gestionnaire qui n’est ni un nom ni un appel. |
344
+ | `view.expression_syntax`, `view.expression_too_long`, `view.expression_too_deep`, `view.expression_too_many_entries` | Une expression hors du sous-ensemble ou de ses limites. |
345
+ | `view.reserved_name`, `view.unknown_name` | Un nom refusé, ou absent de la portée. |
346
+ | `view.invalid_text` | Du texte là où l’élément n’en accepte pas, ou mêlé à des enfants en ligne. |
347
+ | `view.invalid_component`, `view.recursive_component`, `view.invalid_slot`, `view.invalid_construct` | Un composant, un slot, un `if` ou un `for` qui enfreint ses règles. |
348
+ | `view.invalid_ref`, `view.unknown_ref` | Un `ref` qui n’est pas unique ou qui se trouve dans un `for`, ou un `anchor` qui n’en nomme aucun. |
349
+ | `view.missing_asset` | Une image statique absente de `assets/`. |
350
+ | `view.bound_value` | Un `value` sur un contrôle d’un formulaire lié à un intent d’écriture ; voir [les formulaires](forms.md#les-formulaires-qui-écrivent-des-données-de-lutilisateur). |
351
+ | `view.too_many_elements`, `view.too_many_components`, `view.too_many_children`, `view.too_many_expressions`, `view.too_deep` | Une [limite](limits.md) de la vue est dépassée. |
352
+ | `logic.missing_export` | La vue appelle une fonction que la logique n’exporte pas. |
@@ -0,0 +1,69 @@
1
+ # Fiche : bonnes pratiques
2
+
3
+ La fiche est ce que les joueurs lisent dans le catalogue de PlayerVox
4
+ OverCrow avant d’installer un widget : sa description, son aperçu, sa
5
+ catégorie, ses jeux, sa licence et ses liens. Vous l’écrivez dans l’espace
6
+ créateurs, dans l’onglet **Fiche** du widget.
7
+
8
+ ## Enregistrée au fil de la saisie
9
+
10
+ La fiche est un brouillon, enregistré tout seul pendant que vous écrivez.
11
+
12
+ - La première fiche d’un widget part en revue avec sa première version.
13
+ - Les modifications suivantes partent seules en revue rapide :
14
+ **Soumettre la fiche**. Elles ne demandent pas de nouvelle version du
15
+ widget. **Annuler les modifications** ramène le brouillon à la fiche
16
+ publiée.
17
+ - La catégorie fait exception : vous la changez quand vous voulez, sans
18
+ revue, et le changement arrive aux joueurs avec la prochaine publication
19
+ du catalogue.
20
+
21
+ ## Langues
22
+
23
+ L’anglais vient en premier : c’est la langue par défaut, montrée quand la
24
+ langue d’un joueur n’a pas de description. **Ajouter une langue** en ajoute
25
+ une autre, 16 langues au plus. Le nom du widget vient de son manifeste
26
+ (`name.en`, `name.fr`) : pour le changer, changez le manifeste et envoyez une
27
+ version. Les langues de l’interface du widget viennent de ses fichiers
28
+ `locales/`.
29
+
30
+ ## Description
31
+
32
+ - 500 caractères au plus par langue. Les deux premières lignes apparaissent
33
+ sur la carte du catalogue : dites simplement ce que fait le widget.
34
+ - Dites quand le widget contacte un serveur, et lequel.
35
+ - Pas de publicité, et aucune promesse que le widget ne tient pas.
36
+
37
+ ## Image d’aperçu
38
+
39
+ Une seule image, en anglais, pour toutes les langues : un PNG au format 4:3,
40
+ de 480 × 360 à 1 024 × 768 (1 024 × 768 conseillé), 256 Kio au plus.
41
+ Montrez le widget en situation, sans texte marketing.
42
+
43
+ ## Catégorie et jeux
44
+
45
+ La catégorie place le widget dans le catalogue. Ajoutez jusqu’à cinq jeux
46
+ pour lesquels il est fait : les joueurs filtrent le catalogue par jeu.
47
+
48
+ ## Licence et liens
49
+
50
+ - **Licence** : « Propriétaire, tous droits réservés », ou une licence SPDX
51
+ comme `MIT` ou `Apache-2.0`.
52
+ - **Assistance** : une adresse e-mail ou une page web où les joueurs
53
+ trouvent de l’aide. Obligatoire.
54
+ - **Politique de confidentialité** : obligatoire dès que le widget utilise
55
+ le réseau.
56
+ - **Code source public** : facultatif ; un dépôt public ajoute le badge
57
+ « Code source public ».
58
+
59
+ Tapez une adresse comme vous la connaissez (`exemple.com/confidentialite`) :
60
+ `https://` est ajouté pour vous, et un `/` après un domaine seul
61
+ (`exemple.com` est enregistré `https://exemple.com/`). Une adresse en
62
+ `http://` est refusée.
63
+
64
+ ## Depuis listing.json
65
+
66
+ Les sources d’une version peuvent contenir un `listing.json`, tel que
67
+ l’outil en ligne de commande le lit (voir [`admit`](cli.md#admit)). Dans
68
+ l’onglet **Fiche**, **Importer listing.json** applique ses descriptions, sa
69
+ licence et l’adresse de son code source au brouillon.
@@ -0,0 +1,59 @@
1
+ # Revue : types, délais, recours
2
+
3
+ Chaque version d’un widget PlayerVox OverCrow, et chaque modification de sa
4
+ fiche, est lue par une personne de PlayerVox avant que les joueurs ne la
5
+ reçoivent. Cette page couvre les deux types de revue, leurs délais, le fil
6
+ de revue et le recours. Pour envoyer une version, voir
7
+ [publier un widget](publish-a-widget.md).
8
+
9
+ ## Rapide ou complète
10
+
11
+ | Revue | Quand | Délai maximal |
12
+ | --- | --- | --- |
13
+ | Complète | La première publication, ou une mise à jour qui ajoute une permission, une route réseau ou une capability | 5 jours ouvrés |
14
+ | Rapide | Toute autre mise à jour, ou une modification de la fiche seule | 2 jours ouvrés |
15
+ | Recours | Une fois par décision, sous six mois | 7 jours |
16
+ | Publication | Après l’approbation | 24 heures ouvrées |
17
+
18
+ Les jours ouvrés vont du lundi au vendredi, hors jours fériés en France. Le
19
+ délai est suspendu tant que la revue attend votre réponse ou une version
20
+ corrigée. Une revue rapide lit les lignes modifiées depuis la dernière
21
+ version approuvée ; une revue complète lit l’ensemble du widget.
22
+
23
+ ## Le fil de revue
24
+
25
+ Chaque version en revue a un fil dans l’espace créateurs :
26
+
27
+ - Une **remarque** pointe un fichier et une ligne, cite le code que le
28
+ relecteur a lu et une règle numérotée des règles de publication.
29
+ - Vous pouvez **répondre** au relecteur. Votre réponse renvoie la revue au
30
+ relecteur quand elle vous attendait.
31
+ - Une **version corrigée** reprend le même fil : envoyez-la depuis
32
+ **Envoyer une version**, avec un numéro de version plus récent.
33
+ - La **décision** est une approbation, des modifications demandées ou un
34
+ refus, toujours motivés.
35
+
36
+ Les relecteurs apparaissent comme « Relecteur PlayerVox », jamais par leur
37
+ nom. Chaque fois qu’un relecteur ouvre vos sources, l’espace créateurs
38
+ montre quand, quelle version et pourquoi, dans **Accès à vos sources**.
39
+
40
+ ## Recours
41
+
42
+ Vous pouvez contester un refus ou une suspension une fois par décision,
43
+ sous six mois, avec **Contester la décision**. PlayerVox réexamine
44
+ entièrement la décision et vous répond sous 7 jours, de façon motivée. Vous
45
+ pouvez toujours envoyer une nouvelle version à la place.
46
+
47
+ ## Suspension
48
+
49
+ Quand les joueurs sont en danger (code malveillant, clé divulguée, fuite de
50
+ données), PlayerVox peut suspendre un widget ou une version aussitôt : les
51
+ copies installées sont désactivées. L’espace créateurs donne le motif et la
52
+ règle, et le recours reste ouvert.
53
+
54
+ ## Retrait
55
+
56
+ Vous pouvez retirer une version ou le widget entier à tout moment : il sort
57
+ du catalogue à la prochaine publication, et les copies installées
58
+ continuent de fonctionner. Une version en revue, ou approuvée et pas encore
59
+ publiée, est retirée tout de suite.
@@ -0,0 +1,141 @@
1
+ # Statistiques : définitions
2
+
3
+ L’onglet **Statistiques** d’un widget, dans l’espace créateurs, montre comment
4
+ les joueurs l’utilisent : installations, joueurs actifs par jour, erreurs et
5
+ note des joueurs. PlayerVox OverCrow envoie ces chiffres de façon anonyme. Ce
6
+ sont des tendances, pas des comptes exacts : cette page dit ce que compte
7
+ chaque chiffre et ce qu’il laisse de côté.
8
+
9
+ ## D’où viennent les chiffres
10
+
11
+ Une fois par jour au plus, à un moment tiré au hasard, OverCrow envoie un
12
+ signal anonyme pour chaque widget installé depuis le catalogue : le widget,
13
+ sa version, le jour, le système (Windows ou Linux), la version d’OverCrow, si
14
+ le widget a été affiché, installé ou désinstallé ce jour-là, et ses erreurs
15
+ (type, endroit du code, nombre arrondi).
16
+
17
+ - **Aucun identifiant** : rien ne désigne le joueur ni l’ordinateur, et rien
18
+ ne relie les widgets d’un même joueur, chaque widget étant envoyé à part.
19
+ - **Aucun message d’erreur** : seulement le type d’une erreur et son endroit
20
+ dans votre code. Un message peut contenir des données personnelles.
21
+ - **Activé par défaut** : les joueurs peuvent couper **Partager des
22
+ statistiques anonymes** dans OverCrow ; plus rien n’est envoyé ensuite, et
23
+ ils ne sont plus comptés.
24
+
25
+ Les chiffres s’additionnent à l’arrivée des signaux. **Mis à jour** donne
26
+ l’heure du dernier signal compté.
27
+
28
+ ## Les chiffres
29
+
30
+ | Chiffre | Ce qu’il compte |
31
+ | --- | --- |
32
+ | Joueurs actifs par jour | Les joueurs qui ont affiché le widget au moins une fois dans la journée. La tuile donne la moyenne par jour sur la période. |
33
+ | Installations actives | Les installations moins les désinstallations, additionnées depuis le premier signal, jamais sous zéro. |
34
+ | Installations · désinstallations | Les installations et les désinstallations de la période, et leur solde. Une mise à jour n’est ni l’une ni l’autre. |
35
+ | Erreurs | La somme des erreurs signalées sur la période. |
36
+
37
+ Chaque tuile compare son chiffre à la période juste avant, de même durée :
38
+ vert quand il évolue dans le bon sens (moins d’erreurs, plus de joueurs),
39
+ ambre dans l’autre sens, gris quand il bouge de moins de 1 %. **Première
40
+ période** signifie qu’il n’y a rien avant pour comparer.
41
+
42
+ ## Périodes et filtres
43
+
44
+ - **Période** : 7 jours, 28 jours, 90 jours ou 12 mois. Sur 12 mois, le
45
+ graphique des installations et désinstallations additionne chaque semaine.
46
+ - **Version** : une de vos versions publiées. Les installations actives
47
+ affichent « — » avec une version : une installation change de version à
48
+ chaque mise à jour, ce chiffre n’a donc de sens que pour toutes les
49
+ versions. **Adoption des versions** compare les versions et ne suit pas ce
50
+ filtre.
51
+ - **Système** : Windows ou Linux. **Où tourne votre widget** compare les
52
+ systèmes et ne suit pas ce filtre.
53
+ - La note ne suit aucun filtre.
54
+
55
+ Chaque graphique a **Voir en tableau**, avec les mêmes chiffres jour par
56
+ jour.
57
+
58
+ ## Adoption des versions et où tourne votre widget
59
+
60
+ - **Adoption des versions** : la part des joueurs actifs du jour sur chaque
61
+ version. Les trois versions les plus récentes gardent leur couleur ; les
62
+ autres s’additionnent dans **Plus anciennes**.
63
+ - **Où tourne votre widget** : la part des joueurs actifs sous Windows et
64
+ sous Linux, et sur chaque version d’OverCrow (les deux plus utilisées, puis
65
+ **Autres**).
66
+
67
+ ## Erreurs
68
+
69
+ Les erreurs sont regroupées par type et par endroit du code : le même type à
70
+ la même ligne de la même fonction forme un groupe, quelle que soit la
71
+ version. Le tableau montre les 50 groupes les plus fréquents de la période,
72
+ avec leurs versions, leur nombre et leur tendance ; **Exporter CSV** les
73
+ enregistre.
74
+
75
+ OverCrow signale où une erreur s’est produite dans le `logic.js` du paquet.
76
+ L’espace créateurs retrouve cette position dans vos sources (fichier, ligne
77
+ et fonction) grâce à une carte de votre code construite avec le paquet et
78
+ jamais publiée.
79
+
80
+ - **Retraduction en cours** : la position s’affiche en
81
+ `logic.js:ligne:colonne` jusqu’à ce qu’elle soit retrouvée.
82
+ - **Non retrouvée** : la version n’a pas de carte, ou la position n’y figure
83
+ pas ; la position brute reste.
84
+ - **Sans position dans le code** : le widget s’est arrêté tout entier
85
+ (budget dépassé, plus de réponse) ; voyez son type.
86
+ - **SDK** : l’erreur s’est produite dans `@overcrow/sdk`, appelé depuis votre
87
+ code.
88
+
89
+ | Type | Signification |
90
+ | --- | --- |
91
+ | `Error` | Erreur levée |
92
+ | `TypeError` | Valeur d’un type inattendu |
93
+ | `RangeError` | Valeur hors limites |
94
+ | `ReferenceError` | Nom inconnu |
95
+ | `SyntaxError` | Syntaxe invalide |
96
+ | `URIError` | Encodage d’adresse invalide |
97
+ | `EvalError` | Évaluation de code refusée |
98
+ | `AggregateError` | Plusieurs erreurs à la fois |
99
+ | `InternalError` | Limite du moteur atteinte |
100
+ | Valeur levée | Une valeur qui n’est pas une erreur a été levée |
101
+ | Budget mémoire ou de calcul dépassé | Le widget a été redémarré |
102
+ | Ne répondait plus | Le widget a été redémarré |
103
+ | Échec du chargement | Le code ou la vue n’a pas pu se charger |
104
+ | Processus du widget arrêté | Sans erreur signalée |
105
+ | Requête réseau refusée | Adresse non déclarée dans le manifeste |
106
+ | Autre erreur | D’un type que l’espace créateurs ne connaît pas encore |
107
+
108
+ Le type d’une erreur est le type intégré dont elle a été créée, jamais le
109
+ `name` que votre code peut lui donner.
110
+
111
+ ## Note des joueurs
112
+
113
+ Les joueurs notent un widget de 0 à 100 dans le Centre de contrôle
114
+ d’OverCrow, avec leur compte PlayerVox : une note par compte et par widget,
115
+ qu’ils peuvent modifier ou retirer.
116
+
117
+ - **Score** : la moyenne des notes, arrondie, avec son rang : S+ dès 90, S
118
+ dès 80, A dès 70, B dès 60, C dès 40, D dès 20, puis F.
119
+ - **À partir de 5 notes** : en dessous, l’espace créateurs indique **Pas
120
+ encore assez de notes** et donne le nombre de notes ; le catalogue
121
+ n’affiche rien.
122
+ - **Répartition par rang** : le nombre de notes dans chaque rang, visible
123
+ seulement dans l’espace créateurs. Personne ne voit qui a noté.
124
+ - **Depuis la dernière version** : les points gagnés ou perdus depuis la
125
+ publication de votre dernière version, si 5 notes existaient avant elle.
126
+ - Les membres de votre éditeur ne peuvent pas noter ses widgets.
127
+
128
+ Les joueurs voient le score, le rang et le nombre de notes dans le catalogue
129
+ et sur le site.
130
+
131
+ ## Des tendances, pas des comptes exacts
132
+
133
+ - Seuls les joueurs qui partagent leurs statistiques anonymes sont comptés.
134
+ - OverCrow arrondit chaque nombre d’erreurs à un palier avant de l’envoyer,
135
+ et envoie au plus 10 endroits du code par widget et par jour : les chiffres
136
+ des erreurs donnent des ordres de grandeur.
137
+ - Un jour est la date du joueur lui-même.
138
+ - Un joueur qui efface les données d’OverCrow, puis réinstalle le widget,
139
+ compte pour deux installations.
140
+ - Les signaux qui semblent cassés ou gonflés sont écartés avant d’être
141
+ comptés.