worldorbit 2.5.16 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +81 -15
  2. package/dist/browser/core/dist/index.js +1228 -110
  3. package/dist/browser/editor/dist/index.js +1896 -180
  4. package/dist/browser/markdown/dist/index.js +1071 -99
  5. package/dist/browser/viewer/dist/index.js +1127 -113
  6. package/dist/unpkg/core/dist/index.js +1228 -110
  7. package/dist/unpkg/editor/dist/index.js +1896 -180
  8. package/dist/unpkg/markdown/dist/index.js +1071 -99
  9. package/dist/unpkg/viewer/dist/index.js +1127 -113
  10. package/dist/unpkg/worldorbit-core.min.js +12 -12
  11. package/dist/unpkg/worldorbit-editor.min.js +295 -203
  12. package/dist/unpkg/worldorbit-markdown.min.js +66 -58
  13. package/dist/unpkg/worldorbit-viewer.min.js +84 -76
  14. package/dist/unpkg/worldorbit.js +1304 -124
  15. package/dist/unpkg/worldorbit.min.js +88 -80
  16. package/package.json +1 -1
  17. package/packages/core/dist/atlas-edit.js +75 -1
  18. package/packages/core/dist/atlas-validate.js +211 -8
  19. package/packages/core/dist/draft-parse.js +401 -22
  20. package/packages/core/dist/draft.d.ts +5 -2
  21. package/packages/core/dist/draft.js +103 -8
  22. package/packages/core/dist/format.js +99 -6
  23. package/packages/core/dist/load.js +9 -2
  24. package/packages/core/dist/normalize.js +1 -0
  25. package/packages/core/dist/scene.js +400 -64
  26. package/packages/core/dist/types.d.ts +60 -4
  27. package/packages/editor/dist/editor.js +702 -65
  28. package/packages/editor/dist/types.d.ts +3 -1
  29. package/packages/viewer/dist/atlas-state.js +11 -2
  30. package/packages/viewer/dist/atlas-viewer.js +19 -7
  31. package/packages/viewer/dist/render.js +31 -2
  32. package/packages/viewer/dist/theme.js +1 -0
  33. package/packages/viewer/dist/tooltip.js +9 -0
  34. package/packages/viewer/dist/types.d.ts +12 -2
  35. package/packages/viewer/dist/viewer.js +28 -1
@@ -1,120 +1,128 @@
1
- "use strict";var WorldOrbitEditor=(()=>{var on=Object.defineProperty;var Li=Object.getOwnPropertyDescriptor;var Ti=Object.getOwnPropertyNames;var Ai=Object.prototype.hasOwnProperty;var Ei=(e,t)=>{for(var r in t)on(e,r,{get:t[r],enumerable:!0})},Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ti(t))!Ai.call(e,o)&&o!==r&&on(e,o,{get:()=>t[o],enumerable:!(n=Li(t,o))||n.enumerable});return e};var Ci=e=>Pi(on({},"__esModule",{value:!0}),e);var Od={};Ei(Od,{createWorldOrbitEditor:()=>yi});var y=class e extends Error{line;column;constructor(t,r,n){let o=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var _t=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],be=_t.filter(e=>e!=="system"),Fi=["star","planet","moon","asteroid","comet","structure","phenomenon"],Bn=["structure","phenomenon"],ze=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Vi=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function B(e,t){return{key:e,...t}}var xr=new Set(_t),_n=new Map([B("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:ze}),B("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"distance"}),B("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"distance"}),B("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:ze}),B("period",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"duration"}),B("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"angle"}),B("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"angle"}),B("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"angle"}),B("at",{kind:"string",placement:!0,arity:"single",objectTypes:Bn}),B("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Bn}),B("free",{kind:"string",placement:!0,arity:"single",objectTypes:Vi}),B("kind",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("class",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("culture",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:_t}),B("color",{kind:"string",placement:!1,arity:"single",objectTypes:_t}),B("image",{kind:"string",placement:!1,arity:"single",objectTypes:Fi}),B("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:_t}),B("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"radius"}),B("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"mass"}),B("density",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"generic"}),B("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"generic"}),B("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"generic"}),B("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:be}),B("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),B("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),B("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),B("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("on",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("source",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"duration"})].map(e=>[e.key,e])),Ri=new Set(_n.keys());function pe(e){return _n.get(e)}function Nn(e){return Ri.has(e)}function Un(e,t){return e.objectTypes.includes(t)}function $r(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 Nt(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,l=!1,a=!1,s=null,p=()=>{i!==null&&(r.push({value:o,column:i,quoted:l}),o="",i=null,l=!1)};for(let c=0;c<e.length;c++){let u=e[c],v=n+c+1;if(a&&u==="\\"){let x=e[c+1];if(x==='"'||x==="\\"){o+=x,c++;continue}}if(u==='"'){a?a=!1:(i===null&&(i=v),l=!0,s=v,a=!0);continue}if(!a&&/\s/.test(u)){p();continue}i===null&&(i=v),o+=u}if(a)throw new y("Unclosed quote in line",t.line,s??n+e.length);return p(),r}function Ir(e){return e.match(/^\s*/)?.[0].length??0}function Ut(e){let t=e.split(/\r?\n/),r=[],n=null,o=!1,i=null;for(let l=0;l<t.length;l++){let a=t[l],s=l+1;if(!a.trim())continue;let p=Ir(a),c=Nt(a.slice(p),{line:s,columnOffset:p});if(c.length!==0){if(p===0){o=!1,i=null;let u=Bi(c,s);r.push(u),n=u;continue}if(!n)throw new y("Indented line without parent object",s,p+1);if(c.length===1&&c[0].value==="info"){o=!0,i=p;continue}o&&p<=(i??0)&&(o=!1),o?n.infoEntries.push(Ui(c,s)):n.blockFields.push(Ni(c,s))}}return{type:"document",objects:r}}function Bi(e,t){if(e.length<2)throw new y("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!xr.has(r.value))throw new y(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:_i(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function _i(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=pe(o.value);if(!i)throw new y(`Unknown field "${o.value}"`,t,o.column);n++;let l=[];if(i.arity==="multiple")for(;n<e.length&&!Nn(e[n].value);)l.push(e[n]),n++;else{let a=e[n];a&&(l.push(a),n++)}if(l.length===0)throw new y(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:l.map(a=>a.value),location:{line:t,column:o.column}})}return r}function Ni(e,t){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);if(!pe(e[0].value))throw new y(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Ui(e,t){if(e.length<2)throw new y("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}var zn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,zi=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Wi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function zt(e){let t=null,r=[];for(let n of e.objects){let o=Hi(n);if(n.objectType==="system"){if(t)throw y.fromLocation("Only one system object is allowed",n.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],objects:r}}function Hi(e){let t=[...e.inlineFields,...e.blockFields];Yi(e.objectType,t);let r=qi(t),n=Gi(e.objectType,r),o=Xi(r),i=Ji(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:n,info:i}}function Yi(e,t){for(let r of t){let n=pe(r.key);if(!n)throw y.fromLocation(`Unknown field "${r.key}"`,r.location);if(!Un(n,e))throw y.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw y.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function qi(e){let t=new Map;for(let r of e){if(t.has(r.key))throw y.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function Gi(e,t){let r=t.has("orbit"),n=t.has("at"),o=t.has("surface"),i=t.has("free"),l=[r,n,o,i].filter(Boolean).length;if(l>1){let a=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw y.fromLocation("Object has multiple placement modes",a?.location)}if(e==="system"&&l>0)throw y.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:kr(t,"orbit"),distance:ht(t,"distance"),semiMajor:ht(t,"semiMajor"),eccentricity:ta(t,"eccentricity"),period:ht(t,"period"),angle:ht(t,"angle"),inclination:ht(t,"inclination"),phase:ht(t,"phase")};if(n){let a=jr(t,"at"),s=kr(t,"at");return{mode:"at",target:s,reference:Qi(s,a.location)}}if(o)return{mode:"surface",target:kr(t,"surface")};if(i){let a=kr(t,"free"),s=ea(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function Xi(e){let t={};for(let[r,n]of e.entries()){let o=pe(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=ra(n);break;case"number":t[r]=Hn(bt(n),r,n.location);break;case"unit":t[r]=Wn(bt(n),n.location,r);break;case"string":t[r]=Ki(r,n);break}}return t}function Ki(e,t){let r=t.values.join(" ").trim();return e==="image"&&Zi(r,t.location),r}function Zi(e,t){if(!e)throw y.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw y.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Wi);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw y.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function Ji(e){let t={};for(let r of e){if(r.key in t)throw y.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function Qi(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Wn(e,t,r){let n=e.match(zn);if(!n)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=pe(r);if(i?.unitFamily&&!$r(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function ea(e){let t=e.match(zn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ht(e,t){if(!e.has(t))return;let r=jr(e,t);return Wn(bt(r),r.location,t)}function ta(e,t){if(!e.has(t))return;let r=jr(e,t);return Hn(bt(r),t,r.location)}function Hn(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function ra(e){let t=bt(e).toLowerCase(),r=zi.get(t);if(r===void 0)throw y.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function jr(e,t){let r=e.get(t);if(!r)throw new y(`Missing value for key "${t}"`);return r}function kr(e,t){return bt(jr(e,t))}function bt(e){if(e.values.length!==1)throw y.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var na=new Set(["star","planet","moon","asteroid","comet"]);function Wt(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new y(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new y(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let o=r.get(n.placement.target);if(!o||!na.has(o.type))throw new y(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&oa(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&ia(n,n.placement.reference,t))}}function oa(e,t,r){if(!r.has(t.primary))throw new y(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new y(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ia(e,t,r){if(!r.has(t.objectId))throw new y(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function ot(e,t,r=`${t}.failed`){return e instanceof y?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}var Ht=1495978707e-1,aa=6371,sa=71492,la=695700,ca=63241.077,da=206264.806,ua=206264806,Zn=.68,pa=.2,Jn=28;function ye(e,t={}){let r=ma(t),n=r.width,o=r.height,i=r.padding,l=fa(e),a=ha(e,t.projection),s=ba(l,t.scaleModel),p=wa(l),c=e.system?.id??null,u=new Map(e.objects.map(D=>[D.id,D])),v=Qa(e.objects,u),x=new Map,k=[],I=[],V=[],$=[],S=[],E=new Map,X=new Map;for(let D of e.objects){let O=D.placement;if(!O){V.push(D);continue}if(O.mode==="orbit"){Gn(X,O.target,D);continue}if(O.mode==="surface"){Gn(E,O.target,D);continue}if(O.mode==="at"){S.push(D);continue}$.push(D)}let W=$.length>0?n*.42:n/2,U=o/2,H={orbitChildren:X,surfaceChildren:E,objectMap:u,spacingFactor:p,projection:a,scaleModel:s},C=V.find(D=>D.type==="star")??V[0]??null;C&&an(C,W,U,0,x,k,I,H);let ie=V.filter(D=>D.id!==C?.id);if(ie.length>0){let D=Math.min(n,o)*.28*p*s.orbitDistanceMultiplier;ie.forEach((O,j)=>{let ae=Gt(j,ie.length,-Math.PI/2),q=Xt(ae,D,a,1);an(O,W+q.x,U+q.y,0,x,k,I,H)})}$.forEach((D,O)=>{let j=n-i-140-is(D.placement?.mode==="free"?D.placement.distance:void 0,s),ae=Math.max(76,(o-i*2-180)/Math.max(1,$.length)*p)*s.freePlacementMultiplier,q=i+92+O*ae;x.set(D.id,{object:D,x:j,y:q,radius:Dr(D,0,s),sortKey:Tr(j,q,0)}),I.push({object:D,groupId:v.groupIds.get(D.id)??null,x1:j-60,y1:q,x2:j-18,y2:q,mode:"free"}),Or(D,x,k,I,H,1)}),S.forEach((D,O)=>{if(x.has(D.id)||!D.placement||D.placement.mode!=="at")return;let j=Za(D.placement.reference,x,u,O,S.length,n,o,i,H);x.set(D.id,{object:D,x:j.x,y:j.y,radius:Dr(D,2,s),sortKey:Tr(j.x,j.y,2),anchorX:j.anchorX,anchorY:j.anchorY}),j.anchorX!==void 0&&j.anchorY!==void 0&&I.push({object:D,groupId:v.groupIds.get(D.id)??null,x1:j.anchorX,y1:j.anchorY,x2:j.x,y2:j.y,mode:"at"}),Or(D,x,k,I,H,2)});let J=[...x.values()].map(D=>va(D,s,v)),ee=k.map(D=>xa(D,v.groupIds.get(D.object.id)??null)),K=I.map(D=>$a(D)),Te=Ia(J,o,s.labelMultiplier),Je=Oa(e,J),Ve=ka(ee,Je,K,J,Te),pt=ja(J,ee,K,Te,v),F=Sa(e,J),te=Ma(e,a,r.preset,v,u),Qe=Ua(n,o,J,ee,K,Te);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:a,scaleModel:s,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Xn(a)} view - ${Xn(l)} layout`,systemId:c,viewMode:a,layoutPreset:l,metadata:{format:e.format,version:e.version,view:a,scale:String(e.system?.properties.scale??l),units:String(e.system?.properties.units??"mixed"),preset:r.preset??"custom"},contentBounds:Qe,layers:Ve,groups:pt,semanticGroups:F,viewpoints:te,objects:J,orbitVisuals:ee,relations:Je,leaders:K,labels:Te}}function ue(e,t,r){let n=Er(r),o=Math.cos(n),i=Math.sin(n),l=e.x-t.x,a=e.y-t.y;return{x:t.x+l*o-a*i,y:t.y+l*i+a*o}}function fa(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 ma(e){let t=ga(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function ga(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 ha(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function ba(e,t){return{...ya(e),...t}}function ya(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 wa(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function va(e,t,r){let{object:n,x:o,y:i,radius:l,sortKey:a,anchorX:s,anchorY:p}=e,c=n.renderHints?.renderPriority??0;return{renderId:Kt(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,semanticGroupIds:[...n.groups??[]],x:o,y:i,radius:l,visualRadius:os(n,l,t),sortKey:a+c*.001,anchorX:s,anchorY:p,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:ss(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function xa(e,t){return{renderId:`${Kt(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function $a(e){return{renderId:`${Kt(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Ia(e,t,r){let n=[],o=[],i=[...e].filter(l=>!l.hidden&&l.object.renderHints?.renderLabel!==!1).sort((l,a)=>l.sortKey-a.sortKey);for(let l of i){let a=l.y>t*.62?-1:1,s=ls(l,r),p=l.y+a*(l.radius+18*r),c=p+a*(16*r),u=Yn(l.x,p,c,s,a),v=0;for(;o.some(x=>rs(x,u))&&v<10;)p+=a*14*r,c+=a*14*r,u=Yn(l.x,p,c,s,a),v+=1;o.push(u),n.push({renderId:`${l.renderId}-label`,objectId:l.objectId,object:l.object,groupId:l.groupId,semanticGroupIds:[...l.semanticGroupIds],label:l.label,secondaryLabel:l.secondaryLabel,x:l.x,y:p,secondaryY:c,textAnchor:"middle",direction:a<0?"above":"below",hidden:l.hidden})}return n}function ka(e,t,r,n,o){let i=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),l=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:i},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"objects",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ja(e,t,r,n,o){let i=new Map,l=a=>{if(!a)return null;let s=i.get(a);if(s)return s;let p=o.groupRoots.get(a)??null,c={renderId:a,rootObjectId:p,label:p??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:qt(0,0,0,0)};return i.set(a,c),c};for(let a of e){let s=l(a.groupId);s&&!a.hidden&&s.objectIds.push(a.objectId)}for(let a of t){let s=l(a.groupId);s&&!a.hidden&&s.orbitIds.push(a.objectId)}for(let a of r){let s=l(a.groupId);s&&!a.hidden&&s.leaderIds.push(a.objectId)}for(let a of n){let s=l(a.groupId);s&&!a.hidden&&s.labelIds.push(a.objectId)}for(let a of i.values())a.contentBounds=es(a,e,t,r,n);return[...i.values()].sort((a,s)=>a.label.localeCompare(s.label))}function Sa(e,t){return[...e.groups].map(r=>({id:r.id,label:r.label,summary:r.summary,color:r.color,tags:[...r.tags],hidden:r.hidden,objectIds:t.filter(n=>!n.hidden&&n.semanticGroupIds.includes(r.id)).map(n=>n.objectId)})).sort((r,n)=>r.label.localeCompare(n.label))}function Oa(e,t){let r=new Map(t.map(n=>[n.objectId,n]));return e.relations.map(n=>{let o=r.get(n.from),i=r.get(n.to);return{renderId:`${Kt(n.id)}-relation`,relationId:n.id,relation:n,fromObjectId:n.from,toObjectId:n.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:n.hidden||!o||!i||o.hidden||i.hidden}}).sort((n,o)=>n.relation.id.localeCompare(o.relation.id))}function Ma(e,t,r,n,o){let i=Da(e,t,r),l=new Map;for(let[p,c]of Object.entries(e.system?.info??{})){if(!p.startsWith("viewpoint."))continue;let[u,v,...x]=p.split(".");if(u!=="viewpoint"||!v||x.length===0)continue;let k=Ba(v);if(!k)continue;let I=x.join(".").toLowerCase(),V=l.get(k)??{id:k};La(V,I,c,e,t,r,n,o),l.set(k,V)}let a=[...l.values()].map(p=>Ta(p,t,r,o)).filter(Boolean),s=a.findIndex(p=>p.id===i.id);return s>=0?a.splice(s,1,{...i,...a[s],layers:{...i.layers,...a[s].layers},filter:a[s].filter??i.filter,generated:!1}):a.unshift(i),a.sort((p,c)=>p.id==="overview"?-1:c.id==="overview"?1:p.label.localeCompare(c.label))}function Da(e,t,r){let n=e.system?.title??e.system?.properties.title;return{id:"overview",label:n?`${String(n)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function La(e,t,r,n,o,i,l,a){let s=r.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"projection":case"view":e.projection=Ea(s)??o;return;case"preset":e.preset=Pa(s)??i;return;case"rotation":case"angle":e.rotationDeg=Qn(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Ca(s);return;case"layers":e.layers=Fa(s);return;case"query":e.filter={...e.filter??Sr(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Sr(),objectTypes:Va(s)};return;case"tags":e.filter={...e.filter??Sr(),tags:Ar(s)};return;case"groups":e.filter={...e.filter??Sr(),groupIds:Ra(s,n,l,a)};return}}function Ta(e,t,r,n){let o=e.focus&&n.has(e.focus)?e.focus:null,i=e.select&&n.has(e.select)?e.select:o,l=Aa(e.filter),a=e.label?.trim()||_a(e.id);return{id:e.id,label:a,summary:e.summary?.trim()||Na(a,o,l),objectId:o,selectedObjectId:i,projection:e.projection??t,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:l,generated:!1}}function Sr(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Aa(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 Ea(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Pa(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Qn(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ca(e){let t=Qn(e);return t!==null&&t>0?t:null}function Fa(e){let t={};for(let r of Ar(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),o=r.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=n)}return t}function Va(e){return Ar(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ra(e,t,r,n){return Ar(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:r.groupIds.has(o)?r.groupIds.get(o)??Yt(o):(n.has(o),Yt(o)))}function Ar(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ba(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function _a(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Na(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function Ua(e,t,r,n,o,i){let l=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,p=Number.NEGATIVE_INFINITY,c=(u,v)=>{l=Math.min(l,u),a=Math.min(a,v),s=Math.max(s,u),p=Math.max(p,v)};for(let u of n)u.hidden||eo(u,c);for(let u of o)u.hidden||(c(u.x1,u.y1),c(u.x2,u.y2));for(let u of r)u.hidden||to(u,c);for(let u of i)u.hidden||ro(u,c);return!Number.isFinite(l)||!Number.isFinite(a)?qt(0,0,e,t):qt(l,a,s,p)}function eo(e,t){let r=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-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,o=e.ry??e.radius??0,i=oo(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,Jn*2);for(let l of i)t(l.x-r,l.y-r),t(l.x+r,l.y+r)}function qt(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function to(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 ro(e,t){let n=cs(e.label,e.secondaryLabel,1);t(e.x-n,e.y-18),t(e.x+n,e.y+8),t(e.x-n,e.secondaryY-14),t(e.x+n,e.secondaryY+8)}function an(e,t,r,n,o,i,l,a){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:r,radius:Dr(e,n,a.scaleModel),sortKey:Tr(t,r,n)}),Or(e,o,i,l,a,n+1))}function Or(e,t,r,n,o,i){let l=t.get(e.id);if(!l)return;let a=[...o.orbitChildren.get(e.id)??[]].sort(za),s=Wa(a,l.radius,o.spacingFactor,o.scaleModel),p=qa(a,s);a.forEach((u,v)=>{let x=Ha(u,v,a.length,l,s,p[v]??s.innerPx,o);r.push({object:u,parentId:e.id,kind:x.kind,cx:x.cx,cy:x.cy,radius:x.radius,rx:x.rx,ry:x.ry,rotationDeg:x.rotationDeg,band:x.band,bandThickness:x.bandThickness,frontArcPath:x.frontArcPath,backArcPath:x.backArcPath}),an(u,x.objectX,x.objectY,i,t,r,n,o)});let c=[...o.surfaceChildren.get(e.id)??[]];c.forEach((u,v)=>{let x=Gt(v,c.length,-Math.PI/3),k=28*o.spacingFactor,I=Xt(x,l.radius,o.projection,o.projection==="isometric"?.9:1),V=Xt(x,l.radius+k,o.projection,o.projection==="isometric"?.9:1),$=l.x+I.x,S=l.y+I.y,E=l.x+V.x,X=l.y+V.y;t.set(u.id,{object:u,x:E,y:X,radius:Dr(u,i+1,o.scaleModel),sortKey:Tr(E,X,i+1),anchorX:$,anchorY:S}),n.push({object:u,groupId:o.objectMap.has(u.id)?Yt(ts(u,o.objectMap)):null,x1:$,y1:S,x2:E,y2:X,mode:"surface"}),Or(u,t,r,n,o,i+1)})}function za(e,t){let r=Mr(e),n=Mr(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function Wa(e,t,r,n){let o=e.map(u=>Mr(u)),i=o.filter(u=>u!==null),l=t+56*r*n.orbitDistanceMultiplier,a=(e.length>2?54:64)*r*n.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:l,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42};let s=Math.min(...i),p=Math.max(...i),c=p-s;return{metrics:o,minMetric:s,maxMetric:p,metricSpread:c,innerPx:l,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42}}function Ha(e,t,r,n,o,i,l){let a=e.placement,s=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let C=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:C,rotationDeg:0,band:s,bandThickness:s?12*l.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-C}}let p=re(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),c=i,u=Math.max(c*Math.sqrt(1-p*p),c*.18),v=ln(a.inclination)??0,x=l.projection==="isometric"?Math.max(pa,Math.cos(Er(v)))*Zn:1,k=Math.max(u*x,c*.14),I=ln(a.angle)??0,V=c*p,$=ao(-V,0,I),S=n.x+$.x,E=n.y+$.y,X=Xa(a.phase,t,r),W=io(S,E,c,k,I,X),U=l.projection==="topdown"&&p<=1e-4&&Math.abs(I)<=1e-4,H=s?Ka(e,c,o,l.scaleModel):void 0;return{kind:U?"circle":"ellipse",cx:U?n.x:S,cy:U?n.y:E,radius:U?c:void 0,rx:U?void 0:c,ry:U?void 0:k,rotationDeg:I,band:s,bandThickness:H,frontArcPath:l.projection==="isometric"||s?qn(S,E,c,k,I,0,Math.PI):void 0,backArcPath:l.projection==="isometric"||s?qn(S,E,c,k,I,Math.PI,Math.PI*2):void 0,objectX:W.x,objectY:W.y}}function Ya(e,t){return t.innerPx+t.stepPx*Ga(Math.max(e,0)+1)}function qa(e,t){let r=[];return e.forEach((n,o)=>{let i=Mr(n),l=t.innerPx+o*t.stepPx,a=i===null?l:Ya(i,t),s=o===0?t.innerPx:(r[o-1]??t.innerPx)+t.minimumGapPx;r.push(Math.max(a,s))}),r}function Mr(e){return!e.placement||e.placement.mode!=="orbit"?null:Lr(e.placement.semiMajor??e.placement.distance??null)}function Ga(e){return Math.log(e)/Math.log(2)}function Xa(e,t,r){let n=e?ln(e):null;return n!==null?Er(n-90):Gt(t,r,-Math.PI/2)}function Ka(e,t,r,n){let o=Lr(sn(e.properties.inner)),i=Lr(sn(e.properties.outer));if(o!==null&&i!==null){let a=Math.abs(i-o);if(r.metricSpread>0)return re(a/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(o,i),1e-4);return re(a/s*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function Za(e,t,r,n,o,i,l,a,s){if(e.kind==="lagrange")return Ja(e,t,r,i,l);if(e.kind==="anchor"){let p=t.get(e.objectId);if(p){let c=Gt(n,o,Math.PI/5),u=(p.radius+36)*s.scaleModel.labelMultiplier,v=Xt(c,u,s.projection,s.projection==="isometric"?.92:1);return{x:p.x+v.x,y:p.y+v.y,anchorX:p.x,anchorY:p.y}}}if(e.kind==="named"){let p=t.get(e.name);if(p){let c=Gt(n,o,Math.PI/6),u=(p.radius+36)*s.scaleModel.labelMultiplier,v=Xt(c,u,s.projection,s.projection==="isometric"?.92:1);return{x:p.x+v.x,y:p.y+v.y,anchorX:p.x,anchorY:p.y}}}return{x:i-a-170,y:l-a-86-n*58*s.scaleModel.freePlacementMultiplier}}function Ja(e,t,r,n,o){let i=e.secondary?t.get(e.primary):ns(e.primary,t,r),l=t.get(e.secondary??e.primary);if(!i||!l)return{x:n*.7,y:o*.25};let a=l.x-i.x,s=l.y-i.y,p=Math.hypot(a,s)||1,c=a/p,u=s/p,v=-u,x=c,k=re(p*.25,24,68);switch(e.point){case"L1":return{x:l.x-c*k,y:l.y-u*k,anchorX:l.x,anchorY:l.y};case"L2":return{x:l.x+c*k,y:l.y+u*k,anchorX:l.x,anchorY:l.y};case"L3":return{x:i.x-c*k,y:i.y-u*k,anchorX:i.x,anchorY:i.y};case"L4":return{x:l.x+(c*.5-v*.8660254)*k,y:l.y+(u*.5-x*.8660254)*k,anchorX:l.x,anchorY:l.y};case"L5":return{x:l.x+(c*.5+v*.8660254)*k,y:l.y+(u*.5+x*.8660254)*k,anchorX:l.x,anchorY:l.y}}}function Qa(e,t){let r=new Map,n=new Map;for(let p of e){let c=no(p,t);if(r.set(p.id,c),c){let u=n.get(c);u?u.push(p.id):n.set(c,[p.id])}n.has(p.id)||n.set(p.id,[])}let o=new Map,i=new Map,l=new Map,a=p=>{let c=o.get(p);if(c)return c;let u=new Set,v=[],x=r.get(p)??null;for(;x&&!u.has(x);)v.push(x),u.add(x),x=r.get(x)??null;return o.set(p,v),v},s=p=>{let c=l.get(i.get(p)??"");if(c)return c;let u=r.get(p)??null,v=t.get(p),x=p;return v?.placement&&v.placement.mode!=="free"&&u&&(x=s(u)),x};for(let p of e){a(p.id);let c=s(p.id),u=Yt(c);i.set(p.id,u),l.set(u,c)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:l}}function no(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function es(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,s=Number.NEGATIVE_INFINITY,p=(c,u)=>{i=Math.min(i,c),l=Math.min(l,u),a=Math.max(a,c),s=Math.max(s,u)};for(let c of t)!c.hidden&&e.objectIds.includes(c.objectId)&&to(c,p);for(let c of r)!c.hidden&&e.orbitIds.includes(c.objectId)&&eo(c,p);for(let c of n)!c.hidden&&e.leaderIds.includes(c.objectId)&&(p(c.x1,c.y1),p(c.x2,c.y2));for(let c of o)!c.hidden&&e.labelIds.includes(c.objectId)&&ro(c,p);return!Number.isFinite(i)||!Number.isFinite(l)?qt(0,0,0,0):qt(i,l,a,s)}function ts(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let o=no(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function Yn(e,t,r,n,o){return{left:e-n,right:e+n,top:Math.min(t,r)-(o<0?18:12),bottom:Math.max(t,r)+(o<0?8:12)}}function rs(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ns(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function Dr(e,t,r){let n=as(e.properties.radius,r);if(n!==null)return n;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return re((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return re(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return re(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return re(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return re(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return re(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return re(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return re(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return re(8*o,r.minBodyRadius,r.maxBodyRadius)}}function os(e,t,r){let n=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+n,r.maxBodyRadius+10)}}function Lr(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Ht;case"m":return e.value/1e3/Ht;case"ly":return e.value*ca;case"pc":return e.value*da;case"kpc":return e.value*ua;case"re":return e.value*aa/Ht;case"rj":return e.value*sa/Ht;case"sol":return e.value*la/Ht;default:return e.value}}function is(e,t){let r=Lr(e??null);return r===null||r<=0?0:re(r*96*t.freePlacementMultiplier,0,420)}function as(e,t){let r=sn(e);if(!r)return null;let n;switch(r.unit){case"sol":n=re(r.value*22,14,40);break;case"re":n=re(r.value*10,6,18);break;case"km":n=re(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:n=re(r.value*4,4,20);break}return re(n*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function sn(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ln(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Gt(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function qn(e,t,r,n,o,i,l){let a=oo(e,t,r,n,o,i,l,Jn);return a.length===0?"":a.map((s,p)=>`${p===0?"M":"L"} ${Kn(s.x)} ${Kn(s.y)}`).join(" ")}function oo(e,t,r,n,o,i,l,a){let s=[];for(let p=0;p<=a;p+=1){let c=i+(l-i)*p/a;s.push(io(e,t,r,n,o,c))}return s}function io(e,t,r,n,o,i){let l=r*Math.cos(i),a=n*Math.sin(i),s=ao(l,a,o);return{x:e+s.x,y:t+s.y}}function ao(e,t,r){let n=Er(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function Xt(e,t,r,n){let o=r==="isometric"?Zn*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Tr(e,t,r){return t*1e3+e+r*.01}function re(e,t,r){return Math.min(Math.max(e,t),r)}function Gn(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function Kt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Yt(e){return`${Kt(e)}-group`}function ss(e){return typeof e=="string"&&e.trim()?e:void 0}function ls(e,t){let r=e.label.length*4.6*t+18,n=e.secondaryLabel.length*3.9*t+18;return Math.max(r,n,e.visualRadius+18)}function cs(e,t,r){let n=e.length*4.6*r+18,o=t.length*3.9*r+18;return Math.max(n,o,24)}function Xn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Er(e){return e*Math.PI/180}function Kn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function it(e,t={}){let r=ye(e,t),n=[],o=ps(e,n),i=fs(e,n),l=us(e,r.renderPreset??t.preset??null,r.projection),a=e.system?ds(e,l,o,i,n,r.renderPreset??t.preset??null):null;return r.viewpoints.some(s=>!s.generated)&&n.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${r.viewpoints.filter(s=>!s.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:a,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(lo),diagnostics:n}}function cn(e,t={}){return xs(it(e,t))}function Zt(e){let t=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:ys(e.system),info:ws(e.system)}:null;return{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:t,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(lo)}}function ds(e,t,r,n,o,i){let l=ye(e,{preset:i??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:r,viewpoints:l.viewpoints.map(ms),annotations:n}}function us(e,t,r){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":r,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 ps(e,t){let r={};for(let[o,i]of Object.entries(e.system?.info??{}))o.startsWith("viewpoint.")||o.startsWith("annotation.")||(r[o]=i);let n=Object.keys(r);return n.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${n.length} system info entr${n.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),r}function fs(e,t){let r=new Map;for(let[n,o]of Object.entries(e.system?.info??{})){if(!n.startsWith("annotation."))continue;let[,i,...l]=n.split(".");if(!i||l.length===0)continue;let a=so(i);if(!a)continue;let s=r.get(a)??{id:a};switch(l.join(".").toLowerCase()){case"label":s.label=o;break;case"target":case"object":s.targetObjectId=o.trim()||null;break;case"body":case"text":case"description":s.body=o;break;case"tags":s.tags=hs(o);break}r.set(a,s)}for(let n of e.objects){let o=n.info.description;if(!o)continue;let i=so(`${n.id}-notes`);r.has(i)||(r.set(i,{id:i,label:`${n.id} Notes`,targetObjectId:n.id,body:o,tags:Array.isArray(n.properties.tags)?n.properties.tags.filter(l=>typeof l=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${n.id}.info.description into structured atlas annotation "${i}".`,objectId:n.id,field:"description"}))}return[...r.values()].filter(n=>n.body||n.label).map(n=>({id:n.id,label:n.label??bs(n.id),targetObjectId:n.targetObjectId??null,body:n.body??"",tags:n.tags??[],sourceObjectId:n.targetObjectId??null})).sort((n,o)=>n.label.localeCompare(o.label))}function ms(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 lo(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,r])=>[t,{...r??{}}])):void 0,properties:gs(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function gs(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function hs(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function so(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function bs(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ys(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function ws(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg));let o=vs(r.layers);o&&(t[`${n}.layers`]=o),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??"")}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function vs(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function xs(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var co=["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 xe(e,t={}){let r=t.schema??"auto";if(r==="2.0"||r==="2.1"||r==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(r==="2.0-draft"){let s=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:cn(e);return po(s)}let a=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:it(e);return r==="2.1"&&a.version!=="2.1"?dn({...a,version:"2.1",schemaVersion:"2.1"}):dn(a)}let o=[],i=e;i.system&&o.push(...$s(i.system));let l=[...i.objects].sort(pn);for(let a of l)o.length>0&&o.push(""),o.push(...ks(a));return o.join(`
2
- `)}function dn(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...fo(e.system));for(let n of[...e.groups].sort(Pr))t.push(""),t.push(...yo(n));for(let n of[...e.relations].sort(Pr))t.push(""),t.push(...wo(n));let r=[...e.objects].sort(pn);return r.length>0&&t.at(-1)!==""&&t.push(""),r.forEach((n,o)=>{o>0&&t.push(""),t.push(...mo(n))}),t.join(`
3
- `)}function po(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},r=["schema 2.0-draft",""];t.system&&r.push(...fo(t.system));for(let o of[...t.groups].sort(Pr))r.push(""),r.push(...yo(o));for(let o of[...t.relations].sort(Pr))r.push(""),r.push(...wo(o));let n=[...t.objects].sort(pn);return n.length>0&&r.at(-1)!==""&&r.push(""),n.forEach((o,i)=>{i>0&&r.push(""),r.push(...mo(o))}),r.join(`
4
- `)}function $s(e){return Is("system",e.id,e.properties,null,e.info)}function Is(e,t,r,n,o){let i=[`${e} ${t}`],l=[...ho(n),...bo(r)];for(let s of l)i.push(` ${s}`);let a=Object.entries(o).sort(([s],[p])=>s.localeCompare(p));if(a.length>0){l.length>0&&i.push(""),i.push(" info");for(let[s,p]of a)i.push(` ${s} ${N(p)}`)}return i}function fo(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${N(e.title)}`),e.description&&t.push(` description ${N(e.description)}`),e.epoch&&t.push(` epoch ${N(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${N(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${N(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${N(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${N(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[r,n]of Object.entries(e.atlasMetadata).sort(([o],[i])=>o.localeCompare(i)))t.push(` ${r} ${N(n)}`)}for(let r of e.viewpoints)t.push(""),t.push(...Ss(r));for(let r of e.annotations)t.push(""),t.push(...Os(r));return t}function ks(e){return go(e.type,e.id,e)}function mo(e){return go(`object ${e.type}`,e.id,e)}function go(e,t,r){let n=[`${e} ${t}`],o=[...ho(r.placement),...bo(r.properties),...js(r)];for(let l of o)n.push(` ${l}`);let i=Object.entries(r.info).sort(([l],[a])=>l.localeCompare(a));if(i.length>0){o.length>0&&n.push(""),n.push(" info");for(let[l,a]of i)n.push(` ${l} ${N(a)}`)}for(let l of["climate","habitability","settlement"]){let a=Object.entries(r.typedBlocks?.[l]??{}).sort(([s],[p])=>s.localeCompare(p));if(a.length>0){n.push(""),n.push(` ${l}`);for(let[s,p]of a)n.push(` ${s} ${N(p)}`)}}return n}function ho(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...yt("distance",e.distance),...yt("semiMajor",e.semiMajor),...Ms("eccentricity",e.eccentricity),...yt("period",e.period),...yt("angle",e.angle),...yt("inclination",e.inclination),...yt("phase",e.phase)];case"at":return[`at ${Ds(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?un(e.distance):e.descriptor??""}`.trim()]}}function bo(e){return Object.keys(e).sort(Ts).map(t=>`${t} ${vo(e[t])}`)}function js(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${N(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${N(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let r of e.deriveRules??[])t.push(`derive ${r.field} ${r.strategy}`);for(let r of e.validationRules??[])t.push(`validate ${r.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let r of e.tolerances??[])t.push(`tolerance ${r.field} ${vo(r.value)}`);return t}function Ss(e){let t=[`viewpoint ${e.id}`,` label ${N(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 ${N(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 r=Ls(e.layers);return r.length>0&&t.push(` layers ${r.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${N(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(N).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Os(e){let t=[`annotation ${e.id}`,` label ${N(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${N(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(N).join(" ")}`),t}function yo(e){let t=[`group ${e.id}`,` label ${N(e.label)}`];return e.summary&&t.push(` summary ${N(e.summary)}`),e.color&&t.push(` color ${N(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(N).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function wo(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${N(e.from)}`),e.to&&t.push(` to ${N(e.to)}`),e.kind&&t.push(` kind ${N(e.kind)}`),e.label&&t.push(` label ${N(e.label)}`),e.summary&&t.push(` summary ${N(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(N).join(" ")}`),e.color&&t.push(` color ${N(e.color)}`),e.hidden&&t.push(" hidden true"),t}function vo(e){return Array.isArray(e)?e.map(t=>N(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?N(e):un(e)}function un(e){return`${e.value}${e.unit??""}`}function yt(e,t){return t?[`${e} ${un(t)}`]:[]}function Ms(e,t){return t===void 0?[]:[`${e} ${t}`]}function Ds(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 Ls(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t}function Ts(e,t){let r=co.indexOf(e),n=co.indexOf(t);return r===-1&&n===-1?e.localeCompare(t):r===-1?1:n===-1?-1:r-n}function pn(e,t){let r=uo(e.type),n=uo(t.type);return r!==n?r-n:e.id.localeCompare(t.id)}function Pr(e,t){return e.id.localeCompare(t.id)}function uo(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 N(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var xo=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,As=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Es=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Qt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Cr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function fn(e,t,r){let n=e.match(xo);if(!n)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=pe(r);if(i?.unitFamily&&!$r(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function mn(e){let t=e.match(xo);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Fr(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function at(e,t,r){let n=As.get(e.toLowerCase());if(n===void 0)throw y.fromLocation(`Invalid boolean value "${e}" for "${t}"`,r);return n}function $o(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Ps(e,t){if(!e)throw y.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw y.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Es);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw y.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function Io(e,t,r){let n=pe(e);if(!n)throw y.fromLocation(`Unknown field "${e}"`,r);if(n.arity==="single"&&t.length!==1)throw y.fromLocation(`Field "${e}" expects exactly one value`,r);switch(n.kind){case"list":return t;case"boolean":return at(Jt(t,e,r),e,r);case"number":return Fr(Jt(t,e,r),e,r);case"unit":return fn(Jt(t,e,r),r,e);case"string":{let o=t.join(" ").trim();return e==="image"&&Ps(o,r),o}}}function gn(e,t,r){let n=pe(e);if(!n)throw y.fromLocation(`Unknown field "${e}"`,r);if(!n.objectTypes.includes(t))throw y.fromLocation(`Field "${e}" is not valid on "${t}"`,r)}function Jt(e,t,r){if(e.length!==1)throw y.fromLocation(`Field "${t}" expects exactly one value`,r);return e[0]}var Cs=new Set(["star","planet","moon","asteroid","comet"]),Fs=332946.0487,Vs=1047.3486,Vr=1495978707e-1,Rs=6371,Bs=695700,_s=63241.077,Ns=206264.806,Us=206264806;function er(e,t){let r=[],n=new Map(e.objects.map(l=>[l.id,l])),o=new Set(e.groups.map(l=>l.id));e.system||r.push(ne("validate.system.required","Atlas documents must declare exactly one system."));let i=new Map;for(let[l,a]of[["group",e.groups.map(s=>s.id)],["viewpoint",e.system?.viewpoints.map(s=>s.id)??[]],["annotation",e.system?.annotations.map(s=>s.id)??[]],["relation",e.relations.map(s=>s.id)],["object",e.objects.map(s=>s.id)]])for(let s of a){let p=i.get(s);p?r.push(ne("validate.id.duplicate",`Duplicate ${l} id "${s}" already used by ${p}.`)):i.set(s,l)}for(let l of e.relations)zs(l,n,r);for(let l of e.system?.viewpoints??[])Ws(l.filter,o,t,r,l.id);for(let l of e.objects)Hs(l,e.system,n,o,r);return r}function zs(e,t,r){e.from?t.has(e.from)||r.push(ne("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):r.push(ne("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||r.push(ne("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):r.push(ne("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||r.push(ne("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Ws(e,t,r,n,o){if(!(!e||r!=="2.1"))for(let i of e.groupIds)t.has(i)||n.push(Pe("validate.viewpoint.group.unknown",`Unknown group "${i}" in viewpoint "${o}".`))}function Hs(e,t,r,n,o){let i=e.placement,l=i?.mode==="orbit"?i:null,a=i?.mode==="orbit"?r.get(i.target)??null:null;if(e.groups)for(let s of e.groups)n.has(s)||o.push(Pe("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(l&&(r.has(l.target)||o.push(ne("validate.orbit.target.unknown",`Unknown placement target "${l.target}" on "${e.id}".`,e.id,"orbit")),l.distance&&l.semiMajor&&o.push(ne("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),l.phase&&!e.epoch&&!t?.epoch&&o.push(Pe("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),l.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(Pe("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),l.period&&!jo(a?.properties.mass)&&o.push(Pe("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let s=r.get(i.target);s?Cs.has(s.type)||o.push(ne("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(ne("validate.surface.target.unknown",`Unknown placement target "${i.target}" on "${e.id}".`,e.id,"surface"))}if(i?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&o.push(ne("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Ys(e,r,o)||o.push(ne("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=r.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&o.push(Pe("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(ne("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){o.push(Pe("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let p=ko(e,a);if(p===null){o.push(Pe("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}l?.period||o.push(Ks("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Xs(p)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){o.push(Pe("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let p=So(l?.period),c=ko(e,a);if(p===null||c===null)continue;let u=Gs(e,"period");Math.abs(p-c)>u&&o.push(ne("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Ys(e,t,r){let n=e.placement?.mode==="at"?e.placement.reference:null;return n?n.kind==="named"?t.has(n.name):n.kind==="anchor"?t.has(n.objectId)?!0:(r.push(ne("validate.anchor.target.unknown",`Unknown anchor target "${n.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(n.primary)?n.secondary&&!t.has(n.secondary)?(r.push(ne("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${n.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(r.push(ne("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${n.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function ko(e,t){let r=e.placement;if(!r||r.mode!=="orbit")return null;let n=qs(r.semiMajor??r.distance),o=jo(t?.properties.mass);return n===null||o===null||o<=0?null:Math.sqrt(n**3/o)*365.25}function qs(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Vr;case"m":return e.value/(Vr*1e3);case"ly":return e.value*_s;case"pc":return e.value*Ns;case"kpc":return e.value*Us;case"re":return e.value*Rs/Vr;case"sol":return e.value*Bs/Vr;default:return null}}function jo(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Fs;case"mj":return t.value/Vs;default:return null}}function So(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Gs(e,t){let r=e.tolerances?.find(n=>n.field===t)?.value;return typeof r=="number"?r:r&&typeof r=="object"&&"value"in r?So(r)??0:0}function Xs(e){return`${Math.round(e*100)/100}d`}function ne(e,t,r,n){return{code:e,severity:"error",source:"validate",message:t,objectId:r,field:n}}function Pe(e,t,r,n){return{code:e,severity:"warning",source:"validate",message:t,objectId:r,field:n}}function Ks(e,t,r,n){return{code:e,severity:"info",source:"validate",message:t,objectId:r,field:n}}var Zs=new Set(["climate","habitability","settlement"]),Rr=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=pe(e);t&&Rr.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Rr.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Js=new Set(Rr.keys());function hn(e){return Qs(e)}function Qs(e,t){let r=Cl(e),n=r.source.split(/\r?\n/),o=[],i=!1,l="2.0",a=null,s=null,p=[],c=[],u=[],v=!1,x=!1,k=new Set,I=new Set,V=new Set,$=new Set;for(let U=0;U<n.length;U++){let H=n[U],C=U+1;if(!H.trim())continue;let ie=Ir(H),J=Nt(H.slice(ie),{line:C,columnOffset:ie});if(J.length!==0){if(!i){l=el(J,C),i=!0,r.comments.length>0&&l!=="2.1"&&o.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${l}".`,line:r.comments[0].line,column:r.comments[0].column});continue}if(ie===0){s=tl(J,C,l,o,a,p,c,u,k,I,V,$,{sawDefaults:v,sawAtlas:x}),s.kind==="system"?a=s.system:s.kind==="defaults"?v=!0:s.kind==="atlas"&&(x=!0);continue}if(!s)throw new y("Indented line without parent atlas section",C,ie+1);ll(s,ie,J,C)}}if(!i)throw new y('Missing required atlas schema header "schema 2.0"');let S=p.map(U=>kl(U,l,o)),E=t??(l==="2.0-draft"?"2.0":l),X={format:"worldorbit",sourceVersion:"1.0",system:a,groups:c,relations:u,objects:S,diagnostics:o};if(E==="2.0-draft"){let U={...X,version:"2.0-draft",schemaVersion:"2.0-draft"};return U.diagnostics.push(...er(U,l)),U}let W={...X,version:E,schemaVersion:E};return l==="2.0-draft"&&W.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),W.diagnostics.push(...er(W,l)),W}function el(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new y('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let r=e[1].value.toLowerCase();return r==="2.1"?"2.1":r==="2.0-draft"?"2.0-draft":"2.0"}function tl(e,t,r,n,o,i,l,a,s,p,c,u,v){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new y('Atlas section "system" may only appear once',t,e[0].column);return rl(e,t,r,n);case"defaults":if(!o)throw new y('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new y('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:o,seenFields:new Set};case"atlas":if(!o)throw new y('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new y('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:o,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!o)throw new y('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return nl(e,t,o,s);case"annotation":if(!o)throw new y('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return ol(e,t,o,p);case"group":return Ce(r,n,"group",{line:t,column:e[0].column}),il(e,t,l,c);case"relation":return Ce(r,n,"relation",{line:t,column:e[0].column}),al(e,t,a,u);case"object":return sl(e,t,r,n,i);default:throw new y(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function rl(e,t,r,n){if(e.length!==2)throw new y("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:r,diagnostics:n,seenFields:new Set}}function nl(e,t,r,n){if(e.length!==2)throw new y("Invalid viewpoint declaration",t,e[0]?.column??1);let o=Qt(e[1].value);if(!o)throw new y("Viewpoint id must not be empty",t,e[1].column);if(n.has(o))throw new y(`Duplicate viewpoint id "${o}"`,t,e[1].column);let i={id:o,label:Cr(o),summary:"",focusObjectId:null,selectedObjectId:null,projection:r.defaults.view,preset:r.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return r.viewpoints.push(i),n.add(o),{kind:"viewpoint",viewpoint:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function ol(e,t,r,n){if(e.length!==2)throw new y("Invalid annotation declaration",t,e[0]?.column??1);let o=Qt(e[1].value);if(!o)throw new y("Annotation id must not be empty",t,e[1].column);if(n.has(o))throw new y(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:Cr(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function il(e,t,r,n){if(e.length!==2)throw new y("Invalid group declaration",t,e[0]?.column??1);let o=Qt(e[1].value);if(!o)throw new y("Group id must not be empty",t,e[1].column);if(n.has(o))throw new y(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:Cr(o),summary:"",color:null,tags:[],hidden:!1};return r.push(i),n.add(o),{kind:"group",group:i,seenFields:new Set}}function al(e,t,r,n){if(e.length!==2)throw new y("Invalid relation declaration",t,e[0]?.column??1);let o=Qt(e[1].value);if(!o)throw new y("Relation id must not be empty",t,e[1].column);if(n.has(o))throw new y(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return r.push(i),n.add(o),{kind:"relation",relation:i,seenFields:new Set}}function sl(e,t,r,n,o){if(e.length<3)throw new y("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],l=e[2],a=i.value;if(!xr.has(a)||a==="system")throw new y(`Unknown object type "${i.value}"`,t,i.column);let s={objectType:a,id:l.value,fields:$l(e.slice(3),t,a,r,n),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:r,diagnostics:n,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ll(e,t,r,n){switch(e.kind){case"system":cl(e,r,n);return;case"defaults":dl(e,r,n);return;case"atlas":ul(e,t,r,n);return;case"viewpoint":pl(e,t,r,n);return;case"annotation":ml(e,r,n);return;case"group":gl(e,r,n);return;case"relation":hl(e,r,n);return;case"object":bl(e,t,r,n);return}}function cl(e,t,r){let n=lt(t,e.seenFields,r),o=oe(t,r);switch(n){case"title":e.system.title=o;return;case"description":Ce(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.description=o;return;case"epoch":Ce(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":Ce(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:r,column:t[0].column}),e.system.referencePlane=o;return;default:throw new y(`Unknown system atlas field "${t[0].value}"`,r,t[0].column)}}function dl(e,t,r){let n=lt(t,e.seenFields,r),o=oe(t,r);switch(n){case"view":e.system.defaults.view=Mo(o,r,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=Do(o,r,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new y(`Unknown defaults field "${t[0].value}"`,r,t[0].column)}}function ul(e,t,r,n){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=To(r,n,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new y(`Duplicate atlas metadata key "${o.key}"`,n,r[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(r.length===1&&r[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new y(`Unknown atlas field "${r[0].value}"`,n,r[0].column)}function pl(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){fl(e,r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new y('Duplicate viewpoint field "filter"',n,r[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=lt(r,e.seenFields,n),i=oe(r,n);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=Mo(i,n,r[0].column);return;case"preset":e.viewpoint.preset=Do(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=vl(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Lo(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=wl(r.slice(1),n);return;default:throw new y(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function fl(e,t,r){let n=lt(t,e.seenFilterFields,r),o=e.viewpoint.filter??xl();switch(n){case"query":o.query=oe(t,r);break;case"objecttypes":o.objectTypes=yl(t.slice(1),r);break;case"tags":o.tags=st(t.slice(1),r,"tags");break;case"groups":o.groupIds=st(t.slice(1),r,"groups");break;default:throw new y(`Unknown viewpoint filter field "${t[0].value}"`,r,t[0].column)}e.viewpoint.filter=o}function ml(e,t,r){switch(lt(t,e.seenFields,r)){case"label":e.annotation.label=oe(t,r);return;case"target":e.annotation.targetObjectId=oe(t,r);return;case"body":e.annotation.body=oe(t,r);return;case"tags":e.annotation.tags=st(t.slice(1),r,"tags");return;default:throw new y(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function gl(e,t,r){switch(lt(t,e.seenFields,r)){case"label":e.group.label=oe(t,r);return;case"summary":e.group.summary=oe(t,r);return;case"color":e.group.color=oe(t,r);return;case"tags":e.group.tags=st(t.slice(1),r,"tags");return;case"hidden":e.group.hidden=at(oe(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new y(`Unknown group field "${t[0].value}"`,r,t[0].column)}}function hl(e,t,r){switch(lt(t,e.seenFields,r)){case"from":e.relation.from=oe(t,r);return;case"to":e.relation.to=oe(t,r);return;case"kind":e.relation.kind=oe(t,r);return;case"label":e.relation.label=oe(t,r);return;case"summary":e.relation.summary=oe(t,r);return;case"tags":e.relation.tags=st(t.slice(1),r,"tags");return;case"color":e.relation.color=oe(t,r);return;case"hidden":e.relation.hidden=at(oe(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new y(`Unknown relation field "${t[0].value}"`,r,t[0].column)}}function bl(e,t,r,n){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),r.length===1){let o=r[0].value.toLowerCase();if(o==="info"||Zs.has(o)){o!=="info"&&Ce(e.sourceSchemaVersion,e.diagnostics,o,{line:n,column:r[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=To(r,n,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new y(`Duplicate info key "${o.key}"`,n,r[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,l=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(l.has(o.key))throw new y(`Duplicate ${i} key "${o.key}"`,n,r[0].column);l.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(Il(r,n,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function lt(e,t,r){if(e.length<2)throw new y("Invalid atlas field line",r,e[0]?.column??1);let n=e[0].value.toLowerCase();if(t.has(n))throw new y(`Duplicate atlas field "${e[0].value}"`,r,e[0].column);return t.add(n),n}function oe(e,t){if(e.length<2)throw new y("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(r=>r.value).join(" ").trim()}function yl(e,t){return st(e,t,"objectTypes").filter(r=>r==="star"||r==="planet"||r==="moon"||r==="belt"||r==="asteroid"||r==="comet"||r==="ring"||r==="structure"||r==="phenomenon")}function wl(e,t){let r={};for(let n of st(e,t,"layers")){let o=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){r["orbits-back"]=o,r["orbits-front"]=o;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="objects"||i==="labels"||i==="metadata")&&(r[i]=o)}return r}function st(e,t,r){if(e.length===0)throw new y(`Missing value for atlas field "${r}"`,t,1);let n=e.map(o=>o.value).filter(Boolean);if(n.length===0)throw new y(`Missing value for atlas field "${r}"`,t,e[0]?.column??1);return n}function Mo(e,t,r){let n=e.toLowerCase();if(n!=="topdown"&&n!=="isometric")throw new y(`Unknown projection "${e}"`,t,r);return n}function Do(e,t,r){let n=e.toLowerCase();if(n==="diagram"||n==="presentation"||n==="atlas-card"||n==="markdown")return n;throw new y(`Unknown render preset "${e}"`,t,r)}function vl(e,t,r,n){let o=Lo(e,t,r,n);if(o<=0)throw new y(`Field "${n}" must be greater than zero`,t,r);return o}function Lo(e,t,r,n){let o=Number(e);if(!Number.isFinite(o))throw new y(`Invalid numeric value "${e}" for "${n}"`,t,r);return o}function xl(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function $l(e,t,r,n,o){let i=[],l=0;for(;l<e.length;){let a=e[l],s=tr(a.value);if(!s)throw new y(`Unknown field "${a.value}"`,t,a.column);s.version==="2.1"&&Ce(n,o,a.value,{line:t,column:a.column}),l++;let p=[];if(s.inlineMode==="single"){let c=e[l];c&&(p.push(c),l++)}else if(s.inlineMode==="pair")for(let c=0;c<2;c++){let u=e[l];if(!u)break;p.push(u),l++}else for(;l<e.length&&!Js.has(e[l].value);)p.push(e[l]),l++;if(p.length===0)throw new y(`Missing value for field "${a.value}"`,t,a.column);i.push({type:"field",key:a.value,values:p.map(c=>c.value),location:{line:t,column:a.column}})}return Eo(i,r),i}function Il(e,t,r,n,o){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);let i=tr(e[0].value);if(!i)throw new y(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&Ce(n,o,e[0].value,{line:t,column:e[0].column});let l={type:"field",key:e[0].value,values:e.slice(1).map(a=>a.value),location:{line:t,column:e[0].column}};return Eo([l],r),l}function To(e,t,r){if(e.length<2)throw new y(r,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 kl(e,t,r){let n=jl(e.fields),o=Sl(e.objectType,n),i=Ol(e.objectType,n),l=El(n.get("groups")?.[0]),a=Oo(n.get("epoch")?.[0]),s=Oo(n.get("referencePlane")?.[0]),p=n.has("tidalLock")?at($e(n.get("tidalLock")[0]),"tidalLock",n.get("tidalLock")[0].location):void 0,c=n.has("resonance")?Ll(n.get("resonance")[0]):void 0,u=Dl(n),v=n.get("derive")?.map(E=>Tl(E)),x=n.get("validate")?.map(E=>({rule:$e(E)})),k=n.has("locked")?[...new Set(n.get("locked").flatMap(E=>E.values))]:void 0,I=n.get("tolerance")?.map(E=>Al(E)),V=Ml(e.typedBlockEntries),$=Ao(e.infoEntries,"info"),S={type:e.objectType,id:e.id,properties:i,placement:o,info:$};return l.length>0&&(S.groups=l),a&&(S.epoch=a),s&&(S.referencePlane=s),p!==void 0&&(S.tidalLock=p),c&&(S.resonance=c),u&&(S.renderHints=u),v?.length&&(S.deriveRules=v),x?.length&&(S.validationRules=x),k?.length&&(S.lockedFields=k),I?.length&&(S.tolerances=I),V&&Object.keys(V).length>0&&(S.typedBlocks=V),t!=="2.1"&&(S.groups||S.epoch||S.referencePlane||S.tidalLock!==void 0||S.resonance||S.renderHints||S.deriveRules?.length||S.validationRules?.length||S.lockedFields?.length||S.tolerances?.length||S.typedBlocks)&&Ce(t,r,e.id,e.location),S}function jl(e){let t=new Map;for(let r of e){let n=tr(r.key);if(!n)throw y.fromLocation(`Unknown field "${r.key}"`,r.location);if(!n.allowRepeat&&t.has(r.key))throw y.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=t.get(r.key)??[];o.push(r),t.set(r.key,o)}return t}function Sl(e,t){let r=t.get("orbit")?.[0],n=t.get("at")?.[0],o=t.get("surface")?.[0],i=t.get("free")?.[0];if([r,n,o,i].filter(Boolean).length>1){let a=r??n??o??i;throw y.fromLocation("Object has multiple placement modes",a?.location)}if(r)return{mode:"orbit",target:$e(r),distance:wt(t.get("distance")?.[0],"distance"),semiMajor:wt(t.get("semiMajor")?.[0],"semiMajor"),eccentricity:Pl(t.get("eccentricity")?.[0],"eccentricity"),period:wt(t.get("period")?.[0],"period"),angle:wt(t.get("angle")?.[0],"angle"),inclination:wt(t.get("inclination")?.[0],"inclination"),phase:wt(t.get("phase")?.[0],"phase")};if(n){let a=$e(n);return{mode:"at",target:a,reference:$o(a,n.location)}}if(o)return{mode:"surface",target:$e(o)};if(i){let a=$e(i),s=mn(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function Ol(e,t){let r={};for(let[n,o]of t.entries()){let i=o[0],l=tr(n);!i||!l?.legacySchema||l.legacySchema.placement||(gn(n,e,i.location),r[n]=Io(n,i.values,i.location))}return r}function Ao(e,t){let r={};for(let n of e){if(n.key in r)throw y.fromLocation(`Duplicate ${t} key "${n.key}"`,n.location);r[n.key]=n.value}return r}function Ml(e){let t={};for(let r of Object.keys(e)){let n=e[r];n?.length&&(t[r]=Ao(n,r))}return t}function Dl(e){let t={},r=e.get("renderLabel")?.[0],n=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return r&&(t.renderLabel=at($e(r),"renderLabel",r.location)),n&&(t.renderOrbit=at($e(n),"renderOrbit",n.location)),o&&(t.renderPriority=Fr($e(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function Ll(e){if(e.values.length!==2)throw y.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw y.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Tl(e){if(e.values.length!==2)throw y.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Al(e){if(e.values.length!==2)throw y.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],r=mn(t),n=Number(t);return{field:e.values[0],value:r??(Number.isFinite(n)?n:t)}}function El(e){return e?[...new Set(e.values)]:[]}function Oo(e){return e&&e.values.join(" ").trim()||null}function wt(e,t){return e?fn($e(e),e.location,t):void 0}function Pl(e,t){return e?Fr($e(e),t,e.location):void 0}function $e(e){return Jt(e.values,e.key,e.location)}function tr(e){return Rr.get(e)}function Eo(e,t){for(let r of e){let n=tr(r.key);if(!n)throw y.fromLocation(`Unknown field "${r.key}"`,r.location);if(n.legacySchema){gn(r.key,t,r.location);continue}if((r.key==="renderLabel"||r.key==="renderOrbit"||r.key==="tidalLock")&&r.values.length!==1)throw y.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function Ce(e,t,r,n){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function Cl(e){let t=[...e],r=[],n=!1,o=!1,i=null,l=1,a=1;for(let s=0;s<t.length;s++){let p=t[s],c=t[s+1];if(o){if(p==="*"&&c==="/"){t[s]=" ",t[s+1]=" ",o=!1,i=null,s++,a+=2;continue}p!==`
5
- `&&p!=="\r"&&(t[s]=" "),p===`
6
- `?(l++,a=1):a++;continue}if(!n&&p==="/"&&c==="*"){r.push({kind:"block",line:l,column:a}),t[s]=" ",t[s+1]=" ",o=!0,i={line:l,column:a},s++,a+=2;continue}if(!n&&p==="#"&&!Fl(t,s)){r.push({kind:"line",line:l,column:a}),t[s]=" ";let u=s+1;for(;u<t.length&&t[u]!==`
7
- `&&t[u]!=="\r";)t[u]=" ",u++;a+=u-s,s=u-1;continue}p==='"'&&t[s-1]!=="\\"&&(n=!n),p===`
8
- `?(l++,a=1):a++}if(o)throw y.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:r}}function Fl(e,t){let r=t+1,n=0;for(;r<e.length&&/[0-9a-f]/i.test(e[r]??"");)r++,n++;if(![3,4,6,8].includes(n))return!1;let o=e[r];return o===void 0||o===" "||o===" "||o==="\r"||o===`
9
- `}function Br(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],objects:[],diagnostics:[]}}function z(e){return structuredClone(e)}function bn(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?Vo(e,t.id):null;case"object":return t.id?Fo(e,t.id):null;case"viewpoint":return t.id?Bo(e.system,t.id):null;case"annotation":return t.id?_o(e.system,t.id):null;case"relation":return t.id?Ro(e,t.id):null}}function yn(e,t){let r=z(e),n=Co(r);switch(t.kind){case"metadata":return t.key&&delete n.atlasMetadata[t.key],r;case"object":return t.id&&(r.objects=r.objects.filter(o=>o.id!==t.id)),r;case"group":return t.id&&(r.groups=r.groups.filter(o=>o.id!==t.id)),r;case"viewpoint":return t.id&&(n.viewpoints=n.viewpoints.filter(o=>o.id!==t.id)),r;case"annotation":return t.id&&(n.annotations=n.annotations.filter(o=>o.id!==t.id)),r;case"relation":return t.id&&(r.relations=r.relations.filter(o=>o.id!==t.id)),r;default:return r}}function rr(e,t){return t.map(r=>({diagnostic:r,path:Po(e,r)}))}function Po(e,t){if(t.objectId&&Fo(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let r=t.field.split(".");if(r[1]&&Vo(e,r[1]))return{kind:"group",id:r[1]}}if(t.field?.startsWith("viewpoint.")){let r=t.field.split(".");if(r[1]&&Bo(e.system,r[1]))return{kind:"viewpoint",id:r[1]}}if(t.field?.startsWith("annotation.")){let r=t.field.split(".");if(r[1]&&_o(e.system,r[1]))return{kind:"annotation",id:r[1]}}if(t.field?.startsWith("relation.")){let r=t.field.split(".");if(r[1]&&Ro(e,r[1]))return{kind:"relation",id:r[1]}}return t.field&&t.field in Co(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function wn(e){let t=[...e.diagnostics,...er(e,e.version)];return rr(e,t)}function Co(e){return e.system||(e.system=Br().system),e.system}function Fo(e,t){return e.objects.find(r=>r.id===t)??null}function Vo(e,t){return e.groups.find(r=>r.id===t)??null}function Ro(e,t){return e.relations.find(r=>r.id===t)??null}function Bo(e,t){return e?.viewpoints.find(r=>r.id===t)??null}function _o(e,t){return e?.annotations.find(r=>r.id===t)??null}var Vl=/^schema\s+2(?:\.0|\.1)?$/i,Rl=/^schema\s+2\.1$/i,Bl=/^schema\s+2\.0-draft$/i;function No(e){for(let t of _l(e).split(/\r?\n/)){let r=t.trim();if(r)return Bl.test(r)?"2.0-draft":Rl.test(r)?"2.1":Vl.test(r)?"2.0":"1.0"}return"1.0"}function _l(e){let t=[...e],r=!1,n=!1;for(let o=0;o<t.length;o++){let i=t[o],l=t[o+1];if(n){if(i==="*"&&l==="/"){t[o]=" ",t[o+1]=" ",n=!1,o++;continue}i!==`
10
- `&&i!=="\r"&&(t[o]=" ");continue}if(!r&&i==="/"&&l==="*"){t[o]=" ",t[o+1]=" ",n=!0,o++;continue}if(!r&&i==="#"){t[o]=" ";let a=o+1;for(;a<t.length&&t[a]!==`
11
- `&&t[a]!=="\r";)t[a]=" ",a++;o=a-1;continue}i==='"'&&t[o-1]!=="\\"&&(r=!r)}return t.join("")}function We(e){let t=nr(e);if(!t.ok||!t.value){let r=t.diagnostics[0];throw new y(r?.message??"Failed to load WorldOrbit source",r?.line,r?.column)}return t.value}function nr(e){let t=No(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Nl(e,t);let r;try{r=Ut(e)}catch(o){return{ok:!1,value:null,diagnostics:[ot(o,"parse")]}}let n;try{n=zt(r)}catch(o){return{ok:!1,value:null,diagnostics:[ot(o,"normalize")]}}try{Wt(n)}catch(o){return{ok:!1,value:null,diagnostics:[ot(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Nl(e,t){let r;try{r=hn(e)}catch(l){return{ok:!1,value:null,diagnostics:[ot(l,"parse","load.atlas.failed")]}}let n=[...r.diagnostics];if(n.some(l=>l.severity==="error"))return{ok:!1,value:null,diagnostics:n};let o;try{o=Zt(r)}catch(l){return{ok:!1,value:null,diagnostics:[ot(l,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:r,draftDocument:r,diagnostics:n},diagnostics:n}}var zl={background:!0,guides:!0,relations:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},_r={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function vn(e){return e?typeof e=="string"?_r[e]??_r.atlas:{..._r.atlas,...e}:_r.atlas}function xn(e){return{...zl,...e}}function De(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:$n(e.objectTypes??[]),tags:$n((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:$n((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Wl(t)?t:null}function Wl(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Nr(e,t){let r=De(t),n=new Set;for(let o of e.objects)if(!o.hidden&&Hl(o,r)&&(n.add(o.objectId),r?.includeAncestors!==!1))for(let i of o.ancestorIds)n.add(i);return r?n:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function In(e,t,r=12){let n=t.trim().toLowerCase();return n?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Yl(o,n)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,r).map(o=>Uo(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,r).map(o=>Uo(o,1))}function zo(e,t,r,n){return{version:"2.0",viewpointId:n,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0},filter:De(r)}}function kn(e){return encodeURIComponent(JSON.stringify(e))}function jn(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",viewpointId:t.viewpointId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0},filter:De(t.filter??null)}}function Wo(e,t,r){let n=e.trim()||"bookmark";return{id:n.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||n,atlasState:{...r,viewerState:{...r.viewerState},renderOptions:{...r.renderOptions,layers:r.renderOptions.layers?{...r.renderOptions.layers}:void 0,scaleModel:r.renderOptions.scaleModel?{...r.renderOptions.scaleModel}:void 0},filter:r.filter?{...r.filter}:null}}}function Sn(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function On(e){return e?.filter?De({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function Uo(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[]}}function Hl(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let r=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),n=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!r&&!n)return!1}if(t.tags?.length){let r=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[];if(!t.tags.every(n=>r.includes(n)))return!1}if(t.query?.trim()){let r=Ho(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function Yl(e,t){let r=e.objectId.toLowerCase(),n=e.label.toLowerCase(),o=Ho(e.object,e.label).toLowerCase(),i=0;return r===t||n===t?i+=120:r.startsWith(t)||n.startsWith(t)?i+=96:(r.includes(t)||n.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(s=>o.includes(s))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(s=>typeof s=="string"):[]).some(s=>s.toLowerCase()===t)&&(i+=18),i}function Ho(e,t){let r=Object.values(e.info),n=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...n,...r].join(" ")}function $n(e){return[...new Set(e)]}var ct={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Yo(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function Ur(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function vt(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function Mn(e,t){return{...e,rotationDeg:Yo(e.rotationDeg+t)}}function or(e,t,r,n,o){if(!Number.isFinite(r)||r<=0)return t;let i=$t(e),l=Ur(t.scale*r,o);if(l===t.scale)return t;let a=l/t.scale,s=n.x-i.x,p=n.y-i.y;return{...t,scale:l,translateX:(1-a)*s+a*t.translateX,translateY:(1-a)*p+a*t.translateY}}function xt(e,t,r){let n=$t(e),o=ql(e.contentBounds,n,t.rotationDeg),i=Math.max(e.width-r.fitPadding*2,1),l=Math.max(e.height-r.fitPadding*2,1),a=Math.max(o.width,1),s=Math.max(o.height,1),p=Ur(Math.min(i/a,l/s),r),c=ue({x:e.contentBounds.centerX,y:e.contentBounds.centerY},n,t.rotationDeg);return{...t,scale:p,translateX:n.x-(n.x+(c.x-n.x)*p),translateY:n.y-(n.y+(c.y-n.y)*p)}}function Dn(e,t,r,n){let o=e.objects.find(s=>s.objectId===r&&!s.hidden);if(!o)return t;let i=$t(e),l=Ur(Math.max(t.scale,1.8),n),a=ue({x:o.x,y:o.y},i,t.rotationDeg);return{...t,scale:l,translateX:i.x-(i.x+(a.x-i.x)*l),translateY:i.y-(i.y+(a.y-i.y)*l),selectedObjectId:r}}function Ln(e,t){let r=$t(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function dt(e,t,r){let n=$t(e),o={x:r.x-t.translateX,y:r.y-t.translateY},i={x:o.x-n.x,y:o.y-n.y},l={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},a=ue({x:l.x,y:l.y},{x:0,y:0},-t.rotationDeg);return{x:n.x+a.x,y:n.y+a.y}}function ir(e,t){let r=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(a=>dt(e,t,a)),n=Math.min(...r.map(a=>a.x)),o=Math.min(...r.map(a=>a.y)),i=Math.max(...r.map(a=>a.x)),l=Math.max(...r.map(a=>a.y));return{minX:n,minY:o,maxX:i,maxY:l,width:i-n,height:l-o,centerX:n+(i-n)/2,centerY:o+(l-o)/2}}function $t(e){return{x:e.width/2,y:e.height/2}}function ql(e,t,r){let n=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(s=>ue(s,t,r)),o=Math.min(...n.map(s=>s.x)),i=Math.min(...n.map(s=>s.y)),l=Math.max(...n.map(s=>s.x)),a=Math.max(...n.map(s=>s.y));return{minX:o,minY:i,maxX:l,maxY:a,width:l-o,height:a-i,centerX:o+(l-o)/2,centerY:i+(a-i)/2}}var Tn="worldorbit-camera-root";function Fe(e,t={}){let r=vn(t.theme),n=lc(t.preset??e.renderPreset??void 0),o=xn({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,l=Nr(e,t.filter??null),a=e.objects.filter($=>!$.hidden).filter($=>l.has($.objectId)).filter($=>o.structures||!zr($.object)).sort(($,S)=>$.sortKey-S.sortKey),s=e.labels.filter($=>!$.hidden).filter($=>l.has($.objectId)).filter($=>o.structures||!zr($.object)),p=Xl(a),c=o.orbits?Gl(e,l,o.structures):{back:"",front:""},u=o.guides?e.leaders.filter($=>!$.hidden).filter($=>l.has($.objectId)).filter($=>o.structures||!zr($.object)).map($=>`<line class="wo-leader wo-leader-${$.mode}" x1="${$.x1}" y1="${$.y1}" x2="${$.x2}" y2="${$.y2}" data-render-id="${ce($.renderId)}" data-group-id="${Ie($.groupId??"")}" />`).join(""):"",v=o.relations?e.relations.filter($=>!$.hidden).filter($=>l.has($.fromObjectId)&&l.has($.toObjectId)).map($=>`<line class="wo-relation" x1="${$.x1}" y1="${$.y1}" x2="${$.x2}" y2="${$.y2}" data-render-id="${ce($.renderId)}" data-relation-id="${Ie($.relationId)}" />`).join(""):"",x=o.objects?a.map($=>Kl($,t.selectedObjectId??null,r)).join(""):"",k=o.labels?s.map($=>Zl(e,$,t.selectedObjectId??null)).join(""):"",I=o.metadata?`<text class="wo-title" x="56" y="64">${ce(e.title)}</text>
12
- <text class="wo-subtitle" x="56" y="88">${ce(i)}</text>
13
- <text class="wo-meta" x="56" y="${e.height-42}">${ce(dc(e))}</text>`:"",V=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
1
+ "use strict";var WorldOrbitEditor=(()=>{var br=Object.defineProperty;var fa=Object.getOwnPropertyDescriptor;var ma=Object.getOwnPropertyNames;var ha=Object.prototype.hasOwnProperty;var ga=(e,t)=>{for(var n in t)br(e,n,{get:t[n],enumerable:!0})},ba=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ma(t))!ha.call(e,i)&&i!==n&&br(e,i,{get:()=>t[i],enumerable:!(r=fa(t,i))||r.enumerable});return e};var ya=e=>ba(br({},"__esModule",{value:!0}),e);var Bu={};ga(Bu,{createWorldOrbitEditor:()=>Jo});var b=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 Zt=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Oe=Zt.filter(e=>e!=="system"),wa=["star","planet","moon","asteroid","comet","structure","phenomenon"],ci=["structure","phenomenon"],it=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],va=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function _(e,t){return{key:e,...t}}var Vn=new Set(Zt),li=new Map([_("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:it}),_("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"distance"}),_("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"distance"}),_("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:it}),_("period",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"duration"}),_("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("at",{kind:"string",placement:!0,arity:"single",objectTypes:ci}),_("surface",{kind:"string",placement:!0,arity:"single",objectTypes:ci}),_("free",{kind:"string",placement:!0,arity:"single",objectTypes:va}),_("kind",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("class",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("culture",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Zt}),_("color",{kind:"string",placement:!1,arity:"single",objectTypes:Zt}),_("image",{kind:"string",placement:!1,arity:"single",objectTypes:wa}),_("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Zt}),_("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"radius"}),_("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"mass"}),_("density",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:Oe}),_("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),_("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),_("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),_("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("on",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("source",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"duration"})].map(e=>[e.key,e])),$a=new Set(li.keys());function Ie(e){return li.get(e)}function di(e){return $a.has(e)}function ui(e,t){return e.objectTypes.includes(t)}function Rn(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 Jt(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,s=!1,c=!1,a=null,l=()=>{o!==null&&(n.push({value:i,column:o,quoted:s}),i="",o=null,s=!1)};for(let d=0;d<e.length;d++){let f=e[d],w=r+d+1;if(c&&f==="\\"){let I=e[d+1];if(I==='"'||I==="\\"){i+=I,d++;continue}}if(f==='"'){c?c=!1:(o===null&&(o=w),s=!0,a=w,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}o===null&&(o=w),i+=f}if(c)throw new b("Unclosed quote in line",t.line,a??r+e.length);return l(),n}function zn(e){return e.match(/^\s*/)?.[0].length??0}function Qt(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let s=0;s<t.length;s++){let c=t[s],a=s+1;if(!c.trim())continue;let l=zn(c),d=Jt(c.slice(l),{line:a,columnOffset:l});if(d.length!==0){if(l===0){i=!1,o=null;let f=xa(d,a);n.push(f),r=f;continue}if(!r)throw new b("Indented line without parent object",a,l+1);if(d.length===1&&d[0].value==="info"){i=!0,o=l;continue}i&&l<=(o??0)&&(i=!1),i?r.infoEntries.push(ka(d,a)):r.blockFields.push(ja(d,a))}}return{type:"document",objects:n}}function xa(e,t){if(e.length<2)throw new b("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Vn.has(n.value))throw new b(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Ia(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Ia(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=Ie(i.value);if(!o)throw new b(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(o.arity==="multiple")for(;r<e.length&&!di(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new b(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(c=>c.value),location:{line:t,column:i.column}})}return n}function ja(e,t){if(e.length<2)throw new b("Invalid field line",t,e[0]?.column??1);if(!Ie(e[0].value))throw new b(`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 ka(e,t){if(e.length<2)throw new b("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 pi=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Sa=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Oa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function en(e){let t=null,n=[];for(let r of e.objects){let i=Ea(r);if(r.objectType==="system"){if(t)throw b.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Ea(e){let t=[...e.inlineFields,...e.blockFields];Ma(e.objectType,t);let n=Da(t),r=Pa(e.objectType,n),i=Aa(n),o=Ca(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Ma(e,t){for(let n of t){let r=Ie(n.key);if(!r)throw b.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ui(r,e))throw b.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw b.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Da(e){let t=new Map;for(let n of e){if(t.has(n.key))throw b.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Pa(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),s=[n,r,i,o].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw b.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw b.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:_n(t,"orbit"),distance:Mt(t,"distance"),semiMajor:Mt(t,"semiMajor"),eccentricity:Ra(t,"eccentricity"),period:Mt(t,"period"),angle:Mt(t,"angle"),inclination:Mt(t,"inclination"),phase:Mt(t,"phase")};if(r){let c=Bn(t,"at"),a=_n(t,"at");return{mode:"at",target:a,reference:Fa(a,c.location)}}if(i)return{mode:"surface",target:_n(t,"surface")};if(o){let c=_n(t,"free"),a=Va(c);return{mode:"free",distance:a??void 0,descriptor:a?void 0:c}}return null}function Aa(e){let t={};for(let[n,r]of e.entries()){let i=Ie(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=za(r);break;case"number":t[n]=mi(Dt(r),n,r.location);break;case"unit":t[n]=fi(Dt(r),r.location,n);break;case"string":t[n]=La(n,r);break}}return t}function La(e,t){let n=t.values.join(" ").trim();return e==="image"&&Ta(n,t.location),n}function Ta(e,t){if(!e)throw b.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw b.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Oa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw b.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Ca(e){let t={};for(let n of e){if(n.key in t)throw b.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Fa(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.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 b.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 fi(e,t,n){let r=e.match(pi);if(!r)throw b.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=Ie(n);if(o?.unitFamily&&!Rn(o.unitFamily,i.unit))throw b.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Va(e){let t=e.match(pi);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Mt(e,t){if(!e.has(t))return;let n=Bn(e,t);return fi(Dt(n),n.location,t)}function Ra(e,t){if(!e.has(t))return;let n=Bn(e,t);return mi(Dt(n),t,n.location)}function mi(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw b.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function za(e){let t=Dt(e).toLowerCase(),n=Sa.get(t);if(n===void 0)throw b.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Bn(e,t){let n=e.get(t);if(!n)throw new b(`Missing value for key "${t}"`);return n}function _n(e,t){return Dt(Bn(e,t))}function Dt(e){if(e.values.length!==1)throw b.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var _a=new Set(["star","planet","moon","asteroid","comet"]);function tn(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new b(`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 b(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!_a.has(i.type))throw new b(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Ba(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Na(r,r.placement.reference,t))}}function Ba(e,t,n){if(!n.has(t.primary))throw new b(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new b(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Na(e,t,n){if(!n.has(t.objectId))throw new b(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function $t(e,t,n=`${t}.failed`){return e instanceof b?{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)}}var nn=1495978707e-1,Ua=6371,Wa=71492,Ya=695700,Ha=63241.077,qa=206264.806,Ga=206264806,$i=.68,Xa=.2,xi=28;function Ee(e,t={}){let n=Ja(t),r=n.width,i=n.height,o=n.padding,s=Za(e),c=es(e,t.projection),a=Ir(t.camera??null),l=xr(c,a),d=rs(s,t.scaleModel),f=os(s),w=e.system?.id??null,I=t.activeEventId??null,S=Ka(e.objects,e.events??[],I),k=new Map(S.map(O=>[O.id,O])),C=Ns(S,k),Y=new Map,v=[],P=[],ne=[],X=[],Q=[],re=new Map,U=new Map;for(let O of S){let fe=O.placement;if(!fe){ne.push(O);continue}if(fe.mode==="orbit"){yi(U,fe.target,O);continue}if(fe.mode==="surface"){yi(re,fe.target,O);continue}if(fe.mode==="at"){Q.push(O);continue}X.push(O)}let be=X.length>0?r*.42:r/2,ee=i/2,te={orbitChildren:U,surfaceChildren:re,objectMap:k,spacingFactor:f,projection:l,scaleModel:d},q=ne.find(O=>O.type==="star")??ne[0]??null;q&&wr(q,be,ee,0,Y,v,P,te);let we=ne.filter(O=>O.id!==q?.id);if(we.length>0){let O=Math.min(r,i)*.28*f*d.orbitDistanceMultiplier;we.forEach((fe,W)=>{let ie=cn(W,we.length,-Math.PI/2),$e=ln(ie,O,l,1);wr(fe,be+$e.x,ee+$e.y,0,Y,v,P,te)})}X.forEach((O,fe)=>{let W=r-o-140-Gs(O.placement?.mode==="free"?O.placement.distance:void 0,d),ie=Math.max(76,(i-o*2-180)/Math.max(1,X.length)*f)*d.freePlacementMultiplier,$e=o+92+fe*ie;Y.set(O.id,{object:O,x:W,y:$e,radius:Hn(O,0,d),sortKey:Gn(W,$e,0)}),P.push({object:O,groupId:C.groupIds.get(O.id)??null,x1:W-60,y1:$e,x2:W-18,y2:$e,mode:"free"}),Wn(O,Y,v,P,te,1)}),Q.forEach((O,fe)=>{if(Y.has(O.id)||!O.placement||O.placement.mode!=="at")return;let W=_s(O.placement.reference,Y,k,fe,Q.length,r,i,o,te);Y.set(O.id,{object:O,x:W.x,y:W.y,radius:Hn(O,2,d),sortKey:Gn(W.x,W.y,2),anchorX:W.anchorX,anchorY:W.anchorY}),W.anchorX!==void 0&&W.anchorY!==void 0&&P.push({object:O,groupId:C.groupIds.get(O.id)??null,x1:W.anchorX,y1:W.anchorY,x2:W.x,y2:W.y,mode:"at"}),Wn(O,Y,v,P,te,2)});let le=[...Y.values()].map(O=>as(O,d,C)),De=v.map(O=>ss(O,C.groupIds.get(O.object.id)??null)),We=P.map(O=>cs(O)),D=ls(le,r,i,d.labelMultiplier),oe=bs(e,le),Ze=ys(e.events??[],le,I),bt=ms(De,oe,Ze,We,le,D),T=hs(le,De,We,D,C,d.labelMultiplier),R=gs(e,le),ye=ws(e,c,n.preset,C,k),de=Ps(r,i,le,De,We,D,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:c,renderProjection:l,camera:a,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ns(c,l,s,a),systemId:w,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...a?.azimuth!==null?{"camera.azimuth":String(a?.azimuth)}:{},...a?.elevation!==null?{"camera.elevation":String(a?.elevation)}:{},...a?.roll!==null?{"camera.roll":String(a?.roll)}:{},...a?.distance!==null?{"camera.distance":String(a?.distance)}:{}},contentBounds:de,layers:bt,groups:T,semanticGroups:R,viewpoints:ye,events:Ze,activeEventId:I,objects:le,orbitVisuals:De,relations:oe,leaders:We,labels:D}}function ve(e,t,n){let r=Xn(n),i=Math.cos(r),o=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*i-c*o,y:t.y+s*o+c*i}}function Ka(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let o=new Map(r.map(c=>[c.id,c])),s=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of s){let a=o.get(c);a&&(i.epoch&&(a.epoch=i.epoch),i.referencePlane&&(a.referencePlane=i.referencePlane))}for(let c of i.positions){let a=o.get(c.objectId);a&&(c.placement&&(a.placement=structuredClone(c.placement)),c.inner&&(a.properties.inner={...c.inner}),c.outer&&(a.properties.outer={...c.outer}),c.epoch&&(a.epoch=c.epoch),c.referencePlane&&(a.referencePlane=c.referencePlane))}return r}function Za(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 Ja(e){let t=Qa(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Qa(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 es(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return ki(n)??"topdown"}function xr(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function Ir(e){if(!e)return null;let t={azimuth:yr(e.azimuth),elevation:yr(e.elevation),roll:yr(e.roll),distance:ts(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function yr(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ts(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ns(e,t,n,r){let i=[`${wi(e)} view`,`${wi(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function rs(e,t){return{...is(e),...t}}function is(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 os(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function as(e,t,n){let{object:r,x:i,y:o,radius:s,sortKey:c,anchorX:a,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:Pt(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:s,visualRadius:qs(r,s,t),sortKey:c+d*.001,anchorX:a,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ks(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ss(e,t){return{renderId:`${Pt(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function cs(e){return{renderId:`${Pt(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function ls(e,t,n,r){let i=[],o=[],s=new Map(e.map(a=>[a.objectId,a])),c=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort(ds);for(let a of c){let l=us(a,s,o,t,n,r)??ji(a,Ii(a,s.get(a.parentId??"")??null,n),0,r);o.push(Di(a,l,r)),i.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,semanticGroupIds:[...a.semanticGroupIds],label:a.label,secondaryLabel:a.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:a.hidden})}return i}function ds(e,t){let n=hi(e)-hi(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function hi(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function us(e,t,n,r,i,o){for(let s of ps(e,t,r,i)){let c=s==="left"||s==="right"?4:6;for(let a=0;a<=c;a+=1){let l=ji(e,s,a,o),d=Di(e,l,o);if(!n.some(f=>Ys(f,d)))return l}}return null}function ps(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=Ii(e,i,r),s=o==="below"?"above":"below",c=fs(e,i,n),a=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,o,a,s]:[o,c,s,a]}function Ii(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function fs(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function ji(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),s=e.y-4*r;return{x:o,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,s=e.y-4*r;return{x:o,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function ms(e,t,n,r,i,o){let s=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),c=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"events",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"objects",renderIds:i.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function hs(e,t,n,r,i,o){let s=new Map,c=a=>{if(!a)return null;let l=s.get(a);if(l)return l;let d=i.groupRoots.get(a)??null,f={renderId:a,rootObjectId:d,label:d??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:sn(0,0,0,0)};return s.set(a,f),f};for(let a of e){let l=c(a.groupId);l&&!a.hidden&&l.objectIds.push(a.objectId)}for(let a of t){let l=c(a.groupId);l&&!a.hidden&&l.orbitIds.push(a.objectId)}for(let a of n){let l=c(a.groupId);l&&!a.hidden&&l.leaderIds.push(a.objectId)}for(let a of r){let l=c(a.groupId);l&&!a.hidden&&l.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=Us(a,e,t,n,r,o);return[...s.values()].sort((a,l)=>a.label.localeCompare(l.label))}function gs(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function bs(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${Pt(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ys(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],s=o.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,d)=>l+d.x,0)/s.length:0,a=s.length>0?s.reduce((l,d)=>l+d.y,0)/s.length:0;return{renderId:`${Pt(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:a,hidden:i.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function ws(e,t,n,r,i){let o=vs(e,t,n),s=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,w,...I]=l.split(".");if(f!=="viewpoint"||!w||I.length===0)continue;let S=Es(w);if(!S)continue;let k=I.join(".").toLowerCase(),C=s.get(S)??{id:S};$s(C,k,d,e,t,n,r,i),s.set(S,C)}let c=[...s.values()].map(l=>xs(l,t,n,i)).filter(Boolean),a=c.findIndex(l=>l.id===o.id);return a>=0?c.splice(a,1,{...o,...c[a],layers:{...o.layers,...c[a].layers},filter:c[a].filter??o.filter,generated:!1}):c.unshift(o),c.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function vs(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=Ir(null),s=xr(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:s,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function $s(e,t,n,r,i,o,s,c){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"events":e.eventIds=an(a);return;case"projection":case"view":e.projection=ki(a)??i;return;case"preset":e.preset=js(a)??o;return;case"rotation":case"angle":e.rotationDeg=rn(a)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Un(),azimuth:rn(a)};return;case"camera.elevation":e.camera={...e.camera??Un(),elevation:rn(a)};return;case"camera.roll":e.camera={...e.camera??Un(),roll:rn(a)};return;case"camera.distance":e.camera={...e.camera??Un(),distance:gi(a)};return;case"zoom":case"scale":e.scale=gi(a);return;case"layers":e.layers=ks(a);return;case"query":e.filter={...e.filter??Nn(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??Nn(),objectTypes:Ss(a)};return;case"tags":e.filter={...e.filter??Nn(),tags:an(a)};return;case"groups":e.filter={...e.filter??Nn(),groupIds:Os(a,r,s,c)};return}}function xs(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,s=Is(e.filter),c=e.label?.trim()||Ms(e.id),a=e.projection??t,l=Ir(e.camera??null),d=xr(a,l);return{id:e.id,label:c,summary:e.summary?.trim()||Ds(c,i,s),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:a,renderProjection:d,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Nn(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Un(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Is(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 ki(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function js(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function rn(e){let t=Number(e);return Number.isFinite(t)?t:null}function gi(e){let t=rn(e);return t!==null&&t>0?t:null}function ks(e){let t={};for(let n of an(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Ss(e){return an(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Os(e,t,n,r){return an(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??on(i):(r.has(i),on(i)))}function an(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Es(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ms(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ds(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 Ps(e,t,n,r,i,o,s){let c=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(w,I)=>{c=Math.min(c,w),a=Math.min(a,I),l=Math.max(l,w),d=Math.max(d,I)};for(let w of r)w.hidden||Si(w,f);for(let w of i)w.hidden||(f(w.x1,w.y1),f(w.x2,w.y2));for(let w of n)w.hidden||Oi(w,f);for(let w of o)w.hidden||Ei(w,f,s);return!Number.isFinite(c)||!Number.isFinite(a)?sn(0,0,e,t):sn(c,a,l,d)}function Si(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,o=Ai(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,xi*2);for(let s of o)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function sn(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 Oi(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 Ei(e,t,n){let r=Pi(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function wr(e,t,n,r,i,o,s,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Hn(e,r,c.scaleModel),sortKey:Gn(t,n,r)}),Wn(e,i,o,s,c,r+1))}function Wn(e,t,n,r,i,o){let s=t.get(e.id);if(!s)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(As),a=Ls(c,s.radius,i.spacingFactor,i.scaleModel),l=Fs(c,a);c.forEach((f,w)=>{let I=Ts(f,w,c.length,s,a,l[w]??a.innerPx,i);n.push({object:f,parentId:e.id,kind:I.kind,cx:I.cx,cy:I.cy,radius:I.radius,rx:I.rx,ry:I.ry,rotationDeg:I.rotationDeg,band:I.band,bandThickness:I.bandThickness,frontArcPath:I.frontArcPath,backArcPath:I.backArcPath}),wr(f,I.objectX,I.objectY,o,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,w)=>{let I=cn(w,d.length,-Math.PI/3),S=28*i.spacingFactor,k=ln(I,s.radius,i.projection,i.projection==="isometric"?.9:1),C=ln(I,s.radius+S,i.projection,i.projection==="isometric"?.9:1),Y=s.x+k.x,v=s.y+k.y,P=s.x+C.x,ne=s.y+C.y;t.set(f.id,{object:f,x:P,y:ne,radius:Hn(f,o+1,i.scaleModel),sortKey:Gn(P,ne,o+1),anchorX:Y,anchorY:v}),r.push({object:f,groupId:i.objectMap.has(f.id)?on(Ws(f,i.objectMap)):null,x1:Y,y1:v,x2:P,y2:ne,mode:"surface"}),Wn(f,t,n,r,i,o+1)})}function As(e,t){let n=Yn(e),r=Yn(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 Ls(e,t,n,r){let i=e.map(f=>Yn(f)),o=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let a=Math.min(...o),l=Math.max(...o),d=l-a;return{metrics:i,minMetric:a,maxMetric:l,metricSpread:d,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function Ts(e,t,n,r,i,o,s){let c=e.placement,a=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let U=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:U,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-U}}let l=ce(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),d=o,f=Math.max(d*Math.sqrt(1-l*l),d*.18),w=$r(c.inclination)??0,I=s.projection==="isometric"?Math.max(Xa,Math.cos(Xn(w)))*$i:1,S=Math.max(f*I,d*.14),k=$r(c.angle)??0,C=d*l,Y=Ti(-C,0,k),v=r.x+Y.x,P=r.y+Y.y,ne=Rs(c.phase,t,n),X=Li(v,P,d,S,k,ne),Q=s.projection==="topdown"&&l<=1e-4&&Math.abs(k)<=1e-4,re=a?zs(e,d,i,s.scaleModel):void 0;return{kind:Q?"circle":"ellipse",cx:Q?r.x:v,cy:Q?r.y:P,radius:Q?d:void 0,rx:Q?void 0:d,ry:Q?void 0:S,rotationDeg:k,band:a,bandThickness:re,frontArcPath:s.projection==="isometric"||a?bi(v,P,d,S,k,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?bi(v,P,d,S,k,Math.PI,Math.PI*2):void 0,objectX:X.x,objectY:X.y}}function Cs(e,t){return t.innerPx+t.stepPx*Vs(Math.max(e,0)+1)}function Fs(e,t){let n=[];return e.forEach((r,i)=>{let o=Yn(r),s=t.innerPx+i*t.stepPx,c=o===null?s:Cs(o,t),a=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,a))}),n}function Yn(e){return!e.placement||e.placement.mode!=="orbit"?null:qn(e.placement.semiMajor??e.placement.distance??null)}function Vs(e){return Math.log(e)/Math.log(2)}function Rs(e,t,n){let r=e?$r(e):null;return r!==null?Xn(r-90):cn(t,n,-Math.PI/2)}function zs(e,t,n,r){let i=qn(vr(e.properties.inner)),o=qn(vr(e.properties.outer));if(i!==null&&o!==null){let c=Math.abs(o-i);if(n.metricSpread>0)return ce(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let a=Math.max(Math.max(i,o),1e-4);return ce(c/a*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function _s(e,t,n,r,i,o,s,c,a){if(e.kind==="lagrange")return Bs(e,t,n,o,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=cn(r,i,Math.PI/5),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=ln(d,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=cn(r,i,Math.PI/6),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=ln(d,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}return{x:o-c-170,y:s-c-86-r*58*a.scaleModel.freePlacementMultiplier}}function Bs(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Hs(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!o||!s)return{x:r*.7,y:i*.25};let c=s.x-o.x,a=s.y-o.y,l=Math.hypot(c,a)||1,d=c/l,f=a/l,w=-f,I=d,S=ce(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-d*S,y:s.y-f*S,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+d*S,y:s.y+f*S,anchorX:s.x,anchorY:s.y};case"L3":return{x:o.x-d*S,y:o.y-f*S,anchorX:o.x,anchorY:o.y};case"L4":return{x:s.x+(d*.5-w*.8660254)*S,y:s.y+(f*.5-I*.8660254)*S,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(d*.5+w*.8660254)*S,y:s.y+(f*.5+I*.8660254)*S,anchorX:s.x,anchorY:s.y}}}function Ns(e,t){let n=new Map,r=new Map;for(let l of e){let d=Mi(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,o=new Map,s=new Map,c=l=>{let d=i.get(l);if(d)return d;let f=new Set,w=[],I=n.get(l)??null;for(;I&&!f.has(I);)w.push(I),f.add(I),I=n.get(I)??null;return i.set(l,w),w},a=l=>{let d=s.get(o.get(l)??"");if(d)return d;let f=n.get(l)??null,w=t.get(l),I=l;return w?.placement&&w.placement.mode!=="free"&&f&&(I=a(f)),I};for(let l of e){c(l.id);let d=a(l.id),f=on(d);o.set(l.id,f),s.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:s}}function Mi(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 Us(e,t,n,r,i,o){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,w)=>{s=Math.min(s,f),c=Math.min(c,w),a=Math.max(a,f),l=Math.max(l,w)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Oi(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Si(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&Ei(f,d,o);return!Number.isFinite(s)||!Number.isFinite(c)?sn(0,0,0,0):sn(s,c,a,l)}function Ws(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=Mi(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function Di(e,t,n){return Pi(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Pi(e,t,n,r,i,o,s,c){let a=Zs(o,s,c),l=a*2,d=i==="above"?18:12,f=i==="above"?8:12,w=e-a,I=e+a;return r==="start"?(w=e,I=e+l):r==="end"&&(w=e-l,I=e),{left:w,right:I,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function Ys(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Hs(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Hn(e,t,n){let r=Xs(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return ce((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return ce(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return ce(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return ce(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return ce(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return ce(8*i,n.minBodyRadius,n.maxBodyRadius)}}function qs(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 qn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/nn;case"m":return e.value/1e3/nn;case"ly":return e.value*Ha;case"pc":return e.value*qa;case"kpc":return e.value*Ga;case"re":return e.value*Ua/nn;case"rj":return e.value*Wa/nn;case"sol":return e.value*Ya/nn;default:return e.value}}function Gs(e,t){let n=qn(e??null);return n===null||n<=0?0:ce(n*96*t.freePlacementMultiplier,0,420)}function Xs(e,t){let n=vr(e);if(!n)return null;let r;switch(n.unit){case"sol":r=ce(n.value*22,14,40);break;case"re":r=ce(n.value*10,6,18);break;case"km":r=ce(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=ce(n.value*4,4,20);break}return ce(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function vr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function $r(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function cn(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function bi(e,t,n,r,i,o,s){let c=Ai(e,t,n,r,i,o,s,xi);return c.length===0?"":c.map((a,l)=>`${l===0?"M":"L"} ${vi(a.x)} ${vi(a.y)}`).join(" ")}function Ai(e,t,n,r,i,o,s,c){let a=[];for(let l=0;l<=c;l+=1){let d=o+(s-o)*l/c;a.push(Li(e,t,n,r,i,d))}return a}function Li(e,t,n,r,i,o){let s=n*Math.cos(o),c=r*Math.sin(o),a=Ti(s,c,i);return{x:e+a.x,y:t+a.y}}function Ti(e,t,n){let r=Xn(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ln(e,t,n,r){let i=n==="isometric"?$i*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Gn(e,t,n){return t*1e3+e+n*.01}function ce(e,t,n){return Math.min(Math.max(e,t),n)}function yi(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function Pt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function on(e){return`${Pt(e)}-group`}function Ks(e){return typeof e=="string"&&e.trim()?e:void 0}function Zs(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 wi(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Xn(e){return e*Math.PI/180}function vi(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function xt(e,t={}){let n=Ee(e,t),r=[],i=ec(e,r),o=tc(e,r),s=Qs(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Js(e,s,i,o,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(a=>!a.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(a=>!a.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Fi),diagnostics:r}}function jr(e,t={}){return pc(xt(e,t))}function dn(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:lc(e.system),info:dc(e.system)}:null,r=e.objects.map(Fi);return oc(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(rc),objects:r}}function Js(e,t,n,r,i,o){let s=Ee(e,{preset:o??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(nc),annotations:r}}function Qs(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r: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 ec(e,t){let n={};for(let[i,o]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=o);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 tc(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,o,...s]=r.split(".");if(!o||s.length===0)continue;let c=Ci(o);if(!c)continue;let a=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":a.label=i;break;case"target":case"object":a.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":a.body=i;break;case"tags":a.tags=sc(i);break}n.set(c,a)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let o=Ci(`${r.id}-notes`);n.has(o)||(n.set(o,{id:o,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${o}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??cc(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 nc(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Fi(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:ac(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function rc(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ic)}}function ic(e){return{objectId:e.objectId,placement:Vi(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Vi(e){return e?structuredClone(e):null}function oc(e,t,n){if(!n)return;let r=t.find(s=>s.id===n);if(!r)return;let i=new Map(e.map(s=>[s.id,s])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(s=>s.objectId)]);for(let s of o){let c=i.get(s);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let s of r.positions){let c=i.get(s.objectId);c&&(s.placement&&(c.placement=Vi(s.placement)),s.inner&&(c.properties.inner={...s.inner}),s.outer&&(c.properties.outer={...s.outer}),s.epoch&&(c.epoch=s.epoch),s.referencePlane&&(c.referencePlane=s.referencePlane))}}function ac(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 sc(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ci(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function cc(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function lc(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function dc(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)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=uc(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(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.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 uc(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function pc(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Ri=["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 Kn(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.0-draft"){if(n==="2.0-draft"){let a=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:jr(e);return _i(a)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:xt(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&c.version!==n?kr({...c,version:n,schemaVersion:n}):kr(c)}let i=[],o=e;o.system&&i.push(...fc(o.system));let s=[...o.objects].sort(Er);for(let c of s)i.length>0&&i.push(""),i.push(...hc(c));return i.join(`
2
+ `)}function kr(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Bi(e.system));for(let r of[...e.groups].sort(At))t.push(""),t.push(...Yi(r));for(let r of[...e.relations].sort(At))t.push(""),t.push(...Hi(r));for(let r of[...e.events].sort(At))t.push(""),t.push(...qi(r));let n=[...e.objects].sort(Er);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Ni(r))}),t.join(`
3
+ `)}function _i(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Bi(t.system));for(let i of[...t.groups].sort(At))n.push(""),n.push(...Yi(i));for(let i of[...t.relations].sort(At))n.push(""),n.push(...Hi(i));for(let i of[...t.events].sort(At))n.push(""),n.push(...qi(i));let r=[...t.objects].sort(Er);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,o)=>{o>0&&n.push(""),n.push(...Ni(i))}),n.join(`
4
+ `)}function fc(e){return mc("system",e.id,e.properties,null,e.info)}function mc(e,t,n,r,i){let o=[`${e} ${t}`],s=[...Sr(r),...Wi(n)];for(let a of s)o.push(` ${a}`);let c=Object.entries(i).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){s.length>0&&o.push(""),o.push(" info");for(let[a,l]of c)o.push(` ${a} ${A(l)}`)}return o}function Bi(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${A(e.title)}`),e.description&&t.push(` description ${A(e.description)}`),e.epoch&&t.push(` epoch ${A(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${A(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${A(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${A(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${A(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],[o])=>i.localeCompare(o)))t.push(` ${n} ${A(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...bc(n));for(let n of e.annotations)t.push(""),t.push(...yc(n));return t}function hc(e){return Ui(e.type,e.id,e)}function Ni(e){return Ui(`object ${e.type}`,e.id,e)}function Ui(e,t,n){let r=[`${e} ${t}`],i=[...Sr(n.placement),...Wi(n.properties),...gc(n)];for(let s of i)r.push(` ${s}`);let o=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(o.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,c]of o)r.push(` ${s} ${A(c)}`)}for(let s of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[s]??{}).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${s}`);for(let[a,l]of c)r.push(` ${a} ${A(l)}`)}}return r}function Sr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...ot("distance",e.distance),...ot("semiMajor",e.semiMajor),...$c("eccentricity",e.eccentricity),...ot("period",e.period),...ot("angle",e.angle),...ot("inclination",e.inclination),...ot("phase",e.phase)];case"at":return[`at ${xc(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Or(e.distance):e.descriptor??""}`.trim()]}}function Wi(e){return Object.keys(e).sort(jc).map(t=>`${t} ${Gi(e[t])}`)}function gc(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${A(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${A(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Gi(n.value)}`);return t}function bc(e){let t=[`viewpoint ${e.id}`,` label ${A(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 ${A(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}`),e.camera&&vc(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=Ic(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${A(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(A).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function yc(e){let t=[`annotation ${e.id}`,` label ${A(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${A(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),t}function Yi(e){let t=[`group ${e.id}`,` label ${A(e.label)}`];return e.summary&&t.push(` summary ${A(e.summary)}`),e.color&&t.push(` color ${A(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Hi(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${A(e.from)}`),e.to&&t.push(` to ${A(e.to)}`),e.kind&&t.push(` kind ${A(e.kind)}`),e.label&&t.push(` label ${A(e.label)}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.color&&t.push(` color ${A(e.color)}`),e.hidden&&t.push(" hidden true"),t}function qi(e){let t=[`event ${e.id}`,` kind ${A(e.kind)}`];if(e.label&&t.push(` label ${A(e.label)}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${A(e.timing)}`),e.visibility&&t.push(` visibility ${A(e.visibility)}`),e.epoch&&t.push(` epoch ${A(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${A(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.color&&t.push(` color ${A(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(kc)){t.push(` pose ${n.objectId}`);for(let r of wc(n))t.push(` ${r}`)}}return t}function wc(e){return[...Sr(e.placement),...e.epoch?[`epoch ${A(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${A(e.referencePlane)}`]:[],...ot("inner",e.inner),...ot("outer",e.outer)]}function vc(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Gi(e){return Array.isArray(e)?e.map(t=>A(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?A(e):Or(e)}function Or(e){return`${e.value}${e.unit??""}`}function ot(e,t){return t?[`${e} ${Or(t)}`]:[]}function $c(e,t){return t===void 0?[]:[`${e} ${t}`]}function xc(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 Ic(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function jc(e,t){let n=Ri.indexOf(e),r=Ri.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Er(e,t){let n=zi(e.type),r=zi(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function At(e,t){return e.id.localeCompare(t.id)}function kc(e,t){return e.objectId.localeCompare(t.objectId)}function zi(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 A(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Xi=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Sc=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Oc=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Lt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function pn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Mr(e,t,n){let r=e.match(Xi);if(!r)throw b.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=Ie(n);if(o?.unitFamily&&!Rn(o.unitFamily,i.unit))throw b.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dr(e){let t=e.match(Xi);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Zn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw b.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function at(e,t,n){let r=Sc.get(e.toLowerCase());if(r===void 0)throw b.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Ki(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.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 b.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 Ec(e,t){if(!e)throw b.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw b.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Oc);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw b.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Zi(e,t,n){let r=Ie(e);if(!r)throw b.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw b.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return at(un(t,e,n),e,n);case"number":return Zn(un(t,e,n),e,n);case"unit":return Mr(un(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Ec(i,n),i}}}function Pr(e,t,n){let r=Ie(e);if(!r)throw b.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw b.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function un(e,t,n){if(e.length!==1)throw b.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Qi=new Set(["star","planet","moon","asteroid","comet"]),Mc=332946.0487,Dc=1047.3486,Jn=1495978707e-1,Pc=6371,Ac=695700,Lc=63241.077,Tc=206264.806,Cc=206264806;function fn(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),o=new Set(e.events.map(c=>c.id));e.system||n.push(V("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,a]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of a){let d=s.get(l);d?n.push(V("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${d}.`)):s.set(l,c)}for(let c of e.relations)Fc(c,r,n);for(let c of e.system?.viewpoints??[])Vc(c,i,o,t,n,r);for(let c of e.objects)Rc(c,e.system,r,i,n);for(let c of e.events)zc(c,e.system,r,n);return n}function Fc(e,t,n){e.from?t.has(e.from)||n.push(V("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(V("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(V("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(V("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(V("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Vc(e,t,n,r,i,o){let s=e.filter;if(r==="2.1"||r==="2.5"){if(s)for(let c of s.groupIds)t.has(c)||i.push(G("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(G("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Uc(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Wc(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,s,o)}function Rc(e,t,n,r,i){let o=e.placement,s=o?.mode==="orbit"?o:null,c=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let a of e.groups)r.has(a)||i.push(G("validate.group.unknown",`Unknown group "${a}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(G("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(G("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),s&&(n.has(s.target)||i.push(V("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(V("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(G("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(G("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!Lr(c?.properties.mass)&&i.push(G("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let a=n.get(o.target);a?Qi.has(a.type)||i.push(V("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(V("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(V("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Bc(e,n,i)||i.push(V("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let a=n.get(e.resonance.targetObjectId);a?(e.placement?.mode!=="orbit"||a.placement?.mode!=="orbit"||e.placement.target!==a.placement.target)&&i.push(G("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(V("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let a of e.deriveRules??[]){if(a.field!=="period"||a.strategy!=="kepler"){i.push(G("validate.derive.unsupported",`Unsupported derive rule "${a.field} ${a.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ji(e,c);if(l===null){i.push(G("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Ar("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Gc(l)}.`,e.id,"derive"))}for(let a of e.validationRules??[]){if(a.rule!=="kepler"){i.push(G("validate.rule.unsupported",`Unsupported validation rule "${a.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=eo(s?.period),d=Ji(e,c);if(l===null||d===null)continue;let f=qc(e,"period");Math.abs(l-d)>f&&i.push(V("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function zc(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(V("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(G("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(G("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(V("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(V("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let s=new Set;for(let l of e.participantObjectIds){if(o.add(l),s.has(l)){r.push(G("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}s.add(l),n.has(l)||r.push(V("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(G("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(G("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(G("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let d=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(V("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,d));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(V("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,d));continue}o.has(l.objectId)||r.push(G("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),_c(l,f,e,t,n,r,d,e.id)}let a=[...o].filter(l=>!c.has(l));e.positions.length>0&&a.length>0&&r.push(G("validate.event.positions.partial",`Event "${e.id}" leaves ${a.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function _c(e,t,n,r,i,o,s,c){let a=e.placement;if(!a){o.push(V("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(a.mode==="orbit"){i.has(a.target)||o.push(V("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.orbit`)),a.distance&&a.semiMajor&&o.push(V("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),a.phase&&!Yc(r,t,n,e)&&o.push(G("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),a.inclination&&!Hc(r,t,n,e)&&o.push(G("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),a.period&&!Lr(i.get(a.target)?.properties.mass)&&o.push(G("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(a.mode==="surface"){let l=i.get(a.target);l?Qi.has(l.type)||o.push(V("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):o.push(V("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(V("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${s}.at`));let l=a.reference;l.kind==="named"&&!i.has(l.name)?o.push(V("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?o.push(V("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&o.push(V("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):o.push(V("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)))}}function Bc(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(V("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(V("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(V("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ji(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Nc(n.semiMajor??n.distance),i=Lr(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Nc(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Jn;case"m":return e.value/(Jn*1e3);case"ly":return e.value*Lc;case"pc":return e.value*Tc;case"kpc":return e.value*Cc;case"re":return e.value*Pc/Jn;case"sol":return e.value*Ac/Jn;default:return null}}function Lr(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Mc;case"mj":return t.value/Dc;default:return null}}function eo(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Uc(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(V("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Wc(e,t,n,r,i,o,s,c,a){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,w]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])w!==null&&(!Number.isFinite(w)||f==="distance"&&w<=0)&&r.push(V("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(w)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(G("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(G("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push(Ar("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(G("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),o!==null&&a.has(o)||s!==null&&a.has(s)||c||r.push(Ar("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function Yc(e,t,n,r){return st(r?.epoch)??st(n?.epoch)??st(t.epoch)??st(e?.epoch)??null}function Hc(e,t,n,r){return st(r?.referencePlane)??st(n?.referencePlane)??st(t.referencePlane)??st(e?.referencePlane)??null}function st(e){return typeof e=="string"&&e.trim()?e.trim():null}function qc(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?eo(n)??0:0}function Gc(e){return`${Math.round(e*100)/100}d`}function V(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function G(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ar(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Xc=new Set(["climate","habitability","settlement"]),er=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=Ie(e);t&&er.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])er.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Kc=new Set(er.keys()),no=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function Tr(e){return Zc(e)}function Zc(e,t){let n=Vl(e),r=n.source.split(/\r?\n/),i=[],o=!1,s="2.0",c=null,a=null,l=[],d=[],f=[],w=[],I=new Map,S=!1,k=!1,C=new Set,Y=new Set,v=new Set,P=new Set,ne=new Set;for(let ee=0;ee<r.length;ee++){let te=r[ee],q=ee+1;if(!te.trim())continue;let we=zn(te),le=Jt(te.slice(we),{line:q,columnOffset:we});if(le.length!==0){if(!o){s=Jc(le,q),o=!0,n.comments.length>0&&tr(s,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(we===0){a=Qc(le,q,s,i,c,l,d,f,w,I,C,Y,v,P,ne,{sawDefaults:S,sawAtlas:k}),a.kind==="system"?c=a.system:a.kind==="defaults"?S=!0:a.kind==="atlas"&&(k=!0);continue}if(!a)throw new b("Indented line without parent atlas section",q,we+1);sl(a,we,le,q)}}if(!o)throw new b('Missing required atlas schema header "schema 2.0"');let X=l.map(ee=>Sl(ee,s,i)),Q=w.map(ee=>Ol(ee,I.get(ee.id)??[])),re=t??(s==="2.0-draft"?"2.0":s),U={format:"worldorbit",sourceVersion:"1.0",system:c,groups:d,relations:f,events:Q,objects:X,diagnostics:i};if(re==="2.0-draft"){let ee={...U,version:"2.0-draft",schemaVersion:"2.0-draft"};return ee.diagnostics.push(...fn(ee,s)),ee}let be={...U,version:re,schemaVersion:re};return s==="2.0-draft"&&be.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),be.diagnostics.push(...fn(be,s)),be}function Jc(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new b('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Qc(e,t,n,r,i,o,s,c,a,l,d,f,w,I,S,k){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new b('Atlas section "system" may only appear once',t,e[0].column);return el(e,t,n,r);case"defaults":if(!i)throw new b('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(k.sawDefaults)throw new b('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new b('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(k.sawAtlas)throw new b('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new b('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return tl(e,t,i,d,n,r);case"annotation":if(!i)throw new b('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return nl(e,t,i,f);case"group":return Me(n,r,"group",{line:t,column:e[0].column}),rl(e,t,s,w);case"relation":return Me(n,r,"relation",{line:t,column:e[0].column}),il(e,t,c,I);case"event":return Me(n,r,"event",{line:t,column:e[0].column}),ol(e,t,a,l,S,n,r);case"object":return al(e,t,n,r,o);default:throw new b(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function el(e,t,n,r){if(e.length!==2)throw new b("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function tl(e,t,n,r,i,o){if(e.length!==2)throw new b("Invalid viewpoint declaration",t,e[0]?.column??1);let s=Lt(e[1].value);if(!s)throw new b("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new b(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:pn(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function nl(e,t,n,r){if(e.length!==2)throw new b("Invalid annotation declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:pn(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function rl(e,t,n,r){if(e.length!==2)throw new b("Invalid group declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Group id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:pn(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function il(e,t,n,r){if(e.length!==2)throw new b("Invalid relation declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function ol(e,t,n,r,i,o,s){if(e.length!==2)throw new b("Invalid event declaration",t,e[0]?.column??1);let c=Lt(e[1].value);if(!c)throw new b("Event id must not be empty",t,e[1].column);if(i.has(c))throw new b(`Duplicate event id "${c}"`,t,e[1].column);let a={id:c,kind:"",label:pn(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(a),r.set(c,l),i.add(c),{kind:"event",event:a,sourceSchemaVersion:o,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function al(e,t,n,r,i){if(e.length<3)throw new b("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],s=e[2],c=o.value;if(!Vn.has(c)||c==="system")throw new b(`Unknown object type "${o.value}"`,t,o.column);let a={objectType:c,id:s.value,fields:jl(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(a),{kind:"object",objectNode:a,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function sl(e,t,n,r){switch(e.kind){case"system":cl(e,n,r);return;case"defaults":ll(e,n,r);return;case"atlas":dl(e,t,n,r);return;case"viewpoint":ul(e,t,n,r);return;case"annotation":ml(e,n,r);return;case"group":hl(e,n,r);return;case"relation":gl(e,n,r);return;case"event":bl(e,t,n,r);return;case"object":wl(e,t,n,r);return}}function cl(e,t,n){let r=He(t,e.seenFields,n),i=H(t,n);switch(r){case"title":e.system.title=i;return;case"description":Me(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":Me(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":Me(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new b(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ll(e,t,n){let r=He(t,e.seenFields,n),i=H(t,n);switch(r){case"view":io(i)&&It(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=ro(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=oo(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new b(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function dl(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=ao(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new b(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new b(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ul(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){pl(e,n,r);return}if(e.inFilter){fl(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(It(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new b('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Fr();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new b('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=He(n,e.seenFields,r),o=H(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":io(o)&&It(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=ro(o,r,n[0].column);return;case"preset":e.viewpoint.preset=oo(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Cr(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=lt(o,r,n[0].column,"rotation");return;case"camera":It(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Il(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=$l(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":Me(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=Re(n.slice(1),r,"events");return;default:throw new b(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function pl(e,t,n){let r=He(t,e.seenCameraFields,n),i=H(t,n),o=e.viewpoint.camera??Fr();switch(r){case"azimuth":o.azimuth=lt(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=lt(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=lt(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=Cr(i,n,t[0].column,"camera.distance");break;default:throw new b(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function fl(e,t,n){let r=He(t,e.seenFilterFields,n),i=e.viewpoint.filter??xl();switch(r){case"query":i.query=H(t,n);break;case"objecttypes":i.objectTypes=vl(t.slice(1),n);break;case"tags":i.tags=Re(t.slice(1),n,"tags");break;case"groups":i.groupIds=Re(t.slice(1),n,"groups");break;default:throw new b(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ml(e,t,n){switch(He(t,e.seenFields,n)){case"label":e.annotation.label=H(t,n);return;case"target":e.annotation.targetObjectId=H(t,n);return;case"body":e.annotation.body=H(t,n);return;case"tags":e.annotation.tags=Re(t.slice(1),n,"tags");return;default:throw new b(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function hl(e,t,n){switch(He(t,e.seenFields,n)){case"label":e.group.label=H(t,n);return;case"summary":e.group.summary=H(t,n);return;case"color":e.group.color=H(t,n);return;case"tags":e.group.tags=Re(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=at(H(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new b(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function gl(e,t,n){switch(He(t,e.seenFields,n)){case"from":e.relation.from=H(t,n);return;case"to":e.relation.to=H(t,n);return;case"kind":e.relation.kind=H(t,n);return;case"label":e.relation.label=H(t,n);return;case"summary":e.relation.summary=H(t,n);return;case"tags":e.relation.tags=Re(t.slice(1),n,"tags");return;case"color":e.relation.color=H(t,n);return;case"hidden":e.relation.hidden=at(H(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new b(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function bl(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&It(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(yl(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new b(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new b("Event pose object id must not be empty",r,n[1].column);let s={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(s),e.activePose=s,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new b('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(He(n,e.seenFields,r)){case"kind":e.event.kind=H(n,r);return;case"label":e.event.label=H(n,r);return;case"summary":e.event.summary=H(n,r);return;case"target":e.event.targetObjectId=H(n,r);return;case"participants":e.event.participantObjectIds=Re(n.slice(1),r,"participants");return;case"timing":e.event.timing=H(n,r);return;case"visibility":e.event.visibility=H(n,r);return;case"epoch":It(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=H(n,r);return;case"referenceplane":It(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=H(n,r);return;case"tags":e.event.tags=Re(n.slice(1),r,"tags");return;case"color":e.event.color=H(n,r);return;case"hidden":e.event.hidden=at(H(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new b(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function yl(e,t,n){if(e.length<2)throw new b("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!no.has(r))throw new b(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new b(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function wl(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Xc.has(i)){i!=="info"&&Me(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=ao(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new b(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,s=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(s.has(i.key))throw new b(`Duplicate ${o} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(kl(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function He(e,t,n){if(e.length<2)throw new b("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new b(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function H(e,t){if(e.length<2)throw new b("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function vl(e,t){return Re(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function $l(e,t,n,r){let i={};for(let o of Re(e,t,"layers")){let s=!o.startsWith("-")&&!o.startsWith("!"),c=o.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=s,i["orbits-front"]=s;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&Me(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=s)}return i}function Re(e,t,n){if(e.length===0)throw new b(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new b(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ro(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new b(`Unknown projection "${e}"`,t,n);return r}function io(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function oo(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new b(`Unknown render preset "${e}"`,t,n)}function Cr(e,t,n,r){let i=lt(e,t,n,r);if(i<=0)throw new b(`Field "${r}" must be greater than zero`,t,n);return i}function lt(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new b(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function xl(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Fr(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Il(e,t,n){if(e.length===0||e.length%2!==0)throw new b('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Fr(),i=new Set;for(let o=0;o<e.length;o+=2){let s=e[o],c=e[o+1],a=s.value.toLowerCase();if(i.has(a))throw new b(`Duplicate viewpoint camera field "${s.value}"`,t,s.column);i.add(a);let l=c.value;switch(a){case"azimuth":r.azimuth=lt(l,t,s.column,"camera.azimuth");break;case"elevation":r.elevation=lt(l,t,s.column,"camera.elevation");break;case"roll":r.roll=lt(l,t,s.column,"camera.roll");break;case"distance":r.distance=Cr(l,t,s.column,"camera.distance");break;default:throw new b(`Unknown viewpoint camera field "${s.value}"`,t,s.column)}}return r}function jl(e,t,n,r,i){let o=[],s=0;for(;s<e.length;){let c=e[s],a=mn(c.value);if(!a)throw new b(`Unknown field "${c.value}"`,t,c.column);a.version==="2.1"&&Me(r,i,c.value,{line:t,column:c.column}),s++;let l=[];if(a.inlineMode==="single"){let d=e[s];d&&(l.push(d),s++)}else if(a.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!Kc.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new b(`Missing value for field "${c.value}"`,t,c.column);o.push({type:"field",key:c.value,values:l.map(d=>d.value),location:{line:t,column:c.column}})}return uo(o,n),o}function kl(e,t,n,r,i){if(e.length<2)throw new b("Invalid field line",t,e[0]?.column??1);let o=mn(e[0].value);if(!o)throw new b(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&Me(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return uo([s],n),s}function ao(e,t,n){if(e.length<2)throw new b(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Sl(e,t,n){let r=so(e.fields),i=co(r),o=Ml(e.objectType,r),s=Cl(r.get("groups")?.[0]),c=Qn(r.get("epoch")?.[0]),a=Qn(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?at(Le(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?Al(r.get("resonance")[0]):void 0,f=Pl(r),w=r.get("derive")?.map(P=>Ll(P)),I=r.get("validate")?.map(P=>({rule:Le(P)})),S=r.has("locked")?[...new Set(r.get("locked").flatMap(P=>P.values))]:void 0,k=r.get("tolerance")?.map(P=>Tl(P)),C=Dl(e.typedBlockEntries),Y=lo(e.infoEntries,"info"),v={type:e.objectType,id:e.id,properties:o,placement:i,info:Y};return s.length>0&&(v.groups=s),c&&(v.epoch=c),a&&(v.referencePlane=a),l!==void 0&&(v.tidalLock=l),d&&(v.resonance=d),f&&(v.renderHints=f),w?.length&&(v.deriveRules=w),I?.length&&(v.validationRules=I),S?.length&&(v.lockedFields=S),k?.length&&(v.tolerances=k),C&&Object.keys(C).length>0&&(v.typedBlocks=C),tr(t,"2.1")&&(v.groups||v.epoch||v.referencePlane||v.tidalLock!==void 0||v.resonance||v.renderHints||v.deriveRules?.length||v.validationRules?.length||v.lockedFields?.length||v.tolerances?.length||v.typedBlocks)&&Me(t,n,e.id,e.location),v}function Ol(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>El(n))}}function El(e){let t=so(e.fields,"event-pose"),n=co(t);return{objectId:e.objectId,placement:n,inner:ct(t.get("inner")?.[0],"inner"),outer:ct(t.get("outer")?.[0],"outer"),epoch:Qn(t.get("epoch")?.[0]),referencePlane:Qn(t.get("referencePlane")?.[0])}}function so(e,t="object"){let n=new Map;for(let r of e){let i=mn(r.key);if(!i&&!no.has(r.key))throw b.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw b.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function co(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let s=t??n??r??i;throw b.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:Le(t),distance:ct(e.get("distance")?.[0],"distance"),semiMajor:ct(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Fl(e.get("eccentricity")?.[0],"eccentricity"),period:ct(e.get("period")?.[0],"period"),angle:ct(e.get("angle")?.[0],"angle"),inclination:ct(e.get("inclination")?.[0],"inclination"),phase:ct(e.get("phase")?.[0],"phase")};if(n){let s=Le(n);return{mode:"at",target:s,reference:Ki(s,n.location)}}if(r)return{mode:"surface",target:Le(r)};if(i){let s=Le(i),c=Dr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function Ml(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],s=mn(r);!o||!s?.legacySchema||s.legacySchema.placement||(Pr(r,e,o.location),n[r]=Zi(r,o.values,o.location))}return n}function lo(e,t){let n={};for(let r of e){if(r.key in n)throw b.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Dl(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=lo(r,n))}return t}function Pl(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=at(Le(n),"renderLabel",n.location)),r&&(t.renderOrbit=at(Le(r),"renderOrbit",r.location)),i&&(t.renderPriority=Zn(Le(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Al(e){if(e.values.length!==2)throw b.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw b.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ll(e){if(e.values.length!==2)throw b.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Tl(e){if(e.values.length!==2)throw b.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Dr(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Cl(e){return e?[...new Set(e.values)]:[]}function Qn(e){return e&&e.values.join(" ").trim()||null}function ct(e,t){return e?Mr(Le(e),e.location,t):void 0}function Fl(e,t){return e?Zn(Le(e),t,e.location):void 0}function Le(e){return un(e.values,e.key,e.location)}function mn(e){return er.get(e)}function uo(e,t){for(let n of e){let r=mn(n.key);if(!r)throw b.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Pr(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw b.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Me(e,t,n,r){tr(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function It(e,t,n,r){tr(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function tr(e,t){return to(e)<to(t)}function to(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Vl(e){let t=[...e],n=[],r=!1,i=!1,o=null,s=1,c=1;for(let a=0;a<t.length;a++){let l=t[a],d=t[a+1];if(i){if(l==="*"&&d==="/"){t[a]=" ",t[a+1]=" ",i=!1,o=null,a++,c+=2;continue}l!==`
5
+ `&&l!=="\r"&&(t[a]=" "),l===`
6
+ `?(s++,c=1):c++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:s,column:c}),t[a]=" ",t[a+1]=" ",i=!0,o={line:s,column:c},a++,c+=2;continue}if(!r&&l==="#"&&!Rl(t,a)){n.push({kind:"line",line:s,column:c}),t[a]=" ";let f=a+1;for(;f<t.length&&t[f]!==`
7
+ `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-a,a=f-1;continue}l==='"'&&t[a-1]!=="\\"&&(r=!r),l===`
8
+ `?(s++,c=1):c++}if(i)throw b.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function Rl(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
+ `}function nr(e="WorldOrbit",t="2.5"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function N(e){return structuredClone(e)}function Vr(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?ho(e,t.id):null;case"event":return t.id?rr(e,t.id):null;case"event-pose":return t.id&&t.key?bo(e,t.id,t.key):null;case"object":return t.id?mo(e,t.id):null;case"viewpoint":return t.id?yo(e.system,t.id):null;case"annotation":return t.id?wo(e.system,t.id):null;case"relation":return t.id?go(e,t.id):null}}function Rr(e,t){let n=N(e),r=fo(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=rr(n,t.id);i&&(i.positions=i.positions.filter(o=>o.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function hn(e,t){return t.map(n=>({diagnostic:n,path:po(e,n)}))}function po(e,t){if(t.objectId&&mo(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&ho(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&yo(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&wo(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&go(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&rr(e,n[1]))return n[2]==="pose"&&n[3]&&bo(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in fo(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function zr(e){let t=[...e.diagnostics,...fn(e,e.version)];return hn(e,t)}function fo(e){return e.system||(e.system=nr().system),e.system}function mo(e,t){return e.objects.find(n=>n.id===t)??null}function ho(e,t){return e.groups.find(n=>n.id===t)??null}function go(e,t){return e.relations.find(n=>n.id===t)??null}function rr(e,t){return e.events.find(n=>n.id===t)??null}function bo(e,t,n){return rr(e,t)?.positions.find(r=>r.objectId===n)??null}function yo(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function wo(e,t){return e?.annotations.find(n=>n.id===t)??null}var zl=/^schema\s+2(?:\.0|\.1|\.5)?$/i,_l=/^schema\s+2\.1$/i,Bl=/^schema\s+2\.5$/i,Nl=/^schema\s+2\.0-draft$/i;function vo(e){for(let t of Ul(e).split(/\r?\n/)){let n=t.trim();if(n)return Nl.test(n)?"2.0-draft":_l.test(n)?"2.1":Bl.test(n)?"2.5":zl.test(n)?"2.0":"1.0"}return"1.0"}function Ul(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],s=t[i+1];if(r){if(o==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
10
+ `&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&s==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
+ `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function dt(e){let t=gn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new b(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function gn(e){let t=vo(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Wl(e,t);let n;try{n=Qt(e)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"parse")]}}let r;try{r=en(n)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"normalize")]}}try{tn(r)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Wl(e,t){let n;try{n=Tr(e)}catch(s){return{ok:!1,value:null,diagnostics:[$t(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=dn(n)}catch(s){return{ok:!1,value:null,diagnostics:[$t(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Hl={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},ir={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function _r(e){return e?typeof e=="string"?ir[e]??ir.atlas:{...ir.atlas,...e}:ir.atlas}function Br(e){return{...Hl,...e}}function ze(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Nr(e.objectTypes??[]),tags:Nr((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Nr((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return ql(t)?t:null}function ql(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function or(e,t){let n=ze(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Gl(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ur(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(i=>!i.hidden).map(i=>({object:i,score:Xl(i,r)})).filter(i=>i.score>0).sort((i,o)=>o.score-i.score||i.object.label.localeCompare(o.object.label)).slice(0,n).map(i=>$o(i.object,i.score)):e.objects.filter(i=>!i.hidden).slice().sort((i,o)=>i.label.localeCompare(o.label)).slice(0,n).map(i=>$o(i,1))}function xo(e,t,n,r){return{version:"2.5",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:ze(n)}}function Wr(e){return encodeURIComponent(JSON.stringify(e))}function Yr(e){let t=JSON.parse(decodeURIComponent(e));return{version:t.version==="2.0"?"2.0":"2.5",viewpointId:t.viewpointId??null,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,camera:t.renderOptions?.camera?{...t.renderOptions.camera}:null,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null},filter:ze(t.filter??null)}}function Io(e,t,n){let r=e.trim()||"bookmark";return{id:r.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||r,atlasState:{...n,viewerState:{...n.viewerState},renderOptions:{...n.renderOptions,camera:n.renderOptions.camera?{...n.renderOptions.camera}:null,layers:n.renderOptions.layers?{...n.renderOptions.layers}:void 0,scaleModel:n.renderOptions.scaleModel?{...n.renderOptions.scaleModel}:void 0,activeEventId:n.renderOptions.activeEventId??null},filter:n.filter?{...n.filter}:null}}}function Hr(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,events:e.layers.events,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function qr(e){return e?.filter?ze({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function $o(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[]}}function Gl(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=jo(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function Xl(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),i=jo(e.object,e.label).toLowerCase(),o=0;return n===t||r===t?o+=120:n.startsWith(t)||r.startsWith(t)?o+=96:(n.includes(t)||r.includes(t))&&(o+=72),t.split(/\s+/).filter(Boolean).every(a=>i.includes(a))&&(o+=32),e.object.type===t&&(o+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(a=>typeof a=="string"):[]).some(a=>a.toLowerCase()===t)&&(o+=18),o}function jo(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function Nr(e){return[...new Set(e)]}var jt={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function ko(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function ar(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Tt(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Gr(e,t){return{...e,rotationDeg:ko(e.rotationDeg+t)}}function bn(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=Ft(e),s=ar(t.scale*n,i);if(s===t.scale)return t;let c=s/t.scale,a=r.x-o.x,l=r.y-o.y;return{...t,scale:s,translateX:(1-c)*a+c*t.translateX,translateY:(1-c)*l+c*t.translateY}}function Ct(e,t,n){let r=Ft(e),i=Kl(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),s=Math.max(e.height-n.fitPadding*2,1),c=Math.max(i.width,1),a=Math.max(i.height,1),l=ar(Math.min(o/c,s/a),n),d=ve({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:l,translateX:r.x-(r.x+(d.x-r.x)*l),translateY:r.y-(r.y+(d.y-r.y)*l)}}function Xr(e,t,n,r){let i=e.objects.find(a=>a.objectId===n&&!a.hidden);if(!i)return t;let o=Ft(e),s=ar(Math.max(t.scale,1.8),r),c=ve({x:i.x,y:i.y},o,t.rotationDeg);return{...t,scale:s,translateX:o.x-(o.x+(c.x-o.x)*s),translateY:o.y-(o.y+(c.y-o.y)*s),selectedObjectId:n}}function Kr(e,t){let n=Ft(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function kt(e,t,n){let r=Ft(e),i={x:n.x-t.translateX,y:n.y-t.translateY},o={x:i.x-r.x,y:i.y-r.y},s={x:o.x/Math.max(t.scale,1e-4),y:o.y/Math.max(t.scale,1e-4)},c=ve({x:s.x,y:s.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+c.x,y:r.y+c.y}}function yn(e,t){let n=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(c=>kt(e,t,c)),r=Math.min(...n.map(c=>c.x)),i=Math.min(...n.map(c=>c.y)),o=Math.max(...n.map(c=>c.x)),s=Math.max(...n.map(c=>c.y));return{minX:r,minY:i,maxX:o,maxY:s,width:o-r,height:s-i,centerX:r+(o-r)/2,centerY:i+(s-i)/2}}function Ft(e){return{x:e.width/2,y:e.height/2}}function Kl(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(a=>ve(a,t,n)),i=Math.min(...r.map(a=>a.x)),o=Math.min(...r.map(a=>a.y)),s=Math.max(...r.map(a=>a.x)),c=Math.max(...r.map(a=>a.y));return{minX:i,minY:o,maxX:s,maxY:c,width:s-i,height:c-o,centerX:i+(s-i)/2,centerY:o+(c-o)/2}}var Zr="worldorbit-camera-root";function qe(e,t={}){let n=_r(t.theme),r=pd(t.preset??e.renderPreset??void 0),i=Br({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,s=or(e,t.filter??null),c=e.objects.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)).sort((v,P)=>v.sortKey-P.sortKey),a=e.labels.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)),l=Ql(c),d=i.orbits?Jl(e,s,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)).map(v=>`<line class="wo-leader wo-leader-${v.mode}" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${ue(v.renderId)}" data-group-id="${he(v.groupId??"")}" />`).join(""):"",w=i.relations?e.relations.filter(v=>!v.hidden).filter(v=>s.has(v.fromObjectId)&&s.has(v.toObjectId)).map(v=>`<line class="wo-relation" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${ue(v.renderId)}" data-relation-id="${he(v.relationId)}" />`).join(""):"",I=i.events?e.events.filter(v=>!v.hidden).map(v=>Zl(e,v,s,n)).join(""):"",S=i.objects?c.map(v=>ed(v,t.selectedObjectId??null,n)).join(""):"",k=i.labels?a.map(v=>td(e,v,t.selectedObjectId??null)).join(""):"",C=i.metadata?`<text class="wo-title" x="56" y="64">${ue(e.title)}</text>
12
+ <text class="wo-subtitle" x="56" y="88">${ue(o)}</text>
13
+ <text class="wo-meta" x="56" y="${e.height-42}">${ue(md(e))}</text>`:"",Y=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
14
14
  <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
15
- ${o.guides?cc(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
16
- <title id="worldorbit-title">${ce(e.title)}</title>
17
- <desc id="worldorbit-desc">A ${ce(e.viewMode)} WorldOrbit render with ${a.length} visible objects.</desc>
15
+ ${i.guides?fd(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
16
+ <title id="worldorbit-title">${ue(e.title)}</title>
17
+ <desc id="worldorbit-desc">A ${ue(e.viewMode)} WorldOrbit render with ${c.length} visible objects.</desc>
18
18
  <defs>
19
19
  <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
20
- <stop offset="0%" stop-color="${r.backgroundStart}" />
21
- <stop offset="100%" stop-color="${r.backgroundEnd}" />
20
+ <stop offset="0%" stop-color="${n.backgroundStart}" />
21
+ <stop offset="100%" stop-color="${n.backgroundEnd}" />
22
22
  </linearGradient>
23
23
  <radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
24
- <stop offset="0%" stop-color="${r.starGlow}" stop-opacity="0.95" />
25
- <stop offset="100%" stop-color="${r.starCore}" stop-opacity="0" />
24
+ <stop offset="0%" stop-color="${n.starGlow}" stop-opacity="0.95" />
25
+ <stop offset="100%" stop-color="${n.starCore}" stop-opacity="0" />
26
26
  </radialGradient>
27
27
  <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
28
- <stop offset="0%" stop-color="${r.backgroundGlow}" />
28
+ <stop offset="0%" stop-color="${n.backgroundGlow}" />
29
29
  <stop offset="100%" stop-color="transparent" />
30
30
  </radialGradient>
31
- ${p}
31
+ ${l}
32
32
  </defs>
33
33
  <style>
34
34
  .wo-bg { fill: url(#wo-bg); }
35
35
  .wo-bg-glow { fill: url(#wo-bg-glow); }
36
- .wo-grid { fill: none; stroke: ${r.guide}; stroke-width: 1; }
37
- .wo-orbit { fill: none; stroke: ${r.orbit}; stroke-width: 1.5; }
36
+ .wo-grid { fill: none; stroke: ${n.guide}; stroke-width: 1; }
37
+ .wo-orbit { fill: none; stroke: ${n.orbit}; stroke-width: 1.5; }
38
38
  .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
39
39
  .wo-orbit-front { opacity: 0.9; }
40
- .wo-orbit-band { stroke: ${r.orbitBand}; stroke-linecap: round; }
41
- .wo-relation { stroke: ${r.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
42
- .wo-leader { stroke: ${r.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
43
- .wo-label { fill: ${r.ink}; font-family: ${r.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
44
- .wo-label-secondary { fill: ${r.muted}; font-family: ${r.fontFamily}; font-weight: 500; }
45
- .wo-title { fill: ${r.ink}; font: 700 24px ${r.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
46
- .wo-subtitle { fill: ${r.muted}; font: 500 12px ${r.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
47
- .wo-meta { fill: ${r.muted}; font: 500 11px ${r.fontFamily}; letter-spacing: 0.06em; }
40
+ .wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
41
+ .wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
42
+ .wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
43
+ .wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
44
+ .wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
45
+ .wo-leader { stroke: ${n.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
46
+ .wo-label { fill: ${n.ink}; font-family: ${n.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
47
+ .wo-label-secondary { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
48
+ .wo-title { fill: ${n.ink}; font: 700 24px ${n.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
49
+ .wo-subtitle { fill: ${n.muted}; font: 500 12px ${n.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
50
+ .wo-meta { fill: ${n.muted}; font: 500 11px ${n.fontFamily}; letter-spacing: 0.06em; }
48
51
  .wo-object { cursor: pointer; outline: none; }
49
52
  .wo-object:focus-visible .wo-selection-ring,
50
53
  .wo-object:hover .wo-selection-ring,
51
54
  .wo-object-selected .wo-selection-ring { display: block; }
52
- .wo-object-selected .wo-selection-ring { stroke: ${r.selected}; }
53
- .wo-object-label-selected .wo-label { fill: ${r.accent}; }
54
- .wo-object-label-selected .wo-label-secondary { fill: ${r.selected}; }
55
+ .wo-object-selected .wo-selection-ring { stroke: ${n.selected}; }
56
+ .wo-object-label-selected .wo-label { fill: ${n.accent}; }
57
+ .wo-object-label-selected .wo-label-secondary { fill: ${n.selected}; }
55
58
  .wo-chain-selected .wo-selection-ring,
56
59
  .wo-chain-hover .wo-selection-ring { display: block; }
57
60
  .wo-ancestor-selected .wo-selection-ring,
58
61
  .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
59
62
  .wo-chain-selected .wo-label,
60
- .wo-chain-hover .wo-label { fill: ${r.accent}; }
63
+ .wo-chain-hover .wo-label { fill: ${n.accent}; }
61
64
  .wo-ancestor-selected .wo-label,
62
- .wo-ancestor-hover .wo-label { fill: ${r.ink}; opacity: 0.82; }
65
+ .wo-ancestor-hover .wo-label { fill: ${n.ink}; opacity: 0.82; }
63
66
  .wo-orbit-related-selected,
64
- .wo-orbit-related-hover { stroke: ${r.accentStrong}; opacity: 1; }
67
+ .wo-orbit-related-hover { stroke: ${n.accentStrong}; opacity: 1; }
65
68
  .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
66
69
  .wo-object-image { pointer-events: none; }
67
70
  </style>
68
- ${V}
69
- ${I}
71
+ ${Y}
72
+ ${C}
70
73
  <g data-worldorbit-world="true">
71
- <g data-worldorbit-camera-root="${Tn}" id="${Tn}">
74
+ <g data-worldorbit-camera-root="${Zr}" id="${Zr}">
72
75
  <g data-worldorbit-world-content="true">
73
- ${o.orbits?`<g data-layer-id="orbits-back">${c.back}</g>`:""}
74
- ${o.guides?`<g data-layer-id="guides">${u}</g>`:""}
75
- ${o.relations?`<g data-layer-id="relations">${v}</g>`:""}
76
- ${o.objects?`<g data-layer-id="objects">${x}</g>`:""}
77
- ${o.orbits?`<g data-layer-id="orbits-front">${c.front}</g>`:""}
78
- ${o.labels?`<g data-layer-id="labels">${k}</g>`:""}
76
+ ${i.orbits?`<g data-layer-id="orbits-back">${d.back}</g>`:""}
77
+ ${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
78
+ ${i.relations?`<g data-layer-id="relations">${w}</g>`:""}
79
+ ${i.events?`<g data-layer-id="events">${I}</g>`:""}
80
+ ${i.objects?`<g data-layer-id="objects">${S}</g>`:""}
81
+ ${i.orbits?`<g data-layer-id="orbits-front">${d.front}</g>`:""}
82
+ ${i.labels?`<g data-layer-id="labels">${k}</g>`:""}
79
83
  </g>
80
84
  </g>
81
85
  </g>
82
- </svg>`}function Gl(e,t,r){let n=[],o=[];for(let i of e.orbitVisuals.filter(l=>!l.hidden&&t.has(l.objectId)&&(r||!zr(l.object)))){let l=i.bandThickness??(i.band?10:1.5),a=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${ce(i.renderId)}" data-orbit-object-id="${Ie(i.objectId)}" data-parent-id="${Ie(i.parentId)}" data-group-id="${Ie(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&n.push(`<path class="${a} wo-orbit-back" d="${i.backArcPath}" stroke-width="${l}" ${s} />`),i.frontArcPath&&o.push(`<path class="${a} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${l}" ${s} />`);continue}if(i.kind==="ellipse"){let p=i.rx??i.radius??0,c=i.ry??i.radius??0;o.push(`<ellipse class="${a} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${p}" ry="${c}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${l}" ${s} />`);continue}o.push(`<circle class="${a} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${l}" ${s} />`)}return{back:n.join(""),front:o.join("")}}function Xl(e){return e.filter(t=>!!t.imageHref).map(t=>ec(t)).join("")}function Kl(e,t,r){let{object:n,x:o,y:i,radius:l,visualRadius:a}=e,s=t===e.objectId?" wo-object-selected":"",p=n.properties.kind?` wo-kind-${String(n.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",c=rc(e,r),u=Ql(e),v=u?qo(n,o,i,l,c,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${n.type}${p}${s}" data-object-id="${ce(e.objectId)}" data-parent-id="${Ie(e.parentId??"")}" data-group-id="${Ie(e.groupId??"")}" data-render-id="${ce(e.renderId)}" tabindex="0" role="button" aria-label="${ce(`${n.type} ${e.objectId}`)}">
83
- <circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${a+8}" />
84
- ${Jl(e,c)}
85
- ${qo(n,o,i,l,c)}
86
- ${u}
87
- ${v}
88
- </g>`}function Zl(e,t,r){let n=r===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${n}" data-object-id="${ce(t.objectId)}" data-group-id="${Ie(t.groupId??"")}" data-render-id="${ce(t.renderId)}">
89
- <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${ce(t.label)}</text>
90
- <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${ce(t.secondaryLabel)}</text>
91
- </g>`}function qo(e,t,r,n,o,i={}){let l=i.outlineOnly?"transparent":o.fill,a=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${r}" r="${n*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
92
- <circle cx="${t}" cy="${r}" r="${n}" fill="${l}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${r}" r="${n}" fill="${l}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-n*2} ${r+n*1.3} Q ${t-n*.7} ${r+n*.3} ${t-n*.45} ${r}" fill="none" stroke="${a}" stroke-width="${Math.max(2,n*.8)}" stroke-linecap="round" opacity="0.85" />
93
- <circle cx="${t}" cy="${r}" r="${n}" fill="${l}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Zo(t,r,n)}" fill="${l}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${An(t,r,n)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.4}" ry="${n*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
94
- <circle cx="${t}" cy="${r}" r="${n}" fill="${l}" stroke="${o.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.6}" ry="${n}" fill="${o.halo??"none"}" stroke="none" />
95
- <ellipse cx="${t}" cy="${r}" rx="${n*1.5}" ry="${n*.42}" fill="${l}" stroke="${o.stroke}" stroke-width="1.2" />
96
- <circle cx="${t}" cy="${r}" r="${n*.28}" fill="${o.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*1.6}" ry="${n*.55}" fill="${l}" stroke="${o.stroke}" stroke-width="1" />
97
- <circle cx="${t}" cy="${r}" r="${n*.25}" fill="${o.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${r}" r="${n*2.2}" fill="${o.halo??"none"}" stroke="none" />
98
- <circle cx="${t}" cy="${r}" r="${n}" fill="${l}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${An(t,r,n)}" fill="${l}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Jl(e,t){if(!t.atmosphere)return"";let{object:r,x:n,y:o,radius:i}=e;return r.type!=="planet"&&r.type!=="moon"&&r.type!=="asteroid"?"":`<circle cx="${n}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Ql(e){if(!e.imageHref)return"";let t=tc(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${Ie(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${Ie(Ko(e))})" />`}function ec(e){let{x:t,y:r,radius:n}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${r}" r="${n}" />`;break;case"structure":o=`<polygon points="${Zo(t,r,n)}" />`;break;case"phenomenon":o=`<polygon points="${An(t,r,n)}" />`;break;default:return""}return`<clipPath id="${Ie(Ko(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function tc(e){let{object:t,x:r,y:n,radius:o}=e;switch(t.type){case"structure":return{x:r-o,y:n-o,width:o*2,height:o*2};case"phenomenon":return{x:r-o*1.2,y:n-o*1.2,width:o*2.4,height:o*2.4};default:return{x:r-o,y:n-o,width:o*2,height:o*2}}}function rc(e,t){let r=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),n=nc(e.object.type,r,t),o=e.fillColor&&pc(e.fillColor)?e.fillColor:n.fill,i=Go(e.object.properties.albedo),l=Go(e.object.properties.temperature),a=ic(o,l,i,e.object.type),s=ar(a,"#ffffff",.4)??n.stroke,p=sc(e.object.properties.atmosphere),c=e.object.type==="star"?Xo(ar(a,"#fff2cb",.4)??a,.82):void 0;return{fill:a,stroke:s,glow:c,atmosphere:p,tail:e.object.type==="comet"?Xo(ar(a,"#ffffff",.5)??a,.72):void 0}}function nc(e,t,r){switch(e){case"star":return{fill:r.starCore,stroke:r.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:r.accentStrong,stroke:"#fff2ea"};case"phenomenon":return oc(t)}}function oc(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function ic(e,t,r,n){let o=e;if(t!==null){let i=ac(t,n);o=ar(o,i,n==="star"?.42:.2)??o}if(r!==null){let i=Math.min(Math.max(r,0),1);o=ar(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function ac(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function sc(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function lc(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function Go(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Ko(e){return`${e.renderId}-clip`}function Zo(e,t,r){return`${e},${t-r} ${e+r},${t} ${e},${t+r} ${e-r},${t}`}function An(e,t,r){return`${e},${t-r*1.2} ${e+r*.9},${t-r*.3} ${e+r*1.2},${t+r*.8} ${e},${t+r*1.2} ${e-r*1.1},${t+r*.3} ${e-r*.8},${t-r*.8}`}function cc(e,t){let r=Array.from({length:10},(o,i)=>{let l=90+i*((e-180)/9);return`<line class="wo-grid" x1="${l}" y1="120" x2="${l}" y2="${t-70}" />`}).join(""),n=Array.from({length:6},(o,i)=>{let l=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${l}" x2="${e-56}" y2="${l}" />`}).join("");return`${r}${n}`}function dc(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function zr(e){return e.type==="structure"||e.type==="phenomenon"}function ar(e,t,r){let n=En(e),o=En(t);if(!n||!o)return;let i=Math.min(Math.max(r,0),1);return uc({r:Math.round(n.r+(o.r-n.r)*i),g:Math.round(n.g+(o.g-n.g)*i),b:Math.round(n.b+(o.b-n.b)*i)})}function Xo(e,t){let r=En(e);return r?`rgba(${r.r}, ${r.g}, ${r.b}, ${t})`:e}function En(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function uc(e){let t=r=>r.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function pc(e){return!!e.trim()}function ce(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function Ie(e){return ce(e)}var It=180,kt=120,Jo=10;function Qo(e,t,r){let n=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},o=Math.min((It-Jo*2)/Math.max(n.width,1),(kt-Jo*2)/Math.max(n.height,1)),i=(It-n.width*o)/2-n.minX*o,l=(kt-n.height*o)/2-n.minY*o,a=ir(e,t),s=r.map(p=>{let c=p.x*o+i,u=p.y*o+l,v=Math.max(1.4,Math.min(p.visualRadius*o,5.2)),x=p.fillColor??fc(p.object.type);return`<circle cx="${ke(c)}" cy="${ke(u)}" r="${ke(v)}" fill="${x}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${It}px;height:${kt}px;padding:8px;border-radius:16px;background:rgba(5, 14, 22, 0.78);border:1px solid rgba(179, 216, 255, 0.16);box-shadow:0 14px 28px rgba(0, 0, 0, 0.24);backdrop-filter:blur(8px);pointer-events:none;">
99
- <svg width="${It}" height="${kt}" viewBox="0 0 ${It} ${kt}" role="presentation" aria-hidden="true">
100
- <rect x="0.5" y="0.5" width="${It-1}" height="${kt-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
101
- <rect x="${ke(n.minX*o+i)}" y="${ke(n.minY*o+l)}" width="${ke(n.width*o)}" height="${ke(n.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
102
- ${s}
103
- <rect x="${ke(a.minX*o+i)}" y="${ke(a.minY*o+l)}" width="${ke(a.width*o)}" height="${ke(a.height*o)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
86
+ </svg>`}function Zl(e,t,n,r){let i=t.objectIds.filter(a=>n.has(a)).map(a=>e.objects.find(l=>l.objectId===a&&!l.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,s=t.event.label||t.event.id,c=i.map(a=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${a.x}" y2="${a.y}" stroke="${he(o)}" data-event-id="${he(t.eventId)}" data-object-id="${he(a.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${ue(t.renderId)}" data-event-id="${he(t.eventId)}">
87
+ ${c}
88
+ <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${he(o)}" />
89
+ <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${ue(s)}</text>
90
+ </g>`}function Jl(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(s=>!s.hidden&&t.has(s.objectId)&&(n||!sr(s.object)))){let s=o.bandThickness??(o.band?10:1.5),c=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",a=`data-render-id="${ue(o.renderId)}" data-orbit-object-id="${he(o.objectId)}" data-parent-id="${he(o.parentId)}" data-group-id="${he(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${c} wo-orbit-back" d="${o.backArcPath}" stroke-width="${s}" ${a} />`),o.frontArcPath&&i.push(`<path class="${c} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${s}" ${a} />`);continue}if(o.kind==="ellipse"){let l=o.rx??o.radius??0,d=o.ry??o.radius??0;i.push(`<ellipse class="${c} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${l}" ry="${d}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${s}" ${a} />`);continue}i.push(`<circle class="${c} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${s}" ${a} />`)}return{back:r.join(""),front:i.join("")}}function Ql(e){return e.filter(t=>!!t.imageHref).map(t=>id(t)).join("")}function ed(e,t,n){let{object:r,x:i,y:o,radius:s,visualRadius:c}=e,a=t===e.objectId?" wo-object-selected":"",l=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",d=ad(e,n),f=rd(e),w=f?So(r,i,o,s,d,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${l}${a}" data-object-id="${ue(e.objectId)}" data-parent-id="${he(e.parentId??"")}" data-group-id="${he(e.groupId??"")}" data-render-id="${ue(e.renderId)}" tabindex="0" role="button" aria-label="${ue(`${r.type} ${e.objectId}`)}">
91
+ <circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${c+8}" />
92
+ ${nd(e,d)}
93
+ ${So(r,i,o,s,d)}
94
+ ${f}
95
+ ${w}
96
+ </g>`}function td(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${ue(t.objectId)}" data-group-id="${he(t.groupId??"")}" data-render-id="${ue(t.renderId)}">
97
+ <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${ue(t.label)}</text>
98
+ <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${ue(t.secondaryLabel)}</text>
99
+ </g>`}function So(e,t,n,r,i,o={}){let s=o.outlineOnly?"transparent":i.fill,c=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
100
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${c}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
101
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Do(t,n,r)}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let a=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?a==="black-hole"||a==="nebula"||a==="galaxy"||a==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Jr(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:a==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
102
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="2" />`:a==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
103
+ <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${s}" stroke="${i.stroke}" stroke-width="1.2" />
104
+ <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:a==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${s}" stroke="${i.stroke}" stroke-width="1" />
105
+ <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:a==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
106
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Jr(t,n,r)}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function nd(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function rd(e){if(!e.imageHref)return"";let t=od(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${he(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${he(Mo(e))})" />`}function id(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Do(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${Jr(t,n,r)}" />`;break;default:return""}return`<clipPath id="${he(Mo(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function od(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function ad(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=sd(e.object.type,n,t),i=e.fillColor&&gd(e.fillColor)?e.fillColor:r.fill,o=Oo(e.object.properties.albedo),s=Oo(e.object.properties.temperature),c=ld(i,s,o,e.object.type),a=wn(c,"#ffffff",.4)??r.stroke,l=ud(e.object.properties.atmosphere),d=e.object.type==="star"?Eo(wn(c,"#fff2cb",.4)??c,.82):void 0;return{fill:c,stroke:a,glow:d,atmosphere:l,tail:e.object.type==="comet"?Eo(wn(c,"#ffffff",.5)??c,.72):void 0}}function sd(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return cd(t)}}function cd(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function ld(e,t,n,r){let i=e;if(t!==null){let o=dd(t,r);i=wn(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=wn(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function dd(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function ud(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function pd(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function Oo(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Mo(e){return`${e.renderId}-clip`}function Do(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Jr(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function fd(e,t){let n=Array.from({length:10},(i,o)=>{let s=90+o*((e-180)/9);return`<line class="wo-grid" x1="${s}" y1="120" x2="${s}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let s=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${s}" x2="${e-56}" y2="${s}" />`}).join("");return`${n}${r}`}function md(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function sr(e){return e.type==="structure"||e.type==="phenomenon"}function wn(e,t,n){let r=Qr(e),i=Qr(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return hd({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Eo(e,t){let n=Qr(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Qr(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function hd(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function gd(e){return!!e.trim()}function ue(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function he(e){return ue(e)}var Vt=180,Rt=120,Po=10;function Ao(e,t,n){let r=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},i=Math.min((Vt-Po*2)/Math.max(r.width,1),(Rt-Po*2)/Math.max(r.height,1)),o=(Vt-r.width*i)/2-r.minX*i,s=(Rt-r.height*i)/2-r.minY*i,c=yn(e,t),a=n.map(l=>{let d=l.x*i+o,f=l.y*i+s,w=Math.max(1.4,Math.min(l.visualRadius*i,5.2)),I=l.fillColor??bd(l.object.type);return`<circle cx="${Te(d)}" cy="${Te(f)}" r="${Te(w)}" fill="${I}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Vt}px;height:${Rt}px;padding:8px;border-radius:16px;background:rgba(5, 14, 22, 0.78);border:1px solid rgba(179, 216, 255, 0.16);box-shadow:0 14px 28px rgba(0, 0, 0, 0.24);backdrop-filter:blur(8px);pointer-events:none;">
107
+ <svg width="${Vt}" height="${Rt}" viewBox="0 0 ${Vt} ${Rt}" role="presentation" aria-hidden="true">
108
+ <rect x="0.5" y="0.5" width="${Vt-1}" height="${Rt-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
109
+ <rect x="${Te(r.minX*i+o)}" y="${Te(r.minY*i+s)}" width="${Te(r.width*i)}" height="${Te(r.height*i)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
110
+ ${a}
111
+ <rect x="${Te(c.minX*i+o)}" y="${Te(c.minY*i+s)}" width="${Te(c.width*i)}" height="${Te(c.height*i)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
104
112
  </svg>
105
- </div>`}function fc(e){switch(e){case"star":return"#ffcc67";case"planet":return"#72b7ff";case"moon":return"#c7d7ea";case"belt":case"ring":return"#d9aa74";case"asteroid":return"#a7a5b8";case"comet":return"#9ce7ff";case"structure":return"#ff7f5f";case"phenomenon":return"#78ffd7"}}function ke(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var mc=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function ti(e){return{objectId:e.objectId,title:e.objectId,typeLabel:wc(e.object.type),imageHref:e.renderObject.imageHref??null,description:bc(e),tags:hc(e.object.properties.tags),fields:gc(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function ri(e,t){let r=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${Le(i)}</span>`).join("")}</div>`:"",n=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${Le(i.label)}</dt><dd>${Le(i.value)}</dd></div>`).join("")}</dl>`:"",o=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${Le(e.objectId)}">
113
+ </div>`}function bd(e){switch(e){case"star":return"#ffcc67";case"planet":return"#72b7ff";case"moon":return"#c7d7ea";case"belt":case"ring":return"#d9aa74";case"asteroid":return"#a7a5b8";case"comet":return"#9ce7ff";case"structure":return"#ff7f5f";case"phenomenon":return"#78ffd7"}}function Te(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var yd=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function To(e){return{objectId:e.objectId,title:e.objectId,typeLabel:Id(e.object.type),imageHref:e.renderObject.imageHref??null,description:$d(e),tags:vd(e.object.properties.tags),fields:wd(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function Co(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(o=>`<span class="wo-tooltip-tag">${_e(o)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(o=>`<div class="wo-tooltip-field"><dt>${_e(o.label)}</dt><dd>${_e(o.value)}</dd></div>`).join("")}</dl>`:"",i=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${_e(e.objectId)}">
106
114
  <div class="wo-tooltip-head">
107
- ${e.imageHref?`<img class="wo-tooltip-image" src="${xc(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${Le(e.typeLabel.slice(0,1))}</div>`}
115
+ ${e.imageHref?`<img class="wo-tooltip-image" src="${kd(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${_e(e.typeLabel.slice(0,1))}</div>`}
108
116
  <div class="wo-tooltip-heading">
109
- <strong>${Le(e.title)}</strong>
110
- <span>${Le(e.typeLabel)}</span>
117
+ <strong>${_e(e.title)}</strong>
118
+ <span>${_e(e.typeLabel)}</span>
111
119
  </div>
112
120
  </div>
113
- ${e.description?`<p class="wo-tooltip-description">${Le(e.description)}</p>`:""}
114
- ${r}
121
+ ${e.description?`<p class="wo-tooltip-description">${_e(e.description)}</p>`:""}
115
122
  ${n}
116
- ${o.length?`<p class="wo-tooltip-relations">${Le(o.join(" - "))}</p>`:""}
117
- </article>`}function gc(e){let t=new Map;for(let n of mc){let o=e.object.properties[n];o!==void 0&&t.set(n,{key:n,label:vc(n),value:ei(o)})}let r=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),r?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${r.target}`}):r?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${r.target}`}):r?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:r.distance?`Free ${ei(r.distance)}`:`Free ${r.descriptor??"custom"}`}),[...t.values()]}function hc(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function bc(e){let t=e.object.info.description?.trim();if(t)return t;let r=e.group?.label?.trim();return r&&r!==e.objectId?r:null}function ei(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):yc(e)}function yc(e){return`${e.value}${e.unit??""}`}function wc(e){return e.charAt(0).toUpperCase()+e.slice(1)}function vc(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function Le(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function xc(e){return Le(e)}var jt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},ni="worldorbit-viewer-tooltip-style";function St(e,t){if(jc(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let n={minScale:t.minScale??jt.minScale,maxScale:t.maxScale??jt.maxScale,fitPadding:t.fitPadding??jt.fitPadding},o={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??jt.panStep,zoomStep:t.zoomStep??jt.zoomStep,rotationStep:t.rotationStep??jt.rotationStep},i={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:De(t.initialFilter),subtitle:t.subtitle},l=e.getAttribute("tabindex"),a=e.style.touchAction,s=e.style.position,p=$c(t),c=sr(p,i),u={...ct},v=null,x=null,k=null,I=null,V=!1,$=null,S=null,E=0,X=!1,W=new Map,U=null,H=null,C=null,ie=null,J=null,ee=null;l===null&&(e.tabIndex=0),Sc(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":a,e.style.position||(e.style.position="relative");let K=f=>{if(!o.pointer||X)return;f.preventDefault(),e.focus();let h=Ae(f.clientX,f.clientY),w=lr(Math.exp(-f.deltaY*.002),.6,1.6);q(or(c,u,w,h,n))},Te=f=>{if(X)return;let h=f.pointerType==="touch";if(h&&!o.touch||!h&&!o.pointer||!h&&f.button!==0)return;e.focus(),e.setPointerCapture?.(f.pointerId);let w=Oe(f.clientX,f.clientY);if(h){W.set(f.pointerId,w),W.size===2?U=ai(c,u,W):W.size===1&&(E=0,V=!1);return}$=f.pointerId,S=w,E=0,V=!1},Je=f=>{if(X)return;if(f.pointerType==="touch"){if(!o.touch||!W.has(f.pointerId))return;let P=W.get(f.pointerId),nt=Oe(f.clientX,f.clientY);if(W.set(f.pointerId,nt),W.size===2){U||(U=ai(c,u,W));let he=li(W),Ue=he.distance/Math.max(U.startDistance,1),Ft=or(c,U.startState,Ue,U.startCenter,n),Vt=he.center.x-U.startViewportCenter.x,Rt=he.center.y-U.startViewportCenter.y;q(vt(Ft,Vt,Rt))}else if(W.size===1){let he=nt.x-P.x,Ue=nt.y-P.y;E+=Math.abs(he)+Math.abs(Ue),E>2&&(V=!0),q(vt(u,he,Ue))}return}if(!o.pointer||$!==f.pointerId||!S)return;let w=Oe(f.clientX,f.clientY),Y=w.x-S.x,R=w.y-S.y;E+=Math.abs(Y)+Math.abs(R),S=w,E>2&&(V=!0),q(vt(u,Y,R))},Ve=f=>{if(f.pointerType==="touch"){W.delete(f.pointerId),W.size<2&&(U=null);return}$===f.pointerId&&($=null,S=null)},pt=f=>{if(!o.selection||X)return;if(V){V=!1;return}let h=Wr(f.target);Se(h),o.tooltipMode==="pinned"&&(C=h,ge())},F=f=>{let h=Wr(f.target);se(h)},te=()=>{se(null)},Qe=f=>{let h=Wr(f.target);h&&se(h)},D=()=>{se(null)},O=f=>{if(!o.keyboard||X)return;let h=Wr(f.target);if((f.key==="Enter"||f.key===" ")&&h){f.preventDefault(),Se(h),o.tooltipMode==="pinned"&&(C=h,ge());return}switch(f.key){case"Escape":o.tooltipMode==="pinned"&&C&&(f.preventDefault(),C=null,ge());return;case"+":case"=":f.preventDefault(),j.zoomBy(o.zoomStep);return;case"-":f.preventDefault(),j.zoomBy(1/o.zoomStep);return;case"ArrowLeft":f.preventDefault(),j.panBy(-o.panStep,0);return;case"ArrowRight":f.preventDefault(),j.panBy(o.panStep,0);return;case"ArrowUp":f.preventDefault(),j.panBy(0,-o.panStep);return;case"ArrowDown":f.preventDefault(),j.panBy(0,o.panStep);return;case"[":f.preventDefault(),j.rotateBy(-o.rotationStep);return;case"]":f.preventDefault(),j.rotateBy(o.rotationStep);return;case"f":case"F":f.preventDefault(),j.fitToSystem();return;case"0":f.preventDefault(),j.resetView();return}};e.addEventListener("wheel",K,{passive:!1}),e.addEventListener("pointerdown",Te),e.addEventListener("pointermove",Je),e.addEventListener("pointerup",Ve),e.addEventListener("pointercancel",Ve),e.addEventListener("click",pt),e.addEventListener("mouseover",F),e.addEventListener("mouseleave",te),e.addEventListener("focusin",Qe),e.addEventListener("focusout",D),e.addEventListener("keydown",O);let j={setSource(f){p={kind:"source",value:f},c=sr(p,i),ee=null,ae(!0)},setDocument(f){p={kind:"document",value:f},c=sr(p,i),ee=null,ae(!0)},setScene(f){p={kind:"scene",value:f},c=f,ee=null,ae(!0)},getScene(){return c},getRenderOptions(){return Ic(i)},listViewpoints(){return c.viewpoints.slice()},getActiveViewpoint(){return _e(ee)},goToViewpoint(f){let h=_e(f);if(!h)return!1;let w={},Y=Sn(h);if(h.preset!==null&&(w.preset=h.preset),p.kind!=="scene"&&h.projection!==c.projection&&(w.projection=h.projection),Y&&(w.layers=Y),ee=h.id,Object.keys(w).length>0){let P=ii(w);i=oi(i,w),p.kind!=="scene"&&P&&(c=sr(p,i)),ae(P)}Ne(On(h),!1,!1);let R=Et(h);return q(R),Se(h.selectedObjectId??h.objectId??null,!1),t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(Z(u.selectedObjectId)),Pt(),ve(),!0},search(f,h=12){return In(c,f,h)},getFilter(){return i.filter?{...i.filter}:null},setFilter(f){Ne(f,!0,!0)},getVisibleObjects(){return Me()},getFocusPath(f){return Be(f)},getObjectDetails(f){return Z(f)},getSelectionDetails(){return Z(u.selectedObjectId)},getTooltipDetails(){return J},getAtlasState(){return zo(u,i,i.filter??null,ee)},setAtlasState(f){let h=typeof f=="string"?jn(f):f;h.viewpointId&&j.goToViewpoint(h.viewpointId),j.setRenderOptions(h.renderOptions),Ne(h.filter??null,!1,!1),q(me({...u,...h.viewerState})),Se(h.viewerState.selectedObjectId??null,!1),Pt(),t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(Z(u.selectedObjectId)),ve()},serializeAtlasState(){return kn(j.getAtlasState())},captureBookmark(f,h){return Wo(f,h,j.getAtlasState())},applyBookmark(f){return typeof f=="string"?(j.setAtlasState(f),!0):(j.setAtlasState(f.atlasState),!0)},setRenderOptions(f){let h=ii(f);i=oi(i,f),p.kind!=="scene"&&h&&(c=sr(p,i)),ae(h)},getState(){return{...u}},setState(f){q(me({...u,...f}))},zoomBy(f,h){q(or(c,u,f,h??{x:c.width/2,y:c.height/2},n))},panBy(f,h){q(vt(u,f,h))},rotateBy(f){q(Mn(u,f))},fitToSystem(){q(xt(c,u,n))},focusObject(f){ee=null,q(Dn(c,u,f,n)),Se(f),o.tooltipMode==="pinned"&&(C=Q(f)?.objectId??null,ge())},pinTooltip(f){C=Q(f)?.objectId??null,ge()},resetView(){let f=xt(c,{...ct},n);ee=null,q(f),Se(null),C=null,ge()},exportSvg(){return Fe(c,{...i,filter:i.filter??null,selectedObjectId:u.selectedObjectId})},destroy(){X||(X=!0,e.removeEventListener("wheel",K),e.removeEventListener("pointerdown",Te),e.removeEventListener("pointermove",Je),e.removeEventListener("pointerup",Ve),e.removeEventListener("pointercancel",Ve),e.removeEventListener("click",pt),e.removeEventListener("mouseover",F),e.removeEventListener("mouseleave",te),e.removeEventListener("focusin",Qe),e.removeEventListener("focusout",D),e.removeEventListener("keydown",O),I?.remove(),I=null,k?.remove(),k=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=a,e.style.position=s,l===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",l))}};return ae(!0),t.initialViewpointId?j.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?j.focusObject(t.initialSelectionObjectId):ve(),j;function ae(f){if(e.innerHTML=Fe(c,{...i,filter:i.filter??null,selectedObjectId:u.selectedObjectId}),v=e.querySelector('[data-worldorbit-svg="true"]'),x=e.querySelector("#worldorbit-camera-root"),k=null,I=null,o.minimap&&(k=document.createElement("div"),k.dataset.worldorbitMinimapRoot="true",e.append(k)),o.tooltipMode!=="disabled"&&(I=document.createElement("div"),I.className="wo-viewer-tooltip-root",I.dataset.worldorbitTooltip="true",I.hidden=!0,I.addEventListener("click",wr),e.append(I)),!v||!x)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");u=f?xt(c,{...ct},n):me(u),Se(u.selectedObjectId&&Q(u.selectedObjectId)?u.selectedObjectId:null,!1),se(H&&Q(H)?H:null,!1),C=C&&Q(C)?C:null,gr(),mt(),Pt(),t.onViewChange?.({...u}),ve()}function q(f){u=me(f),gr(),t.onViewChange?.({...u}),ve()}function me(f){return{scale:lr(f.scale,n.minScale,n.maxScale),rotationDeg:si(f.rotationDeg),translateX:Number.isFinite(f.translateX)?f.translateX:u.translateX,translateY:Number.isFinite(f.translateY)?f.translateY:u.translateY,selectedObjectId:f.selectedObjectId&&Q(f.selectedObjectId)?f.selectedObjectId:null}}function gr(){x&&(x.setAttribute("transform",Ln(c,u)),Ct(),ge())}function Se(f,h=!0){u.selectedObjectId&&e.querySelector(`[data-object-id="${cr(u.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),u={...u,selectedObjectId:f&&Q(f)?f:null},u.selectedObjectId&&e.querySelector(`[data-object-id="${cr(u.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),et(),ge(),h&&(t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(Z(u.selectedObjectId)),t.onViewChange?.({...u}),ve())}function se(f,h=!0){H===f&&h||(H=f&&Q(f)?f:null,et(),ge(),h&&(t.onHoverChange?.(Q(H)),t.onHoverDetailsChange?.(Z(H))))}function At(){return Q(u.selectedObjectId)}function Q(f){if(!f)return null;let h=tt();return c.objects.find(w=>w.objectId===f&&!w.hidden&&h.has(w.objectId))??null}function Z(f){let h=Q(f);return h?{objectId:h.objectId,object:h.object,renderObject:h,label:c.labels.find(w=>w.objectId===h.objectId&&!w.hidden)??null,group:c.groups.find(w=>w.renderId===h.groupId)??null,semanticGroups:c.semanticGroups.filter(w=>h.semanticGroupIds.includes(w.id)),orbit:c.orbitVisuals.find(w=>w.objectId===h.objectId&&!w.hidden)??null,relatedOrbits:c.orbitVisuals.filter(w=>!w.hidden&&(w.objectId===h.objectId||h.ancestorIds.includes(w.objectId)||h.childIds.includes(w.objectId))),relations:c.relations.filter(w=>!w.hidden&&(w.fromObjectId===h.objectId||w.toObjectId===h.objectId)),parent:Q(h.parentId),children:h.childIds.map(w=>Q(w)).filter(Boolean),ancestors:h.ancestorIds.map(w=>Q(w)).filter(Boolean),focusPath:Be(h.objectId)}:null}function et(){for(let f of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))f.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Re(u.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Re(H,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Re(f,h){let w=Z(f);if(!w)return;let Y=new Set([w.objectId,...w.renderObject.childIds,...w.renderObject.ancestorIds]);for(let R of Y)for(let P of e.querySelectorAll(`[data-object-id="${cr(R)}"]`))P.classList.add(h.objectClass);for(let R of w.ancestors)for(let P of e.querySelectorAll(`[data-object-id="${cr(R.objectId)}"]`))P.classList.add(h.ancestorClass);for(let R of w.relatedOrbits)for(let P of e.querySelectorAll(`[data-orbit-object-id="${cr(R.objectId)}"]`))P.classList.add(h.orbitClass)}function Oe(f,h){if(!v)return{x:c.width/2,y:c.height/2};let w=v.getBoundingClientRect();return!w.width||!w.height?{x:c.width/2,y:c.height/2}:{x:(f-w.left)/w.width*c.width,y:(h-w.top)/w.height*c.height}}function Ae(f,h){return dt(c,u,Oe(f,h))}function tt(){return Nr(c,i.filter??null)}function Me(){let f=tt();return c.objects.filter(h=>!h.hidden&&f.has(h.objectId))}function Be(f){let h=c.objects.find(w=>w.objectId===f&&!w.hidden);return h?[...h.ancestorIds,h.objectId].map(w=>Q(w)).filter(Boolean):[]}function _e(f){return c.viewpoints.find(h=>h.id===f)??null}function Et(f){let h=si(f.rotationDeg),w=f.scale!==null&&f.scale!==void 0?lr(f.scale,n.minScale,n.maxScale):null,Y=f.objectId&&c.objects.find(P=>P.objectId===f.objectId&&!P.hidden);if(Y)return ft({x:Y.x,y:Y.y},w??Math.max(1.8,ct.scale),h,f.selectedObjectId??Y.objectId);let R=xt(c,{...ct,rotationDeg:h},n);return w===null?{...R,rotationDeg:h,selectedObjectId:f.selectedObjectId??null}:ft({x:c.contentBounds.centerX,y:c.contentBounds.centerY},w,h,f.selectedObjectId??null)}function ft(f,h,w,Y){let R={x:c.width/2,y:c.height/2},P=ue(f,R,w);return{scale:h,rotationDeg:w,translateX:R.x-(R.x+(P.x-R.x)*h),translateY:R.y-(R.y+(P.y-R.y)*h),selectedObjectId:Y}}function Ne(f,h,w){i={...i,filter:De(f)},w&&(ee=null),ae(!1)}function mt(){t.onFilterChange?.(i.filter??null,Me())}function Pt(){t.onViewpointChange?.(_e(ee))}function ve(){t.onAtlasStateChange?.(j.getAtlasState())}function Ct(){!o.minimap||!k||(k.innerHTML=Qo(c,u,Me()))}function ge(){if(o.tooltipMode==="disabled"||!I){rt(null);return}let f=Ee();if(!f){I.hidden=!0,I.innerHTML="",I.removeAttribute("data-mode"),rt(null);return}let h=Z(f.objectId);if(!h){I.hidden=!0,I.innerHTML="",I.removeAttribute("data-mode"),rt(null);return}let w=ti(h);ie=f.objectId,I.hidden=!1,I.dataset.mode=f.mode,I.classList.toggle("is-pinned",f.mode==="pinned"),I.style.pointerEvents="auto",I.style.visibility="hidden",hr(I,w,f.mode),br(I,h.renderObject),I.style.visibility="visible",rt(w)}function Ee(){return C&&Q(C)?{objectId:C,mode:"pinned"}:H&&Q(H)?{objectId:H,mode:"hover"}:null}function hr(f,h,w){let Y=t.tooltipRenderer?.(h,w);f.innerHTML="",typeof Y=="string"?f.innerHTML=Y:Y instanceof HTMLElement?f.append(Y):f.innerHTML=ri(h,w);let R=document.createElement("div");if(R.className="wo-tooltip-actions",w==="pinned"){let P=document.createElement("button");P.type="button",P.className="wo-tooltip-action",P.dataset.tooltipAction="unpin",P.textContent="Unpin",R.append(P)}else{let P=document.createElement("button");P.type="button",P.className="wo-tooltip-action",P.dataset.tooltipAction="pin",P.dataset.objectId=h.objectId,P.textContent="Pin",R.append(P)}R.childElementCount>0&&f.append(R)}function br(f,h){if(!v)return;let w={x:h.anchorX??h.x,y:h.anchorY??h.y-Math.max(h.visualRadius,h.radius)},Y=yr(w),R=v.getBoundingClientRect(),P=e.getBoundingClientRect(),nt=R.left-P.left+Y.x/Math.max(c.width,1)*R.width,he=R.top-P.top+Y.y/Math.max(c.height,1)*R.height,Ue=Math.max(e.clientWidth-f.offsetWidth-12,12),Ft=Math.max(e.clientHeight-f.offsetHeight-12,12),Vt=he>e.clientHeight*.48,Rt=lr(nt+18,12,Ue),en=lr(Vt?he-f.offsetHeight-18:he+18,12,Ft);f.style.left=`${Rt}px`,f.style.top=`${en}px`}function yr(f){let h={x:c.width/2,y:c.height/2},w=ue(f,h,u.rotationDeg);return{x:h.x+(w.x-h.x)*u.scale+u.translateX,y:h.y+(w.y-h.y)*u.scale+u.translateY}}function wr(f){let h=f.target?.closest("[data-tooltip-action]");if(h){switch(f.preventDefault(),f.stopPropagation(),h.dataset.tooltipAction){case"pin":C=h.dataset.objectId??ie;break;case"unpin":C=null;break}ge()}}function rt(f){let h=J?.objectId!==f?.objectId||J?.description!==f?.description||J?.imageHref!==f?.imageHref;J=f,ie=f?.objectId??null,h&&t.onTooltipChange?.(f)}}function $c(e){if(e.scene)return{kind:"scene",value:e.scene};if(e.document)return{kind:"document",value:e.document};if(e.source)return{kind:"source",value:e.source};throw new Error("Interactive viewer requires an initial render input.")}function sr(e,t){switch(e.kind){case"scene":return e.value;case"document":return ye(e.value,t);case"source":{let r=We(e.value);return ye(r.document,kc(r,t))}}}function Ic(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme}}function oi(e,t){return{...e,...t,filter:t.filter!==void 0?De(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function ii(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0}function kc(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function ai(e,t,r){let{center:n,distance:o}=li(r);return{startState:{...t},startCenter:dt(e,t,n),startViewportCenter:n,startDistance:o}}function li(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[r,n]=t;return{center:{x:(r.x+n.x)/2,y:(r.y+n.y)/2},distance:Math.hypot(n.x-r.x,n.y-r.y)}}function Wr(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function jc(e){if(typeof window>"u"||typeof document>"u")throw new Error("createInteractiveViewer can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("Interactive viewer requires an HTMLElement container.")}function lr(e,t,r){return Math.min(Math.max(e,t),r)}function si(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function cr(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Sc(){if(typeof document>"u"||document.getElementById(ni))return;let e=document.createElement("style");e.id=ni,e.textContent=`
123
+ ${r}
124
+ ${i.length?`<p class="wo-tooltip-relations">${_e(i.join(" - "))}</p>`:""}
125
+ </article>`}function wd(e){let t=new Map;for(let r of yd){let i=e.object.properties[r];i!==void 0&&t.set(r,{key:r,label:jd(r),value:Lo(i)})}let n=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),e.relatedEvents.length>0&&t.set("events",{key:"events",label:"Events",value:e.relatedEvents.map(r=>r.event.label||r.event.id).join(", ")}),n?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${n.target}`}):n?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${n.target}`}):n?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:n.distance?`Free ${Lo(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function vd(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function $d(e){let t=e.object.info.description?.trim();if(t)return t;let n=e.group?.label?.trim();return n&&n!==e.objectId?n:null}function Lo(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):xd(e)}function xd(e){return`${e.value}${e.unit??""}`}function Id(e){return e.charAt(0).toUpperCase()+e.slice(1)}function jd(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function _e(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function kd(e){return _e(e)}var zt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Fo="worldorbit-viewer-tooltip-style";function _t(e,t){if(Md(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let r={minScale:t.minScale??zt.minScale,maxScale:t.maxScale??zt.maxScale,fitPadding:t.fitPadding??zt.fitPadding},i={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??zt.panStep,zoomStep:t.zoomStep??zt.zoomStep,rotationStep:t.rotationStep??zt.rotationStep},o={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:ze(t.initialFilter),subtitle:t.subtitle},s=e.getAttribute("tabindex"),c=e.style.touchAction,a=e.style.position,l=Sd(t),d=vn(l,o),f={...jt},w=null,I=null,S=null,k=null,C=!1,Y=null,v=null,P=0,ne=!1,X=new Map,Q=null,re=null,U=null,be=null,ee=null,te=null;s===null&&(e.tabIndex=0),Dd(),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":c,e.style.position||(e.style.position="relative");let q=m=>{if(!i.pointer||ne)return;m.preventDefault(),e.focus();let y=xe(m.clientX,m.clientY),$=$n(Math.exp(-m.deltaY*.002),.6,1.6);de(bn(d,f,$,y,r))},we=m=>{if(ne)return;let y=m.pointerType==="touch";if(y&&!i.touch||!y&&!i.pointer||!y&&m.button!==0)return;e.focus(),e.setPointerCapture?.(m.pointerId);let $=Ce(m.clientX,m.clientY);if(y){X.set(m.pointerId,$),X.size===2?Q=zo(d,f,X):X.size===1&&(P=0,C=!1);return}Y=m.pointerId,v=$,P=0,C=!1},le=m=>{if(ne)return;if(m.pointerType==="touch"){if(!i.touch||!X.has(m.pointerId))return;let F=X.get(m.pointerId),Ve=Ce(m.clientX,m.clientY);if(X.set(m.pointerId,Ve),X.size===2){Q||(Q=zo(d,f,X));let Se=Bo(X),nt=Se.distance/Math.max(Q.startDistance,1),Ht=bn(d,Q.startState,nt,Q.startCenter,r),qt=Se.center.x-Q.startViewportCenter.x,Gt=Se.center.y-Q.startViewportCenter.y;de(Tt(Ht,qt,Gt))}else if(X.size===1){let Se=Ve.x-F.x,nt=Ve.y-F.y;P+=Math.abs(Se)+Math.abs(nt),P>2&&(C=!0),de(Tt(f,Se,nt))}return}if(!i.pointer||Y!==m.pointerId||!v)return;let $=Ce(m.clientX,m.clientY),Z=$.x-v.x,z=$.y-v.y;P+=Math.abs(Z)+Math.abs(z),v=$,P>2&&(C=!0),de(Tt(f,Z,z))},De=m=>{if(m.pointerType==="touch"){X.delete(m.pointerId),X.size<2&&(Q=null);return}Y===m.pointerId&&(Y=null,v=null)},We=m=>{if(!i.selection||ne)return;if(C){C=!1;return}let y=cr(m.target);W(y),i.tooltipMode==="pinned"&&(U=y,ke())},D=m=>{let y=cr(m.target);ie(y)},oe=()=>{ie(null)},Ze=m=>{let y=cr(m.target);y&&ie(y)},bt=()=>{ie(null)},T=m=>{if(!i.keyboard||ne)return;let y=cr(m.target);if((m.key==="Enter"||m.key===" ")&&y){m.preventDefault(),W(y),i.tooltipMode==="pinned"&&(U=y,ke());return}switch(m.key){case"Escape":i.tooltipMode==="pinned"&&U&&(m.preventDefault(),U=null,ke());return;case"+":case"=":m.preventDefault(),R.zoomBy(i.zoomStep);return;case"-":m.preventDefault(),R.zoomBy(1/i.zoomStep);return;case"ArrowLeft":m.preventDefault(),R.panBy(-i.panStep,0);return;case"ArrowRight":m.preventDefault(),R.panBy(i.panStep,0);return;case"ArrowUp":m.preventDefault(),R.panBy(0,-i.panStep);return;case"ArrowDown":m.preventDefault(),R.panBy(0,i.panStep);return;case"[":m.preventDefault(),R.rotateBy(-i.rotationStep);return;case"]":m.preventDefault(),R.rotateBy(i.rotationStep);return;case"f":case"F":m.preventDefault(),R.fitToSystem();return;case"0":m.preventDefault(),R.resetView();return}};e.addEventListener("wheel",q,{passive:!1}),e.addEventListener("pointerdown",we),e.addEventListener("pointermove",le),e.addEventListener("pointerup",De),e.addEventListener("pointercancel",De),e.addEventListener("click",We),e.addEventListener("mouseover",D),e.addEventListener("mouseleave",oe),e.addEventListener("focusin",Ze),e.addEventListener("focusout",bt),e.addEventListener("keydown",T);let R={setSource(m){l={kind:"source",value:m},d=vn(l,o),te=null,ye(!0)},setDocument(m){l={kind:"document",value:m},d=vn(l,o),te=null,ye(!0)},setScene(m){l={kind:"scene",value:m},d=m,te=null,ye(!0)},getScene(){return d},getRenderOptions(){return Od(o)},listViewpoints(){return d.viewpoints.slice()},getActiveViewpoint(){return et(te)},goToViewpoint(m){let y=et(m);if(!y)return!1;let $={},Z=Hr(y);if(y.preset!==null&&($.preset=y.preset),l.kind!=="scene"&&y.projection!==d.projection&&($.projection=y.projection),y.camera?$.camera={...y.camera}:o.camera&&($.camera=null),Z&&($.layers=Z),te=y.id,Object.keys($).length>0){let F=Ro($);o=Vo(o,$),l.kind!=="scene"&&F&&(d=vn(l,o)),ye(F)}tt(qr(y),!1,!1);let z=Ut(y);return de(z),W(y.selectedObjectId??y.objectId??null,!1),t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Wt(),Pe(),!0},getActiveEventId(){return o.activeEventId??null},setActiveEvent(m){R.setRenderOptions({activeEventId:m})},search(m,y=12){return Ur(d,m,y)},getFilter(){return o.filter?{...o.filter}:null},setFilter(m){tt(m,!0,!0)},getVisibleObjects(){return Fe()},getFocusPath(m){return Qe(m)},getObjectDetails(m){return K(m)},getSelectionDetails(){return K(f.selectedObjectId)},getTooltipDetails(){return ee},getAtlasState(){return xo(f,o,o.filter??null,te)},setAtlasState(m){let y=typeof m=="string"?Yr(m):m;y.viewpointId&&R.goToViewpoint(y.viewpointId),R.setRenderOptions(y.renderOptions),tt(y.filter??null,!1,!1),de(O({...f,...y.viewerState})),W(y.viewerState.selectedObjectId??null,!1),Wt(),t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Pe()},serializeAtlasState(){return Wr(R.getAtlasState())},captureBookmark(m,y){return Io(m,y,R.getAtlasState())},applyBookmark(m){return typeof m=="string"?(R.setAtlasState(m),!0):(R.setAtlasState(m.atlasState),!0)},setRenderOptions(m){let y=Ro(m);o=Vo(o,m),l.kind!=="scene"&&y&&(d=vn(l,o)),ye(y)},getState(){return{...f}},setState(m){de(O({...f,...m}))},zoomBy(m,y){de(bn(d,f,m,y??{x:d.width/2,y:d.height/2},r))},panBy(m,y){de(Tt(f,m,y))},rotateBy(m){de(Gr(f,m))},fitToSystem(){de(Ct(d,f,r))},focusObject(m){te=null,de(Xr(d,f,m,r)),W(m),i.tooltipMode==="pinned"&&(U=ae(m)?.objectId??null,ke())},pinTooltip(m){U=ae(m)?.objectId??null,ke()},resetView(){let m=Ct(d,{...jt},r);te=null,de(m),W(null),U=null,ke()},exportSvg(){return qe(d,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){ne||(ne=!0,e.removeEventListener("wheel",q),e.removeEventListener("pointerdown",we),e.removeEventListener("pointermove",le),e.removeEventListener("pointerup",De),e.removeEventListener("pointercancel",De),e.removeEventListener("click",We),e.removeEventListener("mouseover",D),e.removeEventListener("mouseleave",oe),e.removeEventListener("focusin",Ze),e.removeEventListener("focusout",bt),e.removeEventListener("keydown",T),k?.remove(),k=null,S?.remove(),S=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=c,e.style.position=a,s===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",s))}};return ye(!0),t.initialViewpointId?R.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?R.focusObject(t.initialSelectionObjectId):Pe(),R;function ye(m){if(e.innerHTML=qe(d,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),I=e.querySelector("#worldorbit-camera-root"),S=null,k=null,i.minimap&&(S=document.createElement("div"),S.dataset.worldorbitMinimapRoot="true",e.append(S)),i.tooltipMode!=="disabled"&&(k=document.createElement("div"),k.className="wo-viewer-tooltip-root",k.dataset.worldorbitTooltip="true",k.hidden=!0,k.addEventListener("click",Tn),e.append(k)),!w||!I)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=m?Ct(d,{...jt},r):O(f),W(f.selectedObjectId&&ae(f.selectedObjectId)?f.selectedObjectId:null,!1),ie(re&&ae(re)?re:null,!1),U=U&&ae(U)?U:null,fe(),Et(),Wt(),t.onViewChange?.({...f}),Pe()}function de(m){f=O(m),fe(),t.onViewChange?.({...f}),Pe()}function O(m){return{scale:$n(m.scale,r.minScale,r.maxScale),rotationDeg:_o(m.rotationDeg),translateX:Number.isFinite(m.translateX)?m.translateX:f.translateX,translateY:Number.isFinite(m.translateY)?m.translateY:f.translateY,selectedObjectId:m.selectedObjectId&&ae(m.selectedObjectId)?m.selectedObjectId:null}}function fe(){I&&(I.setAttribute("transform",Kr(d,f)),Yt(),ke())}function W(m,y=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${xn(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:m&&ae(m)?m:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${xn(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),yt(),ke(),y&&(t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),t.onViewChange?.({...f}),Pe())}function ie(m,y=!0){re===m&&y||(re=m&&ae(m)?m:null,yt(),ke(),y&&(t.onHoverChange?.(ae(re)),t.onHoverDetailsChange?.(K(re))))}function $e(){return ae(f.selectedObjectId)}function ae(m){if(!m)return null;let y=wt();return d.objects.find($=>$.objectId===m&&!$.hidden&&y.has($.objectId))??null}function K(m){let y=ae(m);return y?{objectId:y.objectId,object:y.object,renderObject:y,label:d.labels.find($=>$.objectId===y.objectId&&!$.hidden)??null,group:d.groups.find($=>$.renderId===y.groupId)??null,semanticGroups:d.semanticGroups.filter($=>y.semanticGroupIds.includes($.id)),orbit:d.orbitVisuals.find($=>$.objectId===y.objectId&&!$.hidden)??null,relatedOrbits:d.orbitVisuals.filter($=>!$.hidden&&($.objectId===y.objectId||y.ancestorIds.includes($.objectId)||y.childIds.includes($.objectId))),relations:d.relations.filter($=>!$.hidden&&($.fromObjectId===y.objectId||$.toObjectId===y.objectId)),relatedEvents:d.events.filter($=>!$.hidden&&($.targetObjectId===y.objectId||$.objectIds.includes(y.objectId))),parent:ae(y.parentId),children:y.childIds.map($=>ae($)).filter(Boolean),ancestors:y.ancestorIds.map($=>ae($)).filter(Boolean),focusPath:Qe(y.objectId)}:null}function yt(){for(let m of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))m.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Je(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Je(re,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Je(m,y){let $=K(m);if(!$)return;let Z=new Set([$.objectId,...$.renderObject.childIds,...$.renderObject.ancestorIds]);for(let z of Z)for(let F of e.querySelectorAll(`[data-object-id="${xn(z)}"]`))F.classList.add(y.objectClass);for(let z of $.ancestors)for(let F of e.querySelectorAll(`[data-object-id="${xn(z.objectId)}"]`))F.classList.add(y.ancestorClass);for(let z of $.relatedOrbits)for(let F of e.querySelectorAll(`[data-orbit-object-id="${xn(z.objectId)}"]`))F.classList.add(y.orbitClass)}function Ce(m,y){if(!w)return{x:d.width/2,y:d.height/2};let $=w.getBoundingClientRect();return!$.width||!$.height?{x:d.width/2,y:d.height/2}:{x:(m-$.left)/$.width*d.width,y:(y-$.top)/$.height*d.height}}function xe(m,y){return kt(d,f,Ce(m,y))}function wt(){return or(d,o.filter??null)}function Fe(){let m=wt();return d.objects.filter(y=>!y.hidden&&m.has(y.objectId))}function Qe(m){let y=d.objects.find($=>$.objectId===m&&!$.hidden);return y?[...y.ancestorIds,y.objectId].map($=>ae($)).filter(Boolean):[]}function et(m){return d.viewpoints.find(y=>y.id===m)??null}function Ut(m){let y=_o(m.rotationDeg),$=m.scale!==null&&m.scale!==void 0?$n(m.scale,r.minScale,r.maxScale):null,Z=m.objectId&&d.objects.find(F=>F.objectId===m.objectId&&!F.hidden);if(Z)return Ot({x:Z.x,y:Z.y},$??Math.max(1.8,jt.scale),y,m.selectedObjectId??Z.objectId);let z=Ct(d,{...jt,rotationDeg:y},r);return $===null?{...z,rotationDeg:y,selectedObjectId:m.selectedObjectId??null}:Ot({x:d.contentBounds.centerX,y:d.contentBounds.centerY},$,y,m.selectedObjectId??null)}function Ot(m,y,$,Z){let z={x:d.width/2,y:d.height/2},F=ve(m,z,$);return{scale:y,rotationDeg:$,translateX:z.x-(z.x+(F.x-z.x)*y),translateY:z.y-(z.y+(F.y-z.y)*y),selectedObjectId:Z}}function tt(m,y,$){o={...o,filter:ze(m)},$&&(te=null),ye(!1)}function Et(){t.onFilterChange?.(o.filter??null,Fe())}function Wt(){t.onViewpointChange?.(et(te))}function Pe(){t.onAtlasStateChange?.(R.getAtlasState())}function Yt(){!i.minimap||!S||(S.innerHTML=Ao(d,f,Fe()))}function ke(){if(i.tooltipMode==="disabled"||!k){vt(null);return}let m=Ye();if(!m){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),vt(null);return}let y=K(m.objectId);if(!y){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),vt(null);return}let $=To(y);be=m.objectId,k.hidden=!1,k.dataset.mode=m.mode,k.classList.toggle("is-pinned",m.mode==="pinned"),k.style.pointerEvents="auto",k.style.visibility="hidden",Pn(k,$,m.mode),An(k,y.renderObject),k.style.visibility="visible",vt($)}function Ye(){return U&&ae(U)?{objectId:U,mode:"pinned"}:re&&ae(re)?{objectId:re,mode:"hover"}:null}function Pn(m,y,$){let Z=t.tooltipRenderer?.(y,$);m.innerHTML="",typeof Z=="string"?m.innerHTML=Z:Z instanceof HTMLElement?m.append(Z):m.innerHTML=Co(y,$);let z=document.createElement("div");if(z.className="wo-tooltip-actions",$==="pinned"){let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="unpin",F.textContent="Unpin",z.append(F)}else{let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="pin",F.dataset.objectId=y.objectId,F.textContent="Pin",z.append(F)}z.childElementCount>0&&m.append(z)}function An(m,y){if(!w)return;let $={x:y.anchorX??y.x,y:y.anchorY??y.y-Math.max(y.visualRadius,y.radius)},Z=Ln($),z=w.getBoundingClientRect(),F=e.getBoundingClientRect(),Ve=z.left-F.left+Z.x/Math.max(d.width,1)*z.width,Se=z.top-F.top+Z.y/Math.max(d.height,1)*z.height,nt=Math.max(e.clientWidth-m.offsetWidth-12,12),Ht=Math.max(e.clientHeight-m.offsetHeight-12,12),qt=Se>e.clientHeight*.48,Gt=$n(Ve+18,12,nt),hr=$n(qt?Se-m.offsetHeight-18:Se+18,12,Ht);m.style.left=`${Gt}px`,m.style.top=`${hr}px`}function Ln(m){let y={x:d.width/2,y:d.height/2},$=ve(m,y,f.rotationDeg);return{x:y.x+($.x-y.x)*f.scale+f.translateX,y:y.y+($.y-y.y)*f.scale+f.translateY}}function Tn(m){let y=m.target?.closest("[data-tooltip-action]");if(y){switch(m.preventDefault(),m.stopPropagation(),y.dataset.tooltipAction){case"pin":U=y.dataset.objectId??be;break;case"unpin":U=null;break}ke()}}function vt(m){let y=ee?.objectId!==m?.objectId||ee?.description!==m?.description||ee?.imageHref!==m?.imageHref;ee=m,be=m?.objectId??null,y&&t.onTooltipChange?.(m)}}function Sd(e){if(e.scene)return{kind:"scene",value:e.scene};if(e.document)return{kind:"document",value:e.document};if(e.source)return{kind:"source",value:e.source};throw new Error("Interactive viewer requires an initial render input.")}function vn(e,t){switch(e.kind){case"scene":return e.value;case"document":return Ee(e.value,t);case"source":{let n=dt(e.value);return Ee(n.document,Ed(n,t))}}}function Od(e){return{...e,camera:e.camera?{...e.camera}:null,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme,activeEventId:e.activeEventId??null}}function Vo(e,t){return{...e,...t,camera:t.camera!==void 0?t.camera?{...t.camera}:null:e.camera?{...e.camera}:null,filter:t.filter!==void 0?ze(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function Ro(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.camera!==void 0||e.scaleModel!==void 0||e.activeEventId!==void 0}function Ed(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function zo(e,t,n){let{center:r,distance:i}=Bo(n);return{startState:{...t},startCenter:kt(e,t,r),startViewportCenter:r,startDistance:i}}function Bo(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[n,r]=t;return{center:{x:(n.x+r.x)/2,y:(n.y+r.y)/2},distance:Math.hypot(r.x-n.x,r.y-n.y)}}function cr(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function Md(e){if(typeof window>"u"||typeof document>"u")throw new Error("createInteractiveViewer can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("Interactive viewer requires an HTMLElement container.")}function $n(e,t,n){return Math.min(Math.max(e,t),n)}function _o(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function xn(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Dd(){if(typeof document>"u"||document.getElementById(Fo))return;let e=document.createElement("style");e.id=Fo,e.textContent=`
118
126
  .wo-viewer-tooltip-root {
119
127
  position: absolute;
120
128
  z-index: 12;
@@ -180,73 +188,78 @@
180
188
  padding: 6px 12px;
181
189
  font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
182
190
  }
183
- `,document.head.append(e)}function ci(e){return encodeURIComponent(JSON.stringify(e))}function Pn(e,t,r={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:r.initialViewpointId,initialSelectionObjectId:r.initialSelectionObjectId,initialFilter:r.initialFilter??null,atlasState:r.atlasState??null,minimap:r.minimap}}}function Cn(e,t={}){let r={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},n=Fe(e.scene,{theme:r.options?.theme,layers:r.options?.layers,filter:r.options?.initialFilter??null,selectedObjectId:r.options?.initialSelectionObjectId??null,subtitle:r.options?.subtitle,preset:r.options?.preset});return`<div class="${Hr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Hr(r.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Hr(r.options?.initialViewpointId??"")}" data-worldorbit-payload="${Hr(ci(r))}">${n}</div>`}function Hr(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function dr(e,t={}){try{let r=We(e),n=ye(r.document,Dc(r,t));return(t.mode??"static")==="interactive"?Cn(Pn(n,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${Mc(t.className??"worldorbit-block worldorbit-static")}">${Fe(n,t)}</figure>`}catch(r){if(t.strict)throw r;return di(r instanceof Error?r.message:String(r))}}function di(e){return`<pre class="worldorbit-error">WorldOrbit error: ${ui(e)}</pre>`}function ui(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function Mc(e){return ui(e).replaceAll('"',"&quot;")}function Dc(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}var pi="worldorbit-editor-style",Lc=120,Tc=16,Ac=96,Lt=1495978707e-1,gi=6371,hi=695700,bi=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),Ec=new Set(["star","planet","moon","asteroid","comet"]),Fn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Pc=["kind","class","culture","color","image","atmosphere","on","source"],Cc=["radius","mass","density","gravity","temperature","inner","outer","cycle"],Fc=["albedo"],Vc={"defaults-view":{description:"Sets the default camera projection for the atlas.",references:["Topdown = map-like","Isometric = angled overview"]},"defaults-scale":{description:"Chooses the overall spacing/style preset used by the renderer.",references:["diagram = tighter","presentation = roomier"]},"defaults-units":{description:"Stores a document-wide note about the unit style you want to use.",references:["Example: metric","Example: lore-standard"]},"viewpoint-projection":{description:"Overrides the projection for this saved viewpoint.",references:["Topdown = flat orbital map","Isometric = angled scene"]},"viewpoint-zoom":{description:"Controls how closely this viewpoint frames the system.",references:["1 = scene fit","2+ = close-up"]},"viewpoint-rotation":{description:"Rotates the saved camera angle in degrees.",references:["90deg = quarter turn","180deg = flip"]},"placement-target":{description:"Names the body or reference this object is attached to.",references:["orbit Primary","surface Homeworld","at Naar:L4"]},"placement-free":{description:"Stores a free-placement offset or a descriptive label for loose placement.",references:["8au = far from the star",'"outer system" = descriptive note']},"placement-distance":{description:"Mean orbit distance from the target body.",references:["1 au = Earth-Sun distance","384400km = Earth-Moon distance"]},"placement-semiMajor":{description:"Semi-major axis of an orbit, used for elliptical orbits.",references:["1 au = Earth-Sun distance","Use this instead of distance when orbit shape matters"]},"placement-eccentricity":{description:"Controls how stretched the orbit is. Lower is rounder.",references:["0 = circular orbit","0.1 = mildly elliptical"]},"placement-period":{description:"How long one orbit takes.",references:["1 y = one Earth year","27.3d = Moon around Earth"]},"placement-angle":{description:"Rotates the orbit ellipse within the scene.",references:["0deg = default orientation","90deg = quarter turn"]},"placement-inclination":{description:"Tilts the orbit relative to the main orbital plane.",references:["0deg = same plane","5deg = slight tilt"]},"placement-phase":{description:"Starting position of the object along its orbit.",references:["0deg = start position","180deg = opposite side"]},"prop-radius":{description:"Visual body size or real-world-inspired radius value.",references:["1re = Earth radius","1sol = Sun radius"]},"prop-mass":{description:"Optional mass value for the body.",references:["1me = Earth mass","1sol = Sun mass"]},"prop-gravity":{description:"Surface gravity or a custom gravity marker.",references:["1g = Earth-like gravity","0.16g = Moon-like gravity"]},"prop-temperature":{description:"Typical temperature or narrative temperature marker.",references:["288K = Earth-like average","1200K = very hot world"]},"prop-atmosphere":{description:"Short atmosphere descriptor for the object.",references:['"nitrogen-oxygen"','"methane haze"']},"prop-inner":{description:"Inner edge for a belt, ring, or broad phenomenon.",references:["120000km = ring inner edge","2au = belt starts here"]},"prop-outer":{description:"Outer edge for a belt, ring, or broad phenomenon.",references:["190000km = ring outer edge","3au = belt ends here"]}};function yi(e,t={}){jd(e),Sd();let r=Rc(t),n=r.atlasDocument,o=r.source,i=o,l=o,a=r.diagnostics,s=n.objects[0]?{kind:"object",id:n.objects[0].id}:{kind:"system"},p=[],c=[],u=null,v=!1,x=!1,k=!1,I=null,V=null,$="",S="",E=new Map,X=t.showTextPane??!0,W=t.showInspector??!0,U=t.showPreview??!0,H=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(W),e.dataset.woShowTextPane=String(X),e.dataset.woShowPreview=String(U),e.innerHTML=Bc();let C=fe(e,"[data-editor-toolbar]"),ie=fe(e,"[data-editor-outline]"),J=fe(e,"[data-editor-stage-shell]"),ee=fe(e,"[data-editor-stage]"),K=fe(e,"[data-editor-overlay]"),Te=fe(e,"[data-editor-diagnostics]"),Je=fe(e,"[data-editor-source-diagnostics]"),Ve=fe(e,"[data-editor-status]"),pt=fe(e,"[data-editor-live]"),F=fe(e,"[data-editor-inspector]"),te=fe(e,"[data-editor-source]"),Qe=fe(e,"[data-editor-preview-visual]"),D=fe(e,"[data-editor-preview-markup]"),O=null;O=St(ee,{source:o,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:n.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(d){if(v||!d){!v&&s?.kind==="object"&&Ae(null,!1,!0);return}Ae({kind:"object",id:d.objectId},!1,!0)},onViewChange(){ve()}}),C.addEventListener("click",hr),ie.addEventListener("click",br),K.addEventListener("pointerdown",Y),F?.addEventListener("input",yr),F?.addEventListener("change",wr),te?.addEventListener("input",f),te?.addEventListener("change",h),te?.addEventListener("blur",h),e.addEventListener("keydown",w),window.addEventListener("pointermove",R),window.addEventListener("pointerup",P),window.addEventListener("pointercancel",P);let j={setSource(d){et(d,!1)&&(q(),Be())},setAtlasDocument(d){Z(d,!1,s,!1),q(),Be()},getSource(){return o},getAtlasDocument(){return z(n)},getDiagnostics(){return a.map(Zr)},getSelection(){return s?{path:{...s}}:null},isDirty(){return k},markSaved(){At(!0)},selectPath(d){Ae(d,!0,!0)},canUndo(){return p.length>0},canRedo(){return c.length>0},undo(){let d=p.pop();return d?(c.unshift(ae()),Q(d),!0):!1},redo(){let d=c.shift();return d?(p.push(ae()),Q(d),!0):!1},addObject(d="planet"){let m=Gr(d,n.objects.map(L=>L.id)),g=Qc(d,m,n),b=ed(n,g);return Z(b,!0,{kind:"object",id:m}),m},addViewpoint(){let d=Gr("viewpoint",n.system?.viewpoints.map(b=>b.id)??[]),m={id:d,label:Kr(d),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.system?.defaults.view??"topdown",preset:n.system?.defaults.preset??null,zoom:null,rotationDeg:0,layers:{},filter:null},g=z(n);return g.system?.viewpoints.push(m),g.system?.viewpoints.sort((b,L)=>b.id.localeCompare(L.id)),Z(g,!0,{kind:"viewpoint",id:d}),d},addAnnotation(){let d=Gr("annotation",n.system?.annotations.map(b=>b.id)??[]),m={id:d,label:Kr(d),targetObjectId:null,body:"",tags:[],sourceObjectId:null},g=z(n);return g.system?.annotations.push(m),g.system?.annotations.sort((b,L)=>b.id.localeCompare(L.id)),Z(g,!0,{kind:"annotation",id:d}),d},addMetadata(d,m){let g=d?.trim()||Gr("metadata",Object.keys(n.system?.atlasMetadata??{})),b=z(n);return b.system&&(b.system.atlasMetadata[g]=m??""),Z(b,!0,{kind:"metadata",key:g}),g},removeSelection(){if(!s||s.kind==="system"||s.kind==="defaults")return!1;let d=nd(n,s);return Z(d,!0,{kind:"system"}),!0},exportSvg(){return O.exportSvg()},exportEmbedMarkup(){return mi(Se(),n)},destroy(){x||(x=!0,C.removeEventListener("click",hr),ie.removeEventListener("click",br),K.removeEventListener("pointerdown",Y),F?.removeEventListener("input",yr),F?.removeEventListener("change",wr),te?.removeEventListener("input",f),te?.removeEventListener("change",h),te?.removeEventListener("blur",h),e.removeEventListener("keydown",w),window.removeEventListener("pointermove",R),window.removeEventListener("pointerup",P),window.removeEventListener("pointercancel",P),me(),gr(),O.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Me(!0),se(!0),j;function ae(){return{atlasDocument:z(n),selection:s?{...s}:null,source:o}}function q(){p.length=0,c.length=0,Be()}function me(){I!==null&&(window.clearTimeout(I),I=null)}function gr(){V!==null&&(window.clearTimeout(V),V=null)}function Se(){return u?.changed?xe(n,{schema:"2.0"}):o}function se(d=!1){let m=i!==l||o!==l||u?.changed===!0;!d&&m===k||(k=m,Bt(),t.onDirtyChange?.(k))}function At(d=!1){i=o,mt(),l=o,se(d)}function Q(d){me(),n=z(d.atlasDocument),o=d.source,i=o,a=Ze(n),s=tt(d.selection),Re({preserveCamera:!0,applyViewpointSelection:s?.kind==="viewpoint"}),Ae(s,!1,!1),Me(),se(),Oe()}function Z(d,m,g,b=!1){m&&(p.push(ae()),c.length=0),me(),n=z(d),o=xe(n,{schema:"2.0"}),b||(i=o),a=Ze(n),s=tt(g),Re({preserveCamera:s?.kind!=="viewpoint",applyViewpointSelection:s?.kind==="viewpoint"}),Ae(s,!1,!1),Me(),se(),Oe()}function et(d,m){i=d,te&&te.value!==d&&(te.value=d);let g=nr(d);if(!g.ok||!g.value)return a=g.diagnostics.map(A=>({diagnostic:A,path:null})),Et(),ft(),_e(),Ne(),Bt(),vr(),se(),t.onDiagnosticsChange?.(a.map(Zr)),!1;let b=g.value.atlasDocument??it(g.value.document),L=rr(b,g.diagnostics);return m&&(p.push(ae()),c.length=0,i=xe(b,{schema:"2.0"})),n=z(b),o=xe(n,{schema:"2.0"}),a=vi(L,Ze(n)),s=tt(s),Re({preserveCamera:s?.kind!=="viewpoint",applyViewpointSelection:s?.kind==="viewpoint"}),Me(),se(),Oe(),!0}function Re(d={}){if(!O)return;let m=O.getState(),g=O.getRenderOptions(),b=n.system?.defaults.preset??"atlas-card";v=!0,(g.preset!==b||g.projection!=="document")&&O.setRenderOptions({preset:b,projection:"document"}),O.setDocument(Zt(n)),d.applyViewpointSelection&&s?.kind==="viewpoint"&&s.id?O.goToViewpoint(s.id):d.preserveCamera!==!1?O.setState({...m,selectedObjectId:s?.kind==="object"?s.id??null:null}):s?.kind==="object"&&s.id&&O.focusObject(s.id),v=!1}function Oe(){let d={source:o,atlasDocument:z(n),diagnostics:a.map(Zr),selection:s?{path:{...s}}:null};t.onDiagnosticsChange?.(d.diagnostics),t.onSelectionChange?.(d.selection),t.onChange?.(d)}function Ae(d,m,g=!0){s=tt(d),m&&(v=!0,s?.kind==="object"&&s.id?O.focusObject(s.id):s?.kind==="viewpoint"&&s.id&&O.goToViewpoint(s.id),v=!1),Be(),_e(),F?.contains(document.activeElement)||Ne(),ve(),Bt(),vr(),g&&t.onSelectionChange?.(s?{path:{...s}}:null)}function tt(d){if(!d)return null;let m=bn(n,d);return m==null?d.kind==="system"||d.kind==="defaults"?d:null:d}function Me(d=!1){Be(),_e(),Et(),ft(),F?.contains(document.activeElement)||Ne(),mt(),Pt(d),ve(),Bt(),vr()}function Be(){let d=C.querySelector("[data-editor-add-object-type]")?.value??"planet";C.innerHTML=`
191
+ `,document.head.append(e)}function No(e){return encodeURIComponent(JSON.stringify(e))}function ei(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function ti(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=qe(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${lr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${lr(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${lr(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${lr(No(n))}">${r}</div>`}function lr(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function In(e,t={}){try{let n=dt(e),r=Ee(n.document,Ld(n,t));return(t.mode??"static")==="interactive"?ti(ei(r,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${Ad(t.className??"worldorbit-block worldorbit-static")}">${qe(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Uo(n instanceof Error?n.message:String(n))}}function Uo(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Wo(e)}</pre>`}function Wo(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function Ad(e){return Wo(e).replaceAll('"',"&quot;")}function Ld(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}var Yo="worldorbit-editor-style",Td=120,Cd=16,Fd=96,Nt=1495978707e-1,Ko=6371,Zo=695700,ri=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),Vd=new Set(["star","planet","moon","asteroid","comet"]),oi=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Rd=["kind","class","culture","color","image","atmosphere","on","source"],zd=["radius","mass","density","gravity","temperature","inner","outer","cycle"],_d=["albedo"],Bd={"defaults-view":{description:"Sets the default camera projection for the atlas.",references:["Topdown = map-like","Isometric = angled overview","Orthographic/Perspective = 3D-ready semantic views"]},"defaults-scale":{description:"Chooses the overall spacing/style preset used by the renderer.",references:["diagram = tighter","presentation = roomier"]},"defaults-units":{description:"Stores a document-wide note about the unit style you want to use.",references:["Example: metric","Example: lore-standard"]},"viewpoint-projection":{description:"Overrides the projection for this saved viewpoint.",references:["Topdown = flat orbital map","Isometric = angled scene","Orthographic/Perspective = stored with current 2D fallback"]},"viewpoint-zoom":{description:"Controls how closely this viewpoint frames the system.",references:["1 = scene fit","2+ = close-up"]},"viewpoint-rotation":{description:"Legacy 2D screen rotation. This is separate from the Schema 2.5 camera block.",references:["90deg = quarter turn","Use camera.azimuth for semantic view direction"]},"viewpoint-camera-azimuth":{description:"Horizontal camera direction in degrees for Schema 2.5 viewpoints.",references:["0 = forward/default","90 = quarter orbit around the scene"]},"viewpoint-camera-elevation":{description:"Vertical camera tilt in degrees for 3D-ready viewpoints.",references:["0 = level","30 = gentle look down"]},"viewpoint-camera-roll":{description:"Rolls the camera around its forward axis.",references:["0 = upright","15 = slight bank"]},"viewpoint-camera-distance":{description:"Semantic camera distance for perspective viewpoints.",references:["4 = close","12 = wide framing"]},"viewpoint-events":{description:"Lists event IDs that this viewpoint should feature in its detail panel.",references:["solar-eclipse-naar","transit-window conjunction"]},"event-kind":{description:"Short semantic event type for tooling and viewer overlays.",references:["solar-eclipse","lunar-eclipse","transit"]},"event-target":{description:"Primary object this event is centered on.",references:["Naar","Seyra"]},"event-participants":{description:"Objects that participate in the event snapshot or description.",references:["Iyath Naar Seyra","Naar Seyra Orun"]},"event-timing":{description:"Free-text timing note for the event.",references:['"Every late bloom season"','"At local midyear"']},"event-visibility":{description:"Notes where or how the event is visible.",references:['"Visible from Naar"','"Southern hemisphere only"']},"event-epoch":{description:"Optional event-wide epoch that event poses inherit unless they override it.",references:['"JY-0001.0"','"Naar bloom cycle year 18"']},"event-referencePlane":{description:"Optional event-wide reference plane for all poses in this snapshot.",references:["ecliptic","naar-equatorial"]},"event-viewpoints":{description:"Viewpoint IDs that should list this event prominently.",references:["naar-system","overview inner-system"]},"placement-target":{description:"Names the body or reference this object is attached to.",references:["orbit Primary","surface Homeworld","at Naar:L4"]},"placement-free":{description:"Stores a free-placement offset or a descriptive label for loose placement.",references:["8au = far from the star",'"outer system" = descriptive note']},"placement-distance":{description:"Mean orbit distance from the target body.",references:["1 au = Earth-Sun distance","384400km = Earth-Moon distance"]},"placement-semiMajor":{description:"Semi-major axis of an orbit, used for elliptical orbits.",references:["1 au = Earth-Sun distance","Use this instead of distance when orbit shape matters"]},"placement-eccentricity":{description:"Controls how stretched the orbit is. Lower is rounder.",references:["0 = circular orbit","0.1 = mildly elliptical"]},"placement-period":{description:"How long one orbit takes.",references:["1 y = one Earth year","27.3d = Moon around Earth"]},"placement-angle":{description:"Rotates the orbit ellipse within the scene.",references:["0deg = default orientation","90deg = quarter turn"]},"placement-inclination":{description:"Tilts the orbit relative to the main orbital plane.",references:["0deg = same plane","5deg = slight tilt"]},"placement-phase":{description:"Starting position of the object along its orbit.",references:["0deg = start position","180deg = opposite side"]},"pose-epoch":{description:"Overrides the effective epoch for this pose only.",references:['"JY-0001.0"',"Falls back to event, object, then system"]},"pose-referencePlane":{description:"Overrides the effective reference plane for this pose only.",references:["naar-equatorial","Falls back to event, object, then system"]},"prop-radius":{description:"Visual body size or real-world-inspired radius value.",references:["1re = Earth radius","1sol = Sun radius"]},"prop-mass":{description:"Optional mass value for the body.",references:["1me = Earth mass","1sol = Sun mass"]},"prop-gravity":{description:"Surface gravity or a custom gravity marker.",references:["1g = Earth-like gravity","0.16g = Moon-like gravity"]},"prop-temperature":{description:"Typical temperature or narrative temperature marker.",references:["288K = Earth-like average","1200K = very hot world"]},"prop-atmosphere":{description:"Short atmosphere descriptor for the object.",references:['"nitrogen-oxygen"','"methane haze"']},"prop-inner":{description:"Inner edge for a belt, ring, or broad phenomenon.",references:["120000km = ring inner edge","2au = belt starts here"]},"prop-outer":{description:"Outer edge for a belt, ring, or broad phenomenon.",references:["190000km = ring outer edge","3au = belt ends here"]}};function Jo(e,t={}){zu(e),_u();let n=Nd(t),r=n.atlasDocument,i=n.source,o=i,s=i,c=n.diagnostics,a=r.objects[0]?{kind:"object",id:r.objects[0].id}:{kind:"system"},l=[],d=[],f=null,w=!1,I=!1,S=!1,k=null,C=null,Y="",v="",P=new Map,ne=t.showTextPane??!0,X=t.showInspector??!0,Q=t.showPreview??!0,re=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(X),e.dataset.woShowTextPane=String(ne),e.dataset.woShowPreview=String(Q),e.innerHTML=Ud();let U=je(e,"[data-editor-toolbar]"),be=je(e,"[data-editor-outline]"),ee=je(e,"[data-editor-stage-shell]"),te=je(e,"[data-editor-stage]"),q=je(e,"[data-editor-overlay]"),we=je(e,"[data-editor-diagnostics]"),le=je(e,"[data-editor-source-diagnostics]"),De=je(e,"[data-editor-status]"),We=je(e,"[data-editor-live]"),D=je(e,"[data-editor-inspector]"),oe=je(e,"[data-editor-source]"),Ze=je(e,"[data-editor-preview-visual]"),bt=je(e,"[data-editor-preview-markup]"),T=null;T=_t(te,{source:i,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:r.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(u){let p=a?ni(a):null;if(w||!u){w||(a?.kind==="event-pose"&&a.id?xe({kind:"event",id:a.id},!1,!0):a?.kind==="object"?xe(p?{kind:"event",id:p}:null,!1,!0):a?.kind==="event"&&a.id&&xe({kind:"event",id:a.id},!1,!0));return}if(p&&na(r,p,u.objectId)){xe({kind:"event-pose",id:p,key:u.objectId},!1,!0);return}xe({kind:"object",id:u.objectId},!1,!0)},onViewChange(){Pe()}}),U.addEventListener("click",Pn),be.addEventListener("click",An),q.addEventListener("pointerdown",z),D?.addEventListener("click",Ln),D?.addEventListener("input",Tn),D?.addEventListener("change",vt),oe?.addEventListener("input",y),oe?.addEventListener("change",$),oe?.addEventListener("blur",$),e.addEventListener("keydown",Z),window.addEventListener("pointermove",F),window.addEventListener("pointerup",Ve),window.addEventListener("pointercancel",Ve);let R={setSource(u){yt(u,!1)&&(de(),Qe())},setAtlasDocument(u){K(u,!1,a,!1),de(),Qe()},getSource(){return i},getAtlasDocument(){return N(r)},getDiagnostics(){return c.map(pr)},getSelection(){return a?{path:{...a}}:null},isDirty(){return S},markSaved(){$e(!0)},selectPath(u){xe(u,!0,!0)},canUndo(){return l.length>0},canRedo(){return d.length>0},undo(){let u=l.pop();return u?(d.unshift(ye()),ae(u),!0):!1},redo(){let u=d.shift();return u?(l.push(ye()),ae(u),!0):!1},addObject(u="planet"){let p=Sn(u,r.objects.map(j=>j.id)),h=cu(u,p,r),g=lu(r,h);return K(g,!0,{kind:"object",id:p}),p},addEvent(){let u=Sn("event",r.events.map(g=>g.id)),p={id:u,kind:"",label:On(u),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},h=N(r);return h.events.push(p),h.events.sort(Go),K(h,!0,{kind:"event",id:u}),u},addViewpoint(){let u=Sn("viewpoint",r.system?.viewpoints.map(g=>g.id)??[]),p={id:u,label:On(u),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:r.system?.defaults.view??"topdown",preset:r.system?.defaults.preset??null,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null},h=N(r);return h.system?.viewpoints.push(p),h.system?.viewpoints.sort((g,j)=>g.id.localeCompare(j.id)),K(h,!0,{kind:"viewpoint",id:u}),u},addAnnotation(){let u=Sn("annotation",r.system?.annotations.map(g=>g.id)??[]),p={id:u,label:On(u),targetObjectId:null,body:"",tags:[],sourceObjectId:null},h=N(r);return h.system?.annotations.push(p),h.system?.annotations.sort((g,j)=>g.id.localeCompare(j.id)),K(h,!0,{kind:"annotation",id:u}),u},addMetadata(u,p){let h=u?.trim()||Sn("metadata",Object.keys(r.system?.atlasMetadata??{})),g=N(r);return g.system&&(g.system.atlasMetadata[h]=p??""),K(g,!0,{kind:"metadata",key:h}),h},removeSelection(){if(!a||a.kind==="system"||a.kind==="defaults")return!1;let u=pu(r,a);return K(u,!0,{kind:"system"}),!0},exportSvg(){return T.exportSvg()},exportEmbedMarkup(){return qo(W(),r)},destroy(){I||(I=!0,U.removeEventListener("click",Pn),be.removeEventListener("click",An),q.removeEventListener("pointerdown",z),D?.removeEventListener("click",Ln),D?.removeEventListener("input",Tn),D?.removeEventListener("change",vt),oe?.removeEventListener("input",y),oe?.removeEventListener("change",$),oe?.removeEventListener("blur",$),e.removeEventListener("keydown",Z),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",Ve),window.removeEventListener("pointercancel",Ve),O(),fe(),T.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Fe(!0),ie(!0),R;function ye(){return{atlasDocument:N(r),selection:a?{...a}:null,source:i}}function de(){l.length=0,d.length=0,Qe()}function O(){k!==null&&(window.clearTimeout(k),k=null)}function fe(){C!==null&&(window.clearTimeout(C),C=null)}function W(){return f?.changed?mt(r):i}function ie(u=!1){let p=o!==s||i!==s||f?.changed===!0;!u&&p===S||(S=p,Xt(),t.onDirtyChange?.(S))}function $e(u=!1){o=i,Et(),s=i,ie(u)}function ae(u){O(),r=N(u.atlasDocument),i=u.source,o=i,c=ht(r),a=wt(u.selection),Je({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),xe(a,!1,!1),Fe(),ie(),Ce()}function K(u,p,h,g=!1){p&&(l.push(ye()),d.length=0),O(),r=N(u),i=mt(r),g||(o=i),c=ht(r),a=wt(h),Je({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),xe(a,!1,!1),Fe(),ie(),Ce()}function yt(u,p){o=u,oe&&oe.value!==u&&(oe.value=u);let h=gn(u);if(!h.ok||!h.value)return c=h.diagnostics.map(E=>({diagnostic:E,path:null})),Ut(),Ot(),et(),tt(),Xt(),Cn(),ie(),t.onDiagnosticsChange?.(c.map(pr)),!1;let g=h.value.atlasDocument??xt(h.value.document),j=hn(g,h.diagnostics);return p&&(l.push(ye()),d.length=0,o=mt(g)),r=N(g),i=mt(r),c=ea(j,ht(r)),a=wt(a),Je({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),Fe(),ie(),Ce(),!0}function Je(u={}){if(!T)return;let p=T.getState(),h=T.getRenderOptions(),g=r.system?.defaults.preset??"atlas-card",j=a?ni(a):null;w=!0,(h.preset!==g||h.projection!=="document"||(h.activeEventId??null)!==j)&&T.setRenderOptions({preset:g,projection:"document",activeEventId:j}),T.setDocument(dn(r)),u.applyViewpointSelection&&a?.kind==="viewpoint"&&a.id?T.goToViewpoint(a.id):u.preserveCamera!==!1?T.setState({...p,selectedObjectId:a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null}):a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key&&T.focusObject(a.key),w=!1}function Ce(){let u={source:i,atlasDocument:N(r),diagnostics:c.map(pr),selection:a?{path:{...a}}:null};t.onDiagnosticsChange?.(u.diagnostics),t.onSelectionChange?.(u.selection),t.onChange?.(u)}function xe(u,p,h=!0){a=wt(u),p&&(w=!0,T.setRenderOptions({activeEventId:a?ni(a):null}),a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key?T.focusObject(a.key):a?.kind==="viewpoint"&&a.id&&T.goToViewpoint(a.id),w=!1),Qe(),et(),D?.contains(document.activeElement)||tt(),Pe(),Xt(),Cn(),h&&t.onSelectionChange?.(a?{path:{...a}}:null)}function wt(u){if(!u)return null;let p=Vr(r,u);return p==null?u.kind==="system"||u.kind==="defaults"?u:null:u}function Fe(u=!1){Qe(),et(),Ut(),Ot(),D?.contains(document.activeElement)||tt(),Et(),Wt(u),Pe(),Xt(),Cn()}function Qe(){let u=U.querySelector("[data-editor-add-object-type]")?.value??"planet";U.innerHTML=`
184
192
  <div class="wo-editor-toolbar-group">
185
193
  <select data-editor-add-object-type>
186
- ${Fn.map(m=>`<option value="${T(m)}"${m===d?" selected":""}>${T(Kr(m))}</option>`).join("")}
194
+ ${oi.map(p=>`<option value="${L(p)}"${p===u?" selected":""}>${L(On(p))}</option>`).join("")}
187
195
  </select>
188
196
  <button type="button" data-editor-action="add-object">Add object</button>
197
+ <button type="button" data-editor-action="add-event">Add event</button>
189
198
  <button type="button" data-editor-action="add-viewpoint">Add viewpoint</button>
190
199
  <button type="button" data-editor-action="add-annotation">Add annotation</button>
191
200
  <button type="button" data-editor-action="add-metadata">Add metadata</button>
192
201
  </div>
193
202
  <div class="wo-editor-toolbar-group">
194
- <button type="button" data-editor-action="remove"${!s||s.kind==="system"||s.kind==="defaults"?" disabled":""}>Remove</button>
195
- <button type="button" data-editor-action="undo"${p.length===0?" disabled":""}>Undo</button>
196
- <button type="button" data-editor-action="redo"${c.length===0?" disabled":""}>Redo</button>
203
+ <button type="button" data-editor-action="remove"${!a||a.kind==="system"||a.kind==="defaults"?" disabled":""}>Remove</button>
204
+ <button type="button" data-editor-action="undo"${l.length===0?" disabled":""}>Undo</button>
205
+ <button type="button" data-editor-action="redo"${d.length===0?" disabled":""}>Redo</button>
197
206
  <button type="button" data-editor-action="format">Format source</button>
198
207
  </div>
199
- `}function _e(){let d=ut(s),m=fd(a),g=Object.entries(n.system?.atlasMetadata??{}).sort(([b],[L])=>b.localeCompare(L));ie.innerHTML=`
208
+ `}function et(){let u=Ke(a),p=xu(c),h=Object.entries(r.system?.atlasMetadata??{}).sort(([g],[j])=>g.localeCompare(j));be.innerHTML=`
200
209
  <div class="wo-editor-outline-section">
201
210
  <h3>Atlas</h3>
202
- ${Mt({kind:"system"},"System",d,m)}
203
- ${Mt({kind:"defaults"},"Defaults",d,m)}
211
+ ${Xe({kind:"system"},"System",u,p)}
212
+ ${Xe({kind:"defaults"},"Defaults",u,p)}
204
213
  </div>
205
214
  <div class="wo-editor-outline-section">
206
215
  <h3>Metadata</h3>
207
- ${g.length>0?g.map(([b])=>Mt({kind:"metadata",key:b},b,d,m)).join(""):'<p class="wo-editor-empty">No atlas metadata yet.</p>'}
216
+ ${h.length>0?h.map(([g])=>Xe({kind:"metadata",key:g},g,u,p)).join(""):'<p class="wo-editor-empty">No atlas metadata yet.</p>'}
208
217
  </div>
209
218
  <div class="wo-editor-outline-section">
210
219
  <h3>Viewpoints</h3>
211
- ${(n.system?.viewpoints.length??0)>0?n.system?.viewpoints.map(b=>Mt({kind:"viewpoint",id:b.id},b.label,d,m)).join(""):'<p class="wo-editor-empty">No viewpoints yet.</p>'}
220
+ ${(r.system?.viewpoints.length??0)>0?r.system?.viewpoints.map(g=>Xe({kind:"viewpoint",id:g.id},g.label,u,p)).join(""):'<p class="wo-editor-empty">No viewpoints yet.</p>'}
212
221
  </div>
213
222
  <div class="wo-editor-outline-section">
214
223
  <h3>Annotations</h3>
215
- ${(n.system?.annotations.length??0)>0?n.system?.annotations.map(b=>Mt({kind:"annotation",id:b.id},b.label,d,m)).join(""):'<p class="wo-editor-empty">No annotations yet.</p>'}
224
+ ${(r.system?.annotations.length??0)>0?r.system?.annotations.map(g=>Xe({kind:"annotation",id:g.id},g.label,u,p)).join(""):'<p class="wo-editor-empty">No annotations yet.</p>'}
225
+ </div>
226
+ <div class="wo-editor-outline-section">
227
+ <h3>Events</h3>
228
+ ${r.events.length>0?r.events.map(g=>Gd(g,u,p)).join(""):'<p class="wo-editor-empty">No events yet.</p>'}
216
229
  </div>
217
230
  <div class="wo-editor-outline-section">
218
231
  <h3>Objects</h3>
219
- ${n.objects.length>0?n.objects.map(b=>Mt({kind:"object",id:b.id},`${b.id} - ${b.type}`,d,m)).join(""):'<p class="wo-editor-empty">No objects yet.</p>'}
232
+ ${r.objects.length>0?r.objects.map(g=>Xe({kind:"object",id:g.id},`${g.id} - ${g.type}`,u,p)).join(""):'<p class="wo-editor-empty">No objects yet.</p>'}
220
233
  </div>
221
- `}function Et(){Te.innerHTML=a.length===0?'<p class="wo-editor-empty">No diagnostics.</p>':a.map(d=>{let m=d.path?qr(d.path):"Source",g=fi(d);return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${T(d.diagnostic.severity)}">
222
- <strong>${T(d.diagnostic.severity.toUpperCase())}</strong>
223
- <span>${T(m)}${g?` \xB7 ${T(g)}`:""}</span>
224
- <p>${T(d.diagnostic.message)}</p>
225
- </article>`}).join("")}function ft(){let d=a.filter(m=>!m.path||m.diagnostic.line!==void 0);Je.innerHTML=d.length===0?'<p class="wo-editor-empty">No source diagnostics.</p>':d.map(m=>{let g=fi(m)??"Source";return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${T(m.diagnostic.severity)}">
226
- <strong>${T(m.diagnostic.severity.toUpperCase())}</strong>
227
- <span>${T(g)}</span>
228
- <p>${T(m.diagnostic.message)}</p>
229
- </article>`}).join("")}function Ne(){if(!F)return;Nc(F,E);let d={selection:s?{path:{...s}}:null,system:n.system,viewpoints:n.system?.viewpoints??[],objects:n.objects};if(!s){F.innerHTML='<p class="wo-editor-empty">Select an atlas node or object to edit it.</p>';return}let m=Mi(s,a);switch(s.kind){case"system":F.innerHTML=m+Wc(d),Ot(F,E),gt(s,a);return;case"defaults":F.innerHTML=m+Hc(d),Ot(F,E),gt(s,a);return;case"metadata":F.innerHTML=m+Yc(d,s.key??""),Ot(F,E),gt(s,a);return;case"viewpoint":F.innerHTML=m+qc(d,s.id??""),Ot(F,E),gt(s,a);return;case"annotation":F.innerHTML=m+Gc(d,s.id??""),Ot(F,E),gt(s,a);return;case"object":F.innerHTML=m+Xc(d,s.id??""),Ot(F,E),gt(s,a);return}}function mt(){te&&te.value!==i&&(te.value=i)}function Pt(d=!1){if(d){Rn();return}Vn()}function ve(){if(!O||(K.innerHTML="",s?.kind!=="object"||!s.id))return;let d=O.getObjectDetails(s.id);if(!d)return;if(Ct(d.renderObject.x,d.renderObject.y,d.renderObject.objectId),d.parent&&Ct(d.parent.x,d.parent.y,`Parent: ${d.parent.objectId}`,!0),d.renderObject.anchorX!==void 0&&d.renderObject.anchorY!==void 0&&Ct(d.renderObject.anchorX,d.renderObject.anchorY,"Anchor",!0),d.object.placement?.mode==="orbit"&&d.orbit){let g=Ee({x:d.renderObject.x,y:d.renderObject.y});K.append(pr("orbit-phase",d.objectId,g,"Phase"));let b=ge(d);K.append(pr("orbit-radius",d.objectId,b,"Size"))}if(d.object.placement?.mode==="at"){K.append(pr("at-reference",d.objectId,Ee({x:d.renderObject.x,y:d.renderObject.y}),"Reference"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag to an object center or nearby Lagrange point.",K.append(g)}if(d.object.placement?.mode==="surface"){K.append(pr("surface-target",d.objectId,Ee({x:d.renderObject.x,y:d.renderObject.y}),"Surface"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag onto another surface-capable body.",K.append(g)}if(d.object.placement?.mode==="free"){K.append(pr("free-distance",d.objectId,Ee({x:d.renderObject.x,y:d.renderObject.y}),"Offset"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag horizontally to change free offset.",K.append(g)}let m=Oi(s,a).slice(0,3);if(m.length>0){let g=document.createElement("div");g.className="wo-editor-overlay-diagnostics",g.setAttribute("role","status"),g.setAttribute("aria-live","polite"),g.innerHTML=m.map(b=>`<article class="wo-editor-overlay-diagnostic wo-editor-overlay-diagnostic-${T(b.diagnostic.severity)}">
230
- <strong>${T(b.diagnostic.severity.toUpperCase())}</strong>
231
- <p>${T(b.diagnostic.message)}</p>
232
- </article>`).join(""),K.append(g)}}function Ct(d,m,g,b=!1){let L=Ee({x:d,y:m}),A=document.createElement("div");A.className=`wo-editor-hint${b?" is-subtle":""}`,A.style.left=`${L.x}px`,A.style.top=`${L.y}px`,A.textContent=g,K.append(A)}function ge(d){let m=d.orbit;if(!m)return Ee({x:d.renderObject.x,y:d.renderObject.y});let g={x:m.cx+(m.kind==="circle"?m.radius??0:m.rx??0),y:m.cy},b=ue(g,{x:m.cx,y:m.cy},m.rotationDeg);return Ee(b)}function Ee(d){let m=O.getScene(),g=O.getState(),b={x:m.width/2,y:m.height/2},L=ue(d,b,g.rotationDeg),A={x:b.x+(L.x-b.x)*g.scale+g.translateX,y:b.y+(L.y-b.y)*g.scale+g.translateY},G=ee.querySelector("svg");if(!G)return A;let de=G.getBoundingClientRect(),le=J.getBoundingClientRect();return{x:de.left-le.left+A.x/Math.max(m.width,1)*de.width,y:de.top-le.top+A.y/Math.max(m.height,1)*de.height}}function hr(d){let m=d.target?.closest("[data-editor-action]");if(m)switch(m.dataset.editorAction){case"add-object":{let g=C.querySelector("[data-editor-add-object-type]")?.value;j.addObject(g??"planet");return}case"add-viewpoint":j.addViewpoint();return;case"add-annotation":j.addAnnotation();return;case"add-metadata":j.addMetadata();return;case"remove":j.removeSelection();return;case"undo":j.undo();return;case"redo":j.redo();return;case"format":me(),i=o,mt(),se();return}}function br(d){let m=d.target?.closest("[data-path-kind]");m&&Ae({kind:m.dataset.pathKind,id:m.dataset.pathId||void 0,key:m.dataset.pathKey||void 0},!0,!0)}function yr(){rt(!1)}function wr(){rt(!0)}function rt(d){if(!(!s||!F))switch(s.kind){case"system":Z(Ue(),d,s,!1);return;case"defaults":Z(Ft(),d,s,!1);return;case"metadata":Z(Vt(s.key??""),d,s,!1);return;case"viewpoint":Z(Rt(s.id??""),d,s,!1);return;case"annotation":Z(en(s.id??""),d,s,!1);return;case"object":Z(ki(s.id??""),d,s,!1);return}}function f(){i=te?.value??"",se(),me(),I=window.setTimeout(()=>{I=null,et(i,!1)},Lc)}function h(){me(),et(te?.value??"",!0)&&mt()}function w(d){if(d.key==="Escape"&&u){d.preventDefault(),nt();return}if(!H||d.defaultPrevented||Si(d))return;let m=(d.ctrlKey||d.metaKey)&&!d.shiftKey&&d.key.toLowerCase()==="z",g=(d.ctrlKey||d.metaKey)&&(d.shiftKey&&d.key.toLowerCase()==="z"||d.key.toLowerCase()==="y");if(m){d.preventDefault(),j.undo();return}g&&(d.preventDefault(),j.redo())}function Y(d){let m=d.target?.closest("[data-handle-kind]");if(!m)return;let g=m.dataset.objectId,b=m.dataset.handleKind;if(!g||!["orbit-phase","orbit-radius","at-reference","surface-target","free-distance"].includes(b))return;if(me(),i!==o&&!et(i,!0)){d.preventDefault();return}let L=O?.getObjectDetails(g)??null;u={kind:b,objectId:g,pointerId:d.pointerId,startedFrom:ae(),changed:!1,orbitRadiusContext:b==="orbit-radius"&&L?ld(n,O.getScene(),L):null},m.setPointerCapture?.(d.pointerId),d.preventDefault()}function R(d){if(!u||u.pointerId!==d.pointerId||s?.kind!=="object"||s.id!==u.objectId)return;let m=O.getObjectDetails(u.objectId);if(!m)return;let g=he(d.clientX,d.clientY),b=n;switch(u.kind){case"orbit-phase":m.object.placement?.mode==="orbit"&&m.orbit&&(b=od(n,u.objectId,m,g));break;case"orbit-radius":m.object.placement?.mode==="orbit"&&m.orbit&&(b=id(n,u.objectId,m,g,u.orbitRadiusContext??null));break;case"at-reference":m.object.placement?.mode==="at"&&(b=ad(n,u.objectId,O.getScene(),g));break;case"surface-target":m.object.placement?.mode==="surface"&&(b=sd(n,u.objectId,O.getScene(),g));break;case"free-distance":m.object.placement?.mode==="free"&&(b=cd(n,u.objectId,O.getScene(),m,g));break}b!==n&&(u.changed=!0,n=z(b),a=Ze(n),Re({preserveCamera:!0,applyViewpointSelection:!1}),Et(),ft(),_e(),Ne(),ve(),Bt(),vr(),Vn(),se())}function P(d){if(!u||u.pointerId!==d.pointerId)return;let m=u;if(!u.changed){u=null;return}p.push(u.startedFrom),c.length=0,o=xe(n,{schema:"2.0"}),i=o,u=null,Me(),m.kind==="orbit-radius"&&ji(m.objectId),se(),Oe()}function nt(){if(!u)return;let d=u.startedFrom;u=null,n=z(d.atlasDocument),o=d.source,i=o,a=Ze(n),Ae(d.selection,!1,!1),Re({preserveCamera:!0,applyViewpointSelection:s?.kind==="viewpoint"}),Me(),se(),Oe()}function he(d,m){let g=ee.querySelector("svg"),b=O.getScene();if(!g)return{x:b.width/2,y:b.height/2};let L=g.getBoundingClientRect(),A={x:(d-L.left)/Math.max(L.width,1)*b.width,y:(m-L.top)/Math.max(L.height,1)*b.height};return dt(b,O.getState(),A)}function Ue(){let d=z(n),m=F?.querySelector("form[data-editor-form='system']");return!m||!d.system||(d.system.id=we(m,"system-id")||d.system.id,d.system.title=_(m,"system-title")),d}function Ft(){let d=z(n),m=F?.querySelector("form[data-editor-form='defaults']");return!m||!d.system||(d.system.defaults.view=we(m,"defaults-view")||"topdown",d.system.defaults.scale=_(m,"defaults-scale"),d.system.defaults.units=_(m,"defaults-units"),d.system.defaults.preset=_(m,"defaults-preset")??null,d.system.defaults.theme=_(m,"defaults-theme")),d}function Vt(d){let m=z(n),g=F?.querySelector("form[data-editor-form='metadata']");if(!g||!m.system)return m;let b=we(g,"metadata-key")||d,L=_(g,"metadata-value")??"";return b!==d?(delete m.system.atlasMetadata[d],m.system.atlasMetadata[b]=L,s={kind:"metadata",key:b},m):(m.system.atlasMetadata[d]=L,m)}function Rt(d){let m=z(n),g=F?.querySelector("form[data-editor-form='viewpoint']"),b=m.system?.viewpoints.find(G=>G.id===d);if(!g||!b||!m.system)return m;let L=we(g,"viewpoint-id")||b.id,A={...b,id:L,label:we(g,"viewpoint-label")||b.label,summary:_(g,"viewpoint-summary")??"",focusObjectId:_(g,"viewpoint-focus"),selectedObjectId:_(g,"viewpoint-select"),projection:we(g,"viewpoint-projection")||b.projection,preset:_(g,"viewpoint-preset")??null,zoom:Xr(_(g,"viewpoint-zoom")),rotationDeg:Xr(_(g,"viewpoint-rotation"))??0,layers:{background:He(g,"layer-background"),guides:He(g,"layer-guides"),"orbits-back":He(g,"layer-orbits-back"),"orbits-front":He(g,"layer-orbits-front"),objects:He(g,"layer-objects"),labels:He(g,"layer-labels"),metadata:He(g,"layer-metadata")},filter:{query:_(g,"filter-query"),objectTypes:Jc(_(g,"filter-object-types")),tags:fr(_(g,"filter-tags")),groupIds:fr(_(g,"filter-groups"))}};return m.system.viewpoints=m.system.viewpoints.filter(G=>G.id!==b.id).concat(A).sort((G,de)=>G.id.localeCompare(de.id)),b.id!==A.id&&(s={kind:"viewpoint",id:A.id}),m}function en(d){let m=z(n),g=F?.querySelector("form[data-editor-form='annotation']"),b=m.system?.annotations.find(G=>G.id===d);if(!g||!b||!m.system)return m;let L=we(g,"annotation-id")||b.id,A={...b,id:L,label:we(g,"annotation-label")||b.label,targetObjectId:_(g,"annotation-target"),body:_(g,"annotation-body")??"",tags:fr(_(g,"annotation-tags")),sourceObjectId:_(g,"annotation-source")};return m.system.annotations=m.system.annotations.filter(G=>G.id!==b.id).concat(A).sort((G,de)=>G.id.localeCompare(de.id)),b.id!==A.id&&(s={kind:"annotation",id:A.id}),m}function ki(d){let m=z(n),g=F?.querySelector("form[data-editor-form='object']"),b=m.objects.find(le=>le.id===d);if(!g||!b)return m;let L=we(g,"object-id")||b.id,A={...b,id:L,type:we(g,"object-type")||b.type,properties:{...b.properties},info:{...b.info},placement:Kc(g,b)};for(let le of Pc)Yr(A.properties,le,_(g,`prop-${le}`));for(let le of Cc)Yr(A.properties,le,Zc(_(g,`prop-${le}`)));for(let le of Fc)Yr(A.properties,le,Xr(_(g,`prop-${le}`)));Yr(A.properties,"tags",fr(_(g,"prop-tags"))),A.properties.hidden=He(g,"prop-hidden");let G=_(g,"info-description");G?A.info.description=G:delete A.info.description;let de=td(m,b.id,A);return b.id!==A.id&&(s={kind:"object",id:A.id}),de}function Bt(){let d=a.filter(b=>b.diagnostic.severity==="error").length,m=a.filter(b=>b.diagnostic.severity==="warning").length,g=s?qr(s):"Nothing selected";Ve.innerHTML=`
233
- <span class="wo-editor-status-pill${k?" is-dirty":" is-clean"}">${k?"Unsaved changes":"Saved"}</span>
234
- <span class="wo-editor-status-pill">Schema ${T(n.version)}</span>
235
- <span class="wo-editor-status-pill${d>0?" is-error":m>0?" is-warning":""}">${d} errors \xB7 ${m} warnings</span>
236
- <span class="wo-editor-status-pill">${T(g)}</span>
237
- `}function vr(){let d=a.filter(g=>g.diagnostic.severity==="error").length,m=a.filter(g=>g.diagnostic.severity==="warning").length;pt.textContent=`${k?"Unsaved changes.":"Saved."} ${d} errors, ${m} warnings. ${s?qr(s):"Nothing selected"}.`}function Vn(){V===null&&(V=window.setTimeout(()=>{V=null,Rn()},Tc))}function Rn(){if(!O)return;let d=O.exportSvg();Qe&&d!==$&&(Qe.innerHTML=d,$=d);let m=mi(Se(),n);D&&m!==S&&(D.textContent=m,S=m)}function ji(d){if(!O)return;let m=O.getObjectDetails(d);if(!m)return;let g=ir(O.getScene(),O.getState()),b=36/Math.max(O.getState().scale,.001),L=m.renderObject;(L.x<g.minX+b||L.x>g.maxX-b||L.y<g.minY+b||L.y>g.maxY-b)&&O.fitToSystem()}function Si(d){let m=d.target;if(!m)return!1;let g=m.tagName.toLowerCase();return m.isContentEditable||g==="input"||g==="textarea"||g==="select"}function tn(d,m){if(!d)return[];let g=ut(d);return m.filter(b=>{let L=ut(b.path);return L&&L===g?!0:d.kind==="object"&&b.diagnostic.objectId===d.id})}function Oi(d,m){return tn(d,m).filter(g=>{let b=g.diagnostic.field??"";return bi.has(b)||g.diagnostic.message.toLowerCase().includes("placement")||g.diagnostic.message.toLowerCase().includes("orbit")||g.diagnostic.message.toLowerCase().includes("surface")||g.diagnostic.message.toLowerCase().includes("lagrange")||g.diagnostic.message.toLowerCase().includes("anchor")})}function Mi(d,m){let g=tn(d,m);return g.length===0?"":`<div class="wo-editor-inspector-summary">
238
- ${g.slice(0,4).map(b=>`<article class="wo-editor-diagnostic wo-editor-diagnostic-${T(b.diagnostic.severity)}">
239
- <strong>${T(b.diagnostic.severity.toUpperCase())}</strong>
240
- <span>${T(b.diagnostic.field??qr(d))}</span>
241
- <p>${T(b.diagnostic.message)}</p>
234
+ `}function Ut(){we.innerHTML=c.length===0?'<p class="wo-editor-empty">No diagnostics.</p>':c.map(u=>{let p=u.path?ur(u.path):"Source",h=Ho(u);return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(u.diagnostic.severity)}">
235
+ <strong>${L(u.diagnostic.severity.toUpperCase())}</strong>
236
+ <span>${L(p)}${h?` \xB7 ${L(h)}`:""}</span>
237
+ <p>${L(u.diagnostic.message)}</p>
238
+ </article>`}).join("")}function Ot(){let u=c.filter(p=>!p.path||p.diagnostic.line!==void 0);le.innerHTML=u.length===0?'<p class="wo-editor-empty">No source diagnostics.</p>':u.map(p=>{let h=Ho(p)??"Source";return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(p.diagnostic.severity)}">
239
+ <strong>${L(p.diagnostic.severity.toUpperCase())}</strong>
240
+ <span>${L(h)}</span>
241
+ <p>${L(p.diagnostic.message)}</p>
242
+ </article>`}).join("")}function tt(){if(!D)return;Yd(D,P);let u={selection:a?{path:{...a}}:null,system:r.system,viewpoints:r.system?.viewpoints??[],events:r.events,objects:r.objects};if(!a){D.innerHTML='<p class="wo-editor-empty">Select an atlas node or object to edit it.</p>';return}let p=pa(a,c);switch(a.kind){case"system":D.innerHTML=p+Xd(u),ut(D,P),rt(a,c);return;case"defaults":D.innerHTML=p+Kd(u),ut(D,P),rt(a,c);return;case"metadata":D.innerHTML=p+Zd(u,a.key??""),ut(D,P),rt(a,c);return;case"viewpoint":D.innerHTML=p+Jd(u,a.id??""),ut(D,P),rt(a,c);return;case"event":D.innerHTML=p+Qd(u,a.id??""),ut(D,P),rt(a,c);return;case"event-pose":D.innerHTML=p+eu(u,a.id??"",a.key??""),ut(D,P),rt(a,c);return;case"annotation":D.innerHTML=p+tu(u,a.id??""),ut(D,P),rt(a,c);return;case"object":D.innerHTML=p+nu(u,a.id??""),ut(D,P),rt(a,c);return}}function Et(){oe&&oe.value!==o&&(oe.value=o)}function Wt(u=!1){if(u){si();return}ai()}function Pe(){if(!T)return;q.innerHTML="";let u=a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null;if(!u)return;let p=T.getObjectDetails(u);if(!p)return;if(Yt(p.renderObject.x,p.renderObject.y,p.renderObject.objectId),p.parent&&Yt(p.parent.x,p.parent.y,`Parent: ${p.parent.objectId}`,!0),p.renderObject.anchorX!==void 0&&p.renderObject.anchorY!==void 0&&Yt(p.renderObject.anchorX,p.renderObject.anchorY,"Anchor",!0),p.object.placement?.mode==="orbit"&&p.orbit){let g=Ye({x:p.renderObject.x,y:p.renderObject.y});q.append(kn("orbit-phase",p.objectId,g,"Phase"));let j=ke(p);q.append(kn("orbit-radius",p.objectId,j,"Size"))}if(p.object.placement?.mode==="at"){q.append(kn("at-reference",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Reference"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag to an object center or nearby Lagrange point.",q.append(g)}if(p.object.placement?.mode==="surface"){q.append(kn("surface-target",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Surface"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag onto another surface-capable body.",q.append(g)}if(p.object.placement?.mode==="free"){q.append(kn("free-distance",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Offset"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag horizontally to change free offset.",q.append(g)}let h=ua(a,c).slice(0,3);if(h.length>0){let g=document.createElement("div");g.className="wo-editor-overlay-diagnostics",g.setAttribute("role","status"),g.setAttribute("aria-live","polite"),g.innerHTML=h.map(j=>`<article class="wo-editor-overlay-diagnostic wo-editor-overlay-diagnostic-${L(j.diagnostic.severity)}">
243
+ <strong>${L(j.diagnostic.severity.toUpperCase())}</strong>
244
+ <p>${L(j.diagnostic.message)}</p>
245
+ </article>`).join(""),q.append(g)}}function Yt(u,p,h,g=!1){let j=Ye({x:u,y:p}),E=document.createElement("div");E.className=`wo-editor-hint${g?" is-subtle":""}`,E.style.left=`${j.x}px`,E.style.top=`${j.y}px`,E.textContent=h,q.append(E)}function ke(u){let p=u.orbit;if(!p)return Ye({x:u.renderObject.x,y:u.renderObject.y});let h={x:p.cx+(p.kind==="circle"?p.radius??0:p.rx??0),y:p.cy},g=ve(h,{x:p.cx,y:p.cy},p.rotationDeg);return Ye(g)}function Ye(u){let p=T.getScene(),h=T.getState(),g={x:p.width/2,y:p.height/2},j=ve(u,g,h.rotationDeg),E={x:g.x+(j.x-g.x)*h.scale+h.translateX,y:g.y+(j.y-g.y)*h.scale+h.translateY},B=te.querySelector("svg");if(!B)return E;let J=B.getBoundingClientRect(),se=ee.getBoundingClientRect();return{x:J.left-se.left+E.x/Math.max(p.width,1)*J.width,y:J.top-se.top+E.y/Math.max(p.height,1)*J.height}}function Pn(u){let p=u.target?.closest("[data-editor-action]");if(p)switch(p.dataset.editorAction){case"add-object":{let h=U.querySelector("[data-editor-add-object-type]")?.value;R.addObject(h??"planet");return}case"add-viewpoint":R.addViewpoint();return;case"add-event":R.addEvent();return;case"add-annotation":R.addAnnotation();return;case"add-metadata":R.addMetadata();return;case"remove":R.removeSelection();return;case"undo":R.undo();return;case"redo":R.redo();return;case"format":O(),o=i,Et(),ie();return}}function An(u){let p=u.target?.closest("[data-path-kind]");p&&xe({kind:p.dataset.pathKind,id:p.dataset.pathId||void 0,key:p.dataset.pathKey||void 0},!0,!0)}function Ln(u){let p=u.target?.closest("[data-path-kind]");if(p){xe({kind:p.dataset.pathKind,id:p.dataset.pathId||void 0,key:p.dataset.pathKey||void 0},!0,!0);return}let h=u.target?.closest("[data-editor-action]");if(h&&h.dataset.editorAction==="add-event-pose"){let g=h.dataset.editorEventId||(a?.kind==="event"||a?.kind==="event-pose"?a.id??"":"");if(!g)return;let j=Su(r,g),E=j.events.find(J=>J.id===g),B=E?.positions.at(-1)??E?.positions[0];K(j,!0,B?{kind:"event-pose",id:g,key:B.objectId}:{kind:"event",id:g});return}}function Tn(){m(!1)}function vt(){m(!0)}function m(u){if(!(!a||!D))switch(a.kind){case"system":K(Ht(),u,a,!1);return;case"defaults":K(qt(),u,a,!1);return;case"metadata":K(Gt(a.key??""),u,a,!1);return;case"viewpoint":K(hr(a.id??""),u,a,!1);return;case"event":K(oa(a.id??""),u,a,!1);return;case"event-pose":K(aa(a.id??"",a.key??""),u,a,!1);return;case"annotation":K(sa(a.id??""),u,a,!1);return;case"object":K(ca(a.id??""),u,a,!1);return}}function y(){o=oe?.value??"",ie(),O(),k=window.setTimeout(()=>{k=null,yt(o,!1)},Td)}function $(){O(),yt(oe?.value??"",!0)&&Et()}function Z(u){if(u.key==="Escape"&&f){u.preventDefault(),Se();return}if(!re||u.defaultPrevented||da(u))return;let p=(u.ctrlKey||u.metaKey)&&!u.shiftKey&&u.key.toLowerCase()==="z",h=(u.ctrlKey||u.metaKey)&&(u.shiftKey&&u.key.toLowerCase()==="z"||u.key.toLowerCase()==="y");if(p){u.preventDefault(),R.undo();return}h&&(u.preventDefault(),R.redo())}function z(u){let p=u.target?.closest("[data-handle-kind]");if(!p)return;let h=p.dataset.objectId,g=p.dataset.handleKind;if(!h||!["orbit-phase","orbit-radius","at-reference","surface-target","free-distance"].includes(g))return;if(O(),o!==i&&!yt(o,!0)){u.preventDefault();return}let j=T?.getObjectDetails(h)??null;f={kind:g,objectId:h,pointerId:u.pointerId,path:a?{...a}:{kind:"object",id:h},startedFrom:ye(),changed:!1,orbitRadiusContext:g==="orbit-radius"&&j?bu(r,T.getScene(),j):null},p.setPointerCapture?.(u.pointerId),u.preventDefault()}function F(u){if(!f||f.pointerId!==u.pointerId||!a||Ke(a)!==Ke(f.path))return;let p=T.getObjectDetails(f.objectId);if(!p)return;let h=nt(u.clientX,u.clientY),g=r;switch(f.kind){case"orbit-phase":p.object.placement?.mode==="orbit"&&p.orbit&&(g=fu(r,f.path,f.objectId,p,h));break;case"orbit-radius":p.object.placement?.mode==="orbit"&&p.orbit&&(g=mu(r,f.path,f.objectId,p,h,f.orbitRadiusContext??null));break;case"at-reference":p.object.placement?.mode==="at"&&(g=hu(r,f.path,f.objectId,T.getScene(),h));break;case"surface-target":p.object.placement?.mode==="surface"&&(g=gu(r,f.path,f.objectId,T.getScene(),h));break;case"free-distance":p.object.placement?.mode==="free"&&(g=yu(r,f.path,f.objectId,T.getScene(),p,h));break}g!==r&&(f.changed=!0,r=N(g),c=ht(r),Je({preserveCamera:!0,applyViewpointSelection:!1}),Ut(),Ot(),et(),tt(),Pe(),Xt(),Cn(),ai(),ie())}function Ve(u){if(!f||f.pointerId!==u.pointerId)return;let p=f;if(!f.changed){f=null;return}l.push(f.startedFrom),d.length=0,i=mt(r),o=i,f=null,Fe(),p.kind==="orbit-radius"&&la(p.objectId),ie(),Ce()}function Se(){if(!f)return;let u=f.startedFrom;f=null,r=N(u.atlasDocument),i=u.source,o=i,c=ht(r),xe(u.selection,!1,!1),Je({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),Fe(),ie(),Ce()}function nt(u,p){let h=te.querySelector("svg"),g=T.getScene();if(!h)return{x:g.width/2,y:g.height/2};let j=h.getBoundingClientRect(),E={x:(u-j.left)/Math.max(j.width,1)*g.width,y:(p-j.top)/Math.max(j.height,1)*g.height};return kt(g,T.getState(),E)}function Ht(){let u=N(r),p=D?.querySelector("form[data-editor-form='system']");return!p||!u.system||(u.system.id=ge(p,"system-id")||u.system.id,u.system.title=M(p,"system-title")),u}function qt(){let u=N(r),p=D?.querySelector("form[data-editor-form='defaults']");return!p||!u.system||(u.system.defaults.view=ge(p,"defaults-view")||"topdown",u.system.defaults.scale=M(p,"defaults-scale"),u.system.defaults.units=M(p,"defaults-units"),u.system.defaults.preset=M(p,"defaults-preset")??null,u.system.defaults.theme=M(p,"defaults-theme")),u}function Gt(u){let p=N(r),h=D?.querySelector("form[data-editor-form='metadata']");if(!h||!p.system)return p;let g=ge(h,"metadata-key")||u,j=M(h,"metadata-value")??"";return g!==u?(delete p.system.atlasMetadata[u],p.system.atlasMetadata[g]=j,a={kind:"metadata",key:g},p):(p.system.atlasMetadata[u]=j,p)}function hr(u){let p=N(r),h=D?.querySelector("form[data-editor-form='viewpoint']"),g=p.system?.viewpoints.find(B=>B.id===u);if(!h||!g||!p.system)return p;let j=ge(h,"viewpoint-id")||g.id,E={...g,id:j,label:ge(h,"viewpoint-label")||g.label,summary:M(h,"viewpoint-summary")??"",focusObjectId:M(h,"viewpoint-focus"),selectedObjectId:M(h,"viewpoint-select"),projection:ge(h,"viewpoint-projection")||g.projection,preset:M(h,"viewpoint-preset")??null,zoom:gt(M(h,"viewpoint-zoom")),rotationDeg:gt(M(h,"viewpoint-rotation"))??0,camera:au(h),layers:{background:Be(h,"layer-background"),guides:Be(h,"layer-guides"),"orbits-back":Be(h,"layer-orbits-back"),"orbits-front":Be(h,"layer-orbits-front"),events:Be(h,"layer-events"),objects:Be(h,"layer-objects"),labels:Be(h,"layer-labels"),metadata:Be(h,"layer-metadata")},events:Ge(M(h,"viewpoint-events")),filter:{query:M(h,"filter-query"),objectTypes:su(M(h,"filter-object-types")),tags:Ge(M(h,"filter-tags")),groupIds:Ge(M(h,"filter-groups"))}};return p.system.viewpoints=p.system.viewpoints.filter(B=>B.id!==g.id).concat(E).sort((B,J)=>B.id.localeCompare(J.id)),g.id!==E.id&&(a={kind:"viewpoint",id:E.id}),p}function oa(u){let p=N(r),h=D?.querySelector("form[data-editor-form='event']"),g=p.events.find(B=>B.id===u);if(!h||!g)return p;let j=ge(h,"event-id")||g.id,E={...g,id:j,kind:ge(h,"event-kind"),label:ge(h,"event-label")||g.label,summary:M(h,"event-summary"),targetObjectId:M(h,"event-target"),participantObjectIds:Ge(M(h,"event-participants")),timing:M(h,"event-timing"),visibility:M(h,"event-visibility"),epoch:M(h,"event-epoch"),referencePlane:M(h,"event-referencePlane"),tags:Ge(M(h,"event-tags")),color:M(h,"event-color"),hidden:Be(h,"event-hidden")};return p.events=p.events.filter(B=>B.id!==g.id).concat(E).sort(Go),Eu(p,g.id,E.id,Ge(M(h,"event-viewpoints"))),g.id!==E.id&&(a={kind:"event",id:E.id}),p}function aa(u,p){let h=N(r),g=D?.querySelector("form[data-editor-form='event-pose']"),j=h.events.find(Ae=>Ae.id===u),E=j?.positions.find(Ae=>Ae.objectId===p);if(!g||!j||!E)return h;let J={objectId:ge(g,"pose-object-id")||E.objectId,placement:iu(g,E),epoch:M(g,"pose-epoch"),referencePlane:M(g,"pose-referencePlane")},se=Ue(M(g,"prop-inner")),Fn=Ue(M(g,"prop-outer"));return se&&(J.inner=se),Fn&&(J.outer=Fn),j.positions=j.positions.filter(Ae=>Ae.objectId!==E.objectId).concat(J).sort(mr),j.targetObjectId!==J.objectId&&!j.participantObjectIds.includes(J.objectId)&&(j.participantObjectIds.push(J.objectId),j.participantObjectIds.sort((Ae,Kt)=>Ae.localeCompare(Kt))),E.objectId!==J.objectId&&(a={kind:"event-pose",id:u,key:J.objectId}),h}function sa(u){let p=N(r),h=D?.querySelector("form[data-editor-form='annotation']"),g=p.system?.annotations.find(B=>B.id===u);if(!h||!g||!p.system)return p;let j=ge(h,"annotation-id")||g.id,E={...g,id:j,label:ge(h,"annotation-label")||g.label,targetObjectId:M(h,"annotation-target"),body:M(h,"annotation-body")??"",tags:Ge(M(h,"annotation-tags")),sourceObjectId:M(h,"annotation-source")};return p.system.annotations=p.system.annotations.filter(B=>B.id!==g.id).concat(E).sort((B,J)=>B.id.localeCompare(J.id)),g.id!==E.id&&(a={kind:"annotation",id:E.id}),p}function ca(u){let p=N(r),h=D?.querySelector("form[data-editor-form='object']"),g=p.objects.find(se=>se.id===u);if(!h||!g)return p;let j=ge(h,"object-id")||g.id,E={...g,id:j,type:ge(h,"object-type")||g.type,properties:{...g.properties},info:{...g.info},placement:ru(h,g)};for(let se of Rd)dr(E.properties,se,M(h,`prop-${se}`));for(let se of zd)dr(E.properties,se,ou(M(h,`prop-${se}`)));for(let se of _d)dr(E.properties,se,gt(M(h,`prop-${se}`)));dr(E.properties,"tags",Ge(M(h,"prop-tags"))),E.properties.hidden=Be(h,"prop-hidden");let B=M(h,"info-description");B?E.info.description=B:delete E.info.description;let J=du(p,g.id,E);return g.id!==E.id&&(a={kind:"object",id:E.id}),J}function Xt(){let u=c.filter(g=>g.diagnostic.severity==="error").length,p=c.filter(g=>g.diagnostic.severity==="warning").length,h=a?ur(a):"Nothing selected";De.innerHTML=`
246
+ <span class="wo-editor-status-pill${S?" is-dirty":" is-clean"}">${S?"Unsaved changes":"Saved"}</span>
247
+ <span class="wo-editor-status-pill">Schema ${L(r.version)}</span>
248
+ <span class="wo-editor-status-pill${u>0?" is-error":p>0?" is-warning":""}">${u} errors \xB7 ${p} warnings</span>
249
+ <span class="wo-editor-status-pill">${L(h)}</span>
250
+ `}function Cn(){let u=c.filter(h=>h.diagnostic.severity==="error").length,p=c.filter(h=>h.diagnostic.severity==="warning").length;We.textContent=`${S?"Unsaved changes.":"Saved."} ${u} errors, ${p} warnings. ${a?ur(a):"Nothing selected"}.`}function ai(){C===null&&(C=window.setTimeout(()=>{C=null,si()},Cd))}function si(){if(!T)return;let u=T.exportSvg();Ze&&u!==Y&&(Ze.innerHTML=u,Y=u);let p=qo(W(),r);bt&&p!==v&&(bt.textContent=p,v=p)}function la(u){if(!T)return;let p=T.getObjectDetails(u);if(!p)return;let h=yn(T.getScene(),T.getState()),g=36/Math.max(T.getState().scale,.001),j=p.renderObject;(j.x<h.minX+g||j.x>h.maxX-g||j.y<h.minY+g||j.y>h.maxY-g)&&T.fitToSystem()}function da(u){let p=u.target;if(!p)return!1;let h=p.tagName.toLowerCase();return p.isContentEditable||h==="input"||h==="textarea"||h==="select"}function gr(u,p){if(!u)return[];let h=Ke(u);return p.filter(g=>{let j=Ke(g.path);return j&&j===h?!0:u.kind==="object"&&g.diagnostic.objectId===u.id})}function ua(u,p){return gr(u,p).filter(h=>{let g=h.diagnostic.field??"";return ri.has(g)||h.diagnostic.message.toLowerCase().includes("placement")||h.diagnostic.message.toLowerCase().includes("orbit")||h.diagnostic.message.toLowerCase().includes("surface")||h.diagnostic.message.toLowerCase().includes("lagrange")||h.diagnostic.message.toLowerCase().includes("anchor")})}function pa(u,p){let h=gr(u,p);return h.length===0?"":`<div class="wo-editor-inspector-summary">
251
+ ${h.slice(0,4).map(g=>`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(g.diagnostic.severity)}">
252
+ <strong>${L(g.diagnostic.severity.toUpperCase())}</strong>
253
+ <span>${L(g.diagnostic.field??ur(u))}</span>
254
+ <p>${L(g.diagnostic.message)}</p>
242
255
  </article>`).join("")}
243
- </div>`}function gt(d,m){if(!F||!d)return;let g=tn(d,m),b=new Map;for(let L of g)for(let A of md(d,L.diagnostic.field)){let G=b.get(A)??[];G.push(L),b.set(A,G)}for(let[L,A]of b){let G=F.querySelector(`[name="${CSS.escape(L)}"]`),de=G?.closest(".wo-editor-field, .wo-editor-checkbox");if(!G||!de)continue;let le=A.some(nn=>nn.diagnostic.severity==="error"),Di=A.some(nn=>nn.diagnostic.severity==="warning");de.classList.add(le?"has-error":"has-warning"),G.setAttribute("aria-invalid",le?"true":"false");let rn=document.createElement("div");rn.className=`wo-editor-field-note${le?" is-error":Di?" is-warning":""}`,rn.textContent=A[0]?.diagnostic.message??"",de.append(rn)}}}function Rc(e){if(e.atlasDocument){let r=z(e.atlasDocument);return{atlasDocument:r,source:xe(r,{schema:"2.0"}),diagnostics:Ze(r)}}if(e.source){let r=nr(e.source);if(r.ok&&r.value){let n=r.value.atlasDocument??it(r.value.document);return{atlasDocument:n,source:xe(n,{schema:"2.0"}),diagnostics:vi(rr(n,r.diagnostics),Ze(n))}}}let t=Br("WorldOrbit");return{atlasDocument:t,source:xe(t,{schema:"2.0"}),diagnostics:Ze(t)}}function Bc(){let e=zc();return`<section class="wo-editor-shell">
256
+ </div>`}function rt(u,p){if(!D||!u)return;let h=gr(u,p),g=new Map;for(let j of h)for(let E of Iu(u,j.diagnostic.field)){let B=g.get(E)??[];B.push(j),g.set(E,B)}for(let[j,E]of g){let B=D.querySelector(`[name="${CSS.escape(j)}"]`),J=B?.closest(".wo-editor-field, .wo-editor-checkbox");if(!B||!J)continue;let se=E.some(Kt=>Kt.diagnostic.severity==="error"),Fn=E.some(Kt=>Kt.diagnostic.severity==="warning");J.classList.add(se?"has-error":"has-warning"),B.setAttribute("aria-invalid",se?"true":"false");let Ae=document.createElement("div");Ae.className=`wo-editor-field-note${se?" is-error":Fn?" is-warning":""}`,Ae.textContent=E[0]?.diagnostic.message??"",J.append(Ae)}}}function Nd(e){if(e.atlasDocument){let n=N(e.atlasDocument);return{atlasDocument:n,source:mt(n),diagnostics:ht(n)}}if(e.source){let n=gn(e.source);if(n.ok&&n.value){let r=n.value.atlasDocument??xt(n.value.document);return{atlasDocument:r,source:mt(r),diagnostics:ea(hn(r,n.diagnostics),ht(r))}}}let t=nr("WorldOrbit");return{atlasDocument:t,source:mt(t),diagnostics:ht(t)}}function mt(e){return Kn(e,{schema:e.version})}function Ud(){let e=qd();return`<section class="wo-editor-shell">
244
257
  <div class="wo-editor-toolbar" data-editor-toolbar></div>
245
258
  <div class="wo-editor-status" data-editor-status role="status" aria-live="polite"></div>
246
259
  <div class="wo-editor-main">
247
260
  <aside class="wo-editor-sidebar" data-editor-pane="sidebar">
248
- <div class="wo-editor-panel">${ur("Atlas","atlas",'<div class="wo-editor-outline" data-editor-outline></div>')}</div>
249
- <div class="wo-editor-panel">${ur("Diagnostics","diagnostics",'<div class="wo-editor-diagnostics" data-editor-diagnostics></div>')}</div>
261
+ <div class="wo-editor-panel">${jn("Atlas","atlas",'<div class="wo-editor-outline" data-editor-outline></div>')}</div>
262
+ <div class="wo-editor-panel">${jn("Diagnostics","diagnostics",'<div class="wo-editor-diagnostics" data-editor-diagnostics></div>')}</div>
250
263
  </aside>
251
264
  <div class="wo-editor-stage-panel">
252
265
  <div class="wo-editor-stage-shell" data-editor-stage-shell>
@@ -254,7 +267,7 @@
254
267
  <div class="wo-editor-overlay" data-editor-overlay></div>
255
268
  </div>
256
269
  <div class="wo-editor-panel" data-editor-pane="preview">
257
- ${ur("Preview","preview",`<div class="wo-editor-preview">
270
+ ${jn("Preview","preview",`<div class="wo-editor-preview">
258
271
  <div class="wo-editor-preview-card">
259
272
  <h3>Static SVG</h3>
260
273
  <div class="wo-editor-preview-visual" data-editor-preview-visual></div>
@@ -267,11 +280,11 @@
267
280
  </div>
268
281
  </div>
269
282
  <aside class="wo-editor-panel wo-editor-inspector" data-editor-pane="inspector">
270
- ${ur("Inspector","inspector","<div data-editor-inspector></div>")}
283
+ ${jn("Inspector","inspector","<div data-editor-inspector></div>")}
271
284
  </aside>
272
285
  </div>
273
286
  <div class="wo-editor-panel wo-editor-text-panel" data-editor-pane="text">
274
- ${ur("Source","source",`<textarea
287
+ ${jn("Source","source",`<textarea
275
288
  class="wo-editor-source"
276
289
  data-editor-source
277
290
  spellcheck="false"
@@ -285,104 +298,156 @@
285
298
  ></div>`)}
286
299
  </div>
287
300
  <div class="wo-editor-live-region" data-editor-live aria-live="polite" aria-atomic="true"></div>
288
- </section>`}function ur(e,t,r,n=!0){return`<details class="wo-editor-panel-section" data-editor-panel-section="${T(t)}"${n?" open":""}>
289
- <summary><span>${T(e)}</span></summary>
290
- <div class="wo-editor-panel-section-body">${r}</div>
291
- </details>`}function je(e,t,r,n,o=!1){let i=Uc(e,t);return`<details class="wo-editor-inspector-section" data-editor-form-section="${T(t)}" data-editor-form-id="${T(e)}" data-editor-section-state="${T(i)}"${o?" open":""}>
292
- <summary><span>${T(r)}</span></summary>
293
- <div class="wo-editor-inspector-section-body">${n}</div>
294
- </details>`}function Jr(e,t){return`<span class="wo-editor-field-label">${T(e)}${_c(t)}</span>`}function _c(e){let t=Vc[e];return t?`<details class="wo-editor-field-help">
295
- <summary aria-label="Explain ${Ii(e)}">?</summary>
301
+ </section>`}function jn(e,t,n,r=!0){return`<details class="wo-editor-panel-section" data-editor-panel-section="${L(t)}"${r?" open":""}>
302
+ <summary><span>${L(e)}</span></summary>
303
+ <div class="wo-editor-panel-section-body">${n}</div>
304
+ </details>`}function pe(e,t,n,r,i=!1){let o=Hd(e,t);return`<details class="wo-editor-inspector-section" data-editor-form-section="${L(t)}" data-editor-form-id="${L(e)}" data-editor-section-state="${L(o)}"${i?" open":""}>
305
+ <summary><span>${L(n)}</span></summary>
306
+ <div class="wo-editor-inspector-section-body">${r}</div>
307
+ </details>`}function fr(e,t){return`<span class="wo-editor-field-label">${L(e)}${Wd(t)}</span>`}function Wd(e){let t=Bd[e];return t?`<details class="wo-editor-field-help">
308
+ <summary aria-label="Explain ${ia(e)}">?</summary>
296
309
  <div class="wo-editor-field-help-card">
297
- <p>${T(t.description)}</p>
298
- ${(t.references?.length??0)>0?`<div class="wo-editor-field-help-chips">${(t.references??[]).map(r=>`<span>${T(r)}</span>`).join("")}</div>`:""}
310
+ <p>${L(t.description)}</p>
311
+ ${(t.references?.length??0)>0?`<div class="wo-editor-field-help-chips">${(t.references??[]).map(n=>`<span>${L(n)}</span>`).join("")}</div>`:""}
299
312
  </div>
300
- </details>`:""}function Nc(e,t){for(let r of e.querySelectorAll("[data-editor-section-state]")){let n=r.dataset.editorSectionState;n&&t.set(n,r.open)}}function Ot(e,t){for(let r of e.querySelectorAll("[data-editor-section-state]")){let n=r.dataset.editorSectionState;!n||!t.has(n)||(r.open=t.get(n)===!0)}}function Uc(e,t){return`${e}:${t}`}function zc(){return typeof window>"u"?!0:typeof window.matchMedia=="function"?!window.matchMedia("(max-width: 1280px)").matches:window.innerWidth>1280}function Mt(e,t,r,n){let o=ut(e),i=o?n.get(o):null,l=i&&(i.errors>0||i.warnings>0)?`<span class="wo-editor-outline-badge${i.errors>0?" is-error":" is-warning"}">${i.errors>0?i.errors:i.warnings}</span>`:"";return`<button type="button" class="wo-editor-outline-item${o===r?" is-active":""}" data-path-kind="${T(e.kind)}"${e.id?` data-path-id="${T(e.id)}"`:""}${e.key?` data-path-key="${T(e.key)}"`:""}><span>${T(t)}</span>${l}</button>`}function Wc(e){return`<form class="wo-editor-form" data-editor-form="system">
313
+ </details>`:""}function Yd(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;r&&t.set(r,n.open)}}function ut(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;!r||!t.has(r)||(n.open=t.get(r)===!0)}}function Hd(e,t){return`${e}:${t}`}function qd(){return typeof window>"u"?!0:typeof window.matchMedia=="function"?!window.matchMedia("(max-width: 1280px)").matches:window.innerWidth>1280}function Xe(e,t,n,r){let i=Ke(e),o=i?r.get(i):null,s=o&&(o.errors>0||o.warnings>0)?`<span class="wo-editor-outline-badge${o.errors>0?" is-error":" is-warning"}">${o.errors>0?o.errors:o.warnings}</span>`:"";return`<button type="button" class="wo-editor-outline-item${i===n?" is-active":""}" data-path-kind="${L(e.kind)}"${e.id?` data-path-id="${L(e.id)}"`:""}${e.key?` data-path-key="${L(e.key)}"`:""}><span>${L(t)}</span>${s}</button>`}function Gd(e,t,n){return`<div class="wo-editor-outline-group">
314
+ ${Xe({kind:"event",id:e.id},e.label||e.id,t,n)}
315
+ ${e.positions.length>0?`<div class="wo-editor-outline-children">${[...e.positions].sort(mr).map(r=>Xe({kind:"event-pose",id:e.id,key:r.objectId},r.objectId,t,n)).join("")}</div>`:""}
316
+ </div>`}function Xd(e){return`<form class="wo-editor-form" data-editor-form="system">
301
317
  <h2>System</h2>
302
- ${je("system","basics","Basics",`${M("System ID","system-id",e.system?.id??"")}
303
- ${M("Title","system-title",e.system?.title??"")}`,!0)}
304
- </form>`}function Hc(e){let t=e.system?.defaults;return`<form class="wo-editor-form" data-editor-form="defaults">
318
+ ${pe("system","basics","Basics",`${x("System ID","system-id",e.system?.id??"")}
319
+ ${x("Title","system-title",e.system?.title??"")}`,!0)}
320
+ </form>`}function Kd(e){let t=e.system?.defaults;return`<form class="wo-editor-form" data-editor-form="defaults">
305
321
  <h2>Defaults</h2>
306
- ${je("defaults","basics","Basics",`${Tt("Projection","defaults-view",[["topdown","Topdown"],["isometric","Isometric"]],t?.view??"topdown")}
307
- ${M("Scale preset","defaults-scale",t?.scale??"")}
308
- ${M("Units","defaults-units",t?.units??"")}
309
- ${Tt("Render preset","defaults-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],t?.preset??"")}
310
- ${M("Theme","defaults-theme",t?.theme??"")}`,!0)}
311
- </form>`}function Yc(e,t){let r=e.system?.atlasMetadata[t]??"";return`<form class="wo-editor-form" data-editor-form="metadata">
322
+ ${pe("defaults","basics","Basics",`${St("Projection","defaults-view",[["topdown","Topdown"],["isometric","Isometric"],["orthographic","Orthographic"],["perspective","Perspective"]],t?.view??"topdown")}
323
+ ${x("Scale preset","defaults-scale",t?.scale??"")}
324
+ ${x("Units","defaults-units",t?.units??"")}
325
+ ${St("Render preset","defaults-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],t?.preset??"")}
326
+ ${x("Theme","defaults-theme",t?.theme??"")}`,!0)}
327
+ </form>`}function Zd(e,t){let n=e.system?.atlasMetadata[t]??"";return`<form class="wo-editor-form" data-editor-form="metadata">
312
328
  <h2>Metadata</h2>
313
- ${je("metadata","entry","Entry",`${M("Key","metadata-key",t)}
314
- ${Qr("Value","metadata-value",r)}`,!0)}
315
- </form>`}function qc(e,t){let r=e.viewpoints.find(n=>n.id===t);return r?`<form class="wo-editor-form" data-editor-form="viewpoint">
329
+ ${pe("metadata","entry","Entry",`${x("Key","metadata-key",t)}
330
+ ${Mn("Value","metadata-value",n)}`,!0)}
331
+ </form>`}function Jd(e,t){let n=e.viewpoints.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="viewpoint">
316
332
  <h2>Viewpoint</h2>
317
- ${je("viewpoint","basics","Basics",`${M("ID","viewpoint-id",r.id)}
318
- ${M("Label","viewpoint-label",r.label)}
319
- ${Qr("Summary","viewpoint-summary",r.summary)}
320
- ${M("Focus object","viewpoint-focus",r.focusObjectId??"")}
321
- ${M("Selected object","viewpoint-select",r.selectedObjectId??"")}
322
- ${Tt("Projection","viewpoint-projection",[["topdown","Topdown"],["isometric","Isometric"]],r.projection)}
323
- ${Tt("Preset","viewpoint-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],r.preset??"")}
324
- ${M("Zoom","viewpoint-zoom",r.zoom===null?"":String(r.zoom))}
325
- ${M("Rotation","viewpoint-rotation",String(r.rotationDeg))}`,!0)}
326
- ${je("viewpoint","layers","Layers",`<fieldset class="wo-editor-fieldset">
333
+ ${pe("viewpoint","basics","Basics",`${x("ID","viewpoint-id",n.id)}
334
+ ${x("Label","viewpoint-label",n.label)}
335
+ ${Mn("Summary","viewpoint-summary",n.summary)}
336
+ ${x("Focus object","viewpoint-focus",n.focusObjectId??"")}
337
+ ${x("Selected object","viewpoint-select",n.selectedObjectId??"")}
338
+ ${St("Projection","viewpoint-projection",[["topdown","Topdown"],["isometric","Isometric"],["orthographic","Orthographic"],["perspective","Perspective"]],n.projection)}
339
+ ${St("Preset","viewpoint-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],n.preset??"")}
340
+ ${x("Zoom","viewpoint-zoom",n.zoom===null?"":String(n.zoom))}
341
+ ${x("Rotation","viewpoint-rotation",String(n.rotationDeg))}`,!0)}
342
+ ${pe("viewpoint","camera","Camera",`${x("Azimuth","viewpoint-camera-azimuth",n.camera?.azimuth===null||n.camera?.azimuth===void 0?"":String(n.camera.azimuth))}
343
+ ${x("Elevation","viewpoint-camera-elevation",n.camera?.elevation===null||n.camera?.elevation===void 0?"":String(n.camera.elevation))}
344
+ ${x("Roll","viewpoint-camera-roll",n.camera?.roll===null||n.camera?.roll===void 0?"":String(n.camera.roll))}
345
+ ${x("Distance","viewpoint-camera-distance",n.camera?.distance===null||n.camera?.distance===void 0?"":String(n.camera.distance))}
346
+ <p class="wo-editor-inline-note">Rotation stays a 2D screen-rotation hint. The camera block stores Schema 2.5 view direction and framing.</p>`)}
347
+ ${pe("viewpoint","layers","Layers",`<fieldset class="wo-editor-fieldset">
327
348
  <legend>Layers</legend>
328
- ${Ge("Background","layer-background",r.layers.background!==!1)}
329
- ${Ge("Guides","layer-guides",r.layers.guides!==!1)}
330
- ${Ge("Orbits back","layer-orbits-back",r.layers["orbits-back"]!==!1)}
331
- ${Ge("Orbits front","layer-orbits-front",r.layers["orbits-front"]!==!1)}
332
- ${Ge("Objects","layer-objects",r.layers.objects!==!1)}
333
- ${Ge("Labels","layer-labels",r.layers.labels!==!1)}
334
- ${Ge("Metadata","layer-metadata",r.layers.metadata!==!1)}
349
+ ${Ne("Background","layer-background",n.layers.background!==!1)}
350
+ ${Ne("Guides","layer-guides",n.layers.guides!==!1)}
351
+ ${Ne("Orbits back","layer-orbits-back",n.layers["orbits-back"]!==!1)}
352
+ ${Ne("Orbits front","layer-orbits-front",n.layers["orbits-front"]!==!1)}
353
+ ${Ne("Events","layer-events",n.layers.events!==!1)}
354
+ ${Ne("Objects","layer-objects",n.layers.objects!==!1)}
355
+ ${Ne("Labels","layer-labels",n.layers.labels!==!1)}
356
+ ${Ne("Metadata","layer-metadata",n.layers.metadata!==!1)}
335
357
  </fieldset>`)}
336
- ${je("viewpoint","filter","Filter",`${M("Filter query","filter-query",r.filter?.query??"")}
337
- ${M("Filter object types","filter-object-types",r.filter?.objectTypes.join(" ")??"")}
338
- ${M("Filter tags","filter-tags",r.filter?.tags.join(" ")??"")}
339
- ${M("Filter groups","filter-groups",r.filter?.groupIds.join(" ")??"")}`)}
340
- </form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function Gc(e,t){let r=e.system?.annotations.find(n=>n.id===t);return r?`<form class="wo-editor-form" data-editor-form="annotation">
358
+ ${pe("viewpoint","filter","Filter",`${x("Filter query","filter-query",n.filter?.query??"")}
359
+ ${x("Filter object types","filter-object-types",n.filter?.objectTypes.join(" ")??"")}
360
+ ${x("Filter tags","filter-tags",n.filter?.tags.join(" ")??"")}
361
+ ${x("Filter groups","filter-groups",n.filter?.groupIds.join(" ")??"")}
362
+ ${x("Events","viewpoint-events",n.events.join(" "))}`)}
363
+ </form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function Qd(e,t){let n=e.events.find(i=>i.id===t);if(!n)return'<p class="wo-editor-empty">Event not found.</p>';let r=e.viewpoints.filter(i=>i.events.includes(n.id)).map(i=>i.id).join(" ");return`<form class="wo-editor-form" data-editor-form="event">
364
+ <h2>Event</h2>
365
+ ${pe("event","basics","Basics",`${x("ID","event-id",n.id)}
366
+ ${x("Kind","event-kind",n.kind)}
367
+ ${x("Label","event-label",n.label)}
368
+ ${Mn("Summary","event-summary",n.summary??"")}
369
+ ${x("Target object","event-target",n.targetObjectId??"")}
370
+ ${x("Participants","event-participants",n.participantObjectIds.join(" "))}
371
+ ${x("Timing","event-timing",n.timing??"")}
372
+ ${x("Visibility","event-visibility",n.visibility??"")}
373
+ ${x("Epoch","event-epoch",n.epoch??"")}
374
+ ${x("Reference plane","event-referencePlane",n.referencePlane??"")}
375
+ ${x("Tags","event-tags",n.tags.join(" "))}
376
+ ${x("Color","event-color",n.color??"")}
377
+ ${Ne("Hidden","event-hidden",n.hidden===!0)}`,!0)}
378
+ ${pe("event","viewpoints","Viewpoints",`${x("Viewpoints","event-viewpoints",r)}`)}
379
+ ${pe("event","positions","Positions",`${n.positions.length>0?`<div class="wo-editor-inline-list">${n.positions.map(i=>Xe({kind:"event-pose",id:n.id,key:i.objectId},i.objectId,null,new Map)).join("")}</div>`:'<p class="wo-editor-empty">No event poses yet.</p>'}
380
+ <div class="wo-editor-inline-actions">
381
+ <button type="button" data-editor-action="add-event-pose" data-editor-event-id="${L(n.id)}">Add pose</button>
382
+ </div>`)}
383
+ </form>`}function eu(e,t,n){let r=e.events.find(a=>a.id===t),i=r?.positions.find(a=>a.objectId===n);if(!r||!i)return'<p class="wo-editor-empty">Event pose not found.</p>';let o=i.placement?.mode??"",s=i.placement?.mode==="orbit"||i.placement?.mode==="surface"||i.placement?.mode==="at"?i.placement.target:"",c=i.placement?.mode==="free"?i.placement.distance?me(i.placement.distance):i.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="event-pose">
384
+ <h2>Event Pose</h2>
385
+ <p class="wo-editor-inline-note">Event <strong>${L(r.label||r.id)}</strong></p>
386
+ ${pe("event-pose","identity","Identity",`${x("Object","pose-object-id",i.objectId)}
387
+ <div class="wo-editor-inline-actions">
388
+ <button type="button" data-path-kind="event" data-path-id="${L(r.id)}">Select event</button>
389
+ </div>`,!0)}
390
+ ${pe("event-pose","placement","Placement",`${St("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],o)}
391
+ ${x("Placement target","placement-target",s)}
392
+ ${x("Free value","placement-free",c)}
393
+ ${x("Distance","placement-distance",i.placement?.mode==="orbit"&&i.placement.distance?me(i.placement.distance):"")}
394
+ ${x("Semi-major","placement-semiMajor",i.placement?.mode==="orbit"&&i.placement.semiMajor?me(i.placement.semiMajor):"")}
395
+ ${x("Eccentricity","placement-eccentricity",i.placement?.mode==="orbit"&&i.placement.eccentricity!==void 0?String(i.placement.eccentricity):"")}
396
+ ${x("Period","placement-period",i.placement?.mode==="orbit"&&i.placement.period?me(i.placement.period):"")}
397
+ ${x("Angle","placement-angle",i.placement?.mode==="orbit"&&i.placement.angle?me(i.placement.angle):"")}
398
+ ${x("Inclination","placement-inclination",i.placement?.mode==="orbit"&&i.placement.inclination?me(i.placement.inclination):"")}
399
+ ${x("Phase","placement-phase",i.placement?.mode==="orbit"&&i.placement.phase?me(i.placement.phase):"")}
400
+ ${x("Inner","prop-inner",i.inner?me(i.inner):"")}
401
+ ${x("Outer","prop-outer",i.outer?me(i.outer):"")}`,!0)}
402
+ ${pe("event-pose","context","Context",`${x("Epoch","pose-epoch",i.epoch??"")}
403
+ ${x("Reference plane","pose-referencePlane",i.referencePlane??"")}
404
+ <p class="wo-editor-inline-note">Falls back to event, then object, then system context when left empty.</p>`)}
405
+ </form>`}function tu(e,t){let n=e.system?.annotations.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="annotation">
341
406
  <h2>Annotation</h2>
342
- ${je("annotation","entry","Entry",`${M("ID","annotation-id",r.id)}
343
- ${M("Label","annotation-label",r.label)}
344
- ${M("Target object","annotation-target",r.targetObjectId??"")}
345
- ${M("Source object","annotation-source",r.sourceObjectId??"")}
346
- ${Qr("Body","annotation-body",r.body)}
347
- ${M("Tags","annotation-tags",r.tags.join(" "))}`,!0)}
348
- </form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function Xc(e,t){let r=e.objects.find(l=>l.id===t);if(!r)return'<p class="wo-editor-empty">Object not found.</p>';let n=r.placement?.mode??"",o=r.placement?.mode==="orbit"||r.placement?.mode==="surface"||r.placement?.mode==="at"?r.placement.target:"",i=r.placement?.mode==="free"?r.placement.distance?Ke(r.placement.distance):r.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="object">
407
+ ${pe("annotation","entry","Entry",`${x("ID","annotation-id",n.id)}
408
+ ${x("Label","annotation-label",n.label)}
409
+ ${x("Target object","annotation-target",n.targetObjectId??"")}
410
+ ${x("Source object","annotation-source",n.sourceObjectId??"")}
411
+ ${Mn("Body","annotation-body",n.body)}
412
+ ${x("Tags","annotation-tags",n.tags.join(" "))}`,!0)}
413
+ </form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function nu(e,t){let n=e.objects.find(s=>s.id===t);if(!n)return'<p class="wo-editor-empty">Object not found.</p>';let r=n.placement?.mode??"",i=n.placement?.mode==="orbit"||n.placement?.mode==="surface"||n.placement?.mode==="at"?n.placement.target:"",o=n.placement?.mode==="free"?n.placement.distance?me(n.placement.distance):n.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="object">
349
414
  <h2>Object</h2>
350
- ${je("object","identity","Identity",`${M("ID","object-id",r.id)}
351
- ${Tt("Type","object-type",Fn.map(l=>[l,Kr(l)]),r.type)}`,!0)}
352
- ${je("object","placement","Placement",`${Tt("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],n)}
353
- ${M("Placement target","placement-target",o)}
354
- ${M("Free value","placement-free",i)}
355
- ${M("Distance","placement-distance",r.placement?.mode==="orbit"&&r.placement.distance?Ke(r.placement.distance):"")}
356
- ${M("Semi-major","placement-semiMajor",r.placement?.mode==="orbit"&&r.placement.semiMajor?Ke(r.placement.semiMajor):"")}
357
- ${M("Eccentricity","placement-eccentricity",r.placement?.mode==="orbit"&&r.placement.eccentricity!==void 0?String(r.placement.eccentricity):"")}
358
- ${M("Period","placement-period",r.placement?.mode==="orbit"&&r.placement.period?Ke(r.placement.period):"")}
359
- ${M("Angle","placement-angle",r.placement?.mode==="orbit"&&r.placement.angle?Ke(r.placement.angle):"")}
360
- ${M("Inclination","placement-inclination",r.placement?.mode==="orbit"&&r.placement.inclination?Ke(r.placement.inclination):"")}
361
- ${M("Phase","placement-phase",r.placement?.mode==="orbit"&&r.placement.phase?Ke(r.placement.phase):"")}`,!0)}
362
- ${je("object","properties","Properties",`<fieldset class="wo-editor-fieldset">
415
+ ${pe("object","identity","Identity",`${x("ID","object-id",n.id)}
416
+ ${St("Type","object-type",oi.map(s=>[s,On(s)]),n.type)}`,!0)}
417
+ ${pe("object","placement","Placement",`${St("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],r)}
418
+ ${x("Placement target","placement-target",i)}
419
+ ${x("Free value","placement-free",o)}
420
+ ${x("Distance","placement-distance",n.placement?.mode==="orbit"&&n.placement.distance?me(n.placement.distance):"")}
421
+ ${x("Semi-major","placement-semiMajor",n.placement?.mode==="orbit"&&n.placement.semiMajor?me(n.placement.semiMajor):"")}
422
+ ${x("Eccentricity","placement-eccentricity",n.placement?.mode==="orbit"&&n.placement.eccentricity!==void 0?String(n.placement.eccentricity):"")}
423
+ ${x("Period","placement-period",n.placement?.mode==="orbit"&&n.placement.period?me(n.placement.period):"")}
424
+ ${x("Angle","placement-angle",n.placement?.mode==="orbit"&&n.placement.angle?me(n.placement.angle):"")}
425
+ ${x("Inclination","placement-inclination",n.placement?.mode==="orbit"&&n.placement.inclination?me(n.placement.inclination):"")}
426
+ ${x("Phase","placement-phase",n.placement?.mode==="orbit"&&n.placement.phase?me(n.placement.phase):"")}`,!0)}
427
+ ${pe("object","properties","Properties",`<fieldset class="wo-editor-fieldset">
363
428
  <legend>Properties</legend>
364
- ${M("Kind","prop-kind",Ye(r.properties.kind))}
365
- ${M("Class","prop-class",Ye(r.properties.class))}
366
- ${M("Culture","prop-culture",Ye(r.properties.culture))}
367
- ${M("Tags","prop-tags",gd(r.properties.tags))}
368
- ${M("Color","prop-color",Ye(r.properties.color))}
369
- ${M("Image","prop-image",Ye(r.properties.image))}
370
- ${Ge("Hidden","prop-hidden",r.properties.hidden===!0)}
371
- ${M("Radius","prop-radius",qe(r.properties.radius))}
372
- ${M("Mass","prop-mass",qe(r.properties.mass))}
373
- ${M("Density","prop-density",qe(r.properties.density))}
374
- ${M("Gravity","prop-gravity",qe(r.properties.gravity))}
375
- ${M("Temperature","prop-temperature",qe(r.properties.temperature))}
376
- ${M("Albedo","prop-albedo",hd(r.properties.albedo))}
377
- ${M("Atmosphere","prop-atmosphere",Ye(r.properties.atmosphere))}
378
- ${M("Inner","prop-inner",qe(r.properties.inner))}
379
- ${M("Outer","prop-outer",qe(r.properties.outer))}
380
- ${M("On","prop-on",Ye(r.properties.on))}
381
- ${M("Source","prop-source",Ye(r.properties.source))}
382
- ${M("Cycle","prop-cycle",qe(r.properties.cycle))}
429
+ ${x("Kind","prop-kind",pt(n.properties.kind))}
430
+ ${x("Class","prop-class",pt(n.properties.class))}
431
+ ${x("Culture","prop-culture",pt(n.properties.culture))}
432
+ ${x("Tags","prop-tags",Mu(n.properties.tags))}
433
+ ${x("Color","prop-color",pt(n.properties.color))}
434
+ ${x("Image","prop-image",pt(n.properties.image))}
435
+ ${Ne("Hidden","prop-hidden",n.properties.hidden===!0)}
436
+ ${x("Radius","prop-radius",ft(n.properties.radius))}
437
+ ${x("Mass","prop-mass",ft(n.properties.mass))}
438
+ ${x("Density","prop-density",ft(n.properties.density))}
439
+ ${x("Gravity","prop-gravity",ft(n.properties.gravity))}
440
+ ${x("Temperature","prop-temperature",ft(n.properties.temperature))}
441
+ ${x("Albedo","prop-albedo",Du(n.properties.albedo))}
442
+ ${x("Atmosphere","prop-atmosphere",pt(n.properties.atmosphere))}
443
+ ${x("Inner","prop-inner",ft(n.properties.inner))}
444
+ ${x("Outer","prop-outer",ft(n.properties.outer))}
445
+ ${x("On","prop-on",pt(n.properties.on))}
446
+ ${x("Source","prop-source",pt(n.properties.source))}
447
+ ${x("Cycle","prop-cycle",ft(n.properties.cycle))}
383
448
  </fieldset>`)}
384
- ${je("object","info","Info",`${Qr("Description","info-description",r.info.description??"")}`)}
385
- </form>`}function M(e,t,r){return`<label class="wo-editor-field">${Jr(e,t)}<input name="${T(t)}" value="${Ii(r)}" /></label>`}function Qr(e,t,r){return`<label class="wo-editor-field">${Jr(e,t)}<textarea name="${T(t)}">${T(r)}</textarea></label>`}function Tt(e,t,r,n){return`<label class="wo-editor-field">${Jr(e,t)}<select name="${T(t)}">${r.map(([o,i])=>`<option value="${T(o)}"${o===n?" selected":""}>${T(i)}</option>`).join("")}</select></label>`}function Ge(e,t,r){return`<label class="wo-editor-checkbox"><input type="checkbox" name="${T(t)}"${r?" checked":""} />${Jr(e,t)}</label>`}function pr(e,t,r,n){let o=document.createElement("button");return o.type="button",o.className="wo-editor-handle",o.dataset.handleKind=e,o.dataset.objectId=t,o.style.left=`${r.x}px`,o.style.top=`${r.y}px`,o.textContent=n,o}function we(e,t){return e.elements.namedItem(t)?.value.trim()??""}function _(e,t){let r=we(e,t);return r||null}function He(e,t){return e.elements.namedItem(t)?.checked??!1}function Kc(e,t){let r=we(e,"placement-mode"),n=_(e,"placement-target");switch(r){case"orbit":return{mode:r,target:n??(t.placement?.mode==="orbit"?t.placement.target:t.id),distance:Xe(_(e,"placement-distance")),semiMajor:Xe(_(e,"placement-semiMajor")),eccentricity:Xr(_(e,"placement-eccentricity"))??void 0,period:Xe(_(e,"placement-period")),angle:Xe(_(e,"placement-angle")),inclination:Xe(_(e,"placement-inclination")),phase:Xe(_(e,"placement-phase"))};case"at":return{mode:r,target:n??t.id,reference:mr(n??t.id)};case"surface":return{mode:r,target:n??t.id};case"free":{let o=_(e,"placement-free"),i=Xe(o);return{mode:r,distance:i??void 0,descriptor:i?void 0:o??void 0}}default:return null}}function Yr(e,t,r){let n=Array.isArray(r)&&r.length===0;if(r==null||n||r===""){delete e[t];return}e[t]=r}function Zc(e){return e?Xe(e)??e:null}function Xe(e){if(!e)return;let t=e.match(/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/);if(t)return{value:Number(t[1]),unit:t[2]??null}}function Xr(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Jc(e){return fr(e).filter(r=>Fn.includes(r))}function fr(e){return e?.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)??[]}function Qc(e,t,r){let n=r.objects.find(o=>o.type==="star")?.id??r.objects[0]?.id??t;return{type:e,id:t,properties:{},placement:e==="structure"||e==="phenomenon"?{mode:"at",target:`${n}:L4`,reference:mr(`${n}:L4`)}:{mode:"orbit",target:n,distance:{value:1,unit:"au"}},info:{}}}function ed(e,t){let r=z(e);return r.objects=r.objects.filter(n=>n.id!==t.id).concat(t).sort(xi),r}function td(e,t,r){let n=z(e);return n.objects=n.objects.filter(o=>o.id!==t).concat(r).sort(xi),t!==r.id&&rd(n,t,r.id),n}function rd(e,t,r){for(let n of e.objects)if(n.id!==r&&(n.placement?.mode==="orbit"&&n.placement.target===t&&(n.placement.target=r),n.placement?.mode==="surface"&&n.placement.target===t&&(n.placement.target=r),n.placement?.mode==="at")){let o=n.placement.reference;o.kind==="anchor"&&o.objectId===t&&(o.objectId=r),o.kind==="lagrange"&&(o.primary===t&&(o.primary=r),o.secondary===t&&(o.secondary=r)),n.placement.target=wi(o)}for(let n of e.system?.viewpoints??[])n.focusObjectId===t&&(n.focusObjectId=r),n.selectedObjectId===t&&(n.selectedObjectId=r);for(let n of e.system?.annotations??[])n.targetObjectId===t&&(n.targetObjectId=r),n.sourceObjectId===t&&(n.sourceObjectId=r)}function nd(e,t){let r=yn(e,t);if(t.kind!=="object"||!t.id)return r;for(let n of r.objects)if(n.placement?.mode==="orbit"&&n.placement.target===t.id&&(n.placement=null),n.placement?.mode==="surface"&&n.placement.target===t.id&&(n.placement=null),n.placement?.mode==="at"){let o=n.placement.reference;(o.kind==="anchor"&&o.objectId===t.id||o.kind==="lagrange"&&(o.primary===t.id||o.secondary===t.id))&&(n.placement=null)}for(let n of r.system?.viewpoints??[])n.focusObjectId===t.id&&(n.focusObjectId=null),n.selectedObjectId===t.id&&(n.selectedObjectId=null);for(let n of r.system?.annotations??[])n.targetObjectId===t.id&&(n.targetObjectId=null),n.sourceObjectId===t.id&&(n.sourceObjectId=null);return r}function od(e,t,r,n){let o=r.orbit;if(!o||r.object.placement?.mode!=="orbit")return e;let i=ue(n,{x:o.cx,y:o.cy},-o.rotationDeg),l=o.kind==="circle"?o.radius??1:o.rx??1,a=o.kind==="circle"?o.radius??1:o.ry??1,s=Math.atan2((i.y-o.cy)/Math.max(a,1),(i.x-o.cx)/Math.max(l,1)),p=yd(s*180/Math.PI),c=z(e),u=c.objects.find(v=>v.id===t);return!u||u.placement?.mode!=="orbit"?e:(u.placement.phase={value:Dt(p,2),unit:"deg"},c)}function id(e,t,r,n,o){let i=r.orbit;if(!i||r.object.placement?.mode!=="orbit"||!o)return e;let l=ue(n,{x:i.cx,y:i.cy},-i.rotationDeg),a=Math.max(Math.abs(l.x-i.cx),24),s=Math.max(a-o.radiusOffsetPx,o.innerPx),p=$d(s,o.innerPx,o.stepPx),c=z(e),u=c.objects.find(k=>k.id===t);if(!u||u.placement?.mode!=="orbit")return e;let v=u.placement.semiMajor??u.placement.distance??{value:1,unit:"au"},x=$i(Math.max(p,0),o.preferredUnit??v.unit);return u.placement.semiMajor?u.placement.semiMajor=x:u.placement.distance=x,c}function ad(e,t,r,n){let o=ud(r,t,n);if(!o)return e;let i=z(e),l=i.objects.find(a=>a.id===t);return!l||l.placement?.mode!=="at"?e:(l.placement.reference=o.reference,l.placement.target=wi(o.reference),i)}function sd(e,t,r,n){let o=dd(r,t,n,a=>Ec.has(a.object.type));if(!o)return e;let i=z(e),l=i.objects.find(a=>a.id===t);return!l||l.placement?.mode!=="surface"?e:(l.placement.target=o.objectId,i)}function ld(e,t,r){if(r.object.placement?.mode!=="orbit"||!r.orbit||!r.parent)return null;let n=r.object.placement.target,o=e.objects.filter(v=>v.placement?.mode==="orbit"&&v.placement.target===n).length,i=Id(t.layoutPreset),l=(o>2?54:64)*i*t.scaleModel.orbitDistanceMultiplier,a=r.parent.radius+56*i*t.scaleModel.orbitDistanceMultiplier,s=r.object.placement.semiMajor??r.object.placement.distance??null,p=vd(s),c=r.orbit.kind==="circle"?r.orbit.radius??1:r.orbit.rx??1,u=xd(p??0,a,l);return{innerPx:a,stepPx:l,radiusOffsetPx:c-u,preferredUnit:s?.unit??null}}function cd(e,t,r,n,o){if(n.object.placement?.mode!=="free")return e;let i=r.width-r.padding-140,l=Math.max(0,i-o.x),a=z(e),s=a.objects.find(u=>u.id===t);if(!s||s.placement?.mode!=="free")return e;let p=wd(s.placement.distance?.unit??null),c=l/Math.max(Ac*r.scaleModel.freePlacementMultiplier,1);return c<.01?(s.placement.distance=void 0,s.placement.descriptor||delete s.placement.descriptor,a):(s.placement.distance=$i(c,p),delete s.placement.descriptor,a)}function dd(e,t,r,n=()=>!0){let o=null,i=Number.POSITIVE_INFINITY;for(let l of e.objects){if(l.hidden||l.objectId===t||!n(l))continue;let a=Math.hypot(r.x-l.x,r.y-l.y);a<i&&(o=l,i=a)}return i<=140?o:null}function ud(e,t,r){let n=null;for(let a of e.objects){if(a.hidden||a.objectId===t)continue;let s=Math.hypot(r.x-a.x,r.y-a.y),p=Math.max(a.visualRadius+16,28);s<=p&&(!n||s<n.distance)&&(n={reference:mr(a.objectId),x:a.x,y:a.y,distance:s})}if(n)return{reference:n.reference,x:n.x,y:n.y};let o=[];for(let a of e.objects)a.hidden||a.objectId===t||o.push({reference:mr(a.objectId),x:a.x,y:a.y});for(let a of e.orbitVisuals){if(a.hidden||a.objectId===t)continue;let s=e.objects.find(c=>c.objectId===a.parentId&&!c.hidden),p=e.objects.find(c=>c.objectId===a.objectId&&!c.hidden);if(!(!s||!p))for(let c of["L1","L2","L3","L4","L5"]){let u=pd(s,p,c);o.push({reference:mr(`${a.objectId}:${c}`),x:u.x,y:u.y})}}let i=null,l=Number.POSITIVE_INFINITY;for(let a of o){let s=Math.hypot(r.x-a.x,r.y-a.y);s<l&&(i=a,l=s)}return l<=140?i:null}function pd(e,t,r){let n=t.x-e.x,o=t.y-e.y,i=Math.hypot(n,o)||1,l=n/i,a=o/i,s=-a,p=l,c=bd(i*.25,24,68);switch(r){case"L1":return{x:t.x-l*c,y:t.y-a*c};case"L2":return{x:t.x+l*c,y:t.y+a*c};case"L3":return{x:e.x-l*c,y:e.y-a*c};case"L4":return{x:t.x+(l*.5-s*.8660254)*c,y:t.y+(a*.5-p*.8660254)*c};case"L5":return{x:t.x+(l*.5+s*.8660254)*c,y:t.y+(a*.5+p*.8660254)*c}}}function mr(e){let t=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(t)return{kind:"lagrange",primary:t[1],secondary:t[2],point:t[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]};let n=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return n?{kind:"anchor",objectId:n[1],anchor:n[2]}:{kind:"named",name:e}}function wi(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 Ze(e){return wn(e)}function vi(e,t){let r=new Set,n=[];for(let o of[...e,...t]){let i=`${o.diagnostic.code}:${o.diagnostic.message}:${ut(o.path)}`;r.has(i)||(r.add(i),n.push(Zr(o)))}return n}function fd(e){let t=new Map;for(let r of e){let n=ut(r.path)??(r.diagnostic.objectId?ut({kind:"object",id:r.diagnostic.objectId}):null);if(!n)continue;let o=t.get(n)??{errors:0,warnings:0};r.diagnostic.severity==="error"?o.errors+=1:r.diagnostic.severity==="warning"&&(o.warnings+=1),t.set(n,o)}return t}function fi(e){return e.diagnostic.line!==void 0&&e.diagnostic.column!==void 0?`Line ${e.diagnostic.line}:${e.diagnostic.column}`:e.diagnostic.line!==void 0?`Line ${e.diagnostic.line}`:null}function md(e,t){if(!t)return[];switch(e.kind){case"system":return t==="id"?["system-id"]:t==="title"?["system-title"]:[];case"defaults":switch(t){case"view":return["defaults-view"];case"scale":return["defaults-scale"];case"units":return["defaults-units"];case"preset":return["defaults-preset"];case"theme":return["defaults-theme"];default:return[]}case"metadata":return t==="key"?["metadata-key"]:["metadata-value"];case"group":switch(t){case"id":return["group-id"];case"label":return["group-label"];case"summary":return["group-summary"];case"color":return["group-color"];case"tags":return["group-tags"];case"hidden":return["group-hidden"];default:return[]}case"viewpoint":switch(t){case"id":return["viewpoint-id"];case"label":return["viewpoint-label"];case"summary":return["viewpoint-summary"];case"focusObjectId":return["viewpoint-focus"];case"selectedObjectId":return["viewpoint-select"];case"projection":return["viewpoint-projection"];case"preset":return["viewpoint-preset"];case"zoom":return["viewpoint-zoom"];case"rotationDeg":return["viewpoint-rotation"];default:return[]}case"annotation":switch(t){case"id":return["annotation-id"];case"label":return["annotation-label"];case"targetObjectId":return["annotation-target"];case"sourceObjectId":return["annotation-source"];case"body":return["annotation-body"];case"tags":return["annotation-tags"];default:return[]}case"relation":switch(t){case"id":return["relation-id"];case"from":return["relation-from"];case"to":return["relation-to"];case"kind":return["relation-kind"];case"label":return["relation-label"];case"summary":return["relation-summary"];case"tags":return["relation-tags"];case"color":return["relation-color"];case"hidden":return["relation-hidden"];default:return[]}case"object":return t==="id"?["object-id"]:t==="type"?["object-type"]:t==="placement"?["placement-mode"]:t==="description"?["info-description"]:t==="reference"?["placement-target"]:t==="descriptor"?["placement-free"]:t==="target"?["placement-target"]:bi.has(t)?[`placement-${t}`]:[`prop-${t}`]}}function mi(e,t){return dr(e,{mode:"interactive",preset:t.system?.defaults.preset??"atlas-card",projection:t.system?.defaults.view??"topdown"})}function qr(e){switch(e.kind){case"system":return"System";case"defaults":return"Defaults";case"metadata":return`Metadata: ${e.key??""}`;case"group":return`Group: ${e.id??""}`;case"object":return`Object: ${e.id??""}`;case"viewpoint":return`Viewpoint: ${e.id??""}`;case"annotation":return`Annotation: ${e.id??""}`;case"relation":return`Relation: ${e.id??""}`}}function ut(e){return e?`${e.kind}:${e.id??e.key??""}`:null}function xi(e,t){return e.id.localeCompare(t.id)}function Gr(e,t){let r=e.trim()||"item",n=1,o=r;for(;t.includes(o);)n+=1,o=`${r}-${n}`;return o}function Kr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Zr(e){return{diagnostic:{...e.diagnostic},path:e.path?{...e.path}:null}}function Ye(e){return typeof e=="string"?e:""}function gd(e){return Array.isArray(e)?e.join(" "):""}function qe(e){return e&&typeof e=="object"&&"value"in e?Ke(e):""}function hd(e){return typeof e=="number"?String(e):""}function Ke(e){return`${e.value}${e.unit??""}`}function Dt(e,t){let r=10**t;return Math.round(e*r)/r}function bd(e,t,r){return Math.min(Math.max(e,t),r)}function yd(e){let t=e%360;return t<0&&(t+=360),t}function wd(e){switch(e){case"au":case"km":case"re":case"sol":case null:return e;default:return null}}function vd(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Lt;case"re":return e.value*gi/Lt;case"sol":return e.value*hi/Lt;default:return e.value}}function $i(e,t){switch(t){case"km":return{value:Dt(e*Lt,0),unit:t};case"re":return{value:Dt(e*Lt/gi,3),unit:t};case"sol":return{value:Dt(e*Lt/hi,4),unit:t};case"au":return{value:Dt(e,3),unit:t};default:return{value:Dt(e,2),unit:null}}}function xd(e,t,r){return t+r*kd(Math.max(e,0)+1)}function $d(e,t,r){return e<=t?0:Math.pow(2,(e-t)/Math.max(r,1e-4))-1}function Id(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function kd(e){return Math.log(e)/Math.log(2)}function T(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Ii(e){return T(e)}function jd(e){if(typeof window>"u"||typeof document>"u")throw new Error("createWorldOrbitEditor can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("WorldOrbit editor requires an HTMLElement container.")}function fe(e,t){let r=e.querySelector(t);if(!r)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return r}function Sd(){if(document.getElementById(pi))return;let e=document.createElement("style");e.id=pi,e.textContent=`
449
+ ${pe("object","info","Info",`${Mn("Description","info-description",n.info.description??"")}`)}
450
+ </form>`}function x(e,t,n){return`<label class="wo-editor-field">${fr(e,t)}<input name="${L(t)}" value="${ia(n)}" /></label>`}function Mn(e,t,n){return`<label class="wo-editor-field">${fr(e,t)}<textarea name="${L(t)}">${L(n)}</textarea></label>`}function St(e,t,n,r){return`<label class="wo-editor-field">${fr(e,t)}<select name="${L(t)}">${n.map(([i,o])=>`<option value="${L(i)}"${i===r?" selected":""}>${L(o)}</option>`).join("")}</select></label>`}function Ne(e,t,n){return`<label class="wo-editor-checkbox"><input type="checkbox" name="${L(t)}"${n?" checked":""} />${fr(e,t)}</label>`}function kn(e,t,n,r){let i=document.createElement("button");return i.type="button",i.className="wo-editor-handle",i.dataset.handleKind=e,i.dataset.objectId=t,i.style.left=`${n.x}px`,i.style.top=`${n.y}px`,i.textContent=r,i}function ge(e,t){return e.elements.namedItem(t)?.value.trim()??""}function M(e,t){let n=ge(e,t);return n||null}function Be(e,t){return e.elements.namedItem(t)?.checked??!1}function ru(e,t){return Qo(e,t.placement,t.id)}function iu(e,t){return Qo(e,t.placement,t.objectId)}function Qo(e,t,n){let r=ge(e,"placement-mode"),i=M(e,"placement-target");switch(r){case"orbit":return{mode:r,target:i??(t?.mode==="orbit"?t.target:n),distance:Ue(M(e,"placement-distance")),semiMajor:Ue(M(e,"placement-semiMajor")),eccentricity:gt(M(e,"placement-eccentricity"))??void 0,period:Ue(M(e,"placement-period")),angle:Ue(M(e,"placement-angle")),inclination:Ue(M(e,"placement-inclination")),phase:Ue(M(e,"placement-phase"))};case"at":return{mode:r,target:i??n,reference:En(i??n)};case"surface":return{mode:r,target:i??n};case"free":{let o=M(e,"placement-free"),s=Ue(o);return{mode:r,distance:s??void 0,descriptor:s?void 0:o??void 0}}default:return null}}function dr(e,t,n){let r=Array.isArray(n)&&n.length===0;if(n==null||r||n===""){delete e[t];return}e[t]=n}function ou(e){return e?Ue(e)??e:null}function Ue(e){if(!e)return;let t=e.match(/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/);if(t)return{value:Number(t[1]),unit:t[2]??null}}function gt(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function au(e){let t={azimuth:gt(M(e,"viewpoint-camera-azimuth")),elevation:gt(M(e,"viewpoint-camera-elevation")),roll:gt(M(e,"viewpoint-camera-roll")),distance:gt(M(e,"viewpoint-camera-distance"))};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function su(e){return Ge(e).filter(n=>oi.includes(n))}function Ge(e){return e?.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)??[]}function cu(e,t,n){let r=n.objects.find(i=>i.type==="star")?.id??n.objects[0]?.id??t;return{type:e,id:t,properties:{},placement:e==="structure"||e==="phenomenon"?{mode:"at",target:`${r}:L4`,reference:En(`${r}:L4`)}:{mode:"orbit",target:r,distance:{value:1,unit:"au"}},info:{}}}function lu(e,t){let n=N(e);return n.objects=n.objects.filter(r=>r.id!==t.id).concat(t).sort(ta),n}function du(e,t,n){let r=N(e);return r.objects=r.objects.filter(i=>i.id!==t).concat(n).sort(ta),t!==n.id&&uu(r,t,n.id),r}function uu(e,t,n){for(let r of e.objects)if(r.id!==n&&(r.placement?.mode==="orbit"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="surface"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="at")){let i=r.placement.reference;i.kind==="anchor"&&i.objectId===t&&(i.objectId=n),i.kind==="lagrange"&&(i.primary===t&&(i.primary=n),i.secondary===t&&(i.secondary=n)),r.placement.target=ii(i)}for(let r of e.system?.viewpoints??[])r.focusObjectId===t&&(r.focusObjectId=n),r.selectedObjectId===t&&(r.selectedObjectId=n);for(let r of e.system?.annotations??[])r.targetObjectId===t&&(r.targetObjectId=n),r.sourceObjectId===t&&(r.sourceObjectId=n);for(let r of e.events){r.targetObjectId===t&&(r.targetObjectId=n),r.participantObjectIds=r.participantObjectIds.map(i=>i===t?n:i);for(let i of r.positions)if(i.objectId===t&&(i.objectId=n),i.placement?.mode==="orbit"&&i.placement.target===t&&(i.placement.target=n),i.placement?.mode==="surface"&&i.placement.target===t&&(i.placement.target=n),i.placement?.mode==="at"){let o=i.placement.reference;o.kind==="anchor"&&o.objectId===t&&(o.objectId=n),o.kind==="lagrange"&&(o.primary===t&&(o.primary=n),o.secondary===t&&(o.secondary=n)),i.placement.target=ii(o)}r.positions.sort(mr)}}function pu(e,t){let n=Rr(e,t);if(t.kind==="event"&&t.id){for(let r of n.system?.viewpoints??[])r.events=r.events.filter(i=>i!==t.id);return n}if(t.kind!=="object"||!t.id)return n;for(let r of n.objects)if(r.placement?.mode==="orbit"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="surface"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="at"){let i=r.placement.reference;(i.kind==="anchor"&&i.objectId===t.id||i.kind==="lagrange"&&(i.primary===t.id||i.secondary===t.id))&&(r.placement=null)}for(let r of n.system?.viewpoints??[])r.focusObjectId===t.id&&(r.focusObjectId=null),r.selectedObjectId===t.id&&(r.selectedObjectId=null);for(let r of n.system?.annotations??[])r.targetObjectId===t.id&&(r.targetObjectId=null),r.sourceObjectId===t.id&&(r.sourceObjectId=null);for(let r of n.events){r.targetObjectId===t.id&&(r.targetObjectId=null),r.participantObjectIds=r.participantObjectIds.filter(i=>i!==t.id),r.positions=r.positions.filter(i=>i.objectId!==t.id);for(let i of r.positions)if(i.placement?.mode==="orbit"&&i.placement.target===t.id&&(i.placement=null),i.placement?.mode==="surface"&&i.placement.target===t.id&&(i.placement=null),i.placement?.mode==="at"){let o=i.placement.reference;(o.kind==="anchor"&&o.objectId===t.id||o.kind==="lagrange"&&(o.primary===t.id||o.secondary===t.id))&&(i.placement=null)}}return n}function Dn(e,t,n){if(t.kind==="event-pose"&&t.id&&t.key){let i=na(e,t.id,t.key);return i?.placement?{placement:i.placement}:null}let r=ku(e,n);return r?.placement?{placement:r.placement}:null}function fu(e,t,n,r,i){let o=r.orbit;if(!o||r.object.placement?.mode!=="orbit")return e;let s=ve(i,{x:o.cx,y:o.cy},-o.rotationDeg),c=o.kind==="circle"?o.radius??1:o.rx??1,a=o.kind==="circle"?o.radius??1:o.ry??1,l=Math.atan2((s.y-o.cy)/Math.max(a,1),(s.x-o.cx)/Math.max(c,1)),d=Au(l*180/Math.PI),f=N(e),w=Dn(f,t,n);return!w||w.placement.mode!=="orbit"?e:(w.placement.phase={value:Bt(d,2),unit:"deg"},f)}function mu(e,t,n,r,i,o){let s=r.orbit;if(!s||r.object.placement?.mode!=="orbit"||!o)return e;let c=ve(i,{x:s.cx,y:s.cy},-s.rotationDeg),a=Math.max(Math.abs(c.x-s.cx),24),l=Math.max(a-o.radiusOffsetPx,o.innerPx),d=Fu(l,o.innerPx,o.stepPx),f=N(e),w=Dn(f,t,n);if(!w||w.placement.mode!=="orbit")return e;let I=w.placement.semiMajor??w.placement.distance??{value:1,unit:"au"},S=ra(Math.max(d,0),o.preferredUnit??I.unit);return w.placement.semiMajor?w.placement.semiMajor=S:w.placement.distance=S,f}function hu(e,t,n,r,i){let o=vu(r,n,i);if(!o)return e;let s=N(e),c=Dn(s,t,n);return!c||c.placement.mode!=="at"?e:(c.placement.reference=o.reference,c.placement.target=ii(o.reference),s)}function gu(e,t,n,r,i){let o=wu(r,n,i,a=>Vd.has(a.object.type));if(!o)return e;let s=N(e),c=Dn(s,t,n);return!c||c.placement.mode!=="surface"?e:(c.placement.target=o.objectId,s)}function bu(e,t,n){if(n.object.placement?.mode!=="orbit"||!n.orbit||!n.parent)return null;let r=n.object.placement.target,i=t.objects.filter(w=>w.object.placement?.mode==="orbit"&&w.object.placement.target===r&&!w.hidden).length,o=Vu(t.layoutPreset),s=(i>2?54:64)*o*t.scaleModel.orbitDistanceMultiplier,c=n.parent.radius+56*o*t.scaleModel.orbitDistanceMultiplier,a=n.object.placement.semiMajor??n.object.placement.distance??null,l=Tu(a),d=n.orbit.kind==="circle"?n.orbit.radius??1:n.orbit.rx??1,f=Cu(l??0,c,s);return{innerPx:c,stepPx:s,radiusOffsetPx:d-f,preferredUnit:a?.unit??null}}function yu(e,t,n,r,i,o){if(i.object.placement?.mode!=="free")return e;let s=r.width-r.padding-140,c=Math.max(0,s-o.x),a=N(e),l=Dn(a,t,n);if(!l||l.placement.mode!=="free")return e;let d=Lu(l.placement.distance?.unit??null),f=c/Math.max(Fd*r.scaleModel.freePlacementMultiplier,1);return f<.01?(l.placement.distance=void 0,l.placement.descriptor||delete l.placement.descriptor,a):(l.placement.distance=ra(f,d),delete l.placement.descriptor,a)}function wu(e,t,n,r=()=>!0){let i=null,o=Number.POSITIVE_INFINITY;for(let s of e.objects){if(s.hidden||s.objectId===t||!r(s))continue;let c=Math.hypot(n.x-s.x,n.y-s.y);c<o&&(i=s,o=c)}return o<=140?i:null}function vu(e,t,n){let r=null;for(let c of e.objects){if(c.hidden||c.objectId===t)continue;let a=Math.hypot(n.x-c.x,n.y-c.y),l=Math.max(c.visualRadius+16,28);a<=l&&(!r||a<r.distance)&&(r={reference:En(c.objectId),x:c.x,y:c.y,distance:a})}if(r)return{reference:r.reference,x:r.x,y:r.y};let i=[];for(let c of e.objects)c.hidden||c.objectId===t||i.push({reference:En(c.objectId),x:c.x,y:c.y});for(let c of e.orbitVisuals){if(c.hidden||c.objectId===t)continue;let a=e.objects.find(d=>d.objectId===c.parentId&&!d.hidden),l=e.objects.find(d=>d.objectId===c.objectId&&!d.hidden);if(!(!a||!l))for(let d of["L1","L2","L3","L4","L5"]){let f=$u(a,l,d);i.push({reference:En(`${c.objectId}:${d}`),x:f.x,y:f.y})}}let o=null,s=Number.POSITIVE_INFINITY;for(let c of i){let a=Math.hypot(n.x-c.x,n.y-c.y);a<s&&(o=c,s=a)}return s<=140?o:null}function $u(e,t,n){let r=t.x-e.x,i=t.y-e.y,o=Math.hypot(r,i)||1,s=r/o,c=i/o,a=-c,l=s,d=Pu(o*.25,24,68);switch(n){case"L1":return{x:t.x-s*d,y:t.y-c*d};case"L2":return{x:t.x+s*d,y:t.y+c*d};case"L3":return{x:e.x-s*d,y:e.y-c*d};case"L4":return{x:t.x+(s*.5-a*.8660254)*d,y:t.y+(c*.5-l*.8660254)*d};case"L5":return{x:t.x+(s*.5+a*.8660254)*d,y:t.y+(c*.5+l*.8660254)*d}}}function En(e){let t=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(t)return{kind:"lagrange",primary:t[1],secondary:t[2],point:t[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};let r=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return r?{kind:"anchor",objectId:r[1],anchor:r[2]}:{kind:"named",name:e}}function ii(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 ht(e){return zr(e)}function ea(e,t){let n=new Set,r=[];for(let i of[...e,...t]){let o=`${i.diagnostic.code}:${i.diagnostic.message}:${Ke(i.path)}`;n.has(o)||(n.add(o),r.push(pr(i)))}return r}function xu(e){let t=new Map;for(let n of e){let r=Ke(n.path)??(n.diagnostic.objectId?Ke({kind:"object",id:n.diagnostic.objectId}):null);if(!r)continue;let i=t.get(r)??{errors:0,warnings:0};n.diagnostic.severity==="error"?i.errors+=1:n.diagnostic.severity==="warning"&&(i.warnings+=1),t.set(r,i)}return t}function Ho(e){return e.diagnostic.line!==void 0&&e.diagnostic.column!==void 0?`Line ${e.diagnostic.line}:${e.diagnostic.column}`:e.diagnostic.line!==void 0?`Line ${e.diagnostic.line}`:null}function Iu(e,t){if(!t)return[];switch(e.kind){case"system":return t==="id"?["system-id"]:t==="title"?["system-title"]:[];case"defaults":switch(t){case"view":return["defaults-view"];case"scale":return["defaults-scale"];case"units":return["defaults-units"];case"preset":return["defaults-preset"];case"theme":return["defaults-theme"];default:return[]}case"metadata":return t==="key"?["metadata-key"]:["metadata-value"];case"group":switch(t){case"id":return["group-id"];case"label":return["group-label"];case"summary":return["group-summary"];case"color":return["group-color"];case"tags":return["group-tags"];case"hidden":return["group-hidden"];default:return[]}case"viewpoint":switch(t){case"id":return["viewpoint-id"];case"label":return["viewpoint-label"];case"summary":return["viewpoint-summary"];case"focusObjectId":return["viewpoint-focus"];case"selectedObjectId":return["viewpoint-select"];case"projection":return["viewpoint-projection"];case"preset":return["viewpoint-preset"];case"zoom":return["viewpoint-zoom"];case"rotationDeg":return["viewpoint-rotation"];case"camera":return["viewpoint-camera-azimuth","viewpoint-camera-elevation","viewpoint-camera-roll","viewpoint-camera-distance"];case"camera.azimuth":return["viewpoint-camera-azimuth"];case"camera.elevation":return["viewpoint-camera-elevation"];case"camera.roll":return["viewpoint-camera-roll"];case"camera.distance":return["viewpoint-camera-distance"];case"events":return["viewpoint-events"];default:return[]}case"event":switch(t){case"id":return["event-id"];case"kind":return["event-kind"];case"label":return["event-label"];case"summary":return["event-summary"];case"targetObjectId":case"target":return["event-target"];case"participantObjectIds":case"participants":return["event-participants"];case"timing":return["event-timing"];case"visibility":return["event-visibility"];case"epoch":return["event-epoch"];case"referencePlane":return["event-referencePlane"];case"tags":return["event-tags"];case"color":return["event-color"];case"hidden":return["event-hidden"];default:return[]}case"event-pose":return t==="objectId"?["pose-object-id"]:t==="placement"?["placement-mode"]:t==="reference"||t==="target"?["placement-target"]:t==="descriptor"?["placement-free"]:ri.has(t)?[`placement-${t}`]:t==="inner"||t==="outer"?[`prop-${t}`]:t==="epoch"?["pose-epoch"]:t==="referencePlane"?["pose-referencePlane"]:[];case"annotation":switch(t){case"id":return["annotation-id"];case"label":return["annotation-label"];case"targetObjectId":return["annotation-target"];case"sourceObjectId":return["annotation-source"];case"body":return["annotation-body"];case"tags":return["annotation-tags"];default:return[]}case"relation":switch(t){case"id":return["relation-id"];case"from":return["relation-from"];case"to":return["relation-to"];case"kind":return["relation-kind"];case"label":return["relation-label"];case"summary":return["relation-summary"];case"tags":return["relation-tags"];case"color":return["relation-color"];case"hidden":return["relation-hidden"];default:return[]}case"object":return t==="id"?["object-id"]:t==="type"?["object-type"]:t==="placement"?["placement-mode"]:t==="description"?["info-description"]:t==="reference"?["placement-target"]:t==="descriptor"?["placement-free"]:t==="target"?["placement-target"]:ri.has(t)?[`placement-${t}`]:[`prop-${t}`]}}function qo(e,t){return In(e,{mode:"interactive",preset:t.system?.defaults.preset??"atlas-card",projection:t.system?.defaults.view??"topdown"})}function ur(e){switch(e.kind){case"system":return"System";case"defaults":return"Defaults";case"metadata":return`Metadata: ${e.key??""}`;case"group":return`Group: ${e.id??""}`;case"event":return`Event: ${e.id??""}`;case"event-pose":return`Event Pose: ${e.id??""} / ${e.key??""}`;case"object":return`Object: ${e.id??""}`;case"viewpoint":return`Viewpoint: ${e.id??""}`;case"annotation":return`Annotation: ${e.id??""}`;case"relation":return`Relation: ${e.id??""}`}}function Ke(e){return e?`${e.kind}:${e.id??""}:${e.key??""}`:null}function ni(e){return e&&(e.kind==="event"||e.kind==="event-pose")?e.id??null:null}function ta(e,t){return e.id.localeCompare(t.id)}function Go(e,t){return e.id.localeCompare(t.id)}function mr(e,t){return e.objectId.localeCompare(t.objectId)}function ju(e,t){return e.events.find(n=>n.id===t)??null}function na(e,t,n){return ju(e,t)?.positions.find(r=>r.objectId===n)??null}function ku(e,t){return e.objects.find(n=>n.id===t)??null}function Su(e,t){let n=N(e),r=n.events.find(o=>o.id===t);if(!r)return e;let i=n.objects.find(o=>!r.positions.some(s=>s.objectId===o.id))??n.objects[0];return i?(r.targetObjectId!==i.id&&!r.participantObjectIds.includes(i.id)&&(r.participantObjectIds.push(i.id),r.participantObjectIds.sort((o,s)=>o.localeCompare(s))),r.positions.push(Ou(i)),r.positions.sort(mr),n):e}function Ou(e){return{objectId:e.id,placement:e.placement?structuredClone(e.placement):null,inner:Xo(e.properties.inner),outer:Xo(e.properties.outer)}}function Eu(e,t,n,r){let i=new Set(r);for(let o of e.system?.viewpoints??[]){let s=new Set(o.events);s.delete(t),s.delete(n),i.has(o.id)&&s.add(n),o.events=[...s].sort((c,a)=>c.localeCompare(a))}}function Sn(e,t){let n=e.trim()||"item",r=1,i=n;for(;t.includes(i);)r+=1,i=`${n}-${r}`;return i}function On(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function pr(e){return{diagnostic:{...e.diagnostic},path:e.path?{...e.path}:null}}function pt(e){return typeof e=="string"?e:""}function Mu(e){return Array.isArray(e)?e.join(" "):""}function ft(e){return e&&typeof e=="object"&&"value"in e?me(e):""}function Xo(e){return e&&typeof e=="object"&&"value"in e?e:void 0}function Du(e){return typeof e=="number"?String(e):""}function me(e){return`${e.value}${e.unit??""}`}function Bt(e,t){let n=10**t;return Math.round(e*n)/n}function Pu(e,t,n){return Math.min(Math.max(e,t),n)}function Au(e){let t=e%360;return t<0&&(t+=360),t}function Lu(e){switch(e){case"au":case"km":case"re":case"sol":case null:return e;default:return null}}function Tu(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Nt;case"re":return e.value*Ko/Nt;case"sol":return e.value*Zo/Nt;default:return e.value}}function ra(e,t){switch(t){case"km":return{value:Bt(e*Nt,0),unit:t};case"re":return{value:Bt(e*Nt/Ko,3),unit:t};case"sol":return{value:Bt(e*Nt/Zo,4),unit:t};case"au":return{value:Bt(e,3),unit:t};default:return{value:Bt(e,2),unit:null}}}function Cu(e,t,n){return t+n*Ru(Math.max(e,0)+1)}function Fu(e,t,n){return e<=t?0:Math.pow(2,(e-t)/Math.max(n,1e-4))-1}function Vu(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ru(e){return Math.log(e)/Math.log(2)}function L(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ia(e){return L(e)}function zu(e){if(typeof window>"u"||typeof document>"u")throw new Error("createWorldOrbitEditor can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("WorldOrbit editor requires an HTMLElement container.")}function je(e,t){let n=e.querySelector(t);if(!n)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return n}function _u(){if(document.getElementById(Yo))return;let e=document.createElement("style");e.id=Yo,e.textContent=`
386
451
  .wo-editor {
387
452
  --wo-editor-sidebar-width: 280px;
388
453
  --wo-editor-inspector-width: 360px;
@@ -575,6 +640,12 @@
575
640
  .wo-editor-overlay-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.24); }
576
641
  .wo-editor-outline { display: grid; gap: 14px; }
577
642
  .wo-editor-outline-section { display: grid; gap: 8px; }
643
+ .wo-editor-outline-group { display: grid; gap: 6px; }
644
+ .wo-editor-outline-children {
645
+ display: grid;
646
+ gap: 6px;
647
+ padding-left: 16px;
648
+ }
578
649
  .wo-editor-outline-section h3 {
579
650
  margin: 0;
580
651
  color: rgba(237,246,255,0.68);
@@ -614,6 +685,27 @@
614
685
  background: rgba(255, 120, 120, 0.18);
615
686
  color: #ffb2b2;
616
687
  }
688
+ .wo-editor-inline-list { display: grid; gap: 8px; }
689
+ .wo-editor-inline-actions {
690
+ display: flex;
691
+ flex-wrap: wrap;
692
+ gap: 10px;
693
+ margin-top: 12px;
694
+ }
695
+ .wo-editor-inline-actions button {
696
+ border: 1px solid rgba(255,255,255,0.14);
697
+ border-radius: 999px;
698
+ background: rgba(255,255,255,0.06);
699
+ color: #edf6ff;
700
+ cursor: pointer;
701
+ font: 600 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
702
+ padding: 8px 12px;
703
+ }
704
+ .wo-editor-inline-note {
705
+ margin: 0 0 12px;
706
+ color: rgba(237,246,255,0.72);
707
+ font: 500 12px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
708
+ }
617
709
  .wo-editor-diagnostics { display: grid; gap: 10px; }
618
710
  .wo-editor-diagnostic {
619
711
  display: grid;
@@ -809,4 +901,4 @@
809
901
  .wo-editor-stage { min-height: 440px; }
810
902
  .wo-editor-status { flex-direction: column; }
811
903
  }
812
- `,document.head.append(e)}return Ci(Od);})();
904
+ `,document.head.append(e)}return ya(Bu);})();