@overcrow/mcp 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +353 -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 +253 -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 +381 -0
- package/dist/content/docs/en/mcp.md +165 -0
- package/dist/content/docs/en/package.md +131 -0
- package/dist/content/docs/en/publishing.md +162 -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/view.md +338 -0
- package/dist/content/docs/en/widgets.md +76 -0
- package/dist/content/docs/fr/cli.md +367 -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 +264 -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 +392 -0
- package/dist/content/docs/fr/mcp.md +173 -0
- package/dist/content/docs/fr/package.md +139 -0
- package/dist/content/docs/fr/publishing.md +172 -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/view.md +352 -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/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/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/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/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/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/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/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/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/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/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/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/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/tsconfig.json +16 -0
- package/dist/content/examples/weather/view.ocml +12 -0
- package/dist/content/index.json +3601 -0
- package/dist/content/reference/errors.json +1712 -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/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 +178 -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,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.
|