worldorbit 2.5.17 → 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 (203) hide show
  1. package/README.md +91 -18
  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 -6101
  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 -11702
  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 -5766
  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 -7901
  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 -6173
  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 -11727
  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 -5794
  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 -7958
  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 -894
  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 -9243
  173. package/dist/unpkg/worldorbit.min.js +2 -263
  174. package/package.json +1 -1
  175. package/packages/core/dist/atlas-edit.js +1 -1
  176. package/packages/core/dist/atlas-validate.js +99 -10
  177. package/packages/core/dist/draft-parse.js +190 -15
  178. package/packages/core/dist/draft.js +50 -11
  179. package/packages/core/dist/format.js +36 -5
  180. package/packages/core/dist/index.d.ts +1 -0
  181. package/packages/core/dist/index.js +1 -0
  182. package/packages/core/dist/load.js +9 -2
  183. package/packages/core/dist/scene.js +158 -24
  184. package/packages/core/dist/spatial-scene.d.ts +3 -0
  185. package/packages/core/dist/spatial-scene.js +420 -0
  186. package/packages/core/dist/types.d.ts +124 -2
  187. package/packages/editor/dist/editor.js +130 -8
  188. package/packages/editor/dist/types.d.ts +4 -0
  189. package/packages/markdown/dist/html.js +10 -3
  190. package/packages/viewer/dist/atlas-state.js +8 -2
  191. package/packages/viewer/dist/atlas-viewer.js +20 -8
  192. package/packages/viewer/dist/custom-element.js +18 -4
  193. package/packages/viewer/dist/embed.d.ts +5 -1
  194. package/packages/viewer/dist/embed.js +58 -24
  195. package/packages/viewer/dist/errors.d.ts +6 -0
  196. package/packages/viewer/dist/errors.js +12 -0
  197. package/packages/viewer/dist/index.d.ts +1 -0
  198. package/packages/viewer/dist/index.js +1 -0
  199. package/packages/viewer/dist/runtime-3d.d.ts +19 -0
  200. package/packages/viewer/dist/runtime-3d.js +494 -0
  201. package/packages/viewer/dist/types.d.ts +25 -3
  202. package/packages/viewer/dist/vendor/three.module.js +53032 -0
  203. package/packages/viewer/dist/viewer.js +517 -41
