worldorbit 2.5.13 → 2.5.15
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/README.md +37 -11
- package/dist/unpkg/worldorbit-core.min.js +12 -5
- package/dist/unpkg/worldorbit-markdown.min.js +32 -23
- package/dist/unpkg/worldorbit-viewer.min.js +55 -41
- package/dist/unpkg/worldorbit.js +1713 -231
- package/dist/unpkg/worldorbit.min.js +58 -44
- package/package.json +2 -2
- package/packages/core/README.md +5 -1
- package/packages/core/dist/atlas-edit.d.ts +2 -2
- package/packages/core/dist/atlas-edit.js +70 -7
- 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/draft-parse.js +786 -153
- package/packages/core/dist/draft.d.ts +3 -0
- package/packages/core/dist/draft.js +47 -3
- package/packages/core/dist/format.js +165 -9
- package/packages/core/dist/load.js +58 -13
- package/packages/core/dist/normalize.js +7 -0
- package/packages/core/dist/scene.js +66 -13
- package/packages/core/dist/types.d.ts +97 -3
- package/packages/markdown/README.md +1 -1
- package/packages/viewer/README.md +2 -1
- package/packages/viewer/dist/atlas-state.js +7 -1
- package/packages/viewer/dist/atlas-viewer.js +35 -1
- package/packages/viewer/dist/render.js +16 -7
- package/packages/viewer/dist/theme.js +4 -0
- package/packages/viewer/dist/tooltip.js +35 -0
- package/packages/viewer/dist/types.d.ts +7 -0
- package/packages/viewer/dist/viewer.js +4 -0
- package/packages/editor/dist/editor.d.ts +0 -2
- package/packages/editor/dist/editor.js +0 -2998
- package/packages/editor/dist/index.d.ts +0 -2
- package/packages/editor/dist/index.js +0 -1
- package/packages/editor/dist/types.d.ts +0 -53
- package/packages/editor/dist/types.js +0 -1
- package/packages/markdown/dist/html.d.ts +0 -3
- package/packages/markdown/dist/html.js +0 -57
- package/packages/markdown/dist/index.d.ts +0 -4
- package/packages/markdown/dist/index.js +0 -3
- package/packages/markdown/dist/rehype.d.ts +0 -10
- package/packages/markdown/dist/rehype.js +0 -49
- package/packages/markdown/dist/remark.d.ts +0 -9
- package/packages/markdown/dist/remark.js +0 -28
- package/packages/markdown/dist/types.d.ts +0 -11
- package/packages/markdown/dist/types.js +0 -1
package/README.md
CHANGED
|
@@ -29,10 +29,12 @@ WorldOrbit is not intended to be a real-world astronomy simulator or a high-prec
|
|
|
29
29
|
## Quick Example
|
|
30
30
|
|
|
31
31
|
```worldorbit
|
|
32
|
-
schema 2.
|
|
32
|
+
schema 2.1
|
|
33
33
|
|
|
34
34
|
system Iyath
|
|
35
35
|
title "Iyath System"
|
|
36
|
+
epoch "JY-0001.0"
|
|
37
|
+
referencePlane ecliptic
|
|
36
38
|
|
|
37
39
|
defaults
|
|
38
40
|
view isometric
|
|
@@ -40,6 +42,10 @@ defaults
|
|
|
40
42
|
preset atlas-card
|
|
41
43
|
theme atlas
|
|
42
44
|
|
|
45
|
+
group inner-system
|
|
46
|
+
label "Inner System"
|
|
47
|
+
color #d9b37a
|
|
48
|
+
|
|
43
49
|
object star Iyath
|
|
44
50
|
|
|
45
51
|
object planet Naar
|
|
@@ -50,6 +56,7 @@ object planet Naar
|
|
|
50
56
|
inclination 24deg
|
|
51
57
|
phase 42deg
|
|
52
58
|
atmosphere nitrogen-oxygen
|
|
59
|
+
groups inner-system
|
|
53
60
|
````
|
|
54
61
|
|
|
55
62
|
## Installation
|
|
@@ -92,7 +99,7 @@ For direct browser usage, use the browser bundle:
|
|
|
92
99
|
<html>
|
|
93
100
|
<head>
|
|
94
101
|
<meta charset="utf-8" />
|
|
95
|
-
<script src="https://unpkg.com/worldorbit@
|
|
102
|
+
<script src="https://unpkg.com/worldorbit@latest/dist/unpkg/worldorbit.min.js"></script>
|
|
96
103
|
<style>
|
|
97
104
|
html, body {
|
|
98
105
|
margin: 0;
|
|
@@ -111,9 +118,10 @@ For direct browser usage, use the browser bundle:
|
|
|
111
118
|
|
|
112
119
|
<script>
|
|
113
120
|
const source = `
|
|
114
|
-
schema 2.
|
|
121
|
+
schema 2.1
|
|
115
122
|
|
|
116
123
|
system Iyath
|
|
124
|
+
epoch "JY-0001.0"
|
|
117
125
|
|
|
118
126
|
object star Iyath
|
|
119
127
|
object planet Naar
|
|
@@ -165,19 +173,21 @@ The editor is optional. The core format remains text-first.
|
|
|
165
173
|
|
|
166
174
|
## Canonical Schema
|
|
167
175
|
|
|
168
|
-
|
|
176
|
+
New atlas authoring should start with:
|
|
169
177
|
|
|
170
178
|
```worldorbit
|
|
171
|
-
schema 2.
|
|
179
|
+
schema 2.1
|
|
172
180
|
```
|
|
173
181
|
|
|
174
182
|
Example:
|
|
175
183
|
|
|
176
184
|
```worldorbit
|
|
177
|
-
schema 2.
|
|
185
|
+
schema 2.1
|
|
178
186
|
|
|
179
187
|
system Iyath
|
|
180
188
|
title "Iyath System"
|
|
189
|
+
epoch "JY-0001.0"
|
|
190
|
+
referencePlane ecliptic
|
|
181
191
|
|
|
182
192
|
defaults
|
|
183
193
|
view isometric
|
|
@@ -185,10 +195,17 @@ defaults
|
|
|
185
195
|
preset atlas-card
|
|
186
196
|
theme atlas
|
|
187
197
|
|
|
198
|
+
group inner-system
|
|
199
|
+
label "Inner System"
|
|
200
|
+
summary "Naar and its inhabited infrastructure"
|
|
201
|
+
color #d9b37a
|
|
202
|
+
|
|
188
203
|
viewpoint overview
|
|
189
204
|
label "Atlas Overview"
|
|
190
205
|
summary "Fit the whole system."
|
|
191
206
|
projection isometric
|
|
207
|
+
filter
|
|
208
|
+
groups inner-system
|
|
192
209
|
|
|
193
210
|
annotation naar-notes
|
|
194
211
|
label "Naar Notes"
|
|
@@ -196,6 +213,7 @@ annotation naar-notes
|
|
|
196
213
|
body "Heimatwelt der Enari."
|
|
197
214
|
|
|
198
215
|
object star Iyath
|
|
216
|
+
mass 1.02sol
|
|
199
217
|
|
|
200
218
|
object planet Naar
|
|
201
219
|
orbit Iyath
|
|
@@ -204,11 +222,14 @@ object planet Naar
|
|
|
204
222
|
angle 28deg
|
|
205
223
|
inclination 24deg
|
|
206
224
|
phase 42deg
|
|
225
|
+
groups inner-system
|
|
207
226
|
image /demo/assets/naar-map.png
|
|
208
227
|
atmosphere nitrogen-oxygen
|
|
209
228
|
```
|
|
210
229
|
|
|
211
|
-
|
|
230
|
+
Schema `2.1` adds comments, semantic `group` and `relation` sections, object-level `epoch` and `referencePlane`, declarative resonance and validation hints, and optional structured lore blocks such as `climate`, `habitability`, and `settlement`.
|
|
231
|
+
|
|
232
|
+
Stable `1.0` source is still accepted. Canonical `schema 2.0` source remains fully supported, and legacy `schema 2.0-draft` files stay readable as a compatibility path with a deprecation diagnostic.
|
|
212
233
|
|
|
213
234
|
## Basic Usage
|
|
214
235
|
|
|
@@ -227,7 +248,7 @@ planet Naar orbit Iyath distance 1.18au
|
|
|
227
248
|
`.trim());
|
|
228
249
|
|
|
229
250
|
const loaded = loadWorldOrbitSource(`
|
|
230
|
-
schema 2.
|
|
251
|
+
schema 2.1
|
|
231
252
|
|
|
232
253
|
system Iyath
|
|
233
254
|
object star Iyath
|
|
@@ -330,7 +351,7 @@ const atlasDocument = upgradeDocumentToV2(stable.document, {
|
|
|
330
351
|
preset: "atlas-card",
|
|
331
352
|
});
|
|
332
353
|
|
|
333
|
-
const atlasSource = formatDocument(atlasDocument, { schema: "2.
|
|
354
|
+
const atlasSource = formatDocument(atlasDocument, { schema: "2.1" });
|
|
334
355
|
const loaded = loadWorldOrbitSource(atlasSource);
|
|
335
356
|
const parsedAtlas = parseWorldOrbitAtlas(atlasSource);
|
|
336
357
|
const scene = renderDocumentToScene(loaded.document, {
|
|
@@ -349,12 +370,13 @@ Viewer features in `v2.5` include:
|
|
|
349
370
|
* scene-based SVG rendering
|
|
350
371
|
* projections: `topdown` and `isometric`
|
|
351
372
|
* theme presets: `atlas`, `nightglass`, `ember`
|
|
352
|
-
* layer controls for background, guides, orbits, objects, labels, and
|
|
373
|
+
* layer controls for background, guides, orbits, objects, labels, metadata, and relations
|
|
353
374
|
* selection, hover, focus, fit, pan, zoom, and rotate
|
|
354
375
|
* tooltip cards and object detail payloads
|
|
355
376
|
* viewpoints, filters, search, and bookmark capture
|
|
356
377
|
* deep-linkable atlas state
|
|
357
378
|
* embeddable viewer custom elements
|
|
379
|
+
* semantic group filters, relation overlays, and schema 2.1 detail metadata
|
|
358
380
|
|
|
359
381
|
## Markdown Integration
|
|
360
382
|
|
|
@@ -395,6 +417,7 @@ Examples live in:
|
|
|
395
417
|
* [examples/minimal.worldorbit](./examples/minimal.worldorbit)
|
|
396
418
|
* [examples/iyath.worldorbit](./examples/iyath.worldorbit)
|
|
397
419
|
* [examples/iyath.schema2.worldorbit](./examples/iyath.schema2.worldorbit)
|
|
420
|
+
* [examples/iyath.schema21.worldorbit](./examples/iyath.schema21.worldorbit)
|
|
398
421
|
* [examples/iyath.schema2-draft.worldorbit](./examples/iyath.schema2-draft.worldorbit)
|
|
399
422
|
* [examples/markdown/static.md](./examples/markdown/static.md)
|
|
400
423
|
* [examples/markdown/interactive.md](./examples/markdown/interactive.md)
|
|
@@ -406,6 +429,9 @@ Browser-facing examples and demos live in the repository under `demo/`, `studio/
|
|
|
406
429
|
|
|
407
430
|
* [migration guide: v0.8 to v1.0](./docs/migration-v0.8-to-v1.0.md)
|
|
408
431
|
* [migration guide: v1 to v2](./docs/migration-v1-to-v2.md)
|
|
432
|
+
* [migration guide: v2.0 to v2.1](./docs/migration-v2-to-v2.1.md)
|
|
433
|
+
* [language reference](./docs/language-reference.md)
|
|
434
|
+
* [language reference (DE)](./docs/language-reference.de.md)
|
|
409
435
|
* [API inventory](./docs/api-inventory.md)
|
|
410
436
|
* [changelog](./docs/changelog.md)
|
|
411
437
|
|
|
@@ -439,4 +465,4 @@ The long-term focus is:
|
|
|
439
465
|
|
|
440
466
|
## License
|
|
441
467
|
|
|
442
|
-
MIT
|
|
468
|
+
MIT
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
"use strict";var WorldOrbitCore=(()=>{var Me=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Xt=Object.prototype.hasOwnProperty;var Ht=(e,t)=>{for(var n in t)Me(e,n,{get:t[n],enumerable:!0})},Jt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Kt(t))!Xt.call(e,i)&&i!==n&&Me(e,i,{get:()=>t[i],enumerable:!(r=Gt(t,i))||r.enumerable});return e};var Zt=e=>Jt(Me({},"__esModule",{value:!0}),e);var Oi={};Ht(Oi,{WORLDORBIT_FIELD_KEYS:()=>Ze,WORLDORBIT_FIELD_SCHEMAS:()=>Ae,WORLDORBIT_OBJECT_TYPES:()=>X,WorldOrbitError:()=>d,cloneAtlasDocument:()=>$e,createDiagnostic:()=>rt,createEmptyAtlasDocument:()=>Ve,detectWorldOrbitSchemaVersion:()=>Xe,diagnosticFromError:()=>T,extractWorldOrbitBlocks:()=>Wt,formatAtlasDocument:()=>Re,formatDocument:()=>ve,formatDraftDocument:()=>Ne,getAtlasDocumentNode:()=>Ue,getFieldSchema:()=>A,isKnownFieldKey:()=>H,listAtlasDocumentPaths:()=>Pt,load:()=>ji,loadWorldOrbitSource:()=>Te,loadWorldOrbitSourceWithDiagnostics:()=>He,materializeAtlasDocument:()=>W,materializeDraftDocument:()=>vt,normalizeDocument:()=>S,normalizeWithDiagnostics:()=>it,parse:()=>Ct,parseSafe:()=>vi,parseWithDiagnostics:()=>ue,parseWorldOrbit:()=>E,parseWorldOrbitAtlas:()=>xe,parseWorldOrbitDraft:()=>Dt,removeAtlasDocumentNode:()=>Rt,render:()=>Ii,renderDocumentToScene:()=>B,resolveAtlasDiagnosticPath:()=>Ge,resolveAtlasDiagnostics:()=>Ye,rotatePoint:()=>ft,stringify:()=>xi,supportsObjectType:()=>Se,tokenizeLine:()=>Qe,tokenizeLineDetailed:()=>z,unitFamilyAllowsUnit:()=>Fe,updateAtlasDocumentNode:()=>Et,upgradeDocumentToDraftV2:()=>je,upgradeDocumentToV2:()=>ne,upsertAtlasDocumentNode:()=>qe,validateAtlasDocumentWithDiagnostics:()=>Nt,validateDocument:()=>M,validateDocumentWithDiagnostics:()=>de});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var K=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],D=K.filter(e=>e!=="system"),Qt=["star","planet","moon","asteroid","comet","structure","phenomenon"],Je=["structure","phenomenon"],P=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],en=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function y(e,t){return{key:e,...t}}var X=new Set(K),Ae=new Map([y("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:P}),y("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"distance"}),y("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"distance"}),y("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:P}),y("period",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"duration"}),y("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"angle"}),y("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"angle"}),y("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"angle"}),y("at",{kind:"string",placement:!0,arity:"single",objectTypes:Je}),y("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Je}),y("free",{kind:"string",placement:!0,arity:"single",objectTypes:en}),y("kind",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("class",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("culture",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:K}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:K}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:Qt}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:K}),y("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"radius"}),y("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"mass"}),y("density",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"generic"}),y("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"generic"}),y("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"generic"}),y("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:D}),y("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),y("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("on",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("source",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"duration"})].map(e=>[e.key,e])),Ze=new Set(Ae.keys());function A(e){return Ae.get(e)}function H(e){return Ze.has(e)}function Se(e,t){return e.objectTypes.includes(t)}function Fe(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Qe(e){return z(e).map(t=>t.value)}function z(e,t={}){let n=[],r=t.columnOffset??0,i="",s=null,o=!1,a=!1,c=null,l=()=>{s!==null&&(n.push({value:i,column:s,quoted:o}),i="",s=null,o=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(a&&f==="\\"){let p=e[u+1];if(p==='"'||p==="\\"){i+=p,u++;continue}}if(f==='"'){a?a=!1:(s===null&&(s=m),o=!0,c=m,a=!0);continue}if(!a&&/\s/.test(f)){l();continue}s===null&&(s=m),i+=f}if(a)throw new d("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function ae(e){return e.match(/^\s*/)?.[0].length??0}function E(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,s=null;for(let o=0;o<t.length;o++){let a=t[o],c=o+1;if(!a.trim())continue;let l=ae(a),u=z(a.slice(l),{line:c,columnOffset:l});if(u.length!==0){if(l===0){i=!1,s=null;let f=tn(u,c);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",c,l+1);if(u.length===1&&u[0].value==="info"){i=!0,s=l;continue}i&&l<=(s??0)&&(i=!1),i?r.infoEntries.push(on(u,c)):r.blockFields.push(rn(u,c))}}return{type:"document",objects:n}}function tn(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!X.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:nn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function nn(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=A(i.value);if(!s)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(s.arity==="multiple")for(;r<e.length&&!H(e[r].value);)o.push(e[r]),r++;else{let a=e[r];a&&(o.push(a),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(a=>a.value),location:{line:t,column:i.column}})}return n}function rn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!A(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function on(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var et=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,sn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),an=/^[A-Za-z][A-Za-z0-9+.-]*:/;function S(e){let t=null,n=[];for(let r of e.objects){let i=cn(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",system:t,objects:n}}function cn(e){let t=[...e.inlineFields,...e.blockFields];ln(e.objectType,t);let n=un(t),r=dn(e.objectType,n),i=fn(n),s=hn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,properties:i,info:s}:{type:e.objectType,id:e.name,properties:i,placement:r,info:s}}function ln(e,t){for(let n of t){let r=A(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Se(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function un(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function dn(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),s=t.has("free"),o=[n,r,i,s].filter(Boolean).length;if(o>1){let a=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",a?.location)}if(e==="system"&&o>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:ce(t,"orbit"),distance:V(t,"distance"),semiMajor:V(t,"semiMajor"),eccentricity:bn(t,"eccentricity"),period:V(t,"period"),angle:V(t,"angle"),inclination:V(t,"inclination"),phase:V(t,"phase")};if(r){let a=le(t,"at"),c=ce(t,"at");return{mode:"at",target:c,reference:yn(c,a.location)}}if(i)return{mode:"surface",target:ce(t,"surface")};if(s){let a=ce(t,"free"),c=gn(a);return{mode:"free",distance:c??void 0,descriptor:c?void 0:a}}return null}function fn(e){let t={};for(let[n,r]of e.entries()){let i=A(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=wn(r);break;case"number":t[n]=nt(U(r),n,r.location);break;case"unit":t[n]=tt(U(r),r.location,n);break;case"string":t[n]=pn(n,r);break}}return t}function pn(e,t){let n=t.values.join(" ").trim();return e==="image"&&mn(n,t.location),n}function mn(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(an);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function hn(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function yn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function tt(e,t,n){let r=e.match(et);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=A(n);if(s?.unitFamily&&!Fe(s.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function gn(e){let t=e.match(et);return t?{value:Number(t[1]),unit:t[2]??null}:null}function V(e,t){if(!e.has(t))return;let n=le(e,t);return tt(U(n),n.location,t)}function bn(e,t){if(!e.has(t))return;let n=le(e,t);return nt(U(n),t,n.location)}function nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function wn(e){let t=U(e).toLowerCase(),n=sn.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function le(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function ce(e,t){return U(le(e,t))}function U(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var In=new Set(["star","planet","moon","asteroid","comet"]);function M(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!In.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&jn(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&vn(r,r.placement.reference,t))}}function jn(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function vn(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function rt(e){return{...e}}function T(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function ue(e){let t;try{t=E(e)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"parse")]}}let n;try{n=S(t)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"normalize")]}}try{M(n)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function it(e){try{return{ok:!0,value:S(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"normalize")]}}}function de(e){try{return M(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"validate")]}}}var J=1495978707e-1,xn=6371,On=71492,$n=695700,Tn=63241.077,kn=206264.806,Dn=206264806,ut=.68,Mn=.2,dt=28;function B(e,t={}){let n=Sn(t),r=n.width,i=n.height,s=n.padding,o=An(e),a=Ln(e,t.projection),c=Pn(o,t.scaleModel),l=Rn(o),u=e.system?.id??null,f=new Map(e.objects.map(h=>[h.id,h])),m=mr(e.objects,f),p=new Map,g=[],b=[],v=[],x=[],j=[],O=new Map,L=new Map;for(let h of e.objects){let k=h.placement;if(!k){v.push(h);continue}if(k.mode==="orbit"){at(L,k.target,h);continue}if(k.mode==="surface"){at(O,k.target,h);continue}if(k.mode==="at"){j.push(h);continue}x.push(h)}let Y=x.length>0?r*.42:r/2,F=i/2,N={orbitChildren:L,surfaceChildren:O,objectMap:f,spacingFactor:l,projection:a,scaleModel:c},C=v.find(h=>h.type==="star")??v[0]??null;C&&Le(C,Y,F,0,p,g,b,N);let ke=v.filter(h=>h.id!==C?.id);if(ke.length>0){let h=Math.min(r,i)*.28*l*c.orbitDistanceMultiplier;ke.forEach((k,w)=>{let De=ee(w,ke.length,-Math.PI/2),_=te(De,h,a,1);Le(k,Y+_.x,F+_.y,0,p,g,b,N)})}x.forEach((h,k)=>{let w=r-s-140-Ir(h.placement?.mode==="free"?h.placement.distance:void 0,c),De=Math.max(76,(i-s*2-180)/Math.max(1,x.length)*l)*c.freePlacementMultiplier,_=s+92+k*De;p.set(h.id,{object:h,x:w,y:_,radius:he(h,0,c),sortKey:ge(w,_,0)}),b.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:w-60,y1:_,x2:w-18,y2:_,mode:"free"}),pe(h,p,g,b,N,1)}),j.forEach((h,k)=>{if(p.has(h.id)||!h.placement||h.placement.mode!=="at")return;let w=fr(h.placement.reference,p,f,k,j.length,r,i,s,N);p.set(h.id,{object:h,x:w.x,y:w.y,radius:he(h,2,c),sortKey:ge(w.x,w.y,2),anchorX:w.anchorX,anchorY:w.anchorY}),w.anchorX!==void 0&&w.anchorY!==void 0&&b.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:w.anchorX,y1:w.anchorY,x2:w.x,y2:w.y,mode:"at"}),pe(h,p,g,b,N,2)});let G=[...p.values()].map(h=>Nn(h,c,m)),ie=g.map(h=>_n(h,m.groupIds.get(h.object.id)??null)),oe=b.map(h=>zn(h)),se=Bn(G,i,c.labelMultiplier),Vt=Wn(ie,oe,G,se),Ut=Cn(G,ie,oe,se,m),qt=Vn(e,a,n.preset,m,f),Yt=rr(r,i,G,ie,oe,se);return{width:r,height:i,padding:s,renderPreset:n.preset,projection:a,scaleModel:c,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${ct(a)} view - ${ct(o)} layout`,systemId:u,viewMode:a,layoutPreset:o,metadata:{format:e.format,version:e.version,view:a,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Yt,layers:Vt,groups:Ut,viewpoints:qt,objects:G,orbitVisuals:ie,leaders:oe,labels:se}}function ft(e,t,n){let r=Ie(n),i=Math.cos(r),s=Math.sin(r),o=e.x-t.x,a=e.y-t.y;return{x:t.x+o*i-a*s,y:t.y+o*s+a*i}}function An(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Sn(e){let t=Fn(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Fn(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Ln(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Pn(e,t){return{...En(e),...t}}function En(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Rn(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Nn(e,t,n){let{object:r,x:i,y:s,radius:o,sortKey:a,anchorX:c,anchorY:l}=e;return{renderId:we(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,x:i,y:s,radius:o,visualRadius:wr(r,o,t),sortKey:a,anchorX:c,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:vr(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function _n(e,t){return{renderId:`${we(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0}}function zn(e){return{renderId:`${we(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Bn(e,t,n){let r=[],i=[],s=[...e].filter(o=>!o.hidden).sort((o,a)=>o.sortKey-a.sortKey);for(let o of s){let a=o.y>t*.62?-1:1,c=xr(o,n),l=o.y+a*(o.radius+18*n),u=l+a*(16*n),f=ot(o.x,l,u,c,a),m=0;for(;i.some(p=>gr(p,f))&&m<10;)l+=a*14*n,u+=a*14*n,f=ot(o.x,l,u,c,a),m+=1;i.push(f),r.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,label:o.label,secondaryLabel:o.secondaryLabel,x:o.x,y:l,secondaryY:u,textAnchor:"middle",direction:a<0?"above":"below",hidden:o.hidden})}return r}function Wn(e,t,n,r){let i=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),s=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:i},{id:"orbits-front",renderIds:s},{id:"objects",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Cn(e,t,n,r,i){let s=new Map,o=a=>{if(!a)return null;let c=s.get(a);if(c)return c;let l=i.groupRoots.get(a)??null,u={renderId:a,rootObjectId:l,label:l??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Q(0,0,0,0)};return s.set(a,u),u};for(let a of e){let c=o(a.groupId);c&&!a.hidden&&c.objectIds.push(a.objectId)}for(let a of t){let c=o(a.groupId);c&&!a.hidden&&c.orbitIds.push(a.objectId)}for(let a of n){let c=o(a.groupId);c&&!a.hidden&&c.leaderIds.push(a.objectId)}for(let a of r){let c=o(a.groupId);c&&!a.hidden&&c.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=hr(a,e,t,n,r);return[...s.values()].sort((a,c)=>a.label.localeCompare(c.label))}function Vn(e,t,n,r,i){let s=Un(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,m,...p]=l.split(".");if(f!=="viewpoint"||!m||p.length===0)continue;let g=er(m);if(!g)continue;let b=p.join(".").toLowerCase(),v=o.get(g)??{id:g};qn(v,b,u,t,n,r,i),o.set(g,v)}let a=[...o.values()].map(l=>Yn(l,t,n,i)).filter(Boolean),c=a.findIndex(l=>l.id===s.id);return c>=0?a.splice(c,1,{...s,...a[c],layers:{...s.layers,...a[c].layers},filter:a[c].filter??s.filter,generated:!1}):a.unshift(s),a.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Un(e,t,n){return{id:"overview",label:e.system?.properties.title?`${String(e.system.properties.title)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function qn(e,t,n,r,i,s,o){let a=n.trim();switch(t){case"label":case"title":a&&(e.label=a);return;case"summary":case"description":a&&(e.summary=a);return;case"focus":case"object":a&&(e.focus=a);return;case"select":case"selection":a&&(e.select=a);return;case"projection":case"view":e.projection=Kn(a)??r;return;case"preset":e.preset=Xn(a)??i;return;case"rotation":case"angle":e.rotationDeg=pt(a)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Hn(a);return;case"layers":e.layers=Jn(a);return;case"query":e.filter={...e.filter??fe(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??fe(),objectTypes:Zn(a)};return;case"tags":e.filter={...e.filter??fe(),tags:be(a)};return;case"groups":e.filter={...e.filter??fe(),groupIds:Qn(a,s,o)};return}}function Yn(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,s=e.select&&r.has(e.select)?e.select:i,o=Gn(e.filter),a=e.label?.trim()||tr(e.id);return{id:e.id,label:a,summary:e.summary?.trim()||nr(a,i,o),objectId:i,selectedObjectId:s,projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function fe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Gn(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Kn(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Xn(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function pt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Hn(e){let t=pt(e);return t!==null&&t>0?t:null}function Jn(e){let t={};for(let n of be(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Zn(e){return be(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Qn(e,t,n){return be(e).map(r=>r.startsWith("wo-")&&r.endsWith("-group")?r:t.groupIds.has(r)?t.groupIds.get(r)??Z(r):(n.has(r),Z(r)))}function be(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function er(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function tr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function nr(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function rr(e,t,n,r,i,s){let o=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,m)=>{o=Math.min(o,f),a=Math.min(a,m),c=Math.max(c,f),l=Math.max(l,m)};for(let f of r)f.hidden||mt(f,u);for(let f of i)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of n)f.hidden||ht(f,u);for(let f of s)f.hidden||yt(f,u);return!Number.isFinite(o)||!Number.isFinite(a)?Q(0,0,e,t):Q(o,a,c,l)}function mt(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,s=bt(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,dt*2);for(let o of s)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function Q(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function ht(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function yt(e,t){let r=Or(e.label,e.secondaryLabel,1);t(e.x-r,e.y-18),t(e.x+r,e.y+8),t(e.x-r,e.secondaryY-14),t(e.x+r,e.secondaryY+8)}function Le(e,t,n,r,i,s,o,a){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:he(e,r,a.scaleModel),sortKey:ge(t,n,r)}),pe(e,i,s,o,a,r+1))}function pe(e,t,n,r,i,s){let o=t.get(e.id);if(!o)return;let a=[...i.orbitChildren.get(e.id)??[]].sort(ir),c=or(a,o.radius,i.spacingFactor,i.scaleModel),l=cr(a,c);a.forEach((f,m)=>{let p=sr(f,m,a.length,o,c,l[m]??c.innerPx,i);n.push({object:f,parentId:e.id,kind:p.kind,cx:p.cx,cy:p.cy,radius:p.radius,rx:p.rx,ry:p.ry,rotationDeg:p.rotationDeg,band:p.band,bandThickness:p.bandThickness,frontArcPath:p.frontArcPath,backArcPath:p.backArcPath}),Le(f,p.objectX,p.objectY,s,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let p=ee(m,u.length,-Math.PI/3),g=28*i.spacingFactor,b=te(p,o.radius,i.projection,i.projection==="isometric"?.9:1),v=te(p,o.radius+g,i.projection,i.projection==="isometric"?.9:1),x=o.x+b.x,j=o.y+b.y,O=o.x+v.x,L=o.y+v.y;t.set(f.id,{object:f,x:O,y:L,radius:he(f,s+1,i.scaleModel),sortKey:ge(O,L,s+1),anchorX:x,anchorY:j}),r.push({object:f,groupId:i.objectMap.has(f.id)?Z(yr(f,i.objectMap)):null,x1:x,y1:j,x2:O,y2:L,mode:"surface"}),pe(f,t,n,r,i,s+1)})}function ir(e,t){let n=me(e),r=me(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function or(e,t,n,r){let i=e.map(f=>me(f)),s=i.filter(f=>f!==null),o=t+56*n*r.orbitDistanceMultiplier,a=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(s.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:o,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42};let c=Math.min(...s),l=Math.max(...s),u=l-c;return{metrics:i,minMetric:c,maxMetric:l,metricSpread:u,innerPx:o,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42}}function sr(e,t,n,r,i,s,o){let a=e.placement,c=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let C=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:C,rotationDeg:0,band:c,bandThickness:c?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-C}}let l=I(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),u=s,f=Math.max(u*Math.sqrt(1-l*l),u*.18),m=Ee(a.inclination)??0,p=o.projection==="isometric"?Math.max(Mn,Math.cos(Ie(m)))*ut:1,g=Math.max(f*p,u*.14),b=Ee(a.angle)??0,v=u*l,x=It(-v,0,b),j=r.x+x.x,O=r.y+x.y,L=ur(a.phase,t,n),Y=wt(j,O,u,g,b,L),F=o.projection==="topdown"&&l<=1e-4&&Math.abs(b)<=1e-4,N=c?dr(e,u,i,o.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:j,cy:F?r.y:O,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:g,rotationDeg:b,band:c,bandThickness:N,frontArcPath:o.projection==="isometric"||c?st(j,O,u,g,b,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||c?st(j,O,u,g,b,Math.PI,Math.PI*2):void 0,objectX:Y.x,objectY:Y.y}}function ar(e,t){return t.innerPx+t.stepPx*lr(Math.max(e,0)+1)}function cr(e,t){let n=[];return e.forEach((r,i)=>{let s=me(r),o=t.innerPx+i*t.stepPx,a=s===null?o:ar(s,t),c=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(a,c))}),n}function me(e){return!e.placement||e.placement.mode!=="orbit"?null:ye(e.placement.semiMajor??e.placement.distance??null)}function lr(e){return Math.log(e)/Math.log(2)}function ur(e,t,n){let r=e?Ee(e):null;return r!==null?Ie(r-90):ee(t,n,-Math.PI/2)}function dr(e,t,n,r){let i=ye(Pe(e.properties.inner)),s=ye(Pe(e.properties.outer));if(i!==null&&s!==null){let a=Math.abs(s-i);if(n.metricSpread>0)return I(a/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(i,s),1e-4);return I(a/c*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function fr(e,t,n,r,i,s,o,a,c){if(e.kind==="lagrange")return pr(e,t,n,s,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=ee(r,i,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,m=te(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+m.x,y:l.y+m.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=ee(r,i,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,m=te(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+m.x,y:l.y+m.y,anchorX:l.x,anchorY:l.y}}}return{x:s-a-170,y:o-a-86-r*58*c.scaleModel.freePlacementMultiplier}}function pr(e,t,n,r,i){let s=e.secondary?t.get(e.primary):br(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!s||!o)return{x:r*.7,y:i*.25};let a=o.x-s.x,c=o.y-s.y,l=Math.hypot(a,c)||1,u=a/l,f=c/l,m=-f,p=u,g=I(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-f*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+f*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:s.x-u*g,y:s.y-f*g,anchorX:s.x,anchorY:s.y};case"L4":return{x:o.x+(u*.5-m*.8660254)*g,y:o.y+(f*.5-p*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+m*.8660254)*g,y:o.y+(f*.5+p*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function mr(e,t){let n=new Map,r=new Map;for(let l of e){let u=gt(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,s=new Map,o=new Map,a=l=>{let u=i.get(l);if(u)return u;let f=new Set,m=[],p=n.get(l)??null;for(;p&&!f.has(p);)m.push(p),f.add(p),p=n.get(p)??null;return i.set(l,m),m},c=l=>{let u=o.get(s.get(l)??"");if(u)return u;let f=n.get(l)??null,m=t.get(l),p=l;return m?.placement&&m.placement.mode!=="free"&&f&&(p=c(f)),p};for(let l of e){a(l.id);let u=c(l.id),f=Z(u);s.set(l.id,f),o.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:s,groupRoots:o}}function gt(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function hr(e,t,n,r,i){let s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=(u,f)=>{s=Math.min(s,u),o=Math.min(o,f),a=Math.max(a,u),c=Math.max(c,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&ht(u,l);for(let u of n)!u.hidden&&e.orbitIds.includes(u.objectId)&&mt(u,l);for(let u of r)!u.hidden&&e.leaderIds.includes(u.objectId)&&(l(u.x1,u.y1),l(u.x2,u.y2));for(let u of i)!u.hidden&&e.labelIds.includes(u.objectId)&&yt(u,l);return!Number.isFinite(s)||!Number.isFinite(o)?Q(0,0,0,0):Q(s,o,a,c)}function yr(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=gt(n,t);if(!i)break;let s=t.get(i);if(!s)break;n=s}return n.id}function ot(e,t,n,r,i){return{left:e-r,right:e+r,top:Math.min(t,n)-(i<0?18:12),bottom:Math.max(t,n)+(i<0?8:12)}}function gr(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function br(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function he(e,t,n){let r=jr(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return I((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return I(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return I(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return I(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return I(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return I(8*i,n.minBodyRadius,n.maxBodyRadius)}}function wr(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function ye(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/J;case"m":return e.value/1e3/J;case"ly":return e.value*Tn;case"pc":return e.value*kn;case"kpc":return e.value*Dn;case"re":return e.value*xn/J;case"rj":return e.value*On/J;case"sol":return e.value*$n/J;default:return e.value}}function Ir(e,t){let n=ye(e??null);return n===null||n<=0?0:I(n*96*t.freePlacementMultiplier,0,420)}function jr(e,t){let n=Pe(e);if(!n)return null;let r;switch(n.unit){case"sol":r=I(n.value*22,14,40);break;case"re":r=I(n.value*10,6,18);break;case"km":r=I(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=I(n.value*4,4,20);break}return I(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Pe(e){return!e||typeof e!="object"||!("value"in e)?null:e}function Ee(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ee(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function st(e,t,n,r,i,s,o){let a=bt(e,t,n,r,i,s,o,dt);return a.length===0?"":a.map((c,l)=>`${l===0?"M":"L"} ${lt(c.x)} ${lt(c.y)}`).join(" ")}function bt(e,t,n,r,i,s,o,a){let c=[];for(let l=0;l<=a;l+=1){let u=s+(o-s)*l/a;c.push(wt(e,t,n,r,i,u))}return c}function wt(e,t,n,r,i,s){let o=n*Math.cos(s),a=r*Math.sin(s),c=It(o,a,i);return{x:e+c.x,y:t+c.y}}function It(e,t,n){let r=Ie(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function te(e,t,n,r){let i=n==="isometric"?ut*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function ge(e,t,n){return t*1e3+e+n*.01}function I(e,t,n){return Math.min(Math.max(e,t),n)}function at(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function we(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Z(e){return`${we(e)}-group`}function vr(e){return typeof e=="string"&&e.trim()?e:void 0}function xr(e,t){let n=e.label.length*4.6*t+18,r=e.secondaryLabel.length*3.9*t+18;return Math.max(n,r,e.visualRadius+18)}function Or(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function ct(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ie(e){return e*Math.PI/180}function lt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ne(e,t={}){let n=B(e,t),r=[],i=kr(e,r),s=Dr(e,r),o=Tr(e,n.renderPreset??t.preset??null,n.projection),a=e.system?$r(e,o,i,s,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(c=>!c.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",sourceVersion:e.version,system:a,objects:e.objects.map(xt),diagnostics:r}}function je(e,t={}){return Rr(ne(e,t))}function W(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Lr(e.system),info:Pr(e.system)}:null,objects:e.objects.map(xt)}}function vt(e){return W(e)}function $r(e,t,n,r,i,s){let o=B(e,{preset:s??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:typeof e.system?.properties.title=="string"?e.system.properties.title:null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Mr),annotations:r}}function Tr(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function kr(e,t){let n={};for(let[i,s]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=s);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Dr(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,s,...o]=r.split(".");if(!s||o.length===0)continue;let a=jt(s);if(!a)continue;let c=n.get(a)??{id:a};switch(o.join(".").toLowerCase()){case"label":c.label=i;break;case"target":case"object":c.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":c.body=i;break;case"tags":c.tags=Sr(i);break}n.set(a,c)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let s=jt(`${r.id}-notes`);n.has(s)||(n.set(s,{id:s,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${s}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Fr(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Mr(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function xt(e){return{...e,properties:Ar(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ar(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Sr(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function jt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Fr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Lr(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),t}function Pr(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=Er(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??"")}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Er(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Rr(e){return{...e,version:"2.0-draft"}}var Ot=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function ve(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.0-draft"){if(n==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"?{...e,version:"2.0-draft"}:je(e);return Ne(c)}let a=e.version==="2.0"?e:e.version==="2.0-draft"?{...e,version:"2.0"}:ne(e);return Re(a)}let i=[],s=e;s.system&&i.push(...Nr(s.system));let o=[...s.objects].sort(Be);for(let a of o)i.length>0&&i.push(""),i.push(..._r(a));return i.join(`
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function Nr(e){return _e("system",e.id,e.properties,null,e.info)}function Tt(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${$(e.title)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${$(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${$(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${$(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[s])=>i.localeCompare(s)))t.push(` ${n} ${$(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Wr(n));for(let n of e.annotations)t.push(""),t.push(...Cr(n));return t}function _r(e){return _e(e.type,e.id,e.properties,e.placement,e.info)}function kt(e){return _e(`object ${e.type}`,e.id,e.properties,e.placement,e.info)}function _e(e,t,n,r,i){let s=[`${e} ${t}`],o=[...zr(r),...Br(n)];for(let c of o)s.push(` ${c}`);let a=Object.entries(i).sort(([c],[l])=>c.localeCompare(l));if(a.length>0){o.length>0&&s.push(""),s.push(" info");for(let[c,l]of a)s.push(` ${c} ${$(l)}`)}return s}function zr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...q("distance",e.distance),...q("semiMajor",e.semiMajor),...Ur("eccentricity",e.eccentricity),...q("period",e.period),...q("angle",e.angle),...q("inclination",e.inclination),...q("phase",e.phase)];case"at":return[`at ${qr(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?ze(e.distance):e.descriptor??""}`.trim()]}}function Br(e){return Object.keys(e).sort(Gr).map(t=>`${t} ${Vr(e[t])}`)}function Wr(e){let t=[`viewpoint ${e.id}`,` label ${$(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${$(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=Yr(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${$(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map($).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Cr(e){let t=[`annotation ${e.id}`,` label ${$(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${$(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map($).join(" ")}`),t}function Vr(e){return Array.isArray(e)?e.map(t=>$(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?$(e):ze(e)}function ze(e){return`${e.value}${e.unit??""}`}function q(e,t){return t?[`${e} ${ze(t)}`]:[]}function Ur(e,t){return t===void 0?[]:[`${e} ${t}`]}function qr(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Yr(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Gr(e,t){let n=Ot.indexOf(e),r=Ot.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Be(e,t){let n=$t(e.type),r=$t(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function $t(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function $(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function xe(e){return Mt(e,"2.0")}function Dt(e){return Mt(e,"2.0-draft")}function Mt(e,t){let n=e.split(/\r?\n/),r=!1,i="2.0",s=null,o=null,a=[],c=!1,l=!1,u=new Set,f=new Set;for(let b=0;b<n.length;b++){let v=n[b],x=b+1;if(!v.trim())continue;let j=ae(v),O=z(v.slice(j),{line:x,columnOffset:j});if(O.length!==0){if(!r){i=Kr(O,x),r=!0;continue}if(j===0){o=Xr(O,x,s,a,u,f,{sawDefaults:c,sawAtlas:l}),o.kind==="system"?s=o.system:o.kind==="defaults"?c=!0:o.kind==="atlas"&&(l=!0);continue}if(!o)throw new d("Indented line without parent atlas section",x,j+1);ei(o,j,O,x)}}if(!r)throw new d('Missing required atlas schema header "schema 2.0"');let p=S({type:"document",objects:a}).objects;return M({format:"worldorbit",version:"1.0",system:null,objects:p}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:s,objects:p,diagnostics:i==="2.0-draft"&&t==="2.0"?[{code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}]:[]}}function Kr(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||e[1].value.toLowerCase()!=="2.0-draft"&&e[1].value.toLowerCase()!=="2.0")throw new d('Expected atlas header "schema 2.0" or legacy "schema 2.0-draft"',t,e[0]?.column??1);return e[1].value.toLowerCase()==="2.0-draft"?"2.0-draft":"2.0"}function Xr(e,t,n,r,i,s,o){switch(e[0]?.value.toLowerCase()){case"system":if(n)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Hr(e,t);case"defaults":if(!n)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(o.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:n,seenFields:new Set};case"atlas":if(!n)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(o.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:n,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!n)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Jr(e,t,n,i);case"annotation":if(!n)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Zr(e,t,n,s);case"object":return Qr(e,t,r);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Hr(e,t){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},seenFields:new Set}}function Jr(e,t,n,r){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let i=Ft(e[1].value);if(!i)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate viewpoint id "${i}"`,t,e[1].column);let s={id:i,label:Lt(i),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(s),r.add(i),{kind:"viewpoint",viewpoint:s,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Zr(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=Ft(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let s={id:i,label:Lt(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(s),r.add(i),{kind:"annotation",annotation:s,seenFields:new Set}}function Qr(e,t,n){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let r=e[1],i=e[2],s=r.value;if(!X.has(s)||s==="system")throw new d(`Unknown object type "${r.value}"`,t,r.column);let o={type:"object",objectType:s,name:i.value,inlineFields:pi(e.slice(3),t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}};return n.push(o),{kind:"object",objectNode:o,inInfoBlock:!1,infoIndent:null}}function ei(e,t,n,r){switch(e.kind){case"system":ti(e,n,r);return;case"defaults":ni(e,n,r);return;case"atlas":ri(e,t,n,r);return;case"viewpoint":ii(e,t,n,r);return;case"annotation":si(e,n,r);return;case"object":ai(e,t,n,r);return}}function ti(e,t,n){if(re(t,e.seenFields,n)!=="title")throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column);e.system.title=R(t,n)}function ni(e,t,n){let r=re(t,e.seenFields,n),i=R(t,n);switch(r){case"view":e.system.defaults.view=At(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=St(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ri(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){if(n.length<2)throw new d("Invalid atlas metadata entry",r,n[0]?.column??1);let i=n[0].value;if(i in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i}"`,r,n[0].column);e.system.atlasMetadata[i]=R(n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ii(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){oi(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=re(n,e.seenFields,r),s=R(n,r);switch(i){case"label":e.viewpoint.label=s;return;case"summary":e.viewpoint.summary=s;return;case"focus":e.viewpoint.focusObjectId=s;return;case"select":e.viewpoint.selectedObjectId=s;return;case"projection":e.viewpoint.projection=At(s,r,n[0].column);return;case"preset":e.viewpoint.preset=St(s,r,n[0].column);return;case"zoom":e.viewpoint.zoom=ui(s,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=di(s,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=li(n.slice(1),r);return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function oi(e,t,n){let r=re(t,e.seenFilterFields,n),i=e.viewpoint.filter??fi();switch(r){case"query":i.query=R(t,n);break;case"objecttypes":i.objectTypes=ci(t.slice(1),n);break;case"tags":i.tags=We(t.slice(1),n,"tags");break;case"groups":i.groupIds=We(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function si(e,t,n){switch(re(t,e.seenFields,n)){case"label":e.annotation.label=R(t,n);return;case"target":e.annotation.targetObjectId=R(t,n);return;case"body":e.annotation.body=R(t,n);return;case"tags":e.annotation.tags=We(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function ai(e,t,n,r){if(n.length===1&&n[0].value==="info"){e.inInfoBlock=!0,e.infoIndent=t;return}if(e.inInfoBlock&&t<=(e.infoIndent??0)&&(e.inInfoBlock=!1,e.infoIndent=null),e.inInfoBlock){e.objectNode.infoEntries.push(hi(n,r));return}e.objectNode.blockFields.push(mi(n,r))}function re(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function R(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ci(e,t){if(e.length===0)throw new d("Missing value for atlas field",t);return e.map(n=>{let r=n.value;if(r!=="star"&&r!=="planet"&&r!=="moon"&&r!=="belt"&&r!=="asteroid"&&r!=="comet"&&r!=="ring"&&r!=="structure"&&r!=="phenomenon")throw new d(`Unknown viewpoint object type "${n.value}"`,t,n.column);return r})}function We(e,t,n){if(e.length===0)throw new d(`Missing value for field "${n}"`,t);return e.map(r=>r.value)}function li(e,t){if(e.length===0)throw new d('Missing value for field "layers"',t);let n={};for(let r of e){let i=!r.value.startsWith("-")&&!r.value.startsWith("!"),s=r.value.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){n["orbits-back"]=i,n["orbits-front"]=i;continue}if(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="objects"||s==="labels"||s==="metadata"){n[s]=i;continue}throw new d(`Unknown layer token "${r.value}"`,t,r.column)}return n}function At(e,t,n){let r=e.toLowerCase();if(r==="topdown"||r==="isometric")return r;throw new d(`Unknown projection "${e}"`,t,n)}function St(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function ui(e,t,n,r){let i=Number(e);if(!Number.isFinite(i)||i<=0)throw new d(`Field "${r}" expects a positive number`,t,n);return i}function di(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Field "${r}" expects a finite number`,t,n);return i}function fi(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function pi(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=A(i.value);if(!s)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(s.arity==="multiple")for(;r<e.length&&!H(e[r].value);)o.push(e[r]),r++;else{let a=e[r];a&&(o.push(a),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(a=>a.value),location:{line:t,column:i.column}})}return n}function mi(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!A(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function hi(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}function Ft(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Lt(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ve(e="WorldOrbit"){return{format:"worldorbit",version:"2.0",sourceVersion:"1.0",system:{type:"system",id:e,title:e,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},objects:[],diagnostics:[]}}function $e(e){return structuredClone(e)}function Pt(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(Oe))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(Oe))t.push({kind:"annotation",id:n.id})}for(let n of[...e.objects].sort(Oe))t.push({kind:"object",id:n.id});return t}function Ue(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"object":return t.id?_t(e,t.id):null;case"viewpoint":return t.id?zt(e.system,t.id):null;case"annotation":return t.id?Bt(e.system,t.id):null}}function qe(e,t,n){let r=$e(e),i=Ke(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return Ce(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return Ce(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return Ce(i.annotations,n),r}}function Et(e,t,n){return qe(e,t,n(Ue(e,t)))}function Rt(e,t){let n=$e(e),r=Ke(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;default:return n}}function Ye(e,t){return t.map(n=>({diagnostic:n,path:Ge(e,n)}))}function Ge(e,t){if(t.objectId&&_t(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&zt(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Bt(e.system,n[1]))return{kind:"annotation",id:n[1]}}return t.field&&t.field in Ke(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Nt(e){let t=W(e),n=de(t);return Ye(e,n.diagnostics)}function Ke(e){return e.system||(e.system=Ve().system),e.system}function _t(e,t){return e.objects.find(n=>n.id===t)??null}function zt(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Bt(e,t){return e?.annotations.find(n=>n.id===t)??null}function Ce(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(Oe);return}e[n]=t}function Oe(e,t){return e.id.localeCompare(t.id)}var yi=/^schema\s+2(?:\.0)?$/i,gi=/^schema\s+2\.0-draft$/i;function Xe(e){for(let t of e.split(/\r?\n/)){let n=t.trim();if(n)return gi.test(n)?"2.0-draft":yi.test(n)?"2.0":"1.0"}return"1.0"}function Te(e){let t=He(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function He(e){let t=Xe(e);if(t==="2.0"||t==="2.0-draft")return bi(e,t);let n;try{n=E(e)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"parse")]}}let r;try{r=S(n)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"normalize")]}}try{M(r)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function bi(e,t){let n;try{n=xe(e)}catch(s){return{ok:!1,value:null,diagnostics:[T(s,"parse","load.atlas.failed")]}}let r;try{r=W(n)}catch(s){return{ok:!1,value:null,diagnostics:[T(s,"normalize","load.atlas.materialize.failed")]}}try{M(r)}catch(s){return{ok:!1,value:null,diagnostics:[T(s,"validate","load.atlas.validate.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:r,atlasDocument:n,draftDocument:n,diagnostics:[...n.diagnostics]},diagnostics:[...n.diagnostics]}}var wi=/^```worldorbit(?:\s+(.*))?\s*$/;function Wt(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,s=0,o=[];return t.forEach((a,c)=>{let l=c+1;if(!r){let u=a.match(wi);u&&(r=!0,i=u[1]??null,s=l,o=[]);return}if(a.trim()==="```"){n.push({source:o.join(`
|
|
5
|
-
|
|
1
|
+
"use strict";var WorldOrbitCore=(()=>{var Ye=Object.defineProperty;var Dn=Object.getOwnPropertyDescriptor;var Sn=Object.getOwnPropertyNames;var Fn=Object.prototype.hasOwnProperty;var Mn=(e,t)=>{for(var n in t)Ye(e,n,{get:t[n],enumerable:!0})},Rn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Sn(t))!Fn.call(e,i)&&i!==n&&Ye(e,i,{get:()=>t[i],enumerable:!(r=Dn(t,i))||r.enumerable});return e};var Pn=e=>Rn(Ye({},"__esModule",{value:!0}),e);var Yo={};Mn(Yo,{WORLDORBIT_FIELD_KEYS:()=>ht,WORLDORBIT_FIELD_SCHEMAS:()=>Ge,WORLDORBIT_OBJECT_TYPES:()=>ie,WorldOrbitError:()=>d,cloneAtlasDocument:()=>Ue,createDiagnostic:()=>vt,createEmptyAtlasDocument:()=>ot,detectWorldOrbitSchemaVersion:()=>dt,diagnosticFromError:()=>D,extractWorldOrbitBlocks:()=>kn,formatAtlasDocument:()=>Pe,formatDocument:()=>Ee,formatDraftDocument:()=>Qe,getAtlasDocumentNode:()=>at,getFieldSchema:()=>L,isKnownFieldKey:()=>He,listAtlasDocumentPaths:()=>mn,load:()=>Uo,loadWorldOrbitSource:()=>We,loadWorldOrbitSourceWithDiagnostics:()=>ft,materializeAtlasDocument:()=>pe,materializeDraftDocument:()=>Ct,normalizeDocument:()=>C,normalizeWithDiagnostics:()=>It,parse:()=>xn,parseSafe:()=>Wo,parseWithDiagnostics:()=>je,parseWorldOrbit:()=>q,parseWorldOrbitAtlas:()=>Ve,parseWorldOrbitDraft:()=>an,removeAtlasDocumentNode:()=>yn,render:()=>Vo,renderDocumentToScene:()=>H,resolveAtlasDiagnosticPath:()=>ct,resolveAtlasDiagnostics:()=>lt,rotatePoint:()=>Dt,stringify:()=>qo,supportsObjectType:()=>Ke,tokenizeLine:()=>yt,tokenizeLineDetailed:()=>G,unitFamilyAllowsUnit:()=>oe,updateAtlasDocumentNode:()=>hn,upgradeDocumentToDraftV2:()=>Re,upgradeDocumentToV2:()=>fe,upsertAtlasDocumentNode:()=>st,validateAtlasDocumentWithDiagnostics:()=>gn,validateDocument:()=>z,validateDocumentWithDiagnostics:()=>$t});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var re=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],R=re.filter(e=>e!=="system"),_n=["star","planet","moon","asteroid","comet","structure","phenomenon"],mt=["structure","phenomenon"],W=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],En=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function g(e,t){return{key:e,...t}}var ie=new Set(re),Ge=new Map([g("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:W}),g("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"distance"}),g("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"distance"}),g("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:W}),g("period",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"duration"}),g("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"angle"}),g("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"angle"}),g("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:W,unitFamily:"angle"}),g("at",{kind:"string",placement:!0,arity:"single",objectTypes:mt}),g("surface",{kind:"string",placement:!0,arity:"single",objectTypes:mt}),g("free",{kind:"string",placement:!0,arity:"single",objectTypes:En}),g("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:re}),g("color",{kind:"string",placement:!1,arity:"single",objectTypes:re}),g("image",{kind:"string",placement:!1,arity:"single",objectTypes:_n}),g("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:re}),g("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),g("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),g("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),g("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),g("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),g("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),g("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),g("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),g("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),g("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),g("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),g("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"})].map(e=>[e.key,e])),ht=new Set(Ge.keys());function L(e){return Ge.get(e)}function He(e){return ht.has(e)}function Ke(e,t){return e.objectTypes.includes(t)}function oe(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function yt(e){return G(e).map(t=>t.value)}function G(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,s=!1,o=!1,l=null,c=()=>{a!==null&&(n.push({value:i,column:a,quoted:s}),i="",a=null,s=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(o&&f==="\\"){let p=e[u+1];if(p==='"'||p==="\\"){i+=p,u++;continue}}if(f==='"'){o?o=!1:(a===null&&(a=m),s=!0,l=m,o=!0);continue}if(!o&&/\s/.test(f)){c();continue}a===null&&(a=m),i+=f}if(o)throw new d("Unclosed quote in line",t.line,l??r+e.length);return c(),n}function $e(e){return e.match(/^\s*/)?.[0].length??0}function q(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,a=null;for(let s=0;s<t.length;s++){let o=t[s],l=s+1;if(!o.trim())continue;let c=$e(o),u=G(o.slice(c),{line:l,columnOffset:c});if(u.length!==0){if(c===0){i=!1,a=null;let f=Nn(u,l);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",l,c+1);if(u.length===1&&u[0].value==="info"){i=!0,a=c;continue}i&&c<=(a??0)&&(i=!1),i?r.infoEntries.push(zn(u,l)):r.blockFields.push(Cn(u,l))}}return{type:"document",objects:n}}function Nn(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!ie.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Bn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Bn(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=L(i.value);if(!a)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(a.arity==="multiple")for(;r<e.length&&!He(e[r].value);)s.push(e[r]),r++;else{let o=e[r];o&&(s.push(o),r++)}if(s.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(o=>o.value),location:{line:t,column:i.column}})}return n}function Cn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!L(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function zn(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Vn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Un=/^[A-Za-z][A-Za-z0-9+.-]*:/;function C(e){let t=null,n=[];for(let r of e.objects){let i=Wn(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],objects:n}}function Wn(e){let t=[...e.inlineFields,...e.blockFields];qn(e.objectType,t);let n=Yn(t),r=Gn(e.objectType,n),i=Hn(n),a=Xn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function qn(e,t){for(let n of t){let r=L(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Ke(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Yn(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Gn(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),s=[n,r,i,a].filter(Boolean).length;if(s>1){let o=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",o?.location)}if(e==="system"&&s>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:ke(t,"orbit"),distance:J(t,"distance"),semiMajor:J(t,"semiMajor"),eccentricity:er(t,"eccentricity"),period:J(t,"period"),angle:J(t,"angle"),inclination:J(t,"inclination"),phase:J(t,"phase")};if(r){let o=xe(t,"at"),l=ke(t,"at");return{mode:"at",target:l,reference:Jn(l,o.location)}}if(i)return{mode:"surface",target:ke(t,"surface")};if(a){let o=ke(t,"free"),l=Qn(o);return{mode:"free",distance:l??void 0,descriptor:l?void 0:o}}return null}function Hn(e){let t={};for(let[n,r]of e.entries()){let i=L(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=tr(r);break;case"number":t[n]=wt(Q(r),n,r.location);break;case"unit":t[n]=bt(Q(r),r.location,n);break;case"string":t[n]=Kn(n,r);break}}return t}function Kn(e,t){let n=t.values.join(" ").trim();return e==="image"&&Zn(n,t.location),n}function Zn(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Un);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Xn(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Jn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function bt(e,t,n){let r=e.match(gt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=L(n);if(a?.unitFamily&&!oe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Qn(e){let t=e.match(gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function J(e,t){if(!e.has(t))return;let n=xe(e,t);return bt(Q(n),n.location,t)}function er(e,t){if(!e.has(t))return;let n=xe(e,t);return wt(Q(n),t,n.location)}function wt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function tr(e){let t=Q(e).toLowerCase(),n=Vn.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function xe(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function ke(e,t){return Q(xe(e,t))}function Q(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var nr=new Set(["star","planet","moon","asteroid","comet"]);function z(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!nr.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&rr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ir(r,r.placement.reference,t))}}function rr(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ir(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function vt(e){return{...e}}function D(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function je(e){let t;try{t=q(e)}catch(r){return{ok:!1,value:null,diagnostics:[D(r,"parse")]}}let n;try{n=C(t)}catch(r){return{ok:!1,value:null,diagnostics:[D(r,"normalize")]}}try{z(n)}catch(r){return{ok:!1,value:null,diagnostics:[D(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function It(e){try{return{ok:!0,value:C(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[D(t,"normalize")]}}}function $t(e){try{return z(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[D(t,"validate")]}}}var ae=1495978707e-1,or=6371,ar=71492,sr=695700,lr=63241.077,cr=206264.806,ur=206264806,At=.68,dr=.2,Lt=28;function H(e,t={}){let n=pr(t),r=n.width,i=n.height,a=n.padding,s=fr(e),o=hr(e,t.projection),l=yr(s,t.scaleModel),c=br(s),u=e.system?.id??null,f=new Map(e.objects.map(h=>[h.id,h])),m=Jr(e.objects,f),p=new Map,b=[],v=[],j=[],A=[],y=[],I=new Map,P=new Map;for(let h of e.objects){let M=h.placement;if(!M){j.push(h);continue}if(M.mode==="orbit"){jt(P,M.target,h);continue}if(M.mode==="surface"){jt(I,M.target,h);continue}if(M.mode==="at"){y.push(h);continue}A.push(h)}let N=A.length>0?r*.42:r/2,$=i/2,_={orbitChildren:P,surfaceChildren:I,objectMap:f,spacingFactor:c,projection:o,scaleModel:l},S=j.find(h=>h.type==="star")??j[0]??null;S&&Ze(S,N,$,0,p,b,v,_);let B=j.filter(h=>h.id!==S?.id);if(B.length>0){let h=Math.min(r,i)*.28*c*l.orbitDistanceMultiplier;B.forEach((M,k)=>{let qe=ce(k,B.length,-Math.PI/2),Y=ue(qe,h,o,1);Ze(M,N+Y.x,$+Y.y,0,p,b,v,_)})}A.forEach((h,M)=>{let k=r-a-140-ii(h.placement?.mode==="free"?h.placement.distance:void 0,l),qe=Math.max(76,(i-a*2-180)/Math.max(1,A.length)*c)*l.freePlacementMultiplier,Y=a+92+M*qe;p.set(h.id,{object:h,x:k,y:Y,radius:Le(h,0,l),sortKey:Se(k,Y,0)}),v.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:k-60,y1:Y,x2:k-18,y2:Y,mode:"free"}),Te(h,p,b,v,_,1)}),y.forEach((h,M)=>{if(p.has(h.id)||!h.placement||h.placement.mode!=="at")return;let k=Zr(h.placement.reference,p,f,M,y.length,r,i,a,_);p.set(h.id,{object:h,x:k.x,y:k.y,radius:Le(h,2,l),sortKey:Se(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&v.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Te(h,p,b,v,_,2)});let F=[...p.values()].map(h=>wr(h,l,m)),we=b.map(h=>vr(h,m.groupIds.get(h.object.id)??null)),ve=v.map(h=>Ir(h)),Ie=$r(F,i,l.labelMultiplier),pt=Or(e,F),jn=kr(we,pt,ve,F,Ie),On=xr(F,we,ve,Ie,m),Tn=jr(e,F),An=Tr(e,o,n.preset,m,f),Ln=zr(r,i,F,we,ve,Ie);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:o,scaleModel:l,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Ot(o)} view - ${Ot(s)} layout`,systemId:u,viewMode:o,layoutPreset:s,metadata:{format:e.format,version:e.version,view:o,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Ln,layers:jn,groups:On,semanticGroups:Tn,viewpoints:An,objects:F,orbitVisuals:we,relations:pt,leaders:ve,labels:Ie}}function Dt(e,t,n){let r=Me(n),i=Math.cos(r),a=Math.sin(r),s=e.x-t.x,o=e.y-t.y;return{x:t.x+s*i-o*a,y:t.y+s*a+o*i}}function fr(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function pr(e){let t=mr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function mr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function hr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function yr(e,t){return{...gr(e),...t}}function gr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function br(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function wr(e,t,n){let{object:r,x:i,y:a,radius:s,sortKey:o,anchorX:l,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:de(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:s,visualRadius:ri(r,s,t),sortKey:o+u*.001,anchorX:l,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:ai(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function vr(e,t){return{renderId:`${de(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function Ir(e){return{renderId:`${de(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function $r(e,t,n){let r=[],i=[],a=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort((s,o)=>s.sortKey-o.sortKey);for(let s of a){let o=s.y>t*.62?-1:1,l=si(s,n),c=s.y+o*(s.radius+18*n),u=c+o*(16*n),f=kt(s.x,c,u,l,o),m=0;for(;i.some(p=>ti(p,f))&&m<10;)c+=o*14*n,u+=o*14*n,f=kt(s.x,c,u,l,o),m+=1;i.push(f),r.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:s.x,y:c,secondaryY:u,textAnchor:"middle",direction:o<0?"above":"below",hidden:s.hidden})}return r}function kr(e,t,n,r,i){let a=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),s=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:s},{id:"relations",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"objects",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:i.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function xr(e,t,n,r,i){let a=new Map,s=o=>{if(!o)return null;let l=a.get(o);if(l)return l;let c=i.groupRoots.get(o)??null,u={renderId:o,rootObjectId:c,label:c??o,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:le(0,0,0,0)};return a.set(o,u),u};for(let o of e){let l=s(o.groupId);l&&!o.hidden&&l.objectIds.push(o.objectId)}for(let o of t){let l=s(o.groupId);l&&!o.hidden&&l.orbitIds.push(o.objectId)}for(let o of n){let l=s(o.groupId);l&&!o.hidden&&l.leaderIds.push(o.objectId)}for(let o of r){let l=s(o.groupId);l&&!o.hidden&&l.labelIds.push(o.objectId)}for(let o of a.values())o.contentBounds=Qr(o,e,t,n,r);return[...a.values()].sort((o,l)=>o.label.localeCompare(l.label))}function jr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function Or(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${de(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Tr(e,t,n,r,i){let a=Ar(e,t,n),s=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...p]=c.split(".");if(f!=="viewpoint"||!m||p.length===0)continue;let b=Nr(m);if(!b)continue;let v=p.join(".").toLowerCase(),j=s.get(b)??{id:b};Lr(j,v,u,e,t,n,r,i),s.set(b,j)}let o=[...s.values()].map(c=>Dr(c,t,n,i)).filter(Boolean),l=o.findIndex(c=>c.id===a.id);return l>=0?o.splice(l,1,{...a,...o[l],layers:{...a.layers,...o[l].layers},filter:o[l].filter??a.filter,generated:!1}):o.unshift(a),o.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function Ar(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Lr(e,t,n,r,i,a,s,o){let l=n.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"projection":case"view":e.projection=Fr(l)??i;return;case"preset":e.preset=Mr(l)??a;return;case"rotation":case"angle":e.rotationDeg=St(l)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Rr(l);return;case"layers":e.layers=Pr(l);return;case"query":e.filter={...e.filter??Oe(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??Oe(),objectTypes:_r(l)};return;case"tags":e.filter={...e.filter??Oe(),tags:Fe(l)};return;case"groups":e.filter={...e.filter??Oe(),groupIds:Er(l,r,s,o)};return}}function Dr(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,s=Sr(e.filter),o=e.label?.trim()||Br(e.id);return{id:e.id,label:o,summary:e.summary?.trim()||Cr(o,i,s),objectId:i,selectedObjectId:a,projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Oe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Sr(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Fr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Mr(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function St(e){let t=Number(e);return Number.isFinite(t)?t:null}function Rr(e){let t=St(e);return t!==null&&t>0?t:null}function Pr(e){let t={};for(let n of Fe(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function _r(e){return Fe(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Er(e,t,n,r){return Fe(e).map(i=>t.schemaVersion==="2.1"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??se(i):(r.has(i),se(i)))}function Fe(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Nr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Br(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Cr(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function zr(e,t,n,r,i,a){let s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,m)=>{s=Math.min(s,f),o=Math.min(o,m),l=Math.max(l,f),c=Math.max(c,m)};for(let f of r)f.hidden||Ft(f,u);for(let f of i)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of n)f.hidden||Mt(f,u);for(let f of a)f.hidden||Rt(f,u);return!Number.isFinite(s)||!Number.isFinite(o)?le(0,0,e,t):le(s,o,l,c)}function Ft(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=_t(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Lt*2);for(let s of a)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function le(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Mt(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function Rt(e,t){let r=li(e.label,e.secondaryLabel,1);t(e.x-r,e.y-18),t(e.x+r,e.y+8),t(e.x-r,e.secondaryY-14),t(e.x+r,e.secondaryY+8)}function Ze(e,t,n,r,i,a,s,o){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Le(e,r,o.scaleModel),sortKey:Se(t,n,r)}),Te(e,i,a,s,o,r+1))}function Te(e,t,n,r,i,a){let s=t.get(e.id);if(!s)return;let o=[...i.orbitChildren.get(e.id)??[]].sort(Vr),l=Ur(o,s.radius,i.spacingFactor,i.scaleModel),c=Yr(o,l);o.forEach((f,m)=>{let p=Wr(f,m,o.length,s,l,c[m]??l.innerPx,i);n.push({object:f,parentId:e.id,kind:p.kind,cx:p.cx,cy:p.cy,radius:p.radius,rx:p.rx,ry:p.ry,rotationDeg:p.rotationDeg,band:p.band,bandThickness:p.bandThickness,frontArcPath:p.frontArcPath,backArcPath:p.backArcPath}),Ze(f,p.objectX,p.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let p=ce(m,u.length,-Math.PI/3),b=28*i.spacingFactor,v=ue(p,s.radius,i.projection,i.projection==="isometric"?.9:1),j=ue(p,s.radius+b,i.projection,i.projection==="isometric"?.9:1),A=s.x+v.x,y=s.y+v.y,I=s.x+j.x,P=s.y+j.y;t.set(f.id,{object:f,x:I,y:P,radius:Le(f,a+1,i.scaleModel),sortKey:Se(I,P,a+1),anchorX:A,anchorY:y}),r.push({object:f,groupId:i.objectMap.has(f.id)?se(ei(f,i.objectMap)):null,x1:A,y1:y,x2:I,y2:P,mode:"surface"}),Te(f,t,n,r,i,a+1)})}function Vr(e,t){let n=Ae(e),r=Ae(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Ur(e,t,n,r){let i=e.map(f=>Ae(f)),a=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,o=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:o,pixelSpread:Math.max(o*Math.max(e.length-1,1),o),minimumGapPx:o*.42};let l=Math.min(...a),c=Math.max(...a),u=c-l;return{metrics:i,minMetric:l,maxMetric:c,metricSpread:u,innerPx:s,stepPx:o,pixelSpread:Math.max(o*Math.max(e.length-1,1),o),minimumGapPx:o*.42}}function Wr(e,t,n,r,i,a,s){let o=e.placement,l=e.type==="belt"||e.type==="ring";if(!o||o.mode!=="orbit"){let S=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:S,rotationDeg:0,band:l,bandThickness:l?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-S}}let c=x(typeof o.eccentricity=="number"?o.eccentricity:0,0,.92),u=a,f=Math.max(u*Math.sqrt(1-c*c),u*.18),m=Je(o.inclination)??0,p=s.projection==="isometric"?Math.max(dr,Math.cos(Me(m)))*At:1,b=Math.max(f*p,u*.14),v=Je(o.angle)??0,j=u*c,A=Nt(-j,0,v),y=r.x+A.x,I=r.y+A.y,P=Hr(o.phase,t,n),N=Et(y,I,u,b,v,P),$=s.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,_=l?Kr(e,u,i,s.scaleModel):void 0;return{kind:$?"circle":"ellipse",cx:$?r.x:y,cy:$?r.y:I,radius:$?u:void 0,rx:$?void 0:u,ry:$?void 0:b,rotationDeg:v,band:l,bandThickness:_,frontArcPath:s.projection==="isometric"||l?xt(y,I,u,b,v,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||l?xt(y,I,u,b,v,Math.PI,Math.PI*2):void 0,objectX:N.x,objectY:N.y}}function qr(e,t){return t.innerPx+t.stepPx*Gr(Math.max(e,0)+1)}function Yr(e,t){let n=[];return e.forEach((r,i)=>{let a=Ae(r),s=t.innerPx+i*t.stepPx,o=a===null?s:qr(a,t),l=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(o,l))}),n}function Ae(e){return!e.placement||e.placement.mode!=="orbit"?null:De(e.placement.semiMajor??e.placement.distance??null)}function Gr(e){return Math.log(e)/Math.log(2)}function Hr(e,t,n){let r=e?Je(e):null;return r!==null?Me(r-90):ce(t,n,-Math.PI/2)}function Kr(e,t,n,r){let i=De(Xe(e.properties.inner)),a=De(Xe(e.properties.outer));if(i!==null&&a!==null){let o=Math.abs(a-i);if(n.metricSpread>0)return x(o/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(i,a),1e-4);return x(o/l*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Zr(e,t,n,r,i,a,s,o,l){if(e.kind==="lagrange")return Xr(e,t,n,a,s);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=ce(r,i,Math.PI/5),f=(c.radius+36)*l.scaleModel.labelMultiplier,m=ue(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=ce(r,i,Math.PI/6),f=(c.radius+36)*l.scaleModel.labelMultiplier,m=ue(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:a-o-170,y:s-o-86-r*58*l.scaleModel.freePlacementMultiplier}}function Xr(e,t,n,r,i){let a=e.secondary?t.get(e.primary):ni(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!a||!s)return{x:r*.7,y:i*.25};let o=s.x-a.x,l=s.y-a.y,c=Math.hypot(o,l)||1,u=o/c,f=l/c,m=-f,p=u,b=x(c*.25,24,68);switch(e.point){case"L1":return{x:s.x-u*b,y:s.y-f*b,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+u*b,y:s.y+f*b,anchorX:s.x,anchorY:s.y};case"L3":return{x:a.x-u*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L4":return{x:s.x+(u*.5-m*.8660254)*b,y:s.y+(f*.5-p*.8660254)*b,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(u*.5+m*.8660254)*b,y:s.y+(f*.5+p*.8660254)*b,anchorX:s.x,anchorY:s.y}}}function Jr(e,t){let n=new Map,r=new Map;for(let c of e){let u=Pt(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,a=new Map,s=new Map,o=c=>{let u=i.get(c);if(u)return u;let f=new Set,m=[],p=n.get(c)??null;for(;p&&!f.has(p);)m.push(p),f.add(p),p=n.get(p)??null;return i.set(c,m),m},l=c=>{let u=s.get(a.get(c)??"");if(u)return u;let f=n.get(c)??null,m=t.get(c),p=c;return m?.placement&&m.placement.mode!=="free"&&f&&(p=l(f)),p};for(let c of e){o(c.id);let u=l(c.id),f=se(u);a.set(c.id,f),s.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:s}}function Pt(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Qr(e,t,n,r,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=(u,f)=>{a=Math.min(a,u),s=Math.min(s,f),o=Math.max(o,u),l=Math.max(l,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&Mt(u,c);for(let u of n)!u.hidden&&e.orbitIds.includes(u.objectId)&&Ft(u,c);for(let u of r)!u.hidden&&e.leaderIds.includes(u.objectId)&&(c(u.x1,u.y1),c(u.x2,u.y2));for(let u of i)!u.hidden&&e.labelIds.includes(u.objectId)&&Rt(u,c);return!Number.isFinite(a)||!Number.isFinite(s)?le(0,0,0,0):le(a,s,o,l)}function ei(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Pt(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function kt(e,t,n,r,i){return{left:e-r,right:e+r,top:Math.min(t,n)-(i<0?18:12),bottom:Math.max(t,n)+(i<0?8:12)}}function ti(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ni(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Le(e,t,n){let r=oi(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return x((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return x(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return x(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return x(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return x(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return x(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return x(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return x(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return x(8*i,n.minBodyRadius,n.maxBodyRadius)}}function ri(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function De(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ae;case"m":return e.value/1e3/ae;case"ly":return e.value*lr;case"pc":return e.value*cr;case"kpc":return e.value*ur;case"re":return e.value*or/ae;case"rj":return e.value*ar/ae;case"sol":return e.value*sr/ae;default:return e.value}}function ii(e,t){let n=De(e??null);return n===null||n<=0?0:x(n*96*t.freePlacementMultiplier,0,420)}function oi(e,t){let n=Xe(e);if(!n)return null;let r;switch(n.unit){case"sol":r=x(n.value*22,14,40);break;case"re":r=x(n.value*10,6,18);break;case"km":r=x(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=x(n.value*4,4,20);break}return x(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Xe(e){return!e||typeof e!="object"||!("value"in e)?null:e}function Je(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ce(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function xt(e,t,n,r,i,a,s){let o=_t(e,t,n,r,i,a,s,Lt);return o.length===0?"":o.map((l,c)=>`${c===0?"M":"L"} ${Tt(l.x)} ${Tt(l.y)}`).join(" ")}function _t(e,t,n,r,i,a,s,o){let l=[];for(let c=0;c<=o;c+=1){let u=a+(s-a)*c/o;l.push(Et(e,t,n,r,i,u))}return l}function Et(e,t,n,r,i,a){let s=n*Math.cos(a),o=r*Math.sin(a),l=Nt(s,o,i);return{x:e+l.x,y:t+l.y}}function Nt(e,t,n){let r=Me(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ue(e,t,n,r){let i=n==="isometric"?At*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Se(e,t,n){return t*1e3+e+n*.01}function x(e,t,n){return Math.min(Math.max(e,t),n)}function jt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function de(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function se(e){return`${de(e)}-group`}function ai(e){return typeof e=="string"&&e.trim()?e:void 0}function si(e,t){let n=e.label.length*4.6*t+18,r=e.secondaryLabel.length*3.9*t+18;return Math.max(n,r,e.visualRadius+18)}function li(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Ot(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Me(e){return e*Math.PI/180}function Tt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function fe(e,t={}){let n=H(e,t),r=[],i=di(e,r),a=fi(e,r),s=ui(e,n.renderPreset??t.preset??null,n.projection),o=e.system?ci(e,s,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(l=>!l.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(l=>!l.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:o,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(zt),diagnostics:r}}function Re(e,t={}){return vi(fe(e,t))}function pe(e){let t=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:gi(e.system),info:bi(e.system)}:null;return{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:t,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(zt)}}function Ct(e){return pe(e)}function ci(e,t,n,r,i,a){let s=H(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(pi),annotations:r}}function ui(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function di(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function fi(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...s]=r.split(".");if(!a||s.length===0)continue;let o=Bt(a);if(!o)continue;let l=n.get(o)??{id:o};switch(s.join(".").toLowerCase()){case"label":l.label=i;break;case"target":case"object":l.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":l.body=i;break;case"tags":l.tags=hi(i);break}n.set(o,l)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Bt(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??yi(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function pi(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function zt(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:mi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function mi(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function hi(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Bt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function yi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function gi(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function bi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=wi(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??"")}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function wi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function vi(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Vt=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Ee(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(n==="2.0-draft"){let l=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Re(e);return Qe(l)}let o=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:fe(e);return n==="2.1"&&o.version!=="2.1"?Pe({...o,version:"2.1",schemaVersion:"2.1"}):Pe(o)}let i=[],a=e;a.system&&i.push(...Ii(a.system));let s=[...a.objects].sort(tt);for(let o of s)i.length>0&&i.push(""),i.push(...ki(o));return i.join(`
|
|
2
|
+
`)}function Pe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Wt(e.system));for(let r of[...e.groups].sort(_e))t.push(""),t.push(...Kt(r));for(let r of[...e.relations].sort(_e))t.push(""),t.push(...Zt(r));let n=[...e.objects].sort(tt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...qt(r))}),t.join(`
|
|
3
|
+
`)}function Qe(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Wt(t.system));for(let i of[...t.groups].sort(_e))n.push(""),n.push(...Kt(i));for(let i of[...t.relations].sort(_e))n.push(""),n.push(...Zt(i));let r=[...t.objects].sort(tt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...qt(i))}),n.join(`
|
|
4
|
+
`)}function Ii(e){return $i("system",e.id,e.properties,null,e.info)}function $i(e,t,n,r,i){let a=[`${e} ${t}`],s=[...Gt(r),...Ht(n)];for(let l of s)a.push(` ${l}`);let o=Object.entries(i).sort(([l],[c])=>l.localeCompare(c));if(o.length>0){s.length>0&&a.push(""),a.push(" info");for(let[l,c]of o)a.push(` ${l} ${w(c)}`)}return a}function Wt(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${w(e.title)}`),e.description&&t.push(` description ${w(e.description)}`),e.epoch&&t.push(` epoch ${w(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${w(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${w(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${w(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${w(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${w(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...ji(n));for(let n of e.annotations)t.push(""),t.push(...Oi(n));return t}function ki(e){return Yt(e.type,e.id,e)}function qt(e){return Yt(`object ${e.type}`,e.id,e)}function Yt(e,t,n){let r=[`${e} ${t}`],i=[...Gt(n.placement),...Ht(n.properties),...xi(n)];for(let s of i)r.push(` ${s}`);let a=Object.entries(n.info).sort(([s],[o])=>s.localeCompare(o));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,o]of a)r.push(` ${s} ${w(o)}`)}for(let s of["climate","habitability","settlement"]){let o=Object.entries(n.typedBlocks?.[s]??{}).sort(([l],[c])=>l.localeCompare(c));if(o.length>0){r.push(""),r.push(` ${s}`);for(let[l,c]of o)r.push(` ${l} ${w(c)}`)}}return r}function Gt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...ee("distance",e.distance),...ee("semiMajor",e.semiMajor),...Ti("eccentricity",e.eccentricity),...ee("period",e.period),...ee("angle",e.angle),...ee("inclination",e.inclination),...ee("phase",e.phase)];case"at":return[`at ${Ai(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?et(e.distance):e.descriptor??""}`.trim()]}}function Ht(e){return Object.keys(e).sort(Di).map(t=>`${t} ${Xt(e[t])}`)}function xi(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${w(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${w(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Xt(n.value)}`);return t}function ji(e){let t=[`viewpoint ${e.id}`,` label ${w(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${w(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=Li(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${w(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(w).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Oi(e){let t=[`annotation ${e.id}`,` label ${w(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${w(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(w).join(" ")}`),t}function Kt(e){let t=[`group ${e.id}`,` label ${w(e.label)}`];return e.summary&&t.push(` summary ${w(e.summary)}`),e.color&&t.push(` color ${w(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(w).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Zt(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${w(e.from)}`),e.to&&t.push(` to ${w(e.to)}`),e.kind&&t.push(` kind ${w(e.kind)}`),e.label&&t.push(` label ${w(e.label)}`),e.summary&&t.push(` summary ${w(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(w).join(" ")}`),e.color&&t.push(` color ${w(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Xt(e){return Array.isArray(e)?e.map(t=>w(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?w(e):et(e)}function et(e){return`${e.value}${e.unit??""}`}function ee(e,t){return t?[`${e} ${et(t)}`]:[]}function Ti(e,t){return t===void 0?[]:[`${e} ${t}`]}function Ai(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Li(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Di(e,t){let n=Vt.indexOf(e),r=Vt.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function tt(e,t){let n=Ut(e.type),r=Ut(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function _e(e,t){return e.id.localeCompare(t.id)}function Ut(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function w(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Jt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Si=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Fi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function he(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ne(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function nt(e,t,n){let r=e.match(Jt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=L(n);if(a?.unitFamily&&!oe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function rt(e){let t=e.match(Jt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Be(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function K(e,t,n){let r=Si.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Qt(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Mi(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Fi);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function en(e,t,n){let r=L(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return K(me(t,e,n),e,n);case"number":return Be(me(t,e,n),e,n);case"unit":return nt(me(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Mi(i,n),i}}}function it(e,t,n){let r=L(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function me(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Ri=new Set(["star","planet","moon","asteroid","comet"]),Pi=332946.0487,_i=1047.3486,Ce=1495978707e-1,Ei=6371,Ni=695700,Bi=63241.077,Ci=206264.806,zi=206264806;function ye(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id));e.system||n.push(O("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[s,o]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of o){let c=a.get(l);c?n.push(O("validate.id.duplicate",`Duplicate ${s} id "${l}" already used by ${c}.`)):a.set(l,s)}for(let s of e.relations)Vi(s,r,n);for(let s of e.system?.viewpoints??[])Ui(s.filter,i,t,n,s.id);for(let s of e.objects)Wi(s,e.system,r,i,n);return n}function Vi(e,t,n){e.from?t.has(e.from)||n.push(O("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(O("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(O("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(O("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(O("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Ui(e,t,n,r,i){if(!(!e||n!=="2.1"))for(let a of e.groupIds)t.has(a)||r.push(V("validate.viewpoint.group.unknown",`Unknown group "${a}" in viewpoint "${i}".`))}function Wi(e,t,n,r,i){let a=e.placement,s=a?.mode==="orbit"?a:null,o=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||i.push(V("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(s&&(n.has(s.target)||i.push(O("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(O("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(V("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(V("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!nn(o?.properties.mass)&&i.push(V("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let l=n.get(a.target);l?Ri.has(l.type)||i.push(O("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(O("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(O("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),qi(e,n,i)||i.push(O("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&i.push(V("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(O("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){i.push(V("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=tn(e,o);if(c===null){i.push(V("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Ki("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Hi(c)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){i.push(V("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=rn(s?.period),u=tn(e,o);if(c===null||u===null)continue;let f=Gi(e,"period");Math.abs(c-u)>f&&i.push(O("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function qi(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(O("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(O("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(O("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function tn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Yi(n.semiMajor??n.distance),i=nn(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Yi(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ce;case"m":return e.value/(Ce*1e3);case"ly":return e.value*Bi;case"pc":return e.value*Ci;case"kpc":return e.value*zi;case"re":return e.value*Ei/Ce;case"sol":return e.value*Ni/Ce;default:return null}}function nn(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Pi;case"mj":return t.value/_i;default:return null}}function rn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Gi(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?rn(n)??0:0}function Hi(e){return`${Math.round(e*100)/100}d`}function O(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function V(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ki(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Zi=new Set(["climate","habitability","settlement"]),ze=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=L(e);t&&ze.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])ze.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Xi=new Set(ze.keys());function Ve(e){return sn(e)}function an(e){return sn(e,"2.0-draft")}function sn(e,t){let n=Ro(e),r=n.source.split(/\r?\n/),i=[],a=!1,s="2.0",o=null,l=null,c=[],u=[],f=[],m=!1,p=!1,b=new Set,v=new Set,j=new Set,A=new Set;for(let $=0;$<r.length;$++){let _=r[$],S=$+1;if(!_.trim())continue;let B=$e(_),F=G(_.slice(B),{line:S,columnOffset:B});if(F.length!==0){if(!a){s=Ji(F,S),a=!0,n.comments.length>0&&s!=="2.1"&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(B===0){l=Qi(F,S,s,i,o,c,u,f,b,v,j,A,{sawDefaults:m,sawAtlas:p}),l.kind==="system"?o=l.system:l.kind==="defaults"?m=!0:l.kind==="atlas"&&(p=!0);continue}if(!l)throw new d("Indented line without parent atlas section",S,B+1);ao(l,B,F,S)}}if(!a)throw new d('Missing required atlas schema header "schema 2.0"');let y=c.map($=>ko($,s,i)),I=t??(s==="2.0-draft"?"2.0":s),P={format:"worldorbit",sourceVersion:"1.0",system:o,groups:u,relations:f,objects:y,diagnostics:i};if(I==="2.0-draft"){let $={...P,version:"2.0-draft",schemaVersion:"2.0-draft"};return $.diagnostics.push(...ye($,s)),$}let N={...P,version:I,schemaVersion:I};return s==="2.0-draft"&&N.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),N.diagnostics.push(...ye(N,s)),N}function Ji(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Qi(e,t,n,r,i,a,s,o,l,c,u,f,m){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return eo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(m.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(m.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return to(e,t,i,l);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return no(e,t,i,c);case"group":return U(n,r,"group",{line:t,column:e[0].column}),ro(e,t,s,u);case"relation":return U(n,r,"relation",{line:t,column:e[0].column}),io(e,t,o,f);case"object":return oo(e,t,n,r,a);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function eo(e,t,n,r){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function to(e,t,n,r){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate viewpoint id "${i}"`,t,e[1].column);let a={id:i,label:Ne(i),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(a),r.add(i),{kind:"viewpoint",viewpoint:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function no(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:Ne(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function ro(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:Ne(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function io(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function oo(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],s=e[2],o=a.value;if(!ie.has(o)||o==="system")throw new d(`Unknown object type "${a.value}"`,t,a.column);let l={objectType:o,id:s.value,fields:Io(e.slice(3),t,o,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ao(e,t,n,r){switch(e.kind){case"system":so(e,n,r);return;case"defaults":lo(e,n,r);return;case"atlas":co(e,t,n,r);return;case"viewpoint":uo(e,t,n,r);return;case"annotation":po(e,n,r);return;case"group":mo(e,n,r);return;case"relation":ho(e,n,r);return;case"object":yo(e,t,n,r);return}}function so(e,t,n){let r=X(t,e.seenFields,n),i=T(t,n);switch(r){case"title":e.system.title=i;return;case"description":U(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":U(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":U(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function lo(e,t,n){let r=X(t,e.seenFields,n),i=T(t,n);switch(r){case"view":e.system.defaults.view=ln(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=cn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function co(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=dn(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function uo(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){fo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=X(n,e.seenFields,r),a=T(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":e.viewpoint.projection=ln(a,r,n[0].column);return;case"preset":e.viewpoint.preset=cn(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=wo(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=un(a,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=bo(n.slice(1),r);return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function fo(e,t,n){let r=X(t,e.seenFilterFields,n),i=e.viewpoint.filter??vo();switch(r){case"query":i.query=T(t,n);break;case"objecttypes":i.objectTypes=go(t.slice(1),n);break;case"tags":i.tags=Z(t.slice(1),n,"tags");break;case"groups":i.groupIds=Z(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function po(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.annotation.label=T(t,n);return;case"target":e.annotation.targetObjectId=T(t,n);return;case"body":e.annotation.body=T(t,n);return;case"tags":e.annotation.tags=Z(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function mo(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.group.label=T(t,n);return;case"summary":e.group.summary=T(t,n);return;case"color":e.group.color=T(t,n);return;case"tags":e.group.tags=Z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=K(T(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ho(e,t,n){switch(X(t,e.seenFields,n)){case"from":e.relation.from=T(t,n);return;case"to":e.relation.to=T(t,n);return;case"kind":e.relation.kind=T(t,n);return;case"label":e.relation.label=T(t,n);return;case"summary":e.relation.summary=T(t,n);return;case"tags":e.relation.tags=Z(t.slice(1),n,"tags");return;case"color":e.relation.color=T(t,n);return;case"hidden":e.relation.hidden=K(T(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function yo(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Zi.has(i)){i!=="info"&&U(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=dn(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,s=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(s.has(i.key))throw new d(`Duplicate ${a} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push($o(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function X(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function T(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function go(e,t){return Z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function bo(e,t){let n={};for(let r of Z(e,t,"layers")){let i=!r.startsWith("-")&&!r.startsWith("!"),a=r.replace(/^[-!]+/,"").toLowerCase();if(a==="orbits"){n["orbits-back"]=i,n["orbits-front"]=i;continue}(a==="background"||a==="guides"||a==="orbits-back"||a==="orbits-front"||a==="relations"||a==="objects"||a==="labels"||a==="metadata")&&(n[a]=i)}return n}function Z(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ln(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new d(`Unknown projection "${e}"`,t,n);return r}function cn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function wo(e,t,n,r){let i=un(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function un(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function vo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Io(e,t,n,r,i){let a=[],s=0;for(;s<e.length;){let o=e[s],l=ge(o.value);if(!l)throw new d(`Unknown field "${o.value}"`,t,o.column);l.version==="2.1"&&U(r,i,o.value,{line:t,column:o.column}),s++;let c=[];if(l.inlineMode==="single"){let u=e[s];u&&(c.push(u),s++)}else if(l.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[s];if(!f)break;c.push(f),s++}else for(;s<e.length&&!Xi.has(e[s].value);)c.push(e[s]),s++;if(c.length===0)throw new d(`Missing value for field "${o.value}"`,t,o.column);a.push({type:"field",key:o.value,values:c.map(u=>u.value),location:{line:t,column:o.column}})}return pn(a,n),a}function $o(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let a=ge(e[0].value);if(!a)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&U(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}};return pn([s],n),s}function dn(e,t,n){if(e.length<2)throw new d(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function ko(e,t,n){let r=xo(e.fields),i=jo(e.objectType,r),a=Oo(e.objectType,r),s=Fo(r.get("groups")?.[0]),o=on(r.get("epoch")?.[0]),l=on(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?K(E(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Lo(r.get("resonance")[0]):void 0,f=Ao(r),m=r.get("derive")?.map(I=>Do(I)),p=r.get("validate")?.map(I=>({rule:E(I)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,v=r.get("tolerance")?.map(I=>So(I)),j=To(e.typedBlockEntries),A=fn(e.infoEntries,"info"),y={type:e.objectType,id:e.id,properties:a,placement:i,info:A};return s.length>0&&(y.groups=s),o&&(y.epoch=o),l&&(y.referencePlane=l),c!==void 0&&(y.tidalLock=c),u&&(y.resonance=u),f&&(y.renderHints=f),m?.length&&(y.deriveRules=m),p?.length&&(y.validationRules=p),b?.length&&(y.lockedFields=b),v?.length&&(y.tolerances=v),j&&Object.keys(j).length>0&&(y.typedBlocks=j),t!=="2.1"&&(y.groups||y.epoch||y.referencePlane||y.tidalLock!==void 0||y.resonance||y.renderHints||y.deriveRules?.length||y.validationRules?.length||y.lockedFields?.length||y.tolerances?.length||y.typedBlocks)&&U(t,n,e.id,e.location),y}function xo(e){let t=new Map;for(let n of e){let r=ge(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);let i=t.get(n.key)??[];i.push(n),t.set(n.key,i)}return t}function jo(e,t){let n=t.get("orbit")?.[0],r=t.get("at")?.[0],i=t.get("surface")?.[0],a=t.get("free")?.[0];if([n,r,i,a].filter(Boolean).length>1){let o=n??r??i??a;throw d.fromLocation("Object has multiple placement modes",o?.location)}if(n)return{mode:"orbit",target:E(n),distance:te(t.get("distance")?.[0],"distance"),semiMajor:te(t.get("semiMajor")?.[0],"semiMajor"),eccentricity:Mo(t.get("eccentricity")?.[0],"eccentricity"),period:te(t.get("period")?.[0],"period"),angle:te(t.get("angle")?.[0],"angle"),inclination:te(t.get("inclination")?.[0],"inclination"),phase:te(t.get("phase")?.[0],"phase")};if(r){let o=E(r);return{mode:"at",target:o,reference:Qt(o,r.location)}}if(i)return{mode:"surface",target:E(i)};if(a){let o=E(a),l=rt(o);return{mode:"free",distance:l??void 0,descriptor:l?void 0:o}}return null}function Oo(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],s=ge(r);!a||!s?.legacySchema||s.legacySchema.placement||(it(r,e,a.location),n[r]=en(r,a.values,a.location))}return n}function fn(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function To(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=fn(r,n))}return t}function Ao(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=K(E(n),"renderLabel",n.location)),r&&(t.renderOrbit=K(E(r),"renderOrbit",r.location)),i&&(t.renderPriority=Be(E(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Lo(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Do(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function So(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=rt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Fo(e){return e?[...new Set(e.values)]:[]}function on(e){return e&&e.values.join(" ").trim()||null}function te(e,t){return e?nt(E(e),e.location,t):void 0}function Mo(e,t){return e?Be(E(e),t,e.location):void 0}function E(e){return me(e.values,e.key,e.location)}function ge(e){return ze.get(e)}function pn(e,t){for(let n of e){let r=ge(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){it(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function U(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Ro(e){let t=[...e],n=[],r=!1,i=!1,a=null,s=1,o=1;for(let l=0;l<t.length;l++){let c=t[l],u=t[l+1];if(i){if(c==="*"&&u==="/"){t[l]=" ",t[l+1]=" ",i=!1,a=null,l++,o+=2;continue}c!==`
|
|
5
|
+
`&&c!=="\r"&&(t[l]=" "),c===`
|
|
6
|
+
`?(s++,o=1):o++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:s,column:o}),t[l]=" ",t[l+1]=" ",i=!0,a={line:s,column:o},l++,o+=2;continue}if(!r&&c==="#"&&!Po(t,l)){n.push({kind:"line",line:s,column:o}),t[l]=" ";let f=l+1;for(;f<t.length&&t[f]!==`
|
|
7
|
+
`&&t[f]!=="\r";)t[f]=" ",f++;o+=f-l,l=f-1;continue}c==='"'&&t[l-1]!=="\\"&&(r=!r),c===`
|
|
8
|
+
`?(s++,o=1):o++}if(i)throw d.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function Po(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
|
|
9
|
+
`}function ot(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],objects:[],diagnostics:[]}}function Ue(e){return structuredClone(e)}function mn(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(ne))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ne))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ne))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ne))t.push({kind:"relation",id:n.id});for(let n of[...e.objects].sort(ne))t.push({kind:"object",id:n.id});return t}function at(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?wn(e,t.id):null;case"object":return t.id?bn(e,t.id):null;case"viewpoint":return t.id?In(e.system,t.id):null;case"annotation":return t.id?$n(e.system,t.id):null;case"relation":return t.id?vn(e,t.id):null}}function st(e,t,n){let r=Ue(e),i=ut(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return be(r.groups,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return be(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return be(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return be(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return be(r.relations,n),r}}function hn(e,t,n){return st(e,t,n(at(e,t)))}function yn(e,t){let n=Ue(e),r=ut(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function lt(e,t){return t.map(n=>({diagnostic:n,path:ct(e,n)}))}function ct(e,t){if(t.objectId&&bn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&wn(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&In(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&$n(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&vn(e,n[1]))return{kind:"relation",id:n[1]}}return t.field&&t.field in ut(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function gn(e){let t=[...e.diagnostics,...ye(e,e.version)];return lt(e,t)}function ut(e){return e.system||(e.system=ot().system),e.system}function bn(e,t){return e.objects.find(n=>n.id===t)??null}function wn(e,t){return e.groups.find(n=>n.id===t)??null}function vn(e,t){return e.relations.find(n=>n.id===t)??null}function In(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function $n(e,t){return e?.annotations.find(n=>n.id===t)??null}function be(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ne);return}e[n]=t}function ne(e,t){return e.id.localeCompare(t.id)}var _o=/^schema\s+2(?:\.0|\.1)?$/i,Eo=/^schema\s+2\.1$/i,No=/^schema\s+2\.0-draft$/i;function dt(e){for(let t of Bo(e).split(/\r?\n/)){let n=t.trim();if(n)return No.test(n)?"2.0-draft":Eo.test(n)?"2.1":_o.test(n)?"2.0":"1.0"}return"1.0"}function Bo(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],s=t[i+1];if(r){if(a==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
|
|
10
|
+
`&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&s==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let o=i+1;for(;o<t.length&&t[o]!==`
|
|
11
|
+
`&&t[o]!=="\r";)t[o]=" ",o++;i=o-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function We(e){let t=ft(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function ft(e){let t=dt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Co(e,t);let n;try{n=q(e)}catch(i){return{ok:!1,value:null,diagnostics:[D(i,"parse")]}}let r;try{r=C(n)}catch(i){return{ok:!1,value:null,diagnostics:[D(i,"normalize")]}}try{z(r)}catch(i){return{ok:!1,value:null,diagnostics:[D(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Co(e,t){let n;try{n=Ve(e)}catch(s){return{ok:!1,value:null,diagnostics:[D(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=pe(n)}catch(s){return{ok:!1,value:null,diagnostics:[D(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var zo=/^```worldorbit(?:\s+(.*))?\s*$/;function kn(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,s=[];return t.forEach((o,l)=>{let c=l+1;if(!r){let u=o.match(zo);u&&(r=!0,i=u[1]??null,a=c,s=[]);return}if(o.trim()==="```"){n.push({source:s.join(`
|
|
12
|
+
`),info:i,startLine:a,endLine:c}),r=!1,i=null,a=0,s=[];return}s.push(o)}),n}function xn(e){let t=q(e),n=C(t);return z(n),{ast:t,document:n}}function Vo(e){let t=xn(e);return{...t,scene:H(t.document)}}function Uo(e){return We(e)}function Wo(e){return je(e)}function qo(e,t={}){return Ee(e,t)}return Pn(Yo);})();
|