worldorbit 2.5.13 → 2.5.16

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 (41) hide show
  1. package/README.md +37 -11
  2. package/dist/browser/core/dist/index.js +1811 -386
  3. package/dist/browser/editor/dist/index.js +10534 -0
  4. package/dist/browser/markdown/dist/index.js +1477 -221
  5. package/dist/browser/viewer/dist/index.js +1569 -230
  6. package/dist/unpkg/core/dist/index.js +1814 -389
  7. package/dist/unpkg/editor/dist/index.js +10559 -0
  8. package/dist/unpkg/markdown/dist/index.js +1480 -224
  9. package/dist/unpkg/viewer/dist/index.js +1572 -233
  10. package/dist/unpkg/worldorbit-core.min.js +12 -5
  11. package/dist/unpkg/worldorbit-editor.min.js +812 -0
  12. package/dist/unpkg/worldorbit-markdown.min.js +32 -23
  13. package/dist/unpkg/worldorbit-viewer.min.js +55 -41
  14. package/dist/unpkg/worldorbit.js +1713 -231
  15. package/dist/unpkg/worldorbit.min.js +58 -44
  16. package/package.json +3 -2
  17. package/packages/core/README.md +5 -1
  18. package/packages/core/dist/atlas-edit.d.ts +2 -2
  19. package/packages/core/dist/atlas-edit.js +70 -7
  20. package/packages/core/dist/atlas-utils.d.ts +22 -0
  21. package/packages/core/dist/atlas-utils.js +189 -0
  22. package/packages/core/dist/atlas-validate.d.ts +2 -0
  23. package/packages/core/dist/atlas-validate.js +285 -0
  24. package/packages/core/dist/draft-parse.js +786 -153
  25. package/packages/core/dist/draft.d.ts +3 -0
  26. package/packages/core/dist/draft.js +47 -3
  27. package/packages/core/dist/format.js +165 -9
  28. package/packages/core/dist/load.js +58 -13
  29. package/packages/core/dist/normalize.js +7 -0
  30. package/packages/core/dist/scene.js +66 -13
  31. package/packages/core/dist/types.d.ts +97 -3
  32. package/packages/editor/dist/editor.js +44 -0
  33. package/packages/markdown/README.md +1 -1
  34. package/packages/viewer/README.md +2 -1
  35. package/packages/viewer/dist/atlas-state.js +7 -1
  36. package/packages/viewer/dist/atlas-viewer.js +35 -1
  37. package/packages/viewer/dist/render.js +16 -7
  38. package/packages/viewer/dist/theme.js +4 -0
  39. package/packages/viewer/dist/tooltip.js +35 -0
  40. package/packages/viewer/dist/types.d.ts +7 -0
  41. package/packages/viewer/dist/viewer.js +4 -0