@@ -0,0 +1,10 @@
1
+ import type { WorldOrbitMarkdownOptions } from "./types.js";
2
+ interface HastNode {
3
+ type: string;
4
+ tagName?: string;
5
+ value?: string;
6
+ properties?: Record<string, unknown>;
7
+ children?: HastNode[];
8
+ }
9
+ export declare function rehypeWorldOrbit(options?: WorldOrbitMarkdownOptions): (tree: HastNode) => void;
10
+ export {};
@@ -0,0 +1,49 @@
1
+ import { renderWorldOrbitBlock } from "./html.js";
2
+ export function rehypeWorldOrbit(options = {}) {
3
+ return function transform(tree) {
4
+ visitHastNodes(tree, (node, index, parent) => {
5
+ if (!parent || index === -1 || node.type !== "element" || node.tagName !== "pre") {
6
+ return;
7
+ }
8
+ const codeElement = node.children?.[0];
9
+ if (!codeElement || codeElement.type !== "element" || codeElement.tagName !== "code") {
10
+ return;
11
+ }
12
+ const classNames = normalizeClassNames(codeElement.properties?.className);
13
+ if (!classNames.includes("language-worldorbit")) {
14
+ return;
15
+ }
16
+ const source = collectText(codeElement);
17
+ parent.children[index] = {
18
+ type: "raw",
19
+ value: renderWorldOrbitBlock(source, options),
20
+ };
21
+ });
22
+ };
23
+ }
24
+ function visitHastNodes(node, visitor, parent = null) {
25
+ const children = node.children ?? [];
26
+ for (let index = 0; index < children.length; index += 1) {
27
+ const child = children[index];
28
+ visitor(child, index, node);
29
+ visitHastNodes(child, visitor, node);
30
+ }
31
+ if (!parent) {
32
+ visitor(node, -1, null);
33
+ }
34
+ }
35
+ function normalizeClassNames(value) {
36
+ if (Array.isArray(value)) {
37
+ return value.map((entry) => String(entry));
38
+ }
39
+ if (typeof value === "string") {
40
+ return value.split(/\s+/).filter(Boolean);
41
+ }
42
+ return [];
43
+ }
44
+ function collectText(node) {
45
+ if (node.type === "text") {
46
+ return node.value ?? "";
47
+ }
48
+ return (node.children ?? []).map((child) => collectText(child)).join("");
49
+ }
@@ -0,0 +1,9 @@
1
+ import type { WorldOrbitMarkdownOptions } from "./types.js";
2
+ interface MdNode {
3
+ type: string;
4
+ lang?: string | null;
5
+ value?: string;
6
+ children?: MdNode[];
7
+ }
8
+ export declare function remarkWorldOrbit(options?: WorldOrbitMarkdownOptions): (tree: MdNode) => void;
9
+ export {};
@@ -0,0 +1,28 @@
1
+ import { renderWorldOrbitBlock } from "./html.js";
2
+ export function remarkWorldOrbit(options = {}) {
3
+ return function transform(tree) {
4
+ visitMdNodes(tree, (node, index, parent) => {
5
+ if (!parent || index === -1 || node.type !== "code" || !isWorldOrbitLanguage(node.lang)) {
6
+ return;
7
+ }
8
+ parent.children[index] = {
9
+ type: "html",
10
+ value: renderWorldOrbitBlock(node.value ?? "", options),
11
+ };
12
+ });
13
+ };
14
+ }
15
+ function visitMdNodes(node, visitor, parent = null) {
16
+ const children = node.children ?? [];
17
+ for (let index = 0; index < children.length; index += 1) {
18
+ const child = children[index];
19
+ visitor(child, index, node);
20
+ visitMdNodes(child, visitor, node);
21
+ }
22
+ if (!parent) {
23
+ visitor(node, -1, null);
24
+ }
25
+ }
26
+ function isWorldOrbitLanguage(language) {
27
+ return (language ?? "").trim().toLowerCase() === "worldorbit";
28
+ }
@@ -0,0 +1,11 @@
1
+ import type { SvgRenderOptions, ViewerAtlasState, ViewerFilter, WorldOrbitEmbedMode } from "@worldorbit/viewer";
2
+ export interface WorldOrbitMarkdownOptions extends SvgRenderOptions {
3
+ mode?: WorldOrbitEmbedMode;
4
+ strict?: boolean;
5
+ className?: string;
6
+ initialViewpointId?: string;
7
+ initialSelectionObjectId?: string;
8
+ initialFilter?: ViewerFilter | null;
9
+ atlasState?: ViewerAtlasState | null;
10
+ minimap?: boolean;
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { RenderScene, RenderSceneViewpoint } from "@worldorbit/core";
2
+ import type { ViewerAtlasState, ViewerBookmark, ViewerFilter, ViewerLayerOptions, ViewerRenderOptions, ViewerSearchResult, ViewerState } from "./types.js";
3
+ export declare function normalizeViewerFilter(filter: ViewerFilter | null | undefined): ViewerFilter | null;
4
+ export declare function isViewerFilterActive(filter: ViewerFilter | null | undefined): boolean;
5
+ export declare function computeVisibleObjectIds(scene: RenderScene, filter: ViewerFilter | null | undefined): Set<string>;
6
+ export declare function searchSceneObjects(scene: RenderScene, query: string, limit?: number): ViewerSearchResult[];
7
+ export declare function createAtlasStateSnapshot(viewerState: ViewerState, renderOptions: ViewerRenderOptions, filter: ViewerFilter | null, viewpointId: string | null): ViewerAtlasState;
8
+ export declare function serializeViewerAtlasState(state: ViewerAtlasState): string;
9
+ export declare function deserializeViewerAtlasState(serialized: string): ViewerAtlasState;
10
+ export declare function createViewerBookmark(name: string, label: string | undefined, atlasState: ViewerAtlasState): ViewerBookmark;
11
+ export declare function sceneViewpointToLayerOptions(viewpoint: RenderSceneViewpoint | null | undefined): ViewerLayerOptions | undefined;
12
+ export declare function viewpointToViewerFilter(viewpoint: RenderSceneViewpoint | null | undefined): ViewerFilter | null;
@@ -0,0 +1,269 @@
1
+ export function normalizeViewerFilter(filter) {
2
+ if (!filter) {
3
+ return null;
4
+ }
5
+ const normalized = {
6
+ query: filter.query?.trim() || undefined,
7
+ objectTypes: dedupeList(filter.objectTypes ?? []),
8
+ tags: dedupeList((filter.tags ?? []).map((tag) => tag.trim()).filter(Boolean)),
9
+ groupIds: dedupeList((filter.groupIds ?? []).map((groupId) => groupId.trim()).filter(Boolean)),
10
+ includeAncestors: filter.includeAncestors ?? true,
11
+ };
12
+ return isViewerFilterActive(normalized) ? normalized : null;
13
+ }
14
+ export function isViewerFilterActive(filter) {
15
+ return Boolean(filter &&
16
+ (filter.query?.trim() ||
17
+ filter.objectTypes?.length ||
18
+ filter.tags?.length ||
19
+ filter.groupIds?.length));
20
+ }
21
+ export function computeVisibleObjectIds(scene, filter) {
22
+ const normalized = normalizeViewerFilter(filter);
23
+ const visible = new Set();
24
+ for (const object of scene.objects) {
25
+ if (object.hidden) {
26
+ continue;
27
+ }
28
+ if (matchesObjectFilter(object, normalized)) {
29
+ visible.add(object.objectId);
30
+ if (normalized?.includeAncestors !== false) {
31
+ for (const ancestorId of object.ancestorIds) {
32
+ visible.add(ancestorId);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ if (!normalized) {
38
+ return new Set(scene.objects.filter((object) => !object.hidden).map((object) => object.objectId));
39
+ }
40
+ return visible;
41
+ }
42
+ export function searchSceneObjects(scene, query, limit = 12) {
43
+ const normalizedQuery = query.trim().toLowerCase();
44
+ if (!normalizedQuery) {
45
+ return scene.objects
46
+ .filter((object) => !object.hidden)
47
+ .slice()
48
+ .sort((left, right) => left.label.localeCompare(right.label))
49
+ .slice(0, limit)
50
+ .map((object) => createSearchResult(object, 1));
51
+ }
52
+ return scene.objects
53
+ .filter((object) => !object.hidden)
54
+ .map((object) => ({
55
+ object,
56
+ score: scoreSearchMatch(object, normalizedQuery),
57
+ }))
58
+ .filter((entry) => entry.score > 0)
59
+ .sort((left, right) => right.score - left.score || left.object.label.localeCompare(right.object.label))
60
+ .slice(0, limit)
61
+ .map((entry) => createSearchResult(entry.object, entry.score));
62
+ }
63
+ export function createAtlasStateSnapshot(viewerState, renderOptions, filter, viewpointId) {
64
+ return {
65
+ version: "2.5",
66
+ viewpointId,
67
+ activeEventId: renderOptions.activeEventId ?? null,
68
+ viewerState: { ...viewerState },
69
+ renderOptions: {
70
+ preset: renderOptions.preset,
71
+ projection: renderOptions.projection,
72
+ camera: renderOptions.camera ? { ...renderOptions.camera } : null,
73
+ layers: renderOptions.layers ? { ...renderOptions.layers } : undefined,
74
+ scaleModel: renderOptions.scaleModel ? { ...renderOptions.scaleModel } : undefined,
75
+ activeEventId: renderOptions.activeEventId ?? null,
76
+ viewMode: renderOptions.viewMode ?? "2d",
77
+ },
78
+ filter: normalizeViewerFilter(filter),
79
+ };
80
+ }
81
+ export function serializeViewerAtlasState(state) {
82
+ return encodeURIComponent(JSON.stringify(state));
83
+ }
84
+ export function deserializeViewerAtlasState(serialized) {
85
+ const raw = JSON.parse(decodeURIComponent(serialized));
86
+ return {
87
+ version: raw.version === "2.0" ? "2.0" : "2.5",
88
+ viewpointId: raw.viewpointId ?? null,
89
+ activeEventId: raw.activeEventId ?? raw.renderOptions?.activeEventId ?? null,
90
+ viewerState: {
91
+ scale: raw.viewerState?.scale ?? 1,
92
+ rotationDeg: raw.viewerState?.rotationDeg ?? 0,
93
+ translateX: raw.viewerState?.translateX ?? 0,
94
+ translateY: raw.viewerState?.translateY ?? 0,
95
+ selectedObjectId: raw.viewerState?.selectedObjectId ?? null,
96
+ },
97
+ renderOptions: {
98
+ preset: raw.renderOptions?.preset,
99
+ projection: raw.renderOptions?.projection,
100
+ camera: raw.renderOptions?.camera ? { ...raw.renderOptions.camera } : null,
101
+ layers: raw.renderOptions?.layers ? { ...raw.renderOptions.layers } : undefined,
102
+ scaleModel: raw.renderOptions?.scaleModel
103
+ ? { ...raw.renderOptions.scaleModel }
104
+ : undefined,
105
+ activeEventId: raw.activeEventId ?? raw.renderOptions?.activeEventId ?? null,
106
+ viewMode: raw.renderOptions?.viewMode ?? "2d",
107
+ },
108
+ filter: normalizeViewerFilter(raw.filter ?? null),
109
+ };
110
+ }
111
+ export function createViewerBookmark(name, label, atlasState) {
112
+ const normalizedName = name.trim() || "bookmark";
113
+ return {
114
+ id: normalizedName
115
+ .toLowerCase()
116
+ .replace(/[^a-z0-9_-]+/g, "-")
117
+ .replace(/^-+|-+$/g, "") || "bookmark",
118
+ label: label?.trim() || normalizedName,
119
+ atlasState: {
120
+ ...atlasState,
121
+ viewerState: { ...atlasState.viewerState },
122
+ renderOptions: {
123
+ ...atlasState.renderOptions,
124
+ camera: atlasState.renderOptions.camera ? { ...atlasState.renderOptions.camera } : null,
125
+ layers: atlasState.renderOptions.layers ? { ...atlasState.renderOptions.layers } : undefined,
126
+ scaleModel: atlasState.renderOptions.scaleModel
127
+ ? { ...atlasState.renderOptions.scaleModel }
128
+ : undefined,
129
+ activeEventId: atlasState.renderOptions.activeEventId ?? null,
130
+ viewMode: atlasState.renderOptions.viewMode ?? "2d",
131
+ },
132
+ filter: atlasState.filter ? { ...atlasState.filter } : null,
133
+ },
134
+ };
135
+ }
136
+ export function sceneViewpointToLayerOptions(viewpoint) {
137
+ if (!viewpoint) {
138
+ return undefined;
139
+ }
140
+ const hasLayerState = Object.keys(viewpoint.layers).length > 0;
141
+ if (!hasLayerState) {
142
+ return undefined;
143
+ }
144
+ return {
145
+ background: viewpoint.layers.background,
146
+ guides: viewpoint.layers.guides,
147
+ relations: viewpoint.layers.relations,
148
+ events: viewpoint.layers.events,
149
+ orbits: viewpoint.layers["orbits-front"] === undefined && viewpoint.layers["orbits-back"] === undefined
150
+ ? undefined
151
+ : viewpoint.layers["orbits-front"] !== false || viewpoint.layers["orbits-back"] !== false,
152
+ objects: viewpoint.layers.objects,
153
+ labels: viewpoint.layers.labels,
154
+ metadata: viewpoint.layers.metadata,
155
+ };
156
+ }
157
+ export function viewpointToViewerFilter(viewpoint) {
158
+ if (!viewpoint?.filter) {
159
+ return null;
160
+ }
161
+ return normalizeViewerFilter({
162
+ query: viewpoint.filter.query ?? undefined,
163
+ objectTypes: viewpoint.filter.objectTypes,
164
+ tags: viewpoint.filter.tags,
165
+ groupIds: viewpoint.filter.groupIds,
166
+ includeAncestors: true,
167
+ });
168
+ }
169
+ function createSearchResult(object, score) {
170
+ return {
171
+ objectId: object.objectId,
172
+ label: object.label,
173
+ type: object.object.type,
174
+ score,
175
+ groupId: object.groupId,
176
+ parentId: object.parentId,
177
+ tags: Array.isArray(object.object.properties.tags)
178
+ ? object.object.properties.tags.filter((entry) => typeof entry === "string")
179
+ : [],
180
+ };
181
+ }
182
+ function matchesObjectFilter(object, filter) {
183
+ if (!filter) {
184
+ return true;
185
+ }
186
+ if (filter.objectTypes?.length && !filter.objectTypes.includes(object.object.type)) {
187
+ return false;
188
+ }
189
+ if (filter.groupIds?.length && (!object.groupId || !filter.groupIds.includes(object.groupId))) {
190
+ const hasSemanticMatch = object.semanticGroupIds.length > 0 &&
191
+ filter.groupIds.some((groupId) => object.semanticGroupIds.includes(groupId));
192
+ const hasLegacyMatch = Boolean(object.groupId && filter.groupIds.includes(object.groupId));
193
+ if (!hasSemanticMatch && !hasLegacyMatch) {
194
+ return false;
195
+ }
196
+ }
197
+ if (filter.tags?.length) {
198
+ const objectTags = Array.isArray(object.object.properties.tags)
199
+ ? object.object.properties.tags.filter((entry) => typeof entry === "string")
200
+ : [];
201
+ if (!filter.tags.every((tag) => objectTags.includes(tag))) {
202
+ return false;
203
+ }
204
+ }
205
+ if (filter.query?.trim()) {
206
+ const haystack = buildSearchText(object.object, object.label).toLowerCase();
207
+ const tokens = filter.query
208
+ .toLowerCase()
209
+ .split(/\s+/)
210
+ .filter(Boolean);
211
+ if (!tokens.every((token) => haystack.includes(token))) {
212
+ return false;
213
+ }
214
+ }
215
+ return true;
216
+ }
217
+ function scoreSearchMatch(object, query) {
218
+ const id = object.objectId.toLowerCase();
219
+ const label = object.label.toLowerCase();
220
+ const haystack = buildSearchText(object.object, object.label).toLowerCase();
221
+ let score = 0;
222
+ if (id === query || label === query) {
223
+ score += 120;
224
+ }
225
+ else if (id.startsWith(query) || label.startsWith(query)) {
226
+ score += 96;
227
+ }
228
+ else if (id.includes(query) || label.includes(query)) {
229
+ score += 72;
230
+ }
231
+ const tokens = query.split(/\s+/).filter(Boolean);
232
+ if (tokens.every((token) => haystack.includes(token))) {
233
+ score += 32;
234
+ }
235
+ if (object.object.type === query) {
236
+ score += 24;
237
+ }
238
+ const tags = Array.isArray(object.object.properties.tags)
239
+ ? object.object.properties.tags.filter((entry) => typeof entry === "string")
240
+ : [];
241
+ if (tags.some((tag) => tag.toLowerCase() === query)) {
242
+ score += 18;
243
+ }
244
+ return score;
245
+ }
246
+ function buildSearchText(object, label) {
247
+ const infoValues = Object.values(object.info);
248
+ const propertyValues = Object.values(object.properties)
249
+ .flatMap((value) => {
250
+ if (Array.isArray(value)) {
251
+ return value;
252
+ }
253
+ if (typeof value === "object" && value && "value" in value) {
254
+ return [String(value.value), String(value.unit ?? "")];
255
+ }
256
+ return [String(value)];
257
+ })
258
+ .filter(Boolean);
259
+ return [
260
+ object.id,
261
+ label,
262
+ object.type,
263
+ ...propertyValues,
264
+ ...infoValues,
265
+ ].join(" ");
266
+ }
267
+ function dedupeList(values) {
268
+ return [...new Set(values)];
269
+ }
@@ -0,0 +1,2 @@
1
+ import type { AtlasViewerOptions, WorldOrbitAtlasViewer } from "./types.js";
2
+ export declare function createAtlasViewer(container: HTMLElement, options: AtlasViewerOptions): WorldOrbitAtlasViewer;