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.
Files changed (117) hide show
  1. package/LICENSE.md +5 -0
  2. package/README.md +468 -0
  3. package/dist/browser/core/dist/index.js +4009 -0
  4. package/dist/browser/markdown/dist/index.js +3951 -0
  5. package/dist/browser/viewer/dist/index.js +5981 -0
  6. package/dist/constants.d.ts +8 -0
  7. package/dist/constants.js +84 -0
  8. package/dist/errors.d.ts +7 -0
  9. package/dist/errors.js +16 -0
  10. package/dist/index.d.ts +18 -0
  11. package/dist/index.js +25 -0
  12. package/dist/normalize.d.ts +2 -0
  13. package/dist/normalize.js +243 -0
  14. package/dist/parse.d.ts +2 -0
  15. package/dist/parse.js +126 -0
  16. package/dist/render.d.ts +6 -0
  17. package/dist/render.js +683 -0
  18. package/dist/tokenize.d.ts +4 -0
  19. package/dist/tokenize.js +68 -0
  20. package/dist/types.d.ts +208 -0
  21. package/dist/types.js +1 -0
  22. package/dist/unpkg/core/dist/index.js +4081 -0
  23. package/dist/unpkg/markdown/dist/index.js +3979 -0
  24. package/dist/unpkg/viewer/dist/index.js +6038 -0
  25. package/dist/unpkg/worldorbit-core.min.js +12 -0
  26. package/dist/unpkg/worldorbit-markdown.min.js +95 -0
  27. package/dist/unpkg/worldorbit-viewer.min.js +251 -0
  28. package/dist/unpkg/worldorbit.d.ts +2 -0
  29. package/dist/unpkg/worldorbit.esm.js +2 -0
  30. package/dist/unpkg/worldorbit.js +8524 -0
  31. package/dist/unpkg/worldorbit.min.js +255 -0
  32. package/dist/validate.d.ts +2 -0
  33. package/dist/validate.js +31 -0
  34. package/dist/viewer-state.d.ts +16 -0
  35. package/dist/viewer-state.js +130 -0
  36. package/dist/viewer.d.ts +2 -0
  37. package/dist/viewer.js +434 -0
  38. package/package.json +68 -0
  39. package/packages/core/README.md +17 -0
  40. package/packages/core/dist/atlas-edit.d.ts +11 -0
  41. package/packages/core/dist/atlas-edit.js +273 -0
  42. package/packages/core/dist/atlas-utils.d.ts +22 -0
  43. package/packages/core/dist/atlas-utils.js +189 -0
  44. package/packages/core/dist/atlas-validate.d.ts +2 -0
  45. package/packages/core/dist/atlas-validate.js +285 -0
  46. package/packages/core/dist/diagnostics.d.ts +10 -0
  47. package/packages/core/dist/diagnostics.js +109 -0
  48. package/packages/core/dist/draft-parse.d.ts +3 -0
  49. package/packages/core/dist/draft-parse.js +1275 -0
  50. package/packages/core/dist/draft.d.ts +18 -0
  51. package/packages/core/dist/draft.js +387 -0
  52. package/packages/core/dist/errors.d.ts +7 -0
  53. package/packages/core/dist/errors.js +16 -0
  54. package/packages/core/dist/format.d.ts +4 -0
  55. package/packages/core/dist/format.js +520 -0
  56. package/packages/core/dist/index.d.ts +28 -0
  57. package/packages/core/dist/index.js +44 -0
  58. package/packages/core/dist/load.d.ts +4 -0
  59. package/packages/core/dist/load.js +175 -0
  60. package/packages/core/dist/markdown.d.ts +2 -0
  61. package/packages/core/dist/markdown.js +37 -0
  62. package/packages/core/dist/normalize.d.ts +2 -0
  63. package/packages/core/dist/normalize.js +311 -0
  64. package/packages/core/dist/parse.d.ts +2 -0
  65. package/packages/core/dist/parse.js +133 -0
  66. package/packages/core/dist/scene.d.ts +3 -0
  67. package/packages/core/dist/scene.js +1565 -0
  68. package/packages/core/dist/schema.d.ts +8 -0
  69. package/packages/core/dist/schema.js +298 -0
  70. package/packages/core/dist/tokenize.d.ts +4 -0
  71. package/packages/core/dist/tokenize.js +68 -0
  72. package/packages/core/dist/types.d.ts +476 -0
  73. package/packages/core/dist/types.js +1 -0
  74. package/packages/core/dist/validate.d.ts +2 -0
  75. package/packages/core/dist/validate.js +56 -0
  76. package/packages/editor/dist/editor.d.ts +2 -0
  77. package/packages/editor/dist/editor.js +3042 -0
  78. package/packages/editor/dist/index.d.ts +2 -0
  79. package/packages/editor/dist/index.js +1 -0
  80. package/packages/editor/dist/types.d.ts +53 -0
  81. package/packages/editor/dist/types.js +1 -0
  82. package/packages/markdown/README.md +9 -0
  83. package/packages/markdown/dist/html.d.ts +3 -0
  84. package/packages/markdown/dist/html.js +57 -0
  85. package/packages/markdown/dist/index.d.ts +4 -0
  86. package/packages/markdown/dist/index.js +3 -0
  87. package/packages/markdown/dist/rehype.d.ts +10 -0
  88. package/packages/markdown/dist/rehype.js +49 -0
  89. package/packages/markdown/dist/remark.d.ts +9 -0
  90. package/packages/markdown/dist/remark.js +28 -0
  91. package/packages/markdown/dist/types.d.ts +11 -0
  92. package/packages/markdown/dist/types.js +1 -0
  93. package/packages/viewer/README.md +13 -0
  94. package/packages/viewer/dist/atlas-state.d.ts +12 -0
  95. package/packages/viewer/dist/atlas-state.js +257 -0
  96. package/packages/viewer/dist/atlas-viewer.d.ts +2 -0
  97. package/packages/viewer/dist/atlas-viewer.js +482 -0
  98. package/packages/viewer/dist/custom-element.d.ts +1 -0
  99. package/packages/viewer/dist/custom-element.js +64 -0
  100. package/packages/viewer/dist/embed.d.ts +20 -0
  101. package/packages/viewer/dist/embed.js +138 -0
  102. package/packages/viewer/dist/index.d.ts +9 -0
  103. package/packages/viewer/dist/index.js +8 -0
  104. package/packages/viewer/dist/minimap.d.ts +3 -0
  105. package/packages/viewer/dist/minimap.js +63 -0
  106. package/packages/viewer/dist/render.d.ts +6 -0
  107. package/packages/viewer/dist/render.js +641 -0
  108. package/packages/viewer/dist/theme.d.ts +4 -0
  109. package/packages/viewer/dist/theme.js +102 -0
  110. package/packages/viewer/dist/tooltip.d.ts +3 -0
  111. package/packages/viewer/dist/tooltip.js +189 -0
  112. package/packages/viewer/dist/types.d.ts +263 -0
  113. package/packages/viewer/dist/types.js +1 -0
  114. package/packages/viewer/dist/viewer-state.d.ts +19 -0
  115. package/packages/viewer/dist/viewer-state.js +162 -0
  116. package/packages/viewer/dist/viewer.d.ts +2 -0
  117. 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("&", "&amp;")
135
+ .replaceAll("<", "&lt;")
136
+ .replaceAll(">", "&gt;")
137
+ .replaceAll("\"", "&quot;");
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,3 @@
1
+ import type { RenderScene, RenderSceneObject } from "@worldorbit/core";
2
+ import type { ViewerState } from "./types.js";
3
+ export declare function renderViewerMinimap(scene: RenderScene, state: ViewerState, visibleObjects: RenderSceneObject[]): string;
@@ -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;