worldorbit 2.5.11 → 2.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/unpkg/worldorbit-core.min.js +5 -5
- package/dist/unpkg/worldorbit-markdown.min.js +20 -20
- package/dist/unpkg/worldorbit-viewer.min.js +29 -29
- package/dist/unpkg/worldorbit.js +38 -15
- package/dist/unpkg/worldorbit.min.js +36 -36
- package/package.json +1 -1
- package/packages/core/dist/atlas-edit.d.ts +11 -0
- package/packages/core/dist/atlas-edit.js +210 -0
- package/packages/core/dist/diagnostics.d.ts +10 -0
- package/packages/core/dist/diagnostics.js +109 -0
- package/packages/core/dist/draft-parse.d.ts +3 -0
- package/packages/core/dist/draft-parse.js +642 -0
- package/packages/core/dist/draft.d.ts +15 -0
- package/packages/core/dist/draft.js +343 -0
- package/packages/core/dist/errors.d.ts +7 -0
- package/packages/core/dist/errors.js +16 -0
- package/packages/core/dist/format.d.ts +4 -0
- package/packages/core/dist/format.js +364 -0
- package/packages/core/dist/index.d.ts +28 -0
- package/packages/core/dist/index.js +44 -0
- package/packages/core/dist/load.d.ts +4 -0
- package/packages/core/dist/load.js +130 -0
- package/packages/core/dist/markdown.d.ts +2 -0
- package/packages/core/dist/markdown.js +37 -0
- package/packages/core/dist/normalize.d.ts +2 -0
- package/packages/core/dist/normalize.js +304 -0
- package/packages/core/dist/parse.d.ts +2 -0
- package/packages/core/dist/parse.js +133 -0
- package/packages/core/dist/scene.d.ts +3 -0
- package/packages/core/dist/scene.js +1512 -0
- package/packages/core/dist/schema.d.ts +8 -0
- package/packages/core/dist/schema.js +298 -0
- package/packages/core/dist/tokenize.d.ts +4 -0
- package/packages/core/dist/tokenize.js +68 -0
- package/packages/core/dist/types.d.ts +382 -0
- package/packages/core/dist/types.js +1 -0
- package/packages/core/dist/validate.d.ts +2 -0
- package/packages/core/dist/validate.js +56 -0
- package/packages/editor/dist/editor.js +493 -121
|
@@ -1,5 +1,5 @@
|
|
|
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
|
|
3
|
-
`)}function
|
|
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=
|
|
1
|
+
"use strict";var WorldOrbitCore=(()=>{var Me=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Xt=Object.prototype.hasOwnProperty;var Ht=(e,t)=>{for(var n in t)Me(e,n,{get:t[n],enumerable:!0})},Jt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Kt(t))!Xt.call(e,i)&&i!==n&&Me(e,i,{get:()=>t[i],enumerable:!(r=Gt(t,i))||r.enumerable});return e};var Zt=e=>Jt(Me({},"__esModule",{value:!0}),e);var Oi={};Ht(Oi,{WORLDORBIT_FIELD_KEYS:()=>Ze,WORLDORBIT_FIELD_SCHEMAS:()=>Ae,WORLDORBIT_OBJECT_TYPES:()=>X,WorldOrbitError:()=>d,cloneAtlasDocument:()=>$e,createDiagnostic:()=>rt,createEmptyAtlasDocument:()=>Ve,detectWorldOrbitSchemaVersion:()=>Xe,diagnosticFromError:()=>T,extractWorldOrbitBlocks:()=>Wt,formatAtlasDocument:()=>Re,formatDocument:()=>ve,formatDraftDocument:()=>Ne,getAtlasDocumentNode:()=>Ue,getFieldSchema:()=>A,isKnownFieldKey:()=>H,listAtlasDocumentPaths:()=>Pt,load:()=>ji,loadWorldOrbitSource:()=>Te,loadWorldOrbitSourceWithDiagnostics:()=>He,materializeAtlasDocument:()=>W,materializeDraftDocument:()=>vt,normalizeDocument:()=>S,normalizeWithDiagnostics:()=>it,parse:()=>Ct,parseSafe:()=>vi,parseWithDiagnostics:()=>ue,parseWorldOrbit:()=>E,parseWorldOrbitAtlas:()=>xe,parseWorldOrbitDraft:()=>Dt,removeAtlasDocumentNode:()=>Rt,render:()=>Ii,renderDocumentToScene:()=>B,resolveAtlasDiagnosticPath:()=>Ge,resolveAtlasDiagnostics:()=>Ye,rotatePoint:()=>ft,stringify:()=>xi,supportsObjectType:()=>Se,tokenizeLine:()=>Qe,tokenizeLineDetailed:()=>z,unitFamilyAllowsUnit:()=>Fe,updateAtlasDocumentNode:()=>Et,upgradeDocumentToDraftV2:()=>je,upgradeDocumentToV2:()=>ne,upsertAtlasDocumentNode:()=>qe,validateAtlasDocumentWithDiagnostics:()=>Nt,validateDocument:()=>M,validateDocumentWithDiagnostics:()=>de});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var K=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],D=K.filter(e=>e!=="system"),Qt=["star","planet","moon","asteroid","comet","structure","phenomenon"],Je=["structure","phenomenon"],P=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],en=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function y(e,t){return{key:e,...t}}var X=new Set(K),Ae=new Map([y("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:P}),y("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"distance"}),y("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"distance"}),y("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:P}),y("period",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"duration"}),y("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"angle"}),y("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"angle"}),y("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:P,unitFamily:"angle"}),y("at",{kind:"string",placement:!0,arity:"single",objectTypes:Je}),y("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Je}),y("free",{kind:"string",placement:!0,arity:"single",objectTypes:en}),y("kind",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("class",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("culture",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:K}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:K}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:Qt}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:K}),y("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"radius"}),y("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"mass"}),y("density",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"generic"}),y("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"generic"}),y("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"generic"}),y("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:D}),y("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),y("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("on",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("source",{kind:"string",placement:!1,arity:"single",objectTypes:D}),y("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:D,unitFamily:"duration"})].map(e=>[e.key,e])),Ze=new Set(Ae.keys());function A(e){return Ae.get(e)}function H(e){return Ze.has(e)}function Se(e,t){return e.objectTypes.includes(t)}function Fe(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Qe(e){return z(e).map(t=>t.value)}function z(e,t={}){let n=[],r=t.columnOffset??0,i="",s=null,o=!1,a=!1,c=null,l=()=>{s!==null&&(n.push({value:i,column:s,quoted:o}),i="",s=null,o=!1)};for(let u=0;u<e.length;u++){let f=e[u],m=r+u+1;if(a&&f==="\\"){let p=e[u+1];if(p==='"'||p==="\\"){i+=p,u++;continue}}if(f==='"'){a?a=!1:(s===null&&(s=m),o=!0,c=m,a=!0);continue}if(!a&&/\s/.test(f)){l();continue}s===null&&(s=m),i+=f}if(a)throw new d("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function ae(e){return e.match(/^\s*/)?.[0].length??0}function E(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,s=null;for(let o=0;o<t.length;o++){let a=t[o],c=o+1;if(!a.trim())continue;let l=ae(a),u=z(a.slice(l),{line:c,columnOffset:l});if(u.length!==0){if(l===0){i=!1,s=null;let f=tn(u,c);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",c,l+1);if(u.length===1&&u[0].value==="info"){i=!0,s=l;continue}i&&l<=(s??0)&&(i=!1),i?r.infoEntries.push(on(u,c)):r.blockFields.push(rn(u,c))}}return{type:"document",objects:n}}function tn(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!X.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:nn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function nn(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=A(i.value);if(!s)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(s.arity==="multiple")for(;r<e.length&&!H(e[r].value);)o.push(e[r]),r++;else{let a=e[r];a&&(o.push(a),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(a=>a.value),location:{line:t,column:i.column}})}return n}function rn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!A(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function on(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var et=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,sn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),an=/^[A-Za-z][A-Za-z0-9+.-]*:/;function S(e){let t=null,n=[];for(let r of e.objects){let i=cn(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",system:t,objects:n}}function cn(e){let t=[...e.inlineFields,...e.blockFields];ln(e.objectType,t);let n=un(t),r=dn(e.objectType,n),i=fn(n),s=hn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,properties:i,info:s}:{type:e.objectType,id:e.name,properties:i,placement:r,info:s}}function ln(e,t){for(let n of t){let r=A(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Se(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function un(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function dn(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),s=t.has("free"),o=[n,r,i,s].filter(Boolean).length;if(o>1){let a=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",a?.location)}if(e==="system"&&o>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:ce(t,"orbit"),distance:V(t,"distance"),semiMajor:V(t,"semiMajor"),eccentricity:bn(t,"eccentricity"),period:V(t,"period"),angle:V(t,"angle"),inclination:V(t,"inclination"),phase:V(t,"phase")};if(r){let a=le(t,"at"),c=ce(t,"at");return{mode:"at",target:c,reference:yn(c,a.location)}}if(i)return{mode:"surface",target:ce(t,"surface")};if(s){let a=ce(t,"free"),c=gn(a);return{mode:"free",distance:c??void 0,descriptor:c?void 0:a}}return null}function fn(e){let t={};for(let[n,r]of e.entries()){let i=A(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=wn(r);break;case"number":t[n]=nt(U(r),n,r.location);break;case"unit":t[n]=tt(U(r),r.location,n);break;case"string":t[n]=pn(n,r);break}}return t}function pn(e,t){let n=t.values.join(" ").trim();return e==="image"&&mn(n,t.location),n}function mn(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(an);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function hn(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function yn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function tt(e,t,n){let r=e.match(et);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=A(n);if(s?.unitFamily&&!Fe(s.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function gn(e){let t=e.match(et);return t?{value:Number(t[1]),unit:t[2]??null}:null}function V(e,t){if(!e.has(t))return;let n=le(e,t);return tt(U(n),n.location,t)}function bn(e,t){if(!e.has(t))return;let n=le(e,t);return nt(U(n),t,n.location)}function nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function wn(e){let t=U(e).toLowerCase(),n=sn.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function le(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function ce(e,t){return U(le(e,t))}function U(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var In=new Set(["star","planet","moon","asteroid","comet"]);function M(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!In.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&jn(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&vn(r,r.placement.reference,t))}}function jn(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function vn(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function rt(e){return{...e}}function T(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function ue(e){let t;try{t=E(e)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"parse")]}}let n;try{n=S(t)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"normalize")]}}try{M(n)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function it(e){try{return{ok:!0,value:S(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"normalize")]}}}function de(e){try{return M(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"validate")]}}}var J=1495978707e-1,xn=6371,On=71492,$n=695700,Tn=63241.077,kn=206264.806,Dn=206264806,ut=.68,Mn=.2,dt=28;function B(e,t={}){let n=Sn(t),r=n.width,i=n.height,s=n.padding,o=An(e),a=Ln(e,t.projection),c=Pn(o,t.scaleModel),l=Rn(o),u=e.system?.id??null,f=new Map(e.objects.map(h=>[h.id,h])),m=mr(e.objects,f),p=new Map,g=[],b=[],v=[],x=[],j=[],O=new Map,L=new Map;for(let h of e.objects){let k=h.placement;if(!k){v.push(h);continue}if(k.mode==="orbit"){at(L,k.target,h);continue}if(k.mode==="surface"){at(O,k.target,h);continue}if(k.mode==="at"){j.push(h);continue}x.push(h)}let Y=x.length>0?r*.42:r/2,F=i/2,N={orbitChildren:L,surfaceChildren:O,objectMap:f,spacingFactor:l,projection:a,scaleModel:c},C=v.find(h=>h.type==="star")??v[0]??null;C&&Le(C,Y,F,0,p,g,b,N);let ke=v.filter(h=>h.id!==C?.id);if(ke.length>0){let h=Math.min(r,i)*.28*l*c.orbitDistanceMultiplier;ke.forEach((k,w)=>{let De=ee(w,ke.length,-Math.PI/2),_=te(De,h,a,1);Le(k,Y+_.x,F+_.y,0,p,g,b,N)})}x.forEach((h,k)=>{let w=r-s-140-Ir(h.placement?.mode==="free"?h.placement.distance:void 0,c),De=Math.max(76,(i-s*2-180)/Math.max(1,x.length)*l)*c.freePlacementMultiplier,_=s+92+k*De;p.set(h.id,{object:h,x:w,y:_,radius:he(h,0,c),sortKey:ge(w,_,0)}),b.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:w-60,y1:_,x2:w-18,y2:_,mode:"free"}),pe(h,p,g,b,N,1)}),j.forEach((h,k)=>{if(p.has(h.id)||!h.placement||h.placement.mode!=="at")return;let w=fr(h.placement.reference,p,f,k,j.length,r,i,s,N);p.set(h.id,{object:h,x:w.x,y:w.y,radius:he(h,2,c),sortKey:ge(w.x,w.y,2),anchorX:w.anchorX,anchorY:w.anchorY}),w.anchorX!==void 0&&w.anchorY!==void 0&&b.push({object:h,groupId:m.groupIds.get(h.id)??null,x1:w.anchorX,y1:w.anchorY,x2:w.x,y2:w.y,mode:"at"}),pe(h,p,g,b,N,2)});let G=[...p.values()].map(h=>Nn(h,c,m)),ie=g.map(h=>_n(h,m.groupIds.get(h.object.id)??null)),oe=b.map(h=>zn(h)),se=Bn(G,i,c.labelMultiplier),Vt=Wn(ie,oe,G,se),Ut=Cn(G,ie,oe,se,m),qt=Vn(e,a,n.preset,m,f),Yt=rr(r,i,G,ie,oe,se);return{width:r,height:i,padding:s,renderPreset:n.preset,projection:a,scaleModel:c,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${ct(a)} view - ${ct(o)} layout`,systemId:u,viewMode:a,layoutPreset:o,metadata:{format:e.format,version:e.version,view:a,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Yt,layers:Vt,groups:Ut,viewpoints:qt,objects:G,orbitVisuals:ie,leaders:oe,labels:se}}function ft(e,t,n){let r=Ie(n),i=Math.cos(r),s=Math.sin(r),o=e.x-t.x,a=e.y-t.y;return{x:t.x+o*i-a*s,y:t.y+o*s+a*i}}function An(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Sn(e){let t=Fn(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Fn(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Ln(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Pn(e,t){return{...En(e),...t}}function En(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Rn(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Nn(e,t,n){let{object:r,x:i,y:s,radius:o,sortKey:a,anchorX:c,anchorY:l}=e;return{renderId:we(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,x:i,y:s,radius:o,visualRadius:wr(r,o,t),sortKey:a,anchorX:c,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:vr(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function _n(e,t){return{renderId:`${we(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0}}function zn(e){return{renderId:`${we(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Bn(e,t,n){let r=[],i=[],s=[...e].filter(o=>!o.hidden).sort((o,a)=>o.sortKey-a.sortKey);for(let o of s){let a=o.y>t*.62?-1:1,c=xr(o,n),l=o.y+a*(o.radius+18*n),u=l+a*(16*n),f=ot(o.x,l,u,c,a),m=0;for(;i.some(p=>gr(p,f))&&m<10;)l+=a*14*n,u+=a*14*n,f=ot(o.x,l,u,c,a),m+=1;i.push(f),r.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,label:o.label,secondaryLabel:o.secondaryLabel,x:o.x,y:l,secondaryY:u,textAnchor:"middle",direction:a<0?"above":"below",hidden:o.hidden})}return r}function Wn(e,t,n,r){let i=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),s=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:i},{id:"orbits-front",renderIds:s},{id:"objects",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Cn(e,t,n,r,i){let s=new Map,o=a=>{if(!a)return null;let c=s.get(a);if(c)return c;let l=i.groupRoots.get(a)??null,u={renderId:a,rootObjectId:l,label:l??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Q(0,0,0,0)};return s.set(a,u),u};for(let a of e){let c=o(a.groupId);c&&!a.hidden&&c.objectIds.push(a.objectId)}for(let a of t){let c=o(a.groupId);c&&!a.hidden&&c.orbitIds.push(a.objectId)}for(let a of n){let c=o(a.groupId);c&&!a.hidden&&c.leaderIds.push(a.objectId)}for(let a of r){let c=o(a.groupId);c&&!a.hidden&&c.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=hr(a,e,t,n,r);return[...s.values()].sort((a,c)=>a.label.localeCompare(c.label))}function Vn(e,t,n,r,i){let s=Un(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,m,...p]=l.split(".");if(f!=="viewpoint"||!m||p.length===0)continue;let g=er(m);if(!g)continue;let b=p.join(".").toLowerCase(),v=o.get(g)??{id:g};qn(v,b,u,t,n,r,i),o.set(g,v)}let a=[...o.values()].map(l=>Yn(l,t,n,i)).filter(Boolean),c=a.findIndex(l=>l.id===s.id);return c>=0?a.splice(c,1,{...s,...a[c],layers:{...s.layers,...a[c].layers},filter:a[c].filter??s.filter,generated:!1}):a.unshift(s),a.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Un(e,t,n){return{id:"overview",label:e.system?.properties.title?`${String(e.system.properties.title)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function qn(e,t,n,r,i,s,o){let a=n.trim();switch(t){case"label":case"title":a&&(e.label=a);return;case"summary":case"description":a&&(e.summary=a);return;case"focus":case"object":a&&(e.focus=a);return;case"select":case"selection":a&&(e.select=a);return;case"projection":case"view":e.projection=Kn(a)??r;return;case"preset":e.preset=Xn(a)??i;return;case"rotation":case"angle":e.rotationDeg=pt(a)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Hn(a);return;case"layers":e.layers=Jn(a);return;case"query":e.filter={...e.filter??fe(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??fe(),objectTypes:Zn(a)};return;case"tags":e.filter={...e.filter??fe(),tags:be(a)};return;case"groups":e.filter={...e.filter??fe(),groupIds:Qn(a,s,o)};return}}function Yn(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,s=e.select&&r.has(e.select)?e.select:i,o=Gn(e.filter),a=e.label?.trim()||tr(e.id);return{id:e.id,label:a,summary:e.summary?.trim()||nr(a,i,o),objectId:i,selectedObjectId:s,projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function fe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Gn(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Kn(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Xn(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function pt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Hn(e){let t=pt(e);return t!==null&&t>0?t:null}function Jn(e){let t={};for(let n of be(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Zn(e){return be(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Qn(e,t,n){return be(e).map(r=>r.startsWith("wo-")&&r.endsWith("-group")?r:t.groupIds.has(r)?t.groupIds.get(r)??Z(r):(n.has(r),Z(r)))}function be(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function er(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function tr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function nr(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function rr(e,t,n,r,i,s){let o=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,m)=>{o=Math.min(o,f),a=Math.min(a,m),c=Math.max(c,f),l=Math.max(l,m)};for(let f of r)f.hidden||mt(f,u);for(let f of i)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of n)f.hidden||ht(f,u);for(let f of s)f.hidden||yt(f,u);return!Number.isFinite(o)||!Number.isFinite(a)?Q(0,0,e,t):Q(o,a,c,l)}function mt(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,s=bt(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,dt*2);for(let o of s)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function Q(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function ht(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function yt(e,t){let r=Or(e.label,e.secondaryLabel,1);t(e.x-r,e.y-18),t(e.x+r,e.y+8),t(e.x-r,e.secondaryY-14),t(e.x+r,e.secondaryY+8)}function Le(e,t,n,r,i,s,o,a){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:he(e,r,a.scaleModel),sortKey:ge(t,n,r)}),pe(e,i,s,o,a,r+1))}function pe(e,t,n,r,i,s){let o=t.get(e.id);if(!o)return;let a=[...i.orbitChildren.get(e.id)??[]].sort(ir),c=or(a,o.radius,i.spacingFactor,i.scaleModel),l=cr(a,c);a.forEach((f,m)=>{let p=sr(f,m,a.length,o,c,l[m]??c.innerPx,i);n.push({object:f,parentId:e.id,kind:p.kind,cx:p.cx,cy:p.cy,radius:p.radius,rx:p.rx,ry:p.ry,rotationDeg:p.rotationDeg,band:p.band,bandThickness:p.bandThickness,frontArcPath:p.frontArcPath,backArcPath:p.backArcPath}),Le(f,p.objectX,p.objectY,s,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,m)=>{let p=ee(m,u.length,-Math.PI/3),g=28*i.spacingFactor,b=te(p,o.radius,i.projection,i.projection==="isometric"?.9:1),v=te(p,o.radius+g,i.projection,i.projection==="isometric"?.9:1),x=o.x+b.x,j=o.y+b.y,O=o.x+v.x,L=o.y+v.y;t.set(f.id,{object:f,x:O,y:L,radius:he(f,s+1,i.scaleModel),sortKey:ge(O,L,s+1),anchorX:x,anchorY:j}),r.push({object:f,groupId:i.objectMap.has(f.id)?Z(yr(f,i.objectMap)):null,x1:x,y1:j,x2:O,y2:L,mode:"surface"}),pe(f,t,n,r,i,s+1)})}function ir(e,t){let n=me(e),r=me(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function or(e,t,n,r){let i=e.map(f=>me(f)),s=i.filter(f=>f!==null),o=t+56*n*r.orbitDistanceMultiplier,a=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(s.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:o,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42};let c=Math.min(...s),l=Math.max(...s),u=l-c;return{metrics:i,minMetric:c,maxMetric:l,metricSpread:u,innerPx:o,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42}}function sr(e,t,n,r,i,s,o){let a=e.placement,c=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let C=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:C,rotationDeg:0,band:c,bandThickness:c?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-C}}let l=I(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),u=s,f=Math.max(u*Math.sqrt(1-l*l),u*.18),m=Ee(a.inclination)??0,p=o.projection==="isometric"?Math.max(Mn,Math.cos(Ie(m)))*ut:1,g=Math.max(f*p,u*.14),b=Ee(a.angle)??0,v=u*l,x=It(-v,0,b),j=r.x+x.x,O=r.y+x.y,L=ur(a.phase,t,n),Y=wt(j,O,u,g,b,L),F=o.projection==="topdown"&&l<=1e-4&&Math.abs(b)<=1e-4,N=c?dr(e,u,i,o.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:j,cy:F?r.y:O,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:g,rotationDeg:b,band:c,bandThickness:N,frontArcPath:o.projection==="isometric"||c?st(j,O,u,g,b,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||c?st(j,O,u,g,b,Math.PI,Math.PI*2):void 0,objectX:Y.x,objectY:Y.y}}function ar(e,t){return t.innerPx+t.stepPx*lr(Math.max(e,0)+1)}function cr(e,t){let n=[];return e.forEach((r,i)=>{let s=me(r),o=t.innerPx+i*t.stepPx,a=s===null?o:ar(s,t),c=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(a,c))}),n}function me(e){return!e.placement||e.placement.mode!=="orbit"?null:ye(e.placement.semiMajor??e.placement.distance??null)}function lr(e){return Math.log(e)/Math.log(2)}function ur(e,t,n){let r=e?Ee(e):null;return r!==null?Ie(r-90):ee(t,n,-Math.PI/2)}function dr(e,t,n,r){let i=ye(Pe(e.properties.inner)),s=ye(Pe(e.properties.outer));if(i!==null&&s!==null){let a=Math.abs(s-i);if(n.metricSpread>0)return I(a/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(i,s),1e-4);return I(a/c*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function fr(e,t,n,r,i,s,o,a,c){if(e.kind==="lagrange")return pr(e,t,n,s,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=ee(r,i,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,m=te(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+m.x,y:l.y+m.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=ee(r,i,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,m=te(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+m.x,y:l.y+m.y,anchorX:l.x,anchorY:l.y}}}return{x:s-a-170,y:o-a-86-r*58*c.scaleModel.freePlacementMultiplier}}function pr(e,t,n,r,i){let s=e.secondary?t.get(e.primary):br(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!s||!o)return{x:r*.7,y:i*.25};let a=o.x-s.x,c=o.y-s.y,l=Math.hypot(a,c)||1,u=a/l,f=c/l,m=-f,p=u,g=I(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-f*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+f*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:s.x-u*g,y:s.y-f*g,anchorX:s.x,anchorY:s.y};case"L4":return{x:o.x+(u*.5-m*.8660254)*g,y:o.y+(f*.5-p*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+m*.8660254)*g,y:o.y+(f*.5+p*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function mr(e,t){let n=new Map,r=new Map;for(let l of e){let u=gt(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,s=new Map,o=new Map,a=l=>{let u=i.get(l);if(u)return u;let f=new Set,m=[],p=n.get(l)??null;for(;p&&!f.has(p);)m.push(p),f.add(p),p=n.get(p)??null;return i.set(l,m),m},c=l=>{let u=o.get(s.get(l)??"");if(u)return u;let f=n.get(l)??null,m=t.get(l),p=l;return m?.placement&&m.placement.mode!=="free"&&f&&(p=c(f)),p};for(let l of e){a(l.id);let u=c(l.id),f=Z(u);s.set(l.id,f),o.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:s,groupRoots:o}}function gt(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function hr(e,t,n,r,i){let s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=(u,f)=>{s=Math.min(s,u),o=Math.min(o,f),a=Math.max(a,u),c=Math.max(c,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&ht(u,l);for(let u of n)!u.hidden&&e.orbitIds.includes(u.objectId)&&mt(u,l);for(let u of r)!u.hidden&&e.leaderIds.includes(u.objectId)&&(l(u.x1,u.y1),l(u.x2,u.y2));for(let u of i)!u.hidden&&e.labelIds.includes(u.objectId)&&yt(u,l);return!Number.isFinite(s)||!Number.isFinite(o)?Q(0,0,0,0):Q(s,o,a,c)}function yr(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=gt(n,t);if(!i)break;let s=t.get(i);if(!s)break;n=s}return n.id}function ot(e,t,n,r,i){return{left:e-r,right:e+r,top:Math.min(t,n)-(i<0?18:12),bottom:Math.max(t,n)+(i<0?8:12)}}function gr(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function br(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function he(e,t,n){let r=jr(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return I((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return I(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return I(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return I(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return I(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return I(8*i,n.minBodyRadius,n.maxBodyRadius)}}function wr(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function ye(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/J;case"m":return e.value/1e3/J;case"ly":return e.value*Tn;case"pc":return e.value*kn;case"kpc":return e.value*Dn;case"re":return e.value*xn/J;case"rj":return e.value*On/J;case"sol":return e.value*$n/J;default:return e.value}}function Ir(e,t){let n=ye(e??null);return n===null||n<=0?0:I(n*96*t.freePlacementMultiplier,0,420)}function jr(e,t){let n=Pe(e);if(!n)return null;let r;switch(n.unit){case"sol":r=I(n.value*22,14,40);break;case"re":r=I(n.value*10,6,18);break;case"km":r=I(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=I(n.value*4,4,20);break}return I(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Pe(e){return!e||typeof e!="object"||!("value"in e)?null:e}function Ee(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ee(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function st(e,t,n,r,i,s,o){let a=bt(e,t,n,r,i,s,o,dt);return a.length===0?"":a.map((c,l)=>`${l===0?"M":"L"} ${lt(c.x)} ${lt(c.y)}`).join(" ")}function bt(e,t,n,r,i,s,o,a){let c=[];for(let l=0;l<=a;l+=1){let u=s+(o-s)*l/a;c.push(wt(e,t,n,r,i,u))}return c}function wt(e,t,n,r,i,s){let o=n*Math.cos(s),a=r*Math.sin(s),c=It(o,a,i);return{x:e+c.x,y:t+c.y}}function It(e,t,n){let r=Ie(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function te(e,t,n,r){let i=n==="isometric"?ut*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function ge(e,t,n){return t*1e3+e+n*.01}function I(e,t,n){return Math.min(Math.max(e,t),n)}function at(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function we(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Z(e){return`${we(e)}-group`}function vr(e){return typeof e=="string"&&e.trim()?e:void 0}function xr(e,t){let n=e.label.length*4.6*t+18,r=e.secondaryLabel.length*3.9*t+18;return Math.max(n,r,e.visualRadius+18)}function Or(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function ct(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ie(e){return e*Math.PI/180}function lt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ne(e,t={}){let n=B(e,t),r=[],i=kr(e,r),s=Dr(e,r),o=Tr(e,n.renderPreset??t.preset??null,n.projection),a=e.system?$r(e,o,i,s,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(c=>!c.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",sourceVersion:e.version,system:a,objects:e.objects.map(xt),diagnostics:r}}function je(e,t={}){return Rr(ne(e,t))}function W(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Lr(e.system),info:Pr(e.system)}:null,objects:e.objects.map(xt)}}function vt(e){return W(e)}function $r(e,t,n,r,i,s){let o=B(e,{preset:s??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:typeof e.system?.properties.title=="string"?e.system.properties.title:null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Mr),annotations:r}}function Tr(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function kr(e,t){let n={};for(let[i,s]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=s);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Dr(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,s,...o]=r.split(".");if(!s||o.length===0)continue;let a=jt(s);if(!a)continue;let c=n.get(a)??{id:a};switch(o.join(".").toLowerCase()){case"label":c.label=i;break;case"target":case"object":c.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":c.body=i;break;case"tags":c.tags=Sr(i);break}n.set(a,c)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let s=jt(`${r.id}-notes`);n.has(s)||(n.set(s,{id:s,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${s}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Fr(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Mr(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function xt(e){return{...e,properties:Ar(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ar(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Sr(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function jt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Fr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Lr(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),t}function Pr(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=Er(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??"")}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Er(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Rr(e){return{...e,version:"2.0-draft"}}var Ot=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function ve(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.0-draft"){if(n==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"?{...e,version:"2.0-draft"}:je(e);return Ne(c)}let a=e.version==="2.0"?e:e.version==="2.0-draft"?{...e,version:"2.0"}:ne(e);return Re(a)}let i=[],s=e;s.system&&i.push(...Nr(s.system));let o=[...s.objects].sort(Be);for(let a of o)i.length>0&&i.push(""),i.push(..._r(a));return i.join(`
|
|
2
|
+
`)}function Re(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 Ne(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 Nr(e){return _e("system",e.id,e.properties,null,e.info)}function Tt(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${$(e.title)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${$(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${$(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${$(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[s])=>i.localeCompare(s)))t.push(` ${n} ${$(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Wr(n));for(let n of e.annotations)t.push(""),t.push(...Cr(n));return t}function _r(e){return _e(e.type,e.id,e.properties,e.placement,e.info)}function kt(e){return _e(`object ${e.type}`,e.id,e.properties,e.placement,e.info)}function _e(e,t,n,r,i){let s=[`${e} ${t}`],o=[...zr(r),...Br(n)];for(let c of o)s.push(` ${c}`);let a=Object.entries(i).sort(([c],[l])=>c.localeCompare(l));if(a.length>0){o.length>0&&s.push(""),s.push(" info");for(let[c,l]of a)s.push(` ${c} ${$(l)}`)}return s}function zr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...q("distance",e.distance),...q("semiMajor",e.semiMajor),...Ur("eccentricity",e.eccentricity),...q("period",e.period),...q("angle",e.angle),...q("inclination",e.inclination),...q("phase",e.phase)];case"at":return[`at ${qr(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?ze(e.distance):e.descriptor??""}`.trim()]}}function Br(e){return Object.keys(e).sort(Gr).map(t=>`${t} ${Vr(e[t])}`)}function Wr(e){let t=[`viewpoint ${e.id}`,` label ${$(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${$(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=Yr(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${$(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map($).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Cr(e){let t=[`annotation ${e.id}`,` label ${$(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${$(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map($).join(" ")}`),t}function Vr(e){return Array.isArray(e)?e.map(t=>$(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?$(e):ze(e)}function ze(e){return`${e.value}${e.unit??""}`}function q(e,t){return t?[`${e} ${ze(t)}`]:[]}function Ur(e,t){return t===void 0?[]:[`${e} ${t}`]}function qr(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Yr(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Gr(e,t){let n=Ot.indexOf(e),r=Ot.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Be(e,t){let n=$t(e.type),r=$t(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function $t(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function $(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function xe(e){return Mt(e,"2.0")}function Dt(e){return Mt(e,"2.0-draft")}function Mt(e,t){let n=e.split(/\r?\n/),r=!1,i="2.0",s=null,o=null,a=[],c=!1,l=!1,u=new Set,f=new Set;for(let b=0;b<n.length;b++){let v=n[b],x=b+1;if(!v.trim())continue;let j=ae(v),O=z(v.slice(j),{line:x,columnOffset:j});if(O.length!==0){if(!r){i=Kr(O,x),r=!0;continue}if(j===0){o=Xr(O,x,s,a,u,f,{sawDefaults:c,sawAtlas:l}),o.kind==="system"?s=o.system:o.kind==="defaults"?c=!0:o.kind==="atlas"&&(l=!0);continue}if(!o)throw new d("Indented line without parent atlas section",x,j+1);ei(o,j,O,x)}}if(!r)throw new d('Missing required atlas schema header "schema 2.0"');let p=S({type:"document",objects:a}).objects;return M({format:"worldorbit",version:"1.0",system:null,objects:p}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:s,objects:p,diagnostics:i==="2.0-draft"&&t==="2.0"?[{code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}]:[]}}function Kr(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||e[1].value.toLowerCase()!=="2.0-draft"&&e[1].value.toLowerCase()!=="2.0")throw new d('Expected atlas header "schema 2.0" or legacy "schema 2.0-draft"',t,e[0]?.column??1);return e[1].value.toLowerCase()==="2.0-draft"?"2.0-draft":"2.0"}function Xr(e,t,n,r,i,s,o){switch(e[0]?.value.toLowerCase()){case"system":if(n)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Hr(e,t);case"defaults":if(!n)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(o.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:n,seenFields:new Set};case"atlas":if(!n)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(o.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:n,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!n)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Jr(e,t,n,i);case"annotation":if(!n)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Zr(e,t,n,s);case"object":return Qr(e,t,r);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Hr(e,t){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},seenFields:new Set}}function Jr(e,t,n,r){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let i=Ft(e[1].value);if(!i)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate viewpoint id "${i}"`,t,e[1].column);let s={id:i,label:Lt(i),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(s),r.add(i),{kind:"viewpoint",viewpoint:s,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Zr(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=Ft(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let s={id:i,label:Lt(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(s),r.add(i),{kind:"annotation",annotation:s,seenFields:new Set}}function Qr(e,t,n){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let r=e[1],i=e[2],s=r.value;if(!X.has(s)||s==="system")throw new d(`Unknown object type "${r.value}"`,t,r.column);let o={type:"object",objectType:s,name:i.value,inlineFields:pi(e.slice(3),t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}};return n.push(o),{kind:"object",objectNode:o,inInfoBlock:!1,infoIndent:null}}function ei(e,t,n,r){switch(e.kind){case"system":ti(e,n,r);return;case"defaults":ni(e,n,r);return;case"atlas":ri(e,t,n,r);return;case"viewpoint":ii(e,t,n,r);return;case"annotation":si(e,n,r);return;case"object":ai(e,t,n,r);return}}function ti(e,t,n){if(re(t,e.seenFields,n)!=="title")throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column);e.system.title=R(t,n)}function ni(e,t,n){let r=re(t,e.seenFields,n),i=R(t,n);switch(r){case"view":e.system.defaults.view=At(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=St(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ri(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){if(n.length<2)throw new d("Invalid atlas metadata entry",r,n[0]?.column??1);let i=n[0].value;if(i in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i}"`,r,n[0].column);e.system.atlasMetadata[i]=R(n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ii(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){oi(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=re(n,e.seenFields,r),s=R(n,r);switch(i){case"label":e.viewpoint.label=s;return;case"summary":e.viewpoint.summary=s;return;case"focus":e.viewpoint.focusObjectId=s;return;case"select":e.viewpoint.selectedObjectId=s;return;case"projection":e.viewpoint.projection=At(s,r,n[0].column);return;case"preset":e.viewpoint.preset=St(s,r,n[0].column);return;case"zoom":e.viewpoint.zoom=ui(s,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=di(s,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=li(n.slice(1),r);return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function oi(e,t,n){let r=re(t,e.seenFilterFields,n),i=e.viewpoint.filter??fi();switch(r){case"query":i.query=R(t,n);break;case"objecttypes":i.objectTypes=ci(t.slice(1),n);break;case"tags":i.tags=We(t.slice(1),n,"tags");break;case"groups":i.groupIds=We(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function si(e,t,n){switch(re(t,e.seenFields,n)){case"label":e.annotation.label=R(t,n);return;case"target":e.annotation.targetObjectId=R(t,n);return;case"body":e.annotation.body=R(t,n);return;case"tags":e.annotation.tags=We(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function ai(e,t,n,r){if(n.length===1&&n[0].value==="info"){e.inInfoBlock=!0,e.infoIndent=t;return}if(e.inInfoBlock&&t<=(e.infoIndent??0)&&(e.inInfoBlock=!1,e.infoIndent=null),e.inInfoBlock){e.objectNode.infoEntries.push(hi(n,r));return}e.objectNode.blockFields.push(mi(n,r))}function re(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function R(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ci(e,t){if(e.length===0)throw new d("Missing value for atlas field",t);return e.map(n=>{let r=n.value;if(r!=="star"&&r!=="planet"&&r!=="moon"&&r!=="belt"&&r!=="asteroid"&&r!=="comet"&&r!=="ring"&&r!=="structure"&&r!=="phenomenon")throw new d(`Unknown viewpoint object type "${n.value}"`,t,n.column);return r})}function We(e,t,n){if(e.length===0)throw new d(`Missing value for field "${n}"`,t);return e.map(r=>r.value)}function li(e,t){if(e.length===0)throw new d('Missing value for field "layers"',t);let n={};for(let r of e){let i=!r.value.startsWith("-")&&!r.value.startsWith("!"),s=r.value.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){n["orbits-back"]=i,n["orbits-front"]=i;continue}if(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="objects"||s==="labels"||s==="metadata"){n[s]=i;continue}throw new d(`Unknown layer token "${r.value}"`,t,r.column)}return n}function At(e,t,n){let r=e.toLowerCase();if(r==="topdown"||r==="isometric")return r;throw new d(`Unknown projection "${e}"`,t,n)}function St(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function ui(e,t,n,r){let i=Number(e);if(!Number.isFinite(i)||i<=0)throw new d(`Field "${r}" expects a positive number`,t,n);return i}function di(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Field "${r}" expects a finite number`,t,n);return i}function fi(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function pi(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=A(i.value);if(!s)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(s.arity==="multiple")for(;r<e.length&&!H(e[r].value);)o.push(e[r]),r++;else{let a=e[r];a&&(o.push(a),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(a=>a.value),location:{line:t,column:i.column}})}return n}function mi(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!A(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function hi(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}function Ft(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Lt(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ve(e="WorldOrbit"){return{format:"worldorbit",version:"2.0",sourceVersion:"1.0",system:{type:"system",id:e,title:e,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},objects:[],diagnostics:[]}}function $e(e){return structuredClone(e)}function Pt(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(Oe))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(Oe))t.push({kind:"annotation",id:n.id})}for(let n of[...e.objects].sort(Oe))t.push({kind:"object",id:n.id});return t}function Ue(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"object":return t.id?_t(e,t.id):null;case"viewpoint":return t.id?zt(e.system,t.id):null;case"annotation":return t.id?Bt(e.system,t.id):null}}function qe(e,t,n){let r=$e(e),i=Ke(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return Ce(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return Ce(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return Ce(i.annotations,n),r}}function Et(e,t,n){return qe(e,t,n(Ue(e,t)))}function Rt(e,t){let n=$e(e),r=Ke(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;default:return n}}function Ye(e,t){return t.map(n=>({diagnostic:n,path:Ge(e,n)}))}function Ge(e,t){if(t.objectId&&_t(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&zt(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Bt(e.system,n[1]))return{kind:"annotation",id:n[1]}}return t.field&&t.field in Ke(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Nt(e){let t=W(e),n=de(t);return Ye(e,n.diagnostics)}function Ke(e){return e.system||(e.system=Ve().system),e.system}function _t(e,t){return e.objects.find(n=>n.id===t)??null}function zt(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Bt(e,t){return e?.annotations.find(n=>n.id===t)??null}function Ce(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(Oe);return}e[n]=t}function Oe(e,t){return e.id.localeCompare(t.id)}var yi=/^schema\s+2(?:\.0)?$/i,gi=/^schema\s+2\.0-draft$/i;function Xe(e){for(let t of e.split(/\r?\n/)){let n=t.trim();if(n)return gi.test(n)?"2.0-draft":yi.test(n)?"2.0":"1.0"}return"1.0"}function Te(e){let t=He(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function He(e){let t=Xe(e);if(t==="2.0"||t==="2.0-draft")return bi(e,t);let n;try{n=E(e)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"parse")]}}let r;try{r=S(n)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"normalize")]}}try{M(r)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function bi(e,t){let n;try{n=xe(e)}catch(s){return{ok:!1,value:null,diagnostics:[T(s,"parse","load.atlas.failed")]}}let r;try{r=W(n)}catch(s){return{ok:!1,value:null,diagnostics:[T(s,"normalize","load.atlas.materialize.failed")]}}try{M(r)}catch(s){return{ok:!1,value:null,diagnostics:[T(s,"validate","load.atlas.validate.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:r,atlasDocument:n,draftDocument:n,diagnostics:[...n.diagnostics]},diagnostics:[...n.diagnostics]}}var wi=/^```worldorbit(?:\s+(.*))?\s*$/;function Wt(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,s=0,o=[];return t.forEach((a,c)=>{let l=c+1;if(!r){let u=a.match(wi);u&&(r=!0,i=u[1]??null,s=l,o=[]);return}if(a.trim()==="```"){n.push({source:o.join(`
|
|
5
|
+
`),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=S(t);return M(n),{ast:t,document:n}}function Ii(e){let t=Ct(e);return{...t,scene:B(t.document)}}function ji(e){return Te(e)}function vi(e){return ue(e)}function xi(e,t={}){return ve(e,t)}return Zt(Oi);})();
|