@overcrow/mcp 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -2
  3. package/dist/audit/index.js +103 -0
  4. package/dist/audit/lexer.js +417 -0
  5. package/dist/audit/project.js +200 -0
  6. package/dist/audit/rules.js +661 -0
  7. package/dist/bootstrap/download.js +229 -0
  8. package/dist/bootstrap/install.js +280 -0
  9. package/dist/bootstrap/pin.js +85 -0
  10. package/dist/bootstrap/pin.json +119 -0
  11. package/dist/bootstrap/zip.js +258 -0
  12. package/dist/cli.js +200 -0
  13. package/dist/confine.js +244 -0
  14. package/dist/content/docs/en/cli.md +353 -0
  15. package/dist/content/docs/en/dev-channel.md +130 -0
  16. package/dist/content/docs/en/elements.md +469 -0
  17. package/dist/content/docs/en/forms.md +328 -0
  18. package/dist/content/docs/en/guide.md +253 -0
  19. package/dist/content/docs/en/index.md +85 -0
  20. package/dist/content/docs/en/limits.md +241 -0
  21. package/dist/content/docs/en/logic.md +446 -0
  22. package/dist/content/docs/en/manifest.md +381 -0
  23. package/dist/content/docs/en/mcp.md +165 -0
  24. package/dist/content/docs/en/package.md +131 -0
  25. package/dist/content/docs/en/publishing.md +162 -0
  26. package/dist/content/docs/en/reference.md +55 -0
  27. package/dist/content/docs/en/result-shapes.md +332 -0
  28. package/dist/content/docs/en/sdk.md +295 -0
  29. package/dist/content/docs/en/security.md +115 -0
  30. package/dist/content/docs/en/service-reference.md +344 -0
  31. package/dist/content/docs/en/services.md +517 -0
  32. package/dist/content/docs/en/style-properties.md +270 -0
  33. package/dist/content/docs/en/style.md +266 -0
  34. package/dist/content/docs/en/testing.md +400 -0
  35. package/dist/content/docs/en/view.md +338 -0
  36. package/dist/content/docs/en/widgets.md +76 -0
  37. package/dist/content/docs/fr/cli.md +367 -0
  38. package/dist/content/docs/fr/dev-channel.md +140 -0
  39. package/dist/content/docs/fr/elements.md +475 -0
  40. package/dist/content/docs/fr/forms.md +341 -0
  41. package/dist/content/docs/fr/guide.md +264 -0
  42. package/dist/content/docs/fr/index.md +90 -0
  43. package/dist/content/docs/fr/limits.md +244 -0
  44. package/dist/content/docs/fr/logic.md +461 -0
  45. package/dist/content/docs/fr/manifest.md +392 -0
  46. package/dist/content/docs/fr/mcp.md +173 -0
  47. package/dist/content/docs/fr/package.md +139 -0
  48. package/dist/content/docs/fr/publishing.md +172 -0
  49. package/dist/content/docs/fr/reference.md +59 -0
  50. package/dist/content/docs/fr/result-shapes.md +333 -0
  51. package/dist/content/docs/fr/sdk.md +301 -0
  52. package/dist/content/docs/fr/security.md +129 -0
  53. package/dist/content/docs/fr/service-reference.md +346 -0
  54. package/dist/content/docs/fr/services.md +540 -0
  55. package/dist/content/docs/fr/style-properties.md +272 -0
  56. package/dist/content/docs/fr/style.md +281 -0
  57. package/dist/content/docs/fr/testing.md +417 -0
  58. package/dist/content/docs/fr/view.md +352 -0
  59. package/dist/content/docs/fr/widgets.md +81 -0
  60. package/dist/content/examples/clock/LICENSE +21 -0
  61. package/dist/content/examples/clock/README.md +75 -0
  62. package/dist/content/examples/clock/listing.json +19 -0
  63. package/dist/content/examples/clock/locales/en.json +4 -0
  64. package/dist/content/examples/clock/locales/fr.json +4 -0
  65. package/dist/content/examples/clock/logic.ts +85 -0
  66. package/dist/content/examples/clock/manifest.json +44 -0
  67. package/dist/content/examples/clock/package.json +16 -0
  68. package/dist/content/examples/clock/style.ocss +26 -0
  69. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  70. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  71. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  72. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  73. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  74. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  75. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  76. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  77. package/dist/content/examples/clock/tsconfig.json +16 -0
  78. package/dist/content/examples/clock/view.ocml +8 -0
  79. package/dist/content/examples/countdown/LICENSE +20 -0
  80. package/dist/content/examples/countdown/listing.json +10 -0
  81. package/dist/content/examples/countdown/locales/en.json +15 -0
  82. package/dist/content/examples/countdown/locales/fr.json +15 -0
  83. package/dist/content/examples/countdown/logic.ts +179 -0
  84. package/dist/content/examples/countdown/manifest.json +34 -0
  85. package/dist/content/examples/countdown/package.json +15 -0
  86. package/dist/content/examples/countdown/style.ocss +94 -0
  87. package/dist/content/examples/countdown/tsconfig.json +16 -0
  88. package/dist/content/examples/countdown/view.ocml +42 -0
  89. package/dist/content/examples/fps/LICENSE +21 -0
  90. package/dist/content/examples/fps/README.md +64 -0
  91. package/dist/content/examples/fps/listing.json +19 -0
  92. package/dist/content/examples/fps/locales/en.json +11 -0
  93. package/dist/content/examples/fps/locales/fr.json +11 -0
  94. package/dist/content/examples/fps/logic.ts +64 -0
  95. package/dist/content/examples/fps/manifest.json +30 -0
  96. package/dist/content/examples/fps/package.json +16 -0
  97. package/dist/content/examples/fps/style.ocss +31 -0
  98. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  99. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  100. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  101. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  102. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  103. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  104. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  105. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  106. package/dist/content/examples/fps/tsconfig.json +16 -0
  107. package/dist/content/examples/fps/view.ocml +11 -0
  108. package/dist/content/examples/media/LICENSE +21 -0
  109. package/dist/content/examples/media/README.md +147 -0
  110. package/dist/content/examples/media/listing.json +19 -0
  111. package/dist/content/examples/media/locales/en.json +11 -0
  112. package/dist/content/examples/media/locales/fr.json +11 -0
  113. package/dist/content/examples/media/logic.ts +191 -0
  114. package/dist/content/examples/media/manifest.json +35 -0
  115. package/dist/content/examples/media/package.json +16 -0
  116. package/dist/content/examples/media/style.ocss +148 -0
  117. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  118. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  119. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  120. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  121. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  122. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  123. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  124. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  125. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  126. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  127. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  128. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  129. package/dist/content/examples/media/tsconfig.json +16 -0
  130. package/dist/content/examples/media/view.ocml +41 -0
  131. package/dist/content/examples/notes/LICENSE +21 -0
  132. package/dist/content/examples/notes/README.md +219 -0
  133. package/dist/content/examples/notes/listing.json +19 -0
  134. package/dist/content/examples/notes/locales/en.json +25 -0
  135. package/dist/content/examples/notes/locales/fr.json +25 -0
  136. package/dist/content/examples/notes/logic.ts +799 -0
  137. package/dist/content/examples/notes/manifest.json +40 -0
  138. package/dist/content/examples/notes/package.json +16 -0
  139. package/dist/content/examples/notes/style.ocss +469 -0
  140. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  141. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  142. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  143. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  144. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  145. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  146. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  147. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  148. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  149. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  150. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  151. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  152. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  153. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  154. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  155. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  156. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  157. package/dist/content/examples/notes/tsconfig.json +16 -0
  158. package/dist/content/examples/notes/view.ocml +154 -0
  159. package/dist/content/examples/performance/LICENSE +21 -0
  160. package/dist/content/examples/performance/README.md +134 -0
  161. package/dist/content/examples/performance/listing.json +19 -0
  162. package/dist/content/examples/performance/locales/en.json +20 -0
  163. package/dist/content/examples/performance/locales/fr.json +20 -0
  164. package/dist/content/examples/performance/logic.ts +210 -0
  165. package/dist/content/examples/performance/manifest.json +83 -0
  166. package/dist/content/examples/performance/package.json +16 -0
  167. package/dist/content/examples/performance/style.ocss +75 -0
  168. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  169. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  170. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  171. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  172. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  173. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  174. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  175. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  176. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  177. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  178. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  179. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  180. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  181. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  182. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  183. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  184. package/dist/content/examples/performance/tsconfig.json +16 -0
  185. package/dist/content/examples/performance/view.ocml +18 -0
  186. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  187. package/dist/content/examples/playervox-journal/README.md +150 -0
  188. package/dist/content/examples/playervox-journal/listing.json +19 -0
  189. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  190. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  191. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  192. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  193. package/dist/content/examples/playervox-journal/package.json +16 -0
  194. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  195. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  196. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  197. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  198. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  199. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  200. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  201. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  202. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  203. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  204. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  205. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  206. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  207. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  208. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  209. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  210. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  211. package/dist/content/examples/playervox-rating/README.md +166 -0
  212. package/dist/content/examples/playervox-rating/listing.json +19 -0
  213. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  214. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  215. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  216. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  217. package/dist/content/examples/playervox-rating/package.json +16 -0
  218. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  219. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  220. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  221. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  222. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  223. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  224. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  225. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  226. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  227. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  228. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  229. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  230. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  231. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  232. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  233. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  234. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  235. package/dist/content/examples/playervox-reviews/README.md +194 -0
  236. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  237. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  238. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  239. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  240. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  241. package/dist/content/examples/playervox-reviews/package.json +16 -0
  242. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  243. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  244. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  245. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  246. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  247. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  248. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  249. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  250. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  251. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  252. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  253. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  254. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  255. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  256. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  257. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  258. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  259. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  260. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  261. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  262. package/dist/content/examples/playervox-score/LICENSE +21 -0
  263. package/dist/content/examples/playervox-score/README.md +131 -0
  264. package/dist/content/examples/playervox-score/listing.json +19 -0
  265. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  266. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  267. package/dist/content/examples/playervox-score/logic.ts +430 -0
  268. package/dist/content/examples/playervox-score/manifest.json +47 -0
  269. package/dist/content/examples/playervox-score/package.json +16 -0
  270. package/dist/content/examples/playervox-score/style.ocss +247 -0
  271. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  272. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  273. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  274. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  275. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  276. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  277. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  278. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  279. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  280. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  281. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-score/view.ocml +51 -0
  283. package/dist/content/examples/session/LICENSE +21 -0
  284. package/dist/content/examples/session/README.md +57 -0
  285. package/dist/content/examples/session/listing.json +19 -0
  286. package/dist/content/examples/session/locales/en.json +3 -0
  287. package/dist/content/examples/session/locales/fr.json +3 -0
  288. package/dist/content/examples/session/logic.ts +26 -0
  289. package/dist/content/examples/session/manifest.json +19 -0
  290. package/dist/content/examples/session/package.json +16 -0
  291. package/dist/content/examples/session/style.ocss +16 -0
  292. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  293. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  294. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  295. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  296. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  297. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  298. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  299. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  300. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  301. package/dist/content/examples/session/tsconfig.json +16 -0
  302. package/dist/content/examples/session/view.ocml +11 -0
  303. package/dist/content/examples/stopwatch/LICENSE +21 -0
  304. package/dist/content/examples/stopwatch/README.md +99 -0
  305. package/dist/content/examples/stopwatch/listing.json +19 -0
  306. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  307. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  308. package/dist/content/examples/stopwatch/logic.ts +93 -0
  309. package/dist/content/examples/stopwatch/manifest.json +19 -0
  310. package/dist/content/examples/stopwatch/package.json +16 -0
  311. package/dist/content/examples/stopwatch/style.ocss +54 -0
  312. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  313. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  314. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  315. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  316. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  318. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  319. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  320. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  321. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  322. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  323. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  324. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  325. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  326. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  327. package/dist/content/examples/stopwatch/view.ocml +29 -0
  328. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  329. package/dist/content/examples/twitch-chat/README.md +283 -0
  330. package/dist/content/examples/twitch-chat/listing.json +19 -0
  331. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  332. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  333. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  334. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  335. package/dist/content/examples/twitch-chat/package.json +16 -0
  336. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  337. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  338. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  339. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  340. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  341. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  342. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  343. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  344. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  345. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  346. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  347. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  348. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  349. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  350. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  351. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  352. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  353. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  354. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  355. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  356. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  357. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  358. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  359. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  360. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  361. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  362. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  363. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  364. package/dist/content/examples/warframe-market/LICENSE +21 -0
  365. package/dist/content/examples/warframe-market/README.md +176 -0
  366. package/dist/content/examples/warframe-market/listing.json +19 -0
  367. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  368. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  369. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  370. package/dist/content/examples/warframe-market/manifest.json +92 -0
  371. package/dist/content/examples/warframe-market/package.json +16 -0
  372. package/dist/content/examples/warframe-market/style.ocss +422 -0
  373. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  374. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  375. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  376. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  377. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  378. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  379. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  380. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  381. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  382. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  383. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  384. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  385. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  386. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  387. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  388. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  389. package/dist/content/examples/warframe-market/view.ocml +116 -0
  390. package/dist/content/examples/weather/LICENSE +20 -0
  391. package/dist/content/examples/weather/listing.json +10 -0
  392. package/dist/content/examples/weather/locales/en.json +9 -0
  393. package/dist/content/examples/weather/locales/fr.json +9 -0
  394. package/dist/content/examples/weather/logic.ts +62 -0
  395. package/dist/content/examples/weather/manifest.json +51 -0
  396. package/dist/content/examples/weather/package.json +15 -0
  397. package/dist/content/examples/weather/style.ocss +29 -0
  398. package/dist/content/examples/weather/tsconfig.json +16 -0
  399. package/dist/content/examples/weather/view.ocml +12 -0
  400. package/dist/content/index.json +3601 -0
  401. package/dist/content/reference/errors.json +1712 -0
  402. package/dist/content/reference/limits.json +1154 -0
  403. package/dist/content/reference/manifest.md +223 -0
  404. package/dist/content/reference/permissions.json +413 -0
  405. package/dist/content/templates/blank/locales/en.json +3 -0
  406. package/dist/content/templates/blank/locales/fr.json +3 -0
  407. package/dist/content/templates/blank/logic.ts +7 -0
  408. package/dist/content/templates/blank/manifest.json +16 -0
  409. package/dist/content/templates/blank/style.ocss +10 -0
  410. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  411. package/dist/content/templates/blank/view.ocml +6 -0
  412. package/dist/content/templates/chart/locales/en.json +3 -0
  413. package/dist/content/templates/chart/locales/fr.json +3 -0
  414. package/dist/content/templates/chart/logic.ts +27 -0
  415. package/dist/content/templates/chart/manifest.json +16 -0
  416. package/dist/content/templates/chart/style.ocss +27 -0
  417. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  418. package/dist/content/templates/chart/view.ocml +10 -0
  419. package/dist/content/templates/counter/locales/en.json +4 -0
  420. package/dist/content/templates/counter/locales/fr.json +4 -0
  421. package/dist/content/templates/counter/logic.ts +20 -0
  422. package/dist/content/templates/counter/manifest.json +16 -0
  423. package/dist/content/templates/counter/style.ocss +26 -0
  424. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  425. package/dist/content/templates/counter/view.ocml +13 -0
  426. package/dist/content/templates/list/locales/en.json +8 -0
  427. package/dist/content/templates/list/locales/fr.json +8 -0
  428. package/dist/content/templates/list/logic.ts +35 -0
  429. package/dist/content/templates/list/manifest.json +16 -0
  430. package/dist/content/templates/list/style.ocss +42 -0
  431. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  432. package/dist/content/templates/list/view.ocml +17 -0
  433. package/dist/content/templates/shared/LICENSE +20 -0
  434. package/dist/content/templates/shared/package.json +14 -0
  435. package/dist/content/templates/shared/tsconfig.json +16 -0
  436. package/dist/content.js +68 -0
  437. package/dist/env.js +156 -0
  438. package/dist/fingerprint.js +32 -0
  439. package/dist/ids.js +27 -0
  440. package/dist/index.js +82 -0
  441. package/dist/knowledge.js +222 -0
  442. package/dist/npm.js +149 -0
  443. package/dist/prompts.js +47 -0
  444. package/dist/resources.js +82 -0
  445. package/dist/run.js +120 -0
  446. package/dist/server.js +43 -0
  447. package/dist/session.js +205 -0
  448. package/dist/sources.js +218 -0
  449. package/dist/text.js +80 -0
  450. package/dist/texts.js +44 -0
  451. package/dist/tools/audit.js +105 -0
  452. package/dist/tools/build.js +453 -0
  453. package/dist/tools/common.js +122 -0
  454. package/dist/tools/docs.js +196 -0
  455. package/dist/tools/preview.js +87 -0
  456. package/dist/tools/project.js +178 -0
  457. package/dist/tools/setup.js +146 -0
  458. package/dist/tools/submission.js +369 -0
  459. package/dist/version.js +3 -0
  460. package/npm-shrinkwrap.json +402 -0
  461. package/package.json +52 -4
