worldorbit 2.6.0 → 3.0.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 (196) hide show
  1. package/README.md +12 -5
  2. package/dist/browser/core/dist/atlas-edit.d.ts +11 -0
  3. package/dist/browser/core/dist/atlas-edit.js +347 -0
  4. package/dist/browser/core/dist/atlas-utils.d.ts +22 -0
  5. package/dist/browser/core/dist/atlas-utils.js +189 -0
  6. package/dist/browser/core/dist/atlas-validate.d.ts +2 -0
  7. package/dist/browser/core/dist/atlas-validate.js +488 -0
  8. package/dist/browser/core/dist/diagnostics.d.ts +10 -0
  9. package/dist/browser/core/dist/diagnostics.js +109 -0
  10. package/dist/browser/core/dist/draft-parse.d.ts +3 -0
  11. package/dist/browser/core/dist/draft-parse.js +1654 -0
  12. package/dist/browser/core/dist/draft.d.ts +21 -0
  13. package/dist/browser/core/dist/draft.js +482 -0
  14. package/dist/browser/core/dist/errors.d.ts +7 -0
  15. package/dist/browser/core/dist/errors.js +16 -0
  16. package/dist/browser/core/dist/format.d.ts +4 -0
  17. package/dist/browser/core/dist/format.js +613 -0
  18. package/dist/browser/core/dist/index.d.ts +29 -0
  19. package/dist/browser/core/dist/index.js +35 -6542
  20. package/dist/browser/core/dist/load.d.ts +4 -0
  21. package/dist/browser/core/dist/load.js +182 -0
  22. package/dist/browser/core/dist/markdown.d.ts +2 -0
  23. package/dist/browser/core/dist/markdown.js +37 -0
  24. package/dist/browser/core/dist/normalize.d.ts +2 -0
  25. package/dist/browser/core/dist/normalize.js +312 -0
  26. package/dist/browser/core/dist/parse.d.ts +2 -0
  27. package/dist/browser/core/dist/parse.js +133 -0
  28. package/dist/browser/core/dist/scene.d.ts +3 -0
  29. package/dist/browser/core/dist/scene.js +1901 -0
  30. package/dist/browser/core/dist/schema.d.ts +8 -0
  31. package/dist/browser/core/dist/schema.js +298 -0
  32. package/dist/browser/core/dist/spatial-scene.d.ts +3 -0
  33. package/dist/browser/core/dist/spatial-scene.js +420 -0
  34. package/dist/browser/core/dist/tokenize.d.ts +4 -0
  35. package/dist/browser/core/dist/tokenize.js +68 -0
  36. package/dist/browser/core/dist/types.d.ts +637 -0
  37. package/dist/browser/core/dist/types.js +1 -0
  38. package/dist/browser/core/dist/validate.d.ts +2 -0
  39. package/dist/browser/core/dist/validate.js +56 -0
  40. package/dist/browser/editor/dist/editor.d.ts +2 -0
  41. package/dist/browser/editor/dist/editor.js +3700 -0
  42. package/dist/browser/editor/dist/index.d.ts +2 -0
  43. package/dist/browser/editor/dist/index.js +1 -12250
  44. package/dist/browser/editor/dist/types.d.ts +59 -0
  45. package/dist/browser/editor/dist/types.js +1 -0
  46. package/dist/browser/markdown/dist/html.d.ts +3 -0
  47. package/dist/browser/markdown/dist/html.js +64 -0
  48. package/dist/browser/markdown/dist/index.d.ts +4 -0
  49. package/dist/browser/markdown/dist/index.js +3 -6179
  50. package/dist/browser/markdown/dist/rehype.d.ts +10 -0
  51. package/dist/browser/markdown/dist/rehype.js +49 -0
  52. package/dist/browser/markdown/dist/remark.d.ts +9 -0
  53. package/dist/browser/markdown/dist/remark.js +28 -0
  54. package/dist/browser/markdown/dist/types.d.ts +11 -0
  55. package/dist/browser/markdown/dist/types.js +1 -0
  56. package/dist/browser/viewer/dist/atlas-state.d.ts +12 -0
  57. package/dist/browser/viewer/dist/atlas-state.js +269 -0
  58. package/dist/browser/viewer/dist/atlas-viewer.d.ts +2 -0
  59. package/dist/browser/viewer/dist/atlas-viewer.js +495 -0
  60. package/dist/browser/viewer/dist/custom-element.d.ts +1 -0
  61. package/dist/browser/viewer/dist/custom-element.js +78 -0
  62. package/dist/browser/viewer/dist/embed.d.ts +24 -0
  63. package/dist/browser/viewer/dist/embed.js +172 -0
  64. package/dist/browser/viewer/dist/errors.d.ts +6 -0
  65. package/dist/browser/viewer/dist/errors.js +12 -0
  66. package/dist/browser/viewer/dist/index.d.ts +10 -0
  67. package/dist/browser/viewer/dist/index.js +9 -8334
  68. package/dist/browser/viewer/dist/minimap.d.ts +3 -0
  69. package/dist/browser/viewer/dist/minimap.js +63 -0
  70. package/dist/browser/viewer/dist/render.d.ts +6 -0
  71. package/dist/browser/viewer/dist/render.js +670 -0
  72. package/dist/browser/viewer/dist/runtime-3d.d.ts +19 -0
  73. package/dist/browser/viewer/dist/runtime-3d.js +494 -0
  74. package/dist/browser/viewer/dist/theme.d.ts +4 -0
  75. package/dist/browser/viewer/dist/theme.js +103 -0
  76. package/dist/browser/viewer/dist/tooltip.d.ts +3 -0
  77. package/dist/browser/viewer/dist/tooltip.js +198 -0
  78. package/dist/browser/viewer/dist/types.d.ts +292 -0
  79. package/dist/browser/viewer/dist/types.js +1 -0
  80. package/dist/browser/viewer/dist/vendor/three.module.js +53032 -0
  81. package/dist/browser/viewer/dist/viewer-state.d.ts +19 -0
  82. package/dist/browser/viewer/dist/viewer-state.js +162 -0
  83. package/dist/browser/viewer/dist/viewer.d.ts +2 -0
  84. package/dist/browser/viewer/dist/viewer.js +1662 -0
  85. package/dist/unpkg/core/dist/atlas-edit.d.ts +11 -0
  86. package/dist/unpkg/core/dist/atlas-edit.js +347 -0
  87. package/dist/unpkg/core/dist/atlas-utils.d.ts +22 -0
  88. package/dist/unpkg/core/dist/atlas-utils.js +189 -0
  89. package/dist/unpkg/core/dist/atlas-validate.d.ts +2 -0
  90. package/dist/unpkg/core/dist/atlas-validate.js +488 -0
  91. package/dist/unpkg/core/dist/diagnostics.d.ts +10 -0
  92. package/dist/unpkg/core/dist/diagnostics.js +109 -0
  93. package/dist/unpkg/core/dist/draft-parse.d.ts +3 -0
  94. package/dist/unpkg/core/dist/draft-parse.js +1654 -0
  95. package/dist/unpkg/core/dist/draft.d.ts +21 -0
  96. package/dist/unpkg/core/dist/draft.js +482 -0
  97. package/dist/unpkg/core/dist/errors.d.ts +7 -0
  98. package/dist/unpkg/core/dist/errors.js +16 -0
  99. package/dist/unpkg/core/dist/format.d.ts +4 -0
  100. package/dist/unpkg/core/dist/format.js +613 -0
  101. package/dist/unpkg/core/dist/index.d.ts +29 -0
  102. package/dist/unpkg/core/dist/index.js +35 -6614
  103. package/dist/unpkg/core/dist/load.d.ts +4 -0
  104. package/dist/unpkg/core/dist/load.js +182 -0
  105. package/dist/unpkg/core/dist/markdown.d.ts +2 -0
  106. package/dist/unpkg/core/dist/markdown.js +37 -0
  107. package/dist/unpkg/core/dist/normalize.d.ts +2 -0
  108. package/dist/unpkg/core/dist/normalize.js +312 -0
  109. package/dist/unpkg/core/dist/parse.d.ts +2 -0
  110. package/dist/unpkg/core/dist/parse.js +133 -0
  111. package/dist/unpkg/core/dist/scene.d.ts +3 -0
  112. package/dist/unpkg/core/dist/scene.js +1901 -0
  113. package/dist/unpkg/core/dist/schema.d.ts +8 -0
  114. package/dist/unpkg/core/dist/schema.js +298 -0
  115. package/dist/unpkg/core/dist/spatial-scene.d.ts +3 -0
  116. package/dist/unpkg/core/dist/spatial-scene.js +420 -0
  117. package/dist/unpkg/core/dist/tokenize.d.ts +4 -0
  118. package/dist/unpkg/core/dist/tokenize.js +68 -0
  119. package/dist/unpkg/core/dist/types.d.ts +637 -0
  120. package/dist/unpkg/core/dist/types.js +1 -0
  121. package/dist/unpkg/core/dist/validate.d.ts +2 -0
  122. package/dist/unpkg/core/dist/validate.js +56 -0
  123. package/dist/unpkg/editor/dist/editor.d.ts +2 -0
  124. package/dist/unpkg/editor/dist/editor.js +3700 -0
  125. package/dist/unpkg/editor/dist/index.d.ts +2 -0
  126. package/dist/unpkg/editor/dist/index.js +1 -12275
  127. package/dist/unpkg/editor/dist/types.d.ts +59 -0
  128. package/dist/unpkg/editor/dist/types.js +1 -0
  129. package/dist/unpkg/markdown/dist/html.d.ts +3 -0
  130. package/dist/unpkg/markdown/dist/html.js +64 -0
  131. package/dist/unpkg/markdown/dist/index.d.ts +4 -0
  132. package/dist/unpkg/markdown/dist/index.js +3 -6207
  133. package/dist/unpkg/markdown/dist/rehype.d.ts +10 -0
  134. package/dist/unpkg/markdown/dist/rehype.js +49 -0
  135. package/dist/unpkg/markdown/dist/remark.d.ts +9 -0
  136. package/dist/unpkg/markdown/dist/remark.js +28 -0
  137. package/dist/unpkg/markdown/dist/types.d.ts +11 -0
  138. package/dist/unpkg/markdown/dist/types.js +1 -0
  139. package/dist/unpkg/viewer/dist/atlas-state.d.ts +12 -0
  140. package/dist/unpkg/viewer/dist/atlas-state.js +269 -0
  141. package/dist/unpkg/viewer/dist/atlas-viewer.d.ts +2 -0
  142. package/dist/unpkg/viewer/dist/atlas-viewer.js +495 -0
  143. package/dist/unpkg/viewer/dist/custom-element.d.ts +1 -0
  144. package/dist/unpkg/viewer/dist/custom-element.js +78 -0
  145. package/dist/unpkg/viewer/dist/embed.d.ts +24 -0
  146. package/dist/unpkg/viewer/dist/embed.js +172 -0
  147. package/dist/unpkg/viewer/dist/errors.d.ts +6 -0
  148. package/dist/unpkg/viewer/dist/errors.js +12 -0
  149. package/dist/unpkg/viewer/dist/index.d.ts +10 -0
  150. package/dist/unpkg/viewer/dist/index.js +9 -8391
  151. package/dist/unpkg/viewer/dist/minimap.d.ts +3 -0
  152. package/dist/unpkg/viewer/dist/minimap.js +63 -0
  153. package/dist/unpkg/viewer/dist/render.d.ts +6 -0
  154. package/dist/unpkg/viewer/dist/render.js +670 -0
  155. package/dist/unpkg/viewer/dist/runtime-3d.d.ts +19 -0
  156. package/dist/unpkg/viewer/dist/runtime-3d.js +494 -0
  157. package/dist/unpkg/viewer/dist/theme.d.ts +4 -0
  158. package/dist/unpkg/viewer/dist/theme.js +103 -0
  159. package/dist/unpkg/viewer/dist/tooltip.d.ts +3 -0
  160. package/dist/unpkg/viewer/dist/tooltip.js +198 -0
  161. package/dist/unpkg/viewer/dist/types.d.ts +292 -0
  162. package/dist/unpkg/viewer/dist/types.js +1 -0
  163. package/dist/unpkg/viewer/dist/vendor/three.module.js +53032 -0
  164. package/dist/unpkg/viewer/dist/viewer-state.d.ts +19 -0
  165. package/dist/unpkg/viewer/dist/viewer-state.js +162 -0
  166. package/dist/unpkg/viewer/dist/viewer.d.ts +2 -0
  167. package/dist/unpkg/viewer/dist/viewer.js +1662 -0
  168. package/dist/unpkg/worldorbit-core.min.js +1 -12
  169. package/dist/unpkg/worldorbit-editor.min.js +1 -904
  170. package/dist/unpkg/worldorbit-markdown.min.js +1 -103
  171. package/dist/unpkg/worldorbit-viewer.min.js +1 -259
  172. package/dist/unpkg/worldorbit.js +2 -9704
  173. package/dist/unpkg/worldorbit.min.js +2 -263
  174. package/package.json +1 -1
  175. package/packages/core/dist/index.d.ts +1 -0
  176. package/packages/core/dist/index.js +1 -0
  177. package/packages/core/dist/spatial-scene.d.ts +3 -0
  178. package/packages/core/dist/spatial-scene.js +420 -0
  179. package/packages/core/dist/types.d.ts +105 -0
  180. package/packages/editor/dist/editor.js +25 -4
  181. package/packages/editor/dist/types.d.ts +4 -0
  182. package/packages/markdown/dist/html.js +10 -3
  183. package/packages/viewer/dist/atlas-state.js +3 -0
  184. package/packages/viewer/dist/atlas-viewer.js +1 -0
  185. package/packages/viewer/dist/custom-element.js +18 -4
  186. package/packages/viewer/dist/embed.d.ts +5 -1
  187. package/packages/viewer/dist/embed.js +58 -24
  188. package/packages/viewer/dist/errors.d.ts +6 -0
  189. package/packages/viewer/dist/errors.js +12 -0
  190. package/packages/viewer/dist/index.d.ts +1 -0
  191. package/packages/viewer/dist/index.js +1 -0
  192. package/packages/viewer/dist/runtime-3d.d.ts +19 -0
  193. package/packages/viewer/dist/runtime-3d.js +494 -0
  194. package/packages/viewer/dist/types.d.ts +21 -2
  195. package/packages/viewer/dist/vendor/three.module.js +53032 -0
  196. package/packages/viewer/dist/viewer.js +501 -41
