worldorbit 2.5.15 → 2.5.16

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.
@@ -0,0 +1,812 @@
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" />
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>
18
+ <defs>
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}" />
22
+ </linearGradient>
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" />
26
+ </radialGradient>
27
+ <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
28
+ <stop offset="0%" stop-color="${r.backgroundGlow}" />
29
+ <stop offset="100%" stop-color="transparent" />
30
+ </radialGradient>
31
+ ${p}
32
+ </defs>
33
+ <style>
34
+ .wo-bg { fill: url(#wo-bg); }
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; }
38
+ .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
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; }
48
+ .wo-object { cursor: pointer; outline: none; }
49
+ .wo-object:focus-visible .wo-selection-ring,
50
+ .wo-object:hover .wo-selection-ring,
51
+ .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-chain-selected .wo-selection-ring,
56
+ .wo-chain-hover .wo-selection-ring { display: block; }
57
+ .wo-ancestor-selected .wo-selection-ring,
58
+ .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
59
+ .wo-chain-selected .wo-label,
60
+ .wo-chain-hover .wo-label { fill: ${r.accent}; }
61
+ .wo-ancestor-selected .wo-label,
62
+ .wo-ancestor-hover .wo-label { fill: ${r.ink}; opacity: 0.82; }
63
+ .wo-orbit-related-selected,
64
+ .wo-orbit-related-hover { stroke: ${r.accentStrong}; opacity: 1; }
65
+ .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
66
+ .wo-object-image { pointer-events: none; }
67
+ </style>
68
+ ${V}
69
+ ${I}
70
+ <g data-worldorbit-world="true">
71
+ <g data-worldorbit-camera-root="${Tn}" id="${Tn}">
72
+ <g data-worldorbit-world-content="true">
73
+ ${o.orbits?`<g data-layer-id="orbits-back">${c.back}</g>`:""}
74
+ ${o.guides?`<g data-layer-id="guides">${u}</g>`:""}
75
+ ${o.relations?`<g data-layer-id="relations">${v}</g>`:""}
76
+ ${o.objects?`<g data-layer-id="objects">${x}</g>`:""}
77
+ ${o.orbits?`<g data-layer-id="orbits-front">${c.front}</g>`:""}
78
+ ${o.labels?`<g data-layer-id="labels">${k}</g>`:""}
79
+ </g>
80
+ </g>
81
+ </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" />
104
+ </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)}">
106
+ <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>`}
108
+ <div class="wo-tooltip-heading">
109
+ <strong>${Le(e.title)}</strong>
110
+ <span>${Le(e.typeLabel)}</span>
111
+ </div>
112
+ </div>
113
+ ${e.description?`<p class="wo-tooltip-description">${Le(e.description)}</p>`:""}
114
+ ${r}
115
+ ${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=`
118
+ .wo-viewer-tooltip-root {
119
+ position: absolute;
120
+ z-index: 12;
121
+ min-width: 220px;
122
+ max-width: min(320px, calc(100% - 24px));
123
+ padding: 14px;
124
+ border-radius: 18px;
125
+ border: 1px solid rgba(255,255,255,0.1);
126
+ background: rgba(7, 16, 25, 0.92);
127
+ box-shadow: 0 18px 32px rgba(0,0,0,0.28);
128
+ color: #edf6ff;
129
+ backdrop-filter: blur(12px);
130
+ font: 500 13px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
131
+ }
132
+ .wo-viewer-tooltip-root[data-mode="hover"] { pointer-events: auto; }
133
+ .wo-viewer-tooltip-root[data-mode="pinned"] { pointer-events: auto; }
134
+ .wo-tooltip-card { display: grid; gap: 10px; }
135
+ .wo-tooltip-head { display: grid; grid-template-columns: 52px minmax(0, 1fr); gap: 12px; align-items: center; }
136
+ .wo-tooltip-heading { display: grid; gap: 3px; }
137
+ .wo-tooltip-heading strong { font: 700 16px/1.2 "Segoe UI Variable Display", "Segoe UI", sans-serif; }
138
+ .wo-tooltip-heading span, .wo-tooltip-relations { color: rgba(237, 246, 255, 0.7); }
139
+ .wo-tooltip-image {
140
+ width: 52px;
141
+ height: 52px;
142
+ object-fit: cover;
143
+ border-radius: 14px;
144
+ border: 1px solid rgba(255,255,255,0.12);
145
+ background: rgba(255,255,255,0.06);
146
+ }
147
+ .wo-tooltip-image-placeholder {
148
+ display: grid;
149
+ place-items: center;
150
+ font: 700 18px/1 "Segoe UI Variable Display", "Segoe UI", sans-serif;
151
+ color: #ffce8a;
152
+ }
153
+ .wo-tooltip-description { margin: 0; }
154
+ .wo-tooltip-tags { display: flex; flex-wrap: wrap; gap: 6px; }
155
+ .wo-tooltip-tag {
156
+ padding: 3px 8px;
157
+ border-radius: 999px;
158
+ background: rgba(255,255,255,0.08);
159
+ color: #ffdda9;
160
+ font: 600 11px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
161
+ text-transform: uppercase;
162
+ letter-spacing: 0.06em;
163
+ }
164
+ .wo-tooltip-fields { display: grid; gap: 6px; margin: 0; }
165
+ .wo-tooltip-field {
166
+ display: grid;
167
+ grid-template-columns: minmax(0, 1fr) auto;
168
+ gap: 12px;
169
+ align-items: baseline;
170
+ }
171
+ .wo-tooltip-field dt { color: rgba(237, 246, 255, 0.68); }
172
+ .wo-tooltip-field dd { margin: 0; font-weight: 600; text-align: right; }
173
+ .wo-tooltip-actions { display: flex; justify-content: flex-end; margin-top: 10px; }
174
+ .wo-tooltip-action {
175
+ border: 1px solid rgba(240, 180, 100, 0.24);
176
+ border-radius: 999px;
177
+ background: rgba(240, 180, 100, 0.12);
178
+ color: #edf6ff;
179
+ cursor: pointer;
180
+ padding: 6px 12px;
181
+ font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
182
+ }
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=`
184
+ <div class="wo-editor-toolbar-group">
185
+ <select data-editor-add-object-type>
186
+ ${Fn.map(m=>`<option value="${T(m)}"${m===d?" selected":""}>${T(Kr(m))}</option>`).join("")}
187
+ </select>
188
+ <button type="button" data-editor-action="add-object">Add object</button>
189
+ <button type="button" data-editor-action="add-viewpoint">Add viewpoint</button>
190
+ <button type="button" data-editor-action="add-annotation">Add annotation</button>
191
+ <button type="button" data-editor-action="add-metadata">Add metadata</button>
192
+ </div>
193
+ <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>
197
+ <button type="button" data-editor-action="format">Format source</button>
198
+ </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=`
200
+ <div class="wo-editor-outline-section">
201
+ <h3>Atlas</h3>
202
+ ${Mt({kind:"system"},"System",d,m)}
203
+ ${Mt({kind:"defaults"},"Defaults",d,m)}
204
+ </div>
205
+ <div class="wo-editor-outline-section">
206
+ <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>'}
208
+ </div>
209
+ <div class="wo-editor-outline-section">
210
+ <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>'}
212
+ </div>
213
+ <div class="wo-editor-outline-section">
214
+ <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>'}
216
+ </div>
217
+ <div class="wo-editor-outline-section">
218
+ <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>'}
220
+ </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>
242
+ </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">
244
+ <div class="wo-editor-toolbar" data-editor-toolbar></div>
245
+ <div class="wo-editor-status" data-editor-status role="status" aria-live="polite"></div>
246
+ <div class="wo-editor-main">
247
+ <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>
250
+ </aside>
251
+ <div class="wo-editor-stage-panel">
252
+ <div class="wo-editor-stage-shell" data-editor-stage-shell>
253
+ <div class="wo-editor-stage" data-editor-stage></div>
254
+ <div class="wo-editor-overlay" data-editor-overlay></div>
255
+ </div>
256
+ <div class="wo-editor-panel" data-editor-pane="preview">
257
+ ${ur("Preview","preview",`<div class="wo-editor-preview">
258
+ <div class="wo-editor-preview-card">
259
+ <h3>Static SVG</h3>
260
+ <div class="wo-editor-preview-visual" data-editor-preview-visual></div>
261
+ </div>
262
+ <div class="wo-editor-preview-card">
263
+ <h3>Embed Markup</h3>
264
+ <pre class="wo-editor-preview-markup" data-editor-preview-markup></pre>
265
+ </div>
266
+ </div>`,e)}
267
+ </div>
268
+ </div>
269
+ <aside class="wo-editor-panel wo-editor-inspector" data-editor-pane="inspector">
270
+ ${ur("Inspector","inspector","<div data-editor-inspector></div>")}
271
+ </aside>
272
+ </div>
273
+ <div class="wo-editor-panel wo-editor-text-panel" data-editor-pane="text">
274
+ ${ur("Source","source",`<textarea
275
+ class="wo-editor-source"
276
+ data-editor-source
277
+ spellcheck="false"
278
+ aria-describedby="worldorbit-editor-source-diagnostics"
279
+ ></textarea>
280
+ <div
281
+ class="wo-editor-source-diagnostics"
282
+ id="worldorbit-editor-source-diagnostics"
283
+ data-editor-source-diagnostics
284
+ aria-live="polite"
285
+ ></div>`)}
286
+ </div>
287
+ <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>
296
+ <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>`:""}
299
+ </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">
301
+ <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">
305
+ <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">
312
+ <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">
316
+ <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">
327
+ <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)}
335
+ </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">
341
+ <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">
349
+ <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">
363
+ <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))}
383
+ </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=`
386
+ .wo-editor {
387
+ --wo-editor-sidebar-width: 280px;
388
+ --wo-editor-inspector-width: 360px;
389
+ --wo-editor-source-height: 280px;
390
+ }
391
+ .wo-editor-shell { display: grid; gap: 16px; min-width: 0; }
392
+ .wo-editor-toolbar { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; min-width: 0; }
393
+ .wo-editor-toolbar-group { display: flex; gap: 10px; flex-wrap: wrap; min-width: 0; }
394
+ .wo-editor-toolbar button, .wo-editor-toolbar select {
395
+ border: 1px solid rgba(240, 180, 100, 0.2);
396
+ border-radius: 999px;
397
+ background: rgba(240, 180, 100, 0.08);
398
+ color: #edf6ff;
399
+ font: 600 13px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
400
+ padding: 10px 14px;
401
+ }
402
+ .wo-editor button:focus-visible,
403
+ .wo-editor select:focus-visible,
404
+ .wo-editor input:focus-visible,
405
+ .wo-editor textarea:focus-visible {
406
+ outline: 2px solid rgba(255, 214, 138, 0.95);
407
+ outline-offset: 2px;
408
+ }
409
+ .wo-editor-toolbar button:disabled { opacity: 0.45; cursor: not-allowed; }
410
+ .wo-editor-status {
411
+ display: flex;
412
+ flex-wrap: wrap;
413
+ gap: 10px;
414
+ min-width: 0;
415
+ }
416
+ .wo-editor-status-pill {
417
+ border: 1px solid rgba(255,255,255,0.08);
418
+ border-radius: 999px;
419
+ background: rgba(255,255,255,0.04);
420
+ color: #edf6ff;
421
+ font: 600 12px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
422
+ padding: 8px 12px;
423
+ }
424
+ .wo-editor-status-pill.is-clean { border-color: rgba(120, 255, 195, 0.22); color: #c7ffe5; }
425
+ .wo-editor-status-pill.is-dirty { border-color: rgba(240, 180, 100, 0.28); color: #ffd58a; }
426
+ .wo-editor-status-pill.is-warning { border-color: rgba(240, 180, 100, 0.28); color: #ffd58a; }
427
+ .wo-editor-status-pill.is-error { border-color: rgba(255, 120, 120, 0.3); color: #ffb2b2; }
428
+ .wo-editor-main {
429
+ display: grid;
430
+ grid-template-columns:
431
+ minmax(220px, var(--wo-editor-sidebar-width))
432
+ minmax(0, 1fr)
433
+ minmax(280px, var(--wo-editor-inspector-width));
434
+ gap: 16px;
435
+ min-width: 0;
436
+ align-items: start;
437
+ }
438
+ .wo-editor-sidebar, .wo-editor-stage-panel, .wo-editor-preview { display: grid; gap: 16px; min-width: 0; }
439
+ .wo-editor-panel {
440
+ border-radius: 24px;
441
+ border: 1px solid rgba(255,255,255,0.08);
442
+ background: rgba(7, 16, 25, 0.72);
443
+ padding: 18px;
444
+ min-width: 0;
445
+ }
446
+ .wo-editor-panel h2 {
447
+ margin: 0 0 14px;
448
+ color: #edf6ff;
449
+ font: 700 14px/1.2 "Segoe UI Variable Display", "Segoe UI", sans-serif;
450
+ text-transform: uppercase;
451
+ letter-spacing: 0.08em;
452
+ }
453
+ .wo-editor-panel h3 {
454
+ margin: 0 0 12px;
455
+ color: rgba(237, 246, 255, 0.82);
456
+ font: 700 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
457
+ text-transform: uppercase;
458
+ letter-spacing: 0.08em;
459
+ }
460
+ .wo-editor-panel-section,
461
+ .wo-editor-inspector-section {
462
+ min-width: 0;
463
+ }
464
+ .wo-editor-panel-section > summary,
465
+ .wo-editor-inspector-section > summary {
466
+ display: flex;
467
+ align-items: center;
468
+ justify-content: space-between;
469
+ gap: 10px;
470
+ cursor: pointer;
471
+ list-style: none;
472
+ color: #edf6ff;
473
+ font: 700 14px/1.2 "Segoe UI Variable Display", "Segoe UI", sans-serif;
474
+ text-transform: uppercase;
475
+ letter-spacing: 0.08em;
476
+ }
477
+ .wo-editor-inspector-section > summary {
478
+ font: 700 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
479
+ color: rgba(237, 246, 255, 0.9);
480
+ }
481
+ .wo-editor-panel-section > summary::-webkit-details-marker,
482
+ .wo-editor-inspector-section > summary::-webkit-details-marker,
483
+ .wo-editor-field-help > summary::-webkit-details-marker {
484
+ display: none;
485
+ }
486
+ .wo-editor-panel-section > summary::after,
487
+ .wo-editor-inspector-section > summary::after {
488
+ content: "\u25BE";
489
+ color: rgba(240, 180, 100, 0.86);
490
+ font-size: 12px;
491
+ transition: transform 0.18s ease;
492
+ }
493
+ .wo-editor-panel-section:not([open]) > summary::after,
494
+ .wo-editor-inspector-section:not([open]) > summary::after {
495
+ transform: rotate(-90deg);
496
+ }
497
+ .wo-editor-panel-section-body {
498
+ display: grid;
499
+ gap: 16px;
500
+ margin-top: 14px;
501
+ min-width: 0;
502
+ }
503
+ .wo-editor-inspector-section-body {
504
+ display: grid;
505
+ gap: 12px;
506
+ margin-top: 12px;
507
+ min-width: 0;
508
+ }
509
+ .wo-editor[data-wo-show-inspector="false"] [data-editor-pane="inspector"] { display: none; }
510
+ .wo-editor[data-wo-show-text-pane="false"] [data-editor-pane="text"] { display: none; }
511
+ .wo-editor[data-wo-show-preview="false"] [data-editor-pane="preview"] { display: none; }
512
+ .wo-editor-stage-shell {
513
+ position: relative;
514
+ min-width: 0;
515
+ border-radius: 26px;
516
+ overflow: hidden;
517
+ border: 1px solid rgba(255,255,255,0.08);
518
+ background: rgba(8, 17, 28, 0.9);
519
+ }
520
+ .wo-editor-stage { min-height: 620px; min-width: 0; }
521
+ .wo-editor-overlay { position: absolute; inset: 0; pointer-events: none; }
522
+ .wo-editor-overlay > * { pointer-events: auto; }
523
+ .wo-editor-handle {
524
+ position: absolute;
525
+ transform: translate(-50%, -50%);
526
+ border: 0;
527
+ border-radius: 999px;
528
+ background: rgba(255, 214, 138, 0.92);
529
+ color: #071019;
530
+ cursor: grab;
531
+ font: 700 11px/1 "Segoe UI Variable", "Segoe UI", sans-serif;
532
+ padding: 8px 10px;
533
+ box-shadow: 0 10px 24px rgba(0,0,0,0.24);
534
+ }
535
+ .wo-editor-hint {
536
+ position: absolute;
537
+ transform: translate(-50%, -50%);
538
+ padding: 4px 8px;
539
+ border-radius: 999px;
540
+ background: rgba(18, 39, 58, 0.84);
541
+ color: #edf6ff;
542
+ font: 600 11px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
543
+ white-space: nowrap;
544
+ box-shadow: 0 6px 18px rgba(0,0,0,0.22);
545
+ }
546
+ .wo-editor-hint.is-subtle { background: rgba(18, 39, 58, 0.64); color: rgba(237, 246, 255, 0.78); }
547
+ .wo-editor-hint-note { left: 16px; top: 16px; transform: none; }
548
+ .wo-editor-overlay-diagnostics {
549
+ position: absolute;
550
+ right: 16px;
551
+ top: 16px;
552
+ display: grid;
553
+ gap: 8px;
554
+ max-width: min(320px, calc(100% - 32px));
555
+ }
556
+ .wo-editor-overlay-diagnostic {
557
+ border-radius: 14px;
558
+ padding: 10px 12px;
559
+ background: rgba(10, 20, 32, 0.92);
560
+ box-shadow: 0 12px 30px rgba(0,0,0,0.28);
561
+ }
562
+ .wo-editor-overlay-diagnostic strong {
563
+ display: block;
564
+ margin-bottom: 4px;
565
+ font: 700 11px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
566
+ letter-spacing: 0.08em;
567
+ text-transform: uppercase;
568
+ }
569
+ .wo-editor-overlay-diagnostic p {
570
+ margin: 0;
571
+ color: #edf6ff;
572
+ font: 500 12px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
573
+ }
574
+ .wo-editor-overlay-diagnostic-error { border: 1px solid rgba(255, 120, 120, 0.28); }
575
+ .wo-editor-overlay-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.24); }
576
+ .wo-editor-outline { display: grid; gap: 14px; }
577
+ .wo-editor-outline-section { display: grid; gap: 8px; }
578
+ .wo-editor-outline-section h3 {
579
+ margin: 0;
580
+ color: rgba(237,246,255,0.68);
581
+ font: 600 11px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
582
+ text-transform: uppercase;
583
+ letter-spacing: 0.08em;
584
+ }
585
+ .wo-editor-outline-item {
586
+ border: 1px solid transparent;
587
+ border-radius: 16px;
588
+ background: rgba(255,255,255,0.04);
589
+ color: #edf6ff;
590
+ cursor: pointer;
591
+ font: 500 13px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
592
+ padding: 10px 12px;
593
+ text-align: left;
594
+ display: flex;
595
+ align-items: center;
596
+ justify-content: space-between;
597
+ gap: 10px;
598
+ }
599
+ .wo-editor-outline-item.is-active {
600
+ border-color: rgba(255, 214, 138, 0.34);
601
+ background: rgba(255, 214, 138, 0.12);
602
+ color: #ffdda9;
603
+ }
604
+ .wo-editor-outline-badge {
605
+ min-width: 22px;
606
+ border-radius: 999px;
607
+ background: rgba(240, 180, 100, 0.16);
608
+ color: #ffd58a;
609
+ font: 700 11px/1 "Segoe UI Variable", "Segoe UI", sans-serif;
610
+ padding: 5px 7px;
611
+ text-align: center;
612
+ }
613
+ .wo-editor-outline-badge.is-error {
614
+ background: rgba(255, 120, 120, 0.18);
615
+ color: #ffb2b2;
616
+ }
617
+ .wo-editor-diagnostics { display: grid; gap: 10px; }
618
+ .wo-editor-diagnostic {
619
+ display: grid;
620
+ gap: 4px;
621
+ border-radius: 16px;
622
+ padding: 12px;
623
+ background: rgba(255,255,255,0.04);
624
+ color: #edf6ff;
625
+ font: 500 12px/1.45 "Segoe UI Variable", "Segoe UI", sans-serif;
626
+ }
627
+ .wo-editor-diagnostic strong { font-size: 11px; letter-spacing: 0.08em; }
628
+ .wo-editor-diagnostic p { margin: 0; color: rgba(237,246,255,0.82); }
629
+ .wo-editor-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.22); }
630
+ .wo-editor-diagnostic-error { border: 1px solid rgba(255, 120, 120, 0.24); }
631
+ .wo-editor-inspector-summary {
632
+ display: grid;
633
+ gap: 10px;
634
+ margin-bottom: 14px;
635
+ }
636
+ .wo-editor-form { display: grid; gap: 12px; min-width: 0; }
637
+ .wo-editor-inspector-section {
638
+ border: 1px solid rgba(255,255,255,0.08);
639
+ border-radius: 18px;
640
+ padding: 14px;
641
+ background: rgba(255,255,255,0.02);
642
+ }
643
+ .wo-editor-field { display: grid; gap: 6px; }
644
+ .wo-editor-field-label,
645
+ .wo-editor-fieldset legend {
646
+ display: flex;
647
+ align-items: center;
648
+ justify-content: space-between;
649
+ gap: 10px;
650
+ }
651
+ .wo-editor-field-label,
652
+ .wo-editor-checkbox .wo-editor-field-label,
653
+ .wo-editor-fieldset legend {
654
+ color: rgba(237,246,255,0.72);
655
+ font: 600 11px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
656
+ text-transform: uppercase;
657
+ letter-spacing: 0.08em;
658
+ }
659
+ .wo-editor-field input, .wo-editor-field select, .wo-editor-field textarea, .wo-editor-source {
660
+ width: 100%;
661
+ min-width: 0;
662
+ border: 1px solid rgba(255,255,255,0.08);
663
+ border-radius: 14px;
664
+ background: rgba(12, 26, 39, 0.84);
665
+ color: #edf6ff;
666
+ font: 500 13px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
667
+ padding: 10px 12px;
668
+ box-sizing: border-box;
669
+ }
670
+ .wo-editor-field.has-error input,
671
+ .wo-editor-field.has-error select,
672
+ .wo-editor-field.has-error textarea,
673
+ .wo-editor-checkbox.has-error {
674
+ border-color: rgba(255, 120, 120, 0.44);
675
+ }
676
+ .wo-editor-field.has-warning input,
677
+ .wo-editor-field.has-warning select,
678
+ .wo-editor-field.has-warning textarea,
679
+ .wo-editor-checkbox.has-warning {
680
+ border-color: rgba(240, 180, 100, 0.42);
681
+ }
682
+ .wo-editor-field textarea, .wo-editor-source { min-height: 110px; resize: vertical; }
683
+ .wo-editor-source {
684
+ min-height: var(--wo-editor-source-height);
685
+ font-family: "Cascadia Code", "Consolas", monospace;
686
+ white-space: pre;
687
+ overflow: auto;
688
+ }
689
+ .wo-editor-field-note {
690
+ color: rgba(237,246,255,0.72);
691
+ font: 500 12px/1.45 "Segoe UI Variable", "Segoe UI", sans-serif;
692
+ }
693
+ .wo-editor-field-note.is-error { color: #ffb2b2; }
694
+ .wo-editor-field-note.is-warning { color: #ffd58a; }
695
+ .wo-editor-fieldset {
696
+ display: grid;
697
+ gap: 10px;
698
+ border: 1px solid rgba(255,255,255,0.08);
699
+ border-radius: 18px;
700
+ padding: 14px;
701
+ min-width: 0;
702
+ }
703
+ .wo-editor-checkbox {
704
+ display: flex;
705
+ gap: 10px;
706
+ align-items: flex-start;
707
+ color: #edf6ff;
708
+ font: 500 13px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
709
+ }
710
+ .wo-editor-checkbox input {
711
+ margin-top: 2px;
712
+ }
713
+ .wo-editor-field-help {
714
+ position: relative;
715
+ flex: 0 0 auto;
716
+ }
717
+ .wo-editor-field-help > summary {
718
+ display: inline-flex;
719
+ align-items: center;
720
+ justify-content: center;
721
+ width: 20px;
722
+ height: 20px;
723
+ border-radius: 999px;
724
+ border: 1px solid rgba(240, 180, 100, 0.28);
725
+ background: rgba(240, 180, 100, 0.12);
726
+ color: #ffdda9;
727
+ cursor: pointer;
728
+ font: 700 11px/1 "Segoe UI Variable", "Segoe UI", sans-serif;
729
+ list-style: none;
730
+ }
731
+ .wo-editor-field-help-card {
732
+ display: grid;
733
+ gap: 8px;
734
+ margin-top: 8px;
735
+ padding: 10px 12px;
736
+ border-radius: 14px;
737
+ border: 1px solid rgba(240, 180, 100, 0.2);
738
+ background: rgba(12, 26, 39, 0.92);
739
+ color: rgba(237, 246, 255, 0.86);
740
+ text-transform: none;
741
+ letter-spacing: normal;
742
+ font: 500 12px/1.45 "Segoe UI Variable", "Segoe UI", sans-serif;
743
+ }
744
+ .wo-editor-field-help-card p {
745
+ margin: 0;
746
+ }
747
+ .wo-editor-field-help-chips {
748
+ display: flex;
749
+ flex-wrap: wrap;
750
+ gap: 6px;
751
+ }
752
+ .wo-editor-field-help-chips span {
753
+ border-radius: 999px;
754
+ padding: 4px 8px;
755
+ background: rgba(255,255,255,0.06);
756
+ color: #edf6ff;
757
+ font: 600 11px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
758
+ text-transform: none;
759
+ letter-spacing: normal;
760
+ }
761
+ .wo-editor-preview { grid-template-columns: repeat(2, minmax(0, 1fr)); }
762
+ .wo-editor-preview-card {
763
+ border-radius: 18px;
764
+ border: 1px solid rgba(255,255,255,0.08);
765
+ background: rgba(255,255,255,0.03);
766
+ padding: 14px;
767
+ min-width: 0;
768
+ }
769
+ .wo-editor-preview-visual {
770
+ min-height: 240px;
771
+ overflow: auto;
772
+ }
773
+ .wo-editor-preview-markup {
774
+ margin: 0;
775
+ min-height: 240px;
776
+ white-space: pre-wrap;
777
+ overflow-wrap: anywhere;
778
+ color: #edf6ff;
779
+ font: 12px/1.5 "Cascadia Code", "Consolas", monospace;
780
+ }
781
+ .wo-editor-source-diagnostics {
782
+ display: grid;
783
+ gap: 10px;
784
+ margin-top: 14px;
785
+ }
786
+ .wo-editor-empty {
787
+ margin: 0;
788
+ color: rgba(237,246,255,0.68);
789
+ font: 500 12px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
790
+ }
791
+ .wo-editor-live-region {
792
+ position: absolute;
793
+ width: 1px;
794
+ height: 1px;
795
+ padding: 0;
796
+ margin: -1px;
797
+ overflow: hidden;
798
+ clip: rect(0, 0, 0, 0);
799
+ white-space: nowrap;
800
+ border: 0;
801
+ }
802
+ @media (max-width: 1280px) {
803
+ .wo-editor-main { grid-template-columns: minmax(220px, 260px) minmax(0, 1fr); }
804
+ .wo-editor-inspector { grid-column: 1 / -1; }
805
+ .wo-editor-preview { grid-template-columns: 1fr; }
806
+ }
807
+ @media (max-width: 960px) {
808
+ .wo-editor-main { grid-template-columns: 1fr; }
809
+ .wo-editor-stage { min-height: 440px; }
810
+ .wo-editor-status { flex-direction: column; }
811
+ }
812
+ `,document.head.append(e)}return Ci(Od);})();