@@ -32,6 +32,13 @@ export function renderSceneToSvg(scene, options = {}) {
32
32
  .map((leader) => `<line class="wo-leader wo-leader-${leader.mode}" x1="${leader.x1}" y1="${leader.y1}" x2="${leader.x2}" y2="${leader.y2}" data-render-id="${escapeXml(leader.renderId)}" data-group-id="${escapeAttribute(leader.groupId ?? "")}" />`)
33
33
  .join("")
34
34
  : "";
35
+ const relationMarkup = layers.relations
36
+ ? scene.relations
37
+ .filter((relation) => !relation.hidden)
38
+ .filter((relation) => visibleObjectIds.has(relation.fromObjectId) && visibleObjectIds.has(relation.toObjectId))
39
+ .map((relation) => `<line class="wo-relation" x1="${relation.x1}" y1="${relation.y1}" x2="${relation.x2}" y2="${relation.y2}" data-render-id="${escapeXml(relation.renderId)}" data-relation-id="${escapeAttribute(relation.relationId)}" />`)
40
+ .join("")
41
+ : "";
35
42
  const objectMarkup = layers.objects
36
43
  ? visibleObjects
37
44
  .map((object) => renderSceneObject(object, options.selectedObjectId ?? null, theme))
@@ -75,10 +82,11 @@ export function renderSceneToSvg(scene, options = {}) {
75
82
  .wo-bg-glow { fill: url(#wo-bg-glow); }
76
83
  .wo-grid { fill: none; stroke: ${theme.guide}; stroke-width: 1; }
77
84
  .wo-orbit { fill: none; stroke: ${theme.orbit}; stroke-width: 1.5; }
78
- .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
79
- .wo-orbit-front { opacity: 0.9; }
80
- .wo-orbit-band { stroke: ${theme.orbitBand}; stroke-linecap: round; }
81
- .wo-leader { stroke: ${theme.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
85
+ .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
86
+ .wo-orbit-front { opacity: 0.9; }
87
+ .wo-orbit-band { stroke: ${theme.orbitBand}; stroke-linecap: round; }
88
+ .wo-relation { stroke: ${theme.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
89
+ .wo-leader { stroke: ${theme.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
82
90
  .wo-label { fill: ${theme.ink}; font-family: ${theme.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
83
91
  .wo-label-secondary { fill: ${theme.muted}; font-family: ${theme.fontFamily}; font-weight: 500; }
84
92
  .wo-title { fill: ${theme.ink}; font: 700 24px ${theme.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
@@ -109,9 +117,10 @@ export function renderSceneToSvg(scene, options = {}) {
109
117
  <g data-worldorbit-world="true">
110
118
  <g data-worldorbit-camera-root="${WORLD_LAYER_ID}" id="${WORLD_LAYER_ID}">
111
119
  <g data-worldorbit-world-content="true">
112
- ${layers.orbits ? `<g data-layer-id="orbits-back">${orbitMarkup.back}</g>` : ""}
113
- ${layers.guides ? `<g data-layer-id="guides">${leaderMarkup}</g>` : ""}
114
- ${layers.objects ? `<g data-layer-id="objects">${objectMarkup}</g>` : ""}
120
+ ${layers.orbits ? `<g data-layer-id="orbits-back">${orbitMarkup.back}</g>` : ""}
121
+ ${layers.guides ? `<g data-layer-id="guides">${leaderMarkup}</g>` : ""}
122
+ ${layers.relations ? `<g data-layer-id="relations">${relationMarkup}</g>` : ""}
123
+ ${layers.objects ? `<g data-layer-id="objects">${objectMarkup}</g>` : ""}
115
124
  ${layers.orbits ? `<g data-layer-id="orbits-front">${orbitMarkup.front}</g>` : ""}
116
125
  ${layers.labels ? `<g data-layer-id="labels">${labelMarkup}</g>` : ""}
117
126
  </g>
@@ -1,6 +1,7 @@
1
1
  const DEFAULT_LAYERS = {
2
2
  background: true,
3
3
  guides: true,
4
+ relations: true,
4
5
  orbits: true,
5
6
  objects: true,
6
7
  labels: true,
@@ -15,6 +16,7 @@ const THEME_PRESETS = {
15
16
  backgroundGlow: "rgba(240, 180, 100, 0.18)",
16
17
  panel: "rgba(7, 17, 27, 0.9)",
17
18
  panelLine: "rgba(168, 207, 242, 0.18)",
19
+ relation: "rgba(240, 180, 100, 0.42)",
18
20
  orbit: "rgba(163, 209, 255, 0.24)",
19
21
  orbitBand: "rgba(255, 190, 120, 0.28)",
20
22
  guide: "rgba(255, 255, 255, 0.04)",
@@ -37,6 +39,7 @@ const THEME_PRESETS = {
37
39
  backgroundGlow: "rgba(120, 255, 215, 0.16)",
38
40
  panel: "rgba(7, 20, 30, 0.9)",
39
41
  panelLine: "rgba(120, 255, 215, 0.16)",
42
+ relation: "rgba(156, 231, 255, 0.42)",
40
43
  orbit: "rgba(120, 255, 215, 0.2)",
41
44
  orbitBand: "rgba(137, 185, 255, 0.24)",
42
45
  guide: "rgba(255, 255, 255, 0.035)",
@@ -59,6 +62,7 @@ const THEME_PRESETS = {
59
62
  backgroundGlow: "rgba(255, 127, 95, 0.18)",
60
63
  panel: "rgba(24, 9, 13, 0.9)",
61
64
  panelLine: "rgba(255, 166, 149, 0.16)",
65
+ relation: "rgba(255, 178, 125, 0.42)",
62
66
  orbit: "rgba(255, 188, 164, 0.22)",
63
67
  orbitBand: "rgba(255, 214, 139, 0.24)",
64
68
  guide: "rgba(255, 255, 255, 0.03)",
@@ -76,6 +76,41 @@ function buildTooltipFields(details) {
76
76
  });
77
77
  }
78
78
  const placement = details.object.placement;
79
+ if (details.object.groups?.length) {
80
+ fields.set("groups", {
81
+ key: "groups",
82
+ label: "Groups",
83
+ value: details.object.groups.join(", "),
84
+ });
85
+ }
86
+ if (details.object.epoch) {
87
+ fields.set("epoch", {
88
+ key: "epoch",
89
+ label: "Epoch",
90
+ value: details.object.epoch,
91
+ });
92
+ }
93
+ if (details.object.referencePlane) {
94
+ fields.set("referencePlane", {
95
+ key: "referencePlane",
96
+ label: "Reference Plane",
97
+ value: details.object.referencePlane,
98
+ });
99
+ }
100
+ if (details.object.tidalLock !== undefined) {
101
+ fields.set("tidalLock", {
102
+ key: "tidalLock",
103
+ label: "Tidal Lock",
104
+ value: details.object.tidalLock ? "true" : "false",
105
+ });
106
+ }
107
+ if (details.object.resonance) {
108
+ fields.set("resonance", {
109
+ key: "resonance",
110
+ label: "Resonance",
111
+ value: `${details.object.resonance.targetObjectId} ${details.object.resonance.ratio}`,
112
+ });
113
+ }
79
114
  if (placement?.mode === "at") {
80
115
  fields.set("placement", {
81
116
  key: "placement",
@@ -9,6 +9,7 @@ export interface WorldOrbitTheme {
9
9
  backgroundGlow: string;
10
10
  panel: string;
11
11
  panelLine: string;
12
+ relation: string;
12
13
  orbit: string;
13
14
  orbitBand: string;
14
15
  guide: string;
@@ -27,6 +28,7 @@ export interface WorldOrbitTheme {
27
28
  export interface ViewerLayerOptions {
28
29
  background?: boolean;
29
30
  guides?: boolean;
31
+ relations?: boolean;
30
32
  orbits?: boolean;
31
33
  objects?: boolean;
32
34
  labels?: boolean;
@@ -73,8 +75,10 @@ export interface ViewerObjectDetails {
73
75
  renderObject: RenderSceneObject;
74
76
  label: RenderSceneLabel | null;
75
77
  group: RenderSceneGroup | null;
78
+ semanticGroups: RenderScene["semanticGroups"];
76
79
  orbit: RenderOrbitVisual | null;
77
80
  relatedOrbits: RenderOrbitVisual[];
81
+ relations: RenderScene["relations"];
78
82
  parent: RenderSceneObject | null;
79
83
  children: RenderSceneObject[];
80
84
  ancestors: RenderSceneObject[];
@@ -117,6 +121,7 @@ export interface ViewerBookmark {
117
121
  export interface AtlasViewerControls {
118
122
  search?: boolean;
119
123
  typeFilter?: boolean;
124
+ groupFilter?: boolean;
120
125
  viewpointSelect?: boolean;
121
126
  inspector?: boolean;
122
127
  bookmarks?: boolean;
@@ -132,6 +137,8 @@ export interface AtlasInspectorSnapshot {
132
137
  projection: ViewProjection;
133
138
  renderPreset: RenderPresetName | null;
134
139
  groupCount: number;
140
+ semanticGroupCount: number;
141
+ relationCount: number;
135
142
  viewpointCount: number;
136
143
  };
137
144
  }
@@ -644,11 +644,15 @@ export function createInteractiveViewer(container, options) {
644
644
  renderObject,
645
645
  label: scene.labels.find((label) => label.objectId === renderObject.objectId && !label.hidden) ?? null,
646
646
  group: scene.groups.find((group) => group.renderId === renderObject.groupId) ?? null,
647
+ semanticGroups: scene.semanticGroups.filter((group) => renderObject.semanticGroupIds.includes(group.id)),
647
648
  orbit: scene.orbitVisuals.find((orbit) => orbit.objectId === renderObject.objectId && !orbit.hidden) ?? null,
648
649
  relatedOrbits: scene.orbitVisuals.filter((orbit) => !orbit.hidden &&
649
650
  (orbit.objectId === renderObject.objectId ||
650
651
  renderObject.ancestorIds.includes(orbit.objectId) ||
651
652
  renderObject.childIds.includes(orbit.objectId))),
653
+ relations: scene.relations.filter((relation) => !relation.hidden &&
654
+ (relation.fromObjectId === renderObject.objectId ||
655
+ relation.toObjectId === renderObject.objectId)),
652
656
  parent: getObjectById(renderObject.parentId),
653
657
  children: renderObject.childIds.map((childId) => getObjectById(childId)).filter(Boolean),
654
658
  ancestors: renderObject.ancestorIds