@@ -1,11 +1,17 @@
1
- import { loadWorldOrbitSource, renderDocumentToScene, } from "@worldorbit/core";
1
+ import { loadWorldOrbitSource, renderDocumentToScene, renderDocumentToSpatialScene, } from "@worldorbit/core";
2
2
  import { createEmbedPayload, createWorldOrbitEmbedMarkup, renderSceneToSvg, } from "@worldorbit/viewer";
3
3
  export function renderWorldOrbitBlock(source, options = {}) {
4
4
  try {
5
5
  const loaded = loadWorldOrbitSource(source);
6
6
  const scene = renderDocumentToScene(loaded.document, resolveSourceRenderOptions(loaded, options));
7
- if ((options.mode ?? "static") === "interactive") {
8
- return createWorldOrbitEmbedMarkup(createEmbedPayload(scene, "interactive", {
7
+ const mode = options.mode ?? "static";
8
+ if (mode === "interactive" || mode === "interactive-2d" || mode === "interactive-3d") {
9
+ const normalizedMode = mode === "interactive" ? "interactive-2d" : mode;
10
+ return createWorldOrbitEmbedMarkup(createEmbedPayload(scene, normalizedMode, {
11
+ spatialScene: normalizedMode === "interactive-3d"
12
+ ? renderDocumentToSpatialScene(loaded.document, resolveSourceRenderOptions(loaded, options))
13
+ : undefined,
14
+ viewMode: normalizedMode === "interactive-3d" ? "3d" : "2d",
9
15
  initialViewpointId: options.initialViewpointId,
10
16
  initialSelectionObjectId: options.initialSelectionObjectId,
11
17
  initialFilter: options.initialFilter ?? null,
@@ -17,6 +23,7 @@ export function renderWorldOrbitBlock(source, options = {}) {
17
23
  layers: options.layers,
18
24
  subtitle: options.subtitle,
19
25
  preset: options.preset,
26
+ viewMode: normalizedMode === "interactive-3d" ? "3d" : "2d",
20
27
  initialViewpointId: options.initialViewpointId,
21
28
  initialSelectionObjectId: options.initialSelectionObjectId,
22
29
  initialFilter: options.initialFilter ?? null,
@@ -73,6 +73,7 @@ export function createAtlasStateSnapshot(viewerState, renderOptions, filter, vie
73
73
  layers: renderOptions.layers ? { ...renderOptions.layers } : undefined,
74
74
  scaleModel: renderOptions.scaleModel ? { ...renderOptions.scaleModel } : undefined,
75
75
  activeEventId: renderOptions.activeEventId ?? null,
76
+ viewMode: renderOptions.viewMode ?? "2d",
76
77
  },
77
78
  filter: normalizeViewerFilter(filter),
78
79
  };
@@ -102,6 +103,7 @@ export function deserializeViewerAtlasState(serialized) {
102
103
  ? { ...raw.renderOptions.scaleModel }
103
104
  : undefined,
104
105
  activeEventId: raw.activeEventId ?? raw.renderOptions?.activeEventId ?? null,
106
+ viewMode: raw.renderOptions?.viewMode ?? "2d",
105
107
  },
106
108
  filter: normalizeViewerFilter(raw.filter ?? null),
107
109
  };
@@ -125,6 +127,7 @@ export function createViewerBookmark(name, label, atlasState) {
125
127
  ? { ...atlasState.renderOptions.scaleModel }
126
128
  : undefined,
127
129
  activeEventId: atlasState.renderOptions.activeEventId ?? null,
130
+ viewMode: atlasState.renderOptions.viewMode ?? "2d",
128
131
  },
129
132
  filter: atlasState.filter ? { ...atlasState.filter } : null,
130
133
  },
@@ -480,6 +480,7 @@ function cloneBookmark(bookmark) {
480
480
  scaleModel: bookmark.atlasState.renderOptions.scaleModel
481
481
  ? { ...bookmark.atlasState.renderOptions.scaleModel }
482
482
  : undefined,
483
+ viewMode: bookmark.atlasState.renderOptions.viewMode ?? "2d",
483
484
  },
484
485
  filter: bookmark.atlasState.filter ? { ...bookmark.atlasState.filter } : null,
485
486
  },
@@ -1,4 +1,6 @@
1
1
  import { loadWorldOrbitSource, renderDocumentToScene, } from "@worldorbit/core";
2
+ import { WorldOrbit3DUnavailableError } from "./errors.js";
3
+ import { render3DUnavailableMarkup } from "./embed.js";
2
4
  import { renderSceneToSvg } from "./render.js";
3
5
  import { createAtlasViewer } from "./atlas-viewer.js";
4
6
  import { createInteractiveViewer } from "./viewer.js";
@@ -51,10 +53,22 @@ export function defineWorldOrbitViewerElement(tagName = "worldorbit-viewer") {
51
53
  });
52
54
  return;
53
55
  }
54
- this.viewer = createInteractiveViewer(this, {
55
- scene,
56
- theme,
57
- });
56
+ try {
57
+ this.viewer = createInteractiveViewer(this, {
58
+ source,
59
+ theme,
60
+ viewMode: mode === "interactive-3d"
61
+ ? "3d"
62
+ : "2d",
63
+ });
64
+ }
65
+ catch (error) {
66
+ if (error instanceof WorldOrbit3DUnavailableError && mode === "interactive-3d") {
67
+ this.innerHTML = render3DUnavailableMarkup(error.message);
68
+ return;
69
+ }
70
+ throw error;
71
+ }
58
72
  }
59
73
  }
60
74
  customElements.define(tagName, WorldOrbitViewerElement);
@@ -1,8 +1,10 @@
1
- import type { RenderScene } from "@worldorbit/core";
1
+ import type { RenderScene, SpatialScene } from "@worldorbit/core";
2
2
  import type { MountedWorldOrbitEmbeds, MountWorldOrbitEmbedsOptions, ViewerAtlasState, ViewerFilter, WorldOrbitEmbedPayload } from "./types.js";
3
3
  export declare function serializeWorldOrbitEmbedPayload(payload: WorldOrbitEmbedPayload): string;
4
4
  export declare function deserializeWorldOrbitEmbedPayload(serialized: string): WorldOrbitEmbedPayload;
5
5
  export declare function createEmbedPayload(scene: RenderScene, mode: WorldOrbitEmbedPayload["mode"], options?: {
6
+ spatialScene?: SpatialScene;
7
+ viewMode?: "2d" | "3d";
6
8
  initialViewpointId?: string;
7
9
  initialSelectionObjectId?: string;
8
10
  initialFilter?: ViewerFilter | null;
@@ -11,6 +13,7 @@ export declare function createEmbedPayload(scene: RenderScene, mode: WorldOrbitE
11
13
  }): WorldOrbitEmbedPayload;
12
14
  export declare function createWorldOrbitEmbedMarkup(payload: WorldOrbitEmbedPayload, options?: Pick<MountWorldOrbitEmbedsOptions, "theme" | "layers" | "subtitle" | "preset"> & {
13
15
  className?: string;
16
+ viewMode?: "2d" | "3d";
14
17
  initialViewpointId?: string;
15
18
  initialSelectionObjectId?: string;
16
19
  initialFilter?: ViewerFilter | null;
@@ -18,3 +21,4 @@ export declare function createWorldOrbitEmbedMarkup(payload: WorldOrbitEmbedPayl
18
21
  minimap?: boolean;
19
22
  }): string;
20
23
  export declare function mountWorldOrbitEmbeds(root?: ParentNode, options?: MountWorldOrbitEmbedsOptions): MountedWorldOrbitEmbeds;
24
+ export declare function render3DUnavailableMarkup(message: string): string;
@@ -1,3 +1,4 @@
1
+ import { WorldOrbit3DUnavailableError } from "./errors.js";
1
2
  import { renderSceneToSvg } from "./render.js";
2
3
  import { createInteractiveViewer } from "./viewer.js";
3
4
  const EMBED_SELECTOR = "[data-worldorbit-embed]";
@@ -8,11 +9,13 @@ export function deserializeWorldOrbitEmbedPayload(serialized) {
8
9
  const raw = JSON.parse(decodeURIComponent(serialized));
9
10
  return {
10
11
  version: "2.0",
11
- mode: raw.mode ?? "interactive",
12
+ mode: normalizeEmbedMode(raw.mode),
12
13
  scene: raw.scene,
14
+ spatialScene: raw.spatialScene ?? undefined,
13
15
  options: raw.options
14
16
  ? {
15
17
  ...raw.options,
18
+ viewMode: raw.options.viewMode ?? embedModeToViewMode(normalizeEmbedMode(raw.mode)),
16
19
  initialFilter: raw.options.initialFilter ?? null,
17
20
  atlasState: raw.options.atlasState ?? null,
18
21
  }
@@ -22,9 +25,11 @@ export function deserializeWorldOrbitEmbedPayload(serialized) {
22
25
  export function createEmbedPayload(scene, mode, options = {}) {
23
26
  return {
24
27
  version: "2.0",
25
- mode,
28
+ mode: normalizeEmbedMode(mode),
26
29
  scene,
30
+ spatialScene: options.spatialScene,
27
31
  options: {
32
+ viewMode: options.viewMode ?? embedModeToViewMode(normalizeEmbedMode(mode)),
28
33
  initialViewpointId: options.initialViewpointId,
29
34
  initialSelectionObjectId: options.initialSelectionObjectId,
30
35
  initialFilter: options.initialFilter ?? null,
@@ -42,6 +47,7 @@ export function createWorldOrbitEmbedMarkup(payload, options = {}) {
42
47
  layers: options.layers ?? payload.options?.layers,
43
48
  subtitle: options.subtitle ?? payload.options?.subtitle,
44
49
  preset: options.preset ?? payload.options?.preset,
50
+ viewMode: options.viewMode ?? payload.options?.viewMode ?? embedModeToViewMode(normalizeEmbedMode(payload.mode)),
45
51
  initialViewpointId: options.initialViewpointId ?? payload.options?.initialViewpointId,
46
52
  initialSelectionObjectId: options.initialSelectionObjectId ?? payload.options?.initialSelectionObjectId,
47
53
  initialFilter: options.initialFilter ?? payload.options?.initialFilter ?? null,
@@ -57,14 +63,14 @@ export function createWorldOrbitEmbedMarkup(payload, options = {}) {
57
63
  subtitle: mergedPayload.options?.subtitle,
58
64
  preset: mergedPayload.options?.preset,
59
65
  });
60
- return `<div class="${escapeAttribute(options.className ?? "worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${payload.mode}" data-worldorbit-preset="${escapeAttribute(mergedPayload.options?.preset ?? payload.scene.renderPreset ?? "custom")}" data-worldorbit-viewpoint="${escapeAttribute(mergedPayload.options?.initialViewpointId ?? "")}" data-worldorbit-payload="${escapeAttribute(serializeWorldOrbitEmbedPayload(mergedPayload))}">${html}</div>`;
66
+ return `<div class="${escapeAttribute(options.className ?? "worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${mergedPayload.mode}" data-worldorbit-preset="${escapeAttribute(mergedPayload.options?.preset ?? payload.scene.renderPreset ?? "custom")}" data-worldorbit-viewpoint="${escapeAttribute(mergedPayload.options?.initialViewpointId ?? "")}" data-worldorbit-payload="${escapeAttribute(serializeWorldOrbitEmbedPayload(mergedPayload))}">${html}</div>`;
61
67
  }
62
68
  export function mountWorldOrbitEmbeds(root = document, options = {}) {
63
69
  const viewers = new Map();
64
70
  const elements = [...root.querySelectorAll(EMBED_SELECTOR)];
65
71
  for (const element of elements) {
66
72
  const payload = deserializePayloadFromElement(element);
67
- const mode = options.mode ?? payload.mode;
73
+ const mode = normalizeEmbedMode(options.mode ?? payload.mode);
68
74
  const theme = options.theme ?? payload.options?.theme;
69
75
  const layers = options.layers ?? payload.options?.layers;
70
76
  const subtitle = options.subtitle ?? payload.options?.subtitle;
@@ -73,27 +79,43 @@ export function mountWorldOrbitEmbeds(root = document, options = {}) {
73
79
  const initialViewpointId = options.viewer?.initialViewpointId ?? payload.options?.initialViewpointId;
74
80
  const initialSelectionObjectId = options.viewer?.initialSelectionObjectId ?? payload.options?.initialSelectionObjectId;
75
81
  const minimap = options.viewer?.minimap ?? payload.options?.minimap;
76
- if (mode === "interactive") {
77
- const viewer = createInteractiveViewer(element, {
78
- ...options.viewer,
79
- scene: payload.scene,
80
- width: options.width ?? payload.scene.width,
81
- height: options.height ?? payload.scene.height,
82
- padding: options.padding ?? payload.scene.padding,
83
- preset,
84
- theme,
85
- layers,
86
- subtitle,
87
- initialFilter,
88
- initialViewpointId,
89
- initialSelectionObjectId,
90
- minimap,
91
- });
92
- if (payload.options?.atlasState) {
93
- viewer.setAtlasState(payload.options.atlasState);
82
+ const viewMode = options.viewer?.viewMode ??
83
+ payload.options?.viewMode ??
84
+ embedModeToViewMode(mode);
85
+ if (mode === "interactive-2d" || mode === "interactive-3d") {
86
+ try {
87
+ const viewer = createInteractiveViewer(element, {
88
+ ...options.viewer,
89
+ scene: payload.scene,
90
+ spatialScene: payload.spatialScene,
91
+ width: options.width ?? payload.scene.width,
92
+ height: options.height ?? payload.scene.height,
93
+ padding: options.padding ?? payload.scene.padding,
94
+ preset,
95
+ theme,
96
+ layers,
97
+ subtitle,
98
+ viewMode,
99
+ initialFilter,
100
+ initialViewpointId,
101
+ initialSelectionObjectId,
102
+ minimap,
103
+ });
104
+ if (payload.options?.atlasState) {
105
+ viewer.setAtlasState(payload.options.atlasState);
106
+ }
107
+ viewers.set(element, viewer);
108
+ options.onMount?.(viewer, element);
109
+ }
110
+ catch (error) {
111
+ if (error instanceof WorldOrbit3DUnavailableError && mode === "interactive-3d") {
112
+ element.innerHTML = render3DUnavailableMarkup(error.message);
113
+ options.onMount?.(null, element);
114
+ }
115
+ else {
116
+ throw error;
117
+ }
94
118
  }
95
- viewers.set(element, viewer);
96
- options.onMount?.(viewer, element);
97
119
  }
98
120
  else {
99
121
  element.innerHTML = renderSceneToSvg(payload.scene, {
@@ -136,3 +158,15 @@ function escapeAttribute(value) {
136
158
  .replaceAll(">", "&gt;")
137
159
  .replaceAll("\"", "&quot;");
138
160
  }
161
+ function normalizeEmbedMode(mode) {
162
+ if (!mode || mode === "interactive") {
163
+ return "interactive-2d";
164
+ }
165
+ return mode;
166
+ }
167
+ function embedModeToViewMode(mode) {
168
+ return mode === "interactive-3d" ? "3d" : "2d";
169
+ }
170
+ export function render3DUnavailableMarkup(message) {
171
+ return `<div class="worldorbit-embed-unavailable" data-worldorbit-3d-unavailable="true"><strong>3D unavailable</strong><span>${escapeAttribute(message)}</span></div>`;
172
+ }
@@ -0,0 +1,6 @@
1
+ export declare class WorldOrbitViewerError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class WorldOrbit3DUnavailableError extends WorldOrbitViewerError {
5
+ constructor(message?: string);
6
+ }
@@ -0,0 +1,12 @@
1
+ export class WorldOrbitViewerError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "WorldOrbitViewerError";
5
+ }
6
+ }
7
+ export class WorldOrbit3DUnavailableError extends WorldOrbitViewerError {
8
+ constructor(message = "WorldOrbit 3D is unavailable in this environment.") {
9
+ super(message);
10
+ this.name = "WorldOrbit3DUnavailableError";
11
+ }
12
+ }
@@ -1,4 +1,5 @@
1
1
  export type * from "./types.js";
2
+ export { WorldOrbit3DUnavailableError, WorldOrbitViewerError } from "./errors.js";
2
3
  export { getThemePreset, resolveLayers, resolveTheme } from "./theme.js";
3
4
  export { deserializeViewerAtlasState, normalizeViewerFilter, sceneViewpointToLayerOptions, searchSceneObjects, serializeViewerAtlasState, viewpointToViewerFilter, } from "./atlas-state.js";
4
5
  export { DEFAULT_VIEWER_STATE, clampScale, composeViewerTransform, fitViewerState, focusViewerState, getViewerVisibleBounds, invertViewerPoint, getSceneCenter, normalizeRotation, panViewerState, rotateViewerState, zoomViewerStateAt, } from "./viewer-state.js";
@@ -1,3 +1,4 @@
1
+ export { WorldOrbit3DUnavailableError, WorldOrbitViewerError } from "./errors.js";
1
2
  export { getThemePreset, resolveLayers, resolveTheme } from "./theme.js";
2
3
  export { deserializeViewerAtlasState, normalizeViewerFilter, sceneViewpointToLayerOptions, searchSceneObjects, serializeViewerAtlasState, viewpointToViewerFilter, } from "./atlas-state.js";
3
4
  export { DEFAULT_VIEWER_STATE, clampScale, composeViewerTransform, fitViewerState, focusViewerState, getViewerVisibleBounds, invertViewerPoint, getSceneCenter, normalizeRotation, panViewerState, rotateViewerState, zoomViewerStateAt, } from "./viewer-state.js";
@@ -0,0 +1,19 @@
1
+ import { type CoordinatePoint, type SpatialScene } from "@worldorbit/core";
2
+ import type { ViewerRenderOptions, ViewerState } from "./types.js";
3
+ interface Viewer3DRuntimeUpdate {
4
+ spatialScene: SpatialScene;
5
+ renderOptions: ViewerRenderOptions;
6
+ visibleObjectIds: Set<string>;
7
+ selectedObjectId: string | null;
8
+ hoveredObjectId: string | null;
9
+ state: ViewerState;
10
+ timeSeconds: number;
11
+ }
12
+ export interface Viewer3DRuntime {
13
+ update(next: Viewer3DRuntimeUpdate): void;
14
+ hitTest(clientX: number, clientY: number): string | null;
15
+ projectObjectToContainer(objectId: string): CoordinatePoint | null;
16
+ destroy(): void;
17
+ }
18
+ export declare function createViewer3DRuntime(container: HTMLElement): Viewer3DRuntime;
19
+ export {};