@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.
- package/LICENSE +21 -0
- package/README.md +91 -1
- package/dist/audit/index.js +103 -0
- package/dist/audit/lexer.js +417 -0
- package/dist/audit/project.js +200 -0
- package/dist/audit/rules.js +661 -0
- package/dist/bootstrap/download.js +229 -0
- package/dist/bootstrap/install.js +280 -0
- package/dist/bootstrap/pin.js +85 -0
- package/dist/bootstrap/pin.json +119 -0
- package/dist/bootstrap/zip.js +258 -0
- package/dist/cli.js +200 -0
- package/dist/confine.js +244 -0
- package/dist/content/docs/en/cli.md +768 -0
- package/dist/content/docs/en/creator-space.md +78 -0
- package/dist/content/docs/en/dev-channel.md +130 -0
- package/dist/content/docs/en/elements.md +469 -0
- package/dist/content/docs/en/forms.md +328 -0
- package/dist/content/docs/en/guide.md +252 -0
- package/dist/content/docs/en/index.md +85 -0
- package/dist/content/docs/en/limits.md +241 -0
- package/dist/content/docs/en/logic.md +446 -0
- package/dist/content/docs/en/manifest.md +388 -0
- package/dist/content/docs/en/mcp.md +165 -0
- package/dist/content/docs/en/package.md +131 -0
- package/dist/content/docs/en/publish-a-widget.md +94 -0
- package/dist/content/docs/en/publish-keys.md +95 -0
- package/dist/content/docs/en/publishing.md +167 -0
- package/dist/content/docs/en/reference.md +55 -0
- package/dist/content/docs/en/result-shapes.md +332 -0
- package/dist/content/docs/en/sdk.md +295 -0
- package/dist/content/docs/en/security.md +115 -0
- package/dist/content/docs/en/service-reference.md +344 -0
- package/dist/content/docs/en/services.md +517 -0
- package/dist/content/docs/en/style-properties.md +270 -0
- package/dist/content/docs/en/style.md +266 -0
- package/dist/content/docs/en/testing.md +400 -0
- package/dist/content/docs/en/verified-domain.md +46 -0
- package/dist/content/docs/en/view.md +338 -0
- package/dist/content/docs/en/widget-listing.md +65 -0
- package/dist/content/docs/en/widget-review.md +57 -0
- package/dist/content/docs/en/widget-statistics.md +134 -0
- package/dist/content/docs/en/widgets.md +76 -0
- package/dist/content/docs/fr/cli.md +802 -0
- package/dist/content/docs/fr/creator-space.md +83 -0
- package/dist/content/docs/fr/dev-channel.md +140 -0
- package/dist/content/docs/fr/elements.md +475 -0
- package/dist/content/docs/fr/forms.md +341 -0
- package/dist/content/docs/fr/guide.md +263 -0
- package/dist/content/docs/fr/index.md +90 -0
- package/dist/content/docs/fr/limits.md +244 -0
- package/dist/content/docs/fr/logic.md +461 -0
- package/dist/content/docs/fr/manifest.md +401 -0
- package/dist/content/docs/fr/mcp.md +173 -0
- package/dist/content/docs/fr/package.md +139 -0
- package/dist/content/docs/fr/publish-a-widget.md +101 -0
- package/dist/content/docs/fr/publish-keys.md +97 -0
- package/dist/content/docs/fr/publishing.md +177 -0
- package/dist/content/docs/fr/reference.md +59 -0
- package/dist/content/docs/fr/result-shapes.md +333 -0
- package/dist/content/docs/fr/sdk.md +301 -0
- package/dist/content/docs/fr/security.md +129 -0
- package/dist/content/docs/fr/service-reference.md +346 -0
- package/dist/content/docs/fr/services.md +540 -0
- package/dist/content/docs/fr/style-properties.md +272 -0
- package/dist/content/docs/fr/style.md +281 -0
- package/dist/content/docs/fr/testing.md +417 -0
- package/dist/content/docs/fr/verified-domain.md +49 -0
- package/dist/content/docs/fr/view.md +352 -0
- package/dist/content/docs/fr/widget-listing.md +69 -0
- package/dist/content/docs/fr/widget-review.md +59 -0
- package/dist/content/docs/fr/widget-statistics.md +141 -0
- package/dist/content/docs/fr/widgets.md +81 -0
- package/dist/content/examples/clock/LICENSE +21 -0
- package/dist/content/examples/clock/README.md +75 -0
- package/dist/content/examples/clock/listing.json +19 -0
- package/dist/content/examples/clock/locales/en.json +4 -0
- package/dist/content/examples/clock/locales/fr.json +4 -0
- package/dist/content/examples/clock/logic.ts +85 -0
- package/dist/content/examples/clock/manifest.json +44 -0
- package/dist/content/examples/clock/package.json +16 -0
- package/dist/content/examples/clock/style.ocss +26 -0
- package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
- package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
- package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
- package/dist/content/examples/clock/tests/options.scenario.json +108 -0
- package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
- package/dist/content/examples/clock/tests/render.scenario.json +94 -0
- package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
- package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
- package/dist/content/examples/clock/tsconfig.json +16 -0
- package/dist/content/examples/clock/view.ocml +8 -0
- package/dist/content/examples/countdown/LICENSE +20 -0
- package/dist/content/examples/countdown/listing.json +10 -0
- package/dist/content/examples/countdown/locales/en.json +15 -0
- package/dist/content/examples/countdown/locales/fr.json +15 -0
- package/dist/content/examples/countdown/logic.ts +179 -0
- package/dist/content/examples/countdown/manifest.json +34 -0
- package/dist/content/examples/countdown/package.json +15 -0
- package/dist/content/examples/countdown/style.ocss +94 -0
- package/dist/content/examples/countdown/tsconfig.json +16 -0
- package/dist/content/examples/countdown/view.ocml +42 -0
- package/dist/content/examples/fps/LICENSE +21 -0
- package/dist/content/examples/fps/README.md +64 -0
- package/dist/content/examples/fps/listing.json +19 -0
- package/dist/content/examples/fps/locales/en.json +11 -0
- package/dist/content/examples/fps/locales/fr.json +11 -0
- package/dist/content/examples/fps/logic.ts +64 -0
- package/dist/content/examples/fps/manifest.json +30 -0
- package/dist/content/examples/fps/package.json +16 -0
- package/dist/content/examples/fps/style.ocss +31 -0
- package/dist/content/examples/fps/submission.json +8 -0
- package/dist/content/examples/fps/tests/label.scenario.json +63 -0
- package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
- package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
- package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
- package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
- package/dist/content/examples/fps/tests/render.scenario.json +96 -0
- package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
- package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
- package/dist/content/examples/fps/tsconfig.json +16 -0
- package/dist/content/examples/fps/view.ocml +11 -0
- package/dist/content/examples/media/LICENSE +21 -0
- package/dist/content/examples/media/README.md +147 -0
- package/dist/content/examples/media/listing.json +19 -0
- package/dist/content/examples/media/locales/en.json +11 -0
- package/dist/content/examples/media/locales/fr.json +11 -0
- package/dist/content/examples/media/logic.ts +191 -0
- package/dist/content/examples/media/manifest.json +35 -0
- package/dist/content/examples/media/package.json +16 -0
- package/dist/content/examples/media/style.ocss +148 -0
- package/dist/content/examples/media/submission.json +12 -0
- package/dist/content/examples/media/tests/covers.scenario.json +144 -0
- package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
- package/dist/content/examples/media/tests/load-logic.mjs +22 -0
- package/dist/content/examples/media/tests/logic.test.mjs +176 -0
- package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
- package/dist/content/examples/media/tests/preview.scenario.json +52 -0
- package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
- package/dist/content/examples/media/tests/refused.scenario.json +22 -0
- package/dist/content/examples/media/tests/refused.test.mjs +31 -0
- package/dist/content/examples/media/tests/render.scenario.json +136 -0
- package/dist/content/examples/media/tests/states.scenario.json +257 -0
- package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
- package/dist/content/examples/media/tsconfig.json +16 -0
- package/dist/content/examples/media/view.ocml +41 -0
- package/dist/content/examples/notes/LICENSE +21 -0
- package/dist/content/examples/notes/README.md +219 -0
- package/dist/content/examples/notes/listing.json +19 -0
- package/dist/content/examples/notes/locales/en.json +25 -0
- package/dist/content/examples/notes/locales/fr.json +25 -0
- package/dist/content/examples/notes/logic.ts +799 -0
- package/dist/content/examples/notes/manifest.json +40 -0
- package/dist/content/examples/notes/package.json +16 -0
- package/dist/content/examples/notes/style.ocss +469 -0
- package/dist/content/examples/notes/submission.json +12 -0
- package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
- package/dist/content/examples/notes/tests/create.scenario.json +260 -0
- package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
- package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
- package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
- package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
- package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
- package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
- package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
- package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
- package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
- package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
- package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
- package/dist/content/examples/notes/tests/save.scenario.json +378 -0
- package/dist/content/examples/notes/tests/states.scenario.json +640 -0
- package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
- package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
- package/dist/content/examples/notes/tsconfig.json +16 -0
- package/dist/content/examples/notes/view.ocml +154 -0
- package/dist/content/examples/performance/LICENSE +21 -0
- package/dist/content/examples/performance/README.md +134 -0
- package/dist/content/examples/performance/listing.json +19 -0
- package/dist/content/examples/performance/locales/en.json +20 -0
- package/dist/content/examples/performance/locales/fr.json +20 -0
- package/dist/content/examples/performance/logic.ts +210 -0
- package/dist/content/examples/performance/manifest.json +83 -0
- package/dist/content/examples/performance/package.json +16 -0
- package/dist/content/examples/performance/style.ocss +75 -0
- package/dist/content/examples/performance/submission.json +12 -0
- package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
- package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
- package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
- package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
- package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
- package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
- package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
- package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
- package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
- package/dist/content/examples/performance/tests/region.scenario.json +89 -0
- package/dist/content/examples/performance/tests/render.scenario.json +112 -0
- package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
- package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
- package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
- package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
- package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
- package/dist/content/examples/performance/tsconfig.json +16 -0
- package/dist/content/examples/performance/view.ocml +18 -0
- package/dist/content/examples/playervox-journal/LICENSE +21 -0
- package/dist/content/examples/playervox-journal/README.md +150 -0
- package/dist/content/examples/playervox-journal/listing.json +19 -0
- package/dist/content/examples/playervox-journal/locales/en.json +25 -0
- package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
- package/dist/content/examples/playervox-journal/logic.ts +556 -0
- package/dist/content/examples/playervox-journal/manifest.json +19 -0
- package/dist/content/examples/playervox-journal/package.json +16 -0
- package/dist/content/examples/playervox-journal/style.ocss +142 -0
- package/dist/content/examples/playervox-journal/submission.json +12 -0
- package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
- package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
- package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
- package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
- package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
- package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
- package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
- package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
- package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
- package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
- package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
- package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
- package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
- package/dist/content/examples/playervox-journal/view.ocml +52 -0
- package/dist/content/examples/playervox-rating/LICENSE +21 -0
- package/dist/content/examples/playervox-rating/README.md +166 -0
- package/dist/content/examples/playervox-rating/listing.json +19 -0
- package/dist/content/examples/playervox-rating/locales/en.json +35 -0
- package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
- package/dist/content/examples/playervox-rating/logic.ts +581 -0
- package/dist/content/examples/playervox-rating/manifest.json +19 -0
- package/dist/content/examples/playervox-rating/package.json +16 -0
- package/dist/content/examples/playervox-rating/style.ocss +333 -0
- package/dist/content/examples/playervox-rating/submission.json +12 -0
- package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
- package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
- package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
- package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
- package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
- package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
- package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
- package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
- package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
- package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
- package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
- package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
- package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
- package/dist/content/examples/playervox-rating/view.ocml +62 -0
- package/dist/content/examples/playervox-reviews/LICENSE +21 -0
- package/dist/content/examples/playervox-reviews/README.md +194 -0
- package/dist/content/examples/playervox-reviews/listing.json +19 -0
- package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
- package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
- package/dist/content/examples/playervox-reviews/logic.ts +822 -0
- package/dist/content/examples/playervox-reviews/manifest.json +30 -0
- package/dist/content/examples/playervox-reviews/package.json +16 -0
- package/dist/content/examples/playervox-reviews/style.ocss +260 -0
- package/dist/content/examples/playervox-reviews/submission.json +8 -0
- package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
- package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
- package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
- package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
- package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
- package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
- package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
- package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
- package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
- package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
- package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
- package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
- package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
- package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
- package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
- package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
- package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
- package/dist/content/examples/playervox-reviews/view.ocml +110 -0
- package/dist/content/examples/playervox-score/LICENSE +21 -0
- package/dist/content/examples/playervox-score/README.md +131 -0
- package/dist/content/examples/playervox-score/listing.json +19 -0
- package/dist/content/examples/playervox-score/locales/en.json +23 -0
- package/dist/content/examples/playervox-score/locales/fr.json +23 -0
- package/dist/content/examples/playervox-score/logic.ts +430 -0
- package/dist/content/examples/playervox-score/manifest.json +47 -0
- package/dist/content/examples/playervox-score/package.json +16 -0
- package/dist/content/examples/playervox-score/style.ocss +247 -0
- package/dist/content/examples/playervox-score/submission.json +8 -0
- package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
- package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
- package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
- package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
- package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
- package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
- package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
- package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
- package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
- package/dist/content/examples/playervox-score/tsconfig.json +16 -0
- package/dist/content/examples/playervox-score/view.ocml +51 -0
- package/dist/content/examples/session/LICENSE +21 -0
- package/dist/content/examples/session/README.md +57 -0
- package/dist/content/examples/session/listing.json +19 -0
- package/dist/content/examples/session/locales/en.json +3 -0
- package/dist/content/examples/session/locales/fr.json +3 -0
- package/dist/content/examples/session/logic.ts +26 -0
- package/dist/content/examples/session/manifest.json +19 -0
- package/dist/content/examples/session/package.json +16 -0
- package/dist/content/examples/session/style.ocss +16 -0
- package/dist/content/examples/session/submission.json +8 -0
- package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
- package/dist/content/examples/session/tests/load-logic.mjs +22 -0
- package/dist/content/examples/session/tests/logic.test.mjs +37 -0
- package/dist/content/examples/session/tests/preview.scenario.json +28 -0
- package/dist/content/examples/session/tests/refused.scenario.json +20 -0
- package/dist/content/examples/session/tests/refused.test.mjs +16 -0
- package/dist/content/examples/session/tests/render.scenario.json +95 -0
- package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
- package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
- package/dist/content/examples/session/tsconfig.json +16 -0
- package/dist/content/examples/session/view.ocml +11 -0
- package/dist/content/examples/stopwatch/LICENSE +21 -0
- package/dist/content/examples/stopwatch/README.md +99 -0
- package/dist/content/examples/stopwatch/listing.json +19 -0
- package/dist/content/examples/stopwatch/locales/en.json +8 -0
- package/dist/content/examples/stopwatch/locales/fr.json +8 -0
- package/dist/content/examples/stopwatch/logic.ts +93 -0
- package/dist/content/examples/stopwatch/manifest.json +19 -0
- package/dist/content/examples/stopwatch/package.json +16 -0
- package/dist/content/examples/stopwatch/style.ocss +54 -0
- package/dist/content/examples/stopwatch/submission.json +12 -0
- package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
- package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
- package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
- package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
- package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
- package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
- package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
- package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
- package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
- package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
- package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
- package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
- package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
- package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
- package/dist/content/examples/stopwatch/tsconfig.json +16 -0
- package/dist/content/examples/stopwatch/view.ocml +29 -0
- package/dist/content/examples/twitch-chat/LICENSE +21 -0
- package/dist/content/examples/twitch-chat/README.md +283 -0
- package/dist/content/examples/twitch-chat/listing.json +19 -0
- package/dist/content/examples/twitch-chat/locales/en.json +52 -0
- package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
- package/dist/content/examples/twitch-chat/logic.ts +887 -0
- package/dist/content/examples/twitch-chat/manifest.json +33 -0
- package/dist/content/examples/twitch-chat/package.json +16 -0
- package/dist/content/examples/twitch-chat/style.ocss +544 -0
- package/dist/content/examples/twitch-chat/submission.json +12 -0
- package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
- package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
- package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
- package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
- package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
- package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
- package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
- package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
- package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
- package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
- package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
- package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
- package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
- package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
- package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
- package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
- package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
- package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
- package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
- package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
- package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
- package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
- package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
- package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
- package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
- package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
- package/dist/content/examples/twitch-chat/view.ocml +141 -0
- package/dist/content/examples/warframe-market/LICENSE +21 -0
- package/dist/content/examples/warframe-market/README.md +176 -0
- package/dist/content/examples/warframe-market/listing.json +19 -0
- package/dist/content/examples/warframe-market/locales/en.json +44 -0
- package/dist/content/examples/warframe-market/locales/fr.json +44 -0
- package/dist/content/examples/warframe-market/logic.ts +1265 -0
- package/dist/content/examples/warframe-market/manifest.json +92 -0
- package/dist/content/examples/warframe-market/package.json +16 -0
- package/dist/content/examples/warframe-market/style.ocss +422 -0
- package/dist/content/examples/warframe-market/submission.json +24 -0
- package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
- package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
- package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
- package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
- package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
- package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
- package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
- package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
- package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
- package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
- package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
- package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
- package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
- package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
- package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
- package/dist/content/examples/warframe-market/tsconfig.json +16 -0
- package/dist/content/examples/warframe-market/view.ocml +116 -0
- package/dist/content/examples/weather/LICENSE +20 -0
- package/dist/content/examples/weather/listing.json +10 -0
- package/dist/content/examples/weather/locales/en.json +9 -0
- package/dist/content/examples/weather/locales/fr.json +9 -0
- package/dist/content/examples/weather/logic.ts +62 -0
- package/dist/content/examples/weather/manifest.json +51 -0
- package/dist/content/examples/weather/package.json +15 -0
- package/dist/content/examples/weather/style.ocss +29 -0
- package/dist/content/examples/weather/submission.json +17 -0
- package/dist/content/examples/weather/tsconfig.json +16 -0
- package/dist/content/examples/weather/view.ocml +12 -0
- package/dist/content/index.json +3705 -0
- package/dist/content/reference/errors.json +1924 -0
- package/dist/content/reference/limits.json +1154 -0
- package/dist/content/reference/manifest.md +223 -0
- package/dist/content/reference/permissions.json +413 -0
- package/dist/content/templates/blank/locales/en.json +3 -0
- package/dist/content/templates/blank/locales/fr.json +3 -0
- package/dist/content/templates/blank/logic.ts +7 -0
- package/dist/content/templates/blank/manifest.json +16 -0
- package/dist/content/templates/blank/style.ocss +10 -0
- package/dist/content/templates/blank/tests/example.scenario.json +10 -0
- package/dist/content/templates/blank/view.ocml +6 -0
- package/dist/content/templates/chart/locales/en.json +3 -0
- package/dist/content/templates/chart/locales/fr.json +3 -0
- package/dist/content/templates/chart/logic.ts +27 -0
- package/dist/content/templates/chart/manifest.json +16 -0
- package/dist/content/templates/chart/style.ocss +27 -0
- package/dist/content/templates/chart/tests/example.scenario.json +10 -0
- package/dist/content/templates/chart/view.ocml +10 -0
- package/dist/content/templates/counter/locales/en.json +4 -0
- package/dist/content/templates/counter/locales/fr.json +4 -0
- package/dist/content/templates/counter/logic.ts +20 -0
- package/dist/content/templates/counter/manifest.json +16 -0
- package/dist/content/templates/counter/style.ocss +26 -0
- package/dist/content/templates/counter/tests/example.scenario.json +11 -0
- package/dist/content/templates/counter/view.ocml +13 -0
- package/dist/content/templates/list/locales/en.json +8 -0
- package/dist/content/templates/list/locales/fr.json +8 -0
- package/dist/content/templates/list/logic.ts +35 -0
- package/dist/content/templates/list/manifest.json +16 -0
- package/dist/content/templates/list/style.ocss +42 -0
- package/dist/content/templates/list/tests/example.scenario.json +10 -0
- package/dist/content/templates/list/view.ocml +17 -0
- package/dist/content/templates/shared/LICENSE +20 -0
- package/dist/content/templates/shared/package.json +14 -0
- package/dist/content/templates/shared/tsconfig.json +16 -0
- package/dist/content.js +68 -0
- package/dist/env.js +156 -0
- package/dist/fingerprint.js +32 -0
- package/dist/hidden.js +47 -0
- package/dist/ids.js +27 -0
- package/dist/index.js +82 -0
- package/dist/knowledge.js +222 -0
- package/dist/npm.js +149 -0
- package/dist/prompts.js +47 -0
- package/dist/resources.js +82 -0
- package/dist/run.js +120 -0
- package/dist/server.js +43 -0
- package/dist/session.js +205 -0
- package/dist/sources.js +218 -0
- package/dist/text.js +80 -0
- package/dist/texts.js +44 -0
- package/dist/tools/audit.js +105 -0
- package/dist/tools/build.js +453 -0
- package/dist/tools/common.js +122 -0
- package/dist/tools/docs.js +196 -0
- package/dist/tools/preview.js +87 -0
- package/dist/tools/project.js +183 -0
- package/dist/tools/setup.js +146 -0
- package/dist/tools/submission.js +369 -0
- package/dist/version.js +3 -0
- package/npm-shrinkwrap.json +402 -0
- package/package.json +50 -4
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# The view
|
|
2
|
+
|
|
3
|
+
`view.ocml` describes what a PlayerVox OverCrow widget shows: a tree of
|
|
4
|
+
elements, bound to the widget's state with `{…}` expressions. It looks like
|
|
5
|
+
HTML or JSX, but it is neither: the set of elements is closed, there is no
|
|
6
|
+
DOM and no script in the view. OverCrow lays out and paints the tree
|
|
7
|
+
itself.
|
|
8
|
+
|
|
9
|
+
<!-- source: templates/list/view.ocml -->
|
|
10
|
+
```xml
|
|
11
|
+
<box class="checklist">
|
|
12
|
+
<text class="title">{t("title")}</text>
|
|
13
|
+
<list class="items" item-height="32">
|
|
14
|
+
<for each={state.items} as="item" key={item.id}>
|
|
15
|
+
<box class="row">
|
|
16
|
+
<checkbox label={item.text} checked={item.done} on:change={setDone(item.id, event.value)}/>
|
|
17
|
+
<text class={item.done ? "text done" : "text"}>{item.text}</text>
|
|
18
|
+
<button class="remove" label={t("remove")} on:activate={remove(item.id)}>
|
|
19
|
+
<icon name="x"/>
|
|
20
|
+
</button>
|
|
21
|
+
</box>
|
|
22
|
+
</for>
|
|
23
|
+
</list>
|
|
24
|
+
<text class="summary">{t("remaining", { count: remaining(state.items) })}</text>
|
|
25
|
+
</box>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
This is the checklist template: a title, a scrolling `list` that repeats a
|
|
29
|
+
row per item, and a summary. The logic exports `setDone`, `remove` and
|
|
30
|
+
`remaining`; `t` reads the messages of `locales/`.
|
|
31
|
+
|
|
32
|
+
The view is compiled when the widget is packaged: `overcrow-widget check`
|
|
33
|
+
reports every mistake with its line and column, and an unknown element,
|
|
34
|
+
attribute or event is an error, never ignored. The source file itself is
|
|
35
|
+
not shipped.
|
|
36
|
+
|
|
37
|
+
## Markup
|
|
38
|
+
|
|
39
|
+
- The file is UTF-8, without a byte-order mark.
|
|
40
|
+
- The document is a list of top-level nodes: `<component>` declarations and
|
|
41
|
+
the children of the widget's root, which is a `box`.
|
|
42
|
+
- Elements are lowercase: `<name …>…</name>` or `<name …/>`.
|
|
43
|
+
- An attribute value is quoted text (`"…"` or `'…'`), an expression
|
|
44
|
+
(`{…}`), or nothing, which means `true`: `<button submit>`. Attributes
|
|
45
|
+
are separated by whitespace and never repeated.
|
|
46
|
+
- Comments are `<!-- … -->`, without `--` inside.
|
|
47
|
+
- DOCTYPE, processing instructions, CDATA sections and namespaces are
|
|
48
|
+
refused.
|
|
49
|
+
|
|
50
|
+
The entities are `&` `<` `>` `"` `'` `{`
|
|
51
|
+
`}` ` `, and `&#…;` or `&#x…;` for any character that is not a
|
|
52
|
+
control character. A literal `{` or `}` in a quoted value, and a lone `}`
|
|
53
|
+
in text, are refused: write `{` and `}`.
|
|
54
|
+
|
|
55
|
+
## Elements
|
|
56
|
+
|
|
57
|
+
Each element has a fixed content, a set of attributes and the events it can
|
|
58
|
+
send. Containers (`box`, `scroll`, `list`, `form`, `popover`, `button`)
|
|
59
|
+
hold other elements; `text` holds text and inline children; the others are
|
|
60
|
+
leaves that OverCrow draws: `icon`, `image`, `toggle`, `slider`, `field`,
|
|
61
|
+
`chart`, `gauge`…
|
|
62
|
+
|
|
63
|
+
<!-- generated:element-list -->
|
|
64
|
+
| Element | Meaning |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| [`box`](elements.md#box) | Generic container; flex or grid layout comes from style. The root of the view is a `box`. |
|
|
67
|
+
| [`scroll`](elements.md#scroll) | Clipping container scrolled by the host with wheel, drag and keyboard. |
|
|
68
|
+
| [`list`](elements.md#list) | Vertical scrolling list whose children are laid out and painted only when visible. |
|
|
69
|
+
| [`text`](elements.md#text) | Block of wrapped text; its inline children flow with it (chat line with emotes). |
|
|
70
|
+
| [`span`](elements.md#span) | Styled run of text inside `text`. |
|
|
71
|
+
| [`icon`](elements.md#icon) | Lucide icon tinted with `color`, sized by `font-size` unless `width` and `height` are set. |
|
|
72
|
+
| [`image`](elements.md#image) | Raster image from the package, or an image handed by a service (an `asset:` handle); `object-fit` applies. |
|
|
73
|
+
| [`avatar`](elements.md#avatar) | Round image with a text fallback while the image is missing or failed. |
|
|
74
|
+
| [`badge`](elements.md#badge) | Short pill of text. |
|
|
75
|
+
| [`button`](elements.md#button) | Activatable control; its children (icon, text) form its content. |
|
|
76
|
+
| [`toggle`](elements.md#toggle) | On/off switch. |
|
|
77
|
+
| [`checkbox`](elements.md#checkbox) | Check control (checklists). |
|
|
78
|
+
| [`slider`](elements.md#slider) | Numeric range control; dragging is handled by the host. |
|
|
79
|
+
| [`select`](elements.md#select) | Drop-down choice; the open list is drawn by the host. |
|
|
80
|
+
| [`option`](elements.md#option) | Choice of a `select`; its text is the visible label. |
|
|
81
|
+
| [`field`](elements.md#field) | Single-line text input edited by the host, input methods (IME) included. |
|
|
82
|
+
| [`textarea`](elements.md#textarea) | Multi-line text input edited by the host, input methods (IME) included. |
|
|
83
|
+
| [`form`](elements.md#form) | Groups named controls. With `intent`, submitting sends their values to a write service directly from the host; the widget's logic never supplies that content. |
|
|
84
|
+
| [`elapsed`](elements.md#elapsed) | Duration text advanced by the host from an anchor given by a service, so a running stopwatch needs no work from the logic. Styled like `text`; repainted only when the shown text changes, at most at 60 Hz, and never while hidden. |
|
|
85
|
+
| [`progress`](elements.md#progress) | Horizontal progress bar. |
|
|
86
|
+
| [`gauge`](elements.md#gauge) | Ring or arc gauge. |
|
|
87
|
+
| [`chart`](elements.md#chart) | Line, area, bar or sparkline chart drawn by the host. |
|
|
88
|
+
| [`series`](elements.md#series) | One data series of a `chart`, coloured with `color`. |
|
|
89
|
+
| [`separator`](elements.md#separator) | Thin rule between groups. |
|
|
90
|
+
| [`canvas`](elements.md#canvas) | Surface painted by the host from the latest list of commands given to `draw`. |
|
|
91
|
+
| [`popover`](elements.md#popover) | Floating panel anchored to an element, drawn above the content and clipped to the widget's frame (drop-downs, context menus). |
|
|
92
|
+
<!-- /generated:element-list -->
|
|
93
|
+
|
|
94
|
+
[Elements and attributes](elements.md) gives the attributes and events of
|
|
95
|
+
each one.
|
|
96
|
+
|
|
97
|
+
## Text
|
|
98
|
+
|
|
99
|
+
Text is allowed only in `text`, `span`, `badge` and `option`. A `text` holds
|
|
100
|
+
either text or inline children (`span`, `icon`, `image`), not both: to
|
|
101
|
+
style one word, put every run in a `span`.
|
|
102
|
+
|
|
103
|
+
<!-- source: widgets/performance/view.ocml -->
|
|
104
|
+
```xml
|
|
105
|
+
<text class={row.valueClass} label={row.name} tooltip={row.hint}><span>{row.value}</span><if test={row.unit != ""}><span class="unit">{row.unit}</span></if></text>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Whitespace follows the rule of JSX:
|
|
109
|
+
|
|
110
|
+
- tabs become spaces;
|
|
111
|
+
- a line break between two words becomes one space;
|
|
112
|
+
- a line break next to a tag or an expression disappears with its
|
|
113
|
+
indentation;
|
|
114
|
+
- a run of whitespace next to a tag is dropped; one between two expressions
|
|
115
|
+
on the same line is kept.
|
|
116
|
+
|
|
117
|
+
So a break before an expression removes the space before it: write
|
|
118
|
+
`you have {state.count} messages` on one line to keep both spaces, or
|
|
119
|
+
write ` ` where you need a space that the rule would remove.
|
|
120
|
+
|
|
121
|
+
## Attributes
|
|
122
|
+
|
|
123
|
+
A quoted value is converted to the attribute's type and checked when the
|
|
124
|
+
view is compiled:
|
|
125
|
+
|
|
126
|
+
| Type | Quoted value |
|
|
127
|
+
| --- | --- |
|
|
128
|
+
| boolean | `true` or `false`; the bare attribute means `true` |
|
|
129
|
+
| integer | a decimal integer, without a leading zero |
|
|
130
|
+
| number | a decimal number, without an exponent |
|
|
131
|
+
| number list | numbers separated by spaces: `values="12 18.5 30"` |
|
|
132
|
+
| text, identifier | the text itself |
|
|
133
|
+
| image | a file of the package: `src="assets/logo.png"` |
|
|
134
|
+
|
|
135
|
+
`attr={expression}` binds the attribute to an expression instead; OverCrow
|
|
136
|
+
checks every value the widget sends. Values that exist only when the widget
|
|
137
|
+
runs, such as an image handed by a service, must be bound.
|
|
138
|
+
|
|
139
|
+
Five attributes exist on every element:
|
|
140
|
+
|
|
141
|
+
<!-- generated:common-attributes -->
|
|
142
|
+
| Attribute | Type | Required | Meaning |
|
|
143
|
+
| --- | --- | --- | --- |
|
|
144
|
+
| `class` | class list | no | Style classes: distinct names separated by one space. |
|
|
145
|
+
| `ref` | static `ref` name | no | Name by which `draw` designates this `canvas` and by which an attribute such as the `anchor` of a `popover` designates this element. Static, unique in the view, and not allowed inside a `for` or a component body, where it would name several elements. |
|
|
146
|
+
| `label` | text ≤ 256 bytes | no | Accessible name; required on icon-only controls. |
|
|
147
|
+
| `tooltip` | text ≤ 256 bytes | no | Plain text drawn by the host on hover or focus. |
|
|
148
|
+
| `on` | sorted event names | no | Events forwarded to the logic; written `on:<event>` in the view. |
|
|
149
|
+
<!-- /generated:common-attributes -->
|
|
150
|
+
|
|
151
|
+
`class` is the hook of the [style](style.md). `label` is the accessible
|
|
152
|
+
name of the element: give one to every control whose content is an icon.
|
|
153
|
+
|
|
154
|
+
### Names for nodes: `ref`
|
|
155
|
+
|
|
156
|
+
`ref="name"` gives a node a name. Two things use it: `draw(name, commands)`
|
|
157
|
+
paints the `canvas` of that name, and a `popover` is placed against the
|
|
158
|
+
node its `anchor` names.
|
|
159
|
+
|
|
160
|
+
<!-- source: docs/content/examples/countdown/view.ocml -->
|
|
161
|
+
```xml
|
|
162
|
+
<box ref="panel" class="countdown" on:contextmenu={openMenu}>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
<!-- source: docs/content/examples/countdown/view.ocml -->
|
|
166
|
+
```xml
|
|
167
|
+
<popover anchor="panel" placement="pointer" open={state.menu} on:dismiss={closeMenu}>
|
|
168
|
+
<button class="menu-row" on:activate={resetRounds}>
|
|
169
|
+
<text class="menu-text">{t("reset-rounds")}</text>
|
|
170
|
+
</button>
|
|
171
|
+
</popover>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
A `ref` is always quoted, unique in the view, and refused inside a `for` or
|
|
175
|
+
a component, where it would name several nodes.
|
|
176
|
+
|
|
177
|
+
## Events
|
|
178
|
+
|
|
179
|
+
`on:event={handler}` asks OverCrow to send an event of the element to the
|
|
180
|
+
logic. Without it, the widget does not hear about the event at all: a
|
|
181
|
+
widget is not told about pointer moves or key presses it has not asked for.
|
|
182
|
+
|
|
183
|
+
A handler is written in one of two ways:
|
|
184
|
+
|
|
185
|
+
- **the name of a function** exported by the logic, called with the event's
|
|
186
|
+
detail: `on:activate={increment}`;
|
|
187
|
+
- **a call**, with the arguments you choose; in it, `event` is the event's
|
|
188
|
+
detail: `on:change={setDone(item.id, event.value)}`.
|
|
189
|
+
|
|
190
|
+
<!-- source: templates/list/view.ocml -->
|
|
191
|
+
```xml
|
|
192
|
+
<checkbox label={item.text} checked={item.done} on:change={setDone(item.id, event.value)}/>
|
|
193
|
+
<text class={item.done ? "text done" : "text"}>{item.text}</text>
|
|
194
|
+
<button class="remove" label={t("remove")} on:activate={remove(item.id)}>
|
|
195
|
+
<icon name="x"/>
|
|
196
|
+
</button>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
The events are `activate`, `contextmenu`, `wheel`, `keydown`, `input`,
|
|
200
|
+
`change`, `submit`, `focus`, `blur`, `reachend`, `stick` and `dismiss`;
|
|
201
|
+
[events](elements.md#events) describes each one and the detail it carries,
|
|
202
|
+
and each [element](elements.md#elements) lists the ones it sends. Some of
|
|
203
|
+
them are user actions, during which a widget may call a protected service;
|
|
204
|
+
see [calls that need a user action](services.md#calls-that-need-a-user-action).
|
|
205
|
+
Widgets receive input only in OverCrow's Interactive mode: in Passive mode,
|
|
206
|
+
clicks go through them to the game.
|
|
207
|
+
|
|
208
|
+
## Conditions, loops and components
|
|
209
|
+
|
|
210
|
+
<!-- generated:constructs -->
|
|
211
|
+
| Syntax | Meaning |
|
|
212
|
+
| --- | --- |
|
|
213
|
+
| `{expr}` | Interpolates an expression into text or an attribute value. |
|
|
214
|
+
| `<if test={expr}> … <else-if test={expr}> … <else>` | Conditional subtree. |
|
|
215
|
+
| `<for each={expr} as="item" key={expr}>` | Repeats a subtree; `key` is mandatory and must be unique among siblings. |
|
|
216
|
+
| `<component name="x" props="a b"> … <slot/> … </component>` | Local component with declared properties and one slot, used as `<x a={…}>`. |
|
|
217
|
+
| `on:<event>={handler}` | Subscribes the element to one of its events and names the handler of the logic. |
|
|
218
|
+
<!-- /generated:constructs -->
|
|
219
|
+
|
|
220
|
+
### `if`, `else-if`, `else`
|
|
221
|
+
|
|
222
|
+
<!-- source: widgets/stopwatch/view.ocml -->
|
|
223
|
+
```xml
|
|
224
|
+
<if test={state.stopwatch.running}>
|
|
225
|
+
<icon name="pause"/>
|
|
226
|
+
</if>
|
|
227
|
+
<else>
|
|
228
|
+
<icon name="play"/>
|
|
229
|
+
</else>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
`else-if` and `else` follow an `if` directly; only whitespace and comments
|
|
233
|
+
may separate them.
|
|
234
|
+
|
|
235
|
+
### `for`
|
|
236
|
+
|
|
237
|
+
`for` repeats its children for each item of a list. `each`, `as` and `key`
|
|
238
|
+
are all required, and the key must be unique among the repeated items: it
|
|
239
|
+
is how OverCrow knows which row moved, appeared or went away.
|
|
240
|
+
|
|
241
|
+
<!-- source: widgets/warframe-market/view.ocml -->
|
|
242
|
+
```xml
|
|
243
|
+
<for each={state.results} as="item" key={item.slug}>
|
|
244
|
+
<button class="result" label={item.name} on:activate={select(item.slug)}>
|
|
245
|
+
<text class="result-name">{item.name}</text>
|
|
246
|
+
<icon class="result-arrow" name="chevron-right"/>
|
|
247
|
+
</button>
|
|
248
|
+
</for>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
For a long list, put the `for` in a `list` element: OverCrow lays out and
|
|
252
|
+
paints only the rows that are visible.
|
|
253
|
+
|
|
254
|
+
### Components
|
|
255
|
+
|
|
256
|
+
A component is a piece of view with a name and declared properties, to
|
|
257
|
+
write once and use several times. It is local to the view.
|
|
258
|
+
|
|
259
|
+
<!-- source: docs/content/examples/countdown/view.ocml -->
|
|
260
|
+
```xml
|
|
261
|
+
<component name="stat" props="name value">
|
|
262
|
+
<box class="stat">
|
|
263
|
+
<text class="stat-name">{name}</text>
|
|
264
|
+
<text class="stat-value">{value}</text>
|
|
265
|
+
</box>
|
|
266
|
+
</component>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
<!-- source: docs/content/examples/countdown/view.ocml -->
|
|
270
|
+
```xml
|
|
271
|
+
<stat name={t("state")} value={stateText(state.running, state.remainingMs)}/>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
- Components are declared at the top level, once each, with a name that is
|
|
275
|
+
not an element's.
|
|
276
|
+
- The body sees only its own properties, not the names around the place
|
|
277
|
+
where it is used. Pass what it needs.
|
|
278
|
+
- A use passes declared properties only. A quoted property is text; bind
|
|
279
|
+
it (`value={5}`) for any other type.
|
|
280
|
+
- A body may contain one `<slot/>`, where the children of each use go.
|
|
281
|
+
- A component cannot contain itself, and a use cannot take `on:` handlers:
|
|
282
|
+
put them on elements inside the body.
|
|
283
|
+
|
|
284
|
+
`if`, `for` and components are transparent for the content rules: their
|
|
285
|
+
children must suit the element around them.
|
|
286
|
+
|
|
287
|
+
## Expressions
|
|
288
|
+
|
|
289
|
+
Expressions are a small, strict subset of JavaScript:
|
|
290
|
+
|
|
291
|
+
- literals: numbers (`0`, `12`, `1.5`), strings, `true`, `false`, `null`,
|
|
292
|
+
array and object literals;
|
|
293
|
+
- names in scope and their members: `a.b`, `a?.b`, `a[i]`, `a?.[i]`;
|
|
294
|
+
- operators: `!`, unary `-` and `+`, `* / %`, `+ -`, `< <= > >=`,
|
|
295
|
+
`== != === !==`, `&&`, `||`, `??`, and `a ? b : c`. `??` cannot be mixed
|
|
296
|
+
with `&&` or `||` without parentheses;
|
|
297
|
+
- calls of functions exported by the logic, by their bare name:
|
|
298
|
+
`remaining(state.items)`. `t(key, params)` is one of them.
|
|
299
|
+
|
|
300
|
+
The names in scope are `state`, the `as` names of the enclosing `for`s, the
|
|
301
|
+
properties of the enclosing component, and `event` in a handler. A name
|
|
302
|
+
cannot hide another one.
|
|
303
|
+
|
|
304
|
+
There is no assignment, no arrow or function literal, no `new`, `this`,
|
|
305
|
+
template literal, regular expression, method call or global: anything more
|
|
306
|
+
than a simple computation belongs in a function of the logic. This is what
|
|
307
|
+
keeps the view checkable: when a widget is packaged, every expression is
|
|
308
|
+
compiled into a function of `logic.js`, and the view itself carries no
|
|
309
|
+
code.
|
|
310
|
+
|
|
311
|
+
<!-- source: templates/list/view.ocml -->
|
|
312
|
+
```xml
|
|
313
|
+
<text class={item.done ? "text done" : "text"}>{item.text}</text>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
JavaScript reserved words, `constructor`, `prototype`, `eval`, `undefined`,
|
|
317
|
+
`globalThis`, `overcrow` and any name starting with `__` are refused.
|
|
318
|
+
|
|
319
|
+
## When the view is wrong
|
|
320
|
+
|
|
321
|
+
Every problem is a diagnostic of `overcrow-widget check`, with a stable
|
|
322
|
+
code:
|
|
323
|
+
|
|
324
|
+
| Code | Problem |
|
|
325
|
+
| --- | --- |
|
|
326
|
+
| `view.syntax`, `view.encoding`, `view.size`, `view.invalid_entity` | The file is not well-formed markup. |
|
|
327
|
+
| `view.unknown_element`, `view.invalid_parent` | An element that does not exist, or in a place it cannot be. |
|
|
328
|
+
| `view.unknown_attribute`, `view.duplicate_attribute`, `view.invalid_attribute`, `view.missing_attribute` | An attribute that the element does not have, written twice, with a wrong value, or required and absent. |
|
|
329
|
+
| `view.unknown_event`, `view.invalid_handler` | An event the element does not send (or put on a component use), or a handler that is neither a name nor a call. |
|
|
330
|
+
| `view.expression_syntax`, `view.expression_too_long`, `view.expression_too_deep`, `view.expression_too_many_entries` | An expression outside the subset or its bounds. |
|
|
331
|
+
| `view.reserved_name`, `view.unknown_name` | A refused name, or one that is not in scope. |
|
|
332
|
+
| `view.invalid_text` | Text where the element takes none, or mixed with inline children. |
|
|
333
|
+
| `view.invalid_component`, `view.recursive_component`, `view.invalid_slot`, `view.invalid_construct` | A component, slot, `if` or `for` that breaks its rules. |
|
|
334
|
+
| `view.invalid_ref`, `view.unknown_ref` | A `ref` that is not unique or is inside a `for`, or an `anchor` that names none. |
|
|
335
|
+
| `view.missing_asset` | A static image that is not in `assets/`. |
|
|
336
|
+
| `view.bound_value` | A `value` on a control of a form bound to a write intent; see [forms](forms.md#forms-that-write-user-data). |
|
|
337
|
+
| `view.too_many_elements`, `view.too_many_components`, `view.too_many_children`, `view.too_many_expressions`, `view.too_deep` | A [limit](limits.md) of the view is exceeded. |
|
|
338
|
+
| `logic.missing_export` | The view calls a function that the logic does not export. |
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# The listing: best practices
|
|
2
|
+
|
|
3
|
+
The listing is what players read in the PlayerVox OverCrow catalog before
|
|
4
|
+
they install a widget: its description, its preview, its category, its
|
|
5
|
+
games, its license and its links. You write it in the creator space, in the
|
|
6
|
+
widget's **Listing** tab.
|
|
7
|
+
|
|
8
|
+
## Saved as you type
|
|
9
|
+
|
|
10
|
+
The listing is a draft, saved by itself as you type.
|
|
11
|
+
|
|
12
|
+
- A widget's first listing goes to review with its first version.
|
|
13
|
+
- Later changes go alone to a quick review: **Submit the listing**. They
|
|
14
|
+
need no new version of the widget. **Cancel the changes** brings the
|
|
15
|
+
draft back to the published listing.
|
|
16
|
+
- The category is the exception: you change it at any time, without a
|
|
17
|
+
review, and the change reaches players with the next publication of the
|
|
18
|
+
catalog.
|
|
19
|
+
|
|
20
|
+
## Languages
|
|
21
|
+
|
|
22
|
+
English comes first: it is the default, shown when a player's language has
|
|
23
|
+
no description. **Add a language** adds another one, 16 languages at most.
|
|
24
|
+
The widget's name comes from its manifest (`name.en`, `name.fr`): to change
|
|
25
|
+
it, change the manifest and submit a version. The languages of the widget's
|
|
26
|
+
own interface come from its `locales/` files.
|
|
27
|
+
|
|
28
|
+
## Description
|
|
29
|
+
|
|
30
|
+
- 500 characters at most per language. The first two lines show on the
|
|
31
|
+
catalog card: say what the widget does, plainly.
|
|
32
|
+
- Say when the widget contacts a server, and which one.
|
|
33
|
+
- No advertising and no claim the widget does not keep.
|
|
34
|
+
|
|
35
|
+
## Preview image
|
|
36
|
+
|
|
37
|
+
One image, in English, for every language: a PNG in 4:3, from 480 × 360 to
|
|
38
|
+
1,024 × 768 (1,024 × 768 recommended), 256 KiB at most. Show the widget in
|
|
39
|
+
use, without marketing text.
|
|
40
|
+
|
|
41
|
+
## Category and games
|
|
42
|
+
|
|
43
|
+
The category places the widget in the catalog. Add up to five games it is
|
|
44
|
+
made for: players filter the catalog by game.
|
|
45
|
+
|
|
46
|
+
## License and links
|
|
47
|
+
|
|
48
|
+
- **License**: "Proprietary, all rights reserved", or an SPDX license such
|
|
49
|
+
as `MIT` or `Apache-2.0`.
|
|
50
|
+
- **Support**: an e-mail address or a web page where players get help.
|
|
51
|
+
Required.
|
|
52
|
+
- **Privacy policy**: required as soon as the widget uses the network.
|
|
53
|
+
- **Public source code**: optional; a public repository adds the "Public
|
|
54
|
+
source code" badge.
|
|
55
|
+
|
|
56
|
+
Type an address as you know it (`example.com/privacy`): `https://` is added
|
|
57
|
+
for you, and a `/` after a bare domain (`example.com` is saved as
|
|
58
|
+
`https://example.com/`). An address in `http://` is refused.
|
|
59
|
+
|
|
60
|
+
## From listing.json
|
|
61
|
+
|
|
62
|
+
A version's sources may carry a `listing.json`, as the command-line tool
|
|
63
|
+
reads it (see [`admit`](cli.md#admit)). In the
|
|
64
|
+
**Listing** tab, **Import listing.json** applies its descriptions, license
|
|
65
|
+
and source code address to the draft.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Review: types, delays, appeals
|
|
2
|
+
|
|
3
|
+
Every version of a PlayerVox OverCrow widget, and every change of its
|
|
4
|
+
listing, is read by a person at PlayerVox before players get it. This page
|
|
5
|
+
covers the two kinds of review, their delays, the review thread and the
|
|
6
|
+
appeal. To send a version, see [publish a widget](publish-a-widget.md).
|
|
7
|
+
|
|
8
|
+
## Quick or full
|
|
9
|
+
|
|
10
|
+
| Review | When | Longest delay |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| Full | The first publication, or an update that adds a permission, a network route or a capability | 5 business days |
|
|
13
|
+
| Quick | Any other update, or a change of the listing alone | 2 business days |
|
|
14
|
+
| Appeal | Once per decision, within six months | 7 days |
|
|
15
|
+
| Publication | After the approval | 24 business hours |
|
|
16
|
+
|
|
17
|
+
Business days run Monday to Friday, except French public holidays. The delay
|
|
18
|
+
is paused while the review waits for your reply or a corrected version.
|
|
19
|
+
A quick review reads the lines that changed since the last approved
|
|
20
|
+
version; a full review reads the whole widget.
|
|
21
|
+
|
|
22
|
+
## The review thread
|
|
23
|
+
|
|
24
|
+
Each version in review has a thread in the creator space:
|
|
25
|
+
|
|
26
|
+
- A **remark** points to a file and a line, quotes the code the reviewer
|
|
27
|
+
read and cites a numbered rule of the publication rules.
|
|
28
|
+
- You can **reply** to the reviewer. Your reply sends the review back to
|
|
29
|
+
the reviewer when it was waiting for you.
|
|
30
|
+
- A **corrected version** continues the same thread: send it from
|
|
31
|
+
**Submit a version**, with a newer version number.
|
|
32
|
+
- The **decision** is approval, changes requested or a refusal, always
|
|
33
|
+
with its reasons.
|
|
34
|
+
|
|
35
|
+
Reviewers are shown as "PlayerVox reviewer", never by name. Every time a
|
|
36
|
+
reviewer opens your sources, the creator space shows when, which version
|
|
37
|
+
and why, under **Access to your sources**.
|
|
38
|
+
|
|
39
|
+
## Appeal
|
|
40
|
+
|
|
41
|
+
You can contest a refusal or a suspension once per decision, within six
|
|
42
|
+
months, with **Contest the decision**. PlayerVox re-examines the decision
|
|
43
|
+
entirely and answers within 7 days, with its reasons. You can always send a
|
|
44
|
+
new version instead.
|
|
45
|
+
|
|
46
|
+
## Suspension
|
|
47
|
+
|
|
48
|
+
When players are at risk (malicious code, a leaked key, a data leak),
|
|
49
|
+
PlayerVox can suspend a widget or a version at once: installed copies are
|
|
50
|
+
turned off. The creator space gives the reason and the rule, and the
|
|
51
|
+
appeal stays open.
|
|
52
|
+
|
|
53
|
+
## Withdrawal
|
|
54
|
+
|
|
55
|
+
You can withdraw a version or the whole widget at any time: it leaves the
|
|
56
|
+
catalog at the next publication, and installed copies keep working. A
|
|
57
|
+
version in review or approved but not published yet is withdrawn at once.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Statistics: definitions
|
|
2
|
+
|
|
3
|
+
The **Statistics** tab of a widget, in the creator space, shows how players
|
|
4
|
+
use it: installs, daily active players, errors and the players' rating.
|
|
5
|
+
PlayerVox OverCrow sends these figures anonymously. They are trends, not
|
|
6
|
+
exact counts: this page says what each figure counts and what it leaves out.
|
|
7
|
+
|
|
8
|
+
## Where the figures come from
|
|
9
|
+
|
|
10
|
+
Once a day at most, at a random time, OverCrow sends one anonymous signal
|
|
11
|
+
for each widget installed from the catalog: the widget, its version, the
|
|
12
|
+
day, the system (Windows or Linux), the version of OverCrow, whether the
|
|
13
|
+
widget was shown, installed or uninstalled that day, and its errors (kind,
|
|
14
|
+
place in the code, a rounded count).
|
|
15
|
+
|
|
16
|
+
- **No identifier**: nothing names the player or the computer, and nothing
|
|
17
|
+
links the widgets of one player, each widget being sent apart.
|
|
18
|
+
- **No error message**: only the kind of an error and its place in your
|
|
19
|
+
code. A message may hold personal data.
|
|
20
|
+
- **On by default**: players can turn **Share anonymous statistics** off in
|
|
21
|
+
OverCrow; nothing is sent after that, and they are no longer counted.
|
|
22
|
+
|
|
23
|
+
The figures are added up as the signals arrive. **Updated** gives the time
|
|
24
|
+
of the last one counted.
|
|
25
|
+
|
|
26
|
+
## The figures
|
|
27
|
+
|
|
28
|
+
| Figure | What it counts |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| Daily active players | The players who showed the widget at least once that day. The tile gives the mean per day over the period. |
|
|
31
|
+
| Active installs | Installs minus uninstalls, added up since the first signal, never below zero. |
|
|
32
|
+
| Installs · uninstalls | The installs and the uninstalls of the period, and their balance. An update is neither. |
|
|
33
|
+
| Errors | The sum of the errors reported over the period. |
|
|
34
|
+
|
|
35
|
+
Each tile compares its figure with the period just before, of the same
|
|
36
|
+
length: green when it moves the good way (fewer errors, more players), amber
|
|
37
|
+
the other way, grey when it moves by less than 1 %. **First period** means
|
|
38
|
+
there is nothing before to compare with.
|
|
39
|
+
|
|
40
|
+
## Periods and filters
|
|
41
|
+
|
|
42
|
+
- **Period**: 7 days, 28 days, 90 days or 12 months. Over 12 months, the
|
|
43
|
+
installs and uninstalls chart adds up each week.
|
|
44
|
+
- **Version**: one of your published versions. Active installs show "—"
|
|
45
|
+
with a version: an installation changes version at every update, so that
|
|
46
|
+
figure only makes sense for all versions. **Version adoption** compares
|
|
47
|
+
the versions and does not follow this filter.
|
|
48
|
+
- **System**: Windows or Linux. **Where your widget runs** compares the
|
|
49
|
+
systems and does not follow this filter.
|
|
50
|
+
- The rating follows no filter.
|
|
51
|
+
|
|
52
|
+
Every chart has **View as table**, with the same figures day by day.
|
|
53
|
+
|
|
54
|
+
## Version adoption and where your widget runs
|
|
55
|
+
|
|
56
|
+
- **Version adoption**: the share of the daily active players on each
|
|
57
|
+
version. The three newest versions keep their colour; the others add up as
|
|
58
|
+
**Older**.
|
|
59
|
+
- **Where your widget runs**: the share of active players on Windows and on
|
|
60
|
+
Linux, and on each version of OverCrow (the two most used, then
|
|
61
|
+
**Others**).
|
|
62
|
+
|
|
63
|
+
## Errors
|
|
64
|
+
|
|
65
|
+
The errors are grouped by kind and by place in your code: the same kind at
|
|
66
|
+
the same line of the same function is one group, whatever the version. The
|
|
67
|
+
table shows the 50 most frequent groups of the period, with their versions,
|
|
68
|
+
their count and their trend; **Export CSV** saves them.
|
|
69
|
+
|
|
70
|
+
OverCrow reports where an error happened in the package's `logic.js`. The
|
|
71
|
+
creator space traces that position back to your sources (file, line and
|
|
72
|
+
function) with a map of your code built with the package and never
|
|
73
|
+
published.
|
|
74
|
+
|
|
75
|
+
- **Being traced**: the position is shown as `logic.js:line:column` until it
|
|
76
|
+
is traced.
|
|
77
|
+
- **Not traced**: the version has no map, or the position is not in it; the
|
|
78
|
+
raw position stays.
|
|
79
|
+
- **No position in the code**: the widget stopped as a whole (budget
|
|
80
|
+
exceeded, no answer); see its kind.
|
|
81
|
+
- **SDK**: the error happened inside `@overcrow/sdk`, called from your code.
|
|
82
|
+
|
|
83
|
+
| Kind | Meaning |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| `Error` | Error thrown |
|
|
86
|
+
| `TypeError` | Value of an unexpected type |
|
|
87
|
+
| `RangeError` | Value out of range |
|
|
88
|
+
| `ReferenceError` | Unknown name |
|
|
89
|
+
| `SyntaxError` | Invalid syntax |
|
|
90
|
+
| `URIError` | Invalid address encoding |
|
|
91
|
+
| `EvalError` | Code evaluation refused |
|
|
92
|
+
| `AggregateError` | Several errors at once |
|
|
93
|
+
| `InternalError` | Engine limit reached |
|
|
94
|
+
| Thrown value | A value that is not an error was thrown |
|
|
95
|
+
| Memory or processing budget exceeded | The widget was restarted |
|
|
96
|
+
| Stopped responding | The widget was restarted |
|
|
97
|
+
| Failed to load | The code or the view could not load |
|
|
98
|
+
| Widget process stopped | Without reporting a fault |
|
|
99
|
+
| Network request refused | Address not declared in the manifest |
|
|
100
|
+
| Other error | Of a kind the creator space does not know yet |
|
|
101
|
+
|
|
102
|
+
The kind of an error is the built-in type it was created from, never the
|
|
103
|
+
`name` your code may give it.
|
|
104
|
+
|
|
105
|
+
## Player rating
|
|
106
|
+
|
|
107
|
+
Players rate a widget from 0 to 100 in the OverCrow Control Center, with
|
|
108
|
+
their PlayerVox account: one rating per account and per widget, which they
|
|
109
|
+
can change or remove.
|
|
110
|
+
|
|
111
|
+
- **Score**: the mean of the ratings, rounded, with its rank: S+ from 90,
|
|
112
|
+
S from 80, A from 70, B from 60, C from 40, D from 20, then F.
|
|
113
|
+
- **From 5 ratings**: below that, the creator space says **Not enough
|
|
114
|
+
ratings yet** and gives the number of ratings; the catalog shows nothing.
|
|
115
|
+
- **Spread by rank**: the number of ratings in each rank, shown only in
|
|
116
|
+
the creator space. Nobody sees who rated.
|
|
117
|
+
- **Since the latest version**: the points gained or lost since your latest
|
|
118
|
+
version was published, when 5 ratings existed before it.
|
|
119
|
+
- The members of your publisher cannot rate its widgets.
|
|
120
|
+
|
|
121
|
+
Players see the score, the rank and the number of ratings in the catalog
|
|
122
|
+
and on the website.
|
|
123
|
+
|
|
124
|
+
## Trends, not exact counts
|
|
125
|
+
|
|
126
|
+
- Only the players who share their anonymous statistics are counted.
|
|
127
|
+
- OverCrow rounds each error count to a step before sending it, and sends
|
|
128
|
+
at most 10 places in the code per widget and day: the error figures give
|
|
129
|
+
orders of magnitude.
|
|
130
|
+
- A day is the player's own date.
|
|
131
|
+
- A player who clears OverCrow's data, then installs the widget again,
|
|
132
|
+
counts as two installs.
|
|
133
|
+
- Signals that look broken or inflated are set aside before they are
|
|
134
|
+
counted.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Reference widgets
|
|
2
|
+
|
|
3
|
+
The built-in widgets of PlayerVox OverCrow are ordinary widgets written with
|
|
4
|
+
the public SDK, packaged by `overcrow-widget` and published in the signed
|
|
5
|
+
catalog like yours. Their sources live in
|
|
6
|
+
[`widgets/`](../../../widgets/) of the public repository, under the MIT
|
|
7
|
+
license: read them, copy them, and use them as a starting point.
|
|
8
|
+
|
|
9
|
+
<!-- generated:widgets -->
|
|
10
|
+
| Widget | Description | ID | Permissions | Source |
|
|
11
|
+
| --- | --- | --- | --- | --- |
|
|
12
|
+
| **Clock** | Shows the local time of day and, optionally, the date, in a 24-hour format. | `com.playervox.overcrow.clock` | none | [widgets/clock/](../../../widgets/clock/) |
|
|
13
|
+
| **FPS** | Shows the game’s presented frame rate, when the host has a frame rate source. | `com.playervox.overcrow.fps` | `fps.read` | [widgets/fps/](../../../widgets/fps/) |
|
|
14
|
+
| **Media** | The track your music player is playing, with its cover, and previous, play/pause and next buttons in Interactive mode. | `com.playervox.overcrow.media` | `media.read`, `media.control` | [widgets/media/](../../../widgets/media/) |
|
|
15
|
+
| **Notes** | Your notes and checklists over the game: up to eight notes, each with free text and a checklist, the same for every game. Read them in Passive mode; in Interactive mode choose, create, delete and edit them in the widget, and tick entries off. They stay on this computer. | `com.playervox.overcrow.notes` | `notes.read`, `notes.write` | [widgets/notes/](../../../widgets/notes/) |
|
|
16
|
+
| **Performance** | Game CPU and memory, plus the temperatures this computer exposes. | `com.playervox.overcrow.performance` | `telemetry.read`, `fps.read` | [widgets/performance/](../../../widgets/performance/) |
|
|
17
|
+
| **Session journal** | The finished play sessions of your game, newest first: date, start time and duration, five per page. Recorded on your device without an account, merged with your PlayerVox journal when you sync. Delete a session after confirmation. | `com.playervox.overcrow.playervox.journal` | `journal.read`, `journal.delete` | [widgets/playervox-journal/](../../../widgets/playervox-journal/) |
|
|
18
|
+
| **My rating** | Your own PlayerVox rating of the Steam game you play: its grade and score, and in Interactive mode three criteria and an optional review to publish or update. Needs your PlayerVox account. | `com.playervox.overcrow.playervox.rating` | `playervox.rating.read`, `playervox.rating.write` | [widgets/playervox-rating/](../../../widgets/playervox-rating/) |
|
|
19
|
+
| **Player reviews** | What PlayerVox players think of the game you play: three reviews per page with each player's grade and score, in your language when a translation exists. Limit them to the players you follow from the widget's menu. Needs your PlayerVox account. | `com.playervox.overcrow.playervox.reviews` | `playervox.reviews.read` | [widgets/playervox-reviews/](../../../widgets/playervox-reviews/) |
|
|
20
|
+
| **PlayerVox score** | The PlayerVox community grade of your Steam game, with its score, rating count and three criteria. No account needed; the badge is always shown. | `com.playervox.overcrow.playervox.score` | `playervox.score.read` | [widgets/playervox-score/](../../../widgets/playervox-score/) |
|
|
21
|
+
| **Session** | Shows how long the current game session has lasted. | `com.playervox.overcrow.session` | `session.read` | [widgets/session/](../../../widgets/session/) |
|
|
22
|
+
| **Manual stopwatch** | A stopwatch to the hundredth of a second, started, paused and reset with its buttons or the host’s shortcuts. | `com.playervox.overcrow.stopwatch` | `stopwatch.read`, `stopwatch.control` | [widgets/stopwatch/](../../../widgets/stopwatch/) |
|
|
23
|
+
| **Twitch chat** | Read and send messages in a public Twitch chat you choose: your favorite channels, the scrolling history with emotes and replies in Interactive mode, the last messages fading out in Passive mode. Needs your Twitch account. | `com.playervox.overcrow.twitch.chat` | `twitch.chat.read`, `twitch.chat.compose` | [widgets/twitch-chat/](../../../widgets/twitch-chat/) |
|
|
24
|
+
| **Warframe Market** | Searches public PC items from a cached catalog, shows an item’s online sellers and buyers in two tabs, and copies a trade whisper when you click. | `com.playervox.overcrow.warframe.market` | `network`, `storage`, `clipboardWrite` | [widgets/warframe-market/](../../../widgets/warframe-market/) |
|
|
25
|
+
<!-- /generated:widgets -->
|
|
26
|
+
|
|
27
|
+
## What a widget directory holds
|
|
28
|
+
|
|
29
|
+
- the package sources: `manifest.json`, `view.ocml`, `style.ocss`,
|
|
30
|
+
`logic.ts`, `locales/`, `LICENSE`;
|
|
31
|
+
- `listing.json`, its marketplace text;
|
|
32
|
+
- `assets/preview.png`, its marketplace preview: the image of its `preview`
|
|
33
|
+
scenario, framed and staged by `node scripts/compose-previews.mjs`;
|
|
34
|
+
- `tests/`: unit tests of the logic, and scenarios with reference images in
|
|
35
|
+
both themes, both languages and two scales, played by
|
|
36
|
+
`overcrow-widget test` in OverCrow's headless runtime;
|
|
37
|
+
- `README.md`: what it shows, its menu, its permissions, how it works and
|
|
38
|
+
what it costs.
|
|
39
|
+
|
|
40
|
+
## What each one shows
|
|
41
|
+
|
|
42
|
+
| To see how to… | Read |
|
|
43
|
+
| --- | --- |
|
|
44
|
+
| tick at each minute or second of local time, follow a menu option | Clock |
|
|
45
|
+
| subscribe to a service and show a missing value | FPS, Session |
|
|
46
|
+
| lay out a list of values in a grid, hide a menu row the machine cannot serve | Performance |
|
|
47
|
+
| show an image handed by OverCrow, retry a subscription that ended | Media |
|
|
48
|
+
| command a service on a user action, let OverCrow advance a duration | Manual stopwatch |
|
|
49
|
+
| edit text through a form bound to a write intent, keep drafts | Notes, My rating |
|
|
50
|
+
| draw on a canvas | PlayerVox score, My rating |
|
|
51
|
+
| page through a service and react to a revision | Player reviews, Session journal |
|
|
52
|
+
| keep a long scrolling list at its end, send a message | Twitch chat |
|
|
53
|
+
| call an HTTP API, cache it in storage, copy to the clipboard | Warframe Market |
|
|
54
|
+
|
|
55
|
+
Warframe Market is not a built-in: a PlayerVox widget of the catalog,
|
|
56
|
+
installed on request, it shows network routes with a declared response
|
|
57
|
+
bound, storage for a cached catalog and a clipboard copy on a click.
|
|
58
|
+
|
|
59
|
+
## Work on one
|
|
60
|
+
|
|
61
|
+
From a checkout of the repository, link the SDK of that revision into the
|
|
62
|
+
widgets, then check one, package it and run its unit tests:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
node scripts/prepare-widgets.mjs
|
|
66
|
+
overcrow-widget check widgets/clock
|
|
67
|
+
overcrow-widget package widgets/clock
|
|
68
|
+
node --test widgets/clock/tests/logic.test.mjs
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`prepare-widgets.mjs` needs the SDK built first (`npm ci` then
|
|
72
|
+
`npm run build` in `sdk/`). The four templates of `overcrow-widget init`
|
|
73
|
+
are in [`templates/`](../../../templates/), and two complete examples
|
|
74
|
+
written for these pages in
|
|
75
|
+
[`docs/content/examples/`](../examples/): `weather` calls an HTTP API and
|
|
76
|
+
`countdown` uses a timer, a canvas, a context menu and storage.
|