@blcklab/anyo-player 0.5.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/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/dist/createAnyoPlayer.d.ts +3 -0
- package/dist/createAnyoPlayer.d.ts.map +1 -0
- package/dist/createAnyoPlayer.js +5 -0
- package/dist/createAnyoPlayer.js.map +1 -0
- package/dist/element-define.d.ts +2 -0
- package/dist/element-define.d.ts.map +1 -0
- package/dist/element-define.js +4 -0
- package/dist/element-define.js.map +1 -0
- package/dist/element.d.ts +66 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +363 -0
- package/dist/element.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/inputBindings.d.ts +3 -0
- package/dist/inputBindings.d.ts.map +1 -0
- package/dist/inputBindings.js +3 -0
- package/dist/inputBindings.js.map +1 -0
- package/dist/internal/AccessibilityController.d.ts +50 -0
- package/dist/internal/AccessibilityController.d.ts.map +1 -0
- package/dist/internal/AccessibilityController.js +212 -0
- package/dist/internal/AccessibilityController.js.map +1 -0
- package/dist/internal/AnyoPlayerCore.d.ts +357 -0
- package/dist/internal/AnyoPlayerCore.d.ts.map +1 -0
- package/dist/internal/AnyoPlayerCore.js +3880 -0
- package/dist/internal/AnyoPlayerCore.js.map +1 -0
- package/dist/internal/AudioController.d.ts +37 -0
- package/dist/internal/AudioController.d.ts.map +1 -0
- package/dist/internal/AudioController.js +167 -0
- package/dist/internal/AudioController.js.map +1 -0
- package/dist/internal/CaptionController.d.ts +16 -0
- package/dist/internal/CaptionController.d.ts.map +1 -0
- package/dist/internal/CaptionController.js +83 -0
- package/dist/internal/CaptionController.js.map +1 -0
- package/dist/internal/ContainerHost.d.ts +17 -0
- package/dist/internal/ContainerHost.d.ts.map +1 -0
- package/dist/internal/ContainerHost.js +110 -0
- package/dist/internal/ContainerHost.js.map +1 -0
- package/dist/internal/DesktopInputController.d.ts +80 -0
- package/dist/internal/DesktopInputController.d.ts.map +1 -0
- package/dist/internal/DesktopInputController.js +367 -0
- package/dist/internal/DesktopInputController.js.map +1 -0
- package/dist/internal/EmbeddingController.d.ts +33 -0
- package/dist/internal/EmbeddingController.d.ts.map +1 -0
- package/dist/internal/EmbeddingController.js +161 -0
- package/dist/internal/EmbeddingController.js.map +1 -0
- package/dist/internal/EventHub.d.ts +7 -0
- package/dist/internal/EventHub.d.ts.map +1 -0
- package/dist/internal/EventHub.js +27 -0
- package/dist/internal/EventHub.js.map +1 -0
- package/dist/internal/FrameworkAdapterController.d.ts +46 -0
- package/dist/internal/FrameworkAdapterController.d.ts.map +1 -0
- package/dist/internal/FrameworkAdapterController.js +165 -0
- package/dist/internal/FrameworkAdapterController.js.map +1 -0
- package/dist/internal/FullscreenController.d.ts +29 -0
- package/dist/internal/FullscreenController.d.ts.map +1 -0
- package/dist/internal/FullscreenController.js +122 -0
- package/dist/internal/FullscreenController.js.map +1 -0
- package/dist/internal/GamepadController.d.ts +54 -0
- package/dist/internal/GamepadController.d.ts.map +1 -0
- package/dist/internal/GamepadController.js +276 -0
- package/dist/internal/GamepadController.js.map +1 -0
- package/dist/internal/InputBindingsController.d.ts +34 -0
- package/dist/internal/InputBindingsController.d.ts.map +1 -0
- package/dist/internal/InputBindingsController.js +223 -0
- package/dist/internal/InputBindingsController.js.map +1 -0
- package/dist/internal/InteractionPresentationController.d.ts +38 -0
- package/dist/internal/InteractionPresentationController.d.ts.map +1 -0
- package/dist/internal/InteractionPresentationController.js +208 -0
- package/dist/internal/InteractionPresentationController.js.map +1 -0
- package/dist/internal/MapController.d.ts +16 -0
- package/dist/internal/MapController.d.ts.map +1 -0
- package/dist/internal/MapController.js +68 -0
- package/dist/internal/MapController.js.map +1 -0
- package/dist/internal/PerformanceController.d.ts +94 -0
- package/dist/internal/PerformanceController.d.ts.map +1 -0
- package/dist/internal/PerformanceController.js +455 -0
- package/dist/internal/PerformanceController.js.map +1 -0
- package/dist/internal/PlayerCameraController.d.ts +79 -0
- package/dist/internal/PlayerCameraController.d.ts.map +1 -0
- package/dist/internal/PlayerCameraController.js +551 -0
- package/dist/internal/PlayerCameraController.js.map +1 -0
- package/dist/internal/ResponsiveController.d.ts +37 -0
- package/dist/internal/ResponsiveController.d.ts.map +1 -0
- package/dist/internal/ResponsiveController.js +143 -0
- package/dist/internal/ResponsiveController.js.map +1 -0
- package/dist/internal/RuntimeFactory.d.ts +42 -0
- package/dist/internal/RuntimeFactory.d.ts.map +1 -0
- package/dist/internal/RuntimeFactory.js +93 -0
- package/dist/internal/RuntimeFactory.js.map +1 -0
- package/dist/internal/ScreenshotController.d.ts +8 -0
- package/dist/internal/ScreenshotController.d.ts.map +1 -0
- package/dist/internal/ScreenshotController.js +47 -0
- package/dist/internal/ScreenshotController.js.map +1 -0
- package/dist/internal/SessionController.d.ts +44 -0
- package/dist/internal/SessionController.d.ts.map +1 -0
- package/dist/internal/SessionController.js +411 -0
- package/dist/internal/SessionController.js.map +1 -0
- package/dist/internal/SourceResolver.d.ts +31 -0
- package/dist/internal/SourceResolver.d.ts.map +1 -0
- package/dist/internal/SourceResolver.js +362 -0
- package/dist/internal/SourceResolver.js.map +1 -0
- package/dist/internal/StateMachine.d.ts +10 -0
- package/dist/internal/StateMachine.d.ts.map +1 -0
- package/dist/internal/StateMachine.js +35 -0
- package/dist/internal/StateMachine.js.map +1 -0
- package/dist/internal/StyleController.d.ts +14 -0
- package/dist/internal/StyleController.d.ts.map +1 -0
- package/dist/internal/StyleController.js +116 -0
- package/dist/internal/StyleController.js.map +1 -0
- package/dist/internal/TelemetryController.d.ts +28 -0
- package/dist/internal/TelemetryController.d.ts.map +1 -0
- package/dist/internal/TelemetryController.js +113 -0
- package/dist/internal/TelemetryController.js.map +1 -0
- package/dist/internal/TouchInputController.d.ts +73 -0
- package/dist/internal/TouchInputController.d.ts.map +1 -0
- package/dist/internal/TouchInputController.js +379 -0
- package/dist/internal/TouchInputController.js.map +1 -0
- package/dist/internal/VfxController.d.ts +11 -0
- package/dist/internal/VfxController.d.ts.map +1 -0
- package/dist/internal/VfxController.js +23 -0
- package/dist/internal/VfxController.js.map +1 -0
- package/dist/internal/ViewPreferenceController.d.ts +40 -0
- package/dist/internal/ViewPreferenceController.d.ts.map +1 -0
- package/dist/internal/ViewPreferenceController.js +132 -0
- package/dist/internal/ViewPreferenceController.js.map +1 -0
- package/dist/internal/VisibilityController.d.ts +26 -0
- package/dist/internal/VisibilityController.d.ts.map +1 -0
- package/dist/internal/VisibilityController.js +62 -0
- package/dist/internal/VisibilityController.js.map +1 -0
- package/dist/internal/XRController.d.ts +42 -0
- package/dist/internal/XRController.d.ts.map +1 -0
- package/dist/internal/XRController.js +169 -0
- package/dist/internal/XRController.js.map +1 -0
- package/dist/internal/sourceUrls.d.ts +6 -0
- package/dist/internal/sourceUrls.d.ts.map +1 -0
- package/dist/internal/sourceUrls.js +79 -0
- package/dist/internal/sourceUrls.js.map +1 -0
- package/dist/react.d.ts +44 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +115 -0
- package/dist/react.js.map +1 -0
- package/dist/session.d.ts +3 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +3 -0
- package/dist/session.js.map +1 -0
- package/dist/styleText.d.ts +2 -0
- package/dist/styleText.d.ts.map +1 -0
- package/dist/styleText.js +2 -0
- package/dist/styleText.js.map +1 -0
- package/dist/styles.css +573 -0
- package/dist/types.d.ts +1476 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/PlayerUI.d.ts +193 -0
- package/dist/ui/PlayerUI.d.ts.map +1 -0
- package/dist/ui/PlayerUI.js +1201 -0
- package/dist/ui/PlayerUI.js.map +1 -0
- package/dist/vue.d.ts +97 -0
- package/dist/vue.d.ts.map +1 -0
- package/dist/vue.js +126 -0
- package/dist/vue.js.map +1 -0
- package/dist/worldCache.d.ts +16 -0
- package/dist/worldCache.d.ts.map +1 -0
- package/dist/worldCache.js +46 -0
- package/dist/worldCache.js.map +1 -0
- package/dist/worldSources.d.ts +19 -0
- package/dist/worldSources.d.ts.map +1 -0
- package/dist/worldSources.js +51 -0
- package/dist/worldSources.js.map +1 -0
- package/package.json +114 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
- Normalize integrity-verification byte views to `ArrayBuffer` before Web Crypto hashing for TypeScript 5.8+ DOM compatibility.
|
|
6
|
+
|
|
7
|
+
The first stable `0.5` release keeps the validated runtime from `0.5.0-rc.2` and turns it into the production package boundary.
|
|
8
|
+
|
|
9
|
+
### Highlights
|
|
10
|
+
|
|
11
|
+
- Validated Player with `@blcklab/anyo@0.10.0-rc.1` and `@blcklab/sekai64@0.8.0-rc.33`.
|
|
12
|
+
- Kept Player framework-neutral with no direct runtime dependencies.
|
|
13
|
+
- Documented the published `@blcklab/anyo-animation@0.1.2` integration for animated GLB/glTF assets.
|
|
14
|
+
- Documented manual VRM registration through `@blcklab/anyo-avatar@0.2.0`, sharing the same Sekai64 animation module.
|
|
15
|
+
- Preserved the existing `renderer.modules`, `renderer.assetLoaders`, `plugins`, systems, world replacement, navigation, recovery, input, XR, Web Surface, custom-element, Vue, and React contracts.
|
|
16
|
+
- Added tag/version verification and npm provenance to the GitHub publish workflow.
|
|
17
|
+
- Reworked public documentation around production use instead of historical release-candidate milestones.
|
|
18
|
+
|
|
19
|
+
Historical release-candidate notes remain in the source repository under `.internal/history/` and are not published to npm.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Avelurs Tinio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# @blcklab/anyo-player
|
|
2
|
+
|
|
3
|
+
A browser player for Anyo worlds.
|
|
4
|
+
|
|
5
|
+
`@blcklab/anyo-player` takes a world document, gives it a Sekai64 renderer, and owns the browser-facing work around it: loading, input, lifecycle, recovery, responsive sizing, accessibility, world replacement, and optional framework adapters.
|
|
6
|
+
|
|
7
|
+
It stays deliberately small at the package boundary. Player does not bundle Anyo, Sekai64, animation, avatar, physics, audio, or framework runtimes for you; those remain peer or host-installed packages so an application can choose exactly what it needs.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @blcklab/anyo-player @blcklab/anyo @blcklab/sekai64
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Player `0.5.0` is validated with:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
@blcklab/anyo 0.10.0-rc.1
|
|
19
|
+
@blcklab/sekai64 0.8.0-rc.33
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Start in a minute
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { createAnyoPlayer } from '@blcklab/anyo-player'
|
|
26
|
+
import '@blcklab/anyo-player/styles.css'
|
|
27
|
+
|
|
28
|
+
const container = document.querySelector<HTMLElement>('#world')!
|
|
29
|
+
|
|
30
|
+
const player = createAnyoPlayer({
|
|
31
|
+
container,
|
|
32
|
+
source: '/world.anyo.json',
|
|
33
|
+
renderer: {
|
|
34
|
+
backend: 'auto',
|
|
35
|
+
antialias: true,
|
|
36
|
+
},
|
|
37
|
+
exploration: {
|
|
38
|
+
desktop: true,
|
|
39
|
+
touch: true,
|
|
40
|
+
pointerLock: true,
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
await player.load()
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
When the page, route, or component that owns the player is removed, dispose it too:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
await player.disposeAsync()
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
That final `disposeAsync()` matters in production. It releases browser listeners, input ownership, renderer resources, object URLs, and the active Anyo runtime owned by that Player instance.
|
|
54
|
+
|
|
55
|
+
## What can be loaded?
|
|
56
|
+
|
|
57
|
+
Player accepts a URL, JSON text, a world document object, local browser files, virtual folder maps, and trusted host-decoded archives.
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
await player.load('/worlds/store/world.anyo.json')
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
await player.load({
|
|
65
|
+
files: {
|
|
66
|
+
'world.anyo.json': worldJson,
|
|
67
|
+
'assets/store.glb': storeModel,
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
For `<input webkitdirectory multiple>`, use `createAnyoPlayerFolderSource()` to preserve relative package paths safely.
|
|
73
|
+
|
|
74
|
+
## Replace a world without replacing the player
|
|
75
|
+
|
|
76
|
+
Once a Player is ready, use `replaceWorld()` instead of calling `load()` again:
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
await player.replaceWorld('/worlds/gallery/world.anyo.json')
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For applications with several known worlds, Player also provides registration, preloading, cancellation, and navigation APIs.
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
const unregister = player.registerWorld('gallery', '/worlds/gallery/world.anyo.json')
|
|
86
|
+
|
|
87
|
+
await player.preloadWorld('gallery')
|
|
88
|
+
await player.navigateTo('gallery')
|
|
89
|
+
|
|
90
|
+
unregister()
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Host actions stay in the host
|
|
94
|
+
|
|
95
|
+
World JSON describes the world. Executable application behavior stays in trusted application code.
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
player.registerAction('open-product', ({ sku }) => {
|
|
99
|
+
console.log('Open product', sku)
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The same rule applies to plugins, custom asset loaders, Web Surface applications, archive decoders, analytics sinks, and other executable integrations.
|
|
104
|
+
|
|
105
|
+
## Animated GLB and VRM
|
|
106
|
+
|
|
107
|
+
Animation and avatar support are optional host integrations. They are not hard dependencies of Player.
|
|
108
|
+
|
|
109
|
+
The companion versions validated with Player `0.5.0` are:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm install @blcklab/anyo-animation@0.1.2 @blcklab/anyo-avatar@0.2.0
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
For animated GLB and VRM, create one shared Sekai64 animation integration and give its animation module to the VRM loader:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
import { createAnyoPlayer } from '@blcklab/anyo-player'
|
|
119
|
+
import { createSekai64AnimationIntegration } from '@blcklab/anyo-animation/sekai64'
|
|
120
|
+
import { createSekai64VrmAssetLoader } from '@blcklab/anyo-avatar/vrm/sekai64'
|
|
121
|
+
|
|
122
|
+
const animation = createSekai64AnimationIntegration()
|
|
123
|
+
|
|
124
|
+
const player = createAnyoPlayer({
|
|
125
|
+
container,
|
|
126
|
+
source: '/world.anyo.json',
|
|
127
|
+
renderer: {
|
|
128
|
+
modules: [animation.module],
|
|
129
|
+
assetLoaders: [
|
|
130
|
+
animation.assetLoader,
|
|
131
|
+
createSekai64VrmAssetLoader({
|
|
132
|
+
animationModule: animation.module,
|
|
133
|
+
}),
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
plugins: [animation.plugin],
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
await player.load()
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The shared module is intentional. A VRM is a skinned glTF asset; the VRM loader and `anyo.animation` must work against the same mixer and skeleton runtime.
|
|
143
|
+
|
|
144
|
+
Create fresh integration and loader registrations for each Player lifecycle. The renderer owns the lifetime of registered loaders.
|
|
145
|
+
|
|
146
|
+
## Web Surfaces
|
|
147
|
+
|
|
148
|
+
Player enables Anyo Web Surface presentation by default. World data remains declarative; trusted application code remains in the host.
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
const player = createAnyoPlayer({
|
|
152
|
+
container,
|
|
153
|
+
source: '/world.anyo.json',
|
|
154
|
+
webSurface: {
|
|
155
|
+
apps: {
|
|
156
|
+
dashboard: {
|
|
157
|
+
mount(container, props, context) {
|
|
158
|
+
const button = document.createElement('button')
|
|
159
|
+
button.textContent = String(props.label ?? 'Open')
|
|
160
|
+
button.addEventListener('click', () => {
|
|
161
|
+
void context.runAction('open-dashboard')
|
|
162
|
+
})
|
|
163
|
+
container.append(button)
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
update(nextProps) {
|
|
167
|
+
button.textContent = String(nextProps.label ?? 'Open')
|
|
168
|
+
},
|
|
169
|
+
dispose() {
|
|
170
|
+
button.remove()
|
|
171
|
+
},
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
externalUrls: {
|
|
177
|
+
allowedOrigins: ['https://docs.example.com'],
|
|
178
|
+
sandbox: ['allow-forms', 'allow-popups'],
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
})
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Player does not accept executable HTML or JavaScript from world JSON and does not bypass iframe CSP, `X-Frame-Options`, or browser cross-origin restrictions.
|
|
185
|
+
|
|
186
|
+
Set `webSurface: false` when another trusted plugin owns that presentation path.
|
|
187
|
+
|
|
188
|
+
## Optional plugins and systems
|
|
189
|
+
|
|
190
|
+
Trusted host-created Anyo plugins can be appended through `plugins`. Fixed-step systems can be supplied through `systems` and `systemOptions`.
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
const player = createAnyoPlayer({
|
|
194
|
+
container,
|
|
195
|
+
source: '/world.anyo.json',
|
|
196
|
+
plugins: [myPlugin],
|
|
197
|
+
systems: [mySystem],
|
|
198
|
+
})
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
This is how packages such as physics, audio, VFX, map integrations, or custom application features can participate without becoming Player dependencies.
|
|
202
|
+
|
|
203
|
+
## Custom element
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import { defineAnyoPlayerElement } from '@blcklab/anyo-player/element'
|
|
207
|
+
|
|
208
|
+
defineAnyoPlayerElement()
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
```html
|
|
212
|
+
<anyo-player
|
|
213
|
+
src="/world.anyo.json"
|
|
214
|
+
activation="visible"
|
|
215
|
+
preload="source"
|
|
216
|
+
backend="auto"
|
|
217
|
+
pause-when-offscreen
|
|
218
|
+
aria-label="Virtual world"
|
|
219
|
+
></anyo-player>
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
The custom-element subpath is side-effect free. Registration happens only when `defineAnyoPlayerElement()` is called. If you explicitly want automatic registration, use `@blcklab/anyo-player/element/define`.
|
|
223
|
+
|
|
224
|
+
## Vue and React
|
|
225
|
+
|
|
226
|
+
Framework adapters live on separate subpaths so the core package never requires a framework at runtime.
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
import { AnyoPlayer } from '@blcklab/anyo-player/vue'
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
import { AnyoPlayer } from '@blcklab/anyo-player/react'
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Vue, React, and React DOM are optional peer dependencies. Install only the framework used by your application.
|
|
237
|
+
|
|
238
|
+
## Runtime controls and diagnostics
|
|
239
|
+
|
|
240
|
+
Player exposes production controls without making the world document authoritative over the host device.
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
player.setQualityPreset('high')
|
|
244
|
+
player.setTargetFps(60)
|
|
245
|
+
player.setDynamicResolution(true)
|
|
246
|
+
player.setViewPreference({ fieldOfView: 72, pointerLookScale: 1.1 })
|
|
247
|
+
player.showCaption('Welcome to the showroom.', { speaker: 'Assistant' })
|
|
248
|
+
|
|
249
|
+
const health = player.createRuntimeHealth()
|
|
250
|
+
const report = player.createRuntimeReport()
|
|
251
|
+
const bundle = player.downloadDiagnosticBundle()
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Camera and inspection helpers include:
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
player.setCameraMode('orbit', { bounds })
|
|
258
|
+
player.setCameraMode('top', { bounds, northUp: true })
|
|
259
|
+
player.setCameraMode('free', { speed: 12 })
|
|
260
|
+
player.setCameraMode('explore')
|
|
261
|
+
player.teleport({ position: [0, 1.65, 0], resetMotion: true })
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Production notes
|
|
265
|
+
|
|
266
|
+
Before shipping a Player host:
|
|
267
|
+
|
|
268
|
+
- serve worlds and assets with correct CORS headers when they are cross-origin;
|
|
269
|
+
- call `disposeAsync()` on route or application teardown;
|
|
270
|
+
- keep executable plugins and loaders in trusted host code, never in world JSON;
|
|
271
|
+
- treat pointer lock, fullscreen, audio unlock, and XR as user-gesture-gated browser capabilities;
|
|
272
|
+
- use a secure context for WebXR;
|
|
273
|
+
- configure a fallback renderer when your application needs recovery from WebGPU loss;
|
|
274
|
+
- validate real devices and browsers that matter to your users.
|
|
275
|
+
|
|
276
|
+
The full deployment and lifecycle guide is in [`docs/PRODUCTION.md`](docs/PRODUCTION.md).
|
|
277
|
+
|
|
278
|
+
## Documentation
|
|
279
|
+
|
|
280
|
+
- [`docs/README.md`](docs/README.md) — documentation index
|
|
281
|
+
- [`docs/PRODUCTION.md`](docs/PRODUCTION.md) — deployment, lifecycle, security, and recovery
|
|
282
|
+
- [`docs/api/API.md`](docs/api/API.md) — public API reference
|
|
283
|
+
- [`docs/integrations/SEKAI64_080_BRIDGE.md`](docs/integrations/SEKAI64_080_BRIDGE.md) — Sekai64, animation, and VRM composition
|
|
284
|
+
- [`docs/guides/SUPPORT.md`](docs/guides/SUPPORT.md) — support and compatibility policy
|
|
285
|
+
- [`docs/guides/MIGRATION.md`](docs/guides/MIGRATION.md) — moving to `0.5.0`
|
|
286
|
+
- [`docs/TESTING.md`](docs/TESTING.md) — what the release suite proves
|
|
287
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — release history
|
|
288
|
+
|
|
289
|
+
## Development
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
npm install
|
|
293
|
+
npm run build
|
|
294
|
+
npm test
|
|
295
|
+
npm run check
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Generated output is written to `dist/` and is intentionally not committed.
|
|
299
|
+
|
|
300
|
+
Maintainer-only release notes, evidence procedures, historical milestone documents, and internal architecture notes live under `.internal/` in the source repository. That directory is intentionally excluded from the npm package.
|
|
301
|
+
|
|
302
|
+
## License
|
|
303
|
+
|
|
304
|
+
MIT License. Copyright (c) 2026 **Avelurs Tinio**.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnyoPlayer.d.ts","sourceRoot":"","sources":["../src/createAnyoPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAEvE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnyoPlayer.js","sourceRoot":"","sources":["../src/createAnyoPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAG7D,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-define.d.ts","sourceRoot":"","sources":["../src/element-define.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-define.js","sourceRoot":"","sources":["../src/element-define.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAE5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAEtD,uBAAuB,EAAE,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { AnyoPlayerError } from './errors.js';
|
|
2
|
+
import type { AnyoPlayer, AnyoPlayerEventMap, AnyoPlayerOptions, AnyoPlayerSource } from './types.js';
|
|
3
|
+
export declare const ANYO_PLAYER_ELEMENT_TAG = "anyo-player";
|
|
4
|
+
export type AnyoPlayerElementOptions = Omit<AnyoPlayerOptions, 'container' | 'canvas' | 'source'>;
|
|
5
|
+
export interface AnyoPlayerElementEventMap {
|
|
6
|
+
'anyo-player-ready': CustomEvent<AnyoPlayerEventMap['ready']>;
|
|
7
|
+
'anyo-player-error': CustomEvent<AnyoPlayerError>;
|
|
8
|
+
'anyo-player-statechange': CustomEvent<AnyoPlayerEventMap['statechange']>;
|
|
9
|
+
'anyo-player-phasechange': CustomEvent<AnyoPlayerEventMap['phasechange']>;
|
|
10
|
+
'anyo-player-worldreplaced': CustomEvent<AnyoPlayerEventMap['worldreplaced']>;
|
|
11
|
+
'anyo-player-themechange': CustomEvent<AnyoPlayerEventMap['themechange']>;
|
|
12
|
+
'anyo-player-disposed': CustomEvent<undefined>;
|
|
13
|
+
}
|
|
14
|
+
export type AnyoPlayerElementEventName = keyof AnyoPlayerElementEventMap;
|
|
15
|
+
declare const HTMLElementBase: typeof HTMLElement;
|
|
16
|
+
export declare class AnyoPlayerElement extends HTMLElementBase {
|
|
17
|
+
static get observedAttributes(): readonly string[];
|
|
18
|
+
private sourceValue;
|
|
19
|
+
private optionsValue;
|
|
20
|
+
private playerValue;
|
|
21
|
+
private containerValue;
|
|
22
|
+
private eventCleanups;
|
|
23
|
+
private disposalPromise;
|
|
24
|
+
private generation;
|
|
25
|
+
private lastMountError;
|
|
26
|
+
constructor();
|
|
27
|
+
get src(): string;
|
|
28
|
+
set src(value: string);
|
|
29
|
+
get source(): AnyoPlayerSource | null;
|
|
30
|
+
set source(value: AnyoPlayerSource | null);
|
|
31
|
+
get options(): AnyoPlayerElementOptions;
|
|
32
|
+
set options(value: AnyoPlayerElementOptions);
|
|
33
|
+
get player(): AnyoPlayer | null;
|
|
34
|
+
connectedCallback(): void;
|
|
35
|
+
disconnectedCallback(): void;
|
|
36
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
37
|
+
load(source?: AnyoPlayerSource | undefined): Promise<void>;
|
|
38
|
+
activate(): Promise<void>;
|
|
39
|
+
replaceWorld(source: AnyoPlayerSource): Promise<void>;
|
|
40
|
+
disposeAsync(): Promise<void>;
|
|
41
|
+
protected createPlayer(options: AnyoPlayerOptions): AnyoPlayer;
|
|
42
|
+
private ensureStructure;
|
|
43
|
+
private composeOptions;
|
|
44
|
+
private mountPlayer;
|
|
45
|
+
private ensurePlayer;
|
|
46
|
+
private bindPlayerEvents;
|
|
47
|
+
private clearPlayerEvents;
|
|
48
|
+
private beginDisposal;
|
|
49
|
+
private validateAttribute;
|
|
50
|
+
private upgradeProperty;
|
|
51
|
+
private reportError;
|
|
52
|
+
}
|
|
53
|
+
export interface AnyoPlayerElement {
|
|
54
|
+
addEventListener<TKey extends keyof AnyoPlayerElementEventMap>(type: TKey, listener: (this: AnyoPlayerElement, event: AnyoPlayerElementEventMap[TKey]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
55
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
|
|
56
|
+
removeEventListener<TKey extends keyof AnyoPlayerElementEventMap>(type: TKey, listener: (this: AnyoPlayerElement, event: AnyoPlayerElementEventMap[TKey]) => void, options?: boolean | EventListenerOptions): void;
|
|
57
|
+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
|
|
58
|
+
}
|
|
59
|
+
declare global {
|
|
60
|
+
interface HTMLElementTagNameMap {
|
|
61
|
+
'anyo-player': AnyoPlayerElement;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export declare function defineAnyoPlayerElement(tagName?: string): CustomElementConstructor;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"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"}
|