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.
Files changed (103) hide show
  1. package/README.md +5 -0
  2. package/dist-embed/VERSION.json +5 -0
  3. package/dist-embed/assets/Roboto-Variable-DHm9jpd-.woff2 +0 -0
  4. package/dist-embed/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  5. package/dist-embed/assets/basis-C64VHDVD.js +1 -0
  6. package/dist-embed/assets/basis_transcoder-VXdx5NbI.wasm +0 -0
  7. package/dist-embed/assets/createViewer2d-D12Wy3VF.js +1 -0
  8. package/dist-embed/assets/createViewerLite-CP-WHGLg.js +707 -0
  9. package/dist-embed/assets/creator-gl-BF2CQzeI.wasm +0 -0
  10. package/dist-embed/assets/creator-gl.js-B_0GrQRe.symbols +5379 -0
  11. package/dist-embed/assets/creator-ui-BX5Fvnbt.js +1 -0
  12. package/dist-embed/assets/creator-ui-CzKHLH2Q.wasm +0 -0
  13. package/dist-embed/assets/creator2d-BtQ-1_B0.wasm +0 -0
  14. package/dist-embed/assets/draco-BiISTFcR.js +118 -0
  15. package/dist-embed/assets/draco_decoder-DsQ12WqX.wasm +0 -0
  16. package/dist-embed/assets/host-CWKB1WDd.js +162 -0
  17. package/dist-embed/assets/index-CIK8PnUA.js +2 -0
  18. package/dist-embed/assets/lit-DUE9rhY9.filamat +0 -0
  19. package/dist-embed/assets/loadCreatorUiNode-UAdhjRTd.js +1 -0
  20. package/dist-embed/assets/neutral_ibl128-D-lzdkLN.ktx +0 -0
  21. package/dist-embed/assets/particles-DxYDmI1O.filamat +0 -0
  22. package/dist-embed/assets/particles-quad-DwYo9yCK.filamat +0 -0
  23. package/dist-embed/assets/shadow-C9xJpqlY.filamat +0 -0
  24. package/dist-embed/assets/uberarchive-uXjRYa9p.bin +0 -0
  25. package/dist-embed/assets/unlit-pe4tFY5b.filamat +0 -0
  26. package/dist-embed/assets/unlit-transparent-D9OyaOBR.filamat +0 -0
  27. package/dist-embed/assets/video-eedvhMvS.filamat +0 -0
  28. package/dist-embed/assets/worker-Caf-yYEI.js +2 -0
  29. package/dist-embed/embed.html +48 -0
  30. package/dist-embed/embed.js +187 -0
  31. package/embed.html +48 -0
  32. package/package.json +35 -0
  33. package/src/assets/banner.png +0 -0
  34. package/src/assets/image2.png +0 -0
  35. package/src/assets/landing.mp4 +0 -0
  36. package/src/assets/neutral_ibl128.ktx +0 -0
  37. package/src/assets/neutral_ibl256.ktx +0 -0
  38. package/src/assets/output.mp4 +0 -0
  39. package/src/assets/output2.mp4 +0 -0
  40. package/src/assets/texture.png +0 -0
  41. package/src/assets/vue.svg +1 -0
  42. package/src/canvas/createCanvasHost.ts +2 -0
  43. package/src/createViewer.ts +103 -0
  44. package/src/embed.ts +515 -0
  45. package/src/host.ts +428 -0
  46. package/src/lite-test.ts +160 -0
  47. package/src/main.ts +77 -0
  48. package/src/sourcemapError.ts +2 -0
  49. package/src/ui/CuiProps.gen.ts +103 -0
  50. package/src/ui/UIScreen.ts +486 -0
  51. package/src/ui/createBareUI.ts +32 -0
  52. package/src/ui/createMeasureSystem.ts +220 -0
  53. package/src/ui/createNodeElement.ts +77 -0
  54. package/src/ui/createPagerSystem.ts +345 -0
  55. package/src/ui/createTouchSystem.ts +2 -0
  56. package/src/ui/createUI.ts +806 -0
  57. package/src/ui/creator-ui.js +14 -0
  58. package/src/ui/creator-ui.wasm +0 -0
  59. package/src/ui/defaultStyle.css +176 -0
  60. package/src/ui/layers.ts +9 -0
  61. package/src/ui/mountCanvasUI.ts +213 -0
  62. package/src/ui/nativeViewSystem.ts +91 -0
  63. package/src/ui/presentPlayer.ts +156 -0
  64. package/src/ui/props-apply.ts +403 -0
  65. package/src/ui/router.ts +2 -0
  66. package/src/ui/safeAreaSpec.ts +3 -0
  67. package/src/ui/shells.ts +37 -0
  68. package/src/ui/toasts.ts +2 -0
  69. package/src/ui/transitions.ts +250 -0
  70. package/src/ui/ui.d.ts +78 -0
  71. package/src/ui/vListSystem.ts +212 -0
  72. package/src/ui/viewScale.ts +2 -0
  73. package/src/utils/animate.ts +2 -0
  74. package/src/utils/createUtils.ts +2 -0
  75. package/src/utils/fetch.ts +3 -0
  76. package/src/utils/fonts.ts +2 -0
  77. package/src/utils/globals.ts +2 -0
  78. package/src/utils/imageNode.ts +260 -0
  79. package/src/utils/openFilePicker.ts +2 -0
  80. package/src/utils/svg.ts +2 -0
  81. package/src/utils/videoNode.ts +2 -0
  82. package/src/utils/ws.ts +2 -0
  83. package/src/viewer/createViewer.ts +993 -0
  84. package/src/viewer/creator-gl.js +14 -0
  85. package/src/viewer/creator-gl.js.symbols +5379 -0
  86. package/src/viewer/creator-gl.wasm +0 -0
  87. package/src/viewer/lit.filamat +0 -0
  88. package/src/viewer/mediaplayer.ts +3 -0
  89. package/src/viewer/particles-quad.filamat +0 -0
  90. package/src/viewer/particles.filamat +0 -0
  91. package/src/viewer/physics.ts +140 -0
  92. package/src/viewer/shadow.filamat +0 -0
  93. package/src/viewer/uberarchive.bin +0 -0
  94. package/src/viewer/unlit-transparent.filamat +0 -0
  95. package/src/viewer/unlit.filamat +0 -0
  96. package/src/viewer/validateGlb.ts +262 -0
  97. package/src/viewer/video.filamat +0 -0
  98. package/src/viewer/wasmCrashSymbolizer.ts +133 -0
  99. package/src/viewer2d/createViewer2d.ts +438 -0
  100. package/src/viewer2d/creator2d.js +14 -0
  101. package/src/viewer2d/creator2d.wasm +0 -0
  102. package/src/viewer2d/sprite2d.ts +80 -0
  103. 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,2 @@
1
+ // Moved to viewer-lite; re-export shim.
2
+ export * from "lecodes-viewer-lite/src/canvas/createCanvasHost"
@@ -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
+ }