worldorbit 2.5.16 → 2.5.17

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 (34) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/core/dist/index.js +750 -73
  3. package/dist/browser/editor/dist/index.js +1303 -135
  4. package/dist/browser/markdown/dist/index.js +631 -72
  5. package/dist/browser/viewer/dist/index.js +658 -77
  6. package/dist/unpkg/core/dist/index.js +750 -73
  7. package/dist/unpkg/editor/dist/index.js +1303 -135
  8. package/dist/unpkg/markdown/dist/index.js +631 -72
  9. package/dist/unpkg/viewer/dist/index.js +658 -77
  10. package/dist/unpkg/worldorbit-core.min.js +12 -12
  11. package/dist/unpkg/worldorbit-editor.min.js +284 -202
  12. package/dist/unpkg/worldorbit-markdown.min.js +66 -58
  13. package/dist/unpkg/worldorbit-viewer.min.js +76 -68
  14. package/dist/unpkg/worldorbit.js +797 -78
  15. package/dist/unpkg/worldorbit.min.js +80 -72
  16. package/package.json +1 -1
  17. package/packages/core/dist/atlas-edit.js +74 -0
  18. package/packages/core/dist/atlas-validate.js +122 -8
  19. package/packages/core/dist/draft-parse.js +212 -8
  20. package/packages/core/dist/draft.d.ts +5 -2
  21. package/packages/core/dist/draft.js +59 -3
  22. package/packages/core/dist/format.js +63 -1
  23. package/packages/core/dist/normalize.js +1 -0
  24. package/packages/core/dist/scene.js +248 -46
  25. package/packages/core/dist/types.d.ts +41 -2
  26. package/packages/editor/dist/editor.js +597 -61
  27. package/packages/editor/dist/types.d.ts +3 -1
  28. package/packages/viewer/dist/atlas-state.js +6 -0
  29. package/packages/viewer/dist/atlas-viewer.js +1 -0
  30. package/packages/viewer/dist/render.js +31 -2
  31. package/packages/viewer/dist/theme.js +1 -0
  32. package/packages/viewer/dist/tooltip.js +9 -0
  33. package/packages/viewer/dist/types.d.ts +8 -1
  34. package/packages/viewer/dist/viewer.js +12 -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 dr=Object.defineProperty;var Ji=Object.getOwnPropertyDescriptor;var Qi=Object.getOwnPropertyNames;var ea=Object.prototype.hasOwnProperty;var ta=(e,t)=>{for(var n in t)dr(e,n,{get:t[n],enumerable:!0})},na=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Qi(t))!ea.call(e,o)&&o!==n&&dr(e,o,{get:()=>t[o],enumerable:!(r=Ji(t,o))||r.enumerable});return e};var ra=e=>na(dr({},"__esModule",{value:!0}),e);var vu={};ta(vu,{createWorldOrbitEditor:()=>Vi});var y=class e extends Error{line;column;constructor(t,n,r){let o=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var qt=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ke=qt.filter(e=>e!=="system"),oa=["star","planet","moon","asteroid","comet","structure","phenomenon"],Gr=["structure","phenomenon"],et=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ia=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function B(e,t){return{key:e,...t}}var An=new Set(qt),Xr=new Map([B("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:et}),B("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"distance"}),B("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"distance"}),B("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:et}),B("period",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"duration"}),B("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"angle"}),B("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"angle"}),B("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"angle"}),B("at",{kind:"string",placement:!0,arity:"single",objectTypes:Gr}),B("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Gr}),B("free",{kind:"string",placement:!0,arity:"single",objectTypes:ia}),B("kind",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("class",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("culture",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:qt}),B("color",{kind:"string",placement:!1,arity:"single",objectTypes:qt}),B("image",{kind:"string",placement:!1,arity:"single",objectTypes:oa}),B("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:qt}),B("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"radius"}),B("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"mass"}),B("density",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"generic"}),B("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"generic"}),B("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"generic"}),B("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:ke}),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:ke}),B("source",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"duration"})].map(e=>[e.key,e])),aa=new Set(Xr.keys());function $e(e){return Xr.get(e)}function Kr(e){return aa.has(e)}function Zr(e,t){return e.objectTypes.includes(t)}function Tn(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 Gt(e,t={}){let n=[],r=t.columnOffset??0,o="",i=null,s=!1,c=!1,a=null,l=()=>{i!==null&&(n.push({value:o,column:i,quoted:s}),o="",i=null,s=!1)};for(let p=0;p<e.length;p++){let f=e[p],w=r+p+1;if(c&&f==="\\"){let x=e[p+1];if(x==='"'||x==="\\"){o+=x,p++;continue}}if(f==='"'){c?c=!1:(i===null&&(i=w),s=!0,a=w,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}i===null&&(i=w),o+=f}if(c)throw new y("Unclosed quote in line",t.line,a??r+e.length);return l(),n}function Pn(e){return e.match(/^\s*/)?.[0].length??0}function Xt(e){let t=e.split(/\r?\n/),n=[],r=null,o=!1,i=null;for(let s=0;s<t.length;s++){let c=t[s],a=s+1;if(!c.trim())continue;let l=Pn(c),p=Gt(c.slice(l),{line:a,columnOffset:l});if(p.length!==0){if(l===0){o=!1,i=null;let f=sa(p,a);n.push(f),r=f;continue}if(!r)throw new y("Indented line without parent object",a,l+1);if(p.length===1&&p[0].value==="info"){o=!0,i=l;continue}o&&l<=(i??0)&&(o=!1),o?r.infoEntries.push(da(p,a)):r.blockFields.push(la(p,a))}}return{type:"document",objects:n}}function sa(e,t){if(e.length<2)throw new y("Invalid object declaration",t,e[0]?.column??1);let[n,r,...o]=e;if(!An.has(n.value))throw new y(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:ca(o,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function ca(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r],i=$e(o.value);if(!i)throw new y(`Unknown field "${o.value}"`,t,o.column);r++;let s=[];if(i.arity==="multiple")for(;r<e.length&&!Kr(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new y(`Missing value for field "${o.value}"`,t,o.column);n.push({type:"field",key:o.value,values:s.map(c=>c.value),location:{line:t,column:o.column}})}return n}function la(e,t){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);if(!$e(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(n=>n.value),location:{line:t,column:e[0].column}}}function da(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(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Jr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,ua=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),pa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Kt(e){let t=null,n=[];for(let r of e.objects){let o=fa(r);if(r.objectType==="system"){if(t)throw y.fromLocation("Only one system object is allowed",r.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function fa(e){let t=[...e.inlineFields,...e.blockFields];ma(e.objectType,t);let n=ga(t),r=ha(e.objectType,n),o=ba(n),i=va(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:r,info:i}}function ma(e,t){for(let n of t){let r=$e(n.key);if(!r)throw y.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Zr(r,e))throw y.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw y.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function ga(e){let t=new Map;for(let n of e){if(t.has(n.key))throw y.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function ha(e,t){let n=t.has("orbit"),r=t.has("at"),o=t.has("surface"),i=t.has("free"),s=[n,r,o,i].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw y.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw y.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Cn(t,"orbit"),distance:jt(t,"distance"),semiMajor:jt(t,"semiMajor"),eccentricity:Ia(t,"eccentricity"),period:jt(t,"period"),angle:jt(t,"angle"),inclination:jt(t,"inclination"),phase:jt(t,"phase")};if(r){let c=Fn(t,"at"),a=Cn(t,"at");return{mode:"at",target:a,reference:$a(a,c.location)}}if(o)return{mode:"surface",target:Cn(t,"surface")};if(i){let c=Cn(t,"free"),a=xa(c);return{mode:"free",distance:a??void 0,descriptor:a?void 0:c}}return null}function ba(e){let t={};for(let[n,r]of e.entries()){let o=$e(n);if(!(!o||o.placement))switch(o.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=ja(r);break;case"number":t[n]=eo(kt(r),n,r.location);break;case"unit":t[n]=Qr(kt(r),r.location,n);break;case"string":t[n]=ya(n,r);break}}return t}function ya(e,t){let n=t.values.join(" ").trim();return e==="image"&&wa(n,t.location),n}function wa(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 n=e.match(pa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw y.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function va(e){let t={};for(let n of e){if(n.key in t)throw y.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function $a(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 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 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 Qr(e,t,n){let r=e.match(Jr);if(!r)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=$e(n);if(i?.unitFamily&&!Tn(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function xa(e){let t=e.match(Jr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function jt(e,t){if(!e.has(t))return;let n=Fn(e,t);return Qr(kt(n),n.location,t)}function Ia(e,t){if(!e.has(t))return;let n=Fn(e,t);return eo(kt(n),t,n.location)}function eo(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ja(e){let t=kt(e).toLowerCase(),n=ua.get(t);if(n===void 0)throw y.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Fn(e,t){let n=e.get(t);if(!n)throw new y(`Missing value for key "${t}"`);return n}function Cn(e,t){return kt(Fn(e,t))}function kt(e){if(e.values.length!==1)throw y.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var ka=new Set(["star","planet","moon","asteroid","comet"]);function Zt(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new y(`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 y(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let o=n.get(r.placement.target);if(!o||!ka.has(o.type))throw new y(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Sa(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Oa(r,r.placement.reference,t))}}function Sa(e,t,n){if(!n.has(t.primary))throw new y(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new y(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Oa(e,t,n){if(!n.has(t.objectId))throw new y(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function bt(e,t,n=`${t}.failed`){return e instanceof y?{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 Jt=1495978707e-1,Ea=6371,Ma=71492,Da=695700,La=63241.077,Aa=206264.806,Ta=206264806,ao=.68,Pa=.2,so=28;function Se(e,t={}){let n=Va(t),r=n.width,o=n.height,i=n.padding,s=Fa(e),c=Ba(e,t.projection),a=_a(s,t.scaleModel),l=Ua(s),p=e.system?.id??null,f=t.activeEventId??null,w=Ca(e.objects,e.events??[],f),x=new Map(w.map(O=>[O.id,O])),S=Os(w,x),k=new Map,C=[],q=[],v=[],A=[],re=[],Q=new Map,ee=new Map;for(let O of w){let H=O.placement;if(!H){v.push(O);continue}if(H.mode==="orbit"){ro(ee,H.target,O);continue}if(H.mode==="surface"){ro(Q,H.target,O);continue}if(H.mode==="at"){re.push(O);continue}A.push(O)}let te=A.length>0?r*.42:r/2,W=o/2,ce={orbitChildren:ee,surfaceChildren:Q,objectMap:x,spacingFactor:l,projection:c,scaleModel:a},X=v.find(O=>O.type==="star")??v[0]??null;X&&ur(X,te,W,0,k,C,q,ce);let ne=v.filter(O=>O.id!==X?.id);if(ne.length>0){let O=Math.min(r,o)*.28*l*a.orbitDistanceMultiplier;ne.forEach((H,N)=>{let qe=nn(N,ne.length,-Math.PI/2),le=rn(qe,O,c,1);ur(H,te+le.x,W+le.y,0,k,C,q,ce)})}A.forEach((O,H)=>{let N=r-i-140-Ts(O.placement?.mode==="free"?O.placement.distance:void 0,a),qe=Math.max(76,(o-i*2-180)/Math.max(1,A.length)*l)*a.freePlacementMultiplier,le=i+92+H*qe;k.set(O.id,{object:O,x:N,y:le,radius:_n(O,0,a),sortKey:Un(N,le,0)}),q.push({object:O,groupId:S.groupIds.get(O.id)??null,x1:N-60,y1:le,x2:N-18,y2:le,mode:"free"}),Rn(O,k,C,q,ce,1)}),re.forEach((O,H)=>{if(k.has(O.id)||!O.placement||O.placement.mode!=="at")return;let N=ks(O.placement.reference,k,x,H,re.length,r,o,i,ce);k.set(O.id,{object:O,x:N.x,y:N.y,radius:_n(O,2,a),sortKey:Un(N.x,N.y,2),anchorX:N.anchorX,anchorY:N.anchorY}),N.anchorX!==void 0&&N.anchorY!==void 0&&q.push({object:O,groupId:S.groupIds.get(O.id)??null,x1:N.anchorX,y1:N.anchorY,x2:N.x,y2:N.y,mode:"at"}),Rn(O,k,C,q,ce,2)});let Y=[...k.values()].map(O=>za(O,a,S)),he=C.map(O=>Wa(O,S.groupIds.get(O.object.id)??null)),ye=q.map(O=>Ya(O)),Ee=Ha(Y,r,o,a.labelMultiplier),ut=es(e,Y),D=ts(e.events??[],Y,f),ae=Za(he,ut,D,ye,Y,Ee),pt=Ja(Y,he,ye,Ee,S,a.labelMultiplier),ft=Qa(e,Y),T=ns(e,c,n.preset,S,x),V=hs(r,o,Y,he,ye,Ee,a.labelMultiplier);return{width:r,height:o,padding:i,renderPreset:n.preset,projection:c,scaleModel:a,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${oo(c)} view - ${oo(s)} layout`,systemId:p,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:V,layers:ae,groups:pt,semanticGroups:ft,viewpoints:T,events:D,activeEventId:f,objects:Y,orbitVisuals:he,relations:ut,leaders:ye,labels:Ee}}function we(e,t,n){let r=zn(n),o=Math.cos(r),i=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*o-c*i,y:t.y+s*i+c*o}}function Ca(e,t,n){let r=e.map(s=>structuredClone(s));if(!n)return r;let o=t.find(s=>s.id===n);if(!o)return r;let i=new Map(r.map(s=>[s.id,s]));for(let s of o.positions){let c=i.get(s.objectId);c&&(c.placement=s.placement?structuredClone(s.placement):null,s.inner?c.properties.inner={...s.inner}:delete c.properties.inner,s.outer?c.properties.outer={...s.outer}:delete c.properties.outer)}return r}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 Va(e){let t=Ra(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Ra(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 Ba(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function _a(e,t){return{...Na(e),...t}}function Na(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 Ua(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function za(e,t,n){let{object:r,x:o,y:i,radius:s,sortKey:c,anchorX:a,anchorY:l}=e,p=r.renderHints?.renderPriority??0;return{renderId:St(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:o,y:i,radius:s,visualRadius:As(r,s,t),sortKey:c+p*.001,anchorX:a,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Cs(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Wa(e,t){return{renderId:`${St(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 Ya(e){return{renderId:`${St(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 Ha(e,t,n,r){let o=[],i=[],s=new Map(e.map(a=>[a.objectId,a])),c=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort(qa);for(let a of c){let l=Ga(a,s,i,t,n,r)??lo(a,co(a,s.get(a.parentId??"")??null,n),0,r);i.push(ho(a,l,r)),o.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 o}function qa(e,t){let n=to(e)-to(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 to(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 Ga(e,t,n,r,o,i){for(let s of Xa(e,t,r,o)){let c=s==="left"||s==="right"?4:6;for(let a=0;a<=c;a+=1){let l=lo(e,s,a,i),p=ho(e,l,i);if(!n.some(f=>Ds(f,p)))return l}}return null}function Xa(e,t,n,r){let o=e.parentId?t.get(e.parentId)??null:null,i=co(e,o,r),s=i==="below"?"above":"below",c=Ka(e,o,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,i,a,s]:[i,c,s,a]}function co(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 Ka(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 lo(e,t,n,r){let o=14*r;switch(t){case"above":{let i=e.y-(e.radius+18*r+n*o);return{x:e.x,labelY:i,secondaryY:i-16*r,textAnchor:"middle",direction:t}}case"below":{let i=e.y+e.radius+18*r+n*o;return{x:e.x,labelY:i,secondaryY:i+16*r,textAnchor:"middle",direction:t}}case"left":{let i=e.x-(e.visualRadius+16*r+n*o),s=e.y-4*r;return{x:i,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let i=e.x+e.visualRadius+16*r+n*o,s=e.y-4*r;return{x:i,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function Za(e,t,n,r,o,i){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:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:i.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Ja(e,t,n,r,o,i){let s=new Map,c=a=>{if(!a)return null;let l=s.get(a);if(l)return l;let p=o.groupRoots.get(a)??null,f={renderId:a,rootObjectId:p,label:p??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:tn(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=Es(a,e,t,n,r,i);return[...s.values()].sort((a,l)=>a.label.localeCompare(l.label))}function Qa(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 es(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let o=n.get(r.from),i=n.get(r.to);return{renderId:`${St(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:r.hidden||!o||!i||o.hidden||i.hidden}}).sort((r,o)=>r.relation.id.localeCompare(o.relation.id))}function ts(e,t,n){let r=new Map(t.map(o=>[o.objectId,o]));return e.map(o=>{let i=[...new Set([...o.targetObjectId?[o.targetObjectId]:[],...o.participantObjectIds])],s=i.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,p)=>l+p.x,0)/s.length:0,a=s.length>0?s.reduce((l,p)=>l+p.y,0)/s.length:0;return{renderId:`${St(o.id)}-event`,eventId:o.id,event:o,objectIds:i,participantIds:[...o.participantObjectIds],targetObjectId:o.targetObjectId,x:c,y:a,hidden:o.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&o.id!==n}}).sort((o,i)=>o.event.id.localeCompare(i.event.id))}function ns(e,t,n,r,o){let i=rs(e,t,n),s=new Map;for(let[l,p]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,w,...x]=l.split(".");if(f!=="viewpoint"||!w||x.length===0)continue;let S=fs(w);if(!S)continue;let k=x.join(".").toLowerCase(),C=s.get(S)??{id:S};os(C,k,p,e,t,n,r,o),s.set(S,C)}let c=[...s.values()].map(l=>is(l,t,n,o)).filter(Boolean),a=c.findIndex(l=>l.id===i.id);return a>=0?c.splice(a,1,{...i,...c[a],layers:{...i.layers,...c[a].layers},filter:c[a].filter??i.filter,generated:!1}):c.unshift(i),c.sort((l,p)=>l.id==="overview"?-1:p.id==="overview"?1:l.label.localeCompare(p.label))}function rs(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function os(e,t,n,r,o,i,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=en(a);return;case"projection":case"view":e.projection=ss(a)??o;return;case"preset":e.preset=cs(a)??i;return;case"rotation":case"angle":e.rotationDeg=uo(a)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=ls(a);return;case"layers":e.layers=ds(a);return;case"query":e.filter={...e.filter??Vn(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??Vn(),objectTypes:us(a)};return;case"tags":e.filter={...e.filter??Vn(),tags:en(a)};return;case"groups":e.filter={...e.filter??Vn(),groupIds:ps(a,r,s,c)};return}}function is(e,t,n,r){let o=e.focus&&r.has(e.focus)?e.focus:null,i=e.select&&r.has(e.select)?e.select:o,s=as(e.filter),c=e.label?.trim()||ms(e.id);return{id:e.id,label:c,summary:e.summary?.trim()||gs(c,o,s),objectId:o,selectedObjectId:i,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Vn(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function as(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 ss(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function cs(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function uo(e){let t=Number(e);return Number.isFinite(t)?t:null}function ls(e){let t=uo(e);return t!==null&&t>0?t:null}function ds(e){let t={};for(let n of en(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),o=n.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="events"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=r)}return t}function us(e){return en(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function ps(e,t,n,r){return en(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:n.groupIds.has(o)?n.groupIds.get(o)??Qt(o):(r.has(o),Qt(o)))}function en(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function fs(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 gs(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 hs(e,t,n,r,o,i,s){let c=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,p=Number.NEGATIVE_INFINITY,f=(w,x)=>{c=Math.min(c,w),a=Math.min(a,x),l=Math.max(l,w),p=Math.max(p,x)};for(let w of r)w.hidden||po(w,f);for(let w of o)w.hidden||(f(w.x1,w.y1),f(w.x2,w.y2));for(let w of n)w.hidden||fo(w,f);for(let w of i)w.hidden||mo(w,f,s);return!Number.isFinite(c)||!Number.isFinite(a)?tn(0,0,e,t):tn(c,a,l,p)}function po(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,o=e.ry??e.radius??0,i=yo(e.cx,e.cy,r,o,e.rotationDeg,0,Math.PI*2,so*2);for(let s of i)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function tn(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 fo(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 mo(e,t,n){let r=bo(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 ur(e,t,n,r,o,i,s,c){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:n,radius:_n(e,r,c.scaleModel),sortKey:Un(t,n,r)}),Rn(e,o,i,s,c,r+1))}function Rn(e,t,n,r,o,i){let s=t.get(e.id);if(!s)return;let c=[...o.orbitChildren.get(e.id)??[]].sort(bs),a=ys(c,s.radius,o.spacingFactor,o.scaleModel),l=$s(c,a);c.forEach((f,w)=>{let x=ws(f,w,c.length,s,a,l[w]??a.innerPx,o);n.push({object:f,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}),ur(f,x.objectX,x.objectY,i,t,n,r,o)});let p=[...o.surfaceChildren.get(e.id)??[]];p.forEach((f,w)=>{let x=nn(w,p.length,-Math.PI/3),S=28*o.spacingFactor,k=rn(x,s.radius,o.projection,o.projection==="isometric"?.9:1),C=rn(x,s.radius+S,o.projection,o.projection==="isometric"?.9:1),q=s.x+k.x,v=s.y+k.y,A=s.x+C.x,re=s.y+C.y;t.set(f.id,{object:f,x:A,y:re,radius:_n(f,i+1,o.scaleModel),sortKey:Un(A,re,i+1),anchorX:q,anchorY:v}),r.push({object:f,groupId:o.objectMap.has(f.id)?Qt(Ms(f,o.objectMap)):null,x1:q,y1:v,x2:A,y2:re,mode:"surface"}),Rn(f,t,n,r,o,i+1)})}function bs(e,t){let n=Bn(e),r=Bn(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 ys(e,t,n,r){let o=e.map(f=>Bn(f)),i=o.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,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(...i),l=Math.max(...i),p=l-a;return{metrics:o,minMetric:a,maxMetric:l,metricSpread:p,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function ws(e,t,n,r,o,i,s){let c=e.placement,a=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let W=o.innerPx+t*o.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:W,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-W}}let l=se(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),p=i,f=Math.max(p*Math.sqrt(1-l*l),p*.18),w=fr(c.inclination)??0,x=s.projection==="isometric"?Math.max(Pa,Math.cos(zn(w)))*ao:1,S=Math.max(f*x,p*.14),k=fr(c.angle)??0,C=p*l,q=vo(-C,0,k),v=r.x+q.x,A=r.y+q.y,re=Is(c.phase,t,n),Q=wo(v,A,p,S,k,re),ee=s.projection==="topdown"&&l<=1e-4&&Math.abs(k)<=1e-4,te=a?js(e,p,o,s.scaleModel):void 0;return{kind:ee?"circle":"ellipse",cx:ee?r.x:v,cy:ee?r.y:A,radius:ee?p:void 0,rx:ee?void 0:p,ry:ee?void 0:S,rotationDeg:k,band:a,bandThickness:te,frontArcPath:s.projection==="isometric"||a?no(v,A,p,S,k,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?no(v,A,p,S,k,Math.PI,Math.PI*2):void 0,objectX:Q.x,objectY:Q.y}}function vs(e,t){return t.innerPx+t.stepPx*xs(Math.max(e,0)+1)}function $s(e,t){let n=[];return e.forEach((r,o)=>{let i=Bn(r),s=t.innerPx+o*t.stepPx,c=i===null?s:vs(i,t),a=o===0?t.innerPx:(n[o-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,a))}),n}function Bn(e){return!e.placement||e.placement.mode!=="orbit"?null:Nn(e.placement.semiMajor??e.placement.distance??null)}function xs(e){return Math.log(e)/Math.log(2)}function Is(e,t,n){let r=e?fr(e):null;return r!==null?zn(r-90):nn(t,n,-Math.PI/2)}function js(e,t,n,r){let o=Nn(pr(e.properties.inner)),i=Nn(pr(e.properties.outer));if(o!==null&&i!==null){let c=Math.abs(i-o);if(n.metricSpread>0)return se(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let a=Math.max(Math.max(o,i),1e-4);return se(c/a*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function ks(e,t,n,r,o,i,s,c,a){if(e.kind==="lagrange")return Ss(e,t,n,i,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let p=nn(r,o,Math.PI/5),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=rn(p,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 p=nn(r,o,Math.PI/6),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=rn(p,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:i-c-170,y:s-c-86-r*58*a.scaleModel.freePlacementMultiplier}}function Ss(e,t,n,r,o){let i=e.secondary?t.get(e.primary):Ls(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!i||!s)return{x:r*.7,y:o*.25};let c=s.x-i.x,a=s.y-i.y,l=Math.hypot(c,a)||1,p=c/l,f=a/l,w=-f,x=p,S=se(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-p*S,y:s.y-f*S,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+p*S,y:s.y+f*S,anchorX:s.x,anchorY:s.y};case"L3":return{x:i.x-p*S,y:i.y-f*S,anchorX:i.x,anchorY:i.y};case"L4":return{x:s.x+(p*.5-w*.8660254)*S,y:s.y+(f*.5-x*.8660254)*S,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(p*.5+w*.8660254)*S,y:s.y+(f*.5+x*.8660254)*S,anchorX:s.x,anchorY:s.y}}}function Os(e,t){let n=new Map,r=new Map;for(let l of e){let p=go(l,t);if(n.set(l.id,p),p){let f=r.get(p);f?f.push(l.id):r.set(p,[l.id])}r.has(l.id)||r.set(l.id,[])}let o=new Map,i=new Map,s=new Map,c=l=>{let p=o.get(l);if(p)return p;let f=new Set,w=[],x=n.get(l)??null;for(;x&&!f.has(x);)w.push(x),f.add(x),x=n.get(x)??null;return o.set(l,w),w},a=l=>{let p=s.get(i.get(l)??"");if(p)return p;let f=n.get(l)??null,w=t.get(l),x=l;return w?.placement&&w.placement.mode!=="free"&&f&&(x=a(f)),x};for(let l of e){c(l.id);let p=a(l.id),f=Qt(p);i.set(l.id,f),s.set(f,p)}return{parentIds:n,childIds:r,ancestorIds:o,groupIds:i,groupRoots:s}}function go(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 Es(e,t,n,r,o,i){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,p=(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)&&fo(f,p);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&po(f,p);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(p(f.x1,f.y1),p(f.x2,f.y2));for(let f of o)!f.hidden&&e.labelIds.includes(f.objectId)&&mo(f,p,i);return!Number.isFinite(s)||!Number.isFinite(c)?tn(0,0,0,0):tn(s,c,a,l)}function Ms(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let o=go(n,t);if(!o)break;let i=t.get(o);if(!i)break;n=i}return n.id}function ho(e,t,n){return bo(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function bo(e,t,n,r,o,i,s,c){let a=Fs(i,s,c),l=a*2,p=o==="above"?18:12,f=o==="above"?8:12,w=e-a,x=e+a;return r==="start"?(w=e,x=e+l):r==="end"&&(w=e-l,x=e),{left:w,right:x,top:Math.min(t,n)-p,bottom:Math.max(t,n)+f}}function Ds(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ls(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function _n(e,t,n){let r=Ps(e.properties.radius,n);if(r!==null)return r;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return se((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return se(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return se(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return se(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return se(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return se(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return se(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return se(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return se(8*o,n.minBodyRadius,n.maxBodyRadius)}}function As(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 Nn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Jt;case"m":return e.value/1e3/Jt;case"ly":return e.value*La;case"pc":return e.value*Aa;case"kpc":return e.value*Ta;case"re":return e.value*Ea/Jt;case"rj":return e.value*Ma/Jt;case"sol":return e.value*Da/Jt;default:return e.value}}function Ts(e,t){let n=Nn(e??null);return n===null||n<=0?0:se(n*96*t.freePlacementMultiplier,0,420)}function Ps(e,t){let n=pr(e);if(!n)return null;let r;switch(n.unit){case"sol":r=se(n.value*22,14,40);break;case"re":r=se(n.value*10,6,18);break;case"km":r=se(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=se(n.value*4,4,20);break}return se(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function pr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function fr(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function nn(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function no(e,t,n,r,o,i,s){let c=yo(e,t,n,r,o,i,s,so);return c.length===0?"":c.map((a,l)=>`${l===0?"M":"L"} ${io(a.x)} ${io(a.y)}`).join(" ")}function yo(e,t,n,r,o,i,s,c){let a=[];for(let l=0;l<=c;l+=1){let p=i+(s-i)*l/c;a.push(wo(e,t,n,r,o,p))}return a}function wo(e,t,n,r,o,i){let s=n*Math.cos(i),c=r*Math.sin(i),a=vo(s,c,o);return{x:e+a.x,y:t+a.y}}function vo(e,t,n){let r=zn(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function rn(e,t,n,r){let o=n==="isometric"?ao*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Un(e,t,n){return t*1e3+e+n*.01}function se(e,t,n){return Math.min(Math.max(e,t),n)}function ro(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function St(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Qt(e){return`${St(e)}-group`}function Cs(e){return typeof e=="string"&&e.trim()?e:void 0}function Fs(e,t,n){let r=e.length*4.6*n+18,o=t.length*3.9*n+18;return Math.max(r,o,24)}function oo(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function zn(e){return e*Math.PI/180}function io(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function yt(e,t={}){let n=Se(e,t),r=[],o=Bs(e,r),i=_s(e,r),s=Rs(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Vs(e,s,o,i,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.0",schemaVersion:"2.0",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(xo),diagnostics:r}}function mr(e,t={}){return Zs(yt(e,t))}function on(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:Gs(e.system),info:Xs(e.system)}:null,r=e.objects.map(xo);return Ws(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(Us),objects:r}}function Vs(e,t,n,r,o,i){let s=Se(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:n,viewpoints:s.viewpoints.map(Ns),annotations:r}}function Rs(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Bs(e,t){let n={};for(let[o,i]of Object.entries(e.system?.info??{}))o.startsWith("viewpoint.")||o.startsWith("annotation.")||(n[o]=i);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 _s(e,t){let n=new Map;for(let[r,o]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,i,...s]=r.split(".");if(!i||s.length===0)continue;let c=$o(i);if(!c)continue;let a=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":a.label=o;break;case"target":case"object":a.targetObjectId=o.trim()||null;break;case"body":case"text":case"description":a.body=o;break;case"tags":a.tags=Hs(o);break}n.set(c,a)}for(let r of e.objects){let o=r.info.description;if(!o)continue;let i=$o(`${r.id}-notes`);n.has(i)||(n.set(i,{id:i,label:`${r.id} Notes`,targetObjectId:r.id,body:o,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 "${i}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??qs(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,o)=>r.label.localeCompare(o.label))}function Ns(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,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function xo(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:Ys(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Us(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(zs)}}function zs(e){return{objectId:e.objectId,placement:Io(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Io(e){return e?structuredClone(e):null}function Ws(e,t,n){if(!n)return;let r=t.find(i=>i.id===n);if(!r)return;let o=new Map(e.map(i=>[i.id,i]));for(let i of r.positions){let s=o.get(i.objectId);s&&(s.placement=Io(i.placement),i.inner?s.properties.inner={...i.inner}:delete s.properties.inner,i.outer?s.properties.outer={...i.outer}:delete s.properties.outer)}}function Ys(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 Hs(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function $o(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function qs(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Gs(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 Xs(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let o=Ks(n.layers);o&&(t[`${r}.layers`]=o),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 Ks(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 o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function Zs(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var jo=["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 Wn(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(n==="2.0-draft"){let a=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:mr(e);return So(a)}let c=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:yt(e);return n==="2.1"&&c.version!=="2.1"?gr({...c,version:"2.1",schemaVersion:"2.1"}):gr(c)}let o=[],i=e;i.system&&o.push(...Js(i.system));let s=[...i.objects].sort(yr);for(let c of s)o.length>0&&o.push(""),o.push(...ec(c));return o.join(`
2
+ `)}function gr(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Oo(e.system));for(let r of[...e.groups].sort(Ot))t.push(""),t.push(...Lo(r));for(let r of[...e.relations].sort(Ot))t.push(""),t.push(...Ao(r));for(let r of[...e.events].sort(Ot))t.push(""),t.push(...To(r));let n=[...e.objects].sort(yr);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,o)=>{o>0&&t.push(""),t.push(...Eo(r))}),t.join(`
3
+ `)}function So(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(...Oo(t.system));for(let o of[...t.groups].sort(Ot))n.push(""),n.push(...Lo(o));for(let o of[...t.relations].sort(Ot))n.push(""),n.push(...Ao(o));for(let o of[...t.events].sort(Ot))n.push(""),n.push(...To(o));let r=[...t.objects].sort(yr);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((o,i)=>{i>0&&n.push(""),n.push(...Eo(o))}),n.join(`
4
+ `)}function Js(e){return Qs("system",e.id,e.properties,null,e.info)}function Qs(e,t,n,r,o){let i=[`${e} ${t}`],s=[...hr(r),...Do(n)];for(let a of s)i.push(` ${a}`);let c=Object.entries(o).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){s.length>0&&i.push(""),i.push(" info");for(let[a,l]of c)i.push(` ${a} ${P(l)}`)}return i}function Oo(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${P(e.title)}`),e.description&&t.push(` description ${P(e.description)}`),e.epoch&&t.push(` epoch ${P(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${P(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${P(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${P(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${P(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(([o],[i])=>o.localeCompare(i)))t.push(` ${n} ${P(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...nc(n));for(let n of e.annotations)t.push(""),t.push(...rc(n));return t}function ec(e){return Mo(e.type,e.id,e)}function Eo(e){return Mo(`object ${e.type}`,e.id,e)}function Mo(e,t,n){let r=[`${e} ${t}`],o=[...hr(n.placement),...Do(n.properties),...tc(n)];for(let s of o)r.push(` ${s}`);let i=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(i.length>0){o.length>0&&r.push(""),r.push(" info");for(let[s,c]of i)r.push(` ${s} ${P(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} ${P(l)}`)}}return r}function hr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...tt("distance",e.distance),...tt("semiMajor",e.semiMajor),...ic("eccentricity",e.eccentricity),...tt("period",e.period),...tt("angle",e.angle),...tt("inclination",e.inclination),...tt("phase",e.phase)];case"at":return[`at ${ac(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?br(e.distance):e.descriptor??""}`.trim()]}}function Do(e){return Object.keys(e).sort(cc).map(t=>`${t} ${Po(e[t])}`)}function tc(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${P(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${P(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} ${Po(n.value)}`);return t}function nc(e){let t=[`viewpoint ${e.id}`,` label ${P(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 ${P(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=sc(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 ${P(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(P).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function rc(e){let t=[`annotation ${e.id}`,` label ${P(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${P(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),t}function Lo(e){let t=[`group ${e.id}`,` label ${P(e.label)}`];return e.summary&&t.push(` summary ${P(e.summary)}`),e.color&&t.push(` color ${P(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Ao(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${P(e.from)}`),e.to&&t.push(` to ${P(e.to)}`),e.kind&&t.push(` kind ${P(e.kind)}`),e.label&&t.push(` label ${P(e.label)}`),e.summary&&t.push(` summary ${P(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),e.color&&t.push(` color ${P(e.color)}`),e.hidden&&t.push(" hidden true"),t}function To(e){let t=[`event ${e.id}`,` kind ${P(e.kind)}`];if(e.label&&t.push(` label ${P(e.label)}`),e.summary&&t.push(` summary ${P(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${P(e.timing)}`),e.visibility&&t.push(` visibility ${P(e.visibility)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),e.color&&t.push(` color ${P(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(lc)){t.push(` pose ${n.objectId}`);for(let r of oc(n))t.push(` ${r}`)}}return t}function oc(e){return[...hr(e.placement),...tt("inner",e.inner),...tt("outer",e.outer)]}function Po(e){return Array.isArray(e)?e.map(t=>P(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?P(e):br(e)}function br(e){return`${e.value}${e.unit??""}`}function tt(e,t){return t?[`${e} ${br(t)}`]:[]}function ic(e,t){return t===void 0?[]:[`${e} ${t}`]}function ac(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 sc(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 o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t}function cc(e,t){let n=jo.indexOf(e),r=jo.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function yr(e,t){let n=ko(e.type),r=ko(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function Ot(e,t){return e.id.localeCompare(t.id)}function lc(e,t){return e.objectId.localeCompare(t.objectId)}function ko(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 P(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Co=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,dc=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),uc=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Et(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function sn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function wr(e,t,n){let r=e.match(Co);if(!r)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=$e(n);if(i?.unitFamily&&!Tn(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function vr(e){let t=e.match(Co);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Yn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function nt(e,t,n){let r=dc.get(e.toLowerCase());if(r===void 0)throw y.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Fo(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 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 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 pc(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 n=e.match(uc);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw y.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Vo(e,t,n){let r=$e(e);if(!r)throw y.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw y.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return nt(an(t,e,n),e,n);case"number":return Yn(an(t,e,n),e,n);case"unit":return wr(an(t,e,n),n,e);case"string":{let o=t.join(" ").trim();return e==="image"&&pc(o,n),o}}}function $r(e,t,n){let r=$e(e);if(!r)throw y.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw y.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function an(e,t,n){if(e.length!==1)throw y.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Bo=new Set(["star","planet","moon","asteroid","comet"]),fc=332946.0487,mc=1047.3486,Hn=1495978707e-1,gc=6371,hc=695700,bc=63241.077,yc=206264.806,wc=206264806;function cn(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),o=new Set(e.groups.map(c=>c.id)),i=new Set(e.events.map(c=>c.id));e.system||n.push(_("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 p=s.get(l);p?n.push(_("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${p}.`)):s.set(l,c)}for(let c of e.relations)vc(c,r,n);for(let c of e.system?.viewpoints??[])$c(c.filter,c.events??[],o,i,t,n,c.id);for(let c of e.objects)xc(c,e.system,r,o,n);for(let c of e.events)Ic(c,r,n);return n}function vc(e,t,n){e.from?t.has(e.from)||n.push(_("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(_("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(_("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(_("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(_("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function $c(e,t,n,r,o,i,s){if(o==="2.1"){if(e)for(let c of e.groupIds)n.has(c)||i.push(be("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${s}".`,void 0,`viewpoint.${s}.groups`));for(let c of t)r.has(c)||i.push(be("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${s}".`,void 0,`viewpoint.${s}.events`))}}function xc(e,t,n,r,o){let i=e.placement,s=i?.mode==="orbit"?i:null,c=i?.mode==="orbit"?n.get(i.target)??null:null;if(e.groups)for(let a of e.groups)r.has(a)||o.push(be("validate.group.unknown",`Unknown group "${a}" on "${e.id}".`,e.id,"groups"));if(s&&(n.has(s.target)||o.push(_("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&o.push(_("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&o.push(be("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(be("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!_o(c?.properties.mass)&&o.push(be("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let a=n.get(i.target);a?Bo.has(a.type)||o.push(_("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(_("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(_("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),kc(e,n,o)||o.push(_("validate.at.target.unknown",`Unknown at-reference target "${i.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)&&o.push(be("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(_("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"){o.push(be("validate.derive.unsupported",`Unsupported derive rule "${a.field} ${a.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ro(e,c);if(l===null){o.push(be("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||o.push(Mc("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Ec(l)}.`,e.id,"derive"))}for(let a of e.validationRules??[]){if(a.rule!=="kepler"){o.push(be("validate.rule.unsupported",`Unsupported validation rule "${a.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=No(s?.period),p=Ro(e,c);if(l===null||p===null)continue;let f=Oc(e,"period");Math.abs(l-p)>f&&o.push(_("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Ic(e,t,n){let r=`event.${e.id}`,o=new Set;e.kind.trim()||n.push(_("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(_("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(_("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let i=new Set;for(let c of e.participantObjectIds){if(o.add(c),i.has(c)){n.push(be("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${r}.participants`));continue}i.add(c),t.has(c)||n.push(_("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(be("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(be("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&n.push(be("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let s=new Set;for(let c of e.positions){let a=`${r}.pose.${c.objectId}`;if(s.has(c.objectId)){n.push(_("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,a));continue}s.add(c.objectId);let l=t.get(c.objectId);if(!l){n.push(_("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,a));continue}o.has(c.objectId)||n.push(be("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,a)),jc(c,l,t,n,a,e.id)}}function jc(e,t,n,r,o,i){let s=e.placement;if(!s){r.push(_("validate.event.pose.placement.required",`Event "${i}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(s.mode==="orbit"){n.has(s.target)||r.push(_("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${i}:${e.objectId}".`,void 0,`${o}.orbit`)),s.distance&&s.semiMajor&&r.push(_("validate.event.pose.orbit.distanceConflict",`Event "${i}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`));return}if(s.mode==="surface"){let c=n.get(s.target);c?Bo.has(c.type)||r.push(_("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${i}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):r.push(_("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${i}:${e.objectId}".`,void 0,`${o}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(_("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${i}:${e.objectId}".`,void 0,`${o}.at`));let c=s.reference;c.kind==="named"&&!n.has(c.name)?r.push(_("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):c.kind==="anchor"&&!n.has(c.objectId)?r.push(_("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):c.kind==="lagrange"&&(n.has(c.primary)?c.secondary&&!n.has(c.secondary)&&r.push(_("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):r.push(_("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)))}}function kc(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(_("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(_("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(_("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ro(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Sc(n.semiMajor??n.distance),o=_o(t?.properties.mass);return r===null||o===null||o<=0?null:Math.sqrt(r**3/o)*365.25}function Sc(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Hn;case"m":return e.value/(Hn*1e3);case"ly":return e.value*bc;case"pc":return e.value*yc;case"kpc":return e.value*wc;case"re":return e.value*gc/Hn;case"sol":return e.value*hc/Hn;default:return null}}function _o(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/fc;case"mj":return t.value/mc;default:return null}}function No(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 Oc(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?No(n)??0:0}function Ec(e){return`${Math.round(e*100)/100}d`}function _(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function be(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Mc(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Dc=new Set(["climate","habitability","settlement"]),qn=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=$e(e);t&&qn.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}])qn.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Lc=new Set(qn.keys()),Ac=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function xr(e){return Tc(e)}function Tc(e,t){let n=yl(e),r=n.source.split(/\r?\n/),o=[],i=!1,s="2.0",c=null,a=null,l=[],p=[],f=[],w=[],x=new Map,S=!1,k=!1,C=new Set,q=new Set,v=new Set,A=new Set,re=new Set;for(let X=0;X<r.length;X++){let ne=r[X],Y=X+1;if(!ne.trim())continue;let he=Pn(ne),ye=Gt(ne.slice(he),{line:Y,columnOffset:he});if(ye.length!==0){if(!i){s=Pc(ye,Y),i=!0,n.comments.length>0&&s!=="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 ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(he===0){a=Cc(ye,Y,s,o,c,l,p,f,w,x,C,q,v,A,re,{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 y("Indented line without parent atlas section",Y,he+1);zc(a,he,ye,Y)}}if(!i)throw new y('Missing required atlas schema header "schema 2.0"');let Q=l.map(X=>sl(X,s,o)),ee=w.map(X=>cl(X,x.get(X.id)??[])),te=t??(s==="2.0-draft"?"2.0":s),W={format:"worldorbit",sourceVersion:"1.0",system:c,groups:p,relations:f,events:ee,objects:Q,diagnostics:o};if(te==="2.0-draft"){let X={...W,version:"2.0-draft",schemaVersion:"2.0-draft"};return X.diagnostics.push(...cn(X,s)),X}let ce={...W,version:te,schemaVersion:te};return s==="2.0-draft"&&ce.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".'}),ce.diagnostics.push(...cn(ce,s)),ce}function Pc(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 n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Cc(e,t,n,r,o,i,s,c,a,l,p,f,w,x,S,k){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new y('Atlas section "system" may only appear once',t,e[0].column);return Fc(e,t,n,r);case"defaults":if(!o)throw new y('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(k.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(k.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 Vc(e,t,o,p,n,r);case"annotation":if(!o)throw new y('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Rc(e,t,o,f);case"group":return Oe(n,r,"group",{line:t,column:e[0].column}),Bc(e,t,s,w);case"relation":return Oe(n,r,"relation",{line:t,column:e[0].column}),_c(e,t,c,x);case"event":return Oe(n,r,"event",{line:t,column:e[0].column}),Nc(e,t,a,l,S,n,r);case"object":return Uc(e,t,n,r,i);default:throw new y(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Fc(e,t,n,r){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:n,diagnostics:r,seenFields:new Set}}function Vc(e,t,n,r,o,i){if(e.length!==2)throw new y("Invalid viewpoint declaration",t,e[0]?.column??1);let s=Et(e[1].value);if(!s)throw new y("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new y(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:sn(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:o,diagnostics:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Rc(e,t,n,r){if(e.length!==2)throw new y("Invalid annotation declaration",t,e[0]?.column??1);let o=Et(e[1].value);if(!o)throw new y("Annotation id must not be empty",t,e[1].column);if(r.has(o))throw new y(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:sn(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(i),r.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function Bc(e,t,n,r){if(e.length!==2)throw new y("Invalid group declaration",t,e[0]?.column??1);let o=Et(e[1].value);if(!o)throw new y("Group id must not be empty",t,e[1].column);if(r.has(o))throw new y(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:sn(o),summary:"",color:null,tags:[],hidden:!1};return n.push(i),r.add(o),{kind:"group",group:i,seenFields:new Set}}function _c(e,t,n,r){if(e.length!==2)throw new y("Invalid relation declaration",t,e[0]?.column??1);let o=Et(e[1].value);if(!o)throw new y("Relation id must not be empty",t,e[1].column);if(r.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 n.push(i),r.add(o),{kind:"relation",relation:i,seenFields:new Set}}function Nc(e,t,n,r,o,i,s){if(e.length!==2)throw new y("Invalid event declaration",t,e[0]?.column??1);let c=Et(e[1].value);if(!c)throw new y("Event id must not be empty",t,e[1].column);if(o.has(c))throw new y(`Duplicate event id "${c}"`,t,e[1].column);let a={id:c,kind:"",label:sn(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(a),r.set(c,l),o.add(c),{kind:"event",event:a,sourceSchemaVersion:i,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Uc(e,t,n,r,o){if(e.length<3)throw new y("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],s=e[2],c=i.value;if(!An.has(c)||c==="system")throw new y(`Unknown object type "${i.value}"`,t,i.column);let a={objectType:c,id:s.value,fields:il(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(a),{kind:"object",objectNode:a,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function zc(e,t,n,r){switch(e.kind){case"system":Wc(e,n,r);return;case"defaults":Yc(e,n,r);return;case"atlas":Hc(e,t,n,r);return;case"viewpoint":qc(e,t,n,r);return;case"annotation":Xc(e,n,r);return;case"group":Kc(e,n,r);return;case"relation":Zc(e,n,r);return;case"event":Jc(e,t,n,r);return;case"object":el(e,t,n,r);return}}function Wc(e,t,n){let r=ot(t,e.seenFields,n),o=G(t,n);switch(r){case"title":e.system.title=o;return;case"description":Oe(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=o;return;case"epoch":Oe(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":Oe(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=o;return;default:throw new y(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Yc(e,t,n){let r=ot(t,e.seenFields,n),o=G(t,n);switch(r){case"view":e.system.defaults.view=zo(o,n,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=Wo(o,n,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new y(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Hc(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=Ho(n,r,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new y(`Duplicate atlas metadata key "${o.key}"`,r,n[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new y(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function qc(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Gc(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new y('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=ot(n,e.seenFields,r),i=G(n,r);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=zo(i,r,n[0].column);return;case"preset":e.viewpoint.preset=Wo(i,r,n[0].column);return;case"zoom":e.viewpoint.zoom=rl(i,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Yo(i,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=nl(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":Oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=Fe(n.slice(1),r,"events");return;default:throw new y(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Gc(e,t,n){let r=ot(t,e.seenFilterFields,n),o=e.viewpoint.filter??ol();switch(r){case"query":o.query=G(t,n);break;case"objecttypes":o.objectTypes=tl(t.slice(1),n);break;case"tags":o.tags=Fe(t.slice(1),n,"tags");break;case"groups":o.groupIds=Fe(t.slice(1),n,"groups");break;default:throw new y(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=o}function Xc(e,t,n){switch(ot(t,e.seenFields,n)){case"label":e.annotation.label=G(t,n);return;case"target":e.annotation.targetObjectId=G(t,n);return;case"body":e.annotation.body=G(t,n);return;case"tags":e.annotation.tags=Fe(t.slice(1),n,"tags");return;default:throw new y(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Kc(e,t,n){switch(ot(t,e.seenFields,n)){case"label":e.group.label=G(t,n);return;case"summary":e.group.summary=G(t,n);return;case"color":e.group.color=G(t,n);return;case"tags":e.group.tags=Fe(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=nt(G(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new y(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Zc(e,t,n){switch(ot(t,e.seenFields,n)){case"from":e.relation.from=G(t,n);return;case"to":e.relation.to=G(t,n);return;case"kind":e.relation.kind=G(t,n);return;case"label":e.relation.label=G(t,n);return;case"summary":e.relation.summary=G(t,n);return;case"tags":e.relation.tags=Fe(t.slice(1),n,"tags");return;case"color":e.relation.color=G(t,n);return;case"hidden":e.relation.hidden=nt(G(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new y(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Jc(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){e.activePose.fields.push(Qc(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new y(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let i=n[1].value;if(!i.trim())throw new y("Event pose object id must not be empty",r,n[1].column);let s={objectId:i,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 y('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(ot(n,e.seenFields,r)){case"kind":e.event.kind=G(n,r);return;case"label":e.event.label=G(n,r);return;case"summary":e.event.summary=G(n,r);return;case"target":e.event.targetObjectId=G(n,r);return;case"participants":e.event.participantObjectIds=Fe(n.slice(1),r,"participants");return;case"timing":e.event.timing=G(n,r);return;case"visibility":e.event.visibility=G(n,r);return;case"tags":e.event.tags=Fe(n.slice(1),r,"tags");return;case"color":e.event.color=G(n,r);return;case"hidden":e.event.hidden=nt(G(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new y(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Qc(e,t,n){if(e.length<2)throw new y("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Ac.has(r))throw new y(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new y(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}}}function el(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let o=n[0].value.toLowerCase();if(o==="info"||Dc.has(o)){o!=="info"&&Oe(e.sourceSchemaVersion,e.diagnostics,o,{line:r,column:n[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=Ho(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new y(`Duplicate info key "${o.key}"`,r,n[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,s=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(s.has(o.key))throw new y(`Duplicate ${i} key "${o.key}"`,r,n[0].column);s.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(al(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function ot(e,t,n){if(e.length<2)throw new y("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new y(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function G(e,t){if(e.length<2)throw new y("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function tl(e,t){return Fe(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function nl(e,t,n,r){let o={};for(let i of Fe(e,t,"layers")){let s=!i.startsWith("-")&&!i.startsWith("!"),c=i.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){o["orbits-back"]=s,o["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&&Oe(n,r,"layers.events",{line:t,column:e[0]?.column??1}),o[c]=s)}return o}function Fe(e,t,n){if(e.length===0)throw new y(`Missing value for atlas field "${n}"`,t,1);let r=e.map(o=>o.value).filter(Boolean);if(r.length===0)throw new y(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function zo(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new y(`Unknown projection "${e}"`,t,n);return r}function Wo(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new y(`Unknown render preset "${e}"`,t,n)}function rl(e,t,n,r){let o=Yo(e,t,n,r);if(o<=0)throw new y(`Field "${r}" must be greater than zero`,t,n);return o}function Yo(e,t,n,r){let o=Number(e);if(!Number.isFinite(o))throw new y(`Invalid numeric value "${e}" for "${r}"`,t,n);return o}function ol(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function il(e,t,n,r,o){let i=[],s=0;for(;s<e.length;){let c=e[s],a=ln(c.value);if(!a)throw new y(`Unknown field "${c.value}"`,t,c.column);a.version==="2.1"&&Oe(r,o,c.value,{line:t,column:c.column}),s++;let l=[];if(a.inlineMode==="single"){let p=e[s];p&&(l.push(p),s++)}else if(a.inlineMode==="pair")for(let p=0;p<2;p++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!Lc.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new y(`Missing value for field "${c.value}"`,t,c.column);i.push({type:"field",key:c.value,values:l.map(p=>p.value),location:{line:t,column:c.column}})}return Ko(i,n),i}function al(e,t,n,r,o){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);let i=ln(e[0].value);if(!i)throw new y(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&Oe(r,o,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 Ko([s],n),s}function Ho(e,t,n){if(e.length<2)throw new y(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=qo(e.fields),o=Go(r),i=dl(e.objectType,r),s=hl(r.get("groups")?.[0]),c=Uo(r.get("epoch")?.[0]),a=Uo(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?nt(Le(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,p=r.has("resonance")?fl(r.get("resonance")[0]):void 0,f=pl(r),w=r.get("derive")?.map(A=>ml(A)),x=r.get("validate")?.map(A=>({rule:Le(A)})),S=r.has("locked")?[...new Set(r.get("locked").flatMap(A=>A.values))]:void 0,k=r.get("tolerance")?.map(A=>gl(A)),C=ul(e.typedBlockEntries),q=Xo(e.infoEntries,"info"),v={type:e.objectType,id:e.id,properties:i,placement:o,info:q};return s.length>0&&(v.groups=s),c&&(v.epoch=c),a&&(v.referencePlane=a),l!==void 0&&(v.tidalLock=l),p&&(v.resonance=p),f&&(v.renderHints=f),w?.length&&(v.deriveRules=w),x?.length&&(v.validationRules=x),S?.length&&(v.lockedFields=S),k?.length&&(v.tolerances=k),C&&Object.keys(C).length>0&&(v.typedBlocks=C),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)&&Oe(t,n,e.id,e.location),v}function cl(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ll(n))}}function ll(e){let t=qo(e.fields),n=Go(t);return{objectId:e.objectId,placement:n,inner:rt(t.get("inner")?.[0],"inner"),outer:rt(t.get("outer")?.[0],"outer")}}function qo(e){let t=new Map;for(let n of e){let r=ln(n.key);if(!r)throw y.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw y.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=t.get(n.key)??[];o.push(n),t.set(n.key,o)}return t}function Go(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],o=e.get("free")?.[0];if([t,n,r,o].filter(Boolean).length>1){let s=t??n??r??o;throw y.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:Le(t),distance:rt(e.get("distance")?.[0],"distance"),semiMajor:rt(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:bl(e.get("eccentricity")?.[0],"eccentricity"),period:rt(e.get("period")?.[0],"period"),angle:rt(e.get("angle")?.[0],"angle"),inclination:rt(e.get("inclination")?.[0],"inclination"),phase:rt(e.get("phase")?.[0],"phase")};if(n){let s=Le(n);return{mode:"at",target:s,reference:Fo(s,n.location)}}if(r)return{mode:"surface",target:Le(r)};if(o){let s=Le(o),c=vr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function dl(e,t){let n={};for(let[r,o]of t.entries()){let i=o[0],s=ln(r);!i||!s?.legacySchema||s.legacySchema.placement||($r(r,e,i.location),n[r]=Vo(r,i.values,i.location))}return n}function Xo(e,t){let n={};for(let r of e){if(r.key in n)throw y.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ul(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Xo(r,n))}return t}function pl(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return n&&(t.renderLabel=nt(Le(n),"renderLabel",n.location)),r&&(t.renderOrbit=nt(Le(r),"renderOrbit",r.location)),o&&(t.renderPriority=Yn(Le(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function fl(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 ml(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 gl(e){if(e.values.length!==2)throw y.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=vr(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function hl(e){return e?[...new Set(e.values)]:[]}function Uo(e){return e&&e.values.join(" ").trim()||null}function rt(e,t){return e?wr(Le(e),e.location,t):void 0}function bl(e,t){return e?Yn(Le(e),t,e.location):void 0}function Le(e){return an(e.values,e.key,e.location)}function ln(e){return qn.get(e)}function Ko(e,t){for(let n of e){let r=ln(n.key);if(!r)throw y.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){$r(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw y.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Oe(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function yl(e){let t=[...e],n=[],r=!1,o=!1,i=null,s=1,c=1;for(let a=0;a<t.length;a++){let l=t[a],p=t[a+1];if(o){if(l==="*"&&p==="/"){t[a]=" ",t[a+1]=" ",o=!1,i=null,a++,c+=2;continue}l!==`
5
+ `&&l!=="\r"&&(t[a]=" "),l===`
6
+ `?(s++,c=1):c++;continue}if(!r&&l==="/"&&p==="*"){n.push({kind:"block",line:s,column:c}),t[a]=" ",t[a+1]=" ",o=!0,i={line:s,column:c},a++,c+=2;continue}if(!r&&l==="#"&&!wl(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(o)throw y.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:n}}function wl(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 o=e[n];return o===void 0||o===" "||o===" "||o==="\r"||o===`
9
+ `}function Gn(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:[],events:[],objects:[],diagnostics:[]}}function z(e){return structuredClone(e)}function Ir(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?ei(e,t.id):null;case"event":return t.id?Xn(e,t.id):null;case"event-pose":return t.id&&t.key?ni(e,t.id,t.key):null;case"object":return t.id?Qo(e,t.id):null;case"viewpoint":return t.id?ri(e.system,t.id):null;case"annotation":return t.id?oi(e.system,t.id):null;case"relation":return t.id?ti(e,t.id):null}}function jr(e,t){let n=z(e),r=Jo(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(o=>o.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(o=>o.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(o=>o.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let o=Xn(n,t.id);o&&(o.positions=o.positions.filter(i=>i.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(o=>o.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(o=>o.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(o=>o.id!==t.id)),n;default:return n}}function dn(e,t){return t.map(n=>({diagnostic:n,path:Zo(e,n)}))}function Zo(e,t){if(t.objectId&&Qo(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&ei(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&ri(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&oi(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&ti(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&Xn(e,n[1]))return n[2]==="pose"&&n[3]&&ni(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 Jo(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function kr(e){let t=[...e.diagnostics,...cn(e,e.version)];return dn(e,t)}function Jo(e){return e.system||(e.system=Gn().system),e.system}function Qo(e,t){return e.objects.find(n=>n.id===t)??null}function ei(e,t){return e.groups.find(n=>n.id===t)??null}function ti(e,t){return e.relations.find(n=>n.id===t)??null}function Xn(e,t){return e.events.find(n=>n.id===t)??null}function ni(e,t,n){return Xn(e,t)?.positions.find(r=>r.objectId===n)??null}function ri(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function oi(e,t){return e?.annotations.find(n=>n.id===t)??null}var vl=/^schema\s+2(?:\.0|\.1)?$/i,$l=/^schema\s+2\.1$/i,xl=/^schema\s+2\.0-draft$/i;function ii(e){for(let t of Il(e).split(/\r?\n/)){let n=t.trim();if(n)return xl.test(n)?"2.0-draft":$l.test(n)?"2.1":vl.test(n)?"2.0":"1.0"}return"1.0"}function Il(e){let t=[...e],n=!1,r=!1;for(let o=0;o<t.length;o++){let i=t[o],s=t[o+1];if(r){if(i==="*"&&s==="/"){t[o]=" ",t[o+1]=" ",r=!1,o++;continue}i!==`
10
+ `&&i!=="\r"&&(t[o]=" ");continue}if(!n&&i==="/"&&s==="*"){t[o]=" ",t[o+1]=" ",r=!0,o++;continue}if(!n&&i==="#"){t[o]=" ";let c=o+1;for(;c<t.length&&t[c]!==`
11
+ `&&t[c]!=="\r";)t[c]=" ",c++;o=c-1;continue}i==='"'&&t[o-1]!=="\\"&&(n=!n)}return t.join("")}function it(e){let t=un(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new y(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function un(e){let t=ii(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return jl(e,t);let n;try{n=Xt(e)}catch(o){return{ok:!1,value:null,diagnostics:[bt(o,"parse")]}}let r;try{r=Kt(n)}catch(o){return{ok:!1,value:null,diagnostics:[bt(o,"normalize")]}}try{Zt(r)}catch(o){return{ok:!1,value:null,diagnostics:[bt(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function jl(e,t){let n;try{n=xr(e)}catch(s){return{ok:!1,value:null,diagnostics:[bt(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let o;try{o=on(n)}catch(s){return{ok:!1,value:null,diagnostics:[bt(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Sl={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Kn={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 Sr(e){return e?typeof e=="string"?Kn[e]??Kn.atlas:{...Kn.atlas,...e}:Kn.atlas}function Or(e){return{...Sl,...e}}function Ve(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Er(e.objectTypes??[]),tags:Er((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Er((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Ol(t)?t:null}function Ol(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Zn(e,t){let n=Ve(t),r=new Set;for(let o of e.objects)if(!o.hidden&&El(o,n)&&(r.add(o.objectId),n?.includeAncestors!==!1))for(let i of o.ancestorIds)r.add(i);return n?r:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function Mr(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Ml(o,r)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,n).map(o=>ai(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,n).map(o=>ai(o,1))}function si(e,t,n,r){return{version:"2.0",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:Ve(n)}}function Dr(e){return encodeURIComponent(JSON.stringify(e))}function Lr(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",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,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:Ve(t.filter??null)}}function ci(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,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 Ar(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 Tr(e){return e?.filter?Ve({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function ai(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 El(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(o=>e.semanticGroupIds.includes(o)),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=li(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>n.includes(o)))return!1}return!0}function Ml(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),o=li(e.object,e.label).toLowerCase(),i=0;return n===t||r===t?i+=120:n.startsWith(t)||r.startsWith(t)?i+=96:(n.includes(t)||r.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(a=>o.includes(a))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(a=>typeof a=="string"):[]).some(a=>a.toLowerCase()===t)&&(i+=18),i}function li(e,t){let n=Object.values(e.info),r=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,...r,...n].join(" ")}function Er(e){return[...new Set(e)]}var wt={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function di(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function Jn(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Mt(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Pr(e,t){return{...e,rotationDeg:di(e.rotationDeg+t)}}function pn(e,t,n,r,o){if(!Number.isFinite(n)||n<=0)return t;let i=Lt(e),s=Jn(t.scale*n,o);if(s===t.scale)return t;let c=s/t.scale,a=r.x-i.x,l=r.y-i.y;return{...t,scale:s,translateX:(1-c)*a+c*t.translateX,translateY:(1-c)*l+c*t.translateY}}function Dt(e,t,n){let r=Lt(e),o=Dl(e.contentBounds,r,t.rotationDeg),i=Math.max(e.width-n.fitPadding*2,1),s=Math.max(e.height-n.fitPadding*2,1),c=Math.max(o.width,1),a=Math.max(o.height,1),l=Jn(Math.min(i/c,s/a),n),p=we({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:l,translateX:r.x-(r.x+(p.x-r.x)*l),translateY:r.y-(r.y+(p.y-r.y)*l)}}function Cr(e,t,n,r){let o=e.objects.find(a=>a.objectId===n&&!a.hidden);if(!o)return t;let i=Lt(e),s=Jn(Math.max(t.scale,1.8),r),c=we({x:o.x,y:o.y},i,t.rotationDeg);return{...t,scale:s,translateX:i.x-(i.x+(c.x-i.x)*s),translateY:i.y-(i.y+(c.y-i.y)*s),selectedObjectId:n}}function Fr(e,t){let n=Lt(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function vt(e,t,n){let r=Lt(e),o={x:n.x-t.translateX,y:n.y-t.translateY},i={x:o.x-r.x,y:o.y-r.y},s={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},c=we({x:s.x,y:s.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+c.x,y:r.y+c.y}}function fn(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=>vt(e,t,c)),r=Math.min(...n.map(c=>c.x)),o=Math.min(...n.map(c=>c.y)),i=Math.max(...n.map(c=>c.x)),s=Math.max(...n.map(c=>c.y));return{minX:r,minY:o,maxX:i,maxY:s,width:i-r,height:s-o,centerX:r+(i-r)/2,centerY:o+(s-o)/2}}function Lt(e){return{x:e.width/2,y:e.height/2}}function Dl(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=>we(a,t,n)),o=Math.min(...r.map(a=>a.x)),i=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:o,minY:i,maxX:s,maxY:c,width:s-o,height:c-i,centerX:o+(s-o)/2,centerY:i+(c-i)/2}}var Vr="worldorbit-camera-root";function ze(e,t={}){let n=Sr(t.theme),r=Hl(t.preset??e.renderPreset??void 0),o=Or({...r.layers,...t.layers}),i=t.subtitle??e.subtitle,s=Zn(e,t.filter??null),c=e.objects.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>o.structures||!Qn(v.object)).sort((v,A)=>v.sortKey-A.sortKey),a=e.labels.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>o.structures||!Qn(v.object)),l=Tl(c),p=o.orbits?Al(e,s,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>o.structures||!Qn(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="${de(v.renderId)}" data-group-id="${fe(v.groupId??"")}" />`).join(""):"",w=o.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="${de(v.renderId)}" data-relation-id="${fe(v.relationId)}" />`).join(""):"",x=o.events?e.events.filter(v=>!v.hidden).map(v=>Ll(e,v,s,n)).join(""):"",S=o.objects?c.map(v=>Pl(v,t.selectedObjectId??null,n)).join(""):"",k=o.labels?a.map(v=>Cl(e,v,t.selectedObjectId??null)).join(""):"",C=o.metadata?`<text class="wo-title" x="56" y="64">${de(e.title)}</text>
12
+ <text class="wo-subtitle" x="56" y="88">${de(i)}</text>
13
+ <text class="wo-meta" x="56" y="${e.height-42}">${de(Gl(e))}</text>`:"",q=o.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
+ ${o.guides?ql(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">${de(e.title)}</title>
17
+ <desc id="worldorbit-desc">A ${de(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
+ ${q}
72
+ ${C}
70
73
  <g data-worldorbit-world="true">
71
- <g data-worldorbit-camera-root="${Tn}" id="${Tn}">
74
+ <g data-worldorbit-camera-root="${Vr}" id="${Vr}">
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>`:""}
76
+ ${o.orbits?`<g data-layer-id="orbits-back">${p.back}</g>`:""}
77
+ ${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
78
+ ${o.relations?`<g data-layer-id="relations">${w}</g>`:""}
79
+ ${o.events?`<g data-layer-id="events">${x}</g>`:""}
80
+ ${o.objects?`<g data-layer-id="objects">${S}</g>`:""}
81
+ ${o.orbits?`<g data-layer-id="orbits-front">${p.front}</g>`:""}
78
82
  ${o.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 Ll(e,t,n,r){let o=t.objectIds.filter(a=>n.has(a)).map(a=>e.objects.find(l=>l.objectId===a&&!l.hidden)).filter(Boolean);if(o.length===0)return"";let i=t.event.color||r.accent,s=t.event.label||t.event.id,c=o.map(a=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${a.x}" y2="${a.y}" stroke="${fe(i)}" data-event-id="${fe(t.eventId)}" data-object-id="${fe(a.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${de(t.renderId)}" data-event-id="${fe(t.eventId)}">
87
+ ${c}
88
+ <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${fe(i)}" />
89
+ <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${de(s)}</text>
90
+ </g>`}function Al(e,t,n){let r=[],o=[];for(let i of e.orbitVisuals.filter(s=>!s.hidden&&t.has(s.objectId)&&(n||!Qn(s.object)))){let s=i.bandThickness??(i.band?10:1.5),c=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",a=`data-render-id="${de(i.renderId)}" data-orbit-object-id="${fe(i.objectId)}" data-parent-id="${fe(i.parentId)}" data-group-id="${fe(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&r.push(`<path class="${c} wo-orbit-back" d="${i.backArcPath}" stroke-width="${s}" ${a} />`),i.frontArcPath&&o.push(`<path class="${c} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${s}" ${a} />`);continue}if(i.kind==="ellipse"){let l=i.rx??i.radius??0,p=i.ry??i.radius??0;o.push(`<ellipse class="${c} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${l}" ry="${p}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${s}" ${a} />`);continue}o.push(`<circle class="${c} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${s}" ${a} />`)}return{back:r.join(""),front:o.join("")}}function Tl(e){return e.filter(t=>!!t.imageHref).map(t=>Rl(t)).join("")}function Pl(e,t,n){let{object:r,x:o,y:i,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,"-")}`:"",p=_l(e,n),f=Vl(e),w=f?ui(r,o,i,s,p,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${l}${a}" data-object-id="${de(e.objectId)}" data-parent-id="${fe(e.parentId??"")}" data-group-id="${fe(e.groupId??"")}" data-render-id="${de(e.renderId)}" tabindex="0" role="button" aria-label="${de(`${r.type} ${e.objectId}`)}">
91
+ <circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${c+8}" />
92
+ ${Fl(e,p)}
93
+ ${ui(r,o,i,s,p)}
94
+ ${f}
95
+ ${w}
96
+ </g>`}function Cl(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${de(t.objectId)}" data-group-id="${fe(t.groupId??"")}" data-render-id="${de(t.renderId)}">
97
+ <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${de(t.label)}</text>
98
+ <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${de(t.secondaryLabel)}</text>
99
+ </g>`}function ui(e,t,n,r,o,i={}){let s=i.outlineOnly?"transparent":o.fill,c=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
100
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.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="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.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="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${gi(t,n,r)}" fill="${s}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let a=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?a==="black-hole"||a==="nebula"||a==="galaxy"||a==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${Rr(t,n,r)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:a==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
102
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="2" />`:a==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${o.halo??"none"}" stroke="none" />
103
+ <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${s}" stroke="${o.stroke}" stroke-width="1.2" />
104
+ <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${o.core??"#fff"}" stroke="none" />`:a==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${s}" stroke="${o.stroke}" stroke-width="1" />
105
+ <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${o.core??"#fff"}" stroke="none" />`:a==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${o.halo??"none"}" stroke="none" />
106
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${Rr(t,n,r)}" fill="${s}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Fl(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:o,radius:i}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Vl(e){if(!e.imageHref)return"";let t=Bl(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${fe(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${fe(mi(e))})" />`}function Rl(e){let{x:t,y:n,radius:r}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":o=`<polygon points="${gi(t,n,r)}" />`;break;case"phenomenon":o=`<polygon points="${Rr(t,n,r)}" />`;break;default:return""}return`<clipPath id="${fe(mi(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function Bl(e){let{object:t,x:n,y:r,radius:o}=e;switch(t.type){case"structure":return{x:n-o,y:r-o,width:o*2,height:o*2};case"phenomenon":return{x:n-o*1.2,y:r-o*1.2,width:o*2.4,height:o*2.4};default:return{x:n-o,y:r-o,width:o*2,height:o*2}}}function _l(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Nl(e.object.type,n,t),o=e.fillColor&&Kl(e.fillColor)?e.fillColor:r.fill,i=pi(e.object.properties.albedo),s=pi(e.object.properties.temperature),c=zl(o,s,i,e.object.type),a=mn(c,"#ffffff",.4)??r.stroke,l=Yl(e.object.properties.atmosphere),p=e.object.type==="star"?fi(mn(c,"#fff2cb",.4)??c,.82):void 0;return{fill:c,stroke:a,glow:p,atmosphere:l,tail:e.object.type==="comet"?fi(mn(c,"#ffffff",.5)??c,.72):void 0}}function Nl(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 Ul(t)}}function Ul(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 zl(e,t,n,r){let o=e;if(t!==null){let i=Wl(t,r);o=mn(o,i,r==="star"?.42:.2)??o}if(n!==null){let i=Math.min(Math.max(n,0),1);o=mn(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function Wl(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Yl(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 Hl(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 pi(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function mi(e){return`${e.renderId}-clip`}function gi(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Rr(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 ql(e,t){let n=Array.from({length:10},(o,i)=>{let s=90+i*((e-180)/9);return`<line class="wo-grid" x1="${s}" y1="120" x2="${s}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(o,i)=>{let s=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${s}" x2="${e-56}" y2="${s}" />`}).join("");return`${n}${r}`}function Gl(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Qn(e){return e.type==="structure"||e.type==="phenomenon"}function mn(e,t,n){let r=Br(e),o=Br(t);if(!r||!o)return;let i=Math.min(Math.max(n,0),1);return Xl({r:Math.round(r.r+(o.r-r.r)*i),g:Math.round(r.g+(o.g-r.g)*i),b:Math.round(r.b+(o.b-r.b)*i)})}function fi(e,t){let n=Br(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Br(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 Xl(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Kl(e){return!!e.trim()}function de(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function fe(e){return de(e)}var At=180,Tt=120,hi=10;function bi(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},o=Math.min((At-hi*2)/Math.max(r.width,1),(Tt-hi*2)/Math.max(r.height,1)),i=(At-r.width*o)/2-r.minX*o,s=(Tt-r.height*o)/2-r.minY*o,c=fn(e,t),a=n.map(l=>{let p=l.x*o+i,f=l.y*o+s,w=Math.max(1.4,Math.min(l.visualRadius*o,5.2)),x=l.fillColor??Zl(l.object.type);return`<circle cx="${Ae(p)}" cy="${Ae(f)}" r="${Ae(w)}" fill="${x}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${At}px;height:${Tt}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="${At}" height="${Tt}" viewBox="0 0 ${At} ${Tt}" role="presentation" aria-hidden="true">
108
+ <rect x="0.5" y="0.5" width="${At-1}" height="${Tt-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
109
+ <rect x="${Ae(r.minX*o+i)}" y="${Ae(r.minY*o+s)}" width="${Ae(r.width*o)}" height="${Ae(r.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
110
+ ${a}
111
+ <rect x="${Ae(c.minX*o+i)}" y="${Ae(c.minY*o+s)}" width="${Ae(c.width*o)}" height="${Ae(c.height*o)}" 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 Zl(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 Ae(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Jl=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function wi(e){return{objectId:e.objectId,title:e.objectId,typeLabel:rd(e.object.type),imageHref:e.renderObject.imageHref??null,description:td(e),tags:ed(e.object.properties.tags),fields:Ql(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function vi(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${Re(i)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${Re(i.label)}</dt><dd>${Re(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="${Re(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="${id(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${Re(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>${Re(e.title)}</strong>
118
+ <span>${Re(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">${Re(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
+ ${o.length?`<p class="wo-tooltip-relations">${Re(o.join(" - "))}</p>`:""}
125
+ </article>`}function Ql(e){let t=new Map;for(let r of Jl){let o=e.object.properties[r];o!==void 0&&t.set(r,{key:r,label:od(r),value:yi(o)})}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 ${yi(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function ed(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function td(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 yi(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):nd(e)}function nd(e){return`${e.value}${e.unit??""}`}function rd(e){return e.charAt(0).toUpperCase()+e.slice(1)}function od(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function Re(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function id(e){return Re(e)}var Pt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},$i="worldorbit-viewer-tooltip-style";function Ct(e,t){if(ld(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??Pt.minScale,maxScale:t.maxScale??Pt.maxScale,fitPadding:t.fitPadding??Pt.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??Pt.panStep,zoomStep:t.zoomStep??Pt.zoomStep,rotationStep:t.rotationStep??Pt.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:Ve(t.initialFilter),subtitle:t.subtitle},s=e.getAttribute("tabindex"),c=e.style.touchAction,a=e.style.position,l=ad(t),p=gn(l,i),f={...wt},w=null,x=null,S=null,k=null,C=!1,q=null,v=null,A=0,re=!1,Q=new Map,ee=null,te=null,W=null,ce=null,X=null,ne=null;s===null&&(e.tabIndex=0),dd(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":c,e.style.position||(e.style.position="relative");let Y=m=>{if(!o.pointer||re)return;m.preventDefault(),e.focus();let b=ve(m.clientX,m.clientY),$=hn(Math.exp(-m.deltaY*.002),.6,1.6);H(pn(p,f,$,b,r))},he=m=>{if(re)return;let b=m.pointerType==="touch";if(b&&!o.touch||!b&&!o.pointer||!b&&m.button!==0)return;e.focus(),e.setPointerCapture?.(m.pointerId);let $=Te(m.clientX,m.clientY);if(b){Q.set(m.pointerId,$),Q.size===2?ee=ji(p,f,Q):Q.size===1&&(A=0,C=!1);return}q=m.pointerId,v=$,A=0,C=!1},ye=m=>{if(re)return;if(m.pointerType==="touch"){if(!o.touch||!Q.has(m.pointerId))return;let F=Q.get(m.pointerId),Ce=Te(m.clientX,m.clientY);if(Q.set(m.pointerId,Ce),Q.size===2){ee||(ee=ji(p,f,Q));let je=Si(Q),Je=je.distance/Math.max(ee.startDistance,1),Ut=pn(p,ee.startState,Je,ee.startCenter,r),zt=je.center.x-ee.startViewportCenter.x,Wt=je.center.y-ee.startViewportCenter.y;H(Mt(Ut,zt,Wt))}else if(Q.size===1){let je=Ce.x-F.x,Je=Ce.y-F.y;A+=Math.abs(je)+Math.abs(Je),A>2&&(C=!0),H(Mt(f,je,Je))}return}if(!o.pointer||q!==m.pointerId||!v)return;let $=Te(m.clientX,m.clientY),Z=$.x-v.x,R=$.y-v.y;A+=Math.abs(Z)+Math.abs(R),v=$,A>2&&(C=!0),H(Mt(f,Z,R))},Ee=m=>{if(m.pointerType==="touch"){Q.delete(m.pointerId),Q.size<2&&(ee=null);return}q===m.pointerId&&(q=null,v=null)},ut=m=>{if(!o.selection||re)return;if(C){C=!1;return}let b=er(m.target);le(b),o.tooltipMode==="pinned"&&(W=b,Ie())},D=m=>{let b=er(m.target);ue(b)},ae=()=>{ue(null)},pt=m=>{let b=er(m.target);b&&ue(b)},ft=()=>{ue(null)},T=m=>{if(!o.keyboard||re)return;let b=er(m.target);if((m.key==="Enter"||m.key===" ")&&b){m.preventDefault(),le(b),o.tooltipMode==="pinned"&&(W=b,Ie());return}switch(m.key){case"Escape":o.tooltipMode==="pinned"&&W&&(m.preventDefault(),W=null,Ie());return;case"+":case"=":m.preventDefault(),V.zoomBy(o.zoomStep);return;case"-":m.preventDefault(),V.zoomBy(1/o.zoomStep);return;case"ArrowLeft":m.preventDefault(),V.panBy(-o.panStep,0);return;case"ArrowRight":m.preventDefault(),V.panBy(o.panStep,0);return;case"ArrowUp":m.preventDefault(),V.panBy(0,-o.panStep);return;case"ArrowDown":m.preventDefault(),V.panBy(0,o.panStep);return;case"[":m.preventDefault(),V.rotateBy(-o.rotationStep);return;case"]":m.preventDefault(),V.rotateBy(o.rotationStep);return;case"f":case"F":m.preventDefault(),V.fitToSystem();return;case"0":m.preventDefault(),V.resetView();return}};e.addEventListener("wheel",Y,{passive:!1}),e.addEventListener("pointerdown",he),e.addEventListener("pointermove",ye),e.addEventListener("pointerup",Ee),e.addEventListener("pointercancel",Ee),e.addEventListener("click",ut),e.addEventListener("mouseover",D),e.addEventListener("mouseleave",ae),e.addEventListener("focusin",pt),e.addEventListener("focusout",ft),e.addEventListener("keydown",T);let V={setSource(m){l={kind:"source",value:m},p=gn(l,i),ne=null,O(!0)},setDocument(m){l={kind:"document",value:m},p=gn(l,i),ne=null,O(!0)},setScene(m){l={kind:"scene",value:m},p=m,ne=null,O(!0)},getScene(){return p},getRenderOptions(){return sd(i)},listViewpoints(){return p.viewpoints.slice()},getActiveViewpoint(){return Ke(ne)},goToViewpoint(m){let b=Ke(m);if(!b)return!1;let $={},Z=Ar(b);if(b.preset!==null&&($.preset=b.preset),l.kind!=="scene"&&b.projection!==p.projection&&($.projection=b.projection),Z&&($.layers=Z),ne=b.id,Object.keys($).length>0){let F=Ii($);i=xi(i,$),l.kind!=="scene"&&F&&(p=gn(l,i)),O(F)}Ze(Tr(b),!1,!1);let R=Bt(b);return H(R),le(b.selectedObjectId??b.objectId??null,!1),t.onSelectionChange?.(Rt()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),_t(),Me(),!0},getActiveEventId(){return i.activeEventId??null},setActiveEvent(m){V.setRenderOptions({activeEventId:m})},search(m,b=12){return Mr(p,m,b)},getFilter(){return i.filter?{...i.filter}:null},setFilter(m){Ze(m,!0,!0)},getVisibleObjects(){return Pe()},getFocusPath(m){return Xe(m)},getObjectDetails(m){return K(m)},getSelectionDetails(){return K(f.selectedObjectId)},getTooltipDetails(){return X},getAtlasState(){return si(f,i,i.filter??null,ne)},setAtlasState(m){let b=typeof m=="string"?Lr(m):m;b.viewpointId&&V.goToViewpoint(b.viewpointId),V.setRenderOptions(b.renderOptions),Ze(b.filter??null,!1,!1),H(N({...f,...b.viewerState})),le(b.viewerState.selectedObjectId??null,!1),_t(),t.onSelectionChange?.(Rt()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Me()},serializeAtlasState(){return Dr(V.getAtlasState())},captureBookmark(m,b){return ci(m,b,V.getAtlasState())},applyBookmark(m){return typeof m=="string"?(V.setAtlasState(m),!0):(V.setAtlasState(m.atlasState),!0)},setRenderOptions(m){let b=Ii(m);i=xi(i,m),l.kind!=="scene"&&b&&(p=gn(l,i)),O(b)},getState(){return{...f}},setState(m){H(N({...f,...m}))},zoomBy(m,b){H(pn(p,f,m,b??{x:p.width/2,y:p.height/2},r))},panBy(m,b){H(Mt(f,m,b))},rotateBy(m){H(Pr(f,m))},fitToSystem(){H(Dt(p,f,r))},focusObject(m){ne=null,H(Cr(p,f,m,r)),le(m),o.tooltipMode==="pinned"&&(W=oe(m)?.objectId??null,Ie())},pinTooltip(m){W=oe(m)?.objectId??null,Ie()},resetView(){let m=Dt(p,{...wt},r);ne=null,H(m),le(null),W=null,Ie()},exportSvg(){return ze(p,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){re||(re=!0,e.removeEventListener("wheel",Y),e.removeEventListener("pointerdown",he),e.removeEventListener("pointermove",ye),e.removeEventListener("pointerup",Ee),e.removeEventListener("pointercancel",Ee),e.removeEventListener("click",ut),e.removeEventListener("mouseover",D),e.removeEventListener("mouseleave",ae),e.removeEventListener("focusin",pt),e.removeEventListener("focusout",ft),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 O(!0),t.initialViewpointId?V.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?V.focusObject(t.initialSelectionObjectId):Me(),V;function O(m){if(e.innerHTML=ze(p,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),x=e.querySelector("#worldorbit-camera-root"),S=null,k=null,o.minimap&&(S=document.createElement("div"),S.dataset.worldorbitMinimapRoot="true",e.append(S)),o.tooltipMode!=="disabled"&&(k=document.createElement("div"),k.className="wo-viewer-tooltip-root",k.dataset.worldorbitTooltip="true",k.hidden=!0,k.addEventListener("click",Mn),e.append(k)),!w||!x)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=m?Dt(p,{...wt},r):N(f),le(f.selectedObjectId&&oe(f.selectedObjectId)?f.selectedObjectId:null,!1),ue(te&&oe(te)?te:null,!1),W=W&&oe(W)?W:null,qe(),It(),_t(),t.onViewChange?.({...f}),Me()}function H(m){f=N(m),qe(),t.onViewChange?.({...f}),Me()}function N(m){return{scale:hn(m.scale,r.minScale,r.maxScale),rotationDeg:ki(m.rotationDeg),translateX:Number.isFinite(m.translateX)?m.translateX:f.translateX,translateY:Number.isFinite(m.translateY)?m.translateY:f.translateY,selectedObjectId:m.selectedObjectId&&oe(m.selectedObjectId)?m.selectedObjectId:null}}function qe(){x&&(x.setAttribute("transform",Fr(p,f)),Nt(),Ie())}function le(m,b=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${bn(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:m&&oe(m)?m:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${bn(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),mt(),Ie(),b&&(t.onSelectionChange?.(Rt()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),t.onViewChange?.({...f}),Me())}function ue(m,b=!0){te===m&&b||(te=m&&oe(m)?m:null,mt(),Ie(),b&&(t.onHoverChange?.(oe(te)),t.onHoverDetailsChange?.(K(te))))}function Rt(){return oe(f.selectedObjectId)}function oe(m){if(!m)return null;let b=gt();return p.objects.find($=>$.objectId===m&&!$.hidden&&b.has($.objectId))??null}function K(m){let b=oe(m);return b?{objectId:b.objectId,object:b.object,renderObject:b,label:p.labels.find($=>$.objectId===b.objectId&&!$.hidden)??null,group:p.groups.find($=>$.renderId===b.groupId)??null,semanticGroups:p.semanticGroups.filter($=>b.semanticGroupIds.includes($.id)),orbit:p.orbitVisuals.find($=>$.objectId===b.objectId&&!$.hidden)??null,relatedOrbits:p.orbitVisuals.filter($=>!$.hidden&&($.objectId===b.objectId||b.ancestorIds.includes($.objectId)||b.childIds.includes($.objectId))),relations:p.relations.filter($=>!$.hidden&&($.fromObjectId===b.objectId||$.toObjectId===b.objectId)),relatedEvents:p.events.filter($=>!$.hidden&&($.targetObjectId===b.objectId||$.objectIds.includes(b.objectId))),parent:oe(b.parentId),children:b.childIds.map($=>oe($)).filter(Boolean),ancestors:b.ancestorIds.map($=>oe($)).filter(Boolean),focusPath:Xe(b.objectId)}:null}function mt(){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");Ge(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Ge(te,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Ge(m,b){let $=K(m);if(!$)return;let Z=new Set([$.objectId,...$.renderObject.childIds,...$.renderObject.ancestorIds]);for(let R of Z)for(let F of e.querySelectorAll(`[data-object-id="${bn(R)}"]`))F.classList.add(b.objectClass);for(let R of $.ancestors)for(let F of e.querySelectorAll(`[data-object-id="${bn(R.objectId)}"]`))F.classList.add(b.ancestorClass);for(let R of $.relatedOrbits)for(let F of e.querySelectorAll(`[data-orbit-object-id="${bn(R.objectId)}"]`))F.classList.add(b.orbitClass)}function Te(m,b){if(!w)return{x:p.width/2,y:p.height/2};let $=w.getBoundingClientRect();return!$.width||!$.height?{x:p.width/2,y:p.height/2}:{x:(m-$.left)/$.width*p.width,y:(b-$.top)/$.height*p.height}}function ve(m,b){return vt(p,f,Te(m,b))}function gt(){return Zn(p,i.filter??null)}function Pe(){let m=gt();return p.objects.filter(b=>!b.hidden&&m.has(b.objectId))}function Xe(m){let b=p.objects.find($=>$.objectId===m&&!$.hidden);return b?[...b.ancestorIds,b.objectId].map($=>oe($)).filter(Boolean):[]}function Ke(m){return p.viewpoints.find(b=>b.id===m)??null}function Bt(m){let b=ki(m.rotationDeg),$=m.scale!==null&&m.scale!==void 0?hn(m.scale,r.minScale,r.maxScale):null,Z=m.objectId&&p.objects.find(F=>F.objectId===m.objectId&&!F.hidden);if(Z)return xt({x:Z.x,y:Z.y},$??Math.max(1.8,wt.scale),b,m.selectedObjectId??Z.objectId);let R=Dt(p,{...wt,rotationDeg:b},r);return $===null?{...R,rotationDeg:b,selectedObjectId:m.selectedObjectId??null}:xt({x:p.contentBounds.centerX,y:p.contentBounds.centerY},$,b,m.selectedObjectId??null)}function xt(m,b,$,Z){let R={x:p.width/2,y:p.height/2},F=we(m,R,$);return{scale:b,rotationDeg:$,translateX:R.x-(R.x+(F.x-R.x)*b),translateY:R.y-(R.y+(F.y-R.y)*b),selectedObjectId:Z}}function Ze(m,b,$){i={...i,filter:Ve(m)},$&&(ne=null),O(!1)}function It(){t.onFilterChange?.(i.filter??null,Pe())}function _t(){t.onViewpointChange?.(Ke(ne))}function Me(){t.onAtlasStateChange?.(V.getAtlasState())}function Nt(){!o.minimap||!S||(S.innerHTML=bi(p,f,Pe()))}function Ie(){if(o.tooltipMode==="disabled"||!k){ht(null);return}let m=Ue();if(!m){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),ht(null);return}let b=K(m.objectId);if(!b){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),ht(null);return}let $=wi(b);ce=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",Sn(k,$,m.mode),On(k,b.renderObject),k.style.visibility="visible",ht($)}function Ue(){return W&&oe(W)?{objectId:W,mode:"pinned"}:te&&oe(te)?{objectId:te,mode:"hover"}:null}function Sn(m,b,$){let Z=t.tooltipRenderer?.(b,$);m.innerHTML="",typeof Z=="string"?m.innerHTML=Z:Z instanceof HTMLElement?m.append(Z):m.innerHTML=vi(b,$);let R=document.createElement("div");if(R.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",R.append(F)}else{let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="pin",F.dataset.objectId=b.objectId,F.textContent="Pin",R.append(F)}R.childElementCount>0&&m.append(R)}function On(m,b){if(!w)return;let $={x:b.anchorX??b.x,y:b.anchorY??b.y-Math.max(b.visualRadius,b.radius)},Z=En($),R=w.getBoundingClientRect(),F=e.getBoundingClientRect(),Ce=R.left-F.left+Z.x/Math.max(p.width,1)*R.width,je=R.top-F.top+Z.y/Math.max(p.height,1)*R.height,Je=Math.max(e.clientWidth-m.offsetWidth-12,12),Ut=Math.max(e.clientHeight-m.offsetHeight-12,12),zt=je>e.clientHeight*.48,Wt=hn(Ce+18,12,Je),cr=hn(zt?je-m.offsetHeight-18:je+18,12,Ut);m.style.left=`${Wt}px`,m.style.top=`${cr}px`}function En(m){let b={x:p.width/2,y:p.height/2},$=we(m,b,f.rotationDeg);return{x:b.x+($.x-b.x)*f.scale+f.translateX,y:b.y+($.y-b.y)*f.scale+f.translateY}}function Mn(m){let b=m.target?.closest("[data-tooltip-action]");if(b){switch(m.preventDefault(),m.stopPropagation(),b.dataset.tooltipAction){case"pin":W=b.dataset.objectId??ce;break;case"unpin":W=null;break}Ie()}}function ht(m){let b=X?.objectId!==m?.objectId||X?.description!==m?.description||X?.imageHref!==m?.imageHref;X=m,ce=m?.objectId??null,b&&t.onTooltipChange?.(m)}}function ad(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 gn(e,t){switch(e.kind){case"scene":return e.value;case"document":return Se(e.value,t);case"source":{let n=it(e.value);return Se(n.document,cd(n,t))}}}function sd(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,activeEventId:e.activeEventId??null}}function xi(e,t){return{...e,...t,filter:t.filter!==void 0?Ve(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||e.activeEventId!==void 0}function cd(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function ji(e,t,n){let{center:r,distance:o}=Si(n);return{startState:{...t},startCenter:vt(e,t,r),startViewportCenter:r,startDistance:o}}function Si(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 er(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function ld(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 hn(e,t,n){return Math.min(Math.max(e,t),n)}function ki(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function bn(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function dd(){if(typeof document>"u"||document.getElementById($i))return;let e=document.createElement("style");e.id=$i,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 Oi(e){return encodeURIComponent(JSON.stringify(e))}function _r(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 Nr(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=ze(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="${tr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${tr(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${tr(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${tr(Oi(n))}">${r}</div>`}function tr(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function yn(e,t={}){try{let n=it(e),r=Se(n.document,fd(n,t));return(t.mode??"static")==="interactive"?Nr(_r(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="${pd(t.className??"worldorbit-block worldorbit-static")}">${ze(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Ei(n instanceof Error?n.message:String(n))}}function Ei(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Mi(e)}</pre>`}function Mi(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function pd(e){return Mi(e).replaceAll('"',"&quot;")}function fd(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}var Di="worldorbit-editor-style",md=120,gd=16,hd=96,Vt=1495978707e-1,Ci=6371,Fi=695700,zr=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),bd=new Set(["star","planet","moon","asteroid","comet"]),Yr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],yd=["kind","class","culture","color","image","atmosphere","on","source"],wd=["radius","mass","density","gravity","temperature","inner","outer","cycle"],vd=["albedo"],$d={"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"]},"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-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"]},"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 Vi(e,t={}){yu(e),wu();let n=xd(t),r=n.atlasDocument,o=n.source,i=o,s=o,c=n.diagnostics,a=r.objects[0]?{kind:"object",id:r.objects[0].id}:{kind:"system"},l=[],p=[],f=null,w=!1,x=!1,S=!1,k=null,C=null,q="",v="",A=new Map,re=t.showTextPane??!0,Q=t.showInspector??!0,ee=t.showPreview??!0,te=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(Q),e.dataset.woShowTextPane=String(re),e.dataset.woShowPreview=String(ee),e.innerHTML=Id();let W=xe(e,"[data-editor-toolbar]"),ce=xe(e,"[data-editor-outline]"),X=xe(e,"[data-editor-stage-shell]"),ne=xe(e,"[data-editor-stage]"),Y=xe(e,"[data-editor-overlay]"),he=xe(e,"[data-editor-diagnostics]"),ye=xe(e,"[data-editor-source-diagnostics]"),Ee=xe(e,"[data-editor-status]"),ut=xe(e,"[data-editor-live]"),D=xe(e,"[data-editor-inspector]"),ae=xe(e,"[data-editor-source]"),pt=xe(e,"[data-editor-preview-visual]"),ft=xe(e,"[data-editor-preview-markup]"),T=null;T=Ct(ne,{source:o,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:r.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(d){let u=a?Ur(a):null;if(w||!d){w||(a?.kind==="event-pose"&&a.id?ve({kind:"event",id:a.id},!1,!0):a?.kind==="object"?ve(u?{kind:"event",id:u}:null,!1,!0):a?.kind==="event"&&a.id&&ve({kind:"event",id:a.id},!1,!0));return}if(u&&Ni(r,u,d.objectId)){ve({kind:"event-pose",id:u,key:d.objectId},!1,!0);return}ve({kind:"object",id:d.objectId},!1,!0)},onViewChange(){Me()}}),W.addEventListener("click",Sn),ce.addEventListener("click",On),Y.addEventListener("pointerdown",R),D?.addEventListener("click",En),D?.addEventListener("input",Mn),D?.addEventListener("change",ht),ae?.addEventListener("input",b),ae?.addEventListener("change",$),ae?.addEventListener("blur",$),e.addEventListener("keydown",Z),window.addEventListener("pointermove",F),window.addEventListener("pointerup",Ce),window.addEventListener("pointercancel",Ce);let V={setSource(d){mt(d,!1)&&(H(),Xe())},setAtlasDocument(d){K(d,!1,a,!1),H(),Xe()},getSource(){return o},getAtlasDocument(){return z(r)},getDiagnostics(){return c.map(ir)},getSelection(){return a?{path:{...a}}:null},isDirty(){return S},markSaved(){Rt(!0)},selectPath(d){ve(d,!0,!0)},canUndo(){return l.length>0},canRedo(){return p.length>0},undo(){let d=l.pop();return d?(p.unshift(O()),oe(d),!0):!1},redo(){let d=p.shift();return d?(l.push(O()),oe(d),!0):!1},addObject(d="planet"){let u=$n(d,r.objects.map(j=>j.id)),g=Nd(d,u,r),h=Ud(r,g);return K(h,!0,{kind:"object",id:u}),u},addEvent(){let d=$n("event",r.events.map(h=>h.id)),u={id:d,kind:"",label:xn(d),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},g=z(r);return g.events.push(u),g.events.sort(Ti),K(g,!0,{kind:"event",id:d}),d},addViewpoint(){let d=$n("viewpoint",r.system?.viewpoints.map(h=>h.id)??[]),u={id:d,label:xn(d),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:r.system?.defaults.view??"topdown",preset:r.system?.defaults.preset??null,zoom:null,rotationDeg:0,layers:{},filter:null},g=z(r);return g.system?.viewpoints.push(u),g.system?.viewpoints.sort((h,j)=>h.id.localeCompare(j.id)),K(g,!0,{kind:"viewpoint",id:d}),d},addAnnotation(){let d=$n("annotation",r.system?.annotations.map(h=>h.id)??[]),u={id:d,label:xn(d),targetObjectId:null,body:"",tags:[],sourceObjectId:null},g=z(r);return g.system?.annotations.push(u),g.system?.annotations.sort((h,j)=>h.id.localeCompare(j.id)),K(g,!0,{kind:"annotation",id:d}),d},addMetadata(d,u){let g=d?.trim()||$n("metadata",Object.keys(r.system?.atlasMetadata??{})),h=z(r);return h.system&&(h.system.atlasMetadata[g]=u??""),K(h,!0,{kind:"metadata",key:g}),g},removeSelection(){if(!a||a.kind==="system"||a.kind==="defaults")return!1;let d=Yd(r,a);return K(d,!0,{kind:"system"}),!0},exportSvg(){return T.exportSvg()},exportEmbedMarkup(){return Ai(le(),r)},destroy(){x||(x=!0,W.removeEventListener("click",Sn),ce.removeEventListener("click",On),Y.removeEventListener("pointerdown",R),D?.removeEventListener("click",En),D?.removeEventListener("input",Mn),D?.removeEventListener("change",ht),ae?.removeEventListener("input",b),ae?.removeEventListener("change",$),ae?.removeEventListener("blur",$),e.removeEventListener("keydown",Z),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",Ce),window.removeEventListener("pointercancel",Ce),N(),qe(),T.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Pe(!0),ue(!0),V;function O(){return{atlasDocument:z(r),selection:a?{...a}:null,source:o}}function H(){l.length=0,p.length=0,Xe()}function N(){k!==null&&(window.clearTimeout(k),k=null)}function qe(){C!==null&&(window.clearTimeout(C),C=null)}function le(){return f?.changed?lt(r):o}function ue(d=!1){let u=i!==s||o!==s||f?.changed===!0;!d&&u===S||(S=u,Yt(),t.onDirtyChange?.(S))}function Rt(d=!1){i=o,It(),s=o,ue(d)}function oe(d){N(),r=z(d.atlasDocument),o=d.source,i=o,c=dt(r),a=gt(d.selection),Ge({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),ve(a,!1,!1),Pe(),ue(),Te()}function K(d,u,g,h=!1){u&&(l.push(O()),p.length=0),N(),r=z(d),o=lt(r),h||(i=o),c=dt(r),a=gt(g),Ge({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),ve(a,!1,!1),Pe(),ue(),Te()}function mt(d,u){i=d,ae&&ae.value!==d&&(ae.value=d);let g=un(d);if(!g.ok||!g.value)return c=g.diagnostics.map(E=>({diagnostic:E,path:null})),Bt(),xt(),Ke(),Ze(),Yt(),Dn(),ue(),t.onDiagnosticsChange?.(c.map(ir)),!1;let h=g.value.atlasDocument??yt(g.value.document),j=dn(h,g.diagnostics);return u&&(l.push(O()),p.length=0,i=lt(h)),r=z(h),o=lt(r),c=Bi(j,dt(r)),a=gt(a),Ge({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),Pe(),ue(),Te(),!0}function Ge(d={}){if(!T)return;let u=T.getState(),g=T.getRenderOptions(),h=r.system?.defaults.preset??"atlas-card",j=a?Ur(a):null;w=!0,(g.preset!==h||g.projection!=="document"||(g.activeEventId??null)!==j)&&T.setRenderOptions({preset:h,projection:"document",activeEventId:j}),T.setDocument(on(r)),d.applyViewpointSelection&&a?.kind==="viewpoint"&&a.id?T.goToViewpoint(a.id):d.preserveCamera!==!1?T.setState({...u,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 Te(){let d={source:o,atlasDocument:z(r),diagnostics:c.map(ir),selection:a?{path:{...a}}:null};t.onDiagnosticsChange?.(d.diagnostics),t.onSelectionChange?.(d.selection),t.onChange?.(d)}function ve(d,u,g=!0){a=gt(d),u&&(w=!0,T.setRenderOptions({activeEventId:a?Ur(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),Xe(),Ke(),D?.contains(document.activeElement)||Ze(),Me(),Yt(),Dn(),g&&t.onSelectionChange?.(a?{path:{...a}}:null)}function gt(d){if(!d)return null;let u=Ir(r,d);return u==null?d.kind==="system"||d.kind==="defaults"?d:null:d}function Pe(d=!1){Xe(),Ke(),Bt(),xt(),D?.contains(document.activeElement)||Ze(),It(),_t(d),Me(),Yt(),Dn()}function Xe(){let d=W.querySelector("[data-editor-add-object-type]")?.value??"planet";W.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
+ ${Yr.map(u=>`<option value="${L(u)}"${u===d?" selected":""}>${L(xn(u))}</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"${p.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 Ke(){let d=He(a),u=tu(c),g=Object.entries(r.system?.atlasMetadata??{}).sort(([h],[j])=>h.localeCompare(j));ce.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
+ ${Ye({kind:"system"},"System",d,u)}
212
+ ${Ye({kind:"defaults"},"Defaults",d,u)}
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
+ ${g.length>0?g.map(([h])=>Ye({kind:"metadata",key:h},h,d,u)).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(h=>Ye({kind:"viewpoint",id:h.id},h.label,d,u)).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(h=>Ye({kind:"annotation",id:h.id},h.label,d,u)).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(h=>Ed(h,d,u)).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(h=>Ye({kind:"object",id:h.id},`${h.id} - ${h.type}`,d,u)).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 Bt(){he.innerHTML=c.length===0?'<p class="wo-editor-empty">No diagnostics.</p>':c.map(d=>{let u=d.path?rr(d.path):"Source",g=Li(d);return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(d.diagnostic.severity)}">
235
+ <strong>${L(d.diagnostic.severity.toUpperCase())}</strong>
236
+ <span>${L(u)}${g?` \xB7 ${L(g)}`:""}</span>
237
+ <p>${L(d.diagnostic.message)}</p>
238
+ </article>`}).join("")}function xt(){let d=c.filter(u=>!u.path||u.diagnostic.line!==void 0);ye.innerHTML=d.length===0?'<p class="wo-editor-empty">No source diagnostics.</p>':d.map(u=>{let g=Li(u)??"Source";return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(u.diagnostic.severity)}">
239
+ <strong>${L(u.diagnostic.severity.toUpperCase())}</strong>
240
+ <span>${L(g)}</span>
241
+ <p>${L(u.diagnostic.message)}</p>
242
+ </article>`}).join("")}function Ze(){if(!D)return;kd(D,A);let d={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 u=Zi(a,c);switch(a.kind){case"system":D.innerHTML=u+Md(d),at(D,A),Qe(a,c);return;case"defaults":D.innerHTML=u+Dd(d),at(D,A),Qe(a,c);return;case"metadata":D.innerHTML=u+Ld(d,a.key??""),at(D,A),Qe(a,c);return;case"viewpoint":D.innerHTML=u+Ad(d,a.id??""),at(D,A),Qe(a,c);return;case"event":D.innerHTML=u+Td(d,a.id??""),at(D,A),Qe(a,c);return;case"event-pose":D.innerHTML=u+Pd(d,a.id??"",a.key??""),at(D,A),Qe(a,c);return;case"annotation":D.innerHTML=u+Cd(d,a.id??""),at(D,A),Qe(a,c);return;case"object":D.innerHTML=u+Fd(d,a.id??""),at(D,A),Qe(a,c);return}}function It(){ae&&ae.value!==i&&(ae.value=i)}function _t(d=!1){if(d){qr();return}Hr()}function Me(){if(!T)return;Y.innerHTML="";let d=a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null;if(!d)return;let u=T.getObjectDetails(d);if(!u)return;if(Nt(u.renderObject.x,u.renderObject.y,u.renderObject.objectId),u.parent&&Nt(u.parent.x,u.parent.y,`Parent: ${u.parent.objectId}`,!0),u.renderObject.anchorX!==void 0&&u.renderObject.anchorY!==void 0&&Nt(u.renderObject.anchorX,u.renderObject.anchorY,"Anchor",!0),u.object.placement?.mode==="orbit"&&u.orbit){let h=Ue({x:u.renderObject.x,y:u.renderObject.y});Y.append(vn("orbit-phase",u.objectId,h,"Phase"));let j=Ie(u);Y.append(vn("orbit-radius",u.objectId,j,"Size"))}if(u.object.placement?.mode==="at"){Y.append(vn("at-reference",u.objectId,Ue({x:u.renderObject.x,y:u.renderObject.y}),"Reference"));let h=document.createElement("div");h.className="wo-editor-hint wo-editor-hint-note",h.textContent="Drag to an object center or nearby Lagrange point.",Y.append(h)}if(u.object.placement?.mode==="surface"){Y.append(vn("surface-target",u.objectId,Ue({x:u.renderObject.x,y:u.renderObject.y}),"Surface"));let h=document.createElement("div");h.className="wo-editor-hint wo-editor-hint-note",h.textContent="Drag onto another surface-capable body.",Y.append(h)}if(u.object.placement?.mode==="free"){Y.append(vn("free-distance",u.objectId,Ue({x:u.renderObject.x,y:u.renderObject.y}),"Offset"));let h=document.createElement("div");h.className="wo-editor-hint wo-editor-hint-note",h.textContent="Drag horizontally to change free offset.",Y.append(h)}let g=Ki(a,c).slice(0,3);if(g.length>0){let h=document.createElement("div");h.className="wo-editor-overlay-diagnostics",h.setAttribute("role","status"),h.setAttribute("aria-live","polite"),h.innerHTML=g.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(""),Y.append(h)}}function Nt(d,u,g,h=!1){let j=Ue({x:d,y:u}),E=document.createElement("div");E.className=`wo-editor-hint${h?" is-subtle":""}`,E.style.left=`${j.x}px`,E.style.top=`${j.y}px`,E.textContent=g,Y.append(E)}function Ie(d){let u=d.orbit;if(!u)return Ue({x:d.renderObject.x,y:d.renderObject.y});let g={x:u.cx+(u.kind==="circle"?u.radius??0:u.rx??0),y:u.cy},h=we(g,{x:u.cx,y:u.cy},u.rotationDeg);return Ue(h)}function Ue(d){let u=T.getScene(),g=T.getState(),h={x:u.width/2,y:u.height/2},j=we(d,h,g.rotationDeg),E={x:h.x+(j.x-h.x)*g.scale+g.translateX,y:h.y+(j.y-h.y)*g.scale+g.translateY},U=ne.querySelector("svg");if(!U)return E;let J=U.getBoundingClientRect(),ie=X.getBoundingClientRect();return{x:J.left-ie.left+E.x/Math.max(u.width,1)*J.width,y:J.top-ie.top+E.y/Math.max(u.height,1)*J.height}}function Sn(d){let u=d.target?.closest("[data-editor-action]");if(u)switch(u.dataset.editorAction){case"add-object":{let g=W.querySelector("[data-editor-add-object-type]")?.value;V.addObject(g??"planet");return}case"add-viewpoint":V.addViewpoint();return;case"add-event":V.addEvent();return;case"add-annotation":V.addAnnotation();return;case"add-metadata":V.addMetadata();return;case"remove":V.removeSelection();return;case"undo":V.undo();return;case"redo":V.redo();return;case"format":N(),i=o,It(),ue();return}}function On(d){let u=d.target?.closest("[data-path-kind]");u&&ve({kind:u.dataset.pathKind,id:u.dataset.pathId||void 0,key:u.dataset.pathKey||void 0},!0,!0)}function En(d){let u=d.target?.closest("[data-path-kind]");if(u){ve({kind:u.dataset.pathKind,id:u.dataset.pathId||void 0,key:u.dataset.pathKey||void 0},!0,!0);return}let g=d.target?.closest("[data-editor-action]");if(g&&g.dataset.editorAction==="add-event-pose"){let h=g.dataset.editorEventId||(a?.kind==="event"||a?.kind==="event-pose"?a.id??"":"");if(!h)return;let j=iu(r,h),E=j.events.find(J=>J.id===h),U=E?.positions.at(-1)??E?.positions[0];K(j,!0,U?{kind:"event-pose",id:h,key:U.objectId}:{kind:"event",id:h});return}}function Mn(){m(!1)}function ht(){m(!0)}function m(d){if(!(!a||!D))switch(a.kind){case"system":K(Ut(),d,a,!1);return;case"defaults":K(zt(),d,a,!1);return;case"metadata":K(Wt(a.key??""),d,a,!1);return;case"viewpoint":K(cr(a.id??""),d,a,!1);return;case"event":K(Wi(a.id??""),d,a,!1);return;case"event-pose":K(Yi(a.id??"",a.key??""),d,a,!1);return;case"annotation":K(Hi(a.id??""),d,a,!1);return;case"object":K(qi(a.id??""),d,a,!1);return}}function b(){i=ae?.value??"",ue(),N(),k=window.setTimeout(()=>{k=null,mt(i,!1)},md)}function $(){N(),mt(ae?.value??"",!0)&&It()}function Z(d){if(d.key==="Escape"&&f){d.preventDefault(),je();return}if(!te||d.defaultPrevented||Xi(d))return;let u=(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(u){d.preventDefault(),V.undo();return}g&&(d.preventDefault(),V.redo())}function R(d){let u=d.target?.closest("[data-handle-kind]");if(!u)return;let g=u.dataset.objectId,h=u.dataset.handleKind;if(!g||!["orbit-phase","orbit-radius","at-reference","surface-target","free-distance"].includes(h))return;if(N(),i!==o&&!mt(i,!0)){d.preventDefault();return}let j=T?.getObjectDetails(g)??null;f={kind:h,objectId:g,pointerId:d.pointerId,path:a?{...a}:{kind:"object",id:g},startedFrom:O(),changed:!1,orbitRadiusContext:h==="orbit-radius"&&j?Kd(r,T.getScene(),j):null},u.setPointerCapture?.(d.pointerId),d.preventDefault()}function F(d){if(!f||f.pointerId!==d.pointerId||!a||He(a)!==He(f.path))return;let u=T.getObjectDetails(f.objectId);if(!u)return;let g=Je(d.clientX,d.clientY),h=r;switch(f.kind){case"orbit-phase":u.object.placement?.mode==="orbit"&&u.orbit&&(h=Hd(r,f.path,f.objectId,u,g));break;case"orbit-radius":u.object.placement?.mode==="orbit"&&u.orbit&&(h=qd(r,f.path,f.objectId,u,g,f.orbitRadiusContext??null));break;case"at-reference":u.object.placement?.mode==="at"&&(h=Gd(r,f.path,f.objectId,T.getScene(),g));break;case"surface-target":u.object.placement?.mode==="surface"&&(h=Xd(r,f.path,f.objectId,T.getScene(),g));break;case"free-distance":u.object.placement?.mode==="free"&&(h=Zd(r,f.path,f.objectId,T.getScene(),u,g));break}h!==r&&(f.changed=!0,r=z(h),c=dt(r),Ge({preserveCamera:!0,applyViewpointSelection:!1}),Bt(),xt(),Ke(),Ze(),Me(),Yt(),Dn(),Hr(),ue())}function Ce(d){if(!f||f.pointerId!==d.pointerId)return;let u=f;if(!f.changed){f=null;return}l.push(f.startedFrom),p.length=0,o=lt(r),i=o,f=null,Pe(),u.kind==="orbit-radius"&&Gi(u.objectId),ue(),Te()}function je(){if(!f)return;let d=f.startedFrom;f=null,r=z(d.atlasDocument),o=d.source,i=o,c=dt(r),ve(d.selection,!1,!1),Ge({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),Pe(),ue(),Te()}function Je(d,u){let g=ne.querySelector("svg"),h=T.getScene();if(!g)return{x:h.width/2,y:h.height/2};let j=g.getBoundingClientRect(),E={x:(d-j.left)/Math.max(j.width,1)*h.width,y:(u-j.top)/Math.max(j.height,1)*h.height};return vt(h,T.getState(),E)}function Ut(){let d=z(r),u=D?.querySelector("form[data-editor-form='system']");return!u||!d.system||(d.system.id=me(u,"system-id")||d.system.id,d.system.title=M(u,"system-title")),d}function zt(){let d=z(r),u=D?.querySelector("form[data-editor-form='defaults']");return!u||!d.system||(d.system.defaults.view=me(u,"defaults-view")||"topdown",d.system.defaults.scale=M(u,"defaults-scale"),d.system.defaults.units=M(u,"defaults-units"),d.system.defaults.preset=M(u,"defaults-preset")??null,d.system.defaults.theme=M(u,"defaults-theme")),d}function Wt(d){let u=z(r),g=D?.querySelector("form[data-editor-form='metadata']");if(!g||!u.system)return u;let h=me(g,"metadata-key")||d,j=M(g,"metadata-value")??"";return h!==d?(delete u.system.atlasMetadata[d],u.system.atlasMetadata[h]=j,a={kind:"metadata",key:h},u):(u.system.atlasMetadata[d]=j,u)}function cr(d){let u=z(r),g=D?.querySelector("form[data-editor-form='viewpoint']"),h=u.system?.viewpoints.find(U=>U.id===d);if(!g||!h||!u.system)return u;let j=me(g,"viewpoint-id")||h.id,E={...h,id:j,label:me(g,"viewpoint-label")||h.label,summary:M(g,"viewpoint-summary")??"",focusObjectId:M(g,"viewpoint-focus"),selectedObjectId:M(g,"viewpoint-select"),projection:me(g,"viewpoint-projection")||h.projection,preset:M(g,"viewpoint-preset")??null,zoom:or(M(g,"viewpoint-zoom")),rotationDeg:or(M(g,"viewpoint-rotation"))??0,layers:{background:Be(g,"layer-background"),guides:Be(g,"layer-guides"),"orbits-back":Be(g,"layer-orbits-back"),"orbits-front":Be(g,"layer-orbits-front"),events:Be(g,"layer-events"),objects:Be(g,"layer-objects"),labels:Be(g,"layer-labels"),metadata:Be(g,"layer-metadata")},events:We(M(g,"viewpoint-events")),filter:{query:M(g,"filter-query"),objectTypes:_d(M(g,"filter-object-types")),tags:We(M(g,"filter-tags")),groupIds:We(M(g,"filter-groups"))}};return u.system.viewpoints=u.system.viewpoints.filter(U=>U.id!==h.id).concat(E).sort((U,J)=>U.id.localeCompare(J.id)),h.id!==E.id&&(a={kind:"viewpoint",id:E.id}),u}function Wi(d){let u=z(r),g=D?.querySelector("form[data-editor-form='event']"),h=u.events.find(U=>U.id===d);if(!g||!h)return u;let j=me(g,"event-id")||h.id,E={...h,id:j,kind:me(g,"event-kind"),label:me(g,"event-label")||h.label,summary:M(g,"event-summary"),targetObjectId:M(g,"event-target"),participantObjectIds:We(M(g,"event-participants")),timing:M(g,"event-timing"),visibility:M(g,"event-visibility"),tags:We(M(g,"event-tags")),color:M(g,"event-color"),hidden:Be(g,"event-hidden")};return u.events=u.events.filter(U=>U.id!==h.id).concat(E).sort(Ti),su(u,h.id,E.id,We(M(g,"event-viewpoints"))),h.id!==E.id&&(a={kind:"event",id:E.id}),u}function Yi(d,u){let g=z(r),h=D?.querySelector("form[data-editor-form='event-pose']"),j=g.events.find(De=>De.id===d),E=j?.positions.find(De=>De.objectId===u);if(!h||!j||!E)return g;let J={objectId:me(h,"pose-object-id")||E.objectId,placement:Rd(h,E)},ie=Ne(M(h,"prop-inner")),Ln=Ne(M(h,"prop-outer"));return ie&&(J.inner=ie),Ln&&(J.outer=Ln),j.positions=j.positions.filter(De=>De.objectId!==E.objectId).concat(J).sort(sr),j.targetObjectId!==J.objectId&&!j.participantObjectIds.includes(J.objectId)&&(j.participantObjectIds.push(J.objectId),j.participantObjectIds.sort((De,Ht)=>De.localeCompare(Ht))),E.objectId!==J.objectId&&(a={kind:"event-pose",id:d,key:J.objectId}),g}function Hi(d){let u=z(r),g=D?.querySelector("form[data-editor-form='annotation']"),h=u.system?.annotations.find(U=>U.id===d);if(!g||!h||!u.system)return u;let j=me(g,"annotation-id")||h.id,E={...h,id:j,label:me(g,"annotation-label")||h.label,targetObjectId:M(g,"annotation-target"),body:M(g,"annotation-body")??"",tags:We(M(g,"annotation-tags")),sourceObjectId:M(g,"annotation-source")};return u.system.annotations=u.system.annotations.filter(U=>U.id!==h.id).concat(E).sort((U,J)=>U.id.localeCompare(J.id)),h.id!==E.id&&(a={kind:"annotation",id:E.id}),u}function qi(d){let u=z(r),g=D?.querySelector("form[data-editor-form='object']"),h=u.objects.find(ie=>ie.id===d);if(!g||!h)return u;let j=me(g,"object-id")||h.id,E={...h,id:j,type:me(g,"object-type")||h.type,properties:{...h.properties},info:{...h.info},placement:Vd(g,h)};for(let ie of yd)nr(E.properties,ie,M(g,`prop-${ie}`));for(let ie of wd)nr(E.properties,ie,Bd(M(g,`prop-${ie}`)));for(let ie of vd)nr(E.properties,ie,or(M(g,`prop-${ie}`)));nr(E.properties,"tags",We(M(g,"prop-tags"))),E.properties.hidden=Be(g,"prop-hidden");let U=M(g,"info-description");U?E.info.description=U:delete E.info.description;let J=zd(u,h.id,E);return h.id!==E.id&&(a={kind:"object",id:E.id}),J}function Yt(){let d=c.filter(h=>h.diagnostic.severity==="error").length,u=c.filter(h=>h.diagnostic.severity==="warning").length,g=a?rr(a):"Nothing selected";Ee.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${d>0?" is-error":u>0?" is-warning":""}">${d} errors \xB7 ${u} warnings</span>
249
+ <span class="wo-editor-status-pill">${L(g)}</span>
250
+ `}function Dn(){let d=c.filter(g=>g.diagnostic.severity==="error").length,u=c.filter(g=>g.diagnostic.severity==="warning").length;ut.textContent=`${S?"Unsaved changes.":"Saved."} ${d} errors, ${u} warnings. ${a?rr(a):"Nothing selected"}.`}function Hr(){C===null&&(C=window.setTimeout(()=>{C=null,qr()},gd))}function qr(){if(!T)return;let d=T.exportSvg();pt&&d!==q&&(pt.innerHTML=d,q=d);let u=Ai(le(),r);ft&&u!==v&&(ft.textContent=u,v=u)}function Gi(d){if(!T)return;let u=T.getObjectDetails(d);if(!u)return;let g=fn(T.getScene(),T.getState()),h=36/Math.max(T.getState().scale,.001),j=u.renderObject;(j.x<g.minX+h||j.x>g.maxX-h||j.y<g.minY+h||j.y>g.maxY-h)&&T.fitToSystem()}function Xi(d){let u=d.target;if(!u)return!1;let g=u.tagName.toLowerCase();return u.isContentEditable||g==="input"||g==="textarea"||g==="select"}function lr(d,u){if(!d)return[];let g=He(d);return u.filter(h=>{let j=He(h.path);return j&&j===g?!0:d.kind==="object"&&h.diagnostic.objectId===d.id})}function Ki(d,u){return lr(d,u).filter(g=>{let h=g.diagnostic.field??"";return zr.has(h)||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 Zi(d,u){let g=lr(d,u);return g.length===0?"":`<div class="wo-editor-inspector-summary">
251
+ ${g.slice(0,4).map(h=>`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(h.diagnostic.severity)}">
252
+ <strong>${L(h.diagnostic.severity.toUpperCase())}</strong>
253
+ <span>${L(h.diagnostic.field??rr(d))}</span>
254
+ <p>${L(h.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 Qe(d,u){if(!D||!d)return;let g=lr(d,u),h=new Map;for(let j of g)for(let E of nu(d,j.diagnostic.field)){let U=h.get(E)??[];U.push(j),h.set(E,U)}for(let[j,E]of h){let U=D.querySelector(`[name="${CSS.escape(j)}"]`),J=U?.closest(".wo-editor-field, .wo-editor-checkbox");if(!U||!J)continue;let ie=E.some(Ht=>Ht.diagnostic.severity==="error"),Ln=E.some(Ht=>Ht.diagnostic.severity==="warning");J.classList.add(ie?"has-error":"has-warning"),U.setAttribute("aria-invalid",ie?"true":"false");let De=document.createElement("div");De.className=`wo-editor-field-note${ie?" is-error":Ln?" is-warning":""}`,De.textContent=E[0]?.diagnostic.message??"",J.append(De)}}}function xd(e){if(e.atlasDocument){let n=z(e.atlasDocument);return{atlasDocument:n,source:lt(n),diagnostics:dt(n)}}if(e.source){let n=un(e.source);if(n.ok&&n.value){let r=n.value.atlasDocument??yt(n.value.document);return{atlasDocument:r,source:lt(r),diagnostics:Bi(dn(r,n.diagnostics),dt(r))}}}let t=Gn("WorldOrbit");return{atlasDocument:t,source:lt(t),diagnostics:dt(t)}}function lt(e){return Wn(e,{schema:e.version})}function Id(){let e=Od();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">${wn("Atlas","atlas",'<div class="wo-editor-outline" data-editor-outline></div>')}</div>
262
+ <div class="wo-editor-panel">${wn("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
+ ${wn("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
+ ${wn("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
+ ${wn("Source","source",`<textarea
275
288
  class="wo-editor-source"
276
289
  data-editor-source
277
290
  spellcheck="false"
@@ -285,104 +298,146 @@
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 wn(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 ge(e,t,n,r,o=!1){let i=Sd(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(i)}"${o?" open":""}>
305
+ <summary><span>${L(n)}</span></summary>
306
+ <div class="wo-editor-inspector-section-body">${r}</div>
307
+ </details>`}function ar(e,t){return`<span class="wo-editor-field-label">${L(e)}${jd(t)}</span>`}function jd(e){let t=$d[e];return t?`<details class="wo-editor-field-help">
308
+ <summary aria-label="Explain ${zi(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 kd(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;r&&t.set(r,n.open)}}function at(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 Sd(e,t){return`${e}:${t}`}function Od(){return typeof window>"u"?!0:typeof window.matchMedia=="function"?!window.matchMedia("(max-width: 1280px)").matches:window.innerWidth>1280}function Ye(e,t,n,r){let o=He(e),i=o?r.get(o):null,s=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===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 Ed(e,t,n){return`<div class="wo-editor-outline-group">
314
+ ${Ye({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(sr).map(r=>Ye({kind:"event-pose",id:e.id,key:r.objectId},r.objectId,t,n)).join("")}</div>`:""}
316
+ </div>`}function Md(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
+ ${ge("system","basics","Basics",`${I("System ID","system-id",e.system?.id??"")}
319
+ ${I("Title","system-title",e.system?.title??"")}`,!0)}
320
+ </form>`}function Dd(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
+ ${ge("defaults","basics","Basics",`${$t("Projection","defaults-view",[["topdown","Topdown"],["isometric","Isometric"]],t?.view??"topdown")}
323
+ ${I("Scale preset","defaults-scale",t?.scale??"")}
324
+ ${I("Units","defaults-units",t?.units??"")}
325
+ ${$t("Render preset","defaults-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],t?.preset??"")}
326
+ ${I("Theme","defaults-theme",t?.theme??"")}`,!0)}
327
+ </form>`}function Ld(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
+ ${ge("metadata","entry","Entry",`${I("Key","metadata-key",t)}
330
+ ${jn("Value","metadata-value",n)}`,!0)}
331
+ </form>`}function Ad(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
+ ${ge("viewpoint","basics","Basics",`${I("ID","viewpoint-id",n.id)}
334
+ ${I("Label","viewpoint-label",n.label)}
335
+ ${jn("Summary","viewpoint-summary",n.summary)}
336
+ ${I("Focus object","viewpoint-focus",n.focusObjectId??"")}
337
+ ${I("Selected object","viewpoint-select",n.selectedObjectId??"")}
338
+ ${$t("Projection","viewpoint-projection",[["topdown","Topdown"],["isometric","Isometric"]],n.projection)}
339
+ ${$t("Preset","viewpoint-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],n.preset??"")}
340
+ ${I("Zoom","viewpoint-zoom",n.zoom===null?"":String(n.zoom))}
341
+ ${I("Rotation","viewpoint-rotation",String(n.rotationDeg))}`,!0)}
342
+ ${ge("viewpoint","layers","Layers",`<fieldset class="wo-editor-fieldset">
327
343
  <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)}
344
+ ${_e("Background","layer-background",n.layers.background!==!1)}
345
+ ${_e("Guides","layer-guides",n.layers.guides!==!1)}
346
+ ${_e("Orbits back","layer-orbits-back",n.layers["orbits-back"]!==!1)}
347
+ ${_e("Orbits front","layer-orbits-front",n.layers["orbits-front"]!==!1)}
348
+ ${_e("Events","layer-events",n.layers.events!==!1)}
349
+ ${_e("Objects","layer-objects",n.layers.objects!==!1)}
350
+ ${_e("Labels","layer-labels",n.layers.labels!==!1)}
351
+ ${_e("Metadata","layer-metadata",n.layers.metadata!==!1)}
335
352
  </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">
353
+ ${ge("viewpoint","filter","Filter",`${I("Filter query","filter-query",n.filter?.query??"")}
354
+ ${I("Filter object types","filter-object-types",n.filter?.objectTypes.join(" ")??"")}
355
+ ${I("Filter tags","filter-tags",n.filter?.tags.join(" ")??"")}
356
+ ${I("Filter groups","filter-groups",n.filter?.groupIds.join(" ")??"")}
357
+ ${I("Events","viewpoint-events",n.events.join(" "))}`)}
358
+ </form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function Td(e,t){let n=e.events.find(o=>o.id===t);if(!n)return'<p class="wo-editor-empty">Event not found.</p>';let r=e.viewpoints.filter(o=>o.events.includes(n.id)).map(o=>o.id).join(" ");return`<form class="wo-editor-form" data-editor-form="event">
359
+ <h2>Event</h2>
360
+ ${ge("event","basics","Basics",`${I("ID","event-id",n.id)}
361
+ ${I("Kind","event-kind",n.kind)}
362
+ ${I("Label","event-label",n.label)}
363
+ ${jn("Summary","event-summary",n.summary??"")}
364
+ ${I("Target object","event-target",n.targetObjectId??"")}
365
+ ${I("Participants","event-participants",n.participantObjectIds.join(" "))}
366
+ ${I("Timing","event-timing",n.timing??"")}
367
+ ${I("Visibility","event-visibility",n.visibility??"")}
368
+ ${I("Tags","event-tags",n.tags.join(" "))}
369
+ ${I("Color","event-color",n.color??"")}
370
+ ${_e("Hidden","event-hidden",n.hidden===!0)}`,!0)}
371
+ ${ge("event","viewpoints","Viewpoints",`${I("Viewpoints","event-viewpoints",r)}`)}
372
+ ${ge("event","positions","Positions",`${n.positions.length>0?`<div class="wo-editor-inline-list">${n.positions.map(o=>Ye({kind:"event-pose",id:n.id,key:o.objectId},o.objectId,null,new Map)).join("")}</div>`:'<p class="wo-editor-empty">No event poses yet.</p>'}
373
+ <div class="wo-editor-inline-actions">
374
+ <button type="button" data-editor-action="add-event-pose" data-editor-event-id="${L(n.id)}">Add pose</button>
375
+ </div>`)}
376
+ </form>`}function Pd(e,t,n){let r=e.events.find(a=>a.id===t),o=r?.positions.find(a=>a.objectId===n);if(!r||!o)return'<p class="wo-editor-empty">Event pose not found.</p>';let i=o.placement?.mode??"",s=o.placement?.mode==="orbit"||o.placement?.mode==="surface"||o.placement?.mode==="at"?o.placement.target:"",c=o.placement?.mode==="free"?o.placement.distance?pe(o.placement.distance):o.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="event-pose">
377
+ <h2>Event Pose</h2>
378
+ <p class="wo-editor-inline-note">Event <strong>${L(r.label||r.id)}</strong></p>
379
+ ${ge("event-pose","identity","Identity",`${I("Object","pose-object-id",o.objectId)}
380
+ <div class="wo-editor-inline-actions">
381
+ <button type="button" data-path-kind="event" data-path-id="${L(r.id)}">Select event</button>
382
+ </div>`,!0)}
383
+ ${ge("event-pose","placement","Placement",`${$t("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],i)}
384
+ ${I("Placement target","placement-target",s)}
385
+ ${I("Free value","placement-free",c)}
386
+ ${I("Distance","placement-distance",o.placement?.mode==="orbit"&&o.placement.distance?pe(o.placement.distance):"")}
387
+ ${I("Semi-major","placement-semiMajor",o.placement?.mode==="orbit"&&o.placement.semiMajor?pe(o.placement.semiMajor):"")}
388
+ ${I("Eccentricity","placement-eccentricity",o.placement?.mode==="orbit"&&o.placement.eccentricity!==void 0?String(o.placement.eccentricity):"")}
389
+ ${I("Period","placement-period",o.placement?.mode==="orbit"&&o.placement.period?pe(o.placement.period):"")}
390
+ ${I("Angle","placement-angle",o.placement?.mode==="orbit"&&o.placement.angle?pe(o.placement.angle):"")}
391
+ ${I("Inclination","placement-inclination",o.placement?.mode==="orbit"&&o.placement.inclination?pe(o.placement.inclination):"")}
392
+ ${I("Phase","placement-phase",o.placement?.mode==="orbit"&&o.placement.phase?pe(o.placement.phase):"")}
393
+ ${I("Inner","prop-inner",o.inner?pe(o.inner):"")}
394
+ ${I("Outer","prop-outer",o.outer?pe(o.outer):"")}`,!0)}
395
+ </form>`}function Cd(e,t){let n=e.system?.annotations.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="annotation">
341
396
  <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">
397
+ ${ge("annotation","entry","Entry",`${I("ID","annotation-id",n.id)}
398
+ ${I("Label","annotation-label",n.label)}
399
+ ${I("Target object","annotation-target",n.targetObjectId??"")}
400
+ ${I("Source object","annotation-source",n.sourceObjectId??"")}
401
+ ${jn("Body","annotation-body",n.body)}
402
+ ${I("Tags","annotation-tags",n.tags.join(" "))}`,!0)}
403
+ </form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function Fd(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??"",o=n.placement?.mode==="orbit"||n.placement?.mode==="surface"||n.placement?.mode==="at"?n.placement.target:"",i=n.placement?.mode==="free"?n.placement.distance?pe(n.placement.distance):n.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="object">
349
404
  <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">
405
+ ${ge("object","identity","Identity",`${I("ID","object-id",n.id)}
406
+ ${$t("Type","object-type",Yr.map(s=>[s,xn(s)]),n.type)}`,!0)}
407
+ ${ge("object","placement","Placement",`${$t("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],r)}
408
+ ${I("Placement target","placement-target",o)}
409
+ ${I("Free value","placement-free",i)}
410
+ ${I("Distance","placement-distance",n.placement?.mode==="orbit"&&n.placement.distance?pe(n.placement.distance):"")}
411
+ ${I("Semi-major","placement-semiMajor",n.placement?.mode==="orbit"&&n.placement.semiMajor?pe(n.placement.semiMajor):"")}
412
+ ${I("Eccentricity","placement-eccentricity",n.placement?.mode==="orbit"&&n.placement.eccentricity!==void 0?String(n.placement.eccentricity):"")}
413
+ ${I("Period","placement-period",n.placement?.mode==="orbit"&&n.placement.period?pe(n.placement.period):"")}
414
+ ${I("Angle","placement-angle",n.placement?.mode==="orbit"&&n.placement.angle?pe(n.placement.angle):"")}
415
+ ${I("Inclination","placement-inclination",n.placement?.mode==="orbit"&&n.placement.inclination?pe(n.placement.inclination):"")}
416
+ ${I("Phase","placement-phase",n.placement?.mode==="orbit"&&n.placement.phase?pe(n.placement.phase):"")}`,!0)}
417
+ ${ge("object","properties","Properties",`<fieldset class="wo-editor-fieldset">
363
418
  <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))}
419
+ ${I("Kind","prop-kind",st(n.properties.kind))}
420
+ ${I("Class","prop-class",st(n.properties.class))}
421
+ ${I("Culture","prop-culture",st(n.properties.culture))}
422
+ ${I("Tags","prop-tags",cu(n.properties.tags))}
423
+ ${I("Color","prop-color",st(n.properties.color))}
424
+ ${I("Image","prop-image",st(n.properties.image))}
425
+ ${_e("Hidden","prop-hidden",n.properties.hidden===!0)}
426
+ ${I("Radius","prop-radius",ct(n.properties.radius))}
427
+ ${I("Mass","prop-mass",ct(n.properties.mass))}
428
+ ${I("Density","prop-density",ct(n.properties.density))}
429
+ ${I("Gravity","prop-gravity",ct(n.properties.gravity))}
430
+ ${I("Temperature","prop-temperature",ct(n.properties.temperature))}
431
+ ${I("Albedo","prop-albedo",lu(n.properties.albedo))}
432
+ ${I("Atmosphere","prop-atmosphere",st(n.properties.atmosphere))}
433
+ ${I("Inner","prop-inner",ct(n.properties.inner))}
434
+ ${I("Outer","prop-outer",ct(n.properties.outer))}
435
+ ${I("On","prop-on",st(n.properties.on))}
436
+ ${I("Source","prop-source",st(n.properties.source))}
437
+ ${I("Cycle","prop-cycle",ct(n.properties.cycle))}
383
438
  </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=`
439
+ ${ge("object","info","Info",`${jn("Description","info-description",n.info.description??"")}`)}
440
+ </form>`}function I(e,t,n){return`<label class="wo-editor-field">${ar(e,t)}<input name="${L(t)}" value="${zi(n)}" /></label>`}function jn(e,t,n){return`<label class="wo-editor-field">${ar(e,t)}<textarea name="${L(t)}">${L(n)}</textarea></label>`}function $t(e,t,n,r){return`<label class="wo-editor-field">${ar(e,t)}<select name="${L(t)}">${n.map(([o,i])=>`<option value="${L(o)}"${o===r?" selected":""}>${L(i)}</option>`).join("")}</select></label>`}function _e(e,t,n){return`<label class="wo-editor-checkbox"><input type="checkbox" name="${L(t)}"${n?" checked":""} />${ar(e,t)}</label>`}function vn(e,t,n,r){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=`${n.x}px`,o.style.top=`${n.y}px`,o.textContent=r,o}function me(e,t){return e.elements.namedItem(t)?.value.trim()??""}function M(e,t){let n=me(e,t);return n||null}function Be(e,t){return e.elements.namedItem(t)?.checked??!1}function Vd(e,t){return Ri(e,t.placement,t.id)}function Rd(e,t){return Ri(e,t.placement,t.objectId)}function Ri(e,t,n){let r=me(e,"placement-mode"),o=M(e,"placement-target");switch(r){case"orbit":return{mode:r,target:o??(t?.mode==="orbit"?t.target:n),distance:Ne(M(e,"placement-distance")),semiMajor:Ne(M(e,"placement-semiMajor")),eccentricity:or(M(e,"placement-eccentricity"))??void 0,period:Ne(M(e,"placement-period")),angle:Ne(M(e,"placement-angle")),inclination:Ne(M(e,"placement-inclination")),phase:Ne(M(e,"placement-phase"))};case"at":return{mode:r,target:o??n,reference:In(o??n)};case"surface":return{mode:r,target:o??n};case"free":{let i=M(e,"placement-free"),s=Ne(i);return{mode:r,distance:s??void 0,descriptor:s?void 0:i??void 0}}default:return null}}function nr(e,t,n){let r=Array.isArray(n)&&n.length===0;if(n==null||r||n===""){delete e[t];return}e[t]=n}function Bd(e){return e?Ne(e)??e:null}function Ne(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 or(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function _d(e){return We(e).filter(n=>Yr.includes(n))}function We(e){return e?.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)??[]}function Nd(e,t,n){let r=n.objects.find(o=>o.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:In(`${r}:L4`)}:{mode:"orbit",target:r,distance:{value:1,unit:"au"}},info:{}}}function Ud(e,t){let n=z(e);return n.objects=n.objects.filter(r=>r.id!==t.id).concat(t).sort(_i),n}function zd(e,t,n){let r=z(e);return r.objects=r.objects.filter(o=>o.id!==t).concat(n).sort(_i),t!==n.id&&Wd(r,t,n.id),r}function Wd(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 o=r.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)),r.placement.target=Wr(o)}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(o=>o===t?n:o);for(let o of r.positions)if(o.objectId===t&&(o.objectId=n),o.placement?.mode==="orbit"&&o.placement.target===t&&(o.placement.target=n),o.placement?.mode==="surface"&&o.placement.target===t&&(o.placement.target=n),o.placement?.mode==="at"){let i=o.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)),o.placement.target=Wr(i)}r.positions.sort(sr)}}function Yd(e,t){let n=jr(e,t);if(t.kind==="event"&&t.id){for(let r of n.system?.viewpoints??[])r.events=r.events.filter(o=>o!==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 o=r.placement.reference;(o.kind==="anchor"&&o.objectId===t.id||o.kind==="lagrange"&&(o.primary===t.id||o.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(o=>o!==t.id),r.positions=r.positions.filter(o=>o.objectId!==t.id);for(let o of r.positions)if(o.placement?.mode==="orbit"&&o.placement.target===t.id&&(o.placement=null),o.placement?.mode==="surface"&&o.placement.target===t.id&&(o.placement=null),o.placement?.mode==="at"){let i=o.placement.reference;(i.kind==="anchor"&&i.objectId===t.id||i.kind==="lagrange"&&(i.primary===t.id||i.secondary===t.id))&&(o.placement=null)}}return n}function kn(e,t,n){if(t.kind==="event-pose"&&t.id&&t.key){let o=Ni(e,t.id,t.key);return o?.placement?{placement:o.placement}:null}let r=ou(e,n);return r?.placement?{placement:r.placement}:null}function Hd(e,t,n,r,o){let i=r.orbit;if(!i||r.object.placement?.mode!=="orbit")return e;let s=we(o,{x:i.cx,y:i.cy},-i.rotationDeg),c=i.kind==="circle"?i.radius??1:i.rx??1,a=i.kind==="circle"?i.radius??1:i.ry??1,l=Math.atan2((s.y-i.cy)/Math.max(a,1),(s.x-i.cx)/Math.max(c,1)),p=uu(l*180/Math.PI),f=z(e),w=kn(f,t,n);return!w||w.placement.mode!=="orbit"?e:(w.placement.phase={value:Ft(p,2),unit:"deg"},f)}function qd(e,t,n,r,o,i){let s=r.orbit;if(!s||r.object.placement?.mode!=="orbit"||!i)return e;let c=we(o,{x:s.cx,y:s.cy},-s.rotationDeg),a=Math.max(Math.abs(c.x-s.cx),24),l=Math.max(a-i.radiusOffsetPx,i.innerPx),p=gu(l,i.innerPx,i.stepPx),f=z(e),w=kn(f,t,n);if(!w||w.placement.mode!=="orbit")return e;let x=w.placement.semiMajor??w.placement.distance??{value:1,unit:"au"},S=Ui(Math.max(p,0),i.preferredUnit??x.unit);return w.placement.semiMajor?w.placement.semiMajor=S:w.placement.distance=S,f}function Gd(e,t,n,r,o){let i=Qd(r,n,o);if(!i)return e;let s=z(e),c=kn(s,t,n);return!c||c.placement.mode!=="at"?e:(c.placement.reference=i.reference,c.placement.target=Wr(i.reference),s)}function Xd(e,t,n,r,o){let i=Jd(r,n,o,a=>bd.has(a.object.type));if(!i)return e;let s=z(e),c=kn(s,t,n);return!c||c.placement.mode!=="surface"?e:(c.placement.target=i.objectId,s)}function Kd(e,t,n){if(n.object.placement?.mode!=="orbit"||!n.orbit||!n.parent)return null;let r=n.object.placement.target,o=t.objects.filter(w=>w.object.placement?.mode==="orbit"&&w.object.placement.target===r&&!w.hidden).length,i=hu(t.layoutPreset),s=(o>2?54:64)*i*t.scaleModel.orbitDistanceMultiplier,c=n.parent.radius+56*i*t.scaleModel.orbitDistanceMultiplier,a=n.object.placement.semiMajor??n.object.placement.distance??null,l=fu(a),p=n.orbit.kind==="circle"?n.orbit.radius??1:n.orbit.rx??1,f=mu(l??0,c,s);return{innerPx:c,stepPx:s,radiusOffsetPx:p-f,preferredUnit:a?.unit??null}}function Zd(e,t,n,r,o,i){if(o.object.placement?.mode!=="free")return e;let s=r.width-r.padding-140,c=Math.max(0,s-i.x),a=z(e),l=kn(a,t,n);if(!l||l.placement.mode!=="free")return e;let p=pu(l.placement.distance?.unit??null),f=c/Math.max(hd*r.scaleModel.freePlacementMultiplier,1);return f<.01?(l.placement.distance=void 0,l.placement.descriptor||delete l.placement.descriptor,a):(l.placement.distance=Ui(f,p),delete l.placement.descriptor,a)}function Jd(e,t,n,r=()=>!0){let o=null,i=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<i&&(o=s,i=c)}return i<=140?o:null}function Qd(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:In(c.objectId),x:c.x,y:c.y,distance:a})}if(r)return{reference:r.reference,x:r.x,y:r.y};let o=[];for(let c of e.objects)c.hidden||c.objectId===t||o.push({reference:In(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(p=>p.objectId===c.parentId&&!p.hidden),l=e.objects.find(p=>p.objectId===c.objectId&&!p.hidden);if(!(!a||!l))for(let p of["L1","L2","L3","L4","L5"]){let f=eu(a,l,p);o.push({reference:In(`${c.objectId}:${p}`),x:f.x,y:f.y})}}let i=null,s=Number.POSITIVE_INFINITY;for(let c of o){let a=Math.hypot(n.x-c.x,n.y-c.y);a<s&&(i=c,s=a)}return s<=140?i:null}function eu(e,t,n){let r=t.x-e.x,o=t.y-e.y,i=Math.hypot(r,o)||1,s=r/i,c=o/i,a=-c,l=s,p=du(i*.25,24,68);switch(n){case"L1":return{x:t.x-s*p,y:t.y-c*p};case"L2":return{x:t.x+s*p,y:t.y+c*p};case"L3":return{x:e.x-s*p,y:e.y-c*p};case"L4":return{x:t.x+(s*.5-a*.8660254)*p,y:t.y+(c*.5-l*.8660254)*p};case"L5":return{x:t.x+(s*.5+a*.8660254)*p,y:t.y+(c*.5+l*.8660254)*p}}}function In(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 Wr(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 dt(e){return kr(e)}function Bi(e,t){let n=new Set,r=[];for(let o of[...e,...t]){let i=`${o.diagnostic.code}:${o.diagnostic.message}:${He(o.path)}`;n.has(i)||(n.add(i),r.push(ir(o)))}return r}function tu(e){let t=new Map;for(let n of e){let r=He(n.path)??(n.diagnostic.objectId?He({kind:"object",id:n.diagnostic.objectId}):null);if(!r)continue;let o=t.get(r)??{errors:0,warnings:0};n.diagnostic.severity==="error"?o.errors+=1:n.diagnostic.severity==="warning"&&(o.warnings+=1),t.set(r,o)}return t}function Li(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 nu(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"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"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"]:zr.has(t)?[`placement-${t}`]:t==="inner"||t==="outer"?[`prop-${t}`]:[];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"]:zr.has(t)?[`placement-${t}`]:[`prop-${t}`]}}function Ai(e,t){return yn(e,{mode:"interactive",preset:t.system?.defaults.preset??"atlas-card",projection:t.system?.defaults.view??"topdown"})}function rr(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 He(e){return e?`${e.kind}:${e.id??""}:${e.key??""}`:null}function Ur(e){return e&&(e.kind==="event"||e.kind==="event-pose")?e.id??null:null}function _i(e,t){return e.id.localeCompare(t.id)}function Ti(e,t){return e.id.localeCompare(t.id)}function sr(e,t){return e.objectId.localeCompare(t.objectId)}function ru(e,t){return e.events.find(n=>n.id===t)??null}function Ni(e,t,n){return ru(e,t)?.positions.find(r=>r.objectId===n)??null}function ou(e,t){return e.objects.find(n=>n.id===t)??null}function iu(e,t){let n=z(e),r=n.events.find(i=>i.id===t);if(!r)return e;let o=n.objects.find(i=>!r.positions.some(s=>s.objectId===i.id))??n.objects[0];return o?(r.targetObjectId!==o.id&&!r.participantObjectIds.includes(o.id)&&(r.participantObjectIds.push(o.id),r.participantObjectIds.sort((i,s)=>i.localeCompare(s))),r.positions.push(au(o)),r.positions.sort(sr),n):e}function au(e){return{objectId:e.id,placement:e.placement?structuredClone(e.placement):null,inner:Pi(e.properties.inner),outer:Pi(e.properties.outer)}}function su(e,t,n,r){let o=new Set(r);for(let i of e.system?.viewpoints??[]){let s=new Set(i.events);s.delete(t),s.delete(n),o.has(i.id)&&s.add(n),i.events=[...s].sort((c,a)=>c.localeCompare(a))}}function $n(e,t){let n=e.trim()||"item",r=1,o=n;for(;t.includes(o);)r+=1,o=`${n}-${r}`;return o}function xn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ir(e){return{diagnostic:{...e.diagnostic},path:e.path?{...e.path}:null}}function st(e){return typeof e=="string"?e:""}function cu(e){return Array.isArray(e)?e.join(" "):""}function ct(e){return e&&typeof e=="object"&&"value"in e?pe(e):""}function Pi(e){return e&&typeof e=="object"&&"value"in e?e:void 0}function lu(e){return typeof e=="number"?String(e):""}function pe(e){return`${e.value}${e.unit??""}`}function Ft(e,t){let n=10**t;return Math.round(e*n)/n}function du(e,t,n){return Math.min(Math.max(e,t),n)}function uu(e){let t=e%360;return t<0&&(t+=360),t}function pu(e){switch(e){case"au":case"km":case"re":case"sol":case null:return e;default:return null}}function fu(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Vt;case"re":return e.value*Ci/Vt;case"sol":return e.value*Fi/Vt;default:return e.value}}function Ui(e,t){switch(t){case"km":return{value:Ft(e*Vt,0),unit:t};case"re":return{value:Ft(e*Vt/Ci,3),unit:t};case"sol":return{value:Ft(e*Vt/Fi,4),unit:t};case"au":return{value:Ft(e,3),unit:t};default:return{value:Ft(e,2),unit:null}}}function mu(e,t,n){return t+n*bu(Math.max(e,0)+1)}function gu(e,t,n){return e<=t?0:Math.pow(2,(e-t)/Math.max(n,1e-4))-1}function hu(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function bu(e){return Math.log(e)/Math.log(2)}function L(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function zi(e){return L(e)}function yu(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 xe(e,t){let n=e.querySelector(t);if(!n)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return n}function wu(){if(document.getElementById(Di))return;let e=document.createElement("style");e.id=Di,e.textContent=`
386
441
  .wo-editor {
387
442
  --wo-editor-sidebar-width: 280px;
388
443
  --wo-editor-inspector-width: 360px;
@@ -575,6 +630,12 @@
575
630
  .wo-editor-overlay-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.24); }
576
631
  .wo-editor-outline { display: grid; gap: 14px; }
577
632
  .wo-editor-outline-section { display: grid; gap: 8px; }
633
+ .wo-editor-outline-group { display: grid; gap: 6px; }
634
+ .wo-editor-outline-children {
635
+ display: grid;
636
+ gap: 6px;
637
+ padding-left: 16px;
638
+ }
578
639
  .wo-editor-outline-section h3 {
579
640
  margin: 0;
580
641
  color: rgba(237,246,255,0.68);
@@ -614,6 +675,27 @@
614
675
  background: rgba(255, 120, 120, 0.18);
615
676
  color: #ffb2b2;
616
677
  }
678
+ .wo-editor-inline-list { display: grid; gap: 8px; }
679
+ .wo-editor-inline-actions {
680
+ display: flex;
681
+ flex-wrap: wrap;
682
+ gap: 10px;
683
+ margin-top: 12px;
684
+ }
685
+ .wo-editor-inline-actions button {
686
+ border: 1px solid rgba(255,255,255,0.14);
687
+ border-radius: 999px;
688
+ background: rgba(255,255,255,0.06);
689
+ color: #edf6ff;
690
+ cursor: pointer;
691
+ font: 600 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
692
+ padding: 8px 12px;
693
+ }
694
+ .wo-editor-inline-note {
695
+ margin: 0 0 12px;
696
+ color: rgba(237,246,255,0.72);
697
+ font: 500 12px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
698
+ }
617
699
  .wo-editor-diagnostics { display: grid; gap: 10px; }
618
700
  .wo-editor-diagnostic {
619
701
  display: grid;
@@ -809,4 +891,4 @@
809
891
  .wo-editor-stage { min-height: 440px; }
810
892
  .wo-editor-status { flex-direction: column; }
811
893
  }
812
- `,document.head.append(e)}return Ci(Od);})();
894
+ `,document.head.append(e)}return ra(vu);})();