@@ -0,0 +1,130 @@
1
+ # The development channel
2
+
3
+ `overcrow-widget dev` shows your widget in the PlayerVox OverCrow overlay
4
+ running on your machine, over your game, and reloads it each time you save
5
+ a file. It reaches the overlay through the **development channel**, which
6
+ OverCrow opens only when you ask for it.
7
+
8
+ ```sh
9
+ overcrow-widget doctor
10
+ overcrow-widget dev
11
+ ```
12
+
13
+ `doctor` says whether a running overlay offers the channel; `dev` then
14
+ builds the widget, sends it and stays in the foreground until Ctrl+C.
15
+
16
+ ## Turn it on
17
+
18
+ The channel exists only while OverCrow runs with development installs
19
+ allowed: started with the environment variable
20
+ `OVERCROW_WIDGET_DEVELOPMENT=1`. Without it, the overlay opens nothing.
21
+
22
+ **Linux.** Set the variable for your session's services, then restart the
23
+ overlay:
24
+
25
+ ```sh
26
+ systemctl --user set-environment OVERCROW_WIDGET_DEVELOPMENT=1
27
+ systemctl --user restart overcrow-overlay.service
28
+ ```
29
+
30
+ To turn it off, unset the variable and restart again (or log out):
31
+
32
+ ```sh
33
+ systemctl --user unset-environment OVERCROW_WIDGET_DEVELOPMENT
34
+ systemctl --user restart overcrow-overlay.service
35
+ ```
36
+
37
+ **Windows.** Quit OverCrow from its tray icon, then start it from
38
+ PowerShell:
39
+
40
+ ```text
41
+ $env:OVERCROW_WIDGET_DEVELOPMENT='1'; & "$env:LOCALAPPDATA\Programs\OverCrow\OverCrow.exe"
42
+ ```
43
+
44
+ `overcrow-widget doctor` prints these commands when it finds an overlay
45
+ without the channel (`doctor.development_off`).
46
+
47
+ ## What a development widget is
48
+
49
+ The overlay treats what `dev` sends as a **development package**:
50
+
51
+ - it is validated in full, exactly as an installed package is, and runs in
52
+ the same sandbox: nothing sent over the channel skips a check;
53
+ - it is marked **Unverified · development package** in both modes, so it
54
+ cannot be mistaken for a widget of the catalog;
55
+ - the permissions its manifest declares are granted for the session only;
56
+ - nothing of it is stored: its storage lasts as long as the session, and it
57
+ never reads or writes the data of an installed widget;
58
+ - it takes the place of an installed widget of the same ID for the
59
+ session, and the installed widget comes back when it is removed;
60
+ - IDs under `com.playervox.` are refused.
61
+
62
+ When `dev` ends, for any reason, the overlay removes the widget.
63
+
64
+ ## What `dev` prints
65
+
66
+ For each save, `dev` rebuilds the package and prints the same diagnostics
67
+ as `check`. A build with errors is not sent: the widget keeps running its
68
+ last good build. Then come the overlay's reports.
69
+
70
+ **States** of the widget:
71
+
72
+ | State | Meaning |
73
+ | --- | --- |
74
+ | `starting` | The overlay is starting the widget's process. |
75
+ | `running` | The widget runs. |
76
+ | `restarting` | It failed and is being restarted; the failure is shown. |
77
+ | `failed` | It failed too often: it waits for your next save. |
78
+ | `refused` | The overlay refused to start it. |
79
+ | `stopped` | It was stopped. |
80
+
81
+ **Failures** that come with `restarting` and `failed`:
82
+
83
+ <!-- generated:failure-categories -->
84
+ | Category | Restarted | Meaning |
85
+ | --- | --- | --- |
86
+ | `invalid_bundle` | no | Package, ledger or compiled content rejected. |
87
+ | `permission_denied` | no | What the widget declares, what the user granted and what is requested disagree. |
88
+ | `protocol_violation` | no | What the widget sent to the host is malformed, unknown or out of order. |
89
+ | `resource_limit` | yes | A memory, CPU, queue, rate or size ceiling was exceeded. |
90
+ | `unresponsive` | yes | The widget did not start or answer in time, or exceeded the time budget of a turn. |
91
+ | `vm_exited` | yes | The widget's process ended without reporting a fault (killed by the sandbox, out of memory). |
92
+ <!-- /generated:failure-categories -->
93
+
94
+ **Logs**: each `log.debug`, `log.info`, `log.warn` and `log.error` of the
95
+ logic, with its level. A log line is cut at 512 characters, and control
96
+ characters, terminal escape sequences and bidirectional controls are shown
97
+ escaped (`\u{1b}`), never interpreted: a widget's text cannot take over
98
+ your terminal.
99
+
100
+ With `--format json`, each of these is one JSON object per line: the
101
+ diagnostics, `{"type":"built",…}` for each build, then the overlay's
102
+ messages (`state`, `log`, `event`…) as they come.
103
+
104
+ ## When it does not connect
105
+
106
+ | What you see | Cause |
107
+ | --- | --- |
108
+ | `doctor.development_off` | No running overlay allows development installs: [turn it on](#turn-it-on). |
109
+ | `doctor.overcrow_missing` | OverCrow is not installed. |
110
+ | `doctor.channel_busy`, `too_many_sessions` | Four `dev` sessions are already connected to this overlay. |
111
+ | `doctor.protocol_version`, `unsupported_protocol` | The overlay and the tool do not speak the same version of the channel: update the older one. |
112
+ | `doctor.channel_untrusted` | What answers on the channel's address is not your own overlay. |
113
+ | `busy` | Another install or removal is in progress: `dev` tries again. |
114
+ | `conflict` | Another `dev` session installed a widget with this ID. |
115
+ | `invalid_bundle` | The overlay's validation refused the package; a reserved `com.playervox.*` ID is one cause. |
116
+ | `development_disabled` | The overlay no longer allows development installs. |
117
+ | `unavailable` | The overlay could not start its widget runtime, or did not answer within 30 seconds. |
118
+ | `rate_limited` | More than 10 requests per second: saves are arriving faster than the overlay accepts them. |
119
+
120
+ ## Who can use the channel
121
+
122
+ Only programs running as **your own user** on the same machine: the channel
123
+ is a local socket (Linux) or a named pipe (Windows) that other users, other
124
+ machines and sandboxed programs cannot open, and each end checks the other
125
+ before a session starts. Widgets cannot use it: their sandbox has no access
126
+ to it.
127
+
128
+ This is why the channel is off by default. With it on, any program you run
129
+ can show an unverified widget in your overlay, for as long as OverCrow
130
+ runs. Turn it off when you are done.
@@ -0,0 +1,469 @@
1
+ # Elements and attributes
2
+
3
+ The view of a PlayerVox OverCrow widget is made of a closed set of
4
+ elements. This page lists each one with its content, its attributes and
5
+ the events it can send. [The view](view.md) explains the markup around
6
+ them: expressions, `if`, `for`, components.
7
+
8
+ <!-- source: templates/chart/view.ocml -->
9
+ ```xml
10
+ <box class="panel">
11
+ <box class="header">
12
+ <text class="title">{t("title")}</text>
13
+ <text class="value">{latest(state.values)}</text>
14
+ </box>
15
+ <chart class="plot" kind="area" min="0" max="100">
16
+ <series class="series" values={state.values}/>
17
+ </chart>
18
+ </box>
19
+ ```
20
+
21
+ Two `box` containers, two `text` elements bound to the state, and a `chart`
22
+ with one `series`: OverCrow draws all of it, the chart included.
23
+
24
+ ## How to read an element
25
+
26
+ - **Content** is what the element may hold: *flow* is any element that can
27
+ stand on its own in a container (all but `span`, `option` and `series`);
28
+ *inline* is the content of a `text`; *text* is plain text; *empty* means
29
+ the element is written `<name …/>`.
30
+ - **Parents** says where the element may be: *any flow* is any container.
31
+ - **Keyboard focus**: *always* for controls; *when subscribed* for an
32
+ element that takes the focus only when the view listens to one of its
33
+ events (`on:activate`…); *never* otherwise.
34
+ - **Role** is what assistive technology is told the element is.
35
+ - **Events** are the events the view may listen to with `on:<event>`.
36
+
37
+ A type such as "text ≤ 256 bytes" gives a [limit](limits.md).
38
+
39
+ ## Attributes of every element
40
+
41
+ <!-- generated:common-attributes -->
42
+ | Attribute | Type | Required | Meaning |
43
+ | --- | --- | --- | --- |
44
+ | `class` | class list | no | Style classes: distinct names separated by one space. |
45
+ | `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. |
46
+ | `label` | text ≤ 256 bytes | no | Accessible name; required on icon-only controls. |
47
+ | `tooltip` | text ≤ 256 bytes | no | Plain text drawn by the host on hover or focus. |
48
+ | `on` | sorted event names | no | Events forwarded to the logic; written `on:<event>` in the view. |
49
+ <!-- /generated:common-attributes -->
50
+
51
+ ## Elements
52
+
53
+ <!-- generated:elements -->
54
+ ### `box`
55
+
56
+ Generic container; flex or grid layout comes from style. The root of the view is a `box`.
57
+
58
+ | Content | Parents | Keyboard focus | Role | Events |
59
+ | --- | --- | --- | --- | --- |
60
+ | flow | any flow | when subscribed | `group` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
61
+
62
+ No attribute of its own.
63
+
64
+ ### `scroll`
65
+
66
+ Clipping container scrolled by the host with wheel, drag and keyboard.
67
+
68
+ | Content | Parents | Keyboard focus | Role | Events |
69
+ | --- | --- | --- | --- | --- |
70
+ | flow | any flow | never | `scroll-view` | `reachend`, `stick`, `contextmenu` |
71
+
72
+ | Attribute | Type | Required | Meaning |
73
+ | --- | --- | --- | --- |
74
+ | `axis` | `vertical` \| `horizontal` | no | Scroll direction; default `vertical`. |
75
+ | `stick-to-end` | boolean | no | Stay at the end while content grows, until the user scrolls away (chat). Setting it again after it was off scrolls to the end. |
76
+
77
+ ### `list`
78
+
79
+ Vertical scrolling list whose children are laid out and painted only when visible.
80
+
81
+ | Content | Parents | Keyboard focus | Role | Events |
82
+ | --- | --- | --- | --- | --- |
83
+ | flow | any flow | never | `list` | `reachend`, `stick`, `contextmenu` |
84
+
85
+ | Attribute | Type | Required | Meaning |
86
+ | --- | --- | --- | --- |
87
+ | `stick-to-end` | boolean | no | As for `scroll`. |
88
+ | `item-height` | integer 1 to 4096 | no | Estimated child height used before a child is first measured. |
89
+
90
+ ### `text`
91
+
92
+ Block of wrapped text; its inline children flow with it (chat line with emotes).
93
+
94
+ | Content | Parents | Keyboard focus | Role | Events |
95
+ | --- | --- | --- | --- | --- |
96
+ | inline: `span`, `icon`, `image` | any flow | when subscribed | `label` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
97
+
98
+ | Attribute | Type | Required | Meaning |
99
+ | --- | --- | --- | --- |
100
+ | `selectable` | boolean | no | The user can select the text and copy it through the host; no widget permission involved. |
101
+
102
+ ### `span`
103
+
104
+ Styled run of text inside `text`.
105
+
106
+ | Content | Parents | Keyboard focus | Role | Events |
107
+ | --- | --- | --- | --- | --- |
108
+ | text | `text` | never | `label` | none |
109
+
110
+ | Attribute | Type | Required | Meaning |
111
+ | --- | --- | --- | --- |
112
+ | `color` | opaque `#rrggbb` | no | Colour from data, such as a chat author's; overrides the style colour, and the host raises its contrast to at least 4.5:1 against the panel. |
113
+
114
+ ### `icon`
115
+
116
+ Lucide icon tinted with `color`, sized by `font-size` unless `width` and `height` are set.
117
+
118
+ | Content | Parents | Keyboard focus | Role | Events |
119
+ | --- | --- | --- | --- | --- |
120
+ | empty | any flow | when subscribed | `image` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
121
+
122
+ | Attribute | Type | Required | Meaning |
123
+ | --- | --- | --- | --- |
124
+ | `name` | Lucide icon name | yes | Icon name, for example `circle-check`. |
125
+
126
+ ### `image`
127
+
128
+ Raster image from the package, or an image handed by a service (an `asset:` handle); `object-fit` applies.
129
+
130
+ | Content | Parents | Keyboard focus | Role | Events |
131
+ | --- | --- | --- | --- | --- |
132
+ | empty | any flow | when subscribed | `image` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
133
+
134
+ | Attribute | Type | Required | Meaning |
135
+ | --- | --- | --- | --- |
136
+ | `src` | image source | yes | Image source. |
137
+
138
+ ### `avatar`
139
+
140
+ Round image with a text fallback while the image is missing or failed.
141
+
142
+ | Content | Parents | Keyboard focus | Role | Events |
143
+ | --- | --- | --- | --- | --- |
144
+ | empty | any flow | when subscribed | `image` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
145
+
146
+ | Attribute | Type | Required | Meaning |
147
+ | --- | --- | --- | --- |
148
+ | `src` | image source | no | Image source. |
149
+ | `initials` | text ≤ 16 bytes | no | Fallback text. |
150
+
151
+ ### `badge`
152
+
153
+ Short pill of text.
154
+
155
+ | Content | Parents | Keyboard focus | Role | Events |
156
+ | --- | --- | --- | --- | --- |
157
+ | text | any flow | when subscribed | `label` | `activate`, `contextmenu`, `wheel` |
158
+
159
+ No attribute of its own.
160
+
161
+ ### `button`
162
+
163
+ Activatable control; its children (icon, text) form its content.
164
+
165
+ | Content | Parents | Keyboard focus | Role | Events |
166
+ | --- | --- | --- | --- | --- |
167
+ | flow | any flow | always | `button` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
168
+
169
+ | Attribute | Type | Required | Meaning |
170
+ | --- | --- | --- | --- |
171
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
172
+ | `submit` | boolean | no | Submits the enclosing `form`. |
173
+
174
+ ### `toggle`
175
+
176
+ On/off switch.
177
+
178
+ | Content | Parents | Keyboard focus | Role | Events |
179
+ | --- | --- | --- | --- | --- |
180
+ | empty | any flow | always | `switch` | `change`, `focus`, `blur`, `contextmenu` |
181
+
182
+ | Attribute | Type | Required | Meaning |
183
+ | --- | --- | --- | --- |
184
+ | `checked` | boolean | no | State; matches `:checked`. |
185
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
186
+ | `name` | identifier ≤ 64 bytes | no | Field name inside a `form`. |
187
+
188
+ ### `checkbox`
189
+
190
+ Check control (checklists).
191
+
192
+ | Content | Parents | Keyboard focus | Role | Events |
193
+ | --- | --- | --- | --- | --- |
194
+ | empty | any flow | always | `check-box` | `change`, `focus`, `blur`, `contextmenu` |
195
+
196
+ | Attribute | Type | Required | Meaning |
197
+ | --- | --- | --- | --- |
198
+ | `checked` | boolean | no | State; matches `:checked`. |
199
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
200
+ | `name` | identifier ≤ 64 bytes | no | Field name inside a `form`. |
201
+
202
+ ### `slider`
203
+
204
+ Numeric range control; dragging is handled by the host.
205
+
206
+ | Content | Parents | Keyboard focus | Role | Events |
207
+ | --- | --- | --- | --- | --- |
208
+ | empty | any flow | always | `slider` | `input`, `change`, `focus`, `blur`, `contextmenu` |
209
+
210
+ | Attribute | Type | Required | Meaning |
211
+ | --- | --- | --- | --- |
212
+ | `min` | number -1000000000 to 1000000000 | yes | Lower bound. |
213
+ | `max` | number -1000000000 to 1000000000 | yes | Upper bound, greater than `min`. |
214
+ | `step` | number -1000000000 to 1000000000 | no | Positive increment; default 1. |
215
+ | `value` | number -1000000000 to 1000000000 | no | Current value, clamped to the range; rejected on a slider bound to a write intent. |
216
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
217
+ | `name` | identifier ≤ 64 bytes | no | Field name inside a `form`. |
218
+
219
+ ### `select`
220
+
221
+ Drop-down choice; the open list is drawn by the host.
222
+
223
+ | Content | Parents | Keyboard focus | Role | Events |
224
+ | --- | --- | --- | --- | --- |
225
+ | `option` | any flow | always | `combo-box` | `change`, `focus`, `blur`, `contextmenu` |
226
+
227
+ | Attribute | Type | Required | Meaning |
228
+ | --- | --- | --- | --- |
229
+ | `value` | text ≤ 1 KiB | no | Selected option value. |
230
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
231
+ | `name` | identifier ≤ 64 bytes | no | Field name inside a `form`. |
232
+
233
+ ### `option`
234
+
235
+ Choice of a `select`; its text is the visible label.
236
+
237
+ | Content | Parents | Keyboard focus | Role | Events |
238
+ | --- | --- | --- | --- | --- |
239
+ | text | `select` | never | `list-box-option` | none |
240
+
241
+ | Attribute | Type | Required | Meaning |
242
+ | --- | --- | --- | --- |
243
+ | `value` | text ≤ 1 KiB | yes | Value reported by `change`. |
244
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
245
+
246
+ ### `field`
247
+
248
+ Single-line text input edited by the host, input methods (IME) included.
249
+
250
+ | Content | Parents | Keyboard focus | Role | Events |
251
+ | --- | --- | --- | --- | --- |
252
+ | empty | any flow | always | `text-input` | `input`, `change`, `submit`, `keydown`, `focus`, `blur`, `contextmenu` |
253
+
254
+ | Attribute | Type | Required | Meaning |
255
+ | --- | --- | --- | --- |
256
+ | `value` | text ≤ 16 KiB | no | Replaces the content; rejected on a field bound to a write intent. |
257
+ | `placeholder` | text ≤ 256 bytes | no | Hint shown while empty. |
258
+ | `max-length` | integer 1 to 16384 | no | Content limit in bytes; a write intent may impose a lower one. |
259
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
260
+ | `name` | identifier ≤ 64 bytes | no | Field name inside a `form`. |
261
+ | `autofocus` | boolean | no | Takes keyboard focus when the element appears while the logic handles a user action (an editor opened by a click), in Interactive mode, in the widget that received the action; the first such element of the view when several appear together. Never when the widget starts, from a timer or the answer of a service, in Passive mode, or when set on an element already shown. |
262
+
263
+ ### `textarea`
264
+
265
+ Multi-line text input edited by the host, input methods (IME) included.
266
+
267
+ | Content | Parents | Keyboard focus | Role | Events |
268
+ | --- | --- | --- | --- | --- |
269
+ | empty | any flow | always | `multiline-text-input` | `input`, `change`, `submit`, `keydown`, `focus`, `blur`, `contextmenu` |
270
+
271
+ | Attribute | Type | Required | Meaning |
272
+ | --- | --- | --- | --- |
273
+ | `value` | text ≤ 16 KiB | no | As for `field`. |
274
+ | `placeholder` | text ≤ 256 bytes | no | Hint shown while empty. |
275
+ | `max-length` | integer 1 to 16384 | no | As for `field`. |
276
+ | `rows` | integer 1 to 40 | no | Visible rows before scrolling; default 3. |
277
+ | `disabled` | boolean | no | Rejects input; matches `:disabled`. |
278
+ | `name` | identifier ≤ 64 bytes | no | Field name inside a `form`. |
279
+ | `autofocus` | boolean | no | Takes keyboard focus when the element appears while the logic handles a user action (an editor opened by a click), in Interactive mode, in the widget that received the action; the first such element of the view when several appear together. Never when the widget starts, from a timer or the answer of a service, in Passive mode, or when set on an element already shown. |
280
+
281
+ ### `form`
282
+
283
+ 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.
284
+
285
+ | Content | Parents | Keyboard focus | Role | Events |
286
+ | --- | --- | --- | --- | --- |
287
+ | flow | any flow | never | `form` | `submit` |
288
+
289
+ | Attribute | Type | Required | Meaning |
290
+ | --- | --- | --- | --- |
291
+ | `intent` | `notes.save` \| `playervox.rating.publish` \| `twitch.chat.send` | no | Bound write intent. |
292
+ | `target` | text ≤ 1 KiB | no | Opaque ID of the edited object (note, reply parent), checked by the service. |
293
+
294
+ ### `elapsed`
295
+
296
+ 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.
297
+
298
+ | Content | Parents | Keyboard focus | Role | Events |
299
+ | --- | --- | --- | --- | --- |
300
+ | empty | any flow | when subscribed | `timer` | `activate`, `contextmenu`, `wheel` |
301
+
302
+ | Attribute | Type | Required | Meaning |
303
+ | --- | --- | --- | --- |
304
+ | `base` | integer 0 to 9007199254740991 | yes | Elapsed milliseconds at `at`. |
305
+ | `at` | integer 0 to 9007199254740991 | yes | Host monotonic milliseconds from the service result. |
306
+ | `running` | boolean | no | Advance from `at`; default `false`. |
307
+ | `format` | `hh:mm:ss` \| `hh:mm:ss.cc` \| `mm:ss` | yes | Hours grow past 99; `cc` are hundredths, truncated. |
308
+
309
+ ### `progress`
310
+
311
+ Horizontal progress bar.
312
+
313
+ | Content | Parents | Keyboard focus | Role | Events |
314
+ | --- | --- | --- | --- | --- |
315
+ | empty | any flow | when subscribed | `progress-indicator` | `activate`, `contextmenu`, `wheel` |
316
+
317
+ | Attribute | Type | Required | Meaning |
318
+ | --- | --- | --- | --- |
319
+ | `value` | number -1000000000 to 1000000000 | yes | Current value. |
320
+ | `max` | number -1000000000 to 1000000000 | no | Positive upper bound; default 1. |
321
+
322
+ ### `gauge`
323
+
324
+ Ring or arc gauge.
325
+
326
+ | Content | Parents | Keyboard focus | Role | Events |
327
+ | --- | --- | --- | --- | --- |
328
+ | empty | any flow | when subscribed | `meter` | `activate`, `contextmenu`, `wheel` |
329
+
330
+ | Attribute | Type | Required | Meaning |
331
+ | --- | --- | --- | --- |
332
+ | `value` | number -1000000000 to 1000000000 | yes | Current value. |
333
+ | `max` | number -1000000000 to 1000000000 | no | Positive upper bound; default 1. |
334
+ | `shape` | `ring` \| `arc` | no | Default `ring`. |
335
+
336
+ ### `chart`
337
+
338
+ Line, area, bar or sparkline chart drawn by the host.
339
+
340
+ | Content | Parents | Keyboard focus | Role | Events |
341
+ | --- | --- | --- | --- | --- |
342
+ | `series` | any flow | when subscribed | `figure` | `activate`, `contextmenu`, `wheel` |
343
+
344
+ | Attribute | Type | Required | Meaning |
345
+ | --- | --- | --- | --- |
346
+ | `kind` | `line` \| `area` \| `bar` \| `sparkline` | yes | Chart type. |
347
+ | `min` | number -1000000000 to 1000000000 | no | Fixed lower bound of the value axis. |
348
+ | `max` | number -1000000000 to 1000000000 | no | Fixed upper bound of the value axis. |
349
+
350
+ ### `series`
351
+
352
+ One data series of a `chart`, coloured with `color`.
353
+
354
+ | Content | Parents | Keyboard focus | Role | Events |
355
+ | --- | --- | --- | --- | --- |
356
+ | empty | `chart` | never | `figure` | none |
357
+
358
+ | Attribute | Type | Required | Meaning |
359
+ | --- | --- | --- | --- |
360
+ | `values` | number list ≤ 1024 | yes | Values in order. |
361
+
362
+ ### `separator`
363
+
364
+ Thin rule between groups.
365
+
366
+ | Content | Parents | Keyboard focus | Role | Events |
367
+ | --- | --- | --- | --- | --- |
368
+ | empty | any flow | never | `splitter` | none |
369
+
370
+ | Attribute | Type | Required | Meaning |
371
+ | --- | --- | --- | --- |
372
+ | `axis` | `vertical` \| `horizontal` | no | Default `horizontal`. |
373
+
374
+ ### `canvas`
375
+
376
+ Surface painted by the host from the latest list of commands given to `draw`.
377
+
378
+ | Content | Parents | Keyboard focus | Role | Events |
379
+ | --- | --- | --- | --- | --- |
380
+ | empty | any flow | when subscribed | `image` | `activate`, `contextmenu`, `wheel`, `keydown`, `focus`, `blur` |
381
+
382
+ No attribute of its own.
383
+
384
+ ### `popover`
385
+
386
+ Floating panel anchored to an element, drawn above the content and clipped to the widget's frame (drop-downs, context menus).
387
+
388
+ | Content | Parents | Keyboard focus | Role | Events |
389
+ | --- | --- | --- | --- | --- |
390
+ | flow | any flow | never | `menu` | `dismiss` |
391
+
392
+ | Attribute | Type | Required | Meaning |
393
+ | --- | --- | --- | --- |
394
+ | `anchor` | `ref` name | yes | `ref` of the element the panel is placed against. |
395
+ | `open` | boolean | no | Visibility; the host closes it and sends `dismiss`. |
396
+ | `placement` | `below` \| `above` \| `start` \| `end` \| `pointer` | no | Preferred side, or the last pointer position; default `below`. |
397
+ <!-- /generated:elements -->
398
+
399
+ ## Events
400
+
401
+ <!-- generated:events -->
402
+ | Event | User action | Detail | Meaning |
403
+ | --- | --- | --- | --- |
404
+ | `activate` | **yes** | `x`, `y` | Primary click, or Enter or Space on the focused element. |
405
+ | `contextmenu` | **yes** | `x`, `y` | Secondary click, Menu key or Shift+F10. |
406
+ | `wheel` | no | `dx`, `dy` | Wheel or touchpad scroll over an element that is not a scroll container. |
407
+ | `keydown` | **yes** | `key`, `ctrl`, `alt`, `shift`, `meta`, `repeat` | Key pressed while the element has focus in Interactive mode. Keys reserved by the host (Tab traversal, OverCrow shortcuts, input method composition) are never delivered. |
408
+ | `input` | **yes** | `value` | Value edited (text, slider drag). Read-only copy; the host keeps the content. |
409
+ | `change` | **yes** | `value` | Value committed: blur or Enter for text, release for a slider, any change for toggle, checkbox and select. |
410
+ | `submit` | **yes** | `outcome`, `error` | Form submitted by Enter in a field, Ctrl+Enter in a `field` or `textarea`, or a `submit` button; a write intent may keep plain Enter for moving between its fields. With an intent, carries the outcome of the write. |
411
+ | `focus` | no | none | The element gained keyboard focus. |
412
+ | `blur` | no | none | The element lost keyboard focus. |
413
+ | `reachend` | no | none | Scrolled within one viewport of the end (load more, history). |
414
+ | `stick` | no | `stuck` | The user scrolled a container away from its end, or back to it (unread count, return to the latest). Content growing never sends it. |
415
+ | `dismiss` | no | none | The host closed a popover (Escape, outside click, anchor removed). |
416
+ <!-- /generated:events -->
417
+
418
+ An event marked as a user action allows a
419
+ [protected service call](services.md#calls-that-need-a-user-action) while
420
+ the logic handles it. The detail is what a handler receives; in a handler
421
+ written as a call, it is named `event`:
422
+
423
+ <!-- source: widgets/twitch-chat/view.ocml -->
424
+ ```xml
425
+ <list class="history" stick-to-end={state.following} item-height="20" label={heading(state)} on:stick={stuck(event.stuck)}>
426
+ ```
427
+
428
+ The named keys of `keydown` are:
429
+
430
+ <!-- generated:named-keys -->
431
+ `Enter`, `Escape`, `Backspace`, `Delete`, `ArrowUp`, `ArrowDown`, `ArrowLeft`, `ArrowRight`, `Home`, `End`, `PageUp`, `PageDown`.
432
+ <!-- /generated:named-keys -->
433
+
434
+ Any other `key` is one printable character.
435
+
436
+ ## Default sizes
437
+
438
+ The elements that OverCrow draws take these sizes, in logical pixels at
439
+ 100 %, unless the style sets `width` or `height`. Any other element is
440
+ sized by its content and by the style: a `canvas` has no size until the
441
+ style gives it one.
442
+
443
+ <!-- generated:default-sizes -->
444
+ | Element | When | Width | Height |
445
+ | --- | --- | --- | --- |
446
+ | `icon` | always | `font-size` | `font-size` |
447
+ | `image` | always | decoded image, else 0 | decoded image, else 0 |
448
+ | `avatar` | always | decoded image, else 28 | decoded image, else 28 |
449
+ | `toggle` | always | 32 | 18 |
450
+ | `checkbox` | always | 16 | 16 |
451
+ | `slider` | always | 120 | 18 |
452
+ | `progress` | always | 120 | 6 |
453
+ | `gauge` | `shape="arc"` | 48 | 32 |
454
+ | `gauge` | always | 48 | 48 |
455
+ | `chart` | always | 160 | 48 |
456
+ | `field` | always | 160 | max(`--control-height`, line height) |
457
+ | `textarea` | always | 160 | `rows` line heights |
458
+ | `separator` | `axis="vertical"` | 1 | 0 |
459
+ | `separator` | always | 0 | 1 |
460
+ | `select` | always | its text | its text |
461
+ | `elapsed` | always | its text | its text |
462
+ <!-- /generated:default-sizes -->
463
+
464
+ <!-- source: docs/content/examples/countdown/style.ocss -->
465
+ ```css
466
+ .dots {
467
+ height: 12px;
468
+ }
469
+ ```