worldorbit 2.5.12 → 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.
Files changed (47) hide show
  1. package/README.md +37 -11
  2. package/dist/unpkg/worldorbit-core.min.js +12 -5
  3. package/dist/unpkg/worldorbit-markdown.min.js +29 -20
  4. package/dist/unpkg/worldorbit-viewer.min.js +52 -38
  5. package/dist/unpkg/worldorbit.js +1737 -245
  6. package/dist/unpkg/worldorbit.min.js +56 -42
  7. package/package.json +2 -2
  8. package/packages/core/README.md +5 -1
  9. package/packages/core/dist/atlas-edit.d.ts +2 -2
  10. package/packages/core/dist/atlas-edit.js +70 -7
  11. package/packages/core/dist/atlas-utils.d.ts +22 -0
  12. package/packages/core/dist/atlas-utils.js +189 -0
  13. package/packages/core/dist/atlas-validate.d.ts +2 -0
  14. package/packages/core/dist/atlas-validate.js +285 -0
  15. package/packages/core/dist/draft-parse.js +786 -153
  16. package/packages/core/dist/draft.d.ts +3 -0
  17. package/packages/core/dist/draft.js +47 -3
  18. package/packages/core/dist/format.js +165 -9
  19. package/packages/core/dist/load.js +58 -13
  20. package/packages/core/dist/normalize.js +7 -0
  21. package/packages/core/dist/scene.js +92 -27
  22. package/packages/core/dist/types.d.ts +97 -3
  23. package/packages/markdown/README.md +1 -1
  24. package/packages/viewer/README.md +2 -1
  25. package/packages/viewer/dist/atlas-state.js +7 -1
  26. package/packages/viewer/dist/atlas-viewer.js +35 -1
  27. package/packages/viewer/dist/render.js +16 -7
  28. package/packages/viewer/dist/theme.js +4 -0
  29. package/packages/viewer/dist/tooltip.js +35 -0
  30. package/packages/viewer/dist/types.d.ts +7 -0
  31. package/packages/viewer/dist/viewer.js +4 -0
  32. package/packages/editor/dist/editor.d.ts +0 -2
  33. package/packages/editor/dist/editor.js +0 -2626
  34. package/packages/editor/dist/index.d.ts +0 -2
  35. package/packages/editor/dist/index.js +0 -1
  36. package/packages/editor/dist/types.d.ts +0 -53
  37. package/packages/editor/dist/types.js +0 -1
  38. package/packages/markdown/dist/html.d.ts +0 -3
  39. package/packages/markdown/dist/html.js +0 -57
  40. package/packages/markdown/dist/index.d.ts +0 -4
  41. package/packages/markdown/dist/index.js +0 -3
  42. package/packages/markdown/dist/rehype.d.ts +0 -10
  43. package/packages/markdown/dist/rehype.js +0 -49
  44. package/packages/markdown/dist/remark.d.ts +0 -9
  45. package/packages/markdown/dist/remark.js +0 -28
  46. package/packages/markdown/dist/types.d.ts +0 -11
  47. 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.0
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@2.5.4/dist/unpkg/worldorbit.min.js"></script>
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.0
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
- The stable schema starts with:
176
+ New atlas authoring should start with:
169
177
 
170
178
  ```worldorbit
171
- schema 2.0
179
+ schema 2.1
172
180
  ```
173
181
 
174
182
  Example:
175
183
 
