worldorbit 2.5.8 → 2.5.10

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