worldorbit 2.5.1-5.2
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/LICENSE.md +5 -0
- package/README.md +468 -0
- package/dist/browser/core/dist/index.js +4009 -0
- package/dist/browser/markdown/dist/index.js +3951 -0
- package/dist/browser/viewer/dist/index.js +5981 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.js +84 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.js +16 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +25 -0
- package/dist/normalize.d.ts +2 -0
- package/dist/normalize.js +243 -0
- package/dist/parse.d.ts +2 -0
- package/dist/parse.js +126 -0
- package/dist/render.d.ts +6 -0
- package/dist/render.js +683 -0
- package/dist/tokenize.d.ts +4 -0
- package/dist/tokenize.js +68 -0
- package/dist/types.d.ts +208 -0
- package/dist/types.js +1 -0
- package/dist/unpkg/core/dist/index.js +4081 -0
- package/dist/unpkg/markdown/dist/index.js +3979 -0
- package/dist/unpkg/viewer/dist/index.js +6038 -0
- package/dist/unpkg/worldorbit-core.min.js +12 -0
- package/dist/unpkg/worldorbit-markdown.min.js +95 -0
- package/dist/unpkg/worldorbit-viewer.min.js +251 -0
- package/dist/unpkg/worldorbit.d.ts +2 -0
- package/dist/unpkg/worldorbit.esm.js +2 -0
- package/dist/unpkg/worldorbit.js +8524 -0
- package/dist/unpkg/worldorbit.min.js +255 -0
- package/dist/validate.d.ts +2 -0
- package/dist/validate.js +31 -0
- package/dist/viewer-state.d.ts +16 -0
- package/dist/viewer-state.js +130 -0
- package/dist/viewer.d.ts +2 -0
- package/dist/viewer.js +434 -0
- package/package.json +68 -0
- package/packages/core/README.md +17 -0
- package/packages/core/dist/atlas-edit.d.ts +11 -0
- package/packages/core/dist/atlas-edit.js +273 -0
- package/packages/core/dist/atlas-utils.d.ts +22 -0
- package/packages/core/dist/atlas-utils.js +189 -0
- package/packages/core/dist/atlas-validate.d.ts +2 -0
- package/packages/core/dist/atlas-validate.js +285 -0
- package/packages/core/dist/diagnostics.d.ts +10 -0
- package/packages/core/dist/diagnostics.js +109 -0
- package/packages/core/dist/draft-parse.d.ts +3 -0
- package/packages/core/dist/draft-parse.js +1275 -0
- package/packages/core/dist/draft.d.ts +18 -0
- package/packages/core/dist/draft.js +387 -0
- package/packages/core/dist/errors.d.ts +7 -0
- package/packages/core/dist/errors.js +16 -0
- package/packages/core/dist/format.d.ts +4 -0
- package/packages/core/dist/format.js +520 -0
- package/packages/core/dist/index.d.ts +28 -0
- package/packages/core/dist/index.js +44 -0
- package/packages/core/dist/load.d.ts +4 -0
- package/packages/core/dist/load.js +175 -0
- package/packages/core/dist/markdown.d.ts +2 -0
- package/packages/core/dist/markdown.js +37 -0
- package/packages/core/dist/normalize.d.ts +2 -0
- package/packages/core/dist/normalize.js +311 -0
- package/packages/core/dist/parse.d.ts +2 -0
- package/packages/core/dist/parse.js +133 -0
- package/packages/core/dist/scene.d.ts +3 -0
- package/packages/core/dist/scene.js +1565 -0
- package/packages/core/dist/schema.d.ts +8 -0
- package/packages/core/dist/schema.js +298 -0
- package/packages/core/dist/tokenize.d.ts +4 -0
- package/packages/core/dist/tokenize.js +68 -0
- package/packages/core/dist/types.d.ts +476 -0
- package/packages/core/dist/types.js +1 -0
- package/packages/core/dist/validate.d.ts +2 -0
- package/packages/core/dist/validate.js +56 -0
- package/packages/editor/dist/editor.d.ts +2 -0
- package/packages/editor/dist/editor.js +3042 -0
- package/packages/editor/dist/index.d.ts +2 -0
- package/packages/editor/dist/index.js +1 -0
- package/packages/editor/dist/types.d.ts +53 -0
- package/packages/editor/dist/types.js +1 -0
- package/packages/markdown/README.md +9 -0
- package/packages/markdown/dist/html.d.ts +3 -0
- package/packages/markdown/dist/html.js +57 -0
- package/packages/markdown/dist/index.d.ts +4 -0
- package/packages/markdown/dist/index.js +3 -0
- package/packages/markdown/dist/rehype.d.ts +10 -0
- package/packages/markdown/dist/rehype.js +49 -0
- package/packages/markdown/dist/remark.d.ts +9 -0
- package/packages/markdown/dist/remark.js +28 -0
- package/packages/markdown/dist/types.d.ts +11 -0
- package/packages/markdown/dist/types.js +1 -0
- package/packages/viewer/README.md +13 -0
- package/packages/viewer/dist/atlas-state.d.ts +12 -0
- package/packages/viewer/dist/atlas-state.js +257 -0
- package/packages/viewer/dist/atlas-viewer.d.ts +2 -0
- package/packages/viewer/dist/atlas-viewer.js +482 -0
- package/packages/viewer/dist/custom-element.d.ts +1 -0
- package/packages/viewer/dist/custom-element.js +64 -0
- package/packages/viewer/dist/embed.d.ts +20 -0
- package/packages/viewer/dist/embed.js +138 -0
- package/packages/viewer/dist/index.d.ts +9 -0
- package/packages/viewer/dist/index.js +8 -0
- package/packages/viewer/dist/minimap.d.ts +3 -0
- package/packages/viewer/dist/minimap.js +63 -0
- package/packages/viewer/dist/render.d.ts +6 -0
- package/packages/viewer/dist/render.js +641 -0
- package/packages/viewer/dist/theme.d.ts +4 -0
- package/packages/viewer/dist/theme.js +102 -0
- package/packages/viewer/dist/tooltip.d.ts +3 -0
- package/packages/viewer/dist/tooltip.js +189 -0
- package/packages/viewer/dist/types.d.ts +263 -0
- package/packages/viewer/dist/types.js +1 -0
- package/packages/viewer/dist/viewer-state.d.ts +19 -0
- package/packages/viewer/dist/viewer-state.js +162 -0
- package/packages/viewer/dist/viewer.d.ts +2 -0
- package/packages/viewer/dist/viewer.js +1175 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { renderSceneToSvg } from "./render.js";
|
|
2
|
+
import { createInteractiveViewer } from "./viewer.js";
|
|
3
|
+
const EMBED_SELECTOR = "[data-worldorbit-embed]";
|
|
4
|
+
export function serializeWorldOrbitEmbedPayload(payload) {
|
|
5
|
+
return encodeURIComponent(JSON.stringify(payload));
|
|
6
|
+
}
|
|
7
|
+
export function deserializeWorldOrbitEmbedPayload(serialized) {
|
|
8
|
+
const raw = JSON.parse(decodeURIComponent(serialized));
|
|
9
|
+
return {
|
|
10
|
+
version: "2.0",
|
|
11
|
+
mode: raw.mode ?? "interactive",
|
|
12
|
+
scene: raw.scene,
|
|
13
|
+
options: raw.options
|
|
14
|
+
? {
|
|
15
|
+
...raw.options,
|
|
16
|
+
initialFilter: raw.options.initialFilter ?? null,
|
|
17
|
+
atlasState: raw.options.atlasState ?? null,
|
|
18
|
+
}
|
|
19
|
+
: undefined,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function createEmbedPayload(scene, mode, options = {}) {
|
|
23
|
+
return {
|
|
24
|
+
version: "2.0",
|
|
25
|
+
mode,
|
|
26
|
+
scene,
|
|
27
|
+
options: {
|
|
28
|
+
initialViewpointId: options.initialViewpointId,
|
|
29
|
+
initialSelectionObjectId: options.initialSelectionObjectId,
|
|
30
|
+
initialFilter: options.initialFilter ?? null,
|
|
31
|
+
atlasState: options.atlasState ?? null,
|
|
32
|
+
minimap: options.minimap,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function createWorldOrbitEmbedMarkup(payload, options = {}) {
|
|
37
|
+
const mergedPayload = {
|
|
38
|
+
...payload,
|
|
39
|
+
options: {
|
|
40
|
+
...payload.options,
|
|
41
|
+
theme: options.theme ?? payload.options?.theme,
|
|
42
|
+
layers: options.layers ?? payload.options?.layers,
|
|
43
|
+
subtitle: options.subtitle ?? payload.options?.subtitle,
|
|
44
|
+
preset: options.preset ?? payload.options?.preset,
|
|
45
|
+
initialViewpointId: options.initialViewpointId ?? payload.options?.initialViewpointId,
|
|
46
|
+
initialSelectionObjectId: options.initialSelectionObjectId ?? payload.options?.initialSelectionObjectId,
|
|
47
|
+
initialFilter: options.initialFilter ?? payload.options?.initialFilter ?? null,
|
|
48
|
+
atlasState: options.atlasState ?? payload.options?.atlasState ?? null,
|
|
49
|
+
minimap: options.minimap ?? payload.options?.minimap,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const html = renderSceneToSvg(payload.scene, {
|
|
53
|
+
theme: mergedPayload.options?.theme,
|
|
54
|
+
layers: mergedPayload.options?.layers,
|
|
55
|
+
filter: mergedPayload.options?.initialFilter ?? null,
|
|
56
|
+
selectedObjectId: mergedPayload.options?.initialSelectionObjectId ?? null,
|
|
57
|
+
subtitle: mergedPayload.options?.subtitle,
|
|
58
|
+
preset: mergedPayload.options?.preset,
|
|
59
|
+
});
|
|
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>`;
|
|
61
|
+
}
|
|
62
|
+
export function mountWorldOrbitEmbeds(root = document, options = {}) {
|
|
63
|
+
const viewers = new Map();
|
|
64
|
+
const elements = [...root.querySelectorAll(EMBED_SELECTOR)];
|
|
65
|
+
for (const element of elements) {
|
|
66
|
+
const payload = deserializePayloadFromElement(element);
|
|
67
|
+
const mode = options.mode ?? payload.mode;
|
|
68
|
+
const theme = options.theme ?? payload.options?.theme;
|
|
69
|
+
const layers = options.layers ?? payload.options?.layers;
|
|
70
|
+
const subtitle = options.subtitle ?? payload.options?.subtitle;
|
|
71
|
+
const preset = options.preset ?? payload.options?.preset ?? payload.scene.renderPreset ?? undefined;
|
|
72
|
+
const initialFilter = options.viewer?.initialFilter ?? payload.options?.initialFilter ?? null;
|
|
73
|
+
const initialViewpointId = options.viewer?.initialViewpointId ?? payload.options?.initialViewpointId;
|
|
74
|
+
const initialSelectionObjectId = options.viewer?.initialSelectionObjectId ?? payload.options?.initialSelectionObjectId;
|
|
75
|
+
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);
|
|
94
|
+
}
|
|
95
|
+
viewers.set(element, viewer);
|
|
96
|
+
options.onMount?.(viewer, element);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
element.innerHTML = renderSceneToSvg(payload.scene, {
|
|
100
|
+
width: options.width ?? payload.scene.width,
|
|
101
|
+
height: options.height ?? payload.scene.height,
|
|
102
|
+
padding: options.padding ?? payload.scene.padding,
|
|
103
|
+
preset,
|
|
104
|
+
theme,
|
|
105
|
+
layers,
|
|
106
|
+
filter: initialFilter,
|
|
107
|
+
selectedObjectId: initialSelectionObjectId ?? null,
|
|
108
|
+
subtitle,
|
|
109
|
+
});
|
|
110
|
+
options.onMount?.(null, element);
|
|
111
|
+
}
|
|
112
|
+
element.dataset.worldorbitMounted = "true";
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
viewers: [...viewers.values()],
|
|
116
|
+
destroy() {
|
|
117
|
+
for (const [element, viewer] of viewers.entries()) {
|
|
118
|
+
viewer.destroy();
|
|
119
|
+
element.removeAttribute("data-worldorbit-mounted");
|
|
120
|
+
}
|
|
121
|
+
viewers.clear();
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function deserializePayloadFromElement(element) {
|
|
126
|
+
const serialized = element.dataset.worldorbitPayload;
|
|
127
|
+
if (!serialized) {
|
|
128
|
+
throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");
|
|
129
|
+
}
|
|
130
|
+
return deserializeWorldOrbitEmbedPayload(serialized);
|
|
131
|
+
}
|
|
132
|
+
function escapeAttribute(value) {
|
|
133
|
+
return value
|
|
134
|
+
.replaceAll("&", "&")
|
|
135
|
+
.replaceAll("<", "<")
|
|
136
|
+
.replaceAll(">", ">")
|
|
137
|
+
.replaceAll("\"", """);
|
|
138
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type * from "./types.js";
|
|
2
|
+
export { getThemePreset, resolveLayers, resolveTheme } from "./theme.js";
|
|
3
|
+
export { deserializeViewerAtlasState, normalizeViewerFilter, sceneViewpointToLayerOptions, searchSceneObjects, serializeViewerAtlasState, viewpointToViewerFilter, } from "./atlas-state.js";
|
|
4
|
+
export { DEFAULT_VIEWER_STATE, clampScale, composeViewerTransform, fitViewerState, focusViewerState, getViewerVisibleBounds, invertViewerPoint, getSceneCenter, normalizeRotation, panViewerState, rotateViewerState, zoomViewerStateAt, } from "./viewer-state.js";
|
|
5
|
+
export { WORLD_LAYER_ID, renderDocumentToSvg, renderSceneToSvg, renderSourceToSvg, } from "./render.js";
|
|
6
|
+
export { createEmbedPayload, createWorldOrbitEmbedMarkup, deserializeWorldOrbitEmbedPayload, mountWorldOrbitEmbeds, serializeWorldOrbitEmbedPayload, } from "./embed.js";
|
|
7
|
+
export { defineWorldOrbitViewerElement } from "./custom-element.js";
|
|
8
|
+
export { createAtlasViewer } from "./atlas-viewer.js";
|
|
9
|
+
export { createInteractiveViewer } from "./viewer.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { getThemePreset, resolveLayers, resolveTheme } from "./theme.js";
|
|
2
|
+
export { deserializeViewerAtlasState, normalizeViewerFilter, sceneViewpointToLayerOptions, searchSceneObjects, serializeViewerAtlasState, viewpointToViewerFilter, } from "./atlas-state.js";
|
|
3
|
+
export { DEFAULT_VIEWER_STATE, clampScale, composeViewerTransform, fitViewerState, focusViewerState, getViewerVisibleBounds, invertViewerPoint, getSceneCenter, normalizeRotation, panViewerState, rotateViewerState, zoomViewerStateAt, } from "./viewer-state.js";
|
|
4
|
+
export { WORLD_LAYER_ID, renderDocumentToSvg, renderSceneToSvg, renderSourceToSvg, } from "./render.js";
|
|
5
|
+
export { createEmbedPayload, createWorldOrbitEmbedMarkup, deserializeWorldOrbitEmbedPayload, mountWorldOrbitEmbeds, serializeWorldOrbitEmbedPayload, } from "./embed.js";
|
|
6
|
+
export { defineWorldOrbitViewerElement } from "./custom-element.js";
|
|
7
|
+
export { createAtlasViewer } from "./atlas-viewer.js";
|
|
8
|
+
export { createInteractiveViewer } from "./viewer.js";
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getViewerVisibleBounds } from "./viewer-state.js";
|
|
2
|
+
const MINIMAP_WIDTH = 180;
|
|
3
|
+
const MINIMAP_HEIGHT = 120;
|
|
4
|
+
const MINIMAP_PADDING = 10;
|
|
5
|
+
export function renderViewerMinimap(scene, state, visibleObjects) {
|
|
6
|
+
const bounds = scene.contentBounds.width > 0 && scene.contentBounds.height > 0
|
|
7
|
+
? scene.contentBounds
|
|
8
|
+
: {
|
|
9
|
+
minX: 0,
|
|
10
|
+
minY: 0,
|
|
11
|
+
maxX: scene.width,
|
|
12
|
+
maxY: scene.height,
|
|
13
|
+
width: scene.width,
|
|
14
|
+
height: scene.height,
|
|
15
|
+
centerX: scene.width / 2,
|
|
16
|
+
centerY: scene.height / 2,
|
|
17
|
+
};
|
|
18
|
+
const scale = Math.min((MINIMAP_WIDTH - MINIMAP_PADDING * 2) / Math.max(bounds.width, 1), (MINIMAP_HEIGHT - MINIMAP_PADDING * 2) / Math.max(bounds.height, 1));
|
|
19
|
+
const translateX = (MINIMAP_WIDTH - bounds.width * scale) / 2 - bounds.minX * scale;
|
|
20
|
+
const translateY = (MINIMAP_HEIGHT - bounds.height * scale) / 2 - bounds.minY * scale;
|
|
21
|
+
const viewport = getViewerVisibleBounds(scene, state);
|
|
22
|
+
const objectsMarkup = visibleObjects
|
|
23
|
+
.map((object) => {
|
|
24
|
+
const x = object.x * scale + translateX;
|
|
25
|
+
const y = object.y * scale + translateY;
|
|
26
|
+
const radius = Math.max(1.4, Math.min(object.visualRadius * scale, 5.2));
|
|
27
|
+
const fill = object.fillColor ?? minimapColorForObject(object.object.type);
|
|
28
|
+
return `<circle cx="${formatNumber(x)}" cy="${formatNumber(y)}" r="${formatNumber(radius)}" fill="${fill}" fill-opacity="0.92" />`;
|
|
29
|
+
})
|
|
30
|
+
.join("");
|
|
31
|
+
return `<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${MINIMAP_WIDTH}px;height:${MINIMAP_HEIGHT}px;padding:8px;border-radius:16px;background:rgba(5, 14, 22, 0.78);border:1px solid rgba(179, 216, 255, 0.16);box-shadow:0 14px 28px rgba(0, 0, 0, 0.24);backdrop-filter:blur(8px);pointer-events:none;">
|
|
32
|
+
<svg width="${MINIMAP_WIDTH}" height="${MINIMAP_HEIGHT}" viewBox="0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}" role="presentation" aria-hidden="true">
|
|
33
|
+
<rect x="0.5" y="0.5" width="${MINIMAP_WIDTH - 1}" height="${MINIMAP_HEIGHT - 1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
34
|
+
<rect x="${formatNumber(bounds.minX * scale + translateX)}" y="${formatNumber(bounds.minY * scale + translateY)}" width="${formatNumber(bounds.width * scale)}" height="${formatNumber(bounds.height * scale)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
35
|
+
${objectsMarkup}
|
|
36
|
+
<rect x="${formatNumber(viewport.minX * scale + translateX)}" y="${formatNumber(viewport.minY * scale + translateY)}" width="${formatNumber(viewport.width * scale)}" height="${formatNumber(viewport.height * scale)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
|
|
37
|
+
</svg>
|
|
38
|
+
</div>`;
|
|
39
|
+
}
|
|
40
|
+
function minimapColorForObject(type) {
|
|
41
|
+
switch (type) {
|
|
42
|
+
case "star":
|
|
43
|
+
return "#ffcc67";
|
|
44
|
+
case "planet":
|
|
45
|
+
return "#72b7ff";
|
|
46
|
+
case "moon":
|
|
47
|
+
return "#c7d7ea";
|
|
48
|
+
case "belt":
|
|
49
|
+
case "ring":
|
|
50
|
+
return "#d9aa74";
|
|
51
|
+
case "asteroid":
|
|
52
|
+
return "#a7a5b8";
|
|
53
|
+
case "comet":
|
|
54
|
+
return "#9ce7ff";
|
|
55
|
+
case "structure":
|
|
56
|
+
return "#ff7f5f";
|
|
57
|
+
case "phenomenon":
|
|
58
|
+
return "#78ffd7";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function formatNumber(value) {
|
|
62
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(2);
|
|
63
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type RenderScene, type WorldOrbitDocument } from "@worldorbit/core";
|
|
2
|
+
import type { SvgRenderOptions } from "./types.js";
|
|
3
|
+
export declare const WORLD_LAYER_ID = "worldorbit-camera-root";
|
|
4
|
+
export declare function renderSceneToSvg(scene: RenderScene, options?: SvgRenderOptions): string;
|
|
5
|
+
export declare function renderDocumentToSvg(document: WorldOrbitDocument, options?: SvgRenderOptions): string;
|
|
6
|
+
export declare function renderSourceToSvg(source: string, options?: SvgRenderOptions): string;
|