176
184
  ```worldorbit
177
- schema 2.0
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
- Stable `1.0` source is still accepted, and legacy `schema 2.0-draft` files remain readable as a compatibility path with a deprecation diagnostic.
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.0
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.0" });
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 metadata
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 Kt=Object.getOwnPropertyDescriptor;var Gt=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 Gt(t))!Xt.call(e,i)&&i!==n&&Me(e,i,{get:()=>t[i],enumerable:!(r=Kt(t,i))||r.enumerable});return e};var Zt=e=>Jt(Me({},"__esModule",{value:!0}),e);var vi={};Ht(vi,{WORLDORBIT_FIELD_KEYS:()=>Ze,WORLDORBIT_FIELD_SCHEMAS:()=>Se,WORLDORBIT_OBJECT_TYPES:()=>K,WorldOrbitError:()=>d,cloneAtlasDocument:()=>Oe,createDiagnostic:()=>rt,createEmptyAtlasDocument:()=>Ve,detectWorldOrbitSchemaVersion:()=>Xe,diagnosticFromError:()=>$,extractWorldOrbitBlocks:()=>Wt,formatAtlasDocument:()=>Ne,formatDocument:()=>je,formatDraftDocument:()=>Re,getAtlasDocumentNode:()=>Ue,getFieldSchema:()=>S,isKnownFieldKey:()=>G,listAtlasDocumentPaths:()=>Pt,load:()=>wi,loadWorldOrbitSource:()=>$e,loadWorldOrbitSourceWithDiagnostics:()=>He,materializeAtlasDocument:()=>B,materializeDraftDocument:()=>vt,normalizeDocument:()=>A,normalizeWithDiagnostics:()=>it,parse:()=>Ct,parseSafe:()=>Ii,parseWithDiagnostics:()=>le,parseWorldOrbit:()=>E,parseWorldOrbitAtlas:()=>ve,parseWorldOrbitDraft:()=>Dt,removeAtlasDocumentNode:()=>Nt,render:()=>bi,renderDocumentToScene:()=>z,resolveAtlasDiagnosticPath:()=>Ke,resolveAtlasDiagnostics:()=>Ye,rotatePoint:()=>ft,stringify:()=>ji,supportsObjectType:()=>Ae,tokenizeLine:()=>Qe,tokenizeLineDetailed:()=>_,unitFamilyAllowsUnit:()=>Fe,updateAtlasDocumentNode:()=>Et,upgradeDocumentToDraftV2:()=>Ie,upgradeDocumentToV2:()=>ee,upsertAtlasDocumentNode:()=>qe,validateAtlasDocumentWithDiagnostics:()=>Rt,validateDocument:()=>M,validateDocumentWithDiagnostics:()=>ue});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 Y=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],D=Y.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 K=new Set(Y),Se=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:Y}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:Y}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:Qt}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Y}),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(Se.keys());function S(e){return Se.get(e)}function G(e){return Ze.has(e)}function Ae(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 _(e).map(t=>t.value)}function _(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],p=r+u+1;if(a&&f==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(f==='"'){a?a=!1:(s===null&&(s=p),o=!0,c=p,a=!0);continue}if(!a&&/\s/.test(f)){l();continue}s===null&&(s=p),i+=f}if(a)throw new d("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function se(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=se(a),u=_(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(!K.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=S(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&&!G(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(!S(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 A(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=S(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Ae(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:ae(t,"orbit"),distance:W(t,"distance"),semiMajor:W(t,"semiMajor"),eccentricity:bn(t,"eccentricity"),period:W(t,"period"),angle:W(t,"angle"),inclination:W(t,"inclination"),phase:W(t,"phase")};if(r){let a=ce(t,"at"),c=ae(t,"at");return{mode:"at",target:c,reference:yn(c,a.location)}}if(i)return{mode:"surface",target:ae(t,"surface")};if(s){let a=ae(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=S(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(C(r),n,r.location);break;case"unit":t[n]=tt(C(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=S(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 W(e,t){if(!e.has(t))return;let n=ce(e,t);return tt(C(n),n.location,t)}function bn(e,t){if(!e.has(t))return;let n=ce(e,t);return nt(C(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=C(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 ce(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function ae(e,t){return C(ce(e,t))}function C(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 $(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 le(e){let t;try{t=E(e)}catch(r){return{ok:!1,value:null,diagnostics:[$(r,"parse")]}}let n;try{n=A(t)}catch(r){return{ok:!1,value:null,diagnostics:[$(r,"normalize")]}}try{M(n)}catch(r){return{ok:!1,value:null,diagnostics:[$(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function it(e){try{return{ok:!0,value:A(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[$(t,"normalize")]}}}function ue(e){try{return M(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[$(t,"validate")]}}}var X=1495978707e-1,xn=6371,On=71492,$n=695700,Tn=63241.077,kn=206264.806,Dn=206264806,ut=.68,Mn=.2,dt=28;function z(e,t={}){let n=An(t),r=n.width,i=n.height,s=n.padding,o=Sn(e),a=Ln(e,t.projection),c=Pn(o,t.scaleModel),l=Nn(o),u=e.system?.id??null,f=new Map(e.objects.map(m=>[m.id,m])),p=fr(e.objects,f),h=new Map,g=[],b=[],x=[],j=[],v=[],T=new Map,U=new Map;for(let m of e.objects){let k=m.placement;if(!k){x.push(m);continue}if(k.mode==="orbit"){at(U,k.target,m);continue}if(k.mode==="surface"){at(T,k.target,m);continue}if(k.mode==="at"){v.push(m);continue}j.push(m)}let F=j.length>0?r*.42:r/2,ne=i/2,L={orbitChildren:U,surfaceChildren:T,objectMap:f,spacingFactor:l,projection:a,scaleModel:c},Te=x.find(m=>m.type==="star")??x[0]??null;Te&&Le(Te,F,ne,0,h,g,b,L);let ke=x.filter(m=>m.id!==Te?.id);if(ke.length>0){let m=Math.min(r,i)*.28*l*c.orbitDistanceMultiplier;ke.forEach((k,w)=>{let De=Z(w,ke.length,-Math.PI/2),R=Q(De,m,a,1);Le(k,F+R.x,ne+R.y,0,h,g,b,L)})}j.forEach((m,k)=>{let w=r-s-140-br(m.placement?.mode==="free"?m.placement.distance:void 0,c),De=Math.max(76,(i-s*2-180)/Math.max(1,j.length)*l)*c.freePlacementMultiplier,R=s+92+k*De;h.set(m.id,{object:m,x:w,y:R,radius:me(m,0,c),sortKey:ye(w,R,0)}),b.push({object:m,groupId:p.groupIds.get(m.id)??null,x1:w-60,y1:R,x2:w-18,y2:R,mode:"free"}),fe(m,h,g,b,L,1)}),v.forEach((m,k)=>{if(h.has(m.id)||!m.placement||m.placement.mode!=="at")return;let w=ur(m.placement.reference,h,f,k,v.length,r,i,s,L);h.set(m.id,{object:m,x:w.x,y:w.y,radius:me(m,2,c),sortKey:ye(w.x,w.y,2),anchorX:w.anchorX,anchorY:w.anchorY}),w.anchorX!==void 0&&w.anchorY!==void 0&&b.push({object:m,groupId:p.groupIds.get(m.id)??null,x1:w.anchorX,y1:w.anchorY,x2:w.x,y2:w.y,mode:"at"}),fe(m,h,g,b,L,2)});let q=[...h.values()].map(m=>Rn(m,c,p)),re=g.map(m=>_n(m,p.groupIds.get(m.object.id)??null)),ie=b.map(m=>zn(m)),oe=Bn(q,i,c.labelMultiplier),Vt=Wn(re,ie,q,oe),Ut=Cn(q,re,ie,oe,p),qt=Vn(e,a,n.preset,p,f),Yt=rr(r,i,q,re,ie,oe);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:q,orbitVisuals:re,leaders:ie,labels:oe}}function ft(e,t,n){let r=we(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 Sn(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 An(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 Nn(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Rn(e,t,n){let{object:r,x:i,y:s,radius:o,sortKey:a,anchorX:c,anchorY:l}=e;return{renderId:be(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:gr(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:Ir(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:`${be(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:`${be(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=jr(o,n),l=o.y+a*(o.radius+18*n),u=l+a*(16*n),f=ot(o.x,l,u,c,a),p=0;for(;i.some(h=>hr(h,f))&&p<10;)l+=a*14*n,u+=a*14*n,f=ot(o.x,l,u,c,a),p+=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:J(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=pr(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,p,...h]=l.split(".");if(f!=="viewpoint"||!p||h.length===0)continue;let g=er(p);if(!g)continue;let b=h.join(".").toLowerCase(),x=o.get(g)??{id:g};qn(x,b,u,t,n,r,i),o.set(g,x)}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=Gn(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??de(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??de(),objectTypes:Zn(a)};return;case"tags":e.filter={...e.filter??de(),tags:ge(a)};return;case"groups":e.filter={...e.filter??de(),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=Kn(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 de(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Kn(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 Gn(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 ge(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 ge(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 ge(e).map(r=>r.startsWith("wo-")&&r.endsWith("-group")?r:t.groupIds.has(r)?t.groupIds.get(r)??H(r):(n.has(r),H(r)))}function ge(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,p)=>{o=Math.min(o,f),a=Math.min(a,p),c=Math.max(c,f),l=Math.max(l,p)};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)?J(0,0,e,t):J(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 J(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=vr(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:me(e,r,a.scaleModel),sortKey:ye(t,n,r)}),fe(e,i,s,o,a,r+1))}function fe(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);a.forEach((u,f)=>{let p=sr(u,f,a.length,o,c,i);n.push({object:u,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(u,p.objectX,p.objectY,s,t,n,r,i)});let l=[...i.surfaceChildren.get(e.id)??[]];l.forEach((u,f)=>{let p=Z(f,l.length,-Math.PI/3),h=28*i.spacingFactor,g=Q(p,o.radius,i.projection,i.projection==="isometric"?.9:1),b=Q(p,o.radius+h,i.projection,i.projection==="isometric"?.9:1),x=o.x+g.x,j=o.y+g.y,v=o.x+b.x,T=o.y+b.y;t.set(u.id,{object:u,x:v,y:T,radius:me(u,s+1,i.scaleModel),sortKey:ye(v,T,s+1),anchorX:x,anchorY:j}),r.push({object:u,groupId:i.objectMap.has(u.id)?H(mr(u,i.objectMap)):null,x1:x,y1:j,x2:v,y2:T,mode:"surface"}),fe(u,t,n,r,i,s+1)})}function ir(e,t){let n=pe(e),r=pe(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=>pe(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)};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)}}function sr(e,t,n,r,i,s){let o=e.placement,a=e.type==="belt"||e.type==="ring";if(!o||o.mode!=="orbit"){let L=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:L,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-L}}let c=I(typeof o.eccentricity=="number"?o.eccentricity:0,0,.92),l=ar(e,t,i),u=Math.max(l*Math.sqrt(1-c*c),l*.18),f=Ee(o.inclination)??0,p=s.projection==="isometric"?Math.max(Mn,Math.cos(we(f)))*ut:1,h=Math.max(u*p,l*.14),g=Ee(o.angle)??0,b=l*c,x=It(-b,0,g),j=r.x+x.x,v=r.y+x.y,T=cr(o.phase,t,n),U=wt(j,v,l,h,g,T),F=s.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,ne=a?lr(e,l,i,s.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:j,cy:F?r.y:v,radius:F?l:void 0,rx:F?void 0:l,ry:F?void 0:h,rotationDeg:g,band:a,bandThickness:ne,frontArcPath:s.projection==="isometric"||a?st(j,v,l,h,g,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?st(j,v,l,h,g,Math.PI,Math.PI*2):void 0,objectX:U.x,objectY:U.y}}function ar(e,t,n){let r=pe(e);return r===null?n.innerPx+t*n.stepPx:n.metricSpread>0?n.innerPx+(r-n.minMetric)/n.metricSpread*n.pixelSpread:n.innerPx+Math.log10(r+1)*n.stepPx}function pe(e){return!e.placement||e.placement.mode!=="orbit"?null:he(e.placement.semiMajor??e.placement.distance??null)}function cr(e,t,n){let r=e?Ee(e):null;return r!==null?we(r-90):Z(t,n,-Math.PI/2)}function lr(e,t,n,r){let i=he(Pe(e.properties.inner)),s=he(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 ur(e,t,n,r,i,s,o,a,c){if(e.kind==="lagrange")return dr(e,t,n,s,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=Z(r,i,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=Q(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=Z(r,i,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=Q(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:s-a-170,y:o-a-86-r*58*c.scaleModel.freePlacementMultiplier}}function dr(e,t,n,r,i){let s=e.secondary?t.get(e.primary):yr(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,p=-f,h=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-p*.8660254)*g,y:o.y+(f*.5-h*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(f*.5+h*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function fr(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,p=[],h=n.get(l)??null;for(;h&&!f.has(h);)p.push(h),f.add(h),h=n.get(h)??null;return i.set(l,p),p},c=l=>{let u=o.get(s.get(l)??"");if(u)return u;let f=n.get(l)??null,p=t.get(l),h=l;return p?.placement&&p.placement.mode!=="free"&&f&&(h=c(f)),h};for(let l of e){a(l.id);let u=c(l.id),f=H(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 pr(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)?J(0,0,0,0):J(s,o,a,c)}function mr(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 hr(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function yr(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function me(e,t,n){let r=wr(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 gr(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 he(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/X;case"m":return e.value/1e3/X;case"ly":return e.value*Tn;case"pc":return e.value*kn;case"kpc":return e.value*Dn;case"re":return e.value*xn/X;case"rj":return e.value*On/X;case"sol":return e.value*$n/X;default:return e.value}}function br(e,t){let n=he(e??null);return n===null||n<=0?0:I(n*96*t.freePlacementMultiplier,0,420)}function wr(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 Z(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=we(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Q(e,t,n,r){let i=n==="isometric"?ut*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function ye(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 be(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function H(e){return`${be(e)}-group`}function Ir(e){return typeof e=="string"&&e.trim()?e:void 0}function jr(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 vr(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 we(e){return e*Math.PI/180}function lt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ee(e,t={}){let n=z(e,t),r=[],i=$r(e,r),s=Tr(e,r),o=Or(e,n.renderPreset??t.preset??null,n.projection),a=e.system?xr(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 Ie(e,t={}){return Pr(ee(e,t))}function B(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Ar(e.system),info:Fr(e.system)}:null,objects:e.objects.map(xt)}}function vt(e){return B(e)}function xr(e,t,n,r,i,s){let o=z(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(kr),annotations:r}}function Or(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 $r(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 Tr(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=Mr(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??Sr(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 kr(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:Dr(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Dr(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 Mr(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 Sr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ar(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 Fr(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=Lr(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 Lr(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 Pr(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 je(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"}:Ie(e);return Re(c)}let a=e.version==="2.0"?e:e.version==="2.0-draft"?{...e,version:"2.0"}:ee(e);return Ne(a)}let i=[],s=e;s.system&&i.push(...Er(s.system));let o=[...s.objects].sort(Be);for(let a of o)i.length>0&&i.push(""),i.push(...Nr(a));return i.join(`
2
- `)}function Ne(e){let t=["schema 2.0",""];e.system&&t.push(...Tt(e.system));let n=[...e.objects].sort(Be);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...kt(r))}),t.join(`
3
- `)}function Re(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Tt(t.system));let r=[...t.objects].sort(Be);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,s)=>{s>0&&n.push(""),n.push(...kt(i))}),n.join(`
4
- `)}function Er(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 ${O(e.title)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${O(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${O(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${O(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} ${O(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...zr(n));for(let n of e.annotations)t.push(""),t.push(...Br(n));return t}function Nr(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=[...Rr(r),..._r(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} ${O(l)}`)}return s}function Rr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...V("distance",e.distance),...V("semiMajor",e.semiMajor),...Cr("eccentricity",e.eccentricity),...V("period",e.period),...V("angle",e.angle),...V("inclination",e.inclination),...V("phase",e.phase)];case"at":return[`at ${Vr(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?ze(e.distance):e.descriptor??""}`.trim()]}}function _r(e){return Object.keys(e).sort(qr).map(t=>`${t} ${Wr(e[t])}`)}function zr(e){let t=[`viewpoint ${e.id}`,` label ${O(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 ${O(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=Ur(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${O(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(O).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Br(e){let t=[`annotation ${e.id}`,` label ${O(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${O(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(O).join(" ")}`),t}function Wr(e){return Array.isArray(e)?e.map(t=>O(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?O(e):ze(e)}function ze(e){return`${e.value}${e.unit??""}`}function V(e,t){return t?[`${e} ${ze(t)}`]:[]}function Cr(e,t){return t===void 0?[]:[`${e} ${t}`]}function Vr(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 Ur(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 qr(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 O(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function ve(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 x=n[b],j=b+1;if(!x.trim())continue;let v=se(x),T=_(x.slice(v),{line:j,columnOffset:v});if(T.length!==0){if(!r){i=Yr(T,j),r=!0;continue}if(v===0){o=Kr(T,j,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",j,v+1);Zr(o,v,T,j)}}if(!r)throw new d('Missing required atlas schema header "schema 2.0"');let h=A({type:"document",objects:a}).objects;return M({format:"worldorbit",version:"1.0",system:null,objects:h}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:s,objects:h,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 Yr(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 Kr(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 Gr(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 Xr(e,t,n,i);case"annotation":if(!n)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Hr(e,t,n,s);case"object":return Jr(e,t,r);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Gr(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 Xr(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 Hr(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 Jr(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(!K.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:di(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 Zr(e,t,n,r){switch(e.kind){case"system":Qr(e,n,r);return;case"defaults":ei(e,n,r);return;case"atlas":ti(e,t,n,r);return;case"viewpoint":ni(e,t,n,r);return;case"annotation":ii(e,n,r);return;case"object":oi(e,t,n,r);return}}function Qr(e,t,n){if(te(t,e.seenFields,n)!=="title")throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column);e.system.title=N(t,n)}function ei(e,t,n){let r=te(t,e.seenFields,n),i=N(t,n);switch(r){case"view":e.system.defaults.view=St(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=At(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 ti(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]=N(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 ni(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){ri(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=te(n,e.seenFields,r),s=N(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=St(s,r,n[0].column);return;case"preset":e.viewpoint.preset=At(s,r,n[0].column);return;case"zoom":e.viewpoint.zoom=ci(s,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=li(s,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=ai(n.slice(1),r);return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function ri(e,t,n){let r=te(t,e.seenFilterFields,n),i=e.viewpoint.filter??ui();switch(r){case"query":i.query=N(t,n);break;case"objecttypes":i.objectTypes=si(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 ii(e,t,n){switch(te(t,e.seenFields,n)){case"label":e.annotation.label=N(t,n);return;case"target":e.annotation.targetObjectId=N(t,n);return;case"body":e.annotation.body=N(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 oi(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(pi(n,r));return}e.objectNode.blockFields.push(fi(n,r))}function te(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 N(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 si(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 ai(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 St(e,t,n){let r=e.toLowerCase();if(r==="topdown"||r==="isometric")return r;throw new d(`Unknown projection "${e}"`,t,n)}function At(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 ci(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 li(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 ui(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function di(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=S(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&&!G(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 fi(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!S(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 pi(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 Oe(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(xe))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(xe))t.push({kind:"annotation",id:n.id})}for(let n of[...e.objects].sort(xe))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=Oe(e),i=Ge(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 Nt(e,t){let n=Oe(e),r=Ge(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:Ke(e,n)}))}function Ke(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 Ge(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Rt(e){let t=B(e),n=ue(t);return Ye(e,n.diagnostics)}function Ge(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(xe);return}e[n]=t}function xe(e,t){return e.id.localeCompare(t.id)}var mi=/^schema\s+2(?:\.0)?$/i,hi=/^schema\s+2\.0-draft$/i;function Xe(e){for(let t of e.split(/\r?\n/)){let n=t.trim();if(n)return hi.test(n)?"2.0-draft":mi.test(n)?"2.0":"1.0"}return"1.0"}function $e(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 yi(e,t);let n;try{n=E(e)}catch(i){return{ok:!1,value:null,diagnostics:[$(i,"parse")]}}let r;try{r=A(n)}catch(i){return{ok:!1,value:null,diagnostics:[$(i,"normalize")]}}try{M(r)}catch(i){return{ok:!1,value:null,diagnostics:[$(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function yi(e,t){let n;try{n=ve(e)}catch(s){return{ok:!1,value:null,diagnostics:[$(s,"parse","load.atlas.failed")]}}let r;try{r=B(n)}catch(s){return{ok:!1,value:null,diagnostics:[$(s,"normalize","load.atlas.materialize.failed")]}}try{M(r)}catch(s){return{ok:!1,value:null,diagnostics:[$(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 gi=/^```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(gi);u&&(r=!0,i=u[1]??null,s=l,o=[]);return}if(a.trim()==="```"){n.push({source:o.join(`
5
- `),info:i,startLine:s,endLine:l}),r=!1,i=null,s=0,o=[];return}o.push(a)}),n}function Ct(e){let t=E(e),n=A(t);return M(n),{ast:t,document:n}}function bi(e){let t=Ct(e);return{...t,scene:z(t.document)}}function wi(e){return $e(e)}function Ii(e){return le(e)}function ji(e,t={}){return je(e,t)}return Zt(vi);})();
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);})();