lecodes-viewer 0.19.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/README.md +5 -0
- package/dist-embed/VERSION.json +5 -0
- package/dist-embed/assets/Roboto-Variable-DHm9jpd-.woff2 +0 -0
- package/dist-embed/assets/__vite-browser-external-BIHI7g3E.js +1 -0
- package/dist-embed/assets/basis-C64VHDVD.js +1 -0
- package/dist-embed/assets/basis_transcoder-VXdx5NbI.wasm +0 -0
- package/dist-embed/assets/createViewer2d-D12Wy3VF.js +1 -0
- package/dist-embed/assets/createViewerLite-CP-WHGLg.js +707 -0
- package/dist-embed/assets/creator-gl-BF2CQzeI.wasm +0 -0
- package/dist-embed/assets/creator-gl.js-B_0GrQRe.symbols +5379 -0
- package/dist-embed/assets/creator-ui-BX5Fvnbt.js +1 -0
- package/dist-embed/assets/creator-ui-CzKHLH2Q.wasm +0 -0
- package/dist-embed/assets/creator2d-BtQ-1_B0.wasm +0 -0
- package/dist-embed/assets/draco-BiISTFcR.js +118 -0
- package/dist-embed/assets/draco_decoder-DsQ12WqX.wasm +0 -0
- package/dist-embed/assets/host-CWKB1WDd.js +162 -0
- package/dist-embed/assets/index-CIK8PnUA.js +2 -0
- package/dist-embed/assets/lit-DUE9rhY9.filamat +0 -0
- package/dist-embed/assets/loadCreatorUiNode-UAdhjRTd.js +1 -0
- package/dist-embed/assets/neutral_ibl128-D-lzdkLN.ktx +0 -0
- package/dist-embed/assets/particles-DxYDmI1O.filamat +0 -0
- package/dist-embed/assets/particles-quad-DwYo9yCK.filamat +0 -0
- package/dist-embed/assets/shadow-C9xJpqlY.filamat +0 -0
- package/dist-embed/assets/uberarchive-uXjRYa9p.bin +0 -0
- package/dist-embed/assets/unlit-pe4tFY5b.filamat +0 -0
- package/dist-embed/assets/unlit-transparent-D9OyaOBR.filamat +0 -0
- package/dist-embed/assets/video-eedvhMvS.filamat +0 -0
- package/dist-embed/assets/worker-Caf-yYEI.js +2 -0
- package/dist-embed/embed.html +48 -0
- package/dist-embed/embed.js +187 -0
- package/embed.html +48 -0
- package/package.json +35 -0
- package/src/assets/banner.png +0 -0
- package/src/assets/image2.png +0 -0
- package/src/assets/landing.mp4 +0 -0
- package/src/assets/neutral_ibl128.ktx +0 -0
- package/src/assets/neutral_ibl256.ktx +0 -0
- package/src/assets/output.mp4 +0 -0
- package/src/assets/output2.mp4 +0 -0
- package/src/assets/texture.png +0 -0
- package/src/assets/vue.svg +1 -0
- package/src/canvas/createCanvasHost.ts +2 -0
- package/src/createViewer.ts +103 -0
- package/src/embed.ts +515 -0
- package/src/host.ts +428 -0
- package/src/lite-test.ts +160 -0
- package/src/main.ts +77 -0
- package/src/sourcemapError.ts +2 -0
- package/src/ui/CuiProps.gen.ts +103 -0
- package/src/ui/UIScreen.ts +486 -0
- package/src/ui/createBareUI.ts +32 -0
- package/src/ui/createMeasureSystem.ts +220 -0
- package/src/ui/createNodeElement.ts +77 -0
- package/src/ui/createPagerSystem.ts +345 -0
- package/src/ui/createTouchSystem.ts +2 -0
- package/src/ui/createUI.ts +806 -0
- package/src/ui/creator-ui.js +14 -0
- package/src/ui/creator-ui.wasm +0 -0
- package/src/ui/defaultStyle.css +176 -0
- package/src/ui/layers.ts +9 -0
- package/src/ui/mountCanvasUI.ts +213 -0
- package/src/ui/nativeViewSystem.ts +91 -0
- package/src/ui/presentPlayer.ts +156 -0
- package/src/ui/props-apply.ts +403 -0
- package/src/ui/router.ts +2 -0
- package/src/ui/safeAreaSpec.ts +3 -0
- package/src/ui/shells.ts +37 -0
- package/src/ui/toasts.ts +2 -0
- package/src/ui/transitions.ts +250 -0
- package/src/ui/ui.d.ts +78 -0
- package/src/ui/vListSystem.ts +212 -0
- package/src/ui/viewScale.ts +2 -0
- package/src/utils/animate.ts +2 -0
- package/src/utils/createUtils.ts +2 -0
- package/src/utils/fetch.ts +3 -0
- package/src/utils/fonts.ts +2 -0
- package/src/utils/globals.ts +2 -0
- package/src/utils/imageNode.ts +260 -0
- package/src/utils/openFilePicker.ts +2 -0
- package/src/utils/svg.ts +2 -0
- package/src/utils/videoNode.ts +2 -0
- package/src/utils/ws.ts +2 -0
- package/src/viewer/createViewer.ts +993 -0
- package/src/viewer/creator-gl.js +14 -0
- package/src/viewer/creator-gl.js.symbols +5379 -0
- package/src/viewer/creator-gl.wasm +0 -0
- package/src/viewer/lit.filamat +0 -0
- package/src/viewer/mediaplayer.ts +3 -0
- package/src/viewer/particles-quad.filamat +0 -0
- package/src/viewer/particles.filamat +0 -0
- package/src/viewer/physics.ts +140 -0
- package/src/viewer/shadow.filamat +0 -0
- package/src/viewer/uberarchive.bin +0 -0
- package/src/viewer/unlit-transparent.filamat +0 -0
- package/src/viewer/unlit.filamat +0 -0
- package/src/viewer/validateGlb.ts +262 -0
- package/src/viewer/video.filamat +0 -0
- package/src/viewer/wasmCrashSymbolizer.ts +133 -0
- package/src/viewer2d/createViewer2d.ts +438 -0
- package/src/viewer2d/creator2d.js +14 -0
- package/src/viewer2d/creator2d.wasm +0 -0
- package/src/viewer2d/sprite2d.ts +80 -0
- package/src/vite-env.d.ts +1 -0
package/embed.html
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
|
|
6
|
+
<title>LeCodes example</title>
|
|
7
|
+
<!-- Roboto (the runtime's default UI font) is vendored and registered by the host's
|
|
8
|
+
ensureFontsLoaded before the first layout — no font CDN involved. -->
|
|
9
|
+
<style>
|
|
10
|
+
html, body { margin: 0; height: 100%; overflow: hidden; overscroll-behavior: none; background: #000; }
|
|
11
|
+
#app { position: relative; width: 100%; height: 100%; font-family: Roboto, system-ui, sans-serif; }
|
|
12
|
+
.embed-error {
|
|
13
|
+
position: absolute; inset: 0; z-index: 10;
|
|
14
|
+
display: flex; align-items: center; justify-content: center;
|
|
15
|
+
padding: 18px; background: rgba(0, 0, 0, 0.88); color: #ff7a6e;
|
|
16
|
+
font: 12.5px/1.6 ui-monospace, Consolas, monospace; white-space: pre-wrap;
|
|
17
|
+
overflow: auto;
|
|
18
|
+
}
|
|
19
|
+
/* Boot/switch spinner. In the HTML (not injected) and on by default, so it
|
|
20
|
+
shows from the first paint — before the runner module even downloads.
|
|
21
|
+
embed.ts toggles `--on` around every bundle run. */
|
|
22
|
+
.embed-loader {
|
|
23
|
+
position: absolute; inset: 0; z-index: 9;
|
|
24
|
+
display: flex; align-items: center; justify-content: center;
|
|
25
|
+
background: #000; opacity: 0; visibility: hidden;
|
|
26
|
+
transition: opacity 0.2s ease, visibility 0s linear 0.2s;
|
|
27
|
+
}
|
|
28
|
+
.embed-loader--on {
|
|
29
|
+
opacity: 1; visibility: visible;
|
|
30
|
+
transition: opacity 0.2s ease;
|
|
31
|
+
}
|
|
32
|
+
.embed-loader__spin {
|
|
33
|
+
width: 34px; height: 34px; border-radius: 50%;
|
|
34
|
+
border: 3px solid rgba(255, 255, 255, 0.16);
|
|
35
|
+
border-top-color: rgba(255, 255, 255, 0.85);
|
|
36
|
+
animation: embed-spin 0.8s linear infinite;
|
|
37
|
+
}
|
|
38
|
+
@keyframes embed-spin {
|
|
39
|
+
to { transform: rotate(360deg); }
|
|
40
|
+
}
|
|
41
|
+
</style>
|
|
42
|
+
</head>
|
|
43
|
+
<body>
|
|
44
|
+
<div id="app"></div>
|
|
45
|
+
<div id="loader" class="embed-loader embed-loader--on"><div class="embed-loader__spin"></div></div>
|
|
46
|
+
<script type="module" src="/src/embed.ts"></script>
|
|
47
|
+
</body>
|
|
48
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lecodes-viewer",
|
|
3
|
+
"version": "0.19.0",
|
|
4
|
+
"main": "src/createViewer.ts",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"lecodes-renderer": "workspace:*",
|
|
7
|
+
"ogl": "^1.0.11",
|
|
8
|
+
"lecodes-viewer-lite": "workspace:*"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "vite",
|
|
12
|
+
"build": "vue-tsc -b && vite build",
|
|
13
|
+
"preview": "vite preview",
|
|
14
|
+
"test": "bun test",
|
|
15
|
+
"build:embed": "vite build -c vite.embed.config.ts",
|
|
16
|
+
"anim:check": "node anim-check/run.mjs",
|
|
17
|
+
"physics:check": "node physics-check/run.mjs",
|
|
18
|
+
"prepublishOnly": "bun run build:embed"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"pngjs": "^7.0.0",
|
|
22
|
+
"typescript": "~5.8.3",
|
|
23
|
+
"vite": "^6.3.5"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"files": [
|
|
27
|
+
"src",
|
|
28
|
+
"dist-embed",
|
|
29
|
+
"embed.html",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Package entry. The real machinery lives in host.ts (`createHost` — engine bring-up — and
|
|
2
|
+
// `host.run` — bundle execution); `mountCreator` is the one-shot wrapper that derives the engine
|
|
3
|
+
// mode from the compiler's header directives and runs a single bundle, returning the shape the
|
|
4
|
+
// Simulator and embed have always used.
|
|
5
|
+
|
|
6
|
+
import { createHost, type CreatorMethods, type EngineMode, type UIFactory } from './host'
|
|
7
|
+
import { parseFontsHeader } from './utils/fonts'
|
|
8
|
+
import { createUI } from './ui/createUI'
|
|
9
|
+
import type { SafeAreaSpec } from './ui/safeAreaSpec'
|
|
10
|
+
import type { PreviewError } from './sourcemapError'
|
|
11
|
+
|
|
12
|
+
export { createViewer } from './viewer/createViewer'
|
|
13
|
+
export { createHost } from './host'
|
|
14
|
+
// The shared buffer registry's read half (one instance with viewer-lite — utils/fetch re-exports
|
|
15
|
+
// it): how a host consumer retrieves `_creator.captureImage`'s PNG bytes by bufferId.
|
|
16
|
+
export { getBuffer } from './utils/fetch'
|
|
17
|
+
// KTX2 as a picture (the lite engine's basis transcoder, no GPU) — asset thumbnails in the editors
|
|
18
|
+
export { decodeKtx2Image, isKtx2Bytes } from 'lecodes-viewer-lite/src/gl/decoders'
|
|
19
|
+
export type { CreatorMethods, EngineMode, Host, HostOptions, Run, RunOptions, UIFactory } from './host'
|
|
20
|
+
export type { PreviewError, MappedFrame } from './sourcemapError'
|
|
21
|
+
export { createCanvasUIRenderer } from './ui/mountCanvasUI'
|
|
22
|
+
export { createBareUI } from './ui/createBareUI'
|
|
23
|
+
export type { SafeAreaEdge, SafeAreaSpec } from './ui/safeAreaSpec'
|
|
24
|
+
|
|
25
|
+
export type MountOptions = {
|
|
26
|
+
// Override the measurement fonts to force-load before the first layout (default: the vendored
|
|
27
|
+
// variable Roboto — one face, all weights).
|
|
28
|
+
fonts?: string[]
|
|
29
|
+
// Called when the previewed bundle throws, with the error mapped back to original source.
|
|
30
|
+
onError?: (error: PreviewError) => void
|
|
31
|
+
// Override the 3D engine choice: 'gl-lite' runs 3D through the lightweight WebGL2 engine
|
|
32
|
+
// (viewer-lite) instead of the Filament wasm. Only applied when the header directives resolve to
|
|
33
|
+
// a plain 3D project ('gl') — 2D/dual/defer projects keep their derived mode.
|
|
34
|
+
engine?: EngineMode
|
|
35
|
+
// Device-emulation safe-area override (the Simulator's iOS/Android shells) — pins the insets
|
|
36
|
+
// per orientation and declares system-bar edges. Absent = the neutral web defaults.
|
|
37
|
+
safeArea?: SafeAreaSpec
|
|
38
|
+
// app.setOrientation sink: the embedder rotates its device frame ("landscape" | "portrait" |
|
|
39
|
+
// "auto"). Absent = best-effort screen.orientation.lock on the page (see createUtils).
|
|
40
|
+
onOrientation?: (mode: string) => void
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const mountCreator = async (
|
|
44
|
+
root: HTMLElement,
|
|
45
|
+
userCode = "",
|
|
46
|
+
methods?: Partial<CreatorMethods>,
|
|
47
|
+
uiFactory: UIFactory = createUI,
|
|
48
|
+
options: MountOptions = {},
|
|
49
|
+
) => {
|
|
50
|
+
|
|
51
|
+
// Wide enough for a `// fonts:` line with several faces (URLs make it the longest header line).
|
|
52
|
+
const header = userCode.slice(0, 2000)
|
|
53
|
+
const preloads = new Set<string>()
|
|
54
|
+
const preload = header.match(/\/\/ preload: (.+)/)
|
|
55
|
+
if (preload) {
|
|
56
|
+
for (let item of preload[1].split(";")) {
|
|
57
|
+
preloads.add(item)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Engine directives are emitted by the compiler (backend compileProject.ts / lecodes-cli) from the
|
|
62
|
+
// project's code. `// gl: disable|defer` controls the 3D Filament engine; `// 2d: enable` selects
|
|
63
|
+
// the lightweight creator-2d engine. A project with both engines is "dual" (switchable Scene /
|
|
64
|
+
// Scene2D, one canvas each — a single WebGL2 context can't serve both).
|
|
65
|
+
const deferEngine = header.includes("// gl: disable") || header.includes("// gl: defer")
|
|
66
|
+
const glEnabled = !header.includes("// gl: disable")
|
|
67
|
+
const is2d = header.includes("// 2d: enable")
|
|
68
|
+
|
|
69
|
+
let engine: EngineMode =
|
|
70
|
+
is2d && glEnabled ? 'dual'
|
|
71
|
+
: is2d ? '2d'
|
|
72
|
+
: deferEngine ? 'defer'
|
|
73
|
+
: 'gl'
|
|
74
|
+
if (options.engine === 'gl-lite') {
|
|
75
|
+
if (engine === 'gl') engine = 'gl-lite'
|
|
76
|
+
else console.warn(`[le.codes] engine override 'gl-lite' ignored — project resolves to '${engine}'`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const host = await createHost(root, {
|
|
80
|
+
engine,
|
|
81
|
+
ui: uiFactory,
|
|
82
|
+
fonts: options.fonts,
|
|
83
|
+
bootFonts: parseFontsHeader(header),
|
|
84
|
+
preloads,
|
|
85
|
+
methods,
|
|
86
|
+
safeArea: options.safeArea,
|
|
87
|
+
onOrientation: options.onOrientation,
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
const run = host.run(userCode, { onError: options.onError })
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
_creator: host._creator,
|
|
94
|
+
_creator2d: host._creator2d,
|
|
95
|
+
_creatorUI: host._creatorUI,
|
|
96
|
+
_creatorUtils: host._creatorUtils,
|
|
97
|
+
result: run.result,
|
|
98
|
+
destroy() {
|
|
99
|
+
run.dispose()
|
|
100
|
+
host.destroy()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|