worldorbit 2.5.16 → 2.5.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/browser/core/dist/index.js +750 -73
- package/dist/browser/editor/dist/index.js +1303 -135
- package/dist/browser/markdown/dist/index.js +631 -72
- package/dist/browser/viewer/dist/index.js +658 -77
- package/dist/unpkg/core/dist/index.js +750 -73
- package/dist/unpkg/editor/dist/index.js +1303 -135
- package/dist/unpkg/markdown/dist/index.js +631 -72
- package/dist/unpkg/viewer/dist/index.js +658 -77
- package/dist/unpkg/worldorbit-core.min.js +12 -12
- package/dist/unpkg/worldorbit-editor.min.js +284 -202
- package/dist/unpkg/worldorbit-markdown.min.js +66 -58
- package/dist/unpkg/worldorbit-viewer.min.js +76 -68
- package/dist/unpkg/worldorbit.js +797 -78
- package/dist/unpkg/worldorbit.min.js +80 -72
- package/package.json +1 -1
- package/packages/core/dist/atlas-edit.js +74 -0
- package/packages/core/dist/atlas-validate.js +122 -8
- package/packages/core/dist/draft-parse.js +212 -8
- package/packages/core/dist/draft.d.ts +5 -2
- package/packages/core/dist/draft.js +59 -3
- package/packages/core/dist/format.js +63 -1
- package/packages/core/dist/normalize.js +1 -0
- package/packages/core/dist/scene.js +248 -46
- package/packages/core/dist/types.d.ts +41 -2
- package/packages/editor/dist/editor.js +597 -61
- package/packages/editor/dist/types.d.ts +3 -1
- package/packages/viewer/dist/atlas-state.js +6 -0
- package/packages/viewer/dist/atlas-viewer.js +1 -0
- package/packages/viewer/dist/render.js +31 -2
- package/packages/viewer/dist/theme.js +1 -0
- package/packages/viewer/dist/tooltip.js +9 -0
- package/packages/viewer/dist/types.d.ts +8 -1
- package/packages/viewer/dist/viewer.js +12 -1
|
@@ -1,120 +1,128 @@
|
|
|
1
|
-
"use strict";var WorldOrbitEditor=(()=>{var on=Object.defineProperty;var Li=Object.getOwnPropertyDescriptor;var Ti=Object.getOwnPropertyNames;var Ai=Object.prototype.hasOwnProperty;var Ei=(e,t)=>{for(var r in t)on(e,r,{get:t[r],enumerable:!0})},Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ti(t))!Ai.call(e,o)&&o!==r&&on(e,o,{get:()=>t[o],enumerable:!(n=Li(t,o))||n.enumerable});return e};var Ci=e=>Pi(on({},"__esModule",{value:!0}),e);var Od={};Ei(Od,{createWorldOrbitEditor:()=>yi});var y=class e extends Error{line;column;constructor(t,r,n){let o=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var _t=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],be=_t.filter(e=>e!=="system"),Fi=["star","planet","moon","asteroid","comet","structure","phenomenon"],Bn=["structure","phenomenon"],ze=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Vi=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function B(e,t){return{key:e,...t}}var xr=new Set(_t),_n=new Map([B("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:ze}),B("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"distance"}),B("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"distance"}),B("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:ze}),B("period",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"duration"}),B("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"angle"}),B("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"angle"}),B("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:ze,unitFamily:"angle"}),B("at",{kind:"string",placement:!0,arity:"single",objectTypes:Bn}),B("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Bn}),B("free",{kind:"string",placement:!0,arity:"single",objectTypes:Vi}),B("kind",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("class",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("culture",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:_t}),B("color",{kind:"string",placement:!1,arity:"single",objectTypes:_t}),B("image",{kind:"string",placement:!1,arity:"single",objectTypes:Fi}),B("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:_t}),B("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"radius"}),B("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"mass"}),B("density",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"generic"}),B("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"generic"}),B("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"generic"}),B("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:be}),B("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),B("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),B("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),B("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("on",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("source",{kind:"string",placement:!1,arity:"single",objectTypes:be}),B("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:be,unitFamily:"duration"})].map(e=>[e.key,e])),Ri=new Set(_n.keys());function pe(e){return _n.get(e)}function Nn(e){return Ri.has(e)}function Un(e,t){return e.objectTypes.includes(t)}function $r(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Nt(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,l=!1,a=!1,s=null,p=()=>{i!==null&&(r.push({value:o,column:i,quoted:l}),o="",i=null,l=!1)};for(let c=0;c<e.length;c++){let u=e[c],v=n+c+1;if(a&&u==="\\"){let x=e[c+1];if(x==='"'||x==="\\"){o+=x,c++;continue}}if(u==='"'){a?a=!1:(i===null&&(i=v),l=!0,s=v,a=!0);continue}if(!a&&/\s/.test(u)){p();continue}i===null&&(i=v),o+=u}if(a)throw new y("Unclosed quote in line",t.line,s??n+e.length);return p(),r}function Ir(e){return e.match(/^\s*/)?.[0].length??0}function Ut(e){let t=e.split(/\r?\n/),r=[],n=null,o=!1,i=null;for(let l=0;l<t.length;l++){let a=t[l],s=l+1;if(!a.trim())continue;let p=Ir(a),c=Nt(a.slice(p),{line:s,columnOffset:p});if(c.length!==0){if(p===0){o=!1,i=null;let u=Bi(c,s);r.push(u),n=u;continue}if(!n)throw new y("Indented line without parent object",s,p+1);if(c.length===1&&c[0].value==="info"){o=!0,i=p;continue}o&&p<=(i??0)&&(o=!1),o?n.infoEntries.push(Ui(c,s)):n.blockFields.push(Ni(c,s))}}return{type:"document",objects:r}}function Bi(e,t){if(e.length<2)throw new y("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!xr.has(r.value))throw new y(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:_i(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function _i(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=pe(o.value);if(!i)throw new y(`Unknown field "${o.value}"`,t,o.column);n++;let l=[];if(i.arity==="multiple")for(;n<e.length&&!Nn(e[n].value);)l.push(e[n]),n++;else{let a=e[n];a&&(l.push(a),n++)}if(l.length===0)throw new y(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:l.map(a=>a.value),location:{line:t,column:o.column}})}return r}function Ni(e,t){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);if(!pe(e[0].value))throw new y(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Ui(e,t){if(e.length<2)throw new y("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}var zn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,zi=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Wi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function zt(e){let t=null,r=[];for(let n of e.objects){let o=Hi(n);if(n.objectType==="system"){if(t)throw y.fromLocation("Only one system object is allowed",n.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],objects:r}}function Hi(e){let t=[...e.inlineFields,...e.blockFields];Yi(e.objectType,t);let r=qi(t),n=Gi(e.objectType,r),o=Xi(r),i=Ji(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:n,info:i}}function Yi(e,t){for(let r of t){let n=pe(r.key);if(!n)throw y.fromLocation(`Unknown field "${r.key}"`,r.location);if(!Un(n,e))throw y.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw y.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function qi(e){let t=new Map;for(let r of e){if(t.has(r.key))throw y.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function Gi(e,t){let r=t.has("orbit"),n=t.has("at"),o=t.has("surface"),i=t.has("free"),l=[r,n,o,i].filter(Boolean).length;if(l>1){let a=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw y.fromLocation("Object has multiple placement modes",a?.location)}if(e==="system"&&l>0)throw y.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:kr(t,"orbit"),distance:ht(t,"distance"),semiMajor:ht(t,"semiMajor"),eccentricity:ta(t,"eccentricity"),period:ht(t,"period"),angle:ht(t,"angle"),inclination:ht(t,"inclination"),phase:ht(t,"phase")};if(n){let a=jr(t,"at"),s=kr(t,"at");return{mode:"at",target:s,reference:Qi(s,a.location)}}if(o)return{mode:"surface",target:kr(t,"surface")};if(i){let a=kr(t,"free"),s=ea(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function Xi(e){let t={};for(let[r,n]of e.entries()){let o=pe(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=ra(n);break;case"number":t[r]=Hn(bt(n),r,n.location);break;case"unit":t[r]=Wn(bt(n),n.location,r);break;case"string":t[r]=Ki(r,n);break}}return t}function Ki(e,t){let r=t.values.join(" ").trim();return e==="image"&&Zi(r,t.location),r}function Zi(e,t){if(!e)throw y.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw y.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Wi);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw y.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function Ji(e){let t={};for(let r of e){if(r.key in t)throw y.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function Qi(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Wn(e,t,r){let n=e.match(zn);if(!n)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=pe(r);if(i?.unitFamily&&!$r(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function ea(e){let t=e.match(zn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ht(e,t){if(!e.has(t))return;let r=jr(e,t);return Wn(bt(r),r.location,t)}function ta(e,t){if(!e.has(t))return;let r=jr(e,t);return Hn(bt(r),t,r.location)}function Hn(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function ra(e){let t=bt(e).toLowerCase(),r=zi.get(t);if(r===void 0)throw y.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function jr(e,t){let r=e.get(t);if(!r)throw new y(`Missing value for key "${t}"`);return r}function kr(e,t){return bt(jr(e,t))}function bt(e){if(e.values.length!==1)throw y.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var na=new Set(["star","planet","moon","asteroid","comet"]);function Wt(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new y(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new y(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let o=r.get(n.placement.target);if(!o||!na.has(o.type))throw new y(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&oa(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&ia(n,n.placement.reference,t))}}function oa(e,t,r){if(!r.has(t.primary))throw new y(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new y(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ia(e,t,r){if(!r.has(t.objectId))throw new y(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function ot(e,t,r=`${t}.failed`){return e instanceof y?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}var Ht=1495978707e-1,aa=6371,sa=71492,la=695700,ca=63241.077,da=206264.806,ua=206264806,Zn=.68,pa=.2,Jn=28;function ye(e,t={}){let r=ma(t),n=r.width,o=r.height,i=r.padding,l=fa(e),a=ha(e,t.projection),s=ba(l,t.scaleModel),p=wa(l),c=e.system?.id??null,u=new Map(e.objects.map(D=>[D.id,D])),v=Qa(e.objects,u),x=new Map,k=[],I=[],V=[],$=[],S=[],E=new Map,X=new Map;for(let D of e.objects){let O=D.placement;if(!O){V.push(D);continue}if(O.mode==="orbit"){Gn(X,O.target,D);continue}if(O.mode==="surface"){Gn(E,O.target,D);continue}if(O.mode==="at"){S.push(D);continue}$.push(D)}let W=$.length>0?n*.42:n/2,U=o/2,H={orbitChildren:X,surfaceChildren:E,objectMap:u,spacingFactor:p,projection:a,scaleModel:s},C=V.find(D=>D.type==="star")??V[0]??null;C&&an(C,W,U,0,x,k,I,H);let ie=V.filter(D=>D.id!==C?.id);if(ie.length>0){let D=Math.min(n,o)*.28*p*s.orbitDistanceMultiplier;ie.forEach((O,j)=>{let ae=Gt(j,ie.length,-Math.PI/2),q=Xt(ae,D,a,1);an(O,W+q.x,U+q.y,0,x,k,I,H)})}$.forEach((D,O)=>{let j=n-i-140-is(D.placement?.mode==="free"?D.placement.distance:void 0,s),ae=Math.max(76,(o-i*2-180)/Math.max(1,$.length)*p)*s.freePlacementMultiplier,q=i+92+O*ae;x.set(D.id,{object:D,x:j,y:q,radius:Dr(D,0,s),sortKey:Tr(j,q,0)}),I.push({object:D,groupId:v.groupIds.get(D.id)??null,x1:j-60,y1:q,x2:j-18,y2:q,mode:"free"}),Or(D,x,k,I,H,1)}),S.forEach((D,O)=>{if(x.has(D.id)||!D.placement||D.placement.mode!=="at")return;let j=Za(D.placement.reference,x,u,O,S.length,n,o,i,H);x.set(D.id,{object:D,x:j.x,y:j.y,radius:Dr(D,2,s),sortKey:Tr(j.x,j.y,2),anchorX:j.anchorX,anchorY:j.anchorY}),j.anchorX!==void 0&&j.anchorY!==void 0&&I.push({object:D,groupId:v.groupIds.get(D.id)??null,x1:j.anchorX,y1:j.anchorY,x2:j.x,y2:j.y,mode:"at"}),Or(D,x,k,I,H,2)});let J=[...x.values()].map(D=>va(D,s,v)),ee=k.map(D=>xa(D,v.groupIds.get(D.object.id)??null)),K=I.map(D=>$a(D)),Te=Ia(J,o,s.labelMultiplier),Je=Oa(e,J),Ve=ka(ee,Je,K,J,Te),pt=ja(J,ee,K,Te,v),F=Sa(e,J),te=Ma(e,a,r.preset,v,u),Qe=Ua(n,o,J,ee,K,Te);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:a,scaleModel:s,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Xn(a)} view - ${Xn(l)} layout`,systemId:c,viewMode:a,layoutPreset:l,metadata:{format:e.format,version:e.version,view:a,scale:String(e.system?.properties.scale??l),units:String(e.system?.properties.units??"mixed"),preset:r.preset??"custom"},contentBounds:Qe,layers:Ve,groups:pt,semanticGroups:F,viewpoints:te,objects:J,orbitVisuals:ee,relations:Je,leaders:K,labels:Te}}function ue(e,t,r){let n=Er(r),o=Math.cos(n),i=Math.sin(n),l=e.x-t.x,a=e.y-t.y;return{x:t.x+l*o-a*i,y:t.y+l*i+a*o}}function fa(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function ma(e){let t=ga(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function ga(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function ha(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function ba(e,t){return{...ya(e),...t}}function ya(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function wa(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function va(e,t,r){let{object:n,x:o,y:i,radius:l,sortKey:a,anchorX:s,anchorY:p}=e,c=n.renderHints?.renderPriority??0;return{renderId:Kt(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,semanticGroupIds:[...n.groups??[]],x:o,y:i,radius:l,visualRadius:os(n,l,t),sortKey:a+c*.001,anchorX:s,anchorY:p,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:ss(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function xa(e,t){return{renderId:`${Kt(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function $a(e){return{renderId:`${Kt(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Ia(e,t,r){let n=[],o=[],i=[...e].filter(l=>!l.hidden&&l.object.renderHints?.renderLabel!==!1).sort((l,a)=>l.sortKey-a.sortKey);for(let l of i){let a=l.y>t*.62?-1:1,s=ls(l,r),p=l.y+a*(l.radius+18*r),c=p+a*(16*r),u=Yn(l.x,p,c,s,a),v=0;for(;o.some(x=>rs(x,u))&&v<10;)p+=a*14*r,c+=a*14*r,u=Yn(l.x,p,c,s,a),v+=1;o.push(u),n.push({renderId:`${l.renderId}-label`,objectId:l.objectId,object:l.object,groupId:l.groupId,semanticGroupIds:[...l.semanticGroupIds],label:l.label,secondaryLabel:l.secondaryLabel,x:l.x,y:p,secondaryY:c,textAnchor:"middle",direction:a<0?"above":"below",hidden:l.hidden})}return n}function ka(e,t,r,n,o){let i=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),l=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:i},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"objects",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ja(e,t,r,n,o){let i=new Map,l=a=>{if(!a)return null;let s=i.get(a);if(s)return s;let p=o.groupRoots.get(a)??null,c={renderId:a,rootObjectId:p,label:p??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:qt(0,0,0,0)};return i.set(a,c),c};for(let a of e){let s=l(a.groupId);s&&!a.hidden&&s.objectIds.push(a.objectId)}for(let a of t){let s=l(a.groupId);s&&!a.hidden&&s.orbitIds.push(a.objectId)}for(let a of r){let s=l(a.groupId);s&&!a.hidden&&s.leaderIds.push(a.objectId)}for(let a of n){let s=l(a.groupId);s&&!a.hidden&&s.labelIds.push(a.objectId)}for(let a of i.values())a.contentBounds=es(a,e,t,r,n);return[...i.values()].sort((a,s)=>a.label.localeCompare(s.label))}function Sa(e,t){return[...e.groups].map(r=>({id:r.id,label:r.label,summary:r.summary,color:r.color,tags:[...r.tags],hidden:r.hidden,objectIds:t.filter(n=>!n.hidden&&n.semanticGroupIds.includes(r.id)).map(n=>n.objectId)})).sort((r,n)=>r.label.localeCompare(n.label))}function Oa(e,t){let r=new Map(t.map(n=>[n.objectId,n]));return e.relations.map(n=>{let o=r.get(n.from),i=r.get(n.to);return{renderId:`${Kt(n.id)}-relation`,relationId:n.id,relation:n,fromObjectId:n.from,toObjectId:n.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:n.hidden||!o||!i||o.hidden||i.hidden}}).sort((n,o)=>n.relation.id.localeCompare(o.relation.id))}function Ma(e,t,r,n,o){let i=Da(e,t,r),l=new Map;for(let[p,c]of Object.entries(e.system?.info??{})){if(!p.startsWith("viewpoint."))continue;let[u,v,...x]=p.split(".");if(u!=="viewpoint"||!v||x.length===0)continue;let k=Ba(v);if(!k)continue;let I=x.join(".").toLowerCase(),V=l.get(k)??{id:k};La(V,I,c,e,t,r,n,o),l.set(k,V)}let a=[...l.values()].map(p=>Ta(p,t,r,o)).filter(Boolean),s=a.findIndex(p=>p.id===i.id);return s>=0?a.splice(s,1,{...i,...a[s],layers:{...i.layers,...a[s].layers},filter:a[s].filter??i.filter,generated:!1}):a.unshift(i),a.sort((p,c)=>p.id==="overview"?-1:c.id==="overview"?1:p.label.localeCompare(c.label))}function Da(e,t,r){let n=e.system?.title??e.system?.properties.title;return{id:"overview",label:n?`${String(n)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function La(e,t,r,n,o,i,l,a){let s=r.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"projection":case"view":e.projection=Ea(s)??o;return;case"preset":e.preset=Pa(s)??i;return;case"rotation":case"angle":e.rotationDeg=Qn(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Ca(s);return;case"layers":e.layers=Fa(s);return;case"query":e.filter={...e.filter??Sr(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Sr(),objectTypes:Va(s)};return;case"tags":e.filter={...e.filter??Sr(),tags:Ar(s)};return;case"groups":e.filter={...e.filter??Sr(),groupIds:Ra(s,n,l,a)};return}}function Ta(e,t,r,n){let o=e.focus&&n.has(e.focus)?e.focus:null,i=e.select&&n.has(e.select)?e.select:o,l=Aa(e.filter),a=e.label?.trim()||_a(e.id);return{id:e.id,label:a,summary:e.summary?.trim()||Na(a,o,l),objectId:o,selectedObjectId:i,projection:e.projection??t,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:l,generated:!1}}function Sr(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Aa(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Ea(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Pa(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Qn(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ca(e){let t=Qn(e);return t!==null&&t>0?t:null}function Fa(e){let t={};for(let r of Ar(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),o=r.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=n)}return t}function Va(e){return Ar(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ra(e,t,r,n){return Ar(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:r.groupIds.has(o)?r.groupIds.get(o)??Yt(o):(n.has(o),Yt(o)))}function Ar(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ba(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function _a(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Na(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function Ua(e,t,r,n,o,i){let l=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,p=Number.NEGATIVE_INFINITY,c=(u,v)=>{l=Math.min(l,u),a=Math.min(a,v),s=Math.max(s,u),p=Math.max(p,v)};for(let u of n)u.hidden||eo(u,c);for(let u of o)u.hidden||(c(u.x1,u.y1),c(u.x2,u.y2));for(let u of r)u.hidden||to(u,c);for(let u of i)u.hidden||ro(u,c);return!Number.isFinite(l)||!Number.isFinite(a)?qt(0,0,e,t):qt(l,a,s,p)}function eo(e,t){let r=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,o=e.ry??e.radius??0,i=oo(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,Jn*2);for(let l of i)t(l.x-r,l.y-r),t(l.x+r,l.y+r)}function qt(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function to(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function ro(e,t){let n=cs(e.label,e.secondaryLabel,1);t(e.x-n,e.y-18),t(e.x+n,e.y+8),t(e.x-n,e.secondaryY-14),t(e.x+n,e.secondaryY+8)}function an(e,t,r,n,o,i,l,a){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:r,radius:Dr(e,n,a.scaleModel),sortKey:Tr(t,r,n)}),Or(e,o,i,l,a,n+1))}function Or(e,t,r,n,o,i){let l=t.get(e.id);if(!l)return;let a=[...o.orbitChildren.get(e.id)??[]].sort(za),s=Wa(a,l.radius,o.spacingFactor,o.scaleModel),p=qa(a,s);a.forEach((u,v)=>{let x=Ha(u,v,a.length,l,s,p[v]??s.innerPx,o);r.push({object:u,parentId:e.id,kind:x.kind,cx:x.cx,cy:x.cy,radius:x.radius,rx:x.rx,ry:x.ry,rotationDeg:x.rotationDeg,band:x.band,bandThickness:x.bandThickness,frontArcPath:x.frontArcPath,backArcPath:x.backArcPath}),an(u,x.objectX,x.objectY,i,t,r,n,o)});let c=[...o.surfaceChildren.get(e.id)??[]];c.forEach((u,v)=>{let x=Gt(v,c.length,-Math.PI/3),k=28*o.spacingFactor,I=Xt(x,l.radius,o.projection,o.projection==="isometric"?.9:1),V=Xt(x,l.radius+k,o.projection,o.projection==="isometric"?.9:1),$=l.x+I.x,S=l.y+I.y,E=l.x+V.x,X=l.y+V.y;t.set(u.id,{object:u,x:E,y:X,radius:Dr(u,i+1,o.scaleModel),sortKey:Tr(E,X,i+1),anchorX:$,anchorY:S}),n.push({object:u,groupId:o.objectMap.has(u.id)?Yt(ts(u,o.objectMap)):null,x1:$,y1:S,x2:E,y2:X,mode:"surface"}),Or(u,t,r,n,o,i+1)})}function za(e,t){let r=Mr(e),n=Mr(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function Wa(e,t,r,n){let o=e.map(u=>Mr(u)),i=o.filter(u=>u!==null),l=t+56*r*n.orbitDistanceMultiplier,a=(e.length>2?54:64)*r*n.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:l,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42};let s=Math.min(...i),p=Math.max(...i),c=p-s;return{metrics:o,minMetric:s,maxMetric:p,metricSpread:c,innerPx:l,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a),minimumGapPx:a*.42}}function Ha(e,t,r,n,o,i,l){let a=e.placement,s=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let C=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:C,rotationDeg:0,band:s,bandThickness:s?12*l.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-C}}let p=re(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),c=i,u=Math.max(c*Math.sqrt(1-p*p),c*.18),v=ln(a.inclination)??0,x=l.projection==="isometric"?Math.max(pa,Math.cos(Er(v)))*Zn:1,k=Math.max(u*x,c*.14),I=ln(a.angle)??0,V=c*p,$=ao(-V,0,I),S=n.x+$.x,E=n.y+$.y,X=Xa(a.phase,t,r),W=io(S,E,c,k,I,X),U=l.projection==="topdown"&&p<=1e-4&&Math.abs(I)<=1e-4,H=s?Ka(e,c,o,l.scaleModel):void 0;return{kind:U?"circle":"ellipse",cx:U?n.x:S,cy:U?n.y:E,radius:U?c:void 0,rx:U?void 0:c,ry:U?void 0:k,rotationDeg:I,band:s,bandThickness:H,frontArcPath:l.projection==="isometric"||s?qn(S,E,c,k,I,0,Math.PI):void 0,backArcPath:l.projection==="isometric"||s?qn(S,E,c,k,I,Math.PI,Math.PI*2):void 0,objectX:W.x,objectY:W.y}}function Ya(e,t){return t.innerPx+t.stepPx*Ga(Math.max(e,0)+1)}function qa(e,t){let r=[];return e.forEach((n,o)=>{let i=Mr(n),l=t.innerPx+o*t.stepPx,a=i===null?l:Ya(i,t),s=o===0?t.innerPx:(r[o-1]??t.innerPx)+t.minimumGapPx;r.push(Math.max(a,s))}),r}function Mr(e){return!e.placement||e.placement.mode!=="orbit"?null:Lr(e.placement.semiMajor??e.placement.distance??null)}function Ga(e){return Math.log(e)/Math.log(2)}function Xa(e,t,r){let n=e?ln(e):null;return n!==null?Er(n-90):Gt(t,r,-Math.PI/2)}function Ka(e,t,r,n){let o=Lr(sn(e.properties.inner)),i=Lr(sn(e.properties.outer));if(o!==null&&i!==null){let a=Math.abs(i-o);if(r.metricSpread>0)return re(a/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(o,i),1e-4);return re(a/s*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function Za(e,t,r,n,o,i,l,a,s){if(e.kind==="lagrange")return Ja(e,t,r,i,l);if(e.kind==="anchor"){let p=t.get(e.objectId);if(p){let c=Gt(n,o,Math.PI/5),u=(p.radius+36)*s.scaleModel.labelMultiplier,v=Xt(c,u,s.projection,s.projection==="isometric"?.92:1);return{x:p.x+v.x,y:p.y+v.y,anchorX:p.x,anchorY:p.y}}}if(e.kind==="named"){let p=t.get(e.name);if(p){let c=Gt(n,o,Math.PI/6),u=(p.radius+36)*s.scaleModel.labelMultiplier,v=Xt(c,u,s.projection,s.projection==="isometric"?.92:1);return{x:p.x+v.x,y:p.y+v.y,anchorX:p.x,anchorY:p.y}}}return{x:i-a-170,y:l-a-86-n*58*s.scaleModel.freePlacementMultiplier}}function Ja(e,t,r,n,o){let i=e.secondary?t.get(e.primary):ns(e.primary,t,r),l=t.get(e.secondary??e.primary);if(!i||!l)return{x:n*.7,y:o*.25};let a=l.x-i.x,s=l.y-i.y,p=Math.hypot(a,s)||1,c=a/p,u=s/p,v=-u,x=c,k=re(p*.25,24,68);switch(e.point){case"L1":return{x:l.x-c*k,y:l.y-u*k,anchorX:l.x,anchorY:l.y};case"L2":return{x:l.x+c*k,y:l.y+u*k,anchorX:l.x,anchorY:l.y};case"L3":return{x:i.x-c*k,y:i.y-u*k,anchorX:i.x,anchorY:i.y};case"L4":return{x:l.x+(c*.5-v*.8660254)*k,y:l.y+(u*.5-x*.8660254)*k,anchorX:l.x,anchorY:l.y};case"L5":return{x:l.x+(c*.5+v*.8660254)*k,y:l.y+(u*.5+x*.8660254)*k,anchorX:l.x,anchorY:l.y}}}function Qa(e,t){let r=new Map,n=new Map;for(let p of e){let c=no(p,t);if(r.set(p.id,c),c){let u=n.get(c);u?u.push(p.id):n.set(c,[p.id])}n.has(p.id)||n.set(p.id,[])}let o=new Map,i=new Map,l=new Map,a=p=>{let c=o.get(p);if(c)return c;let u=new Set,v=[],x=r.get(p)??null;for(;x&&!u.has(x);)v.push(x),u.add(x),x=r.get(x)??null;return o.set(p,v),v},s=p=>{let c=l.get(i.get(p)??"");if(c)return c;let u=r.get(p)??null,v=t.get(p),x=p;return v?.placement&&v.placement.mode!=="free"&&u&&(x=s(u)),x};for(let p of e){a(p.id);let c=s(p.id),u=Yt(c);i.set(p.id,u),l.set(u,c)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:l}}function no(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function es(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,s=Number.NEGATIVE_INFINITY,p=(c,u)=>{i=Math.min(i,c),l=Math.min(l,u),a=Math.max(a,c),s=Math.max(s,u)};for(let c of t)!c.hidden&&e.objectIds.includes(c.objectId)&&to(c,p);for(let c of r)!c.hidden&&e.orbitIds.includes(c.objectId)&&eo(c,p);for(let c of n)!c.hidden&&e.leaderIds.includes(c.objectId)&&(p(c.x1,c.y1),p(c.x2,c.y2));for(let c of o)!c.hidden&&e.labelIds.includes(c.objectId)&&ro(c,p);return!Number.isFinite(i)||!Number.isFinite(l)?qt(0,0,0,0):qt(i,l,a,s)}function ts(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let o=no(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function Yn(e,t,r,n,o){return{left:e-n,right:e+n,top:Math.min(t,r)-(o<0?18:12),bottom:Math.max(t,r)+(o<0?8:12)}}function rs(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ns(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function Dr(e,t,r){let n=as(e.properties.radius,r);if(n!==null)return n;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return re((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return re(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return re(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return re(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return re(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return re(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return re(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return re(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return re(8*o,r.minBodyRadius,r.maxBodyRadius)}}function os(e,t,r){let n=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+n,r.maxBodyRadius+10)}}function Lr(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Ht;case"m":return e.value/1e3/Ht;case"ly":return e.value*ca;case"pc":return e.value*da;case"kpc":return e.value*ua;case"re":return e.value*aa/Ht;case"rj":return e.value*sa/Ht;case"sol":return e.value*la/Ht;default:return e.value}}function is(e,t){let r=Lr(e??null);return r===null||r<=0?0:re(r*96*t.freePlacementMultiplier,0,420)}function as(e,t){let r=sn(e);if(!r)return null;let n;switch(r.unit){case"sol":n=re(r.value*22,14,40);break;case"re":n=re(r.value*10,6,18);break;case"km":n=re(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:n=re(r.value*4,4,20);break}return re(n*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function sn(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ln(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Gt(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function qn(e,t,r,n,o,i,l){let a=oo(e,t,r,n,o,i,l,Jn);return a.length===0?"":a.map((s,p)=>`${p===0?"M":"L"} ${Kn(s.x)} ${Kn(s.y)}`).join(" ")}function oo(e,t,r,n,o,i,l,a){let s=[];for(let p=0;p<=a;p+=1){let c=i+(l-i)*p/a;s.push(io(e,t,r,n,o,c))}return s}function io(e,t,r,n,o,i){let l=r*Math.cos(i),a=n*Math.sin(i),s=ao(l,a,o);return{x:e+s.x,y:t+s.y}}function ao(e,t,r){let n=Er(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function Xt(e,t,r,n){let o=r==="isometric"?Zn*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Tr(e,t,r){return t*1e3+e+r*.01}function re(e,t,r){return Math.min(Math.max(e,t),r)}function Gn(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function Kt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Yt(e){return`${Kt(e)}-group`}function ss(e){return typeof e=="string"&&e.trim()?e:void 0}function ls(e,t){let r=e.label.length*4.6*t+18,n=e.secondaryLabel.length*3.9*t+18;return Math.max(r,n,e.visualRadius+18)}function cs(e,t,r){let n=e.length*4.6*r+18,o=t.length*3.9*r+18;return Math.max(n,o,24)}function Xn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Er(e){return e*Math.PI/180}function Kn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function it(e,t={}){let r=ye(e,t),n=[],o=ps(e,n),i=fs(e,n),l=us(e,r.renderPreset??t.preset??null,r.projection),a=e.system?ds(e,l,o,i,n,r.renderPreset??t.preset??null):null;return r.viewpoints.some(s=>!s.generated)&&n.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${r.viewpoints.filter(s=>!s.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:a,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(lo),diagnostics:n}}function cn(e,t={}){return xs(it(e,t))}function Zt(e){let t=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:ys(e.system),info:ws(e.system)}:null;return{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:t,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(lo)}}function ds(e,t,r,n,o,i){let l=ye(e,{preset:i??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:r,viewpoints:l.viewpoints.map(ms),annotations:n}}function us(e,t,r){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":r,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function ps(e,t){let r={};for(let[o,i]of Object.entries(e.system?.info??{}))o.startsWith("viewpoint.")||o.startsWith("annotation.")||(r[o]=i);let n=Object.keys(r);return n.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${n.length} system info entr${n.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),r}function fs(e,t){let r=new Map;for(let[n,o]of Object.entries(e.system?.info??{})){if(!n.startsWith("annotation."))continue;let[,i,...l]=n.split(".");if(!i||l.length===0)continue;let a=so(i);if(!a)continue;let s=r.get(a)??{id:a};switch(l.join(".").toLowerCase()){case"label":s.label=o;break;case"target":case"object":s.targetObjectId=o.trim()||null;break;case"body":case"text":case"description":s.body=o;break;case"tags":s.tags=hs(o);break}r.set(a,s)}for(let n of e.objects){let o=n.info.description;if(!o)continue;let i=so(`${n.id}-notes`);r.has(i)||(r.set(i,{id:i,label:`${n.id} Notes`,targetObjectId:n.id,body:o,tags:Array.isArray(n.properties.tags)?n.properties.tags.filter(l=>typeof l=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${n.id}.info.description into structured atlas annotation "${i}".`,objectId:n.id,field:"description"}))}return[...r.values()].filter(n=>n.body||n.label).map(n=>({id:n.id,label:n.label??bs(n.id),targetObjectId:n.targetObjectId??null,body:n.body??"",tags:n.tags??[],sourceObjectId:n.targetObjectId??null})).sort((n,o)=>n.label.localeCompare(o.label))}function ms(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function lo(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,r])=>[t,{...r??{}}])):void 0,properties:gs(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function gs(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function hs(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function so(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function bs(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ys(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function ws(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg));let o=vs(r.layers);o&&(t[`${n}.layers`]=o),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??"")}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function vs(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function xs(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var co=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function xe(e,t={}){let r=t.schema??"auto";if(r==="2.0"||r==="2.1"||r==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(r==="2.0-draft"){let s=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:cn(e);return po(s)}let a=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:it(e);return r==="2.1"&&a.version!=="2.1"?dn({...a,version:"2.1",schemaVersion:"2.1"}):dn(a)}let o=[],i=e;i.system&&o.push(...$s(i.system));let l=[...i.objects].sort(pn);for(let a of l)o.length>0&&o.push(""),o.push(...ks(a));return o.join(`
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
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
|
-
`&&
|
|
6
|
-
`?(
|
|
7
|
-
`&&t[
|
|
8
|
-
`?(
|
|
9
|
-
`}function
|
|
10
|
-
`&&i!=="\r"&&(t[o]=" ");continue}if(!
|
|
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">${
|
|
13
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${
|
|
1
|
+
"use strict";var WorldOrbitEditor=(()=>{var dr=Object.defineProperty;var Ji=Object.getOwnPropertyDescriptor;var Qi=Object.getOwnPropertyNames;var ea=Object.prototype.hasOwnProperty;var ta=(e,t)=>{for(var n in t)dr(e,n,{get:t[n],enumerable:!0})},na=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Qi(t))!ea.call(e,o)&&o!==n&&dr(e,o,{get:()=>t[o],enumerable:!(r=Ji(t,o))||r.enumerable});return e};var ra=e=>na(dr({},"__esModule",{value:!0}),e);var vu={};ta(vu,{createWorldOrbitEditor:()=>Vi});var y=class e extends Error{line;column;constructor(t,n,r){let o=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var qt=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ke=qt.filter(e=>e!=="system"),oa=["star","planet","moon","asteroid","comet","structure","phenomenon"],Gr=["structure","phenomenon"],et=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ia=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function B(e,t){return{key:e,...t}}var An=new Set(qt),Xr=new Map([B("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:et}),B("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"distance"}),B("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"distance"}),B("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:et}),B("period",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"duration"}),B("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"angle"}),B("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"angle"}),B("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:et,unitFamily:"angle"}),B("at",{kind:"string",placement:!0,arity:"single",objectTypes:Gr}),B("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Gr}),B("free",{kind:"string",placement:!0,arity:"single",objectTypes:ia}),B("kind",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("class",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("culture",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:qt}),B("color",{kind:"string",placement:!1,arity:"single",objectTypes:qt}),B("image",{kind:"string",placement:!1,arity:"single",objectTypes:oa}),B("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:qt}),B("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"radius"}),B("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"mass"}),B("density",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"generic"}),B("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"generic"}),B("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"generic"}),B("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:ke}),B("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),B("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),B("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),B("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),B("on",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("source",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),B("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:ke,unitFamily:"duration"})].map(e=>[e.key,e])),aa=new Set(Xr.keys());function $e(e){return Xr.get(e)}function Kr(e){return aa.has(e)}function Zr(e,t){return e.objectTypes.includes(t)}function Tn(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Gt(e,t={}){let n=[],r=t.columnOffset??0,o="",i=null,s=!1,c=!1,a=null,l=()=>{i!==null&&(n.push({value:o,column:i,quoted:s}),o="",i=null,s=!1)};for(let p=0;p<e.length;p++){let f=e[p],w=r+p+1;if(c&&f==="\\"){let x=e[p+1];if(x==='"'||x==="\\"){o+=x,p++;continue}}if(f==='"'){c?c=!1:(i===null&&(i=w),s=!0,a=w,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}i===null&&(i=w),o+=f}if(c)throw new y("Unclosed quote in line",t.line,a??r+e.length);return l(),n}function Pn(e){return e.match(/^\s*/)?.[0].length??0}function Xt(e){let t=e.split(/\r?\n/),n=[],r=null,o=!1,i=null;for(let s=0;s<t.length;s++){let c=t[s],a=s+1;if(!c.trim())continue;let l=Pn(c),p=Gt(c.slice(l),{line:a,columnOffset:l});if(p.length!==0){if(l===0){o=!1,i=null;let f=sa(p,a);n.push(f),r=f;continue}if(!r)throw new y("Indented line without parent object",a,l+1);if(p.length===1&&p[0].value==="info"){o=!0,i=l;continue}o&&l<=(i??0)&&(o=!1),o?r.infoEntries.push(da(p,a)):r.blockFields.push(la(p,a))}}return{type:"document",objects:n}}function sa(e,t){if(e.length<2)throw new y("Invalid object declaration",t,e[0]?.column??1);let[n,r,...o]=e;if(!An.has(n.value))throw new y(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:ca(o,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function ca(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r],i=$e(o.value);if(!i)throw new y(`Unknown field "${o.value}"`,t,o.column);r++;let s=[];if(i.arity==="multiple")for(;r<e.length&&!Kr(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new y(`Missing value for field "${o.value}"`,t,o.column);n.push({type:"field",key:o.value,values:s.map(c=>c.value),location:{line:t,column:o.column}})}return n}function la(e,t){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);if(!$e(e[0].value))throw new y(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function da(e,t){if(e.length<2)throw new y("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Jr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,ua=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),pa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Kt(e){let t=null,n=[];for(let r of e.objects){let o=fa(r);if(r.objectType==="system"){if(t)throw y.fromLocation("Only one system object is allowed",r.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function fa(e){let t=[...e.inlineFields,...e.blockFields];ma(e.objectType,t);let n=ga(t),r=ha(e.objectType,n),o=ba(n),i=va(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:r,info:i}}function ma(e,t){for(let n of t){let r=$e(n.key);if(!r)throw y.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Zr(r,e))throw y.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw y.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function ga(e){let t=new Map;for(let n of e){if(t.has(n.key))throw y.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function ha(e,t){let n=t.has("orbit"),r=t.has("at"),o=t.has("surface"),i=t.has("free"),s=[n,r,o,i].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw y.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw y.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Cn(t,"orbit"),distance:jt(t,"distance"),semiMajor:jt(t,"semiMajor"),eccentricity:Ia(t,"eccentricity"),period:jt(t,"period"),angle:jt(t,"angle"),inclination:jt(t,"inclination"),phase:jt(t,"phase")};if(r){let c=Fn(t,"at"),a=Cn(t,"at");return{mode:"at",target:a,reference:$a(a,c.location)}}if(o)return{mode:"surface",target:Cn(t,"surface")};if(i){let c=Cn(t,"free"),a=xa(c);return{mode:"free",distance:a??void 0,descriptor:a?void 0:c}}return null}function ba(e){let t={};for(let[n,r]of e.entries()){let o=$e(n);if(!(!o||o.placement))switch(o.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=ja(r);break;case"number":t[n]=eo(kt(r),n,r.location);break;case"unit":t[n]=Qr(kt(r),r.location,n);break;case"string":t[n]=ya(n,r);break}}return t}function ya(e,t){let n=t.values.join(" ").trim();return e==="image"&&wa(n,t.location),n}function wa(e,t){if(!e)throw y.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw y.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(pa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw y.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function va(e){let t={};for(let n of e){if(n.key in t)throw y.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function $a(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Qr(e,t,n){let r=e.match(Jr);if(!r)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=$e(n);if(i?.unitFamily&&!Tn(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function xa(e){let t=e.match(Jr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function jt(e,t){if(!e.has(t))return;let n=Fn(e,t);return Qr(kt(n),n.location,t)}function Ia(e,t){if(!e.has(t))return;let n=Fn(e,t);return eo(kt(n),t,n.location)}function eo(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ja(e){let t=kt(e).toLowerCase(),n=ua.get(t);if(n===void 0)throw y.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Fn(e,t){let n=e.get(t);if(!n)throw new y(`Missing value for key "${t}"`);return n}function Cn(e,t){return kt(Fn(e,t))}function kt(e){if(e.values.length!==1)throw y.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var ka=new Set(["star","planet","moon","asteroid","comet"]);function Zt(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new y(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new y(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let o=n.get(r.placement.target);if(!o||!ka.has(o.type))throw new y(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Sa(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Oa(r,r.placement.reference,t))}}function Sa(e,t,n){if(!n.has(t.primary))throw new y(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new y(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Oa(e,t,n){if(!n.has(t.objectId))throw new y(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function bt(e,t,n=`${t}.failed`){return e instanceof y?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var Jt=1495978707e-1,Ea=6371,Ma=71492,Da=695700,La=63241.077,Aa=206264.806,Ta=206264806,ao=.68,Pa=.2,so=28;function Se(e,t={}){let n=Va(t),r=n.width,o=n.height,i=n.padding,s=Fa(e),c=Ba(e,t.projection),a=_a(s,t.scaleModel),l=Ua(s),p=e.system?.id??null,f=t.activeEventId??null,w=Ca(e.objects,e.events??[],f),x=new Map(w.map(O=>[O.id,O])),S=Os(w,x),k=new Map,C=[],q=[],v=[],A=[],re=[],Q=new Map,ee=new Map;for(let O of w){let H=O.placement;if(!H){v.push(O);continue}if(H.mode==="orbit"){ro(ee,H.target,O);continue}if(H.mode==="surface"){ro(Q,H.target,O);continue}if(H.mode==="at"){re.push(O);continue}A.push(O)}let te=A.length>0?r*.42:r/2,W=o/2,ce={orbitChildren:ee,surfaceChildren:Q,objectMap:x,spacingFactor:l,projection:c,scaleModel:a},X=v.find(O=>O.type==="star")??v[0]??null;X&&ur(X,te,W,0,k,C,q,ce);let ne=v.filter(O=>O.id!==X?.id);if(ne.length>0){let O=Math.min(r,o)*.28*l*a.orbitDistanceMultiplier;ne.forEach((H,N)=>{let qe=nn(N,ne.length,-Math.PI/2),le=rn(qe,O,c,1);ur(H,te+le.x,W+le.y,0,k,C,q,ce)})}A.forEach((O,H)=>{let N=r-i-140-Ts(O.placement?.mode==="free"?O.placement.distance:void 0,a),qe=Math.max(76,(o-i*2-180)/Math.max(1,A.length)*l)*a.freePlacementMultiplier,le=i+92+H*qe;k.set(O.id,{object:O,x:N,y:le,radius:_n(O,0,a),sortKey:Un(N,le,0)}),q.push({object:O,groupId:S.groupIds.get(O.id)??null,x1:N-60,y1:le,x2:N-18,y2:le,mode:"free"}),Rn(O,k,C,q,ce,1)}),re.forEach((O,H)=>{if(k.has(O.id)||!O.placement||O.placement.mode!=="at")return;let N=ks(O.placement.reference,k,x,H,re.length,r,o,i,ce);k.set(O.id,{object:O,x:N.x,y:N.y,radius:_n(O,2,a),sortKey:Un(N.x,N.y,2),anchorX:N.anchorX,anchorY:N.anchorY}),N.anchorX!==void 0&&N.anchorY!==void 0&&q.push({object:O,groupId:S.groupIds.get(O.id)??null,x1:N.anchorX,y1:N.anchorY,x2:N.x,y2:N.y,mode:"at"}),Rn(O,k,C,q,ce,2)});let Y=[...k.values()].map(O=>za(O,a,S)),he=C.map(O=>Wa(O,S.groupIds.get(O.object.id)??null)),ye=q.map(O=>Ya(O)),Ee=Ha(Y,r,o,a.labelMultiplier),ut=es(e,Y),D=ts(e.events??[],Y,f),ae=Za(he,ut,D,ye,Y,Ee),pt=Ja(Y,he,ye,Ee,S,a.labelMultiplier),ft=Qa(e,Y),T=ns(e,c,n.preset,S,x),V=hs(r,o,Y,he,ye,Ee,a.labelMultiplier);return{width:r,height:o,padding:i,renderPreset:n.preset,projection:c,scaleModel:a,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${oo(c)} view - ${oo(s)} layout`,systemId:p,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:V,layers:ae,groups:pt,semanticGroups:ft,viewpoints:T,events:D,activeEventId:f,objects:Y,orbitVisuals:he,relations:ut,leaders:ye,labels:Ee}}function we(e,t,n){let r=zn(n),o=Math.cos(r),i=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*o-c*i,y:t.y+s*i+c*o}}function Ca(e,t,n){let r=e.map(s=>structuredClone(s));if(!n)return r;let o=t.find(s=>s.id===n);if(!o)return r;let i=new Map(r.map(s=>[s.id,s]));for(let s of o.positions){let c=i.get(s.objectId);c&&(c.placement=s.placement?structuredClone(s.placement):null,s.inner?c.properties.inner={...s.inner}:delete c.properties.inner,s.outer?c.properties.outer={...s.outer}:delete c.properties.outer)}return r}function Fa(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Va(e){let t=Ra(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Ra(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Ba(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function _a(e,t){return{...Na(e),...t}}function Na(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Ua(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function za(e,t,n){let{object:r,x:o,y:i,radius:s,sortKey:c,anchorX:a,anchorY:l}=e,p=r.renderHints?.renderPriority??0;return{renderId:St(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:o,y:i,radius:s,visualRadius:As(r,s,t),sortKey:c+p*.001,anchorX:a,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Cs(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Wa(e,t){return{renderId:`${St(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function Ya(e){return{renderId:`${St(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Ha(e,t,n,r){let o=[],i=[],s=new Map(e.map(a=>[a.objectId,a])),c=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort(qa);for(let a of c){let l=Ga(a,s,i,t,n,r)??lo(a,co(a,s.get(a.parentId??"")??null,n),0,r);i.push(ho(a,l,r)),o.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,semanticGroupIds:[...a.semanticGroupIds],label:a.label,secondaryLabel:a.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:a.hidden})}return o}function qa(e,t){let n=to(e)-to(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function to(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function Ga(e,t,n,r,o,i){for(let s of Xa(e,t,r,o)){let c=s==="left"||s==="right"?4:6;for(let a=0;a<=c;a+=1){let l=lo(e,s,a,i),p=ho(e,l,i);if(!n.some(f=>Ds(f,p)))return l}}return null}function Xa(e,t,n,r){let o=e.parentId?t.get(e.parentId)??null:null,i=co(e,o,r),s=i==="below"?"above":"below",c=Ka(e,o,n),a=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,i,a,s]:[i,c,s,a]}function co(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function Ka(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function lo(e,t,n,r){let o=14*r;switch(t){case"above":{let i=e.y-(e.radius+18*r+n*o);return{x:e.x,labelY:i,secondaryY:i-16*r,textAnchor:"middle",direction:t}}case"below":{let i=e.y+e.radius+18*r+n*o;return{x:e.x,labelY:i,secondaryY:i+16*r,textAnchor:"middle",direction:t}}case"left":{let i=e.x-(e.visualRadius+16*r+n*o),s=e.y-4*r;return{x:i,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let i=e.x+e.visualRadius+16*r+n*o,s=e.y-4*r;return{x:i,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function Za(e,t,n,r,o,i){let s=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),c=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"events",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"objects",renderIds:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:i.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Ja(e,t,n,r,o,i){let s=new Map,c=a=>{if(!a)return null;let l=s.get(a);if(l)return l;let p=o.groupRoots.get(a)??null,f={renderId:a,rootObjectId:p,label:p??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:tn(0,0,0,0)};return s.set(a,f),f};for(let a of e){let l=c(a.groupId);l&&!a.hidden&&l.objectIds.push(a.objectId)}for(let a of t){let l=c(a.groupId);l&&!a.hidden&&l.orbitIds.push(a.objectId)}for(let a of n){let l=c(a.groupId);l&&!a.hidden&&l.leaderIds.push(a.objectId)}for(let a of r){let l=c(a.groupId);l&&!a.hidden&&l.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=Es(a,e,t,n,r,i);return[...s.values()].sort((a,l)=>a.label.localeCompare(l.label))}function Qa(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function es(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let o=n.get(r.from),i=n.get(r.to);return{renderId:`${St(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:r.hidden||!o||!i||o.hidden||i.hidden}}).sort((r,o)=>r.relation.id.localeCompare(o.relation.id))}function ts(e,t,n){let r=new Map(t.map(o=>[o.objectId,o]));return e.map(o=>{let i=[...new Set([...o.targetObjectId?[o.targetObjectId]:[],...o.participantObjectIds])],s=i.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,p)=>l+p.x,0)/s.length:0,a=s.length>0?s.reduce((l,p)=>l+p.y,0)/s.length:0;return{renderId:`${St(o.id)}-event`,eventId:o.id,event:o,objectIds:i,participantIds:[...o.participantObjectIds],targetObjectId:o.targetObjectId,x:c,y:a,hidden:o.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&o.id!==n}}).sort((o,i)=>o.event.id.localeCompare(i.event.id))}function ns(e,t,n,r,o){let i=rs(e,t,n),s=new Map;for(let[l,p]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,w,...x]=l.split(".");if(f!=="viewpoint"||!w||x.length===0)continue;let S=fs(w);if(!S)continue;let k=x.join(".").toLowerCase(),C=s.get(S)??{id:S};os(C,k,p,e,t,n,r,o),s.set(S,C)}let c=[...s.values()].map(l=>is(l,t,n,o)).filter(Boolean),a=c.findIndex(l=>l.id===i.id);return a>=0?c.splice(a,1,{...i,...c[a],layers:{...i.layers,...c[a].layers},filter:c[a].filter??i.filter,generated:!1}):c.unshift(i),c.sort((l,p)=>l.id==="overview"?-1:p.id==="overview"?1:l.label.localeCompare(p.label))}function rs(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function os(e,t,n,r,o,i,s,c){let a=n.trim();switch(t){case"label":case"title":a&&(e.label=a);return;case"summary":case"description":a&&(e.summary=a);return;case"focus":case"object":a&&(e.focus=a);return;case"select":case"selection":a&&(e.select=a);return;case"events":e.eventIds=en(a);return;case"projection":case"view":e.projection=ss(a)??o;return;case"preset":e.preset=cs(a)??i;return;case"rotation":case"angle":e.rotationDeg=uo(a)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=ls(a);return;case"layers":e.layers=ds(a);return;case"query":e.filter={...e.filter??Vn(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??Vn(),objectTypes:us(a)};return;case"tags":e.filter={...e.filter??Vn(),tags:en(a)};return;case"groups":e.filter={...e.filter??Vn(),groupIds:ps(a,r,s,c)};return}}function is(e,t,n,r){let o=e.focus&&r.has(e.focus)?e.focus:null,i=e.select&&r.has(e.select)?e.select:o,s=as(e.filter),c=e.label?.trim()||ms(e.id);return{id:e.id,label:c,summary:e.summary?.trim()||gs(c,o,s),objectId:o,selectedObjectId:i,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Vn(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function as(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function ss(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function cs(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function uo(e){let t=Number(e);return Number.isFinite(t)?t:null}function ls(e){let t=uo(e);return t!==null&&t>0?t:null}function ds(e){let t={};for(let n of en(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),o=n.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="events"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=r)}return t}function us(e){return en(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function ps(e,t,n,r){return en(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:n.groupIds.has(o)?n.groupIds.get(o)??Qt(o):(r.has(o),Qt(o)))}function en(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function fs(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ms(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function gs(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function hs(e,t,n,r,o,i,s){let c=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,p=Number.NEGATIVE_INFINITY,f=(w,x)=>{c=Math.min(c,w),a=Math.min(a,x),l=Math.max(l,w),p=Math.max(p,x)};for(let w of r)w.hidden||po(w,f);for(let w of o)w.hidden||(f(w.x1,w.y1),f(w.x2,w.y2));for(let w of n)w.hidden||fo(w,f);for(let w of i)w.hidden||mo(w,f,s);return!Number.isFinite(c)||!Number.isFinite(a)?tn(0,0,e,t):tn(c,a,l,p)}function po(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,o=e.ry??e.radius??0,i=yo(e.cx,e.cy,r,o,e.rotationDeg,0,Math.PI*2,so*2);for(let s of i)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function tn(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function fo(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function mo(e,t,n){let r=bo(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function ur(e,t,n,r,o,i,s,c){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:n,radius:_n(e,r,c.scaleModel),sortKey:Un(t,n,r)}),Rn(e,o,i,s,c,r+1))}function Rn(e,t,n,r,o,i){let s=t.get(e.id);if(!s)return;let c=[...o.orbitChildren.get(e.id)??[]].sort(bs),a=ys(c,s.radius,o.spacingFactor,o.scaleModel),l=$s(c,a);c.forEach((f,w)=>{let x=ws(f,w,c.length,s,a,l[w]??a.innerPx,o);n.push({object:f,parentId:e.id,kind:x.kind,cx:x.cx,cy:x.cy,radius:x.radius,rx:x.rx,ry:x.ry,rotationDeg:x.rotationDeg,band:x.band,bandThickness:x.bandThickness,frontArcPath:x.frontArcPath,backArcPath:x.backArcPath}),ur(f,x.objectX,x.objectY,i,t,n,r,o)});let p=[...o.surfaceChildren.get(e.id)??[]];p.forEach((f,w)=>{let x=nn(w,p.length,-Math.PI/3),S=28*o.spacingFactor,k=rn(x,s.radius,o.projection,o.projection==="isometric"?.9:1),C=rn(x,s.radius+S,o.projection,o.projection==="isometric"?.9:1),q=s.x+k.x,v=s.y+k.y,A=s.x+C.x,re=s.y+C.y;t.set(f.id,{object:f,x:A,y:re,radius:_n(f,i+1,o.scaleModel),sortKey:Un(A,re,i+1),anchorX:q,anchorY:v}),r.push({object:f,groupId:o.objectMap.has(f.id)?Qt(Ms(f,o.objectMap)):null,x1:q,y1:v,x2:A,y2:re,mode:"surface"}),Rn(f,t,n,r,o,i+1)})}function bs(e,t){let n=Bn(e),r=Bn(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function ys(e,t,n,r){let o=e.map(f=>Bn(f)),i=o.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let a=Math.min(...i),l=Math.max(...i),p=l-a;return{metrics:o,minMetric:a,maxMetric:l,metricSpread:p,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function ws(e,t,n,r,o,i,s){let c=e.placement,a=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let W=o.innerPx+t*o.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:W,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-W}}let l=se(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),p=i,f=Math.max(p*Math.sqrt(1-l*l),p*.18),w=fr(c.inclination)??0,x=s.projection==="isometric"?Math.max(Pa,Math.cos(zn(w)))*ao:1,S=Math.max(f*x,p*.14),k=fr(c.angle)??0,C=p*l,q=vo(-C,0,k),v=r.x+q.x,A=r.y+q.y,re=Is(c.phase,t,n),Q=wo(v,A,p,S,k,re),ee=s.projection==="topdown"&&l<=1e-4&&Math.abs(k)<=1e-4,te=a?js(e,p,o,s.scaleModel):void 0;return{kind:ee?"circle":"ellipse",cx:ee?r.x:v,cy:ee?r.y:A,radius:ee?p:void 0,rx:ee?void 0:p,ry:ee?void 0:S,rotationDeg:k,band:a,bandThickness:te,frontArcPath:s.projection==="isometric"||a?no(v,A,p,S,k,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?no(v,A,p,S,k,Math.PI,Math.PI*2):void 0,objectX:Q.x,objectY:Q.y}}function vs(e,t){return t.innerPx+t.stepPx*xs(Math.max(e,0)+1)}function $s(e,t){let n=[];return e.forEach((r,o)=>{let i=Bn(r),s=t.innerPx+o*t.stepPx,c=i===null?s:vs(i,t),a=o===0?t.innerPx:(n[o-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,a))}),n}function Bn(e){return!e.placement||e.placement.mode!=="orbit"?null:Nn(e.placement.semiMajor??e.placement.distance??null)}function xs(e){return Math.log(e)/Math.log(2)}function Is(e,t,n){let r=e?fr(e):null;return r!==null?zn(r-90):nn(t,n,-Math.PI/2)}function js(e,t,n,r){let o=Nn(pr(e.properties.inner)),i=Nn(pr(e.properties.outer));if(o!==null&&i!==null){let c=Math.abs(i-o);if(n.metricSpread>0)return se(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let a=Math.max(Math.max(o,i),1e-4);return se(c/a*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function ks(e,t,n,r,o,i,s,c,a){if(e.kind==="lagrange")return Ss(e,t,n,i,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let p=nn(r,o,Math.PI/5),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=rn(p,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let p=nn(r,o,Math.PI/6),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=rn(p,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}return{x:i-c-170,y:s-c-86-r*58*a.scaleModel.freePlacementMultiplier}}function Ss(e,t,n,r,o){let i=e.secondary?t.get(e.primary):Ls(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!i||!s)return{x:r*.7,y:o*.25};let c=s.x-i.x,a=s.y-i.y,l=Math.hypot(c,a)||1,p=c/l,f=a/l,w=-f,x=p,S=se(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-p*S,y:s.y-f*S,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+p*S,y:s.y+f*S,anchorX:s.x,anchorY:s.y};case"L3":return{x:i.x-p*S,y:i.y-f*S,anchorX:i.x,anchorY:i.y};case"L4":return{x:s.x+(p*.5-w*.8660254)*S,y:s.y+(f*.5-x*.8660254)*S,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(p*.5+w*.8660254)*S,y:s.y+(f*.5+x*.8660254)*S,anchorX:s.x,anchorY:s.y}}}function Os(e,t){let n=new Map,r=new Map;for(let l of e){let p=go(l,t);if(n.set(l.id,p),p){let f=r.get(p);f?f.push(l.id):r.set(p,[l.id])}r.has(l.id)||r.set(l.id,[])}let o=new Map,i=new Map,s=new Map,c=l=>{let p=o.get(l);if(p)return p;let f=new Set,w=[],x=n.get(l)??null;for(;x&&!f.has(x);)w.push(x),f.add(x),x=n.get(x)??null;return o.set(l,w),w},a=l=>{let p=s.get(i.get(l)??"");if(p)return p;let f=n.get(l)??null,w=t.get(l),x=l;return w?.placement&&w.placement.mode!=="free"&&f&&(x=a(f)),x};for(let l of e){c(l.id);let p=a(l.id),f=Qt(p);i.set(l.id,f),s.set(f,p)}return{parentIds:n,childIds:r,ancestorIds:o,groupIds:i,groupRoots:s}}function go(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Es(e,t,n,r,o,i){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,p=(f,w)=>{s=Math.min(s,f),c=Math.min(c,w),a=Math.max(a,f),l=Math.max(l,w)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&fo(f,p);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&po(f,p);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(p(f.x1,f.y1),p(f.x2,f.y2));for(let f of o)!f.hidden&&e.labelIds.includes(f.objectId)&&mo(f,p,i);return!Number.isFinite(s)||!Number.isFinite(c)?tn(0,0,0,0):tn(s,c,a,l)}function Ms(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let o=go(n,t);if(!o)break;let i=t.get(o);if(!i)break;n=i}return n.id}function ho(e,t,n){return bo(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function bo(e,t,n,r,o,i,s,c){let a=Fs(i,s,c),l=a*2,p=o==="above"?18:12,f=o==="above"?8:12,w=e-a,x=e+a;return r==="start"?(w=e,x=e+l):r==="end"&&(w=e-l,x=e),{left:w,right:x,top:Math.min(t,n)-p,bottom:Math.max(t,n)+f}}function Ds(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ls(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function _n(e,t,n){let r=Ps(e.properties.radius,n);if(r!==null)return r;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return se((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return se(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return se(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return se(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return se(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return se(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return se(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return se(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return se(8*o,n.minBodyRadius,n.maxBodyRadius)}}function As(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Nn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Jt;case"m":return e.value/1e3/Jt;case"ly":return e.value*La;case"pc":return e.value*Aa;case"kpc":return e.value*Ta;case"re":return e.value*Ea/Jt;case"rj":return e.value*Ma/Jt;case"sol":return e.value*Da/Jt;default:return e.value}}function Ts(e,t){let n=Nn(e??null);return n===null||n<=0?0:se(n*96*t.freePlacementMultiplier,0,420)}function Ps(e,t){let n=pr(e);if(!n)return null;let r;switch(n.unit){case"sol":r=se(n.value*22,14,40);break;case"re":r=se(n.value*10,6,18);break;case"km":r=se(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=se(n.value*4,4,20);break}return se(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function pr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function fr(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function nn(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function no(e,t,n,r,o,i,s){let c=yo(e,t,n,r,o,i,s,so);return c.length===0?"":c.map((a,l)=>`${l===0?"M":"L"} ${io(a.x)} ${io(a.y)}`).join(" ")}function yo(e,t,n,r,o,i,s,c){let a=[];for(let l=0;l<=c;l+=1){let p=i+(s-i)*l/c;a.push(wo(e,t,n,r,o,p))}return a}function wo(e,t,n,r,o,i){let s=n*Math.cos(i),c=r*Math.sin(i),a=vo(s,c,o);return{x:e+a.x,y:t+a.y}}function vo(e,t,n){let r=zn(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function rn(e,t,n,r){let o=n==="isometric"?ao*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Un(e,t,n){return t*1e3+e+n*.01}function se(e,t,n){return Math.min(Math.max(e,t),n)}function ro(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function St(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Qt(e){return`${St(e)}-group`}function Cs(e){return typeof e=="string"&&e.trim()?e:void 0}function Fs(e,t,n){let r=e.length*4.6*n+18,o=t.length*3.9*n+18;return Math.max(r,o,24)}function oo(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function zn(e){return e*Math.PI/180}function io(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function yt(e,t={}){let n=Se(e,t),r=[],o=Bs(e,r),i=_s(e,r),s=Rs(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Vs(e,s,o,i,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(a=>!a.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(a=>!a.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(xo),diagnostics:r}}function mr(e,t={}){return Zs(yt(e,t))}function on(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Gs(e.system),info:Xs(e.system)}:null,r=e.objects.map(xo);return Ws(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Us),objects:r}}function Vs(e,t,n,r,o,i){let s=Se(e,{preset:i??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(Ns),annotations:r}}function Rs(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Bs(e,t){let n={};for(let[o,i]of Object.entries(e.system?.info??{}))o.startsWith("viewpoint.")||o.startsWith("annotation.")||(n[o]=i);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function _s(e,t){let n=new Map;for(let[r,o]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,i,...s]=r.split(".");if(!i||s.length===0)continue;let c=$o(i);if(!c)continue;let a=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":a.label=o;break;case"target":case"object":a.targetObjectId=o.trim()||null;break;case"body":case"text":case"description":a.body=o;break;case"tags":a.tags=Hs(o);break}n.set(c,a)}for(let r of e.objects){let o=r.info.description;if(!o)continue;let i=$o(`${r.id}-notes`);n.has(i)||(n.set(i,{id:i,label:`${r.id} Notes`,targetObjectId:r.id,body:o,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${i}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??qs(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,o)=>r.label.localeCompare(o.label))}function Ns(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function xo(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:Ys(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Us(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(zs)}}function zs(e){return{objectId:e.objectId,placement:Io(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Io(e){return e?structuredClone(e):null}function Ws(e,t,n){if(!n)return;let r=t.find(i=>i.id===n);if(!r)return;let o=new Map(e.map(i=>[i.id,i]));for(let i of r.positions){let s=o.get(i.objectId);s&&(s.placement=Io(i.placement),i.inner?s.properties.inner={...i.inner}:delete s.properties.inner,i.outer?s.properties.outer={...i.outer}:delete s.properties.outer)}}function Ys(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Hs(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function $o(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function qs(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Gs(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function Xs(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let o=Ks(n.layers);o&&(t[`${r}.layers`]=o),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Ks(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function Zs(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var jo=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Wn(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(n==="2.0-draft"){let a=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:mr(e);return So(a)}let c=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:yt(e);return n==="2.1"&&c.version!=="2.1"?gr({...c,version:"2.1",schemaVersion:"2.1"}):gr(c)}let o=[],i=e;i.system&&o.push(...Js(i.system));let s=[...i.objects].sort(yr);for(let c of s)o.length>0&&o.push(""),o.push(...ec(c));return o.join(`
|
|
2
|
+
`)}function gr(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Oo(e.system));for(let r of[...e.groups].sort(Ot))t.push(""),t.push(...Lo(r));for(let r of[...e.relations].sort(Ot))t.push(""),t.push(...Ao(r));for(let r of[...e.events].sort(Ot))t.push(""),t.push(...To(r));let n=[...e.objects].sort(yr);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,o)=>{o>0&&t.push(""),t.push(...Eo(r))}),t.join(`
|
|
3
|
+
`)}function So(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Oo(t.system));for(let o of[...t.groups].sort(Ot))n.push(""),n.push(...Lo(o));for(let o of[...t.relations].sort(Ot))n.push(""),n.push(...Ao(o));for(let o of[...t.events].sort(Ot))n.push(""),n.push(...To(o));let r=[...t.objects].sort(yr);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((o,i)=>{i>0&&n.push(""),n.push(...Eo(o))}),n.join(`
|
|
4
|
+
`)}function Js(e){return Qs("system",e.id,e.properties,null,e.info)}function Qs(e,t,n,r,o){let i=[`${e} ${t}`],s=[...hr(r),...Do(n)];for(let a of s)i.push(` ${a}`);let c=Object.entries(o).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){s.length>0&&i.push(""),i.push(" info");for(let[a,l]of c)i.push(` ${a} ${P(l)}`)}return i}function Oo(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${P(e.title)}`),e.description&&t.push(` description ${P(e.description)}`),e.epoch&&t.push(` epoch ${P(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${P(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${P(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${P(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${P(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([o],[i])=>o.localeCompare(i)))t.push(` ${n} ${P(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...nc(n));for(let n of e.annotations)t.push(""),t.push(...rc(n));return t}function ec(e){return Mo(e.type,e.id,e)}function Eo(e){return Mo(`object ${e.type}`,e.id,e)}function Mo(e,t,n){let r=[`${e} ${t}`],o=[...hr(n.placement),...Do(n.properties),...tc(n)];for(let s of o)r.push(` ${s}`);let i=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(i.length>0){o.length>0&&r.push(""),r.push(" info");for(let[s,c]of i)r.push(` ${s} ${P(c)}`)}for(let s of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[s]??{}).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${s}`);for(let[a,l]of c)r.push(` ${a} ${P(l)}`)}}return r}function hr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...tt("distance",e.distance),...tt("semiMajor",e.semiMajor),...ic("eccentricity",e.eccentricity),...tt("period",e.period),...tt("angle",e.angle),...tt("inclination",e.inclination),...tt("phase",e.phase)];case"at":return[`at ${ac(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?br(e.distance):e.descriptor??""}`.trim()]}}function Do(e){return Object.keys(e).sort(cc).map(t=>`${t} ${Po(e[t])}`)}function tc(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${P(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${P(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Po(n.value)}`);return t}function nc(e){let t=[`viewpoint ${e.id}`,` label ${P(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${P(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=sc(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${P(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(P).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function rc(e){let t=[`annotation ${e.id}`,` label ${P(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${P(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),t}function Lo(e){let t=[`group ${e.id}`,` label ${P(e.label)}`];return e.summary&&t.push(` summary ${P(e.summary)}`),e.color&&t.push(` color ${P(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Ao(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${P(e.from)}`),e.to&&t.push(` to ${P(e.to)}`),e.kind&&t.push(` kind ${P(e.kind)}`),e.label&&t.push(` label ${P(e.label)}`),e.summary&&t.push(` summary ${P(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),e.color&&t.push(` color ${P(e.color)}`),e.hidden&&t.push(" hidden true"),t}function To(e){let t=[`event ${e.id}`,` kind ${P(e.kind)}`];if(e.label&&t.push(` label ${P(e.label)}`),e.summary&&t.push(` summary ${P(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${P(e.timing)}`),e.visibility&&t.push(` visibility ${P(e.visibility)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(P).join(" ")}`),e.color&&t.push(` color ${P(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(lc)){t.push(` pose ${n.objectId}`);for(let r of oc(n))t.push(` ${r}`)}}return t}function oc(e){return[...hr(e.placement),...tt("inner",e.inner),...tt("outer",e.outer)]}function Po(e){return Array.isArray(e)?e.map(t=>P(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?P(e):br(e)}function br(e){return`${e.value}${e.unit??""}`}function tt(e,t){return t?[`${e} ${br(t)}`]:[]}function ic(e,t){return t===void 0?[]:[`${e} ${t}`]}function ac(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function sc(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t}function cc(e,t){let n=jo.indexOf(e),r=jo.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function yr(e,t){let n=ko(e.type),r=ko(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function Ot(e,t){return e.id.localeCompare(t.id)}function lc(e,t){return e.objectId.localeCompare(t.objectId)}function ko(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function P(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Co=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,dc=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),uc=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Et(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function sn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function wr(e,t,n){let r=e.match(Co);if(!r)throw y.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=$e(n);if(i?.unitFamily&&!Tn(i.unitFamily,o.unit))throw y.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function vr(e){let t=e.match(Co);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Yn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw y.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function nt(e,t,n){let r=dc.get(e.toLowerCase());if(r===void 0)throw y.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Fo(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw y.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function pc(e,t){if(!e)throw y.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw y.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(uc);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw y.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Vo(e,t,n){let r=$e(e);if(!r)throw y.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw y.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return nt(an(t,e,n),e,n);case"number":return Yn(an(t,e,n),e,n);case"unit":return wr(an(t,e,n),n,e);case"string":{let o=t.join(" ").trim();return e==="image"&&pc(o,n),o}}}function $r(e,t,n){let r=$e(e);if(!r)throw y.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw y.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function an(e,t,n){if(e.length!==1)throw y.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Bo=new Set(["star","planet","moon","asteroid","comet"]),fc=332946.0487,mc=1047.3486,Hn=1495978707e-1,gc=6371,hc=695700,bc=63241.077,yc=206264.806,wc=206264806;function cn(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),o=new Set(e.groups.map(c=>c.id)),i=new Set(e.events.map(c=>c.id));e.system||n.push(_("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,a]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of a){let p=s.get(l);p?n.push(_("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${p}.`)):s.set(l,c)}for(let c of e.relations)vc(c,r,n);for(let c of e.system?.viewpoints??[])$c(c.filter,c.events??[],o,i,t,n,c.id);for(let c of e.objects)xc(c,e.system,r,o,n);for(let c of e.events)Ic(c,r,n);return n}function vc(e,t,n){e.from?t.has(e.from)||n.push(_("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(_("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(_("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(_("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(_("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function $c(e,t,n,r,o,i,s){if(o==="2.1"){if(e)for(let c of e.groupIds)n.has(c)||i.push(be("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${s}".`,void 0,`viewpoint.${s}.groups`));for(let c of t)r.has(c)||i.push(be("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${s}".`,void 0,`viewpoint.${s}.events`))}}function xc(e,t,n,r,o){let i=e.placement,s=i?.mode==="orbit"?i:null,c=i?.mode==="orbit"?n.get(i.target)??null:null;if(e.groups)for(let a of e.groups)r.has(a)||o.push(be("validate.group.unknown",`Unknown group "${a}" on "${e.id}".`,e.id,"groups"));if(s&&(n.has(s.target)||o.push(_("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&o.push(_("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&o.push(be("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(be("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!_o(c?.properties.mass)&&o.push(be("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let a=n.get(i.target);a?Bo.has(a.type)||o.push(_("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(_("validate.surface.target.unknown",`Unknown placement target "${i.target}" on "${e.id}".`,e.id,"surface"))}if(i?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&o.push(_("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),kc(e,n,o)||o.push(_("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let a=n.get(e.resonance.targetObjectId);a?(e.placement?.mode!=="orbit"||a.placement?.mode!=="orbit"||e.placement.target!==a.placement.target)&&o.push(be("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(_("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let a of e.deriveRules??[]){if(a.field!=="period"||a.strategy!=="kepler"){o.push(be("validate.derive.unsupported",`Unsupported derive rule "${a.field} ${a.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ro(e,c);if(l===null){o.push(be("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||o.push(Mc("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Ec(l)}.`,e.id,"derive"))}for(let a of e.validationRules??[]){if(a.rule!=="kepler"){o.push(be("validate.rule.unsupported",`Unsupported validation rule "${a.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=No(s?.period),p=Ro(e,c);if(l===null||p===null)continue;let f=Oc(e,"period");Math.abs(l-p)>f&&o.push(_("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Ic(e,t,n){let r=`event.${e.id}`,o=new Set;e.kind.trim()||n.push(_("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(_("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(_("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let i=new Set;for(let c of e.participantObjectIds){if(o.add(c),i.has(c)){n.push(be("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${r}.participants`));continue}i.add(c),t.has(c)||n.push(_("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(be("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(be("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&n.push(be("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let s=new Set;for(let c of e.positions){let a=`${r}.pose.${c.objectId}`;if(s.has(c.objectId)){n.push(_("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,a));continue}s.add(c.objectId);let l=t.get(c.objectId);if(!l){n.push(_("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,a));continue}o.has(c.objectId)||n.push(be("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,a)),jc(c,l,t,n,a,e.id)}}function jc(e,t,n,r,o,i){let s=e.placement;if(!s){r.push(_("validate.event.pose.placement.required",`Event "${i}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(s.mode==="orbit"){n.has(s.target)||r.push(_("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${i}:${e.objectId}".`,void 0,`${o}.orbit`)),s.distance&&s.semiMajor&&r.push(_("validate.event.pose.orbit.distanceConflict",`Event "${i}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`));return}if(s.mode==="surface"){let c=n.get(s.target);c?Bo.has(c.type)||r.push(_("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${i}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):r.push(_("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${i}:${e.objectId}".`,void 0,`${o}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(_("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${i}:${e.objectId}".`,void 0,`${o}.at`));let c=s.reference;c.kind==="named"&&!n.has(c.name)?r.push(_("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):c.kind==="anchor"&&!n.has(c.objectId)?r.push(_("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):c.kind==="lagrange"&&(n.has(c.primary)?c.secondary&&!n.has(c.secondary)&&r.push(_("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):r.push(_("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)))}}function kc(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(_("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(_("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(_("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ro(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Sc(n.semiMajor??n.distance),o=_o(t?.properties.mass);return r===null||o===null||o<=0?null:Math.sqrt(r**3/o)*365.25}function Sc(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Hn;case"m":return e.value/(Hn*1e3);case"ly":return e.value*bc;case"pc":return e.value*yc;case"kpc":return e.value*wc;case"re":return e.value*gc/Hn;case"sol":return e.value*hc/Hn;default:return null}}function _o(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/fc;case"mj":return t.value/mc;default:return null}}function No(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Oc(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?No(n)??0:0}function Ec(e){return`${Math.round(e*100)/100}d`}function _(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function be(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Mc(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Dc=new Set(["climate","habitability","settlement"]),qn=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=$e(e);t&&qn.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])qn.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Lc=new Set(qn.keys()),Ac=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function xr(e){return Tc(e)}function Tc(e,t){let n=yl(e),r=n.source.split(/\r?\n/),o=[],i=!1,s="2.0",c=null,a=null,l=[],p=[],f=[],w=[],x=new Map,S=!1,k=!1,C=new Set,q=new Set,v=new Set,A=new Set,re=new Set;for(let X=0;X<r.length;X++){let ne=r[X],Y=X+1;if(!ne.trim())continue;let he=Pn(ne),ye=Gt(ne.slice(he),{line:Y,columnOffset:he});if(ye.length!==0){if(!i){s=Pc(ye,Y),i=!0,n.comments.length>0&&s!=="2.1"&&o.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(he===0){a=Cc(ye,Y,s,o,c,l,p,f,w,x,C,q,v,A,re,{sawDefaults:S,sawAtlas:k}),a.kind==="system"?c=a.system:a.kind==="defaults"?S=!0:a.kind==="atlas"&&(k=!0);continue}if(!a)throw new y("Indented line without parent atlas section",Y,he+1);zc(a,he,ye,Y)}}if(!i)throw new y('Missing required atlas schema header "schema 2.0"');let Q=l.map(X=>sl(X,s,o)),ee=w.map(X=>cl(X,x.get(X.id)??[])),te=t??(s==="2.0-draft"?"2.0":s),W={format:"worldorbit",sourceVersion:"1.0",system:c,groups:p,relations:f,events:ee,objects:Q,diagnostics:o};if(te==="2.0-draft"){let X={...W,version:"2.0-draft",schemaVersion:"2.0-draft"};return X.diagnostics.push(...cn(X,s)),X}let ce={...W,version:te,schemaVersion:te};return s==="2.0-draft"&&ce.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),ce.diagnostics.push(...cn(ce,s)),ce}function Pc(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new y('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Cc(e,t,n,r,o,i,s,c,a,l,p,f,w,x,S,k){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new y('Atlas section "system" may only appear once',t,e[0].column);return Fc(e,t,n,r);case"defaults":if(!o)throw new y('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(k.sawDefaults)throw new y('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:o,seenFields:new Set};case"atlas":if(!o)throw new y('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(k.sawAtlas)throw new y('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:o,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!o)throw new y('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Vc(e,t,o,p,n,r);case"annotation":if(!o)throw new y('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Rc(e,t,o,f);case"group":return Oe(n,r,"group",{line:t,column:e[0].column}),Bc(e,t,s,w);case"relation":return Oe(n,r,"relation",{line:t,column:e[0].column}),_c(e,t,c,x);case"event":return Oe(n,r,"event",{line:t,column:e[0].column}),Nc(e,t,a,l,S,n,r);case"object":return Uc(e,t,n,r,i);default:throw new y(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Fc(e,t,n,r){if(e.length!==2)throw new y("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Vc(e,t,n,r,o,i){if(e.length!==2)throw new y("Invalid viewpoint declaration",t,e[0]?.column??1);let s=Et(e[1].value);if(!s)throw new y("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new y(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:sn(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:o,diagnostics:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Rc(e,t,n,r){if(e.length!==2)throw new y("Invalid annotation declaration",t,e[0]?.column??1);let o=Et(e[1].value);if(!o)throw new y("Annotation id must not be empty",t,e[1].column);if(r.has(o))throw new y(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:sn(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(i),r.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function Bc(e,t,n,r){if(e.length!==2)throw new y("Invalid group declaration",t,e[0]?.column??1);let o=Et(e[1].value);if(!o)throw new y("Group id must not be empty",t,e[1].column);if(r.has(o))throw new y(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:sn(o),summary:"",color:null,tags:[],hidden:!1};return n.push(i),r.add(o),{kind:"group",group:i,seenFields:new Set}}function _c(e,t,n,r){if(e.length!==2)throw new y("Invalid relation declaration",t,e[0]?.column??1);let o=Et(e[1].value);if(!o)throw new y("Relation id must not be empty",t,e[1].column);if(r.has(o))throw new y(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(i),r.add(o),{kind:"relation",relation:i,seenFields:new Set}}function Nc(e,t,n,r,o,i,s){if(e.length!==2)throw new y("Invalid event declaration",t,e[0]?.column??1);let c=Et(e[1].value);if(!c)throw new y("Event id must not be empty",t,e[1].column);if(o.has(c))throw new y(`Duplicate event id "${c}"`,t,e[1].column);let a={id:c,kind:"",label:sn(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(a),r.set(c,l),o.add(c),{kind:"event",event:a,sourceSchemaVersion:i,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Uc(e,t,n,r,o){if(e.length<3)throw new y("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],s=e[2],c=i.value;if(!An.has(c)||c==="system")throw new y(`Unknown object type "${i.value}"`,t,i.column);let a={objectType:c,id:s.value,fields:il(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(a),{kind:"object",objectNode:a,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function zc(e,t,n,r){switch(e.kind){case"system":Wc(e,n,r);return;case"defaults":Yc(e,n,r);return;case"atlas":Hc(e,t,n,r);return;case"viewpoint":qc(e,t,n,r);return;case"annotation":Xc(e,n,r);return;case"group":Kc(e,n,r);return;case"relation":Zc(e,n,r);return;case"event":Jc(e,t,n,r);return;case"object":el(e,t,n,r);return}}function Wc(e,t,n){let r=ot(t,e.seenFields,n),o=G(t,n);switch(r){case"title":e.system.title=o;return;case"description":Oe(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=o;return;case"epoch":Oe(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":Oe(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=o;return;default:throw new y(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Yc(e,t,n){let r=ot(t,e.seenFields,n),o=G(t,n);switch(r){case"view":e.system.defaults.view=zo(o,n,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=Wo(o,n,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new y(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Hc(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=Ho(n,r,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new y(`Duplicate atlas metadata key "${o.key}"`,r,n[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new y(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function qc(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Gc(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new y('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=ot(n,e.seenFields,r),i=G(n,r);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=zo(i,r,n[0].column);return;case"preset":e.viewpoint.preset=Wo(i,r,n[0].column);return;case"zoom":e.viewpoint.zoom=rl(i,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Yo(i,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=nl(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":Oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=Fe(n.slice(1),r,"events");return;default:throw new y(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Gc(e,t,n){let r=ot(t,e.seenFilterFields,n),o=e.viewpoint.filter??ol();switch(r){case"query":o.query=G(t,n);break;case"objecttypes":o.objectTypes=tl(t.slice(1),n);break;case"tags":o.tags=Fe(t.slice(1),n,"tags");break;case"groups":o.groupIds=Fe(t.slice(1),n,"groups");break;default:throw new y(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=o}function Xc(e,t,n){switch(ot(t,e.seenFields,n)){case"label":e.annotation.label=G(t,n);return;case"target":e.annotation.targetObjectId=G(t,n);return;case"body":e.annotation.body=G(t,n);return;case"tags":e.annotation.tags=Fe(t.slice(1),n,"tags");return;default:throw new y(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Kc(e,t,n){switch(ot(t,e.seenFields,n)){case"label":e.group.label=G(t,n);return;case"summary":e.group.summary=G(t,n);return;case"color":e.group.color=G(t,n);return;case"tags":e.group.tags=Fe(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=nt(G(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new y(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Zc(e,t,n){switch(ot(t,e.seenFields,n)){case"from":e.relation.from=G(t,n);return;case"to":e.relation.to=G(t,n);return;case"kind":e.relation.kind=G(t,n);return;case"label":e.relation.label=G(t,n);return;case"summary":e.relation.summary=G(t,n);return;case"tags":e.relation.tags=Fe(t.slice(1),n,"tags");return;case"color":e.relation.color=G(t,n);return;case"hidden":e.relation.hidden=nt(G(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new y(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Jc(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){e.activePose.fields.push(Qc(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new y(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let i=n[1].value;if(!i.trim())throw new y("Event pose object id must not be empty",r,n[1].column);let s={objectId:i,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(s),e.activePose=s,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new y('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(ot(n,e.seenFields,r)){case"kind":e.event.kind=G(n,r);return;case"label":e.event.label=G(n,r);return;case"summary":e.event.summary=G(n,r);return;case"target":e.event.targetObjectId=G(n,r);return;case"participants":e.event.participantObjectIds=Fe(n.slice(1),r,"participants");return;case"timing":e.event.timing=G(n,r);return;case"visibility":e.event.visibility=G(n,r);return;case"tags":e.event.tags=Fe(n.slice(1),r,"tags");return;case"color":e.event.color=G(n,r);return;case"hidden":e.event.hidden=nt(G(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new y(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Qc(e,t,n){if(e.length<2)throw new y("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Ac.has(r))throw new y(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new y(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}}}function el(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let o=n[0].value.toLowerCase();if(o==="info"||Dc.has(o)){o!=="info"&&Oe(e.sourceSchemaVersion,e.diagnostics,o,{line:r,column:n[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=Ho(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new y(`Duplicate info key "${o.key}"`,r,n[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,s=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(s.has(o.key))throw new y(`Duplicate ${i} key "${o.key}"`,r,n[0].column);s.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(al(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function ot(e,t,n){if(e.length<2)throw new y("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new y(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function G(e,t){if(e.length<2)throw new y("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function tl(e,t){return Fe(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function nl(e,t,n,r){let o={};for(let i of Fe(e,t,"layers")){let s=!i.startsWith("-")&&!i.startsWith("!"),c=i.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){o["orbits-back"]=s,o["orbits-front"]=s;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&Oe(n,r,"layers.events",{line:t,column:e[0]?.column??1}),o[c]=s)}return o}function Fe(e,t,n){if(e.length===0)throw new y(`Missing value for atlas field "${n}"`,t,1);let r=e.map(o=>o.value).filter(Boolean);if(r.length===0)throw new y(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function zo(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new y(`Unknown projection "${e}"`,t,n);return r}function Wo(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new y(`Unknown render preset "${e}"`,t,n)}function rl(e,t,n,r){let o=Yo(e,t,n,r);if(o<=0)throw new y(`Field "${r}" must be greater than zero`,t,n);return o}function Yo(e,t,n,r){let o=Number(e);if(!Number.isFinite(o))throw new y(`Invalid numeric value "${e}" for "${r}"`,t,n);return o}function ol(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function il(e,t,n,r,o){let i=[],s=0;for(;s<e.length;){let c=e[s],a=ln(c.value);if(!a)throw new y(`Unknown field "${c.value}"`,t,c.column);a.version==="2.1"&&Oe(r,o,c.value,{line:t,column:c.column}),s++;let l=[];if(a.inlineMode==="single"){let p=e[s];p&&(l.push(p),s++)}else if(a.inlineMode==="pair")for(let p=0;p<2;p++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!Lc.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new y(`Missing value for field "${c.value}"`,t,c.column);i.push({type:"field",key:c.value,values:l.map(p=>p.value),location:{line:t,column:c.column}})}return Ko(i,n),i}function al(e,t,n,r,o){if(e.length<2)throw new y("Invalid field line",t,e[0]?.column??1);let i=ln(e[0].value);if(!i)throw new y(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&Oe(r,o,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return Ko([s],n),s}function Ho(e,t,n){if(e.length<2)throw new y(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function sl(e,t,n){let r=qo(e.fields),o=Go(r),i=dl(e.objectType,r),s=hl(r.get("groups")?.[0]),c=Uo(r.get("epoch")?.[0]),a=Uo(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?nt(Le(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,p=r.has("resonance")?fl(r.get("resonance")[0]):void 0,f=pl(r),w=r.get("derive")?.map(A=>ml(A)),x=r.get("validate")?.map(A=>({rule:Le(A)})),S=r.has("locked")?[...new Set(r.get("locked").flatMap(A=>A.values))]:void 0,k=r.get("tolerance")?.map(A=>gl(A)),C=ul(e.typedBlockEntries),q=Xo(e.infoEntries,"info"),v={type:e.objectType,id:e.id,properties:i,placement:o,info:q};return s.length>0&&(v.groups=s),c&&(v.epoch=c),a&&(v.referencePlane=a),l!==void 0&&(v.tidalLock=l),p&&(v.resonance=p),f&&(v.renderHints=f),w?.length&&(v.deriveRules=w),x?.length&&(v.validationRules=x),S?.length&&(v.lockedFields=S),k?.length&&(v.tolerances=k),C&&Object.keys(C).length>0&&(v.typedBlocks=C),t!=="2.1"&&(v.groups||v.epoch||v.referencePlane||v.tidalLock!==void 0||v.resonance||v.renderHints||v.deriveRules?.length||v.validationRules?.length||v.lockedFields?.length||v.tolerances?.length||v.typedBlocks)&&Oe(t,n,e.id,e.location),v}function cl(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ll(n))}}function ll(e){let t=qo(e.fields),n=Go(t);return{objectId:e.objectId,placement:n,inner:rt(t.get("inner")?.[0],"inner"),outer:rt(t.get("outer")?.[0],"outer")}}function qo(e){let t=new Map;for(let n of e){let r=ln(n.key);if(!r)throw y.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw y.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=t.get(n.key)??[];o.push(n),t.set(n.key,o)}return t}function Go(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],o=e.get("free")?.[0];if([t,n,r,o].filter(Boolean).length>1){let s=t??n??r??o;throw y.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:Le(t),distance:rt(e.get("distance")?.[0],"distance"),semiMajor:rt(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:bl(e.get("eccentricity")?.[0],"eccentricity"),period:rt(e.get("period")?.[0],"period"),angle:rt(e.get("angle")?.[0],"angle"),inclination:rt(e.get("inclination")?.[0],"inclination"),phase:rt(e.get("phase")?.[0],"phase")};if(n){let s=Le(n);return{mode:"at",target:s,reference:Fo(s,n.location)}}if(r)return{mode:"surface",target:Le(r)};if(o){let s=Le(o),c=vr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function dl(e,t){let n={};for(let[r,o]of t.entries()){let i=o[0],s=ln(r);!i||!s?.legacySchema||s.legacySchema.placement||($r(r,e,i.location),n[r]=Vo(r,i.values,i.location))}return n}function Xo(e,t){let n={};for(let r of e){if(r.key in n)throw y.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ul(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Xo(r,n))}return t}function pl(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return n&&(t.renderLabel=nt(Le(n),"renderLabel",n.location)),r&&(t.renderOrbit=nt(Le(r),"renderOrbit",r.location)),o&&(t.renderPriority=Yn(Le(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function fl(e){if(e.values.length!==2)throw y.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw y.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function ml(e){if(e.values.length!==2)throw y.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function gl(e){if(e.values.length!==2)throw y.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=vr(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function hl(e){return e?[...new Set(e.values)]:[]}function Uo(e){return e&&e.values.join(" ").trim()||null}function rt(e,t){return e?wr(Le(e),e.location,t):void 0}function bl(e,t){return e?Yn(Le(e),t,e.location):void 0}function Le(e){return an(e.values,e.key,e.location)}function ln(e){return qn.get(e)}function Ko(e,t){for(let n of e){let r=ln(n.key);if(!r)throw y.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){$r(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw y.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Oe(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function yl(e){let t=[...e],n=[],r=!1,o=!1,i=null,s=1,c=1;for(let a=0;a<t.length;a++){let l=t[a],p=t[a+1];if(o){if(l==="*"&&p==="/"){t[a]=" ",t[a+1]=" ",o=!1,i=null,a++,c+=2;continue}l!==`
|
|
5
|
+
`&&l!=="\r"&&(t[a]=" "),l===`
|
|
6
|
+
`?(s++,c=1):c++;continue}if(!r&&l==="/"&&p==="*"){n.push({kind:"block",line:s,column:c}),t[a]=" ",t[a+1]=" ",o=!0,i={line:s,column:c},a++,c+=2;continue}if(!r&&l==="#"&&!wl(t,a)){n.push({kind:"line",line:s,column:c}),t[a]=" ";let f=a+1;for(;f<t.length&&t[f]!==`
|
|
7
|
+
`&&t[f]!=="\r";)t[f]=" ",f++;c+=f-a,a=f-1;continue}l==='"'&&t[a-1]!=="\\"&&(r=!r),l===`
|
|
8
|
+
`?(s++,c=1):c++}if(o)throw y.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:n}}function wl(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let o=e[n];return o===void 0||o===" "||o===" "||o==="\r"||o===`
|
|
9
|
+
`}function Gn(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function z(e){return structuredClone(e)}function Ir(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?ei(e,t.id):null;case"event":return t.id?Xn(e,t.id):null;case"event-pose":return t.id&&t.key?ni(e,t.id,t.key):null;case"object":return t.id?Qo(e,t.id):null;case"viewpoint":return t.id?ri(e.system,t.id):null;case"annotation":return t.id?oi(e.system,t.id):null;case"relation":return t.id?ti(e,t.id):null}}function jr(e,t){let n=z(e),r=Jo(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(o=>o.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(o=>o.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(o=>o.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let o=Xn(n,t.id);o&&(o.positions=o.positions.filter(i=>i.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(o=>o.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(o=>o.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(o=>o.id!==t.id)),n;default:return n}}function dn(e,t){return t.map(n=>({diagnostic:n,path:Zo(e,n)}))}function Zo(e,t){if(t.objectId&&Qo(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&ei(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&ri(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&oi(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&ti(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&Xn(e,n[1]))return n[2]==="pose"&&n[3]&&ni(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in Jo(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function kr(e){let t=[...e.diagnostics,...cn(e,e.version)];return dn(e,t)}function Jo(e){return e.system||(e.system=Gn().system),e.system}function Qo(e,t){return e.objects.find(n=>n.id===t)??null}function ei(e,t){return e.groups.find(n=>n.id===t)??null}function ti(e,t){return e.relations.find(n=>n.id===t)??null}function Xn(e,t){return e.events.find(n=>n.id===t)??null}function ni(e,t,n){return Xn(e,t)?.positions.find(r=>r.objectId===n)??null}function ri(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function oi(e,t){return e?.annotations.find(n=>n.id===t)??null}var vl=/^schema\s+2(?:\.0|\.1)?$/i,$l=/^schema\s+2\.1$/i,xl=/^schema\s+2\.0-draft$/i;function ii(e){for(let t of Il(e).split(/\r?\n/)){let n=t.trim();if(n)return xl.test(n)?"2.0-draft":$l.test(n)?"2.1":vl.test(n)?"2.0":"1.0"}return"1.0"}function Il(e){let t=[...e],n=!1,r=!1;for(let o=0;o<t.length;o++){let i=t[o],s=t[o+1];if(r){if(i==="*"&&s==="/"){t[o]=" ",t[o+1]=" ",r=!1,o++;continue}i!==`
|
|
10
|
+
`&&i!=="\r"&&(t[o]=" ");continue}if(!n&&i==="/"&&s==="*"){t[o]=" ",t[o+1]=" ",r=!0,o++;continue}if(!n&&i==="#"){t[o]=" ";let c=o+1;for(;c<t.length&&t[c]!==`
|
|
11
|
+
`&&t[c]!=="\r";)t[c]=" ",c++;o=c-1;continue}i==='"'&&t[o-1]!=="\\"&&(n=!n)}return t.join("")}function it(e){let t=un(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new y(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function un(e){let t=ii(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return jl(e,t);let n;try{n=Xt(e)}catch(o){return{ok:!1,value:null,diagnostics:[bt(o,"parse")]}}let r;try{r=Kt(n)}catch(o){return{ok:!1,value:null,diagnostics:[bt(o,"normalize")]}}try{Zt(r)}catch(o){return{ok:!1,value:null,diagnostics:[bt(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function jl(e,t){let n;try{n=xr(e)}catch(s){return{ok:!1,value:null,diagnostics:[bt(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let o;try{o=on(n)}catch(s){return{ok:!1,value:null,diagnostics:[bt(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Sl={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Kn={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Sr(e){return e?typeof e=="string"?Kn[e]??Kn.atlas:{...Kn.atlas,...e}:Kn.atlas}function Or(e){return{...Sl,...e}}function Ve(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Er(e.objectTypes??[]),tags:Er((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Er((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Ol(t)?t:null}function Ol(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Zn(e,t){let n=Ve(t),r=new Set;for(let o of e.objects)if(!o.hidden&&El(o,n)&&(r.add(o.objectId),n?.includeAncestors!==!1))for(let i of o.ancestorIds)r.add(i);return n?r:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function Mr(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Ml(o,r)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,n).map(o=>ai(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,n).map(o=>ai(o,1))}function si(e,t,n,r){return{version:"2.0",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:Ve(n)}}function Dr(e){return encodeURIComponent(JSON.stringify(e))}function Lr(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",viewpointId:t.viewpointId??null,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null},filter:Ve(t.filter??null)}}function ci(e,t,n){let r=e.trim()||"bookmark";return{id:r.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||r,atlasState:{...n,viewerState:{...n.viewerState},renderOptions:{...n.renderOptions,layers:n.renderOptions.layers?{...n.renderOptions.layers}:void 0,scaleModel:n.renderOptions.scaleModel?{...n.renderOptions.scaleModel}:void 0,activeEventId:n.renderOptions.activeEventId??null},filter:n.filter?{...n.filter}:null}}}function Ar(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,events:e.layers.events,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function Tr(e){return e?.filter?Ve({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function ai(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[]}}function El(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=li(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>n.includes(o)))return!1}return!0}function Ml(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),o=li(e.object,e.label).toLowerCase(),i=0;return n===t||r===t?i+=120:n.startsWith(t)||r.startsWith(t)?i+=96:(n.includes(t)||r.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(a=>o.includes(a))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(a=>typeof a=="string"):[]).some(a=>a.toLowerCase()===t)&&(i+=18),i}function li(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function Er(e){return[...new Set(e)]}var wt={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function di(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function Jn(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Mt(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Pr(e,t){return{...e,rotationDeg:di(e.rotationDeg+t)}}function pn(e,t,n,r,o){if(!Number.isFinite(n)||n<=0)return t;let i=Lt(e),s=Jn(t.scale*n,o);if(s===t.scale)return t;let c=s/t.scale,a=r.x-i.x,l=r.y-i.y;return{...t,scale:s,translateX:(1-c)*a+c*t.translateX,translateY:(1-c)*l+c*t.translateY}}function Dt(e,t,n){let r=Lt(e),o=Dl(e.contentBounds,r,t.rotationDeg),i=Math.max(e.width-n.fitPadding*2,1),s=Math.max(e.height-n.fitPadding*2,1),c=Math.max(o.width,1),a=Math.max(o.height,1),l=Jn(Math.min(i/c,s/a),n),p=we({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:l,translateX:r.x-(r.x+(p.x-r.x)*l),translateY:r.y-(r.y+(p.y-r.y)*l)}}function Cr(e,t,n,r){let o=e.objects.find(a=>a.objectId===n&&!a.hidden);if(!o)return t;let i=Lt(e),s=Jn(Math.max(t.scale,1.8),r),c=we({x:o.x,y:o.y},i,t.rotationDeg);return{...t,scale:s,translateX:i.x-(i.x+(c.x-i.x)*s),translateY:i.y-(i.y+(c.y-i.y)*s),selectedObjectId:n}}function Fr(e,t){let n=Lt(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function vt(e,t,n){let r=Lt(e),o={x:n.x-t.translateX,y:n.y-t.translateY},i={x:o.x-r.x,y:o.y-r.y},s={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},c=we({x:s.x,y:s.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+c.x,y:r.y+c.y}}function fn(e,t){let n=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(c=>vt(e,t,c)),r=Math.min(...n.map(c=>c.x)),o=Math.min(...n.map(c=>c.y)),i=Math.max(...n.map(c=>c.x)),s=Math.max(...n.map(c=>c.y));return{minX:r,minY:o,maxX:i,maxY:s,width:i-r,height:s-o,centerX:r+(i-r)/2,centerY:o+(s-o)/2}}function Lt(e){return{x:e.width/2,y:e.height/2}}function Dl(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(a=>we(a,t,n)),o=Math.min(...r.map(a=>a.x)),i=Math.min(...r.map(a=>a.y)),s=Math.max(...r.map(a=>a.x)),c=Math.max(...r.map(a=>a.y));return{minX:o,minY:i,maxX:s,maxY:c,width:s-o,height:c-i,centerX:o+(s-o)/2,centerY:i+(c-i)/2}}var Vr="worldorbit-camera-root";function ze(e,t={}){let n=Sr(t.theme),r=Hl(t.preset??e.renderPreset??void 0),o=Or({...r.layers,...t.layers}),i=t.subtitle??e.subtitle,s=Zn(e,t.filter??null),c=e.objects.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>o.structures||!Qn(v.object)).sort((v,A)=>v.sortKey-A.sortKey),a=e.labels.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>o.structures||!Qn(v.object)),l=Tl(c),p=o.orbits?Al(e,s,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>o.structures||!Qn(v.object)).map(v=>`<line class="wo-leader wo-leader-${v.mode}" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${de(v.renderId)}" data-group-id="${fe(v.groupId??"")}" />`).join(""):"",w=o.relations?e.relations.filter(v=>!v.hidden).filter(v=>s.has(v.fromObjectId)&&s.has(v.toObjectId)).map(v=>`<line class="wo-relation" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${de(v.renderId)}" data-relation-id="${fe(v.relationId)}" />`).join(""):"",x=o.events?e.events.filter(v=>!v.hidden).map(v=>Ll(e,v,s,n)).join(""):"",S=o.objects?c.map(v=>Pl(v,t.selectedObjectId??null,n)).join(""):"",k=o.labels?a.map(v=>Cl(e,v,t.selectedObjectId??null)).join(""):"",C=o.metadata?`<text class="wo-title" x="56" y="64">${de(e.title)}</text>
|
|
12
|
+
<text class="wo-subtitle" x="56" y="88">${de(i)}</text>
|
|
13
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${de(Gl(e))}</text>`:"",q=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
14
14
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
15
|
-
${o.guides?
|
|
16
|
-
<title id="worldorbit-title">${
|
|
17
|
-
<desc id="worldorbit-desc">A ${
|
|
15
|
+
${o.guides?ql(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
|
|
16
|
+
<title id="worldorbit-title">${de(e.title)}</title>
|
|
17
|
+
<desc id="worldorbit-desc">A ${de(e.viewMode)} WorldOrbit render with ${c.length} visible objects.</desc>
|
|
18
18
|
<defs>
|
|
19
19
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
20
|
-
<stop offset="0%" stop-color="${
|
|
21
|
-
<stop offset="100%" stop-color="${
|
|
20
|
+
<stop offset="0%" stop-color="${n.backgroundStart}" />
|
|
21
|
+
<stop offset="100%" stop-color="${n.backgroundEnd}" />
|
|
22
22
|
</linearGradient>
|
|
23
23
|
<radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
|
|
24
|
-
<stop offset="0%" stop-color="${
|
|
25
|
-
<stop offset="100%" stop-color="${
|
|
24
|
+
<stop offset="0%" stop-color="${n.starGlow}" stop-opacity="0.95" />
|
|
25
|
+
<stop offset="100%" stop-color="${n.starCore}" stop-opacity="0" />
|
|
26
26
|
</radialGradient>
|
|
27
27
|
<radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
|
|
28
|
-
<stop offset="0%" stop-color="${
|
|
28
|
+
<stop offset="0%" stop-color="${n.backgroundGlow}" />
|
|
29
29
|
<stop offset="100%" stop-color="transparent" />
|
|
30
30
|
</radialGradient>
|
|
31
|
-
${
|
|
31
|
+
${l}
|
|
32
32
|
</defs>
|
|
33
33
|
<style>
|
|
34
34
|
.wo-bg { fill: url(#wo-bg); }
|
|
35
35
|
.wo-bg-glow { fill: url(#wo-bg-glow); }
|
|
36
|
-
.wo-grid { fill: none; stroke: ${
|
|
37
|
-
.wo-orbit { fill: none; stroke: ${
|
|
36
|
+
.wo-grid { fill: none; stroke: ${n.guide}; stroke-width: 1; }
|
|
37
|
+
.wo-orbit { fill: none; stroke: ${n.orbit}; stroke-width: 1.5; }
|
|
38
38
|
.wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
|
|
39
39
|
.wo-orbit-front { opacity: 0.9; }
|
|
40
|
-
.wo-orbit-band { stroke: ${
|
|
41
|
-
.wo-relation { stroke: ${
|
|
42
|
-
.wo-
|
|
43
|
-
.wo-
|
|
44
|
-
.wo-label
|
|
45
|
-
.wo-
|
|
46
|
-
.wo-
|
|
47
|
-
.wo-
|
|
40
|
+
.wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
|
|
41
|
+
.wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
|
|
42
|
+
.wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
|
|
43
|
+
.wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
|
|
44
|
+
.wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
45
|
+
.wo-leader { stroke: ${n.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
|
|
46
|
+
.wo-label { fill: ${n.ink}; font-family: ${n.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
|
|
47
|
+
.wo-label-secondary { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
|
|
48
|
+
.wo-title { fill: ${n.ink}; font: 700 24px ${n.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
|
|
49
|
+
.wo-subtitle { fill: ${n.muted}; font: 500 12px ${n.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
|
|
50
|
+
.wo-meta { fill: ${n.muted}; font: 500 11px ${n.fontFamily}; letter-spacing: 0.06em; }
|
|
48
51
|
.wo-object { cursor: pointer; outline: none; }
|
|
49
52
|
.wo-object:focus-visible .wo-selection-ring,
|
|
50
53
|
.wo-object:hover .wo-selection-ring,
|
|
51
54
|
.wo-object-selected .wo-selection-ring { display: block; }
|
|
52
|
-
.wo-object-selected .wo-selection-ring { stroke: ${
|
|
53
|
-
.wo-object-label-selected .wo-label { fill: ${
|
|
54
|
-
.wo-object-label-selected .wo-label-secondary { fill: ${
|
|
55
|
+
.wo-object-selected .wo-selection-ring { stroke: ${n.selected}; }
|
|
56
|
+
.wo-object-label-selected .wo-label { fill: ${n.accent}; }
|
|
57
|
+
.wo-object-label-selected .wo-label-secondary { fill: ${n.selected}; }
|
|
55
58
|
.wo-chain-selected .wo-selection-ring,
|
|
56
59
|
.wo-chain-hover .wo-selection-ring { display: block; }
|
|
57
60
|
.wo-ancestor-selected .wo-selection-ring,
|
|
58
61
|
.wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
|
|
59
62
|
.wo-chain-selected .wo-label,
|
|
60
|
-
.wo-chain-hover .wo-label { fill: ${
|
|
63
|
+
.wo-chain-hover .wo-label { fill: ${n.accent}; }
|
|
61
64
|
.wo-ancestor-selected .wo-label,
|
|
62
|
-
.wo-ancestor-hover .wo-label { fill: ${
|
|
65
|
+
.wo-ancestor-hover .wo-label { fill: ${n.ink}; opacity: 0.82; }
|
|
63
66
|
.wo-orbit-related-selected,
|
|
64
|
-
.wo-orbit-related-hover { stroke: ${
|
|
67
|
+
.wo-orbit-related-hover { stroke: ${n.accentStrong}; opacity: 1; }
|
|
65
68
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
66
69
|
.wo-object-image { pointer-events: none; }
|
|
67
70
|
</style>
|
|
68
|
-
${
|
|
69
|
-
${
|
|
71
|
+
${q}
|
|
72
|
+
${C}
|
|
70
73
|
<g data-worldorbit-world="true">
|
|
71
|
-
<g data-worldorbit-camera-root="${
|
|
74
|
+
<g data-worldorbit-camera-root="${Vr}" id="${Vr}">
|
|
72
75
|
<g data-worldorbit-world-content="true">
|
|
73
|
-
${o.orbits?`<g data-layer-id="orbits-back">${
|
|
74
|
-
${o.guides?`<g data-layer-id="guides">${
|
|
75
|
-
${o.relations?`<g data-layer-id="relations">${
|
|
76
|
-
${o.
|
|
77
|
-
${o.
|
|
76
|
+
${o.orbits?`<g data-layer-id="orbits-back">${p.back}</g>`:""}
|
|
77
|
+
${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
78
|
+
${o.relations?`<g data-layer-id="relations">${w}</g>`:""}
|
|
79
|
+
${o.events?`<g data-layer-id="events">${x}</g>`:""}
|
|
80
|
+
${o.objects?`<g data-layer-id="objects">${S}</g>`:""}
|
|
81
|
+
${o.orbits?`<g data-layer-id="orbits-front">${p.front}</g>`:""}
|
|
78
82
|
${o.labels?`<g data-layer-id="labels">${k}</g>`:""}
|
|
79
83
|
</g>
|
|
80
84
|
</g>
|
|
81
85
|
</g>
|
|
82
|
-
</svg>`}function
|
|
83
|
-
|
|
84
|
-
${
|
|
85
|
-
${
|
|
86
|
-
|
|
87
|
-
${
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
<
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
<circle cx="${t}" cy="${
|
|
97
|
-
<circle cx="${t}" cy="${
|
|
98
|
-
<circle cx="${t}" cy="${
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
86
|
+
</svg>`}function Ll(e,t,n,r){let o=t.objectIds.filter(a=>n.has(a)).map(a=>e.objects.find(l=>l.objectId===a&&!l.hidden)).filter(Boolean);if(o.length===0)return"";let i=t.event.color||r.accent,s=t.event.label||t.event.id,c=o.map(a=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${a.x}" y2="${a.y}" stroke="${fe(i)}" data-event-id="${fe(t.eventId)}" data-object-id="${fe(a.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${de(t.renderId)}" data-event-id="${fe(t.eventId)}">
|
|
87
|
+
${c}
|
|
88
|
+
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${fe(i)}" />
|
|
89
|
+
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${de(s)}</text>
|
|
90
|
+
</g>`}function Al(e,t,n){let r=[],o=[];for(let i of e.orbitVisuals.filter(s=>!s.hidden&&t.has(s.objectId)&&(n||!Qn(s.object)))){let s=i.bandThickness??(i.band?10:1.5),c=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",a=`data-render-id="${de(i.renderId)}" data-orbit-object-id="${fe(i.objectId)}" data-parent-id="${fe(i.parentId)}" data-group-id="${fe(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&r.push(`<path class="${c} wo-orbit-back" d="${i.backArcPath}" stroke-width="${s}" ${a} />`),i.frontArcPath&&o.push(`<path class="${c} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${s}" ${a} />`);continue}if(i.kind==="ellipse"){let l=i.rx??i.radius??0,p=i.ry??i.radius??0;o.push(`<ellipse class="${c} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${l}" ry="${p}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${s}" ${a} />`);continue}o.push(`<circle class="${c} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${s}" ${a} />`)}return{back:r.join(""),front:o.join("")}}function Tl(e){return e.filter(t=>!!t.imageHref).map(t=>Rl(t)).join("")}function Pl(e,t,n){let{object:r,x:o,y:i,radius:s,visualRadius:c}=e,a=t===e.objectId?" wo-object-selected":"",l=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",p=_l(e,n),f=Vl(e),w=f?ui(r,o,i,s,p,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${l}${a}" data-object-id="${de(e.objectId)}" data-parent-id="${fe(e.parentId??"")}" data-group-id="${fe(e.groupId??"")}" data-render-id="${de(e.renderId)}" tabindex="0" role="button" aria-label="${de(`${r.type} ${e.objectId}`)}">
|
|
91
|
+
<circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${c+8}" />
|
|
92
|
+
${Fl(e,p)}
|
|
93
|
+
${ui(r,o,i,s,p)}
|
|
94
|
+
${f}
|
|
95
|
+
${w}
|
|
96
|
+
</g>`}function Cl(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${de(t.objectId)}" data-group-id="${fe(t.groupId??"")}" data-render-id="${de(t.renderId)}">
|
|
97
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${de(t.label)}</text>
|
|
98
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${de(t.secondaryLabel)}</text>
|
|
99
|
+
</g>`}function ui(e,t,n,r,o,i={}){let s=i.outlineOnly?"transparent":o.fill,c=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
100
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${c}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
101
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${gi(t,n,r)}" fill="${s}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let a=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?a==="black-hole"||a==="nebula"||a==="galaxy"||a==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${Rr(t,n,r)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:a==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
|
|
102
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="2" />`:a==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${o.halo??"none"}" stroke="none" />
|
|
103
|
+
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${s}" stroke="${o.stroke}" stroke-width="1.2" />
|
|
104
|
+
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${o.core??"#fff"}" stroke="none" />`:a==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${s}" stroke="${o.stroke}" stroke-width="1" />
|
|
105
|
+
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${o.core??"#fff"}" stroke="none" />`:a==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${o.halo??"none"}" stroke="none" />
|
|
106
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${Rr(t,n,r)}" fill="${s}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Fl(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:o,radius:i}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Vl(e){if(!e.imageHref)return"";let t=Bl(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${fe(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${fe(mi(e))})" />`}function Rl(e){let{x:t,y:n,radius:r}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":o=`<polygon points="${gi(t,n,r)}" />`;break;case"phenomenon":o=`<polygon points="${Rr(t,n,r)}" />`;break;default:return""}return`<clipPath id="${fe(mi(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function Bl(e){let{object:t,x:n,y:r,radius:o}=e;switch(t.type){case"structure":return{x:n-o,y:r-o,width:o*2,height:o*2};case"phenomenon":return{x:n-o*1.2,y:r-o*1.2,width:o*2.4,height:o*2.4};default:return{x:n-o,y:r-o,width:o*2,height:o*2}}}function _l(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Nl(e.object.type,n,t),o=e.fillColor&&Kl(e.fillColor)?e.fillColor:r.fill,i=pi(e.object.properties.albedo),s=pi(e.object.properties.temperature),c=zl(o,s,i,e.object.type),a=mn(c,"#ffffff",.4)??r.stroke,l=Yl(e.object.properties.atmosphere),p=e.object.type==="star"?fi(mn(c,"#fff2cb",.4)??c,.82):void 0;return{fill:c,stroke:a,glow:p,atmosphere:l,tail:e.object.type==="comet"?fi(mn(c,"#ffffff",.5)??c,.72):void 0}}function Nl(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ul(t)}}function Ul(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function zl(e,t,n,r){let o=e;if(t!==null){let i=Wl(t,r);o=mn(o,i,r==="star"?.42:.2)??o}if(n!==null){let i=Math.min(Math.max(n,0),1);o=mn(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function Wl(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Yl(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function Hl(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function pi(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function mi(e){return`${e.renderId}-clip`}function gi(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Rr(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function ql(e,t){let n=Array.from({length:10},(o,i)=>{let s=90+i*((e-180)/9);return`<line class="wo-grid" x1="${s}" y1="120" x2="${s}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(o,i)=>{let s=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${s}" x2="${e-56}" y2="${s}" />`}).join("");return`${n}${r}`}function Gl(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Qn(e){return e.type==="structure"||e.type==="phenomenon"}function mn(e,t,n){let r=Br(e),o=Br(t);if(!r||!o)return;let i=Math.min(Math.max(n,0),1);return Xl({r:Math.round(r.r+(o.r-r.r)*i),g:Math.round(r.g+(o.g-r.g)*i),b:Math.round(r.b+(o.b-r.b)*i)})}function fi(e,t){let n=Br(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Br(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function Xl(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Kl(e){return!!e.trim()}function de(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function fe(e){return de(e)}var At=180,Tt=120,hi=10;function bi(e,t,n){let r=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},o=Math.min((At-hi*2)/Math.max(r.width,1),(Tt-hi*2)/Math.max(r.height,1)),i=(At-r.width*o)/2-r.minX*o,s=(Tt-r.height*o)/2-r.minY*o,c=fn(e,t),a=n.map(l=>{let p=l.x*o+i,f=l.y*o+s,w=Math.max(1.4,Math.min(l.visualRadius*o,5.2)),x=l.fillColor??Zl(l.object.type);return`<circle cx="${Ae(p)}" cy="${Ae(f)}" r="${Ae(w)}" fill="${x}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${At}px;height:${Tt}px;padding:8px;border-radius:16px;background:rgba(5, 14, 22, 0.78);border:1px solid rgba(179, 216, 255, 0.16);box-shadow:0 14px 28px rgba(0, 0, 0, 0.24);backdrop-filter:blur(8px);pointer-events:none;">
|
|
107
|
+
<svg width="${At}" height="${Tt}" viewBox="0 0 ${At} ${Tt}" role="presentation" aria-hidden="true">
|
|
108
|
+
<rect x="0.5" y="0.5" width="${At-1}" height="${Tt-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
109
|
+
<rect x="${Ae(r.minX*o+i)}" y="${Ae(r.minY*o+s)}" width="${Ae(r.width*o)}" height="${Ae(r.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
110
|
+
${a}
|
|
111
|
+
<rect x="${Ae(c.minX*o+i)}" y="${Ae(c.minY*o+s)}" width="${Ae(c.width*o)}" height="${Ae(c.height*o)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
|
|
104
112
|
</svg>
|
|
105
|
-
</div>`}function
|
|
113
|
+
</div>`}function Zl(e){switch(e){case"star":return"#ffcc67";case"planet":return"#72b7ff";case"moon":return"#c7d7ea";case"belt":case"ring":return"#d9aa74";case"asteroid":return"#a7a5b8";case"comet":return"#9ce7ff";case"structure":return"#ff7f5f";case"phenomenon":return"#78ffd7"}}function Ae(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Jl=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function wi(e){return{objectId:e.objectId,title:e.objectId,typeLabel:rd(e.object.type),imageHref:e.renderObject.imageHref??null,description:td(e),tags:ed(e.object.properties.tags),fields:Ql(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function vi(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${Re(i)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${Re(i.label)}</dt><dd>${Re(i.value)}</dd></div>`).join("")}</dl>`:"",o=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${Re(e.objectId)}">
|
|
106
114
|
<div class="wo-tooltip-head">
|
|
107
|
-
${e.imageHref?`<img class="wo-tooltip-image" src="${
|
|
115
|
+
${e.imageHref?`<img class="wo-tooltip-image" src="${id(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${Re(e.typeLabel.slice(0,1))}</div>`}
|
|
108
116
|
<div class="wo-tooltip-heading">
|
|
109
|
-
<strong>${
|
|
110
|
-
<span>${
|
|
117
|
+
<strong>${Re(e.title)}</strong>
|
|
118
|
+
<span>${Re(e.typeLabel)}</span>
|
|
111
119
|
</div>
|
|
112
120
|
</div>
|
|
113
|
-
${e.description?`<p class="wo-tooltip-description">${
|
|
114
|
-
${r}
|
|
121
|
+
${e.description?`<p class="wo-tooltip-description">${Re(e.description)}</p>`:""}
|
|
115
122
|
${n}
|
|
116
|
-
${
|
|
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("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function xc(e){return Le(e)}var jt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},ni="worldorbit-viewer-tooltip-style";function St(e,t){if(jc(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let n={minScale:t.minScale??jt.minScale,maxScale:t.maxScale??jt.maxScale,fitPadding:t.fitPadding??jt.fitPadding},o={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??jt.panStep,zoomStep:t.zoomStep??jt.zoomStep,rotationStep:t.rotationStep??jt.rotationStep},i={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:De(t.initialFilter),subtitle:t.subtitle},l=e.getAttribute("tabindex"),a=e.style.touchAction,s=e.style.position,p=$c(t),c=sr(p,i),u={...ct},v=null,x=null,k=null,I=null,V=!1,$=null,S=null,E=0,X=!1,W=new Map,U=null,H=null,C=null,ie=null,J=null,ee=null;l===null&&(e.tabIndex=0),Sc(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":a,e.style.position||(e.style.position="relative");let K=f=>{if(!o.pointer||X)return;f.preventDefault(),e.focus();let h=Ae(f.clientX,f.clientY),w=lr(Math.exp(-f.deltaY*.002),.6,1.6);q(or(c,u,w,h,n))},Te=f=>{if(X)return;let h=f.pointerType==="touch";if(h&&!o.touch||!h&&!o.pointer||!h&&f.button!==0)return;e.focus(),e.setPointerCapture?.(f.pointerId);let w=Oe(f.clientX,f.clientY);if(h){W.set(f.pointerId,w),W.size===2?U=ai(c,u,W):W.size===1&&(E=0,V=!1);return}$=f.pointerId,S=w,E=0,V=!1},Je=f=>{if(X)return;if(f.pointerType==="touch"){if(!o.touch||!W.has(f.pointerId))return;let P=W.get(f.pointerId),nt=Oe(f.clientX,f.clientY);if(W.set(f.pointerId,nt),W.size===2){U||(U=ai(c,u,W));let he=li(W),Ue=he.distance/Math.max(U.startDistance,1),Ft=or(c,U.startState,Ue,U.startCenter,n),Vt=he.center.x-U.startViewportCenter.x,Rt=he.center.y-U.startViewportCenter.y;q(vt(Ft,Vt,Rt))}else if(W.size===1){let he=nt.x-P.x,Ue=nt.y-P.y;E+=Math.abs(he)+Math.abs(Ue),E>2&&(V=!0),q(vt(u,he,Ue))}return}if(!o.pointer||$!==f.pointerId||!S)return;let w=Oe(f.clientX,f.clientY),Y=w.x-S.x,R=w.y-S.y;E+=Math.abs(Y)+Math.abs(R),S=w,E>2&&(V=!0),q(vt(u,Y,R))},Ve=f=>{if(f.pointerType==="touch"){W.delete(f.pointerId),W.size<2&&(U=null);return}$===f.pointerId&&($=null,S=null)},pt=f=>{if(!o.selection||X)return;if(V){V=!1;return}let h=Wr(f.target);Se(h),o.tooltipMode==="pinned"&&(C=h,ge())},F=f=>{let h=Wr(f.target);se(h)},te=()=>{se(null)},Qe=f=>{let h=Wr(f.target);h&&se(h)},D=()=>{se(null)},O=f=>{if(!o.keyboard||X)return;let h=Wr(f.target);if((f.key==="Enter"||f.key===" ")&&h){f.preventDefault(),Se(h),o.tooltipMode==="pinned"&&(C=h,ge());return}switch(f.key){case"Escape":o.tooltipMode==="pinned"&&C&&(f.preventDefault(),C=null,ge());return;case"+":case"=":f.preventDefault(),j.zoomBy(o.zoomStep);return;case"-":f.preventDefault(),j.zoomBy(1/o.zoomStep);return;case"ArrowLeft":f.preventDefault(),j.panBy(-o.panStep,0);return;case"ArrowRight":f.preventDefault(),j.panBy(o.panStep,0);return;case"ArrowUp":f.preventDefault(),j.panBy(0,-o.panStep);return;case"ArrowDown":f.preventDefault(),j.panBy(0,o.panStep);return;case"[":f.preventDefault(),j.rotateBy(-o.rotationStep);return;case"]":f.preventDefault(),j.rotateBy(o.rotationStep);return;case"f":case"F":f.preventDefault(),j.fitToSystem();return;case"0":f.preventDefault(),j.resetView();return}};e.addEventListener("wheel",K,{passive:!1}),e.addEventListener("pointerdown",Te),e.addEventListener("pointermove",Je),e.addEventListener("pointerup",Ve),e.addEventListener("pointercancel",Ve),e.addEventListener("click",pt),e.addEventListener("mouseover",F),e.addEventListener("mouseleave",te),e.addEventListener("focusin",Qe),e.addEventListener("focusout",D),e.addEventListener("keydown",O);let j={setSource(f){p={kind:"source",value:f},c=sr(p,i),ee=null,ae(!0)},setDocument(f){p={kind:"document",value:f},c=sr(p,i),ee=null,ae(!0)},setScene(f){p={kind:"scene",value:f},c=f,ee=null,ae(!0)},getScene(){return c},getRenderOptions(){return Ic(i)},listViewpoints(){return c.viewpoints.slice()},getActiveViewpoint(){return _e(ee)},goToViewpoint(f){let h=_e(f);if(!h)return!1;let w={},Y=Sn(h);if(h.preset!==null&&(w.preset=h.preset),p.kind!=="scene"&&h.projection!==c.projection&&(w.projection=h.projection),Y&&(w.layers=Y),ee=h.id,Object.keys(w).length>0){let P=ii(w);i=oi(i,w),p.kind!=="scene"&&P&&(c=sr(p,i)),ae(P)}Ne(On(h),!1,!1);let R=Et(h);return q(R),Se(h.selectedObjectId??h.objectId??null,!1),t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(Z(u.selectedObjectId)),Pt(),ve(),!0},search(f,h=12){return In(c,f,h)},getFilter(){return i.filter?{...i.filter}:null},setFilter(f){Ne(f,!0,!0)},getVisibleObjects(){return Me()},getFocusPath(f){return Be(f)},getObjectDetails(f){return Z(f)},getSelectionDetails(){return Z(u.selectedObjectId)},getTooltipDetails(){return J},getAtlasState(){return zo(u,i,i.filter??null,ee)},setAtlasState(f){let h=typeof f=="string"?jn(f):f;h.viewpointId&&j.goToViewpoint(h.viewpointId),j.setRenderOptions(h.renderOptions),Ne(h.filter??null,!1,!1),q(me({...u,...h.viewerState})),Se(h.viewerState.selectedObjectId??null,!1),Pt(),t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(Z(u.selectedObjectId)),ve()},serializeAtlasState(){return kn(j.getAtlasState())},captureBookmark(f,h){return Wo(f,h,j.getAtlasState())},applyBookmark(f){return typeof f=="string"?(j.setAtlasState(f),!0):(j.setAtlasState(f.atlasState),!0)},setRenderOptions(f){let h=ii(f);i=oi(i,f),p.kind!=="scene"&&h&&(c=sr(p,i)),ae(h)},getState(){return{...u}},setState(f){q(me({...u,...f}))},zoomBy(f,h){q(or(c,u,f,h??{x:c.width/2,y:c.height/2},n))},panBy(f,h){q(vt(u,f,h))},rotateBy(f){q(Mn(u,f))},fitToSystem(){q(xt(c,u,n))},focusObject(f){ee=null,q(Dn(c,u,f,n)),Se(f),o.tooltipMode==="pinned"&&(C=Q(f)?.objectId??null,ge())},pinTooltip(f){C=Q(f)?.objectId??null,ge()},resetView(){let f=xt(c,{...ct},n);ee=null,q(f),Se(null),C=null,ge()},exportSvg(){return Fe(c,{...i,filter:i.filter??null,selectedObjectId:u.selectedObjectId})},destroy(){X||(X=!0,e.removeEventListener("wheel",K),e.removeEventListener("pointerdown",Te),e.removeEventListener("pointermove",Je),e.removeEventListener("pointerup",Ve),e.removeEventListener("pointercancel",Ve),e.removeEventListener("click",pt),e.removeEventListener("mouseover",F),e.removeEventListener("mouseleave",te),e.removeEventListener("focusin",Qe),e.removeEventListener("focusout",D),e.removeEventListener("keydown",O),I?.remove(),I=null,k?.remove(),k=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=a,e.style.position=s,l===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",l))}};return ae(!0),t.initialViewpointId?j.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?j.focusObject(t.initialSelectionObjectId):ve(),j;function ae(f){if(e.innerHTML=Fe(c,{...i,filter:i.filter??null,selectedObjectId:u.selectedObjectId}),v=e.querySelector('[data-worldorbit-svg="true"]'),x=e.querySelector("#worldorbit-camera-root"),k=null,I=null,o.minimap&&(k=document.createElement("div"),k.dataset.worldorbitMinimapRoot="true",e.append(k)),o.tooltipMode!=="disabled"&&(I=document.createElement("div"),I.className="wo-viewer-tooltip-root",I.dataset.worldorbitTooltip="true",I.hidden=!0,I.addEventListener("click",wr),e.append(I)),!v||!x)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");u=f?xt(c,{...ct},n):me(u),Se(u.selectedObjectId&&Q(u.selectedObjectId)?u.selectedObjectId:null,!1),se(H&&Q(H)?H:null,!1),C=C&&Q(C)?C:null,gr(),mt(),Pt(),t.onViewChange?.({...u}),ve()}function q(f){u=me(f),gr(),t.onViewChange?.({...u}),ve()}function me(f){return{scale:lr(f.scale,n.minScale,n.maxScale),rotationDeg:si(f.rotationDeg),translateX:Number.isFinite(f.translateX)?f.translateX:u.translateX,translateY:Number.isFinite(f.translateY)?f.translateY:u.translateY,selectedObjectId:f.selectedObjectId&&Q(f.selectedObjectId)?f.selectedObjectId:null}}function gr(){x&&(x.setAttribute("transform",Ln(c,u)),Ct(),ge())}function Se(f,h=!0){u.selectedObjectId&&e.querySelector(`[data-object-id="${cr(u.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),u={...u,selectedObjectId:f&&Q(f)?f:null},u.selectedObjectId&&e.querySelector(`[data-object-id="${cr(u.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),et(),ge(),h&&(t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(Z(u.selectedObjectId)),t.onViewChange?.({...u}),ve())}function se(f,h=!0){H===f&&h||(H=f&&Q(f)?f:null,et(),ge(),h&&(t.onHoverChange?.(Q(H)),t.onHoverDetailsChange?.(Z(H))))}function At(){return Q(u.selectedObjectId)}function Q(f){if(!f)return null;let h=tt();return c.objects.find(w=>w.objectId===f&&!w.hidden&&h.has(w.objectId))??null}function Z(f){let h=Q(f);return h?{objectId:h.objectId,object:h.object,renderObject:h,label:c.labels.find(w=>w.objectId===h.objectId&&!w.hidden)??null,group:c.groups.find(w=>w.renderId===h.groupId)??null,semanticGroups:c.semanticGroups.filter(w=>h.semanticGroupIds.includes(w.id)),orbit:c.orbitVisuals.find(w=>w.objectId===h.objectId&&!w.hidden)??null,relatedOrbits:c.orbitVisuals.filter(w=>!w.hidden&&(w.objectId===h.objectId||h.ancestorIds.includes(w.objectId)||h.childIds.includes(w.objectId))),relations:c.relations.filter(w=>!w.hidden&&(w.fromObjectId===h.objectId||w.toObjectId===h.objectId)),parent:Q(h.parentId),children:h.childIds.map(w=>Q(w)).filter(Boolean),ancestors:h.ancestorIds.map(w=>Q(w)).filter(Boolean),focusPath:Be(h.objectId)}:null}function et(){for(let f of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))f.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Re(u.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Re(H,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Re(f,h){let w=Z(f);if(!w)return;let Y=new Set([w.objectId,...w.renderObject.childIds,...w.renderObject.ancestorIds]);for(let R of Y)for(let P of e.querySelectorAll(`[data-object-id="${cr(R)}"]`))P.classList.add(h.objectClass);for(let R of w.ancestors)for(let P of e.querySelectorAll(`[data-object-id="${cr(R.objectId)}"]`))P.classList.add(h.ancestorClass);for(let R of w.relatedOrbits)for(let P of e.querySelectorAll(`[data-orbit-object-id="${cr(R.objectId)}"]`))P.classList.add(h.orbitClass)}function Oe(f,h){if(!v)return{x:c.width/2,y:c.height/2};let w=v.getBoundingClientRect();return!w.width||!w.height?{x:c.width/2,y:c.height/2}:{x:(f-w.left)/w.width*c.width,y:(h-w.top)/w.height*c.height}}function Ae(f,h){return dt(c,u,Oe(f,h))}function tt(){return Nr(c,i.filter??null)}function Me(){let f=tt();return c.objects.filter(h=>!h.hidden&&f.has(h.objectId))}function Be(f){let h=c.objects.find(w=>w.objectId===f&&!w.hidden);return h?[...h.ancestorIds,h.objectId].map(w=>Q(w)).filter(Boolean):[]}function _e(f){return c.viewpoints.find(h=>h.id===f)??null}function Et(f){let h=si(f.rotationDeg),w=f.scale!==null&&f.scale!==void 0?lr(f.scale,n.minScale,n.maxScale):null,Y=f.objectId&&c.objects.find(P=>P.objectId===f.objectId&&!P.hidden);if(Y)return ft({x:Y.x,y:Y.y},w??Math.max(1.8,ct.scale),h,f.selectedObjectId??Y.objectId);let R=xt(c,{...ct,rotationDeg:h},n);return w===null?{...R,rotationDeg:h,selectedObjectId:f.selectedObjectId??null}:ft({x:c.contentBounds.centerX,y:c.contentBounds.centerY},w,h,f.selectedObjectId??null)}function ft(f,h,w,Y){let R={x:c.width/2,y:c.height/2},P=ue(f,R,w);return{scale:h,rotationDeg:w,translateX:R.x-(R.x+(P.x-R.x)*h),translateY:R.y-(R.y+(P.y-R.y)*h),selectedObjectId:Y}}function Ne(f,h,w){i={...i,filter:De(f)},w&&(ee=null),ae(!1)}function mt(){t.onFilterChange?.(i.filter??null,Me())}function Pt(){t.onViewpointChange?.(_e(ee))}function ve(){t.onAtlasStateChange?.(j.getAtlasState())}function Ct(){!o.minimap||!k||(k.innerHTML=Qo(c,u,Me()))}function ge(){if(o.tooltipMode==="disabled"||!I){rt(null);return}let f=Ee();if(!f){I.hidden=!0,I.innerHTML="",I.removeAttribute("data-mode"),rt(null);return}let h=Z(f.objectId);if(!h){I.hidden=!0,I.innerHTML="",I.removeAttribute("data-mode"),rt(null);return}let w=ti(h);ie=f.objectId,I.hidden=!1,I.dataset.mode=f.mode,I.classList.toggle("is-pinned",f.mode==="pinned"),I.style.pointerEvents="auto",I.style.visibility="hidden",hr(I,w,f.mode),br(I,h.renderObject),I.style.visibility="visible",rt(w)}function Ee(){return C&&Q(C)?{objectId:C,mode:"pinned"}:H&&Q(H)?{objectId:H,mode:"hover"}:null}function hr(f,h,w){let Y=t.tooltipRenderer?.(h,w);f.innerHTML="",typeof Y=="string"?f.innerHTML=Y:Y instanceof HTMLElement?f.append(Y):f.innerHTML=ri(h,w);let R=document.createElement("div");if(R.className="wo-tooltip-actions",w==="pinned"){let P=document.createElement("button");P.type="button",P.className="wo-tooltip-action",P.dataset.tooltipAction="unpin",P.textContent="Unpin",R.append(P)}else{let P=document.createElement("button");P.type="button",P.className="wo-tooltip-action",P.dataset.tooltipAction="pin",P.dataset.objectId=h.objectId,P.textContent="Pin",R.append(P)}R.childElementCount>0&&f.append(R)}function br(f,h){if(!v)return;let w={x:h.anchorX??h.x,y:h.anchorY??h.y-Math.max(h.visualRadius,h.radius)},Y=yr(w),R=v.getBoundingClientRect(),P=e.getBoundingClientRect(),nt=R.left-P.left+Y.x/Math.max(c.width,1)*R.width,he=R.top-P.top+Y.y/Math.max(c.height,1)*R.height,Ue=Math.max(e.clientWidth-f.offsetWidth-12,12),Ft=Math.max(e.clientHeight-f.offsetHeight-12,12),Vt=he>e.clientHeight*.48,Rt=lr(nt+18,12,Ue),en=lr(Vt?he-f.offsetHeight-18:he+18,12,Ft);f.style.left=`${Rt}px`,f.style.top=`${en}px`}function yr(f){let h={x:c.width/2,y:c.height/2},w=ue(f,h,u.rotationDeg);return{x:h.x+(w.x-h.x)*u.scale+u.translateX,y:h.y+(w.y-h.y)*u.scale+u.translateY}}function wr(f){let h=f.target?.closest("[data-tooltip-action]");if(h){switch(f.preventDefault(),f.stopPropagation(),h.dataset.tooltipAction){case"pin":C=h.dataset.objectId??ie;break;case"unpin":C=null;break}ge()}}function rt(f){let h=J?.objectId!==f?.objectId||J?.description!==f?.description||J?.imageHref!==f?.imageHref;J=f,ie=f?.objectId??null,h&&t.onTooltipChange?.(f)}}function $c(e){if(e.scene)return{kind:"scene",value:e.scene};if(e.document)return{kind:"document",value:e.document};if(e.source)return{kind:"source",value:e.source};throw new Error("Interactive viewer requires an initial render input.")}function sr(e,t){switch(e.kind){case"scene":return e.value;case"document":return ye(e.value,t);case"source":{let r=We(e.value);return ye(r.document,kc(r,t))}}}function Ic(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme}}function oi(e,t){return{...e,...t,filter:t.filter!==void 0?De(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function ii(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0}function kc(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function ai(e,t,r){let{center:n,distance:o}=li(r);return{startState:{...t},startCenter:dt(e,t,n),startViewportCenter:n,startDistance:o}}function li(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[r,n]=t;return{center:{x:(r.x+n.x)/2,y:(r.y+n.y)/2},distance:Math.hypot(n.x-r.x,n.y-r.y)}}function Wr(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function jc(e){if(typeof window>"u"||typeof document>"u")throw new Error("createInteractiveViewer can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("Interactive viewer requires an HTMLElement container.")}function lr(e,t,r){return Math.min(Math.max(e,t),r)}function si(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function cr(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Sc(){if(typeof document>"u"||document.getElementById(ni))return;let e=document.createElement("style");e.id=ni,e.textContent=`
|
|
123
|
+
${r}
|
|
124
|
+
${o.length?`<p class="wo-tooltip-relations">${Re(o.join(" - "))}</p>`:""}
|
|
125
|
+
</article>`}function Ql(e){let t=new Map;for(let r of Jl){let o=e.object.properties[r];o!==void 0&&t.set(r,{key:r,label:od(r),value:yi(o)})}let n=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),e.relatedEvents.length>0&&t.set("events",{key:"events",label:"Events",value:e.relatedEvents.map(r=>r.event.label||r.event.id).join(", ")}),n?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${n.target}`}):n?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${n.target}`}):n?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:n.distance?`Free ${yi(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function ed(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function td(e){let t=e.object.info.description?.trim();if(t)return t;let n=e.group?.label?.trim();return n&&n!==e.objectId?n:null}function yi(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):nd(e)}function nd(e){return`${e.value}${e.unit??""}`}function rd(e){return e.charAt(0).toUpperCase()+e.slice(1)}function od(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function Re(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function id(e){return Re(e)}var Pt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},$i="worldorbit-viewer-tooltip-style";function Ct(e,t){if(ld(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let r={minScale:t.minScale??Pt.minScale,maxScale:t.maxScale??Pt.maxScale,fitPadding:t.fitPadding??Pt.fitPadding},o={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??Pt.panStep,zoomStep:t.zoomStep??Pt.zoomStep,rotationStep:t.rotationStep??Pt.rotationStep},i={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:Ve(t.initialFilter),subtitle:t.subtitle},s=e.getAttribute("tabindex"),c=e.style.touchAction,a=e.style.position,l=ad(t),p=gn(l,i),f={...wt},w=null,x=null,S=null,k=null,C=!1,q=null,v=null,A=0,re=!1,Q=new Map,ee=null,te=null,W=null,ce=null,X=null,ne=null;s===null&&(e.tabIndex=0),dd(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":c,e.style.position||(e.style.position="relative");let Y=m=>{if(!o.pointer||re)return;m.preventDefault(),e.focus();let b=ve(m.clientX,m.clientY),$=hn(Math.exp(-m.deltaY*.002),.6,1.6);H(pn(p,f,$,b,r))},he=m=>{if(re)return;let b=m.pointerType==="touch";if(b&&!o.touch||!b&&!o.pointer||!b&&m.button!==0)return;e.focus(),e.setPointerCapture?.(m.pointerId);let $=Te(m.clientX,m.clientY);if(b){Q.set(m.pointerId,$),Q.size===2?ee=ji(p,f,Q):Q.size===1&&(A=0,C=!1);return}q=m.pointerId,v=$,A=0,C=!1},ye=m=>{if(re)return;if(m.pointerType==="touch"){if(!o.touch||!Q.has(m.pointerId))return;let F=Q.get(m.pointerId),Ce=Te(m.clientX,m.clientY);if(Q.set(m.pointerId,Ce),Q.size===2){ee||(ee=ji(p,f,Q));let je=Si(Q),Je=je.distance/Math.max(ee.startDistance,1),Ut=pn(p,ee.startState,Je,ee.startCenter,r),zt=je.center.x-ee.startViewportCenter.x,Wt=je.center.y-ee.startViewportCenter.y;H(Mt(Ut,zt,Wt))}else if(Q.size===1){let je=Ce.x-F.x,Je=Ce.y-F.y;A+=Math.abs(je)+Math.abs(Je),A>2&&(C=!0),H(Mt(f,je,Je))}return}if(!o.pointer||q!==m.pointerId||!v)return;let $=Te(m.clientX,m.clientY),Z=$.x-v.x,R=$.y-v.y;A+=Math.abs(Z)+Math.abs(R),v=$,A>2&&(C=!0),H(Mt(f,Z,R))},Ee=m=>{if(m.pointerType==="touch"){Q.delete(m.pointerId),Q.size<2&&(ee=null);return}q===m.pointerId&&(q=null,v=null)},ut=m=>{if(!o.selection||re)return;if(C){C=!1;return}let b=er(m.target);le(b),o.tooltipMode==="pinned"&&(W=b,Ie())},D=m=>{let b=er(m.target);ue(b)},ae=()=>{ue(null)},pt=m=>{let b=er(m.target);b&&ue(b)},ft=()=>{ue(null)},T=m=>{if(!o.keyboard||re)return;let b=er(m.target);if((m.key==="Enter"||m.key===" ")&&b){m.preventDefault(),le(b),o.tooltipMode==="pinned"&&(W=b,Ie());return}switch(m.key){case"Escape":o.tooltipMode==="pinned"&&W&&(m.preventDefault(),W=null,Ie());return;case"+":case"=":m.preventDefault(),V.zoomBy(o.zoomStep);return;case"-":m.preventDefault(),V.zoomBy(1/o.zoomStep);return;case"ArrowLeft":m.preventDefault(),V.panBy(-o.panStep,0);return;case"ArrowRight":m.preventDefault(),V.panBy(o.panStep,0);return;case"ArrowUp":m.preventDefault(),V.panBy(0,-o.panStep);return;case"ArrowDown":m.preventDefault(),V.panBy(0,o.panStep);return;case"[":m.preventDefault(),V.rotateBy(-o.rotationStep);return;case"]":m.preventDefault(),V.rotateBy(o.rotationStep);return;case"f":case"F":m.preventDefault(),V.fitToSystem();return;case"0":m.preventDefault(),V.resetView();return}};e.addEventListener("wheel",Y,{passive:!1}),e.addEventListener("pointerdown",he),e.addEventListener("pointermove",ye),e.addEventListener("pointerup",Ee),e.addEventListener("pointercancel",Ee),e.addEventListener("click",ut),e.addEventListener("mouseover",D),e.addEventListener("mouseleave",ae),e.addEventListener("focusin",pt),e.addEventListener("focusout",ft),e.addEventListener("keydown",T);let V={setSource(m){l={kind:"source",value:m},p=gn(l,i),ne=null,O(!0)},setDocument(m){l={kind:"document",value:m},p=gn(l,i),ne=null,O(!0)},setScene(m){l={kind:"scene",value:m},p=m,ne=null,O(!0)},getScene(){return p},getRenderOptions(){return sd(i)},listViewpoints(){return p.viewpoints.slice()},getActiveViewpoint(){return Ke(ne)},goToViewpoint(m){let b=Ke(m);if(!b)return!1;let $={},Z=Ar(b);if(b.preset!==null&&($.preset=b.preset),l.kind!=="scene"&&b.projection!==p.projection&&($.projection=b.projection),Z&&($.layers=Z),ne=b.id,Object.keys($).length>0){let F=Ii($);i=xi(i,$),l.kind!=="scene"&&F&&(p=gn(l,i)),O(F)}Ze(Tr(b),!1,!1);let R=Bt(b);return H(R),le(b.selectedObjectId??b.objectId??null,!1),t.onSelectionChange?.(Rt()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),_t(),Me(),!0},getActiveEventId(){return i.activeEventId??null},setActiveEvent(m){V.setRenderOptions({activeEventId:m})},search(m,b=12){return Mr(p,m,b)},getFilter(){return i.filter?{...i.filter}:null},setFilter(m){Ze(m,!0,!0)},getVisibleObjects(){return Pe()},getFocusPath(m){return Xe(m)},getObjectDetails(m){return K(m)},getSelectionDetails(){return K(f.selectedObjectId)},getTooltipDetails(){return X},getAtlasState(){return si(f,i,i.filter??null,ne)},setAtlasState(m){let b=typeof m=="string"?Lr(m):m;b.viewpointId&&V.goToViewpoint(b.viewpointId),V.setRenderOptions(b.renderOptions),Ze(b.filter??null,!1,!1),H(N({...f,...b.viewerState})),le(b.viewerState.selectedObjectId??null,!1),_t(),t.onSelectionChange?.(Rt()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Me()},serializeAtlasState(){return Dr(V.getAtlasState())},captureBookmark(m,b){return ci(m,b,V.getAtlasState())},applyBookmark(m){return typeof m=="string"?(V.setAtlasState(m),!0):(V.setAtlasState(m.atlasState),!0)},setRenderOptions(m){let b=Ii(m);i=xi(i,m),l.kind!=="scene"&&b&&(p=gn(l,i)),O(b)},getState(){return{...f}},setState(m){H(N({...f,...m}))},zoomBy(m,b){H(pn(p,f,m,b??{x:p.width/2,y:p.height/2},r))},panBy(m,b){H(Mt(f,m,b))},rotateBy(m){H(Pr(f,m))},fitToSystem(){H(Dt(p,f,r))},focusObject(m){ne=null,H(Cr(p,f,m,r)),le(m),o.tooltipMode==="pinned"&&(W=oe(m)?.objectId??null,Ie())},pinTooltip(m){W=oe(m)?.objectId??null,Ie()},resetView(){let m=Dt(p,{...wt},r);ne=null,H(m),le(null),W=null,Ie()},exportSvg(){return ze(p,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){re||(re=!0,e.removeEventListener("wheel",Y),e.removeEventListener("pointerdown",he),e.removeEventListener("pointermove",ye),e.removeEventListener("pointerup",Ee),e.removeEventListener("pointercancel",Ee),e.removeEventListener("click",ut),e.removeEventListener("mouseover",D),e.removeEventListener("mouseleave",ae),e.removeEventListener("focusin",pt),e.removeEventListener("focusout",ft),e.removeEventListener("keydown",T),k?.remove(),k=null,S?.remove(),S=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=c,e.style.position=a,s===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",s))}};return O(!0),t.initialViewpointId?V.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?V.focusObject(t.initialSelectionObjectId):Me(),V;function O(m){if(e.innerHTML=ze(p,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),x=e.querySelector("#worldorbit-camera-root"),S=null,k=null,o.minimap&&(S=document.createElement("div"),S.dataset.worldorbitMinimapRoot="true",e.append(S)),o.tooltipMode!=="disabled"&&(k=document.createElement("div"),k.className="wo-viewer-tooltip-root",k.dataset.worldorbitTooltip="true",k.hidden=!0,k.addEventListener("click",Mn),e.append(k)),!w||!x)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=m?Dt(p,{...wt},r):N(f),le(f.selectedObjectId&&oe(f.selectedObjectId)?f.selectedObjectId:null,!1),ue(te&&oe(te)?te:null,!1),W=W&&oe(W)?W:null,qe(),It(),_t(),t.onViewChange?.({...f}),Me()}function H(m){f=N(m),qe(),t.onViewChange?.({...f}),Me()}function N(m){return{scale:hn(m.scale,r.minScale,r.maxScale),rotationDeg:ki(m.rotationDeg),translateX:Number.isFinite(m.translateX)?m.translateX:f.translateX,translateY:Number.isFinite(m.translateY)?m.translateY:f.translateY,selectedObjectId:m.selectedObjectId&&oe(m.selectedObjectId)?m.selectedObjectId:null}}function qe(){x&&(x.setAttribute("transform",Fr(p,f)),Nt(),Ie())}function le(m,b=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${bn(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:m&&oe(m)?m:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${bn(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),mt(),Ie(),b&&(t.onSelectionChange?.(Rt()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),t.onViewChange?.({...f}),Me())}function ue(m,b=!0){te===m&&b||(te=m&&oe(m)?m:null,mt(),Ie(),b&&(t.onHoverChange?.(oe(te)),t.onHoverDetailsChange?.(K(te))))}function Rt(){return oe(f.selectedObjectId)}function oe(m){if(!m)return null;let b=gt();return p.objects.find($=>$.objectId===m&&!$.hidden&&b.has($.objectId))??null}function K(m){let b=oe(m);return b?{objectId:b.objectId,object:b.object,renderObject:b,label:p.labels.find($=>$.objectId===b.objectId&&!$.hidden)??null,group:p.groups.find($=>$.renderId===b.groupId)??null,semanticGroups:p.semanticGroups.filter($=>b.semanticGroupIds.includes($.id)),orbit:p.orbitVisuals.find($=>$.objectId===b.objectId&&!$.hidden)??null,relatedOrbits:p.orbitVisuals.filter($=>!$.hidden&&($.objectId===b.objectId||b.ancestorIds.includes($.objectId)||b.childIds.includes($.objectId))),relations:p.relations.filter($=>!$.hidden&&($.fromObjectId===b.objectId||$.toObjectId===b.objectId)),relatedEvents:p.events.filter($=>!$.hidden&&($.targetObjectId===b.objectId||$.objectIds.includes(b.objectId))),parent:oe(b.parentId),children:b.childIds.map($=>oe($)).filter(Boolean),ancestors:b.ancestorIds.map($=>oe($)).filter(Boolean),focusPath:Xe(b.objectId)}:null}function mt(){for(let m of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))m.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Ge(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Ge(te,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Ge(m,b){let $=K(m);if(!$)return;let Z=new Set([$.objectId,...$.renderObject.childIds,...$.renderObject.ancestorIds]);for(let R of Z)for(let F of e.querySelectorAll(`[data-object-id="${bn(R)}"]`))F.classList.add(b.objectClass);for(let R of $.ancestors)for(let F of e.querySelectorAll(`[data-object-id="${bn(R.objectId)}"]`))F.classList.add(b.ancestorClass);for(let R of $.relatedOrbits)for(let F of e.querySelectorAll(`[data-orbit-object-id="${bn(R.objectId)}"]`))F.classList.add(b.orbitClass)}function Te(m,b){if(!w)return{x:p.width/2,y:p.height/2};let $=w.getBoundingClientRect();return!$.width||!$.height?{x:p.width/2,y:p.height/2}:{x:(m-$.left)/$.width*p.width,y:(b-$.top)/$.height*p.height}}function ve(m,b){return vt(p,f,Te(m,b))}function gt(){return Zn(p,i.filter??null)}function Pe(){let m=gt();return p.objects.filter(b=>!b.hidden&&m.has(b.objectId))}function Xe(m){let b=p.objects.find($=>$.objectId===m&&!$.hidden);return b?[...b.ancestorIds,b.objectId].map($=>oe($)).filter(Boolean):[]}function Ke(m){return p.viewpoints.find(b=>b.id===m)??null}function Bt(m){let b=ki(m.rotationDeg),$=m.scale!==null&&m.scale!==void 0?hn(m.scale,r.minScale,r.maxScale):null,Z=m.objectId&&p.objects.find(F=>F.objectId===m.objectId&&!F.hidden);if(Z)return xt({x:Z.x,y:Z.y},$??Math.max(1.8,wt.scale),b,m.selectedObjectId??Z.objectId);let R=Dt(p,{...wt,rotationDeg:b},r);return $===null?{...R,rotationDeg:b,selectedObjectId:m.selectedObjectId??null}:xt({x:p.contentBounds.centerX,y:p.contentBounds.centerY},$,b,m.selectedObjectId??null)}function xt(m,b,$,Z){let R={x:p.width/2,y:p.height/2},F=we(m,R,$);return{scale:b,rotationDeg:$,translateX:R.x-(R.x+(F.x-R.x)*b),translateY:R.y-(R.y+(F.y-R.y)*b),selectedObjectId:Z}}function Ze(m,b,$){i={...i,filter:Ve(m)},$&&(ne=null),O(!1)}function It(){t.onFilterChange?.(i.filter??null,Pe())}function _t(){t.onViewpointChange?.(Ke(ne))}function Me(){t.onAtlasStateChange?.(V.getAtlasState())}function Nt(){!o.minimap||!S||(S.innerHTML=bi(p,f,Pe()))}function Ie(){if(o.tooltipMode==="disabled"||!k){ht(null);return}let m=Ue();if(!m){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),ht(null);return}let b=K(m.objectId);if(!b){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),ht(null);return}let $=wi(b);ce=m.objectId,k.hidden=!1,k.dataset.mode=m.mode,k.classList.toggle("is-pinned",m.mode==="pinned"),k.style.pointerEvents="auto",k.style.visibility="hidden",Sn(k,$,m.mode),On(k,b.renderObject),k.style.visibility="visible",ht($)}function Ue(){return W&&oe(W)?{objectId:W,mode:"pinned"}:te&&oe(te)?{objectId:te,mode:"hover"}:null}function Sn(m,b,$){let Z=t.tooltipRenderer?.(b,$);m.innerHTML="",typeof Z=="string"?m.innerHTML=Z:Z instanceof HTMLElement?m.append(Z):m.innerHTML=vi(b,$);let R=document.createElement("div");if(R.className="wo-tooltip-actions",$==="pinned"){let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="unpin",F.textContent="Unpin",R.append(F)}else{let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="pin",F.dataset.objectId=b.objectId,F.textContent="Pin",R.append(F)}R.childElementCount>0&&m.append(R)}function On(m,b){if(!w)return;let $={x:b.anchorX??b.x,y:b.anchorY??b.y-Math.max(b.visualRadius,b.radius)},Z=En($),R=w.getBoundingClientRect(),F=e.getBoundingClientRect(),Ce=R.left-F.left+Z.x/Math.max(p.width,1)*R.width,je=R.top-F.top+Z.y/Math.max(p.height,1)*R.height,Je=Math.max(e.clientWidth-m.offsetWidth-12,12),Ut=Math.max(e.clientHeight-m.offsetHeight-12,12),zt=je>e.clientHeight*.48,Wt=hn(Ce+18,12,Je),cr=hn(zt?je-m.offsetHeight-18:je+18,12,Ut);m.style.left=`${Wt}px`,m.style.top=`${cr}px`}function En(m){let b={x:p.width/2,y:p.height/2},$=we(m,b,f.rotationDeg);return{x:b.x+($.x-b.x)*f.scale+f.translateX,y:b.y+($.y-b.y)*f.scale+f.translateY}}function Mn(m){let b=m.target?.closest("[data-tooltip-action]");if(b){switch(m.preventDefault(),m.stopPropagation(),b.dataset.tooltipAction){case"pin":W=b.dataset.objectId??ce;break;case"unpin":W=null;break}Ie()}}function ht(m){let b=X?.objectId!==m?.objectId||X?.description!==m?.description||X?.imageHref!==m?.imageHref;X=m,ce=m?.objectId??null,b&&t.onTooltipChange?.(m)}}function ad(e){if(e.scene)return{kind:"scene",value:e.scene};if(e.document)return{kind:"document",value:e.document};if(e.source)return{kind:"source",value:e.source};throw new Error("Interactive viewer requires an initial render input.")}function gn(e,t){switch(e.kind){case"scene":return e.value;case"document":return Se(e.value,t);case"source":{let n=it(e.value);return Se(n.document,cd(n,t))}}}function sd(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme,activeEventId:e.activeEventId??null}}function xi(e,t){return{...e,...t,filter:t.filter!==void 0?Ve(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function Ii(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0||e.activeEventId!==void 0}function cd(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function ji(e,t,n){let{center:r,distance:o}=Si(n);return{startState:{...t},startCenter:vt(e,t,r),startViewportCenter:r,startDistance:o}}function Si(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[n,r]=t;return{center:{x:(n.x+r.x)/2,y:(n.y+r.y)/2},distance:Math.hypot(r.x-n.x,r.y-n.y)}}function er(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function ld(e){if(typeof window>"u"||typeof document>"u")throw new Error("createInteractiveViewer can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("Interactive viewer requires an HTMLElement container.")}function hn(e,t,n){return Math.min(Math.max(e,t),n)}function ki(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function bn(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function dd(){if(typeof document>"u"||document.getElementById($i))return;let e=document.createElement("style");e.id=$i,e.textContent=`
|
|
118
126
|
.wo-viewer-tooltip-root {
|
|
119
127
|
position: absolute;
|
|
120
128
|
z-index: 12;
|
|
@@ -180,73 +188,78 @@
|
|
|
180
188
|
padding: 6px 12px;
|
|
181
189
|
font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
182
190
|
}
|
|
183
|
-
`,document.head.append(e)}function ci(e){return encodeURIComponent(JSON.stringify(e))}function Pn(e,t,r={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:r.initialViewpointId,initialSelectionObjectId:r.initialSelectionObjectId,initialFilter:r.initialFilter??null,atlasState:r.atlasState??null,minimap:r.minimap}}}function Cn(e,t={}){let r={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},n=Fe(e.scene,{theme:r.options?.theme,layers:r.options?.layers,filter:r.options?.initialFilter??null,selectedObjectId:r.options?.initialSelectionObjectId??null,subtitle:r.options?.subtitle,preset:r.options?.preset});return`<div class="${Hr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Hr(r.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Hr(r.options?.initialViewpointId??"")}" data-worldorbit-payload="${Hr(ci(r))}">${n}</div>`}function Hr(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}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("&","&").replaceAll("<","<").replaceAll(">",">")}function Mc(e){return ui(e).replaceAll('"',""")}function Dc(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}var pi="worldorbit-editor-style",Lc=120,Tc=16,Ac=96,Lt=1495978707e-1,gi=6371,hi=695700,bi=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),Ec=new Set(["star","planet","moon","asteroid","comet"]),Fn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Pc=["kind","class","culture","color","image","atmosphere","on","source"],Cc=["radius","mass","density","gravity","temperature","inner","outer","cycle"],Fc=["albedo"],Vc={"defaults-view":{description:"Sets the default camera projection for the atlas.",references:["Topdown = map-like","Isometric = angled overview"]},"defaults-scale":{description:"Chooses the overall spacing/style preset used by the renderer.",references:["diagram = tighter","presentation = roomier"]},"defaults-units":{description:"Stores a document-wide note about the unit style you want to use.",references:["Example: metric","Example: lore-standard"]},"viewpoint-projection":{description:"Overrides the projection for this saved viewpoint.",references:["Topdown = flat orbital map","Isometric = angled scene"]},"viewpoint-zoom":{description:"Controls how closely this viewpoint frames the system.",references:["1 = scene fit","2+ = close-up"]},"viewpoint-rotation":{description:"Rotates the saved camera angle in degrees.",references:["90deg = quarter turn","180deg = flip"]},"placement-target":{description:"Names the body or reference this object is attached to.",references:["orbit Primary","surface Homeworld","at Naar:L4"]},"placement-free":{description:"Stores a free-placement offset or a descriptive label for loose placement.",references:["8au = far from the star",'"outer system" = descriptive note']},"placement-distance":{description:"Mean orbit distance from the target body.",references:["1 au = Earth-Sun distance","384400km = Earth-Moon distance"]},"placement-semiMajor":{description:"Semi-major axis of an orbit, used for elliptical orbits.",references:["1 au = Earth-Sun distance","Use this instead of distance when orbit shape matters"]},"placement-eccentricity":{description:"Controls how stretched the orbit is. Lower is rounder.",references:["0 = circular orbit","0.1 = mildly elliptical"]},"placement-period":{description:"How long one orbit takes.",references:["1 y = one Earth year","27.3d = Moon around Earth"]},"placement-angle":{description:"Rotates the orbit ellipse within the scene.",references:["0deg = default orientation","90deg = quarter turn"]},"placement-inclination":{description:"Tilts the orbit relative to the main orbital plane.",references:["0deg = same plane","5deg = slight tilt"]},"placement-phase":{description:"Starting position of the object along its orbit.",references:["0deg = start position","180deg = opposite side"]},"prop-radius":{description:"Visual body size or real-world-inspired radius value.",references:["1re = Earth radius","1sol = Sun radius"]},"prop-mass":{description:"Optional mass value for the body.",references:["1me = Earth mass","1sol = Sun mass"]},"prop-gravity":{description:"Surface gravity or a custom gravity marker.",references:["1g = Earth-like gravity","0.16g = Moon-like gravity"]},"prop-temperature":{description:"Typical temperature or narrative temperature marker.",references:["288K = Earth-like average","1200K = very hot world"]},"prop-atmosphere":{description:"Short atmosphere descriptor for the object.",references:['"nitrogen-oxygen"','"methane haze"']},"prop-inner":{description:"Inner edge for a belt, ring, or broad phenomenon.",references:["120000km = ring inner edge","2au = belt starts here"]},"prop-outer":{description:"Outer edge for a belt, ring, or broad phenomenon.",references:["190000km = ring outer edge","3au = belt ends here"]}};function yi(e,t={}){jd(e),Sd();let r=Rc(t),n=r.atlasDocument,o=r.source,i=o,l=o,a=r.diagnostics,s=n.objects[0]?{kind:"object",id:n.objects[0].id}:{kind:"system"},p=[],c=[],u=null,v=!1,x=!1,k=!1,I=null,V=null,$="",S="",E=new Map,X=t.showTextPane??!0,W=t.showInspector??!0,U=t.showPreview??!0,H=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(W),e.dataset.woShowTextPane=String(X),e.dataset.woShowPreview=String(U),e.innerHTML=Bc();let C=fe(e,"[data-editor-toolbar]"),ie=fe(e,"[data-editor-outline]"),J=fe(e,"[data-editor-stage-shell]"),ee=fe(e,"[data-editor-stage]"),K=fe(e,"[data-editor-overlay]"),Te=fe(e,"[data-editor-diagnostics]"),Je=fe(e,"[data-editor-source-diagnostics]"),Ve=fe(e,"[data-editor-status]"),pt=fe(e,"[data-editor-live]"),F=fe(e,"[data-editor-inspector]"),te=fe(e,"[data-editor-source]"),Qe=fe(e,"[data-editor-preview-visual]"),D=fe(e,"[data-editor-preview-markup]"),O=null;O=St(ee,{source:o,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:n.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(d){if(v||!d){!v&&s?.kind==="object"&&Ae(null,!1,!0);return}Ae({kind:"object",id:d.objectId},!1,!0)},onViewChange(){ve()}}),C.addEventListener("click",hr),ie.addEventListener("click",br),K.addEventListener("pointerdown",Y),F?.addEventListener("input",yr),F?.addEventListener("change",wr),te?.addEventListener("input",f),te?.addEventListener("change",h),te?.addEventListener("blur",h),e.addEventListener("keydown",w),window.addEventListener("pointermove",R),window.addEventListener("pointerup",P),window.addEventListener("pointercancel",P);let j={setSource(d){et(d,!1)&&(q(),Be())},setAtlasDocument(d){Z(d,!1,s,!1),q(),Be()},getSource(){return o},getAtlasDocument(){return z(n)},getDiagnostics(){return a.map(Zr)},getSelection(){return s?{path:{...s}}:null},isDirty(){return k},markSaved(){At(!0)},selectPath(d){Ae(d,!0,!0)},canUndo(){return p.length>0},canRedo(){return c.length>0},undo(){let d=p.pop();return d?(c.unshift(ae()),Q(d),!0):!1},redo(){let d=c.shift();return d?(p.push(ae()),Q(d),!0):!1},addObject(d="planet"){let m=Gr(d,n.objects.map(L=>L.id)),g=Qc(d,m,n),b=ed(n,g);return Z(b,!0,{kind:"object",id:m}),m},addViewpoint(){let d=Gr("viewpoint",n.system?.viewpoints.map(b=>b.id)??[]),m={id:d,label:Kr(d),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.system?.defaults.view??"topdown",preset:n.system?.defaults.preset??null,zoom:null,rotationDeg:0,layers:{},filter:null},g=z(n);return g.system?.viewpoints.push(m),g.system?.viewpoints.sort((b,L)=>b.id.localeCompare(L.id)),Z(g,!0,{kind:"viewpoint",id:d}),d},addAnnotation(){let d=Gr("annotation",n.system?.annotations.map(b=>b.id)??[]),m={id:d,label:Kr(d),targetObjectId:null,body:"",tags:[],sourceObjectId:null},g=z(n);return g.system?.annotations.push(m),g.system?.annotations.sort((b,L)=>b.id.localeCompare(L.id)),Z(g,!0,{kind:"annotation",id:d}),d},addMetadata(d,m){let g=d?.trim()||Gr("metadata",Object.keys(n.system?.atlasMetadata??{})),b=z(n);return b.system&&(b.system.atlasMetadata[g]=m??""),Z(b,!0,{kind:"metadata",key:g}),g},removeSelection(){if(!s||s.kind==="system"||s.kind==="defaults")return!1;let d=nd(n,s);return Z(d,!0,{kind:"system"}),!0},exportSvg(){return O.exportSvg()},exportEmbedMarkup(){return mi(Se(),n)},destroy(){x||(x=!0,C.removeEventListener("click",hr),ie.removeEventListener("click",br),K.removeEventListener("pointerdown",Y),F?.removeEventListener("input",yr),F?.removeEventListener("change",wr),te?.removeEventListener("input",f),te?.removeEventListener("change",h),te?.removeEventListener("blur",h),e.removeEventListener("keydown",w),window.removeEventListener("pointermove",R),window.removeEventListener("pointerup",P),window.removeEventListener("pointercancel",P),me(),gr(),O.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Me(!0),se(!0),j;function ae(){return{atlasDocument:z(n),selection:s?{...s}:null,source:o}}function q(){p.length=0,c.length=0,Be()}function me(){I!==null&&(window.clearTimeout(I),I=null)}function gr(){V!==null&&(window.clearTimeout(V),V=null)}function Se(){return u?.changed?xe(n,{schema:"2.0"}):o}function se(d=!1){let m=i!==l||o!==l||u?.changed===!0;!d&&m===k||(k=m,Bt(),t.onDirtyChange?.(k))}function At(d=!1){i=o,mt(),l=o,se(d)}function Q(d){me(),n=z(d.atlasDocument),o=d.source,i=o,a=Ze(n),s=tt(d.selection),Re({preserveCamera:!0,applyViewpointSelection:s?.kind==="viewpoint"}),Ae(s,!1,!1),Me(),se(),Oe()}function Z(d,m,g,b=!1){m&&(p.push(ae()),c.length=0),me(),n=z(d),o=xe(n,{schema:"2.0"}),b||(i=o),a=Ze(n),s=tt(g),Re({preserveCamera:s?.kind!=="viewpoint",applyViewpointSelection:s?.kind==="viewpoint"}),Ae(s,!1,!1),Me(),se(),Oe()}function et(d,m){i=d,te&&te.value!==d&&(te.value=d);let g=nr(d);if(!g.ok||!g.value)return a=g.diagnostics.map(A=>({diagnostic:A,path:null})),Et(),ft(),_e(),Ne(),Bt(),vr(),se(),t.onDiagnosticsChange?.(a.map(Zr)),!1;let b=g.value.atlasDocument??it(g.value.document),L=rr(b,g.diagnostics);return m&&(p.push(ae()),c.length=0,i=xe(b,{schema:"2.0"})),n=z(b),o=xe(n,{schema:"2.0"}),a=vi(L,Ze(n)),s=tt(s),Re({preserveCamera:s?.kind!=="viewpoint",applyViewpointSelection:s?.kind==="viewpoint"}),Me(),se(),Oe(),!0}function Re(d={}){if(!O)return;let m=O.getState(),g=O.getRenderOptions(),b=n.system?.defaults.preset??"atlas-card";v=!0,(g.preset!==b||g.projection!=="document")&&O.setRenderOptions({preset:b,projection:"document"}),O.setDocument(Zt(n)),d.applyViewpointSelection&&s?.kind==="viewpoint"&&s.id?O.goToViewpoint(s.id):d.preserveCamera!==!1?O.setState({...m,selectedObjectId:s?.kind==="object"?s.id??null:null}):s?.kind==="object"&&s.id&&O.focusObject(s.id),v=!1}function Oe(){let d={source:o,atlasDocument:z(n),diagnostics:a.map(Zr),selection:s?{path:{...s}}:null};t.onDiagnosticsChange?.(d.diagnostics),t.onSelectionChange?.(d.selection),t.onChange?.(d)}function Ae(d,m,g=!0){s=tt(d),m&&(v=!0,s?.kind==="object"&&s.id?O.focusObject(s.id):s?.kind==="viewpoint"&&s.id&&O.goToViewpoint(s.id),v=!1),Be(),_e(),F?.contains(document.activeElement)||Ne(),ve(),Bt(),vr(),g&&t.onSelectionChange?.(s?{path:{...s}}:null)}function tt(d){if(!d)return null;let m=bn(n,d);return m==null?d.kind==="system"||d.kind==="defaults"?d:null:d}function Me(d=!1){Be(),_e(),Et(),ft(),F?.contains(document.activeElement)||Ne(),mt(),Pt(d),ve(),Bt(),vr()}function Be(){let d=C.querySelector("[data-editor-add-object-type]")?.value??"planet";C.innerHTML=`
|
|
191
|
+
`,document.head.append(e)}function Oi(e){return encodeURIComponent(JSON.stringify(e))}function _r(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Nr(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=ze(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${tr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${tr(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${tr(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${tr(Oi(n))}">${r}</div>`}function tr(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function yn(e,t={}){try{let n=it(e),r=Se(n.document,fd(n,t));return(t.mode??"static")==="interactive"?Nr(_r(r,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${pd(t.className??"worldorbit-block worldorbit-static")}">${ze(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Ei(n instanceof Error?n.message:String(n))}}function Ei(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Mi(e)}</pre>`}function Mi(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function pd(e){return Mi(e).replaceAll('"',""")}function fd(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}var Di="worldorbit-editor-style",md=120,gd=16,hd=96,Vt=1495978707e-1,Ci=6371,Fi=695700,zr=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),bd=new Set(["star","planet","moon","asteroid","comet"]),Yr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],yd=["kind","class","culture","color","image","atmosphere","on","source"],wd=["radius","mass","density","gravity","temperature","inner","outer","cycle"],vd=["albedo"],$d={"defaults-view":{description:"Sets the default camera projection for the atlas.",references:["Topdown = map-like","Isometric = angled overview"]},"defaults-scale":{description:"Chooses the overall spacing/style preset used by the renderer.",references:["diagram = tighter","presentation = roomier"]},"defaults-units":{description:"Stores a document-wide note about the unit style you want to use.",references:["Example: metric","Example: lore-standard"]},"viewpoint-projection":{description:"Overrides the projection for this saved viewpoint.",references:["Topdown = flat orbital map","Isometric = angled scene"]},"viewpoint-zoom":{description:"Controls how closely this viewpoint frames the system.",references:["1 = scene fit","2+ = close-up"]},"viewpoint-rotation":{description:"Rotates the saved camera angle in degrees.",references:["90deg = quarter turn","180deg = flip"]},"viewpoint-events":{description:"Lists event IDs that this viewpoint should feature in its detail panel.",references:["solar-eclipse-naar","transit-window conjunction"]},"event-kind":{description:"Short semantic event type for tooling and viewer overlays.",references:["solar-eclipse","lunar-eclipse","transit"]},"event-target":{description:"Primary object this event is centered on.",references:["Naar","Seyra"]},"event-participants":{description:"Objects that participate in the event snapshot or description.",references:["Iyath Naar Seyra","Naar Seyra Orun"]},"event-timing":{description:"Free-text timing note for the event.",references:['"Every late bloom season"','"At local midyear"']},"event-visibility":{description:"Notes where or how the event is visible.",references:['"Visible from Naar"','"Southern hemisphere only"']},"event-viewpoints":{description:"Viewpoint IDs that should list this event prominently.",references:["naar-system","overview inner-system"]},"placement-target":{description:"Names the body or reference this object is attached to.",references:["orbit Primary","surface Homeworld","at Naar:L4"]},"placement-free":{description:"Stores a free-placement offset or a descriptive label for loose placement.",references:["8au = far from the star",'"outer system" = descriptive note']},"placement-distance":{description:"Mean orbit distance from the target body.",references:["1 au = Earth-Sun distance","384400km = Earth-Moon distance"]},"placement-semiMajor":{description:"Semi-major axis of an orbit, used for elliptical orbits.",references:["1 au = Earth-Sun distance","Use this instead of distance when orbit shape matters"]},"placement-eccentricity":{description:"Controls how stretched the orbit is. Lower is rounder.",references:["0 = circular orbit","0.1 = mildly elliptical"]},"placement-period":{description:"How long one orbit takes.",references:["1 y = one Earth year","27.3d = Moon around Earth"]},"placement-angle":{description:"Rotates the orbit ellipse within the scene.",references:["0deg = default orientation","90deg = quarter turn"]},"placement-inclination":{description:"Tilts the orbit relative to the main orbital plane.",references:["0deg = same plane","5deg = slight tilt"]},"placement-phase":{description:"Starting position of the object along its orbit.",references:["0deg = start position","180deg = opposite side"]},"prop-radius":{description:"Visual body size or real-world-inspired radius value.",references:["1re = Earth radius","1sol = Sun radius"]},"prop-mass":{description:"Optional mass value for the body.",references:["1me = Earth mass","1sol = Sun mass"]},"prop-gravity":{description:"Surface gravity or a custom gravity marker.",references:["1g = Earth-like gravity","0.16g = Moon-like gravity"]},"prop-temperature":{description:"Typical temperature or narrative temperature marker.",references:["288K = Earth-like average","1200K = very hot world"]},"prop-atmosphere":{description:"Short atmosphere descriptor for the object.",references:['"nitrogen-oxygen"','"methane haze"']},"prop-inner":{description:"Inner edge for a belt, ring, or broad phenomenon.",references:["120000km = ring inner edge","2au = belt starts here"]},"prop-outer":{description:"Outer edge for a belt, ring, or broad phenomenon.",references:["190000km = ring outer edge","3au = belt ends here"]}};function Vi(e,t={}){yu(e),wu();let n=xd(t),r=n.atlasDocument,o=n.source,i=o,s=o,c=n.diagnostics,a=r.objects[0]?{kind:"object",id:r.objects[0].id}:{kind:"system"},l=[],p=[],f=null,w=!1,x=!1,S=!1,k=null,C=null,q="",v="",A=new Map,re=t.showTextPane??!0,Q=t.showInspector??!0,ee=t.showPreview??!0,te=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(Q),e.dataset.woShowTextPane=String(re),e.dataset.woShowPreview=String(ee),e.innerHTML=Id();let W=xe(e,"[data-editor-toolbar]"),ce=xe(e,"[data-editor-outline]"),X=xe(e,"[data-editor-stage-shell]"),ne=xe(e,"[data-editor-stage]"),Y=xe(e,"[data-editor-overlay]"),he=xe(e,"[data-editor-diagnostics]"),ye=xe(e,"[data-editor-source-diagnostics]"),Ee=xe(e,"[data-editor-status]"),ut=xe(e,"[data-editor-live]"),D=xe(e,"[data-editor-inspector]"),ae=xe(e,"[data-editor-source]"),pt=xe(e,"[data-editor-preview-visual]"),ft=xe(e,"[data-editor-preview-markup]"),T=null;T=Ct(ne,{source:o,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:r.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(d){let u=a?Ur(a):null;if(w||!d){w||(a?.kind==="event-pose"&&a.id?ve({kind:"event",id:a.id},!1,!0):a?.kind==="object"?ve(u?{kind:"event",id:u}:null,!1,!0):a?.kind==="event"&&a.id&&ve({kind:"event",id:a.id},!1,!0));return}if(u&&Ni(r,u,d.objectId)){ve({kind:"event-pose",id:u,key:d.objectId},!1,!0);return}ve({kind:"object",id:d.objectId},!1,!0)},onViewChange(){Me()}}),W.addEventListener("click",Sn),ce.addEventListener("click",On),Y.addEventListener("pointerdown",R),D?.addEventListener("click",En),D?.addEventListener("input",Mn),D?.addEventListener("change",ht),ae?.addEventListener("input",b),ae?.addEventListener("change",$),ae?.addEventListener("blur",$),e.addEventListener("keydown",Z),window.addEventListener("pointermove",F),window.addEventListener("pointerup",Ce),window.addEventListener("pointercancel",Ce);let V={setSource(d){mt(d,!1)&&(H(),Xe())},setAtlasDocument(d){K(d,!1,a,!1),H(),Xe()},getSource(){return o},getAtlasDocument(){return z(r)},getDiagnostics(){return c.map(ir)},getSelection(){return a?{path:{...a}}:null},isDirty(){return S},markSaved(){Rt(!0)},selectPath(d){ve(d,!0,!0)},canUndo(){return l.length>0},canRedo(){return p.length>0},undo(){let d=l.pop();return d?(p.unshift(O()),oe(d),!0):!1},redo(){let d=p.shift();return d?(l.push(O()),oe(d),!0):!1},addObject(d="planet"){let u=$n(d,r.objects.map(j=>j.id)),g=Nd(d,u,r),h=Ud(r,g);return K(h,!0,{kind:"object",id:u}),u},addEvent(){let d=$n("event",r.events.map(h=>h.id)),u={id:d,kind:"",label:xn(d),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},g=z(r);return g.events.push(u),g.events.sort(Ti),K(g,!0,{kind:"event",id:d}),d},addViewpoint(){let d=$n("viewpoint",r.system?.viewpoints.map(h=>h.id)??[]),u={id:d,label:xn(d),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:r.system?.defaults.view??"topdown",preset:r.system?.defaults.preset??null,zoom:null,rotationDeg:0,layers:{},filter:null},g=z(r);return g.system?.viewpoints.push(u),g.system?.viewpoints.sort((h,j)=>h.id.localeCompare(j.id)),K(g,!0,{kind:"viewpoint",id:d}),d},addAnnotation(){let d=$n("annotation",r.system?.annotations.map(h=>h.id)??[]),u={id:d,label:xn(d),targetObjectId:null,body:"",tags:[],sourceObjectId:null},g=z(r);return g.system?.annotations.push(u),g.system?.annotations.sort((h,j)=>h.id.localeCompare(j.id)),K(g,!0,{kind:"annotation",id:d}),d},addMetadata(d,u){let g=d?.trim()||$n("metadata",Object.keys(r.system?.atlasMetadata??{})),h=z(r);return h.system&&(h.system.atlasMetadata[g]=u??""),K(h,!0,{kind:"metadata",key:g}),g},removeSelection(){if(!a||a.kind==="system"||a.kind==="defaults")return!1;let d=Yd(r,a);return K(d,!0,{kind:"system"}),!0},exportSvg(){return T.exportSvg()},exportEmbedMarkup(){return Ai(le(),r)},destroy(){x||(x=!0,W.removeEventListener("click",Sn),ce.removeEventListener("click",On),Y.removeEventListener("pointerdown",R),D?.removeEventListener("click",En),D?.removeEventListener("input",Mn),D?.removeEventListener("change",ht),ae?.removeEventListener("input",b),ae?.removeEventListener("change",$),ae?.removeEventListener("blur",$),e.removeEventListener("keydown",Z),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",Ce),window.removeEventListener("pointercancel",Ce),N(),qe(),T.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Pe(!0),ue(!0),V;function O(){return{atlasDocument:z(r),selection:a?{...a}:null,source:o}}function H(){l.length=0,p.length=0,Xe()}function N(){k!==null&&(window.clearTimeout(k),k=null)}function qe(){C!==null&&(window.clearTimeout(C),C=null)}function le(){return f?.changed?lt(r):o}function ue(d=!1){let u=i!==s||o!==s||f?.changed===!0;!d&&u===S||(S=u,Yt(),t.onDirtyChange?.(S))}function Rt(d=!1){i=o,It(),s=o,ue(d)}function oe(d){N(),r=z(d.atlasDocument),o=d.source,i=o,c=dt(r),a=gt(d.selection),Ge({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),ve(a,!1,!1),Pe(),ue(),Te()}function K(d,u,g,h=!1){u&&(l.push(O()),p.length=0),N(),r=z(d),o=lt(r),h||(i=o),c=dt(r),a=gt(g),Ge({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),ve(a,!1,!1),Pe(),ue(),Te()}function mt(d,u){i=d,ae&&ae.value!==d&&(ae.value=d);let g=un(d);if(!g.ok||!g.value)return c=g.diagnostics.map(E=>({diagnostic:E,path:null})),Bt(),xt(),Ke(),Ze(),Yt(),Dn(),ue(),t.onDiagnosticsChange?.(c.map(ir)),!1;let h=g.value.atlasDocument??yt(g.value.document),j=dn(h,g.diagnostics);return u&&(l.push(O()),p.length=0,i=lt(h)),r=z(h),o=lt(r),c=Bi(j,dt(r)),a=gt(a),Ge({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),Pe(),ue(),Te(),!0}function Ge(d={}){if(!T)return;let u=T.getState(),g=T.getRenderOptions(),h=r.system?.defaults.preset??"atlas-card",j=a?Ur(a):null;w=!0,(g.preset!==h||g.projection!=="document"||(g.activeEventId??null)!==j)&&T.setRenderOptions({preset:h,projection:"document",activeEventId:j}),T.setDocument(on(r)),d.applyViewpointSelection&&a?.kind==="viewpoint"&&a.id?T.goToViewpoint(a.id):d.preserveCamera!==!1?T.setState({...u,selectedObjectId:a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null}):a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key&&T.focusObject(a.key),w=!1}function Te(){let d={source:o,atlasDocument:z(r),diagnostics:c.map(ir),selection:a?{path:{...a}}:null};t.onDiagnosticsChange?.(d.diagnostics),t.onSelectionChange?.(d.selection),t.onChange?.(d)}function ve(d,u,g=!0){a=gt(d),u&&(w=!0,T.setRenderOptions({activeEventId:a?Ur(a):null}),a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key?T.focusObject(a.key):a?.kind==="viewpoint"&&a.id&&T.goToViewpoint(a.id),w=!1),Xe(),Ke(),D?.contains(document.activeElement)||Ze(),Me(),Yt(),Dn(),g&&t.onSelectionChange?.(a?{path:{...a}}:null)}function gt(d){if(!d)return null;let u=Ir(r,d);return u==null?d.kind==="system"||d.kind==="defaults"?d:null:d}function Pe(d=!1){Xe(),Ke(),Bt(),xt(),D?.contains(document.activeElement)||Ze(),It(),_t(d),Me(),Yt(),Dn()}function Xe(){let d=W.querySelector("[data-editor-add-object-type]")?.value??"planet";W.innerHTML=`
|
|
184
192
|
<div class="wo-editor-toolbar-group">
|
|
185
193
|
<select data-editor-add-object-type>
|
|
186
|
-
${
|
|
194
|
+
${Yr.map(u=>`<option value="${L(u)}"${u===d?" selected":""}>${L(xn(u))}</option>`).join("")}
|
|
187
195
|
</select>
|
|
188
196
|
<button type="button" data-editor-action="add-object">Add object</button>
|
|
197
|
+
<button type="button" data-editor-action="add-event">Add event</button>
|
|
189
198
|
<button type="button" data-editor-action="add-viewpoint">Add viewpoint</button>
|
|
190
199
|
<button type="button" data-editor-action="add-annotation">Add annotation</button>
|
|
191
200
|
<button type="button" data-editor-action="add-metadata">Add metadata</button>
|
|
192
201
|
</div>
|
|
193
202
|
<div class="wo-editor-toolbar-group">
|
|
194
|
-
<button type="button" data-editor-action="remove"${!
|
|
195
|
-
<button type="button" data-editor-action="undo"${
|
|
196
|
-
<button type="button" data-editor-action="redo"${
|
|
203
|
+
<button type="button" data-editor-action="remove"${!a||a.kind==="system"||a.kind==="defaults"?" disabled":""}>Remove</button>
|
|
204
|
+
<button type="button" data-editor-action="undo"${l.length===0?" disabled":""}>Undo</button>
|
|
205
|
+
<button type="button" data-editor-action="redo"${p.length===0?" disabled":""}>Redo</button>
|
|
197
206
|
<button type="button" data-editor-action="format">Format source</button>
|
|
198
207
|
</div>
|
|
199
|
-
`}function
|
|
208
|
+
`}function Ke(){let d=He(a),u=tu(c),g=Object.entries(r.system?.atlasMetadata??{}).sort(([h],[j])=>h.localeCompare(j));ce.innerHTML=`
|
|
200
209
|
<div class="wo-editor-outline-section">
|
|
201
210
|
<h3>Atlas</h3>
|
|
202
|
-
${
|
|
203
|
-
${
|
|
211
|
+
${Ye({kind:"system"},"System",d,u)}
|
|
212
|
+
${Ye({kind:"defaults"},"Defaults",d,u)}
|
|
204
213
|
</div>
|
|
205
214
|
<div class="wo-editor-outline-section">
|
|
206
215
|
<h3>Metadata</h3>
|
|
207
|
-
${g.length>0?g.map(([
|
|
216
|
+
${g.length>0?g.map(([h])=>Ye({kind:"metadata",key:h},h,d,u)).join(""):'<p class="wo-editor-empty">No atlas metadata yet.</p>'}
|
|
208
217
|
</div>
|
|
209
218
|
<div class="wo-editor-outline-section">
|
|
210
219
|
<h3>Viewpoints</h3>
|
|
211
|
-
${(
|
|
220
|
+
${(r.system?.viewpoints.length??0)>0?r.system?.viewpoints.map(h=>Ye({kind:"viewpoint",id:h.id},h.label,d,u)).join(""):'<p class="wo-editor-empty">No viewpoints yet.</p>'}
|
|
212
221
|
</div>
|
|
213
222
|
<div class="wo-editor-outline-section">
|
|
214
223
|
<h3>Annotations</h3>
|
|
215
|
-
${(
|
|
224
|
+
${(r.system?.annotations.length??0)>0?r.system?.annotations.map(h=>Ye({kind:"annotation",id:h.id},h.label,d,u)).join(""):'<p class="wo-editor-empty">No annotations yet.</p>'}
|
|
225
|
+
</div>
|
|
226
|
+
<div class="wo-editor-outline-section">
|
|
227
|
+
<h3>Events</h3>
|
|
228
|
+
${r.events.length>0?r.events.map(h=>Ed(h,d,u)).join(""):'<p class="wo-editor-empty">No events yet.</p>'}
|
|
216
229
|
</div>
|
|
217
230
|
<div class="wo-editor-outline-section">
|
|
218
231
|
<h3>Objects</h3>
|
|
219
|
-
${
|
|
232
|
+
${r.objects.length>0?r.objects.map(h=>Ye({kind:"object",id:h.id},`${h.id} - ${h.type}`,d,u)).join(""):'<p class="wo-editor-empty">No objects yet.</p>'}
|
|
220
233
|
</div>
|
|
221
|
-
`}function
|
|
222
|
-
<strong>${
|
|
223
|
-
<span>${
|
|
224
|
-
<p>${
|
|
225
|
-
</article>`}).join("")}function
|
|
226
|
-
<strong>${
|
|
227
|
-
<span>${
|
|
228
|
-
<p>${
|
|
229
|
-
</article>`}).join("")}function
|
|
230
|
-
<strong>${
|
|
231
|
-
<p>${
|
|
232
|
-
</article>`).join(""),
|
|
233
|
-
<span class="wo-editor-status-pill${
|
|
234
|
-
<span class="wo-editor-status-pill">Schema ${
|
|
235
|
-
<span class="wo-editor-status-pill${d>0?" is-error":
|
|
236
|
-
<span class="wo-editor-status-pill">${
|
|
237
|
-
`}function
|
|
238
|
-
${g.slice(0,4).map(
|
|
239
|
-
<strong>${
|
|
240
|
-
<span>${
|
|
241
|
-
<p>${
|
|
234
|
+
`}function Bt(){he.innerHTML=c.length===0?'<p class="wo-editor-empty">No diagnostics.</p>':c.map(d=>{let u=d.path?rr(d.path):"Source",g=Li(d);return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(d.diagnostic.severity)}">
|
|
235
|
+
<strong>${L(d.diagnostic.severity.toUpperCase())}</strong>
|
|
236
|
+
<span>${L(u)}${g?` \xB7 ${L(g)}`:""}</span>
|
|
237
|
+
<p>${L(d.diagnostic.message)}</p>
|
|
238
|
+
</article>`}).join("")}function xt(){let d=c.filter(u=>!u.path||u.diagnostic.line!==void 0);ye.innerHTML=d.length===0?'<p class="wo-editor-empty">No source diagnostics.</p>':d.map(u=>{let g=Li(u)??"Source";return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(u.diagnostic.severity)}">
|
|
239
|
+
<strong>${L(u.diagnostic.severity.toUpperCase())}</strong>
|
|
240
|
+
<span>${L(g)}</span>
|
|
241
|
+
<p>${L(u.diagnostic.message)}</p>
|
|
242
|
+
</article>`}).join("")}function Ze(){if(!D)return;kd(D,A);let d={selection:a?{path:{...a}}:null,system:r.system,viewpoints:r.system?.viewpoints??[],events:r.events,objects:r.objects};if(!a){D.innerHTML='<p class="wo-editor-empty">Select an atlas node or object to edit it.</p>';return}let u=Zi(a,c);switch(a.kind){case"system":D.innerHTML=u+Md(d),at(D,A),Qe(a,c);return;case"defaults":D.innerHTML=u+Dd(d),at(D,A),Qe(a,c);return;case"metadata":D.innerHTML=u+Ld(d,a.key??""),at(D,A),Qe(a,c);return;case"viewpoint":D.innerHTML=u+Ad(d,a.id??""),at(D,A),Qe(a,c);return;case"event":D.innerHTML=u+Td(d,a.id??""),at(D,A),Qe(a,c);return;case"event-pose":D.innerHTML=u+Pd(d,a.id??"",a.key??""),at(D,A),Qe(a,c);return;case"annotation":D.innerHTML=u+Cd(d,a.id??""),at(D,A),Qe(a,c);return;case"object":D.innerHTML=u+Fd(d,a.id??""),at(D,A),Qe(a,c);return}}function It(){ae&&ae.value!==i&&(ae.value=i)}function _t(d=!1){if(d){qr();return}Hr()}function Me(){if(!T)return;Y.innerHTML="";let d=a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null;if(!d)return;let u=T.getObjectDetails(d);if(!u)return;if(Nt(u.renderObject.x,u.renderObject.y,u.renderObject.objectId),u.parent&&Nt(u.parent.x,u.parent.y,`Parent: ${u.parent.objectId}`,!0),u.renderObject.anchorX!==void 0&&u.renderObject.anchorY!==void 0&&Nt(u.renderObject.anchorX,u.renderObject.anchorY,"Anchor",!0),u.object.placement?.mode==="orbit"&&u.orbit){let h=Ue({x:u.renderObject.x,y:u.renderObject.y});Y.append(vn("orbit-phase",u.objectId,h,"Phase"));let j=Ie(u);Y.append(vn("orbit-radius",u.objectId,j,"Size"))}if(u.object.placement?.mode==="at"){Y.append(vn("at-reference",u.objectId,Ue({x:u.renderObject.x,y:u.renderObject.y}),"Reference"));let h=document.createElement("div");h.className="wo-editor-hint wo-editor-hint-note",h.textContent="Drag to an object center or nearby Lagrange point.",Y.append(h)}if(u.object.placement?.mode==="surface"){Y.append(vn("surface-target",u.objectId,Ue({x:u.renderObject.x,y:u.renderObject.y}),"Surface"));let h=document.createElement("div");h.className="wo-editor-hint wo-editor-hint-note",h.textContent="Drag onto another surface-capable body.",Y.append(h)}if(u.object.placement?.mode==="free"){Y.append(vn("free-distance",u.objectId,Ue({x:u.renderObject.x,y:u.renderObject.y}),"Offset"));let h=document.createElement("div");h.className="wo-editor-hint wo-editor-hint-note",h.textContent="Drag horizontally to change free offset.",Y.append(h)}let g=Ki(a,c).slice(0,3);if(g.length>0){let h=document.createElement("div");h.className="wo-editor-overlay-diagnostics",h.setAttribute("role","status"),h.setAttribute("aria-live","polite"),h.innerHTML=g.map(j=>`<article class="wo-editor-overlay-diagnostic wo-editor-overlay-diagnostic-${L(j.diagnostic.severity)}">
|
|
243
|
+
<strong>${L(j.diagnostic.severity.toUpperCase())}</strong>
|
|
244
|
+
<p>${L(j.diagnostic.message)}</p>
|
|
245
|
+
</article>`).join(""),Y.append(h)}}function Nt(d,u,g,h=!1){let j=Ue({x:d,y:u}),E=document.createElement("div");E.className=`wo-editor-hint${h?" is-subtle":""}`,E.style.left=`${j.x}px`,E.style.top=`${j.y}px`,E.textContent=g,Y.append(E)}function Ie(d){let u=d.orbit;if(!u)return Ue({x:d.renderObject.x,y:d.renderObject.y});let g={x:u.cx+(u.kind==="circle"?u.radius??0:u.rx??0),y:u.cy},h=we(g,{x:u.cx,y:u.cy},u.rotationDeg);return Ue(h)}function Ue(d){let u=T.getScene(),g=T.getState(),h={x:u.width/2,y:u.height/2},j=we(d,h,g.rotationDeg),E={x:h.x+(j.x-h.x)*g.scale+g.translateX,y:h.y+(j.y-h.y)*g.scale+g.translateY},U=ne.querySelector("svg");if(!U)return E;let J=U.getBoundingClientRect(),ie=X.getBoundingClientRect();return{x:J.left-ie.left+E.x/Math.max(u.width,1)*J.width,y:J.top-ie.top+E.y/Math.max(u.height,1)*J.height}}function Sn(d){let u=d.target?.closest("[data-editor-action]");if(u)switch(u.dataset.editorAction){case"add-object":{let g=W.querySelector("[data-editor-add-object-type]")?.value;V.addObject(g??"planet");return}case"add-viewpoint":V.addViewpoint();return;case"add-event":V.addEvent();return;case"add-annotation":V.addAnnotation();return;case"add-metadata":V.addMetadata();return;case"remove":V.removeSelection();return;case"undo":V.undo();return;case"redo":V.redo();return;case"format":N(),i=o,It(),ue();return}}function On(d){let u=d.target?.closest("[data-path-kind]");u&&ve({kind:u.dataset.pathKind,id:u.dataset.pathId||void 0,key:u.dataset.pathKey||void 0},!0,!0)}function En(d){let u=d.target?.closest("[data-path-kind]");if(u){ve({kind:u.dataset.pathKind,id:u.dataset.pathId||void 0,key:u.dataset.pathKey||void 0},!0,!0);return}let g=d.target?.closest("[data-editor-action]");if(g&&g.dataset.editorAction==="add-event-pose"){let h=g.dataset.editorEventId||(a?.kind==="event"||a?.kind==="event-pose"?a.id??"":"");if(!h)return;let j=iu(r,h),E=j.events.find(J=>J.id===h),U=E?.positions.at(-1)??E?.positions[0];K(j,!0,U?{kind:"event-pose",id:h,key:U.objectId}:{kind:"event",id:h});return}}function Mn(){m(!1)}function ht(){m(!0)}function m(d){if(!(!a||!D))switch(a.kind){case"system":K(Ut(),d,a,!1);return;case"defaults":K(zt(),d,a,!1);return;case"metadata":K(Wt(a.key??""),d,a,!1);return;case"viewpoint":K(cr(a.id??""),d,a,!1);return;case"event":K(Wi(a.id??""),d,a,!1);return;case"event-pose":K(Yi(a.id??"",a.key??""),d,a,!1);return;case"annotation":K(Hi(a.id??""),d,a,!1);return;case"object":K(qi(a.id??""),d,a,!1);return}}function b(){i=ae?.value??"",ue(),N(),k=window.setTimeout(()=>{k=null,mt(i,!1)},md)}function $(){N(),mt(ae?.value??"",!0)&&It()}function Z(d){if(d.key==="Escape"&&f){d.preventDefault(),je();return}if(!te||d.defaultPrevented||Xi(d))return;let u=(d.ctrlKey||d.metaKey)&&!d.shiftKey&&d.key.toLowerCase()==="z",g=(d.ctrlKey||d.metaKey)&&(d.shiftKey&&d.key.toLowerCase()==="z"||d.key.toLowerCase()==="y");if(u){d.preventDefault(),V.undo();return}g&&(d.preventDefault(),V.redo())}function R(d){let u=d.target?.closest("[data-handle-kind]");if(!u)return;let g=u.dataset.objectId,h=u.dataset.handleKind;if(!g||!["orbit-phase","orbit-radius","at-reference","surface-target","free-distance"].includes(h))return;if(N(),i!==o&&!mt(i,!0)){d.preventDefault();return}let j=T?.getObjectDetails(g)??null;f={kind:h,objectId:g,pointerId:d.pointerId,path:a?{...a}:{kind:"object",id:g},startedFrom:O(),changed:!1,orbitRadiusContext:h==="orbit-radius"&&j?Kd(r,T.getScene(),j):null},u.setPointerCapture?.(d.pointerId),d.preventDefault()}function F(d){if(!f||f.pointerId!==d.pointerId||!a||He(a)!==He(f.path))return;let u=T.getObjectDetails(f.objectId);if(!u)return;let g=Je(d.clientX,d.clientY),h=r;switch(f.kind){case"orbit-phase":u.object.placement?.mode==="orbit"&&u.orbit&&(h=Hd(r,f.path,f.objectId,u,g));break;case"orbit-radius":u.object.placement?.mode==="orbit"&&u.orbit&&(h=qd(r,f.path,f.objectId,u,g,f.orbitRadiusContext??null));break;case"at-reference":u.object.placement?.mode==="at"&&(h=Gd(r,f.path,f.objectId,T.getScene(),g));break;case"surface-target":u.object.placement?.mode==="surface"&&(h=Xd(r,f.path,f.objectId,T.getScene(),g));break;case"free-distance":u.object.placement?.mode==="free"&&(h=Zd(r,f.path,f.objectId,T.getScene(),u,g));break}h!==r&&(f.changed=!0,r=z(h),c=dt(r),Ge({preserveCamera:!0,applyViewpointSelection:!1}),Bt(),xt(),Ke(),Ze(),Me(),Yt(),Dn(),Hr(),ue())}function Ce(d){if(!f||f.pointerId!==d.pointerId)return;let u=f;if(!f.changed){f=null;return}l.push(f.startedFrom),p.length=0,o=lt(r),i=o,f=null,Pe(),u.kind==="orbit-radius"&&Gi(u.objectId),ue(),Te()}function je(){if(!f)return;let d=f.startedFrom;f=null,r=z(d.atlasDocument),o=d.source,i=o,c=dt(r),ve(d.selection,!1,!1),Ge({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),Pe(),ue(),Te()}function Je(d,u){let g=ne.querySelector("svg"),h=T.getScene();if(!g)return{x:h.width/2,y:h.height/2};let j=g.getBoundingClientRect(),E={x:(d-j.left)/Math.max(j.width,1)*h.width,y:(u-j.top)/Math.max(j.height,1)*h.height};return vt(h,T.getState(),E)}function Ut(){let d=z(r),u=D?.querySelector("form[data-editor-form='system']");return!u||!d.system||(d.system.id=me(u,"system-id")||d.system.id,d.system.title=M(u,"system-title")),d}function zt(){let d=z(r),u=D?.querySelector("form[data-editor-form='defaults']");return!u||!d.system||(d.system.defaults.view=me(u,"defaults-view")||"topdown",d.system.defaults.scale=M(u,"defaults-scale"),d.system.defaults.units=M(u,"defaults-units"),d.system.defaults.preset=M(u,"defaults-preset")??null,d.system.defaults.theme=M(u,"defaults-theme")),d}function Wt(d){let u=z(r),g=D?.querySelector("form[data-editor-form='metadata']");if(!g||!u.system)return u;let h=me(g,"metadata-key")||d,j=M(g,"metadata-value")??"";return h!==d?(delete u.system.atlasMetadata[d],u.system.atlasMetadata[h]=j,a={kind:"metadata",key:h},u):(u.system.atlasMetadata[d]=j,u)}function cr(d){let u=z(r),g=D?.querySelector("form[data-editor-form='viewpoint']"),h=u.system?.viewpoints.find(U=>U.id===d);if(!g||!h||!u.system)return u;let j=me(g,"viewpoint-id")||h.id,E={...h,id:j,label:me(g,"viewpoint-label")||h.label,summary:M(g,"viewpoint-summary")??"",focusObjectId:M(g,"viewpoint-focus"),selectedObjectId:M(g,"viewpoint-select"),projection:me(g,"viewpoint-projection")||h.projection,preset:M(g,"viewpoint-preset")??null,zoom:or(M(g,"viewpoint-zoom")),rotationDeg:or(M(g,"viewpoint-rotation"))??0,layers:{background:Be(g,"layer-background"),guides:Be(g,"layer-guides"),"orbits-back":Be(g,"layer-orbits-back"),"orbits-front":Be(g,"layer-orbits-front"),events:Be(g,"layer-events"),objects:Be(g,"layer-objects"),labels:Be(g,"layer-labels"),metadata:Be(g,"layer-metadata")},events:We(M(g,"viewpoint-events")),filter:{query:M(g,"filter-query"),objectTypes:_d(M(g,"filter-object-types")),tags:We(M(g,"filter-tags")),groupIds:We(M(g,"filter-groups"))}};return u.system.viewpoints=u.system.viewpoints.filter(U=>U.id!==h.id).concat(E).sort((U,J)=>U.id.localeCompare(J.id)),h.id!==E.id&&(a={kind:"viewpoint",id:E.id}),u}function Wi(d){let u=z(r),g=D?.querySelector("form[data-editor-form='event']"),h=u.events.find(U=>U.id===d);if(!g||!h)return u;let j=me(g,"event-id")||h.id,E={...h,id:j,kind:me(g,"event-kind"),label:me(g,"event-label")||h.label,summary:M(g,"event-summary"),targetObjectId:M(g,"event-target"),participantObjectIds:We(M(g,"event-participants")),timing:M(g,"event-timing"),visibility:M(g,"event-visibility"),tags:We(M(g,"event-tags")),color:M(g,"event-color"),hidden:Be(g,"event-hidden")};return u.events=u.events.filter(U=>U.id!==h.id).concat(E).sort(Ti),su(u,h.id,E.id,We(M(g,"event-viewpoints"))),h.id!==E.id&&(a={kind:"event",id:E.id}),u}function Yi(d,u){let g=z(r),h=D?.querySelector("form[data-editor-form='event-pose']"),j=g.events.find(De=>De.id===d),E=j?.positions.find(De=>De.objectId===u);if(!h||!j||!E)return g;let J={objectId:me(h,"pose-object-id")||E.objectId,placement:Rd(h,E)},ie=Ne(M(h,"prop-inner")),Ln=Ne(M(h,"prop-outer"));return ie&&(J.inner=ie),Ln&&(J.outer=Ln),j.positions=j.positions.filter(De=>De.objectId!==E.objectId).concat(J).sort(sr),j.targetObjectId!==J.objectId&&!j.participantObjectIds.includes(J.objectId)&&(j.participantObjectIds.push(J.objectId),j.participantObjectIds.sort((De,Ht)=>De.localeCompare(Ht))),E.objectId!==J.objectId&&(a={kind:"event-pose",id:d,key:J.objectId}),g}function Hi(d){let u=z(r),g=D?.querySelector("form[data-editor-form='annotation']"),h=u.system?.annotations.find(U=>U.id===d);if(!g||!h||!u.system)return u;let j=me(g,"annotation-id")||h.id,E={...h,id:j,label:me(g,"annotation-label")||h.label,targetObjectId:M(g,"annotation-target"),body:M(g,"annotation-body")??"",tags:We(M(g,"annotation-tags")),sourceObjectId:M(g,"annotation-source")};return u.system.annotations=u.system.annotations.filter(U=>U.id!==h.id).concat(E).sort((U,J)=>U.id.localeCompare(J.id)),h.id!==E.id&&(a={kind:"annotation",id:E.id}),u}function qi(d){let u=z(r),g=D?.querySelector("form[data-editor-form='object']"),h=u.objects.find(ie=>ie.id===d);if(!g||!h)return u;let j=me(g,"object-id")||h.id,E={...h,id:j,type:me(g,"object-type")||h.type,properties:{...h.properties},info:{...h.info},placement:Vd(g,h)};for(let ie of yd)nr(E.properties,ie,M(g,`prop-${ie}`));for(let ie of wd)nr(E.properties,ie,Bd(M(g,`prop-${ie}`)));for(let ie of vd)nr(E.properties,ie,or(M(g,`prop-${ie}`)));nr(E.properties,"tags",We(M(g,"prop-tags"))),E.properties.hidden=Be(g,"prop-hidden");let U=M(g,"info-description");U?E.info.description=U:delete E.info.description;let J=zd(u,h.id,E);return h.id!==E.id&&(a={kind:"object",id:E.id}),J}function Yt(){let d=c.filter(h=>h.diagnostic.severity==="error").length,u=c.filter(h=>h.diagnostic.severity==="warning").length,g=a?rr(a):"Nothing selected";Ee.innerHTML=`
|
|
246
|
+
<span class="wo-editor-status-pill${S?" is-dirty":" is-clean"}">${S?"Unsaved changes":"Saved"}</span>
|
|
247
|
+
<span class="wo-editor-status-pill">Schema ${L(r.version)}</span>
|
|
248
|
+
<span class="wo-editor-status-pill${d>0?" is-error":u>0?" is-warning":""}">${d} errors \xB7 ${u} warnings</span>
|
|
249
|
+
<span class="wo-editor-status-pill">${L(g)}</span>
|
|
250
|
+
`}function Dn(){let d=c.filter(g=>g.diagnostic.severity==="error").length,u=c.filter(g=>g.diagnostic.severity==="warning").length;ut.textContent=`${S?"Unsaved changes.":"Saved."} ${d} errors, ${u} warnings. ${a?rr(a):"Nothing selected"}.`}function Hr(){C===null&&(C=window.setTimeout(()=>{C=null,qr()},gd))}function qr(){if(!T)return;let d=T.exportSvg();pt&&d!==q&&(pt.innerHTML=d,q=d);let u=Ai(le(),r);ft&&u!==v&&(ft.textContent=u,v=u)}function Gi(d){if(!T)return;let u=T.getObjectDetails(d);if(!u)return;let g=fn(T.getScene(),T.getState()),h=36/Math.max(T.getState().scale,.001),j=u.renderObject;(j.x<g.minX+h||j.x>g.maxX-h||j.y<g.minY+h||j.y>g.maxY-h)&&T.fitToSystem()}function Xi(d){let u=d.target;if(!u)return!1;let g=u.tagName.toLowerCase();return u.isContentEditable||g==="input"||g==="textarea"||g==="select"}function lr(d,u){if(!d)return[];let g=He(d);return u.filter(h=>{let j=He(h.path);return j&&j===g?!0:d.kind==="object"&&h.diagnostic.objectId===d.id})}function Ki(d,u){return lr(d,u).filter(g=>{let h=g.diagnostic.field??"";return zr.has(h)||g.diagnostic.message.toLowerCase().includes("placement")||g.diagnostic.message.toLowerCase().includes("orbit")||g.diagnostic.message.toLowerCase().includes("surface")||g.diagnostic.message.toLowerCase().includes("lagrange")||g.diagnostic.message.toLowerCase().includes("anchor")})}function Zi(d,u){let g=lr(d,u);return g.length===0?"":`<div class="wo-editor-inspector-summary">
|
|
251
|
+
${g.slice(0,4).map(h=>`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(h.diagnostic.severity)}">
|
|
252
|
+
<strong>${L(h.diagnostic.severity.toUpperCase())}</strong>
|
|
253
|
+
<span>${L(h.diagnostic.field??rr(d))}</span>
|
|
254
|
+
<p>${L(h.diagnostic.message)}</p>
|
|
242
255
|
</article>`).join("")}
|
|
243
|
-
</div>`}function
|
|
256
|
+
</div>`}function Qe(d,u){if(!D||!d)return;let g=lr(d,u),h=new Map;for(let j of g)for(let E of nu(d,j.diagnostic.field)){let U=h.get(E)??[];U.push(j),h.set(E,U)}for(let[j,E]of h){let U=D.querySelector(`[name="${CSS.escape(j)}"]`),J=U?.closest(".wo-editor-field, .wo-editor-checkbox");if(!U||!J)continue;let ie=E.some(Ht=>Ht.diagnostic.severity==="error"),Ln=E.some(Ht=>Ht.diagnostic.severity==="warning");J.classList.add(ie?"has-error":"has-warning"),U.setAttribute("aria-invalid",ie?"true":"false");let De=document.createElement("div");De.className=`wo-editor-field-note${ie?" is-error":Ln?" is-warning":""}`,De.textContent=E[0]?.diagnostic.message??"",J.append(De)}}}function xd(e){if(e.atlasDocument){let n=z(e.atlasDocument);return{atlasDocument:n,source:lt(n),diagnostics:dt(n)}}if(e.source){let n=un(e.source);if(n.ok&&n.value){let r=n.value.atlasDocument??yt(n.value.document);return{atlasDocument:r,source:lt(r),diagnostics:Bi(dn(r,n.diagnostics),dt(r))}}}let t=Gn("WorldOrbit");return{atlasDocument:t,source:lt(t),diagnostics:dt(t)}}function lt(e){return Wn(e,{schema:e.version})}function Id(){let e=Od();return`<section class="wo-editor-shell">
|
|
244
257
|
<div class="wo-editor-toolbar" data-editor-toolbar></div>
|
|
245
258
|
<div class="wo-editor-status" data-editor-status role="status" aria-live="polite"></div>
|
|
246
259
|
<div class="wo-editor-main">
|
|
247
260
|
<aside class="wo-editor-sidebar" data-editor-pane="sidebar">
|
|
248
|
-
<div class="wo-editor-panel">${
|
|
249
|
-
<div class="wo-editor-panel">${
|
|
261
|
+
<div class="wo-editor-panel">${wn("Atlas","atlas",'<div class="wo-editor-outline" data-editor-outline></div>')}</div>
|
|
262
|
+
<div class="wo-editor-panel">${wn("Diagnostics","diagnostics",'<div class="wo-editor-diagnostics" data-editor-diagnostics></div>')}</div>
|
|
250
263
|
</aside>
|
|
251
264
|
<div class="wo-editor-stage-panel">
|
|
252
265
|
<div class="wo-editor-stage-shell" data-editor-stage-shell>
|
|
@@ -254,7 +267,7 @@
|
|
|
254
267
|
<div class="wo-editor-overlay" data-editor-overlay></div>
|
|
255
268
|
</div>
|
|
256
269
|
<div class="wo-editor-panel" data-editor-pane="preview">
|
|
257
|
-
${
|
|
270
|
+
${wn("Preview","preview",`<div class="wo-editor-preview">
|
|
258
271
|
<div class="wo-editor-preview-card">
|
|
259
272
|
<h3>Static SVG</h3>
|
|
260
273
|
<div class="wo-editor-preview-visual" data-editor-preview-visual></div>
|
|
@@ -267,11 +280,11 @@
|
|
|
267
280
|
</div>
|
|
268
281
|
</div>
|
|
269
282
|
<aside class="wo-editor-panel wo-editor-inspector" data-editor-pane="inspector">
|
|
270
|
-
${
|
|
283
|
+
${wn("Inspector","inspector","<div data-editor-inspector></div>")}
|
|
271
284
|
</aside>
|
|
272
285
|
</div>
|
|
273
286
|
<div class="wo-editor-panel wo-editor-text-panel" data-editor-pane="text">
|
|
274
|
-
${
|
|
287
|
+
${wn("Source","source",`<textarea
|
|
275
288
|
class="wo-editor-source"
|
|
276
289
|
data-editor-source
|
|
277
290
|
spellcheck="false"
|
|
@@ -285,104 +298,146 @@
|
|
|
285
298
|
></div>`)}
|
|
286
299
|
</div>
|
|
287
300
|
<div class="wo-editor-live-region" data-editor-live aria-live="polite" aria-atomic="true"></div>
|
|
288
|
-
</section>`}function
|
|
289
|
-
<summary><span>${
|
|
290
|
-
<div class="wo-editor-panel-section-body">${
|
|
291
|
-
</details>`}function
|
|
292
|
-
<summary><span>${
|
|
293
|
-
<div class="wo-editor-inspector-section-body">${
|
|
294
|
-
</details>`}function
|
|
295
|
-
<summary aria-label="Explain ${
|
|
301
|
+
</section>`}function wn(e,t,n,r=!0){return`<details class="wo-editor-panel-section" data-editor-panel-section="${L(t)}"${r?" open":""}>
|
|
302
|
+
<summary><span>${L(e)}</span></summary>
|
|
303
|
+
<div class="wo-editor-panel-section-body">${n}</div>
|
|
304
|
+
</details>`}function ge(e,t,n,r,o=!1){let i=Sd(e,t);return`<details class="wo-editor-inspector-section" data-editor-form-section="${L(t)}" data-editor-form-id="${L(e)}" data-editor-section-state="${L(i)}"${o?" open":""}>
|
|
305
|
+
<summary><span>${L(n)}</span></summary>
|
|
306
|
+
<div class="wo-editor-inspector-section-body">${r}</div>
|
|
307
|
+
</details>`}function ar(e,t){return`<span class="wo-editor-field-label">${L(e)}${jd(t)}</span>`}function jd(e){let t=$d[e];return t?`<details class="wo-editor-field-help">
|
|
308
|
+
<summary aria-label="Explain ${zi(e)}">?</summary>
|
|
296
309
|
<div class="wo-editor-field-help-card">
|
|
297
|
-
<p>${
|
|
298
|
-
${(t.references?.length??0)>0?`<div class="wo-editor-field-help-chips">${(t.references??[]).map(
|
|
310
|
+
<p>${L(t.description)}</p>
|
|
311
|
+
${(t.references?.length??0)>0?`<div class="wo-editor-field-help-chips">${(t.references??[]).map(n=>`<span>${L(n)}</span>`).join("")}</div>`:""}
|
|
299
312
|
</div>
|
|
300
|
-
</details>`:""}function
|
|
313
|
+
</details>`:""}function kd(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;r&&t.set(r,n.open)}}function at(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;!r||!t.has(r)||(n.open=t.get(r)===!0)}}function Sd(e,t){return`${e}:${t}`}function Od(){return typeof window>"u"?!0:typeof window.matchMedia=="function"?!window.matchMedia("(max-width: 1280px)").matches:window.innerWidth>1280}function Ye(e,t,n,r){let o=He(e),i=o?r.get(o):null,s=i&&(i.errors>0||i.warnings>0)?`<span class="wo-editor-outline-badge${i.errors>0?" is-error":" is-warning"}">${i.errors>0?i.errors:i.warnings}</span>`:"";return`<button type="button" class="wo-editor-outline-item${o===n?" is-active":""}" data-path-kind="${L(e.kind)}"${e.id?` data-path-id="${L(e.id)}"`:""}${e.key?` data-path-key="${L(e.key)}"`:""}><span>${L(t)}</span>${s}</button>`}function Ed(e,t,n){return`<div class="wo-editor-outline-group">
|
|
314
|
+
${Ye({kind:"event",id:e.id},e.label||e.id,t,n)}
|
|
315
|
+
${e.positions.length>0?`<div class="wo-editor-outline-children">${[...e.positions].sort(sr).map(r=>Ye({kind:"event-pose",id:e.id,key:r.objectId},r.objectId,t,n)).join("")}</div>`:""}
|
|
316
|
+
</div>`}function Md(e){return`<form class="wo-editor-form" data-editor-form="system">
|
|
301
317
|
<h2>System</h2>
|
|
302
|
-
${
|
|
303
|
-
${
|
|
304
|
-
</form>`}function
|
|
318
|
+
${ge("system","basics","Basics",`${I("System ID","system-id",e.system?.id??"")}
|
|
319
|
+
${I("Title","system-title",e.system?.title??"")}`,!0)}
|
|
320
|
+
</form>`}function Dd(e){let t=e.system?.defaults;return`<form class="wo-editor-form" data-editor-form="defaults">
|
|
305
321
|
<h2>Defaults</h2>
|
|
306
|
-
${
|
|
307
|
-
${
|
|
308
|
-
${
|
|
309
|
-
${
|
|
310
|
-
${
|
|
311
|
-
</form>`}function
|
|
322
|
+
${ge("defaults","basics","Basics",`${$t("Projection","defaults-view",[["topdown","Topdown"],["isometric","Isometric"]],t?.view??"topdown")}
|
|
323
|
+
${I("Scale preset","defaults-scale",t?.scale??"")}
|
|
324
|
+
${I("Units","defaults-units",t?.units??"")}
|
|
325
|
+
${$t("Render preset","defaults-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],t?.preset??"")}
|
|
326
|
+
${I("Theme","defaults-theme",t?.theme??"")}`,!0)}
|
|
327
|
+
</form>`}function Ld(e,t){let n=e.system?.atlasMetadata[t]??"";return`<form class="wo-editor-form" data-editor-form="metadata">
|
|
312
328
|
<h2>Metadata</h2>
|
|
313
|
-
${
|
|
314
|
-
${
|
|
315
|
-
</form>`}function
|
|
329
|
+
${ge("metadata","entry","Entry",`${I("Key","metadata-key",t)}
|
|
330
|
+
${jn("Value","metadata-value",n)}`,!0)}
|
|
331
|
+
</form>`}function Ad(e,t){let n=e.viewpoints.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="viewpoint">
|
|
316
332
|
<h2>Viewpoint</h2>
|
|
317
|
-
${
|
|
318
|
-
${
|
|
319
|
-
${
|
|
320
|
-
${
|
|
321
|
-
${
|
|
322
|
-
${
|
|
323
|
-
${
|
|
324
|
-
${
|
|
325
|
-
${
|
|
326
|
-
${
|
|
333
|
+
${ge("viewpoint","basics","Basics",`${I("ID","viewpoint-id",n.id)}
|
|
334
|
+
${I("Label","viewpoint-label",n.label)}
|
|
335
|
+
${jn("Summary","viewpoint-summary",n.summary)}
|
|
336
|
+
${I("Focus object","viewpoint-focus",n.focusObjectId??"")}
|
|
337
|
+
${I("Selected object","viewpoint-select",n.selectedObjectId??"")}
|
|
338
|
+
${$t("Projection","viewpoint-projection",[["topdown","Topdown"],["isometric","Isometric"]],n.projection)}
|
|
339
|
+
${$t("Preset","viewpoint-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],n.preset??"")}
|
|
340
|
+
${I("Zoom","viewpoint-zoom",n.zoom===null?"":String(n.zoom))}
|
|
341
|
+
${I("Rotation","viewpoint-rotation",String(n.rotationDeg))}`,!0)}
|
|
342
|
+
${ge("viewpoint","layers","Layers",`<fieldset class="wo-editor-fieldset">
|
|
327
343
|
<legend>Layers</legend>
|
|
328
|
-
${
|
|
329
|
-
${
|
|
330
|
-
${
|
|
331
|
-
${
|
|
332
|
-
${
|
|
333
|
-
${
|
|
334
|
-
${
|
|
344
|
+
${_e("Background","layer-background",n.layers.background!==!1)}
|
|
345
|
+
${_e("Guides","layer-guides",n.layers.guides!==!1)}
|
|
346
|
+
${_e("Orbits back","layer-orbits-back",n.layers["orbits-back"]!==!1)}
|
|
347
|
+
${_e("Orbits front","layer-orbits-front",n.layers["orbits-front"]!==!1)}
|
|
348
|
+
${_e("Events","layer-events",n.layers.events!==!1)}
|
|
349
|
+
${_e("Objects","layer-objects",n.layers.objects!==!1)}
|
|
350
|
+
${_e("Labels","layer-labels",n.layers.labels!==!1)}
|
|
351
|
+
${_e("Metadata","layer-metadata",n.layers.metadata!==!1)}
|
|
335
352
|
</fieldset>`)}
|
|
336
|
-
${
|
|
337
|
-
${
|
|
338
|
-
${
|
|
339
|
-
${
|
|
340
|
-
|
|
353
|
+
${ge("viewpoint","filter","Filter",`${I("Filter query","filter-query",n.filter?.query??"")}
|
|
354
|
+
${I("Filter object types","filter-object-types",n.filter?.objectTypes.join(" ")??"")}
|
|
355
|
+
${I("Filter tags","filter-tags",n.filter?.tags.join(" ")??"")}
|
|
356
|
+
${I("Filter groups","filter-groups",n.filter?.groupIds.join(" ")??"")}
|
|
357
|
+
${I("Events","viewpoint-events",n.events.join(" "))}`)}
|
|
358
|
+
</form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function Td(e,t){let n=e.events.find(o=>o.id===t);if(!n)return'<p class="wo-editor-empty">Event not found.</p>';let r=e.viewpoints.filter(o=>o.events.includes(n.id)).map(o=>o.id).join(" ");return`<form class="wo-editor-form" data-editor-form="event">
|
|
359
|
+
<h2>Event</h2>
|
|
360
|
+
${ge("event","basics","Basics",`${I("ID","event-id",n.id)}
|
|
361
|
+
${I("Kind","event-kind",n.kind)}
|
|
362
|
+
${I("Label","event-label",n.label)}
|
|
363
|
+
${jn("Summary","event-summary",n.summary??"")}
|
|
364
|
+
${I("Target object","event-target",n.targetObjectId??"")}
|
|
365
|
+
${I("Participants","event-participants",n.participantObjectIds.join(" "))}
|
|
366
|
+
${I("Timing","event-timing",n.timing??"")}
|
|
367
|
+
${I("Visibility","event-visibility",n.visibility??"")}
|
|
368
|
+
${I("Tags","event-tags",n.tags.join(" "))}
|
|
369
|
+
${I("Color","event-color",n.color??"")}
|
|
370
|
+
${_e("Hidden","event-hidden",n.hidden===!0)}`,!0)}
|
|
371
|
+
${ge("event","viewpoints","Viewpoints",`${I("Viewpoints","event-viewpoints",r)}`)}
|
|
372
|
+
${ge("event","positions","Positions",`${n.positions.length>0?`<div class="wo-editor-inline-list">${n.positions.map(o=>Ye({kind:"event-pose",id:n.id,key:o.objectId},o.objectId,null,new Map)).join("")}</div>`:'<p class="wo-editor-empty">No event poses yet.</p>'}
|
|
373
|
+
<div class="wo-editor-inline-actions">
|
|
374
|
+
<button type="button" data-editor-action="add-event-pose" data-editor-event-id="${L(n.id)}">Add pose</button>
|
|
375
|
+
</div>`)}
|
|
376
|
+
</form>`}function Pd(e,t,n){let r=e.events.find(a=>a.id===t),o=r?.positions.find(a=>a.objectId===n);if(!r||!o)return'<p class="wo-editor-empty">Event pose not found.</p>';let i=o.placement?.mode??"",s=o.placement?.mode==="orbit"||o.placement?.mode==="surface"||o.placement?.mode==="at"?o.placement.target:"",c=o.placement?.mode==="free"?o.placement.distance?pe(o.placement.distance):o.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="event-pose">
|
|
377
|
+
<h2>Event Pose</h2>
|
|
378
|
+
<p class="wo-editor-inline-note">Event <strong>${L(r.label||r.id)}</strong></p>
|
|
379
|
+
${ge("event-pose","identity","Identity",`${I("Object","pose-object-id",o.objectId)}
|
|
380
|
+
<div class="wo-editor-inline-actions">
|
|
381
|
+
<button type="button" data-path-kind="event" data-path-id="${L(r.id)}">Select event</button>
|
|
382
|
+
</div>`,!0)}
|
|
383
|
+
${ge("event-pose","placement","Placement",`${$t("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],i)}
|
|
384
|
+
${I("Placement target","placement-target",s)}
|
|
385
|
+
${I("Free value","placement-free",c)}
|
|
386
|
+
${I("Distance","placement-distance",o.placement?.mode==="orbit"&&o.placement.distance?pe(o.placement.distance):"")}
|
|
387
|
+
${I("Semi-major","placement-semiMajor",o.placement?.mode==="orbit"&&o.placement.semiMajor?pe(o.placement.semiMajor):"")}
|
|
388
|
+
${I("Eccentricity","placement-eccentricity",o.placement?.mode==="orbit"&&o.placement.eccentricity!==void 0?String(o.placement.eccentricity):"")}
|
|
389
|
+
${I("Period","placement-period",o.placement?.mode==="orbit"&&o.placement.period?pe(o.placement.period):"")}
|
|
390
|
+
${I("Angle","placement-angle",o.placement?.mode==="orbit"&&o.placement.angle?pe(o.placement.angle):"")}
|
|
391
|
+
${I("Inclination","placement-inclination",o.placement?.mode==="orbit"&&o.placement.inclination?pe(o.placement.inclination):"")}
|
|
392
|
+
${I("Phase","placement-phase",o.placement?.mode==="orbit"&&o.placement.phase?pe(o.placement.phase):"")}
|
|
393
|
+
${I("Inner","prop-inner",o.inner?pe(o.inner):"")}
|
|
394
|
+
${I("Outer","prop-outer",o.outer?pe(o.outer):"")}`,!0)}
|
|
395
|
+
</form>`}function Cd(e,t){let n=e.system?.annotations.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="annotation">
|
|
341
396
|
<h2>Annotation</h2>
|
|
342
|
-
${
|
|
343
|
-
${
|
|
344
|
-
${
|
|
345
|
-
${
|
|
346
|
-
${
|
|
347
|
-
${
|
|
348
|
-
</form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function
|
|
397
|
+
${ge("annotation","entry","Entry",`${I("ID","annotation-id",n.id)}
|
|
398
|
+
${I("Label","annotation-label",n.label)}
|
|
399
|
+
${I("Target object","annotation-target",n.targetObjectId??"")}
|
|
400
|
+
${I("Source object","annotation-source",n.sourceObjectId??"")}
|
|
401
|
+
${jn("Body","annotation-body",n.body)}
|
|
402
|
+
${I("Tags","annotation-tags",n.tags.join(" "))}`,!0)}
|
|
403
|
+
</form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function Fd(e,t){let n=e.objects.find(s=>s.id===t);if(!n)return'<p class="wo-editor-empty">Object not found.</p>';let r=n.placement?.mode??"",o=n.placement?.mode==="orbit"||n.placement?.mode==="surface"||n.placement?.mode==="at"?n.placement.target:"",i=n.placement?.mode==="free"?n.placement.distance?pe(n.placement.distance):n.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="object">
|
|
349
404
|
<h2>Object</h2>
|
|
350
|
-
${
|
|
351
|
-
${
|
|
352
|
-
${
|
|
353
|
-
${
|
|
354
|
-
${
|
|
355
|
-
${
|
|
356
|
-
${
|
|
357
|
-
${
|
|
358
|
-
${
|
|
359
|
-
${
|
|
360
|
-
${
|
|
361
|
-
${
|
|
362
|
-
${
|
|
405
|
+
${ge("object","identity","Identity",`${I("ID","object-id",n.id)}
|
|
406
|
+
${$t("Type","object-type",Yr.map(s=>[s,xn(s)]),n.type)}`,!0)}
|
|
407
|
+
${ge("object","placement","Placement",`${$t("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],r)}
|
|
408
|
+
${I("Placement target","placement-target",o)}
|
|
409
|
+
${I("Free value","placement-free",i)}
|
|
410
|
+
${I("Distance","placement-distance",n.placement?.mode==="orbit"&&n.placement.distance?pe(n.placement.distance):"")}
|
|
411
|
+
${I("Semi-major","placement-semiMajor",n.placement?.mode==="orbit"&&n.placement.semiMajor?pe(n.placement.semiMajor):"")}
|
|
412
|
+
${I("Eccentricity","placement-eccentricity",n.placement?.mode==="orbit"&&n.placement.eccentricity!==void 0?String(n.placement.eccentricity):"")}
|
|
413
|
+
${I("Period","placement-period",n.placement?.mode==="orbit"&&n.placement.period?pe(n.placement.period):"")}
|
|
414
|
+
${I("Angle","placement-angle",n.placement?.mode==="orbit"&&n.placement.angle?pe(n.placement.angle):"")}
|
|
415
|
+
${I("Inclination","placement-inclination",n.placement?.mode==="orbit"&&n.placement.inclination?pe(n.placement.inclination):"")}
|
|
416
|
+
${I("Phase","placement-phase",n.placement?.mode==="orbit"&&n.placement.phase?pe(n.placement.phase):"")}`,!0)}
|
|
417
|
+
${ge("object","properties","Properties",`<fieldset class="wo-editor-fieldset">
|
|
363
418
|
<legend>Properties</legend>
|
|
364
|
-
${
|
|
365
|
-
${
|
|
366
|
-
${
|
|
367
|
-
${
|
|
368
|
-
${
|
|
369
|
-
${
|
|
370
|
-
${
|
|
371
|
-
${
|
|
372
|
-
${
|
|
373
|
-
${
|
|
374
|
-
${
|
|
375
|
-
${
|
|
376
|
-
${
|
|
377
|
-
${
|
|
378
|
-
${
|
|
379
|
-
${
|
|
380
|
-
${
|
|
381
|
-
${
|
|
382
|
-
${
|
|
419
|
+
${I("Kind","prop-kind",st(n.properties.kind))}
|
|
420
|
+
${I("Class","prop-class",st(n.properties.class))}
|
|
421
|
+
${I("Culture","prop-culture",st(n.properties.culture))}
|
|
422
|
+
${I("Tags","prop-tags",cu(n.properties.tags))}
|
|
423
|
+
${I("Color","prop-color",st(n.properties.color))}
|
|
424
|
+
${I("Image","prop-image",st(n.properties.image))}
|
|
425
|
+
${_e("Hidden","prop-hidden",n.properties.hidden===!0)}
|
|
426
|
+
${I("Radius","prop-radius",ct(n.properties.radius))}
|
|
427
|
+
${I("Mass","prop-mass",ct(n.properties.mass))}
|
|
428
|
+
${I("Density","prop-density",ct(n.properties.density))}
|
|
429
|
+
${I("Gravity","prop-gravity",ct(n.properties.gravity))}
|
|
430
|
+
${I("Temperature","prop-temperature",ct(n.properties.temperature))}
|
|
431
|
+
${I("Albedo","prop-albedo",lu(n.properties.albedo))}
|
|
432
|
+
${I("Atmosphere","prop-atmosphere",st(n.properties.atmosphere))}
|
|
433
|
+
${I("Inner","prop-inner",ct(n.properties.inner))}
|
|
434
|
+
${I("Outer","prop-outer",ct(n.properties.outer))}
|
|
435
|
+
${I("On","prop-on",st(n.properties.on))}
|
|
436
|
+
${I("Source","prop-source",st(n.properties.source))}
|
|
437
|
+
${I("Cycle","prop-cycle",ct(n.properties.cycle))}
|
|
383
438
|
</fieldset>`)}
|
|
384
|
-
${
|
|
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("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Ii(e){return T(e)}function jd(e){if(typeof window>"u"||typeof document>"u")throw new Error("createWorldOrbitEditor can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("WorldOrbit editor requires an HTMLElement container.")}function fe(e,t){let r=e.querySelector(t);if(!r)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return r}function Sd(){if(document.getElementById(pi))return;let e=document.createElement("style");e.id=pi,e.textContent=`
|
|
439
|
+
${ge("object","info","Info",`${jn("Description","info-description",n.info.description??"")}`)}
|
|
440
|
+
</form>`}function I(e,t,n){return`<label class="wo-editor-field">${ar(e,t)}<input name="${L(t)}" value="${zi(n)}" /></label>`}function jn(e,t,n){return`<label class="wo-editor-field">${ar(e,t)}<textarea name="${L(t)}">${L(n)}</textarea></label>`}function $t(e,t,n,r){return`<label class="wo-editor-field">${ar(e,t)}<select name="${L(t)}">${n.map(([o,i])=>`<option value="${L(o)}"${o===r?" selected":""}>${L(i)}</option>`).join("")}</select></label>`}function _e(e,t,n){return`<label class="wo-editor-checkbox"><input type="checkbox" name="${L(t)}"${n?" checked":""} />${ar(e,t)}</label>`}function vn(e,t,n,r){let o=document.createElement("button");return o.type="button",o.className="wo-editor-handle",o.dataset.handleKind=e,o.dataset.objectId=t,o.style.left=`${n.x}px`,o.style.top=`${n.y}px`,o.textContent=r,o}function me(e,t){return e.elements.namedItem(t)?.value.trim()??""}function M(e,t){let n=me(e,t);return n||null}function Be(e,t){return e.elements.namedItem(t)?.checked??!1}function Vd(e,t){return Ri(e,t.placement,t.id)}function Rd(e,t){return Ri(e,t.placement,t.objectId)}function Ri(e,t,n){let r=me(e,"placement-mode"),o=M(e,"placement-target");switch(r){case"orbit":return{mode:r,target:o??(t?.mode==="orbit"?t.target:n),distance:Ne(M(e,"placement-distance")),semiMajor:Ne(M(e,"placement-semiMajor")),eccentricity:or(M(e,"placement-eccentricity"))??void 0,period:Ne(M(e,"placement-period")),angle:Ne(M(e,"placement-angle")),inclination:Ne(M(e,"placement-inclination")),phase:Ne(M(e,"placement-phase"))};case"at":return{mode:r,target:o??n,reference:In(o??n)};case"surface":return{mode:r,target:o??n};case"free":{let i=M(e,"placement-free"),s=Ne(i);return{mode:r,distance:s??void 0,descriptor:s?void 0:i??void 0}}default:return null}}function nr(e,t,n){let r=Array.isArray(n)&&n.length===0;if(n==null||r||n===""){delete e[t];return}e[t]=n}function Bd(e){return e?Ne(e)??e:null}function Ne(e){if(!e)return;let t=e.match(/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/);if(t)return{value:Number(t[1]),unit:t[2]??null}}function or(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function _d(e){return We(e).filter(n=>Yr.includes(n))}function We(e){return e?.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)??[]}function Nd(e,t,n){let r=n.objects.find(o=>o.type==="star")?.id??n.objects[0]?.id??t;return{type:e,id:t,properties:{},placement:e==="structure"||e==="phenomenon"?{mode:"at",target:`${r}:L4`,reference:In(`${r}:L4`)}:{mode:"orbit",target:r,distance:{value:1,unit:"au"}},info:{}}}function Ud(e,t){let n=z(e);return n.objects=n.objects.filter(r=>r.id!==t.id).concat(t).sort(_i),n}function zd(e,t,n){let r=z(e);return r.objects=r.objects.filter(o=>o.id!==t).concat(n).sort(_i),t!==n.id&&Wd(r,t,n.id),r}function Wd(e,t,n){for(let r of e.objects)if(r.id!==n&&(r.placement?.mode==="orbit"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="surface"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="at")){let o=r.placement.reference;o.kind==="anchor"&&o.objectId===t&&(o.objectId=n),o.kind==="lagrange"&&(o.primary===t&&(o.primary=n),o.secondary===t&&(o.secondary=n)),r.placement.target=Wr(o)}for(let r of e.system?.viewpoints??[])r.focusObjectId===t&&(r.focusObjectId=n),r.selectedObjectId===t&&(r.selectedObjectId=n);for(let r of e.system?.annotations??[])r.targetObjectId===t&&(r.targetObjectId=n),r.sourceObjectId===t&&(r.sourceObjectId=n);for(let r of e.events){r.targetObjectId===t&&(r.targetObjectId=n),r.participantObjectIds=r.participantObjectIds.map(o=>o===t?n:o);for(let o of r.positions)if(o.objectId===t&&(o.objectId=n),o.placement?.mode==="orbit"&&o.placement.target===t&&(o.placement.target=n),o.placement?.mode==="surface"&&o.placement.target===t&&(o.placement.target=n),o.placement?.mode==="at"){let i=o.placement.reference;i.kind==="anchor"&&i.objectId===t&&(i.objectId=n),i.kind==="lagrange"&&(i.primary===t&&(i.primary=n),i.secondary===t&&(i.secondary=n)),o.placement.target=Wr(i)}r.positions.sort(sr)}}function Yd(e,t){let n=jr(e,t);if(t.kind==="event"&&t.id){for(let r of n.system?.viewpoints??[])r.events=r.events.filter(o=>o!==t.id);return n}if(t.kind!=="object"||!t.id)return n;for(let r of n.objects)if(r.placement?.mode==="orbit"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="surface"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="at"){let o=r.placement.reference;(o.kind==="anchor"&&o.objectId===t.id||o.kind==="lagrange"&&(o.primary===t.id||o.secondary===t.id))&&(r.placement=null)}for(let r of n.system?.viewpoints??[])r.focusObjectId===t.id&&(r.focusObjectId=null),r.selectedObjectId===t.id&&(r.selectedObjectId=null);for(let r of n.system?.annotations??[])r.targetObjectId===t.id&&(r.targetObjectId=null),r.sourceObjectId===t.id&&(r.sourceObjectId=null);for(let r of n.events){r.targetObjectId===t.id&&(r.targetObjectId=null),r.participantObjectIds=r.participantObjectIds.filter(o=>o!==t.id),r.positions=r.positions.filter(o=>o.objectId!==t.id);for(let o of r.positions)if(o.placement?.mode==="orbit"&&o.placement.target===t.id&&(o.placement=null),o.placement?.mode==="surface"&&o.placement.target===t.id&&(o.placement=null),o.placement?.mode==="at"){let i=o.placement.reference;(i.kind==="anchor"&&i.objectId===t.id||i.kind==="lagrange"&&(i.primary===t.id||i.secondary===t.id))&&(o.placement=null)}}return n}function kn(e,t,n){if(t.kind==="event-pose"&&t.id&&t.key){let o=Ni(e,t.id,t.key);return o?.placement?{placement:o.placement}:null}let r=ou(e,n);return r?.placement?{placement:r.placement}:null}function Hd(e,t,n,r,o){let i=r.orbit;if(!i||r.object.placement?.mode!=="orbit")return e;let s=we(o,{x:i.cx,y:i.cy},-i.rotationDeg),c=i.kind==="circle"?i.radius??1:i.rx??1,a=i.kind==="circle"?i.radius??1:i.ry??1,l=Math.atan2((s.y-i.cy)/Math.max(a,1),(s.x-i.cx)/Math.max(c,1)),p=uu(l*180/Math.PI),f=z(e),w=kn(f,t,n);return!w||w.placement.mode!=="orbit"?e:(w.placement.phase={value:Ft(p,2),unit:"deg"},f)}function qd(e,t,n,r,o,i){let s=r.orbit;if(!s||r.object.placement?.mode!=="orbit"||!i)return e;let c=we(o,{x:s.cx,y:s.cy},-s.rotationDeg),a=Math.max(Math.abs(c.x-s.cx),24),l=Math.max(a-i.radiusOffsetPx,i.innerPx),p=gu(l,i.innerPx,i.stepPx),f=z(e),w=kn(f,t,n);if(!w||w.placement.mode!=="orbit")return e;let x=w.placement.semiMajor??w.placement.distance??{value:1,unit:"au"},S=Ui(Math.max(p,0),i.preferredUnit??x.unit);return w.placement.semiMajor?w.placement.semiMajor=S:w.placement.distance=S,f}function Gd(e,t,n,r,o){let i=Qd(r,n,o);if(!i)return e;let s=z(e),c=kn(s,t,n);return!c||c.placement.mode!=="at"?e:(c.placement.reference=i.reference,c.placement.target=Wr(i.reference),s)}function Xd(e,t,n,r,o){let i=Jd(r,n,o,a=>bd.has(a.object.type));if(!i)return e;let s=z(e),c=kn(s,t,n);return!c||c.placement.mode!=="surface"?e:(c.placement.target=i.objectId,s)}function Kd(e,t,n){if(n.object.placement?.mode!=="orbit"||!n.orbit||!n.parent)return null;let r=n.object.placement.target,o=t.objects.filter(w=>w.object.placement?.mode==="orbit"&&w.object.placement.target===r&&!w.hidden).length,i=hu(t.layoutPreset),s=(o>2?54:64)*i*t.scaleModel.orbitDistanceMultiplier,c=n.parent.radius+56*i*t.scaleModel.orbitDistanceMultiplier,a=n.object.placement.semiMajor??n.object.placement.distance??null,l=fu(a),p=n.orbit.kind==="circle"?n.orbit.radius??1:n.orbit.rx??1,f=mu(l??0,c,s);return{innerPx:c,stepPx:s,radiusOffsetPx:p-f,preferredUnit:a?.unit??null}}function Zd(e,t,n,r,o,i){if(o.object.placement?.mode!=="free")return e;let s=r.width-r.padding-140,c=Math.max(0,s-i.x),a=z(e),l=kn(a,t,n);if(!l||l.placement.mode!=="free")return e;let p=pu(l.placement.distance?.unit??null),f=c/Math.max(hd*r.scaleModel.freePlacementMultiplier,1);return f<.01?(l.placement.distance=void 0,l.placement.descriptor||delete l.placement.descriptor,a):(l.placement.distance=Ui(f,p),delete l.placement.descriptor,a)}function Jd(e,t,n,r=()=>!0){let o=null,i=Number.POSITIVE_INFINITY;for(let s of e.objects){if(s.hidden||s.objectId===t||!r(s))continue;let c=Math.hypot(n.x-s.x,n.y-s.y);c<i&&(o=s,i=c)}return i<=140?o:null}function Qd(e,t,n){let r=null;for(let c of e.objects){if(c.hidden||c.objectId===t)continue;let a=Math.hypot(n.x-c.x,n.y-c.y),l=Math.max(c.visualRadius+16,28);a<=l&&(!r||a<r.distance)&&(r={reference:In(c.objectId),x:c.x,y:c.y,distance:a})}if(r)return{reference:r.reference,x:r.x,y:r.y};let o=[];for(let c of e.objects)c.hidden||c.objectId===t||o.push({reference:In(c.objectId),x:c.x,y:c.y});for(let c of e.orbitVisuals){if(c.hidden||c.objectId===t)continue;let a=e.objects.find(p=>p.objectId===c.parentId&&!p.hidden),l=e.objects.find(p=>p.objectId===c.objectId&&!p.hidden);if(!(!a||!l))for(let p of["L1","L2","L3","L4","L5"]){let f=eu(a,l,p);o.push({reference:In(`${c.objectId}:${p}`),x:f.x,y:f.y})}}let i=null,s=Number.POSITIVE_INFINITY;for(let c of o){let a=Math.hypot(n.x-c.x,n.y-c.y);a<s&&(i=c,s=a)}return s<=140?i:null}function eu(e,t,n){let r=t.x-e.x,o=t.y-e.y,i=Math.hypot(r,o)||1,s=r/i,c=o/i,a=-c,l=s,p=du(i*.25,24,68);switch(n){case"L1":return{x:t.x-s*p,y:t.y-c*p};case"L2":return{x:t.x+s*p,y:t.y+c*p};case"L3":return{x:e.x-s*p,y:e.y-c*p};case"L4":return{x:t.x+(s*.5-a*.8660254)*p,y:t.y+(c*.5-l*.8660254)*p};case"L5":return{x:t.x+(s*.5+a*.8660254)*p,y:t.y+(c*.5+l*.8660254)*p}}}function In(e){let t=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(t)return{kind:"lagrange",primary:t[1],secondary:t[2],point:t[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};let r=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return r?{kind:"anchor",objectId:r[1],anchor:r[2]}:{kind:"named",name:e}}function Wr(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function dt(e){return kr(e)}function Bi(e,t){let n=new Set,r=[];for(let o of[...e,...t]){let i=`${o.diagnostic.code}:${o.diagnostic.message}:${He(o.path)}`;n.has(i)||(n.add(i),r.push(ir(o)))}return r}function tu(e){let t=new Map;for(let n of e){let r=He(n.path)??(n.diagnostic.objectId?He({kind:"object",id:n.diagnostic.objectId}):null);if(!r)continue;let o=t.get(r)??{errors:0,warnings:0};n.diagnostic.severity==="error"?o.errors+=1:n.diagnostic.severity==="warning"&&(o.warnings+=1),t.set(r,o)}return t}function Li(e){return e.diagnostic.line!==void 0&&e.diagnostic.column!==void 0?`Line ${e.diagnostic.line}:${e.diagnostic.column}`:e.diagnostic.line!==void 0?`Line ${e.diagnostic.line}`:null}function nu(e,t){if(!t)return[];switch(e.kind){case"system":return t==="id"?["system-id"]:t==="title"?["system-title"]:[];case"defaults":switch(t){case"view":return["defaults-view"];case"scale":return["defaults-scale"];case"units":return["defaults-units"];case"preset":return["defaults-preset"];case"theme":return["defaults-theme"];default:return[]}case"metadata":return t==="key"?["metadata-key"]:["metadata-value"];case"group":switch(t){case"id":return["group-id"];case"label":return["group-label"];case"summary":return["group-summary"];case"color":return["group-color"];case"tags":return["group-tags"];case"hidden":return["group-hidden"];default:return[]}case"viewpoint":switch(t){case"id":return["viewpoint-id"];case"label":return["viewpoint-label"];case"summary":return["viewpoint-summary"];case"focusObjectId":return["viewpoint-focus"];case"selectedObjectId":return["viewpoint-select"];case"projection":return["viewpoint-projection"];case"preset":return["viewpoint-preset"];case"zoom":return["viewpoint-zoom"];case"rotationDeg":return["viewpoint-rotation"];case"events":return["viewpoint-events"];default:return[]}case"event":switch(t){case"id":return["event-id"];case"kind":return["event-kind"];case"label":return["event-label"];case"summary":return["event-summary"];case"targetObjectId":case"target":return["event-target"];case"participantObjectIds":case"participants":return["event-participants"];case"timing":return["event-timing"];case"visibility":return["event-visibility"];case"tags":return["event-tags"];case"color":return["event-color"];case"hidden":return["event-hidden"];default:return[]}case"event-pose":return t==="objectId"?["pose-object-id"]:t==="placement"?["placement-mode"]:t==="reference"||t==="target"?["placement-target"]:t==="descriptor"?["placement-free"]:zr.has(t)?[`placement-${t}`]:t==="inner"||t==="outer"?[`prop-${t}`]:[];case"annotation":switch(t){case"id":return["annotation-id"];case"label":return["annotation-label"];case"targetObjectId":return["annotation-target"];case"sourceObjectId":return["annotation-source"];case"body":return["annotation-body"];case"tags":return["annotation-tags"];default:return[]}case"relation":switch(t){case"id":return["relation-id"];case"from":return["relation-from"];case"to":return["relation-to"];case"kind":return["relation-kind"];case"label":return["relation-label"];case"summary":return["relation-summary"];case"tags":return["relation-tags"];case"color":return["relation-color"];case"hidden":return["relation-hidden"];default:return[]}case"object":return t==="id"?["object-id"]:t==="type"?["object-type"]:t==="placement"?["placement-mode"]:t==="description"?["info-description"]:t==="reference"?["placement-target"]:t==="descriptor"?["placement-free"]:t==="target"?["placement-target"]:zr.has(t)?[`placement-${t}`]:[`prop-${t}`]}}function Ai(e,t){return yn(e,{mode:"interactive",preset:t.system?.defaults.preset??"atlas-card",projection:t.system?.defaults.view??"topdown"})}function rr(e){switch(e.kind){case"system":return"System";case"defaults":return"Defaults";case"metadata":return`Metadata: ${e.key??""}`;case"group":return`Group: ${e.id??""}`;case"event":return`Event: ${e.id??""}`;case"event-pose":return`Event Pose: ${e.id??""} / ${e.key??""}`;case"object":return`Object: ${e.id??""}`;case"viewpoint":return`Viewpoint: ${e.id??""}`;case"annotation":return`Annotation: ${e.id??""}`;case"relation":return`Relation: ${e.id??""}`}}function He(e){return e?`${e.kind}:${e.id??""}:${e.key??""}`:null}function Ur(e){return e&&(e.kind==="event"||e.kind==="event-pose")?e.id??null:null}function _i(e,t){return e.id.localeCompare(t.id)}function Ti(e,t){return e.id.localeCompare(t.id)}function sr(e,t){return e.objectId.localeCompare(t.objectId)}function ru(e,t){return e.events.find(n=>n.id===t)??null}function Ni(e,t,n){return ru(e,t)?.positions.find(r=>r.objectId===n)??null}function ou(e,t){return e.objects.find(n=>n.id===t)??null}function iu(e,t){let n=z(e),r=n.events.find(i=>i.id===t);if(!r)return e;let o=n.objects.find(i=>!r.positions.some(s=>s.objectId===i.id))??n.objects[0];return o?(r.targetObjectId!==o.id&&!r.participantObjectIds.includes(o.id)&&(r.participantObjectIds.push(o.id),r.participantObjectIds.sort((i,s)=>i.localeCompare(s))),r.positions.push(au(o)),r.positions.sort(sr),n):e}function au(e){return{objectId:e.id,placement:e.placement?structuredClone(e.placement):null,inner:Pi(e.properties.inner),outer:Pi(e.properties.outer)}}function su(e,t,n,r){let o=new Set(r);for(let i of e.system?.viewpoints??[]){let s=new Set(i.events);s.delete(t),s.delete(n),o.has(i.id)&&s.add(n),i.events=[...s].sort((c,a)=>c.localeCompare(a))}}function $n(e,t){let n=e.trim()||"item",r=1,o=n;for(;t.includes(o);)r+=1,o=`${n}-${r}`;return o}function xn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ir(e){return{diagnostic:{...e.diagnostic},path:e.path?{...e.path}:null}}function st(e){return typeof e=="string"?e:""}function cu(e){return Array.isArray(e)?e.join(" "):""}function ct(e){return e&&typeof e=="object"&&"value"in e?pe(e):""}function Pi(e){return e&&typeof e=="object"&&"value"in e?e:void 0}function lu(e){return typeof e=="number"?String(e):""}function pe(e){return`${e.value}${e.unit??""}`}function Ft(e,t){let n=10**t;return Math.round(e*n)/n}function du(e,t,n){return Math.min(Math.max(e,t),n)}function uu(e){let t=e%360;return t<0&&(t+=360),t}function pu(e){switch(e){case"au":case"km":case"re":case"sol":case null:return e;default:return null}}function fu(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Vt;case"re":return e.value*Ci/Vt;case"sol":return e.value*Fi/Vt;default:return e.value}}function Ui(e,t){switch(t){case"km":return{value:Ft(e*Vt,0),unit:t};case"re":return{value:Ft(e*Vt/Ci,3),unit:t};case"sol":return{value:Ft(e*Vt/Fi,4),unit:t};case"au":return{value:Ft(e,3),unit:t};default:return{value:Ft(e,2),unit:null}}}function mu(e,t,n){return t+n*bu(Math.max(e,0)+1)}function gu(e,t,n){return e<=t?0:Math.pow(2,(e-t)/Math.max(n,1e-4))-1}function hu(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function bu(e){return Math.log(e)/Math.log(2)}function L(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function zi(e){return L(e)}function yu(e){if(typeof window>"u"||typeof document>"u")throw new Error("createWorldOrbitEditor can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("WorldOrbit editor requires an HTMLElement container.")}function xe(e,t){let n=e.querySelector(t);if(!n)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return n}function wu(){if(document.getElementById(Di))return;let e=document.createElement("style");e.id=Di,e.textContent=`
|
|
386
441
|
.wo-editor {
|
|
387
442
|
--wo-editor-sidebar-width: 280px;
|
|
388
443
|
--wo-editor-inspector-width: 360px;
|
|
@@ -575,6 +630,12 @@
|
|
|
575
630
|
.wo-editor-overlay-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.24); }
|
|
576
631
|
.wo-editor-outline { display: grid; gap: 14px; }
|
|
577
632
|
.wo-editor-outline-section { display: grid; gap: 8px; }
|
|
633
|
+
.wo-editor-outline-group { display: grid; gap: 6px; }
|
|
634
|
+
.wo-editor-outline-children {
|
|
635
|
+
display: grid;
|
|
636
|
+
gap: 6px;
|
|
637
|
+
padding-left: 16px;
|
|
638
|
+
}
|
|
578
639
|
.wo-editor-outline-section h3 {
|
|
579
640
|
margin: 0;
|
|
580
641
|
color: rgba(237,246,255,0.68);
|
|
@@ -614,6 +675,27 @@
|
|
|
614
675
|
background: rgba(255, 120, 120, 0.18);
|
|
615
676
|
color: #ffb2b2;
|
|
616
677
|
}
|
|
678
|
+
.wo-editor-inline-list { display: grid; gap: 8px; }
|
|
679
|
+
.wo-editor-inline-actions {
|
|
680
|
+
display: flex;
|
|
681
|
+
flex-wrap: wrap;
|
|
682
|
+
gap: 10px;
|
|
683
|
+
margin-top: 12px;
|
|
684
|
+
}
|
|
685
|
+
.wo-editor-inline-actions button {
|
|
686
|
+
border: 1px solid rgba(255,255,255,0.14);
|
|
687
|
+
border-radius: 999px;
|
|
688
|
+
background: rgba(255,255,255,0.06);
|
|
689
|
+
color: #edf6ff;
|
|
690
|
+
cursor: pointer;
|
|
691
|
+
font: 600 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
692
|
+
padding: 8px 12px;
|
|
693
|
+
}
|
|
694
|
+
.wo-editor-inline-note {
|
|
695
|
+
margin: 0 0 12px;
|
|
696
|
+
color: rgba(237,246,255,0.72);
|
|
697
|
+
font: 500 12px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
698
|
+
}
|
|
617
699
|
.wo-editor-diagnostics { display: grid; gap: 10px; }
|
|
618
700
|
.wo-editor-diagnostic {
|
|
619
701
|
display: grid;
|
|
@@ -809,4 +891,4 @@
|
|
|
809
891
|
.wo-editor-stage { min-height: 440px; }
|
|
810
892
|
.wo-editor-status { flex-direction: column; }
|
|
811
893
|
}
|
|
812
|
-
`,document.head.append(e)}return
|
|
894
|
+
`,document.head.append(e)}return ra(vu);})();
|