worldorbit 2.5.17 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -15
- package/dist/browser/core/dist/index.js +502 -61
- package/dist/browser/editor/dist/index.js +619 -71
- package/dist/browser/markdown/dist/index.js +464 -51
- package/dist/browser/viewer/dist/index.js +495 -62
- package/dist/unpkg/core/dist/index.js +502 -61
- package/dist/unpkg/editor/dist/index.js +619 -71
- package/dist/unpkg/markdown/dist/index.js +464 -51
- package/dist/unpkg/viewer/dist/index.js +495 -62
- package/dist/unpkg/worldorbit-core.min.js +12 -12
- package/dist/unpkg/worldorbit-editor.min.js +208 -198
- package/dist/unpkg/worldorbit-markdown.min.js +38 -38
- package/dist/unpkg/worldorbit-viewer.min.js +56 -56
- package/dist/unpkg/worldorbit.js +533 -72
- package/dist/unpkg/worldorbit.min.js +60 -60
- package/package.json +1 -1
- package/packages/core/dist/atlas-edit.js +1 -1
- package/packages/core/dist/atlas-validate.js +99 -10
- package/packages/core/dist/draft-parse.js +190 -15
- package/packages/core/dist/draft.js +50 -11
- package/packages/core/dist/format.js +36 -5
- package/packages/core/dist/load.js +9 -2
- package/packages/core/dist/scene.js +158 -24
- package/packages/core/dist/types.d.ts +19 -2
- package/packages/editor/dist/editor.js +105 -4
- package/packages/viewer/dist/atlas-state.js +5 -2
- package/packages/viewer/dist/atlas-viewer.js +19 -8
- package/packages/viewer/dist/types.d.ts +5 -2
- package/packages/viewer/dist/viewer.js +16 -0
|
@@ -1,20 +1,20 @@
|
|
|
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
|
|
3
|
-
`)}function
|
|
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!==`
|
|
1
|
+
"use strict";var WorldOrbitEditor=(()=>{var br=Object.defineProperty;var fa=Object.getOwnPropertyDescriptor;var ma=Object.getOwnPropertyNames;var ha=Object.prototype.hasOwnProperty;var ga=(e,t)=>{for(var n in t)br(e,n,{get:t[n],enumerable:!0})},ba=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ma(t))!ha.call(e,i)&&i!==n&&br(e,i,{get:()=>t[i],enumerable:!(r=fa(t,i))||r.enumerable});return e};var ya=e=>ba(br({},"__esModule",{value:!0}),e);var Bu={};ga(Bu,{createWorldOrbitEditor:()=>Jo});var b=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var Zt=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Oe=Zt.filter(e=>e!=="system"),wa=["star","planet","moon","asteroid","comet","structure","phenomenon"],ci=["structure","phenomenon"],it=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],va=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function _(e,t){return{key:e,...t}}var Vn=new Set(Zt),li=new Map([_("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:it}),_("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"distance"}),_("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"distance"}),_("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:it}),_("period",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"duration"}),_("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("at",{kind:"string",placement:!0,arity:"single",objectTypes:ci}),_("surface",{kind:"string",placement:!0,arity:"single",objectTypes:ci}),_("free",{kind:"string",placement:!0,arity:"single",objectTypes:va}),_("kind",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("class",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("culture",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Zt}),_("color",{kind:"string",placement:!1,arity:"single",objectTypes:Zt}),_("image",{kind:"string",placement:!1,arity:"single",objectTypes:wa}),_("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Zt}),_("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"radius"}),_("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"mass"}),_("density",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:Oe}),_("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),_("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),_("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),_("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("on",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("source",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"duration"})].map(e=>[e.key,e])),$a=new Set(li.keys());function Ie(e){return li.get(e)}function di(e){return $a.has(e)}function ui(e,t){return e.objectTypes.includes(t)}function Rn(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Jt(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,s=!1,c=!1,a=null,l=()=>{o!==null&&(n.push({value:i,column:o,quoted:s}),i="",o=null,s=!1)};for(let d=0;d<e.length;d++){let f=e[d],w=r+d+1;if(c&&f==="\\"){let I=e[d+1];if(I==='"'||I==="\\"){i+=I,d++;continue}}if(f==='"'){c?c=!1:(o===null&&(o=w),s=!0,a=w,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}o===null&&(o=w),i+=f}if(c)throw new b("Unclosed quote in line",t.line,a??r+e.length);return l(),n}function zn(e){return e.match(/^\s*/)?.[0].length??0}function Qt(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let s=0;s<t.length;s++){let c=t[s],a=s+1;if(!c.trim())continue;let l=zn(c),d=Jt(c.slice(l),{line:a,columnOffset:l});if(d.length!==0){if(l===0){i=!1,o=null;let f=xa(d,a);n.push(f),r=f;continue}if(!r)throw new b("Indented line without parent object",a,l+1);if(d.length===1&&d[0].value==="info"){i=!0,o=l;continue}i&&l<=(o??0)&&(i=!1),i?r.infoEntries.push(ka(d,a)):r.blockFields.push(ja(d,a))}}return{type:"document",objects:n}}function xa(e,t){if(e.length<2)throw new b("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Vn.has(n.value))throw new b(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Ia(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Ia(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=Ie(i.value);if(!o)throw new b(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(o.arity==="multiple")for(;r<e.length&&!di(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new b(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(c=>c.value),location:{line:t,column:i.column}})}return n}function ja(e,t){if(e.length<2)throw new b("Invalid field line",t,e[0]?.column??1);if(!Ie(e[0].value))throw new b(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function ka(e,t){if(e.length<2)throw new b("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var pi=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Sa=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Oa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function en(e){let t=null,n=[];for(let r of e.objects){let i=Ea(r);if(r.objectType==="system"){if(t)throw b.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Ea(e){let t=[...e.inlineFields,...e.blockFields];Ma(e.objectType,t);let n=Da(t),r=Pa(e.objectType,n),i=Aa(n),o=Ca(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Ma(e,t){for(let n of t){let r=Ie(n.key);if(!r)throw b.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ui(r,e))throw b.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw b.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Da(e){let t=new Map;for(let n of e){if(t.has(n.key))throw b.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Pa(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),s=[n,r,i,o].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw b.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw b.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:_n(t,"orbit"),distance:Mt(t,"distance"),semiMajor:Mt(t,"semiMajor"),eccentricity:Ra(t,"eccentricity"),period:Mt(t,"period"),angle:Mt(t,"angle"),inclination:Mt(t,"inclination"),phase:Mt(t,"phase")};if(r){let c=Bn(t,"at"),a=_n(t,"at");return{mode:"at",target:a,reference:Fa(a,c.location)}}if(i)return{mode:"surface",target:_n(t,"surface")};if(o){let c=_n(t,"free"),a=Va(c);return{mode:"free",distance:a??void 0,descriptor:a?void 0:c}}return null}function Aa(e){let t={};for(let[n,r]of e.entries()){let i=Ie(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=za(r);break;case"number":t[n]=mi(Dt(r),n,r.location);break;case"unit":t[n]=fi(Dt(r),r.location,n);break;case"string":t[n]=La(n,r);break}}return t}function La(e,t){let n=t.values.join(" ").trim();return e==="image"&&Ta(n,t.location),n}function Ta(e,t){if(!e)throw b.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw b.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Oa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw b.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Ca(e){let t={};for(let n of e){if(n.key in t)throw b.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Fa(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function fi(e,t,n){let r=e.match(pi);if(!r)throw b.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=Ie(n);if(o?.unitFamily&&!Rn(o.unitFamily,i.unit))throw b.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Va(e){let t=e.match(pi);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Mt(e,t){if(!e.has(t))return;let n=Bn(e,t);return fi(Dt(n),n.location,t)}function Ra(e,t){if(!e.has(t))return;let n=Bn(e,t);return mi(Dt(n),t,n.location)}function mi(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw b.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function za(e){let t=Dt(e).toLowerCase(),n=Sa.get(t);if(n===void 0)throw b.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Bn(e,t){let n=e.get(t);if(!n)throw new b(`Missing value for key "${t}"`);return n}function _n(e,t){return Dt(Bn(e,t))}function Dt(e){if(e.values.length!==1)throw b.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var _a=new Set(["star","planet","moon","asteroid","comet"]);function tn(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new b(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new b(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!_a.has(i.type))throw new b(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Ba(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Na(r,r.placement.reference,t))}}function Ba(e,t,n){if(!n.has(t.primary))throw new b(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new b(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Na(e,t,n){if(!n.has(t.objectId))throw new b(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function $t(e,t,n=`${t}.failed`){return e instanceof b?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var nn=1495978707e-1,Ua=6371,Wa=71492,Ya=695700,Ha=63241.077,qa=206264.806,Ga=206264806,$i=.68,Xa=.2,xi=28;function Ee(e,t={}){let n=Ja(t),r=n.width,i=n.height,o=n.padding,s=Za(e),c=es(e,t.projection),a=Ir(t.camera??null),l=xr(c,a),d=rs(s,t.scaleModel),f=os(s),w=e.system?.id??null,I=t.activeEventId??null,S=Ka(e.objects,e.events??[],I),k=new Map(S.map(O=>[O.id,O])),C=Ns(S,k),Y=new Map,v=[],P=[],ne=[],X=[],Q=[],re=new Map,U=new Map;for(let O of S){let fe=O.placement;if(!fe){ne.push(O);continue}if(fe.mode==="orbit"){yi(U,fe.target,O);continue}if(fe.mode==="surface"){yi(re,fe.target,O);continue}if(fe.mode==="at"){Q.push(O);continue}X.push(O)}let be=X.length>0?r*.42:r/2,ee=i/2,te={orbitChildren:U,surfaceChildren:re,objectMap:k,spacingFactor:f,projection:l,scaleModel:d},q=ne.find(O=>O.type==="star")??ne[0]??null;q&&wr(q,be,ee,0,Y,v,P,te);let we=ne.filter(O=>O.id!==q?.id);if(we.length>0){let O=Math.min(r,i)*.28*f*d.orbitDistanceMultiplier;we.forEach((fe,W)=>{let ie=cn(W,we.length,-Math.PI/2),$e=ln(ie,O,l,1);wr(fe,be+$e.x,ee+$e.y,0,Y,v,P,te)})}X.forEach((O,fe)=>{let W=r-o-140-Gs(O.placement?.mode==="free"?O.placement.distance:void 0,d),ie=Math.max(76,(i-o*2-180)/Math.max(1,X.length)*f)*d.freePlacementMultiplier,$e=o+92+fe*ie;Y.set(O.id,{object:O,x:W,y:$e,radius:Hn(O,0,d),sortKey:Gn(W,$e,0)}),P.push({object:O,groupId:C.groupIds.get(O.id)??null,x1:W-60,y1:$e,x2:W-18,y2:$e,mode:"free"}),Wn(O,Y,v,P,te,1)}),Q.forEach((O,fe)=>{if(Y.has(O.id)||!O.placement||O.placement.mode!=="at")return;let W=_s(O.placement.reference,Y,k,fe,Q.length,r,i,o,te);Y.set(O.id,{object:O,x:W.x,y:W.y,radius:Hn(O,2,d),sortKey:Gn(W.x,W.y,2),anchorX:W.anchorX,anchorY:W.anchorY}),W.anchorX!==void 0&&W.anchorY!==void 0&&P.push({object:O,groupId:C.groupIds.get(O.id)??null,x1:W.anchorX,y1:W.anchorY,x2:W.x,y2:W.y,mode:"at"}),Wn(O,Y,v,P,te,2)});let le=[...Y.values()].map(O=>as(O,d,C)),De=v.map(O=>ss(O,C.groupIds.get(O.object.id)??null)),We=P.map(O=>cs(O)),D=ls(le,r,i,d.labelMultiplier),oe=bs(e,le),Ze=ys(e.events??[],le,I),bt=ms(De,oe,Ze,We,le,D),T=hs(le,De,We,D,C,d.labelMultiplier),R=gs(e,le),ye=ws(e,c,n.preset,C,k),de=Ps(r,i,le,De,We,D,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:c,renderProjection:l,camera:a,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ns(c,l,s,a),systemId:w,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...a?.azimuth!==null?{"camera.azimuth":String(a?.azimuth)}:{},...a?.elevation!==null?{"camera.elevation":String(a?.elevation)}:{},...a?.roll!==null?{"camera.roll":String(a?.roll)}:{},...a?.distance!==null?{"camera.distance":String(a?.distance)}:{}},contentBounds:de,layers:bt,groups:T,semanticGroups:R,viewpoints:ye,events:Ze,activeEventId:I,objects:le,orbitVisuals:De,relations:oe,leaders:We,labels:D}}function ve(e,t,n){let r=Xn(n),i=Math.cos(r),o=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*i-c*o,y:t.y+s*o+c*i}}function Ka(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let o=new Map(r.map(c=>[c.id,c])),s=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of s){let a=o.get(c);a&&(i.epoch&&(a.epoch=i.epoch),i.referencePlane&&(a.referencePlane=i.referencePlane))}for(let c of i.positions){let a=o.get(c.objectId);a&&(c.placement&&(a.placement=structuredClone(c.placement)),c.inner&&(a.properties.inner={...c.inner}),c.outer&&(a.properties.outer={...c.outer}),c.epoch&&(a.epoch=c.epoch),c.referencePlane&&(a.referencePlane=c.referencePlane))}return r}function Za(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Ja(e){let t=Qa(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Qa(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function es(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return ki(n)??"topdown"}function xr(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function Ir(e){if(!e)return null;let t={azimuth:yr(e.azimuth),elevation:yr(e.elevation),roll:yr(e.roll),distance:ts(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function yr(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ts(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ns(e,t,n,r){let i=[`${wi(e)} view`,`${wi(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function rs(e,t){return{...is(e),...t}}function is(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function os(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function as(e,t,n){let{object:r,x:i,y:o,radius:s,sortKey:c,anchorX:a,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:Pt(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:s,visualRadius:qs(r,s,t),sortKey:c+d*.001,anchorX:a,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ks(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ss(e,t){return{renderId:`${Pt(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function cs(e){return{renderId:`${Pt(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function ls(e,t,n,r){let i=[],o=[],s=new Map(e.map(a=>[a.objectId,a])),c=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort(ds);for(let a of c){let l=us(a,s,o,t,n,r)??ji(a,Ii(a,s.get(a.parentId??"")??null,n),0,r);o.push(Di(a,l,r)),i.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,semanticGroupIds:[...a.semanticGroupIds],label:a.label,secondaryLabel:a.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:a.hidden})}return i}function ds(e,t){let n=hi(e)-hi(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function hi(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function us(e,t,n,r,i,o){for(let s of ps(e,t,r,i)){let c=s==="left"||s==="right"?4:6;for(let a=0;a<=c;a+=1){let l=ji(e,s,a,o),d=Di(e,l,o);if(!n.some(f=>Ys(f,d)))return l}}return null}function ps(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=Ii(e,i,r),s=o==="below"?"above":"below",c=fs(e,i,n),a=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,o,a,s]:[o,c,s,a]}function Ii(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function fs(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function ji(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),s=e.y-4*r;return{x:o,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,s=e.y-4*r;return{x:o,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function ms(e,t,n,r,i,o){let s=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),c=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"events",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"objects",renderIds:i.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function hs(e,t,n,r,i,o){let s=new Map,c=a=>{if(!a)return null;let l=s.get(a);if(l)return l;let d=i.groupRoots.get(a)??null,f={renderId:a,rootObjectId:d,label:d??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:sn(0,0,0,0)};return s.set(a,f),f};for(let a of e){let l=c(a.groupId);l&&!a.hidden&&l.objectIds.push(a.objectId)}for(let a of t){let l=c(a.groupId);l&&!a.hidden&&l.orbitIds.push(a.objectId)}for(let a of n){let l=c(a.groupId);l&&!a.hidden&&l.leaderIds.push(a.objectId)}for(let a of r){let l=c(a.groupId);l&&!a.hidden&&l.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=Us(a,e,t,n,r,o);return[...s.values()].sort((a,l)=>a.label.localeCompare(l.label))}function gs(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function bs(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${Pt(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ys(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],s=o.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,d)=>l+d.x,0)/s.length:0,a=s.length>0?s.reduce((l,d)=>l+d.y,0)/s.length:0;return{renderId:`${Pt(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:a,hidden:i.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function ws(e,t,n,r,i){let o=vs(e,t,n),s=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,w,...I]=l.split(".");if(f!=="viewpoint"||!w||I.length===0)continue;let S=Es(w);if(!S)continue;let k=I.join(".").toLowerCase(),C=s.get(S)??{id:S};$s(C,k,d,e,t,n,r,i),s.set(S,C)}let c=[...s.values()].map(l=>xs(l,t,n,i)).filter(Boolean),a=c.findIndex(l=>l.id===o.id);return a>=0?c.splice(a,1,{...o,...c[a],layers:{...o.layers,...c[a].layers},filter:c[a].filter??o.filter,generated:!1}):c.unshift(o),c.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function vs(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=Ir(null),s=xr(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:s,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function $s(e,t,n,r,i,o,s,c){let a=n.trim();switch(t){case"label":case"title":a&&(e.label=a);return;case"summary":case"description":a&&(e.summary=a);return;case"focus":case"object":a&&(e.focus=a);return;case"select":case"selection":a&&(e.select=a);return;case"events":e.eventIds=an(a);return;case"projection":case"view":e.projection=ki(a)??i;return;case"preset":e.preset=js(a)??o;return;case"rotation":case"angle":e.rotationDeg=rn(a)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Un(),azimuth:rn(a)};return;case"camera.elevation":e.camera={...e.camera??Un(),elevation:rn(a)};return;case"camera.roll":e.camera={...e.camera??Un(),roll:rn(a)};return;case"camera.distance":e.camera={...e.camera??Un(),distance:gi(a)};return;case"zoom":case"scale":e.scale=gi(a);return;case"layers":e.layers=ks(a);return;case"query":e.filter={...e.filter??Nn(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??Nn(),objectTypes:Ss(a)};return;case"tags":e.filter={...e.filter??Nn(),tags:an(a)};return;case"groups":e.filter={...e.filter??Nn(),groupIds:Os(a,r,s,c)};return}}function xs(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,s=Is(e.filter),c=e.label?.trim()||Ms(e.id),a=e.projection??t,l=Ir(e.camera??null),d=xr(a,l);return{id:e.id,label:c,summary:e.summary?.trim()||Ds(c,i,s),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:a,renderProjection:d,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Nn(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Un(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Is(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function ki(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function js(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function rn(e){let t=Number(e);return Number.isFinite(t)?t:null}function gi(e){let t=rn(e);return t!==null&&t>0?t:null}function ks(e){let t={};for(let n of an(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Ss(e){return an(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Os(e,t,n,r){return an(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??on(i):(r.has(i),on(i)))}function an(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Es(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ms(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ds(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Ps(e,t,n,r,i,o,s){let c=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(w,I)=>{c=Math.min(c,w),a=Math.min(a,I),l=Math.max(l,w),d=Math.max(d,I)};for(let w of r)w.hidden||Si(w,f);for(let w of i)w.hidden||(f(w.x1,w.y1),f(w.x2,w.y2));for(let w of n)w.hidden||Oi(w,f);for(let w of o)w.hidden||Ei(w,f,s);return!Number.isFinite(c)||!Number.isFinite(a)?sn(0,0,e,t):sn(c,a,l,d)}function Si(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=Ai(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,xi*2);for(let s of o)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function sn(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Oi(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function Ei(e,t,n){let r=Pi(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function wr(e,t,n,r,i,o,s,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Hn(e,r,c.scaleModel),sortKey:Gn(t,n,r)}),Wn(e,i,o,s,c,r+1))}function Wn(e,t,n,r,i,o){let s=t.get(e.id);if(!s)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(As),a=Ls(c,s.radius,i.spacingFactor,i.scaleModel),l=Fs(c,a);c.forEach((f,w)=>{let I=Ts(f,w,c.length,s,a,l[w]??a.innerPx,i);n.push({object:f,parentId:e.id,kind:I.kind,cx:I.cx,cy:I.cy,radius:I.radius,rx:I.rx,ry:I.ry,rotationDeg:I.rotationDeg,band:I.band,bandThickness:I.bandThickness,frontArcPath:I.frontArcPath,backArcPath:I.backArcPath}),wr(f,I.objectX,I.objectY,o,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,w)=>{let I=cn(w,d.length,-Math.PI/3),S=28*i.spacingFactor,k=ln(I,s.radius,i.projection,i.projection==="isometric"?.9:1),C=ln(I,s.radius+S,i.projection,i.projection==="isometric"?.9:1),Y=s.x+k.x,v=s.y+k.y,P=s.x+C.x,ne=s.y+C.y;t.set(f.id,{object:f,x:P,y:ne,radius:Hn(f,o+1,i.scaleModel),sortKey:Gn(P,ne,o+1),anchorX:Y,anchorY:v}),r.push({object:f,groupId:i.objectMap.has(f.id)?on(Ws(f,i.objectMap)):null,x1:Y,y1:v,x2:P,y2:ne,mode:"surface"}),Wn(f,t,n,r,i,o+1)})}function As(e,t){let n=Yn(e),r=Yn(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Ls(e,t,n,r){let i=e.map(f=>Yn(f)),o=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let a=Math.min(...o),l=Math.max(...o),d=l-a;return{metrics:i,minMetric:a,maxMetric:l,metricSpread:d,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function Ts(e,t,n,r,i,o,s){let c=e.placement,a=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let U=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:U,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-U}}let l=ce(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),d=o,f=Math.max(d*Math.sqrt(1-l*l),d*.18),w=$r(c.inclination)??0,I=s.projection==="isometric"?Math.max(Xa,Math.cos(Xn(w)))*$i:1,S=Math.max(f*I,d*.14),k=$r(c.angle)??0,C=d*l,Y=Ti(-C,0,k),v=r.x+Y.x,P=r.y+Y.y,ne=Rs(c.phase,t,n),X=Li(v,P,d,S,k,ne),Q=s.projection==="topdown"&&l<=1e-4&&Math.abs(k)<=1e-4,re=a?zs(e,d,i,s.scaleModel):void 0;return{kind:Q?"circle":"ellipse",cx:Q?r.x:v,cy:Q?r.y:P,radius:Q?d:void 0,rx:Q?void 0:d,ry:Q?void 0:S,rotationDeg:k,band:a,bandThickness:re,frontArcPath:s.projection==="isometric"||a?bi(v,P,d,S,k,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?bi(v,P,d,S,k,Math.PI,Math.PI*2):void 0,objectX:X.x,objectY:X.y}}function Cs(e,t){return t.innerPx+t.stepPx*Vs(Math.max(e,0)+1)}function Fs(e,t){let n=[];return e.forEach((r,i)=>{let o=Yn(r),s=t.innerPx+i*t.stepPx,c=o===null?s:Cs(o,t),a=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,a))}),n}function Yn(e){return!e.placement||e.placement.mode!=="orbit"?null:qn(e.placement.semiMajor??e.placement.distance??null)}function Vs(e){return Math.log(e)/Math.log(2)}function Rs(e,t,n){let r=e?$r(e):null;return r!==null?Xn(r-90):cn(t,n,-Math.PI/2)}function zs(e,t,n,r){let i=qn(vr(e.properties.inner)),o=qn(vr(e.properties.outer));if(i!==null&&o!==null){let c=Math.abs(o-i);if(n.metricSpread>0)return ce(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let a=Math.max(Math.max(i,o),1e-4);return ce(c/a*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function _s(e,t,n,r,i,o,s,c,a){if(e.kind==="lagrange")return Bs(e,t,n,o,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=cn(r,i,Math.PI/5),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=ln(d,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=cn(r,i,Math.PI/6),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=ln(d,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}return{x:o-c-170,y:s-c-86-r*58*a.scaleModel.freePlacementMultiplier}}function Bs(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Hs(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!o||!s)return{x:r*.7,y:i*.25};let c=s.x-o.x,a=s.y-o.y,l=Math.hypot(c,a)||1,d=c/l,f=a/l,w=-f,I=d,S=ce(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-d*S,y:s.y-f*S,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+d*S,y:s.y+f*S,anchorX:s.x,anchorY:s.y};case"L3":return{x:o.x-d*S,y:o.y-f*S,anchorX:o.x,anchorY:o.y};case"L4":return{x:s.x+(d*.5-w*.8660254)*S,y:s.y+(f*.5-I*.8660254)*S,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(d*.5+w*.8660254)*S,y:s.y+(f*.5+I*.8660254)*S,anchorX:s.x,anchorY:s.y}}}function Ns(e,t){let n=new Map,r=new Map;for(let l of e){let d=Mi(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,o=new Map,s=new Map,c=l=>{let d=i.get(l);if(d)return d;let f=new Set,w=[],I=n.get(l)??null;for(;I&&!f.has(I);)w.push(I),f.add(I),I=n.get(I)??null;return i.set(l,w),w},a=l=>{let d=s.get(o.get(l)??"");if(d)return d;let f=n.get(l)??null,w=t.get(l),I=l;return w?.placement&&w.placement.mode!=="free"&&f&&(I=a(f)),I};for(let l of e){c(l.id);let d=a(l.id),f=on(d);o.set(l.id,f),s.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:s}}function Mi(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Us(e,t,n,r,i,o){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,w)=>{s=Math.min(s,f),c=Math.min(c,w),a=Math.max(a,f),l=Math.max(l,w)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Oi(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Si(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&Ei(f,d,o);return!Number.isFinite(s)||!Number.isFinite(c)?sn(0,0,0,0):sn(s,c,a,l)}function Ws(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Mi(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function Di(e,t,n){return Pi(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Pi(e,t,n,r,i,o,s,c){let a=Zs(o,s,c),l=a*2,d=i==="above"?18:12,f=i==="above"?8:12,w=e-a,I=e+a;return r==="start"?(w=e,I=e+l):r==="end"&&(w=e-l,I=e),{left:w,right:I,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function Ys(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Hs(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Hn(e,t,n){let r=Xs(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return ce((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return ce(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return ce(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return ce(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return ce(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return ce(8*i,n.minBodyRadius,n.maxBodyRadius)}}function qs(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function qn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/nn;case"m":return e.value/1e3/nn;case"ly":return e.value*Ha;case"pc":return e.value*qa;case"kpc":return e.value*Ga;case"re":return e.value*Ua/nn;case"rj":return e.value*Wa/nn;case"sol":return e.value*Ya/nn;default:return e.value}}function Gs(e,t){let n=qn(e??null);return n===null||n<=0?0:ce(n*96*t.freePlacementMultiplier,0,420)}function Xs(e,t){let n=vr(e);if(!n)return null;let r;switch(n.unit){case"sol":r=ce(n.value*22,14,40);break;case"re":r=ce(n.value*10,6,18);break;case"km":r=ce(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=ce(n.value*4,4,20);break}return ce(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function vr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function $r(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function cn(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function bi(e,t,n,r,i,o,s){let c=Ai(e,t,n,r,i,o,s,xi);return c.length===0?"":c.map((a,l)=>`${l===0?"M":"L"} ${vi(a.x)} ${vi(a.y)}`).join(" ")}function Ai(e,t,n,r,i,o,s,c){let a=[];for(let l=0;l<=c;l+=1){let d=o+(s-o)*l/c;a.push(Li(e,t,n,r,i,d))}return a}function Li(e,t,n,r,i,o){let s=n*Math.cos(o),c=r*Math.sin(o),a=Ti(s,c,i);return{x:e+a.x,y:t+a.y}}function Ti(e,t,n){let r=Xn(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ln(e,t,n,r){let i=n==="isometric"?$i*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Gn(e,t,n){return t*1e3+e+n*.01}function ce(e,t,n){return Math.min(Math.max(e,t),n)}function yi(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function Pt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function on(e){return`${Pt(e)}-group`}function Ks(e){return typeof e=="string"&&e.trim()?e:void 0}function Zs(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function wi(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Xn(e){return e*Math.PI/180}function vi(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function xt(e,t={}){let n=Ee(e,t),r=[],i=ec(e,r),o=tc(e,r),s=Qs(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Js(e,s,i,o,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(a=>!a.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(a=>!a.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Fi),diagnostics:r}}function jr(e,t={}){return pc(xt(e,t))}function dn(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:lc(e.system),info:dc(e.system)}:null,r=e.objects.map(Fi);return oc(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(rc),objects:r}}function Js(e,t,n,r,i,o){let s=Ee(e,{preset:o??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(nc),annotations:r}}function Qs(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function ec(e,t){let n={};for(let[i,o]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=o);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function tc(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,o,...s]=r.split(".");if(!o||s.length===0)continue;let c=Ci(o);if(!c)continue;let a=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":a.label=i;break;case"target":case"object":a.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":a.body=i;break;case"tags":a.tags=sc(i);break}n.set(c,a)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let o=Ci(`${r.id}-notes`);n.has(o)||(n.set(o,{id:o,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${o}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??cc(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function nc(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Fi(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:ac(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function rc(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ic)}}function ic(e){return{objectId:e.objectId,placement:Vi(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Vi(e){return e?structuredClone(e):null}function oc(e,t,n){if(!n)return;let r=t.find(s=>s.id===n);if(!r)return;let i=new Map(e.map(s=>[s.id,s])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(s=>s.objectId)]);for(let s of o){let c=i.get(s);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let s of r.positions){let c=i.get(s.objectId);c&&(s.placement&&(c.placement=Vi(s.placement)),s.inner&&(c.properties.inner={...s.inner}),s.outer&&(c.properties.outer={...s.outer}),s.epoch&&(c.epoch=s.epoch),s.referencePlane&&(c.referencePlane=s.referencePlane))}}function ac(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function sc(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ci(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function cc(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function lc(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function dc(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=uc(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function uc(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function pc(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Ri=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Kn(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.0-draft"){if(n==="2.0-draft"){let a=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:jr(e);return _i(a)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:xt(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&c.version!==n?kr({...c,version:n,schemaVersion:n}):kr(c)}let i=[],o=e;o.system&&i.push(...fc(o.system));let s=[...o.objects].sort(Er);for(let c of s)i.length>0&&i.push(""),i.push(...hc(c));return i.join(`
|
|
2
|
+
`)}function kr(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Bi(e.system));for(let r of[...e.groups].sort(At))t.push(""),t.push(...Yi(r));for(let r of[...e.relations].sort(At))t.push(""),t.push(...Hi(r));for(let r of[...e.events].sort(At))t.push(""),t.push(...qi(r));let n=[...e.objects].sort(Er);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Ni(r))}),t.join(`
|
|
3
|
+
`)}function _i(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Bi(t.system));for(let i of[...t.groups].sort(At))n.push(""),n.push(...Yi(i));for(let i of[...t.relations].sort(At))n.push(""),n.push(...Hi(i));for(let i of[...t.events].sort(At))n.push(""),n.push(...qi(i));let r=[...t.objects].sort(Er);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,o)=>{o>0&&n.push(""),n.push(...Ni(i))}),n.join(`
|
|
4
|
+
`)}function fc(e){return mc("system",e.id,e.properties,null,e.info)}function mc(e,t,n,r,i){let o=[`${e} ${t}`],s=[...Sr(r),...Wi(n)];for(let a of s)o.push(` ${a}`);let c=Object.entries(i).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){s.length>0&&o.push(""),o.push(" info");for(let[a,l]of c)o.push(` ${a} ${A(l)}`)}return o}function Bi(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${A(e.title)}`),e.description&&t.push(` description ${A(e.description)}`),e.epoch&&t.push(` epoch ${A(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${A(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${A(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${A(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${A(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[o])=>i.localeCompare(o)))t.push(` ${n} ${A(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...bc(n));for(let n of e.annotations)t.push(""),t.push(...yc(n));return t}function hc(e){return Ui(e.type,e.id,e)}function Ni(e){return Ui(`object ${e.type}`,e.id,e)}function Ui(e,t,n){let r=[`${e} ${t}`],i=[...Sr(n.placement),...Wi(n.properties),...gc(n)];for(let s of i)r.push(` ${s}`);let o=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(o.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,c]of o)r.push(` ${s} ${A(c)}`)}for(let s of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[s]??{}).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${s}`);for(let[a,l]of c)r.push(` ${a} ${A(l)}`)}}return r}function Sr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...ot("distance",e.distance),...ot("semiMajor",e.semiMajor),...$c("eccentricity",e.eccentricity),...ot("period",e.period),...ot("angle",e.angle),...ot("inclination",e.inclination),...ot("phase",e.phase)];case"at":return[`at ${xc(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Or(e.distance):e.descriptor??""}`.trim()]}}function Wi(e){return Object.keys(e).sort(jc).map(t=>`${t} ${Gi(e[t])}`)}function gc(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${A(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${A(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Gi(n.value)}`);return t}function bc(e){let t=[`viewpoint ${e.id}`,` label ${A(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&vc(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=Ic(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${A(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(A).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function yc(e){let t=[`annotation ${e.id}`,` label ${A(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${A(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),t}function Yi(e){let t=[`group ${e.id}`,` label ${A(e.label)}`];return e.summary&&t.push(` summary ${A(e.summary)}`),e.color&&t.push(` color ${A(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Hi(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${A(e.from)}`),e.to&&t.push(` to ${A(e.to)}`),e.kind&&t.push(` kind ${A(e.kind)}`),e.label&&t.push(` label ${A(e.label)}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.color&&t.push(` color ${A(e.color)}`),e.hidden&&t.push(" hidden true"),t}function qi(e){let t=[`event ${e.id}`,` kind ${A(e.kind)}`];if(e.label&&t.push(` label ${A(e.label)}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${A(e.timing)}`),e.visibility&&t.push(` visibility ${A(e.visibility)}`),e.epoch&&t.push(` epoch ${A(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${A(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.color&&t.push(` color ${A(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(kc)){t.push(` pose ${n.objectId}`);for(let r of wc(n))t.push(` ${r}`)}}return t}function wc(e){return[...Sr(e.placement),...e.epoch?[`epoch ${A(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${A(e.referencePlane)}`]:[],...ot("inner",e.inner),...ot("outer",e.outer)]}function vc(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Gi(e){return Array.isArray(e)?e.map(t=>A(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?A(e):Or(e)}function Or(e){return`${e.value}${e.unit??""}`}function ot(e,t){return t?[`${e} ${Or(t)}`]:[]}function $c(e,t){return t===void 0?[]:[`${e} ${t}`]}function xc(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Ic(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function jc(e,t){let n=Ri.indexOf(e),r=Ri.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Er(e,t){let n=zi(e.type),r=zi(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function At(e,t){return e.id.localeCompare(t.id)}function kc(e,t){return e.objectId.localeCompare(t.objectId)}function zi(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function A(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Xi=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Sc=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Oc=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Lt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function pn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Mr(e,t,n){let r=e.match(Xi);if(!r)throw b.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=Ie(n);if(o?.unitFamily&&!Rn(o.unitFamily,i.unit))throw b.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dr(e){let t=e.match(Xi);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Zn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw b.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function at(e,t,n){let r=Sc.get(e.toLowerCase());if(r===void 0)throw b.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Ki(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ec(e,t){if(!e)throw b.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw b.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Oc);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw b.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Zi(e,t,n){let r=Ie(e);if(!r)throw b.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw b.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return at(un(t,e,n),e,n);case"number":return Zn(un(t,e,n),e,n);case"unit":return Mr(un(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Ec(i,n),i}}}function Pr(e,t,n){let r=Ie(e);if(!r)throw b.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw b.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function un(e,t,n){if(e.length!==1)throw b.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Qi=new Set(["star","planet","moon","asteroid","comet"]),Mc=332946.0487,Dc=1047.3486,Jn=1495978707e-1,Pc=6371,Ac=695700,Lc=63241.077,Tc=206264.806,Cc=206264806;function fn(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),o=new Set(e.events.map(c=>c.id));e.system||n.push(V("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,a]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of a){let d=s.get(l);d?n.push(V("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${d}.`)):s.set(l,c)}for(let c of e.relations)Fc(c,r,n);for(let c of e.system?.viewpoints??[])Vc(c,i,o,t,n,r);for(let c of e.objects)Rc(c,e.system,r,i,n);for(let c of e.events)zc(c,e.system,r,n);return n}function Fc(e,t,n){e.from?t.has(e.from)||n.push(V("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(V("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(V("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(V("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(V("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Vc(e,t,n,r,i,o){let s=e.filter;if(r==="2.1"||r==="2.5"){if(s)for(let c of s.groupIds)t.has(c)||i.push(G("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(G("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Uc(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Wc(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,s,o)}function Rc(e,t,n,r,i){let o=e.placement,s=o?.mode==="orbit"?o:null,c=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let a of e.groups)r.has(a)||i.push(G("validate.group.unknown",`Unknown group "${a}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(G("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(G("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),s&&(n.has(s.target)||i.push(V("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(V("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(G("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(G("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!Lr(c?.properties.mass)&&i.push(G("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let a=n.get(o.target);a?Qi.has(a.type)||i.push(V("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(V("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(V("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Bc(e,n,i)||i.push(V("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let a=n.get(e.resonance.targetObjectId);a?(e.placement?.mode!=="orbit"||a.placement?.mode!=="orbit"||e.placement.target!==a.placement.target)&&i.push(G("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(V("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let a of e.deriveRules??[]){if(a.field!=="period"||a.strategy!=="kepler"){i.push(G("validate.derive.unsupported",`Unsupported derive rule "${a.field} ${a.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ji(e,c);if(l===null){i.push(G("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Ar("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Gc(l)}.`,e.id,"derive"))}for(let a of e.validationRules??[]){if(a.rule!=="kepler"){i.push(G("validate.rule.unsupported",`Unsupported validation rule "${a.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=eo(s?.period),d=Ji(e,c);if(l===null||d===null)continue;let f=qc(e,"period");Math.abs(l-d)>f&&i.push(V("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function zc(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(V("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(G("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(G("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(V("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(V("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let s=new Set;for(let l of e.participantObjectIds){if(o.add(l),s.has(l)){r.push(G("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}s.add(l),n.has(l)||r.push(V("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(G("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(G("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(G("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let d=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(V("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,d));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(V("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,d));continue}o.has(l.objectId)||r.push(G("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),_c(l,f,e,t,n,r,d,e.id)}let a=[...o].filter(l=>!c.has(l));e.positions.length>0&&a.length>0&&r.push(G("validate.event.positions.partial",`Event "${e.id}" leaves ${a.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function _c(e,t,n,r,i,o,s,c){let a=e.placement;if(!a){o.push(V("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(a.mode==="orbit"){i.has(a.target)||o.push(V("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.orbit`)),a.distance&&a.semiMajor&&o.push(V("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),a.phase&&!Yc(r,t,n,e)&&o.push(G("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),a.inclination&&!Hc(r,t,n,e)&&o.push(G("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),a.period&&!Lr(i.get(a.target)?.properties.mass)&&o.push(G("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(a.mode==="surface"){let l=i.get(a.target);l?Qi.has(l.type)||o.push(V("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):o.push(V("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(V("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${s}.at`));let l=a.reference;l.kind==="named"&&!i.has(l.name)?o.push(V("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?o.push(V("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&o.push(V("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):o.push(V("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)))}}function Bc(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(V("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(V("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(V("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ji(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Nc(n.semiMajor??n.distance),i=Lr(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Nc(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Jn;case"m":return e.value/(Jn*1e3);case"ly":return e.value*Lc;case"pc":return e.value*Tc;case"kpc":return e.value*Cc;case"re":return e.value*Pc/Jn;case"sol":return e.value*Ac/Jn;default:return null}}function Lr(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Mc;case"mj":return t.value/Dc;default:return null}}function eo(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Uc(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(V("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Wc(e,t,n,r,i,o,s,c,a){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,w]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])w!==null&&(!Number.isFinite(w)||f==="distance"&&w<=0)&&r.push(V("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(w)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(G("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(G("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push(Ar("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(G("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),o!==null&&a.has(o)||s!==null&&a.has(s)||c||r.push(Ar("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function Yc(e,t,n,r){return st(r?.epoch)??st(n?.epoch)??st(t.epoch)??st(e?.epoch)??null}function Hc(e,t,n,r){return st(r?.referencePlane)??st(n?.referencePlane)??st(t.referencePlane)??st(e?.referencePlane)??null}function st(e){return typeof e=="string"&&e.trim()?e.trim():null}function qc(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?eo(n)??0:0}function Gc(e){return`${Math.round(e*100)/100}d`}function V(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function G(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ar(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Xc=new Set(["climate","habitability","settlement"]),er=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=Ie(e);t&&er.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])er.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Kc=new Set(er.keys()),no=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function Tr(e){return Zc(e)}function Zc(e,t){let n=Vl(e),r=n.source.split(/\r?\n/),i=[],o=!1,s="2.0",c=null,a=null,l=[],d=[],f=[],w=[],I=new Map,S=!1,k=!1,C=new Set,Y=new Set,v=new Set,P=new Set,ne=new Set;for(let ee=0;ee<r.length;ee++){let te=r[ee],q=ee+1;if(!te.trim())continue;let we=zn(te),le=Jt(te.slice(we),{line:q,columnOffset:we});if(le.length!==0){if(!o){s=Jc(le,q),o=!0,n.comments.length>0&&tr(s,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(we===0){a=Qc(le,q,s,i,c,l,d,f,w,I,C,Y,v,P,ne,{sawDefaults:S,sawAtlas:k}),a.kind==="system"?c=a.system:a.kind==="defaults"?S=!0:a.kind==="atlas"&&(k=!0);continue}if(!a)throw new b("Indented line without parent atlas section",q,we+1);sl(a,we,le,q)}}if(!o)throw new b('Missing required atlas schema header "schema 2.0"');let X=l.map(ee=>Sl(ee,s,i)),Q=w.map(ee=>Ol(ee,I.get(ee.id)??[])),re=t??(s==="2.0-draft"?"2.0":s),U={format:"worldorbit",sourceVersion:"1.0",system:c,groups:d,relations:f,events:Q,objects:X,diagnostics:i};if(re==="2.0-draft"){let ee={...U,version:"2.0-draft",schemaVersion:"2.0-draft"};return ee.diagnostics.push(...fn(ee,s)),ee}let be={...U,version:re,schemaVersion:re};return s==="2.0-draft"&&be.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),be.diagnostics.push(...fn(be,s)),be}function Jc(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new b('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Qc(e,t,n,r,i,o,s,c,a,l,d,f,w,I,S,k){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new b('Atlas section "system" may only appear once',t,e[0].column);return el(e,t,n,r);case"defaults":if(!i)throw new b('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(k.sawDefaults)throw new b('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new b('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(k.sawAtlas)throw new b('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new b('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return tl(e,t,i,d,n,r);case"annotation":if(!i)throw new b('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return nl(e,t,i,f);case"group":return Me(n,r,"group",{line:t,column:e[0].column}),rl(e,t,s,w);case"relation":return Me(n,r,"relation",{line:t,column:e[0].column}),il(e,t,c,I);case"event":return Me(n,r,"event",{line:t,column:e[0].column}),ol(e,t,a,l,S,n,r);case"object":return al(e,t,n,r,o);default:throw new b(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function el(e,t,n,r){if(e.length!==2)throw new b("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function tl(e,t,n,r,i,o){if(e.length!==2)throw new b("Invalid viewpoint declaration",t,e[0]?.column??1);let s=Lt(e[1].value);if(!s)throw new b("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new b(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:pn(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function nl(e,t,n,r){if(e.length!==2)throw new b("Invalid annotation declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:pn(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function rl(e,t,n,r){if(e.length!==2)throw new b("Invalid group declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Group id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:pn(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function il(e,t,n,r){if(e.length!==2)throw new b("Invalid relation declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function ol(e,t,n,r,i,o,s){if(e.length!==2)throw new b("Invalid event declaration",t,e[0]?.column??1);let c=Lt(e[1].value);if(!c)throw new b("Event id must not be empty",t,e[1].column);if(i.has(c))throw new b(`Duplicate event id "${c}"`,t,e[1].column);let a={id:c,kind:"",label:pn(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(a),r.set(c,l),i.add(c),{kind:"event",event:a,sourceSchemaVersion:o,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function al(e,t,n,r,i){if(e.length<3)throw new b("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],s=e[2],c=o.value;if(!Vn.has(c)||c==="system")throw new b(`Unknown object type "${o.value}"`,t,o.column);let a={objectType:c,id:s.value,fields:jl(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(a),{kind:"object",objectNode:a,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function sl(e,t,n,r){switch(e.kind){case"system":cl(e,n,r);return;case"defaults":ll(e,n,r);return;case"atlas":dl(e,t,n,r);return;case"viewpoint":ul(e,t,n,r);return;case"annotation":ml(e,n,r);return;case"group":hl(e,n,r);return;case"relation":gl(e,n,r);return;case"event":bl(e,t,n,r);return;case"object":wl(e,t,n,r);return}}function cl(e,t,n){let r=He(t,e.seenFields,n),i=H(t,n);switch(r){case"title":e.system.title=i;return;case"description":Me(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":Me(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":Me(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new b(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ll(e,t,n){let r=He(t,e.seenFields,n),i=H(t,n);switch(r){case"view":io(i)&&It(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=ro(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=oo(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new b(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function dl(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=ao(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new b(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new b(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ul(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){pl(e,n,r);return}if(e.inFilter){fl(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(It(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new b('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Fr();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new b('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=He(n,e.seenFields,r),o=H(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":io(o)&&It(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=ro(o,r,n[0].column);return;case"preset":e.viewpoint.preset=oo(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Cr(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=lt(o,r,n[0].column,"rotation");return;case"camera":It(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Il(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=$l(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":Me(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=Re(n.slice(1),r,"events");return;default:throw new b(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function pl(e,t,n){let r=He(t,e.seenCameraFields,n),i=H(t,n),o=e.viewpoint.camera??Fr();switch(r){case"azimuth":o.azimuth=lt(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=lt(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=lt(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=Cr(i,n,t[0].column,"camera.distance");break;default:throw new b(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function fl(e,t,n){let r=He(t,e.seenFilterFields,n),i=e.viewpoint.filter??xl();switch(r){case"query":i.query=H(t,n);break;case"objecttypes":i.objectTypes=vl(t.slice(1),n);break;case"tags":i.tags=Re(t.slice(1),n,"tags");break;case"groups":i.groupIds=Re(t.slice(1),n,"groups");break;default:throw new b(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ml(e,t,n){switch(He(t,e.seenFields,n)){case"label":e.annotation.label=H(t,n);return;case"target":e.annotation.targetObjectId=H(t,n);return;case"body":e.annotation.body=H(t,n);return;case"tags":e.annotation.tags=Re(t.slice(1),n,"tags");return;default:throw new b(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function hl(e,t,n){switch(He(t,e.seenFields,n)){case"label":e.group.label=H(t,n);return;case"summary":e.group.summary=H(t,n);return;case"color":e.group.color=H(t,n);return;case"tags":e.group.tags=Re(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=at(H(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new b(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function gl(e,t,n){switch(He(t,e.seenFields,n)){case"from":e.relation.from=H(t,n);return;case"to":e.relation.to=H(t,n);return;case"kind":e.relation.kind=H(t,n);return;case"label":e.relation.label=H(t,n);return;case"summary":e.relation.summary=H(t,n);return;case"tags":e.relation.tags=Re(t.slice(1),n,"tags");return;case"color":e.relation.color=H(t,n);return;case"hidden":e.relation.hidden=at(H(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new b(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function bl(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&It(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(yl(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new b(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new b("Event pose object id must not be empty",r,n[1].column);let s={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(s),e.activePose=s,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new b('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(He(n,e.seenFields,r)){case"kind":e.event.kind=H(n,r);return;case"label":e.event.label=H(n,r);return;case"summary":e.event.summary=H(n,r);return;case"target":e.event.targetObjectId=H(n,r);return;case"participants":e.event.participantObjectIds=Re(n.slice(1),r,"participants");return;case"timing":e.event.timing=H(n,r);return;case"visibility":e.event.visibility=H(n,r);return;case"epoch":It(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=H(n,r);return;case"referenceplane":It(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=H(n,r);return;case"tags":e.event.tags=Re(n.slice(1),r,"tags");return;case"color":e.event.color=H(n,r);return;case"hidden":e.event.hidden=at(H(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new b(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function yl(e,t,n){if(e.length<2)throw new b("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!no.has(r))throw new b(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new b(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function wl(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Xc.has(i)){i!=="info"&&Me(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=ao(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new b(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,s=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(s.has(i.key))throw new b(`Duplicate ${o} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(kl(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function He(e,t,n){if(e.length<2)throw new b("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new b(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function H(e,t){if(e.length<2)throw new b("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function vl(e,t){return Re(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function $l(e,t,n,r){let i={};for(let o of Re(e,t,"layers")){let s=!o.startsWith("-")&&!o.startsWith("!"),c=o.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=s,i["orbits-front"]=s;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&Me(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=s)}return i}function Re(e,t,n){if(e.length===0)throw new b(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new b(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ro(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new b(`Unknown projection "${e}"`,t,n);return r}function io(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function oo(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new b(`Unknown render preset "${e}"`,t,n)}function Cr(e,t,n,r){let i=lt(e,t,n,r);if(i<=0)throw new b(`Field "${r}" must be greater than zero`,t,n);return i}function lt(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new b(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function xl(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Fr(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Il(e,t,n){if(e.length===0||e.length%2!==0)throw new b('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Fr(),i=new Set;for(let o=0;o<e.length;o+=2){let s=e[o],c=e[o+1],a=s.value.toLowerCase();if(i.has(a))throw new b(`Duplicate viewpoint camera field "${s.value}"`,t,s.column);i.add(a);let l=c.value;switch(a){case"azimuth":r.azimuth=lt(l,t,s.column,"camera.azimuth");break;case"elevation":r.elevation=lt(l,t,s.column,"camera.elevation");break;case"roll":r.roll=lt(l,t,s.column,"camera.roll");break;case"distance":r.distance=Cr(l,t,s.column,"camera.distance");break;default:throw new b(`Unknown viewpoint camera field "${s.value}"`,t,s.column)}}return r}function jl(e,t,n,r,i){let o=[],s=0;for(;s<e.length;){let c=e[s],a=mn(c.value);if(!a)throw new b(`Unknown field "${c.value}"`,t,c.column);a.version==="2.1"&&Me(r,i,c.value,{line:t,column:c.column}),s++;let l=[];if(a.inlineMode==="single"){let d=e[s];d&&(l.push(d),s++)}else if(a.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!Kc.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new b(`Missing value for field "${c.value}"`,t,c.column);o.push({type:"field",key:c.value,values:l.map(d=>d.value),location:{line:t,column:c.column}})}return uo(o,n),o}function kl(e,t,n,r,i){if(e.length<2)throw new b("Invalid field line",t,e[0]?.column??1);let o=mn(e[0].value);if(!o)throw new b(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&Me(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return uo([s],n),s}function ao(e,t,n){if(e.length<2)throw new b(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Sl(e,t,n){let r=so(e.fields),i=co(r),o=Ml(e.objectType,r),s=Cl(r.get("groups")?.[0]),c=Qn(r.get("epoch")?.[0]),a=Qn(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?at(Le(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?Al(r.get("resonance")[0]):void 0,f=Pl(r),w=r.get("derive")?.map(P=>Ll(P)),I=r.get("validate")?.map(P=>({rule:Le(P)})),S=r.has("locked")?[...new Set(r.get("locked").flatMap(P=>P.values))]:void 0,k=r.get("tolerance")?.map(P=>Tl(P)),C=Dl(e.typedBlockEntries),Y=lo(e.infoEntries,"info"),v={type:e.objectType,id:e.id,properties:o,placement:i,info:Y};return s.length>0&&(v.groups=s),c&&(v.epoch=c),a&&(v.referencePlane=a),l!==void 0&&(v.tidalLock=l),d&&(v.resonance=d),f&&(v.renderHints=f),w?.length&&(v.deriveRules=w),I?.length&&(v.validationRules=I),S?.length&&(v.lockedFields=S),k?.length&&(v.tolerances=k),C&&Object.keys(C).length>0&&(v.typedBlocks=C),tr(t,"2.1")&&(v.groups||v.epoch||v.referencePlane||v.tidalLock!==void 0||v.resonance||v.renderHints||v.deriveRules?.length||v.validationRules?.length||v.lockedFields?.length||v.tolerances?.length||v.typedBlocks)&&Me(t,n,e.id,e.location),v}function Ol(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>El(n))}}function El(e){let t=so(e.fields,"event-pose"),n=co(t);return{objectId:e.objectId,placement:n,inner:ct(t.get("inner")?.[0],"inner"),outer:ct(t.get("outer")?.[0],"outer"),epoch:Qn(t.get("epoch")?.[0]),referencePlane:Qn(t.get("referencePlane")?.[0])}}function so(e,t="object"){let n=new Map;for(let r of e){let i=mn(r.key);if(!i&&!no.has(r.key))throw b.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw b.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function co(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let s=t??n??r??i;throw b.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:Le(t),distance:ct(e.get("distance")?.[0],"distance"),semiMajor:ct(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Fl(e.get("eccentricity")?.[0],"eccentricity"),period:ct(e.get("period")?.[0],"period"),angle:ct(e.get("angle")?.[0],"angle"),inclination:ct(e.get("inclination")?.[0],"inclination"),phase:ct(e.get("phase")?.[0],"phase")};if(n){let s=Le(n);return{mode:"at",target:s,reference:Ki(s,n.location)}}if(r)return{mode:"surface",target:Le(r)};if(i){let s=Le(i),c=Dr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function Ml(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],s=mn(r);!o||!s?.legacySchema||s.legacySchema.placement||(Pr(r,e,o.location),n[r]=Zi(r,o.values,o.location))}return n}function lo(e,t){let n={};for(let r of e){if(r.key in n)throw b.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Dl(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=lo(r,n))}return t}function Pl(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=at(Le(n),"renderLabel",n.location)),r&&(t.renderOrbit=at(Le(r),"renderOrbit",r.location)),i&&(t.renderPriority=Zn(Le(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Al(e){if(e.values.length!==2)throw b.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw b.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ll(e){if(e.values.length!==2)throw b.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Tl(e){if(e.values.length!==2)throw b.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Dr(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Cl(e){return e?[...new Set(e.values)]:[]}function Qn(e){return e&&e.values.join(" ").trim()||null}function ct(e,t){return e?Mr(Le(e),e.location,t):void 0}function Fl(e,t){return e?Zn(Le(e),t,e.location):void 0}function Le(e){return un(e.values,e.key,e.location)}function mn(e){return er.get(e)}function uo(e,t){for(let n of e){let r=mn(n.key);if(!r)throw b.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Pr(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw b.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Me(e,t,n,r){tr(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function It(e,t,n,r){tr(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function tr(e,t){return to(e)<to(t)}function to(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Vl(e){let t=[...e],n=[],r=!1,i=!1,o=null,s=1,c=1;for(let a=0;a<t.length;a++){let l=t[a],d=t[a+1];if(i){if(l==="*"&&d==="/"){t[a]=" ",t[a+1]=" ",i=!1,o=null,a++,c+=2;continue}l!==`
|
|
5
5
|
`&&l!=="\r"&&(t[a]=" "),l===`
|
|
6
|
-
`?(s++,c=1):c++;continue}if(!r&&l==="/"&&
|
|
6
|
+
`?(s++,c=1):c++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:s,column:c}),t[a]=" ",t[a+1]=" ",i=!0,o={line:s,column:c},a++,c+=2;continue}if(!r&&l==="#"&&!Rl(t,a)){n.push({kind:"line",line:s,column:c}),t[a]=" ";let f=a+1;for(;f<t.length&&t[f]!==`
|
|
7
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(
|
|
9
|
-
`}function
|
|
10
|
-
`&&
|
|
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">${
|
|
13
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${
|
|
8
|
+
`?(s++,c=1):c++}if(i)throw b.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function Rl(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
|
|
9
|
+
`}function nr(e="WorldOrbit",t="2.5"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function N(e){return structuredClone(e)}function Vr(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?ho(e,t.id):null;case"event":return t.id?rr(e,t.id):null;case"event-pose":return t.id&&t.key?bo(e,t.id,t.key):null;case"object":return t.id?mo(e,t.id):null;case"viewpoint":return t.id?yo(e.system,t.id):null;case"annotation":return t.id?wo(e.system,t.id):null;case"relation":return t.id?go(e,t.id):null}}function Rr(e,t){let n=N(e),r=fo(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=rr(n,t.id);i&&(i.positions=i.positions.filter(o=>o.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function hn(e,t){return t.map(n=>({diagnostic:n,path:po(e,n)}))}function po(e,t){if(t.objectId&&mo(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&ho(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&yo(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&wo(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&go(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&rr(e,n[1]))return n[2]==="pose"&&n[3]&&bo(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in fo(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function zr(e){let t=[...e.diagnostics,...fn(e,e.version)];return hn(e,t)}function fo(e){return e.system||(e.system=nr().system),e.system}function mo(e,t){return e.objects.find(n=>n.id===t)??null}function ho(e,t){return e.groups.find(n=>n.id===t)??null}function go(e,t){return e.relations.find(n=>n.id===t)??null}function rr(e,t){return e.events.find(n=>n.id===t)??null}function bo(e,t,n){return rr(e,t)?.positions.find(r=>r.objectId===n)??null}function yo(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function wo(e,t){return e?.annotations.find(n=>n.id===t)??null}var zl=/^schema\s+2(?:\.0|\.1|\.5)?$/i,_l=/^schema\s+2\.1$/i,Bl=/^schema\s+2\.5$/i,Nl=/^schema\s+2\.0-draft$/i;function vo(e){for(let t of Ul(e).split(/\r?\n/)){let n=t.trim();if(n)return Nl.test(n)?"2.0-draft":_l.test(n)?"2.1":Bl.test(n)?"2.5":zl.test(n)?"2.0":"1.0"}return"1.0"}function Ul(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],s=t[i+1];if(r){if(o==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
|
|
10
|
+
`&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&s==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
|
|
11
|
+
`&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function dt(e){let t=gn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new b(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function gn(e){let t=vo(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Wl(e,t);let n;try{n=Qt(e)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"parse")]}}let r;try{r=en(n)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"normalize")]}}try{tn(r)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Wl(e,t){let n;try{n=Tr(e)}catch(s){return{ok:!1,value:null,diagnostics:[$t(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=dn(n)}catch(s){return{ok:!1,value:null,diagnostics:[$t(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Hl={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},ir={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function _r(e){return e?typeof e=="string"?ir[e]??ir.atlas:{...ir.atlas,...e}:ir.atlas}function Br(e){return{...Hl,...e}}function ze(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Nr(e.objectTypes??[]),tags:Nr((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Nr((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return ql(t)?t:null}function ql(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function or(e,t){let n=ze(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Gl(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ur(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(i=>!i.hidden).map(i=>({object:i,score:Xl(i,r)})).filter(i=>i.score>0).sort((i,o)=>o.score-i.score||i.object.label.localeCompare(o.object.label)).slice(0,n).map(i=>$o(i.object,i.score)):e.objects.filter(i=>!i.hidden).slice().sort((i,o)=>i.label.localeCompare(o.label)).slice(0,n).map(i=>$o(i,1))}function xo(e,t,n,r){return{version:"2.5",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:ze(n)}}function Wr(e){return encodeURIComponent(JSON.stringify(e))}function Yr(e){let t=JSON.parse(decodeURIComponent(e));return{version:t.version==="2.0"?"2.0":"2.5",viewpointId:t.viewpointId??null,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,camera:t.renderOptions?.camera?{...t.renderOptions.camera}:null,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null},filter:ze(t.filter??null)}}function Io(e,t,n){let r=e.trim()||"bookmark";return{id:r.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||r,atlasState:{...n,viewerState:{...n.viewerState},renderOptions:{...n.renderOptions,camera:n.renderOptions.camera?{...n.renderOptions.camera}:null,layers:n.renderOptions.layers?{...n.renderOptions.layers}:void 0,scaleModel:n.renderOptions.scaleModel?{...n.renderOptions.scaleModel}:void 0,activeEventId:n.renderOptions.activeEventId??null},filter:n.filter?{...n.filter}:null}}}function Hr(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,events:e.layers.events,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function qr(e){return e?.filter?ze({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function $o(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[]}}function Gl(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=jo(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function Xl(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),i=jo(e.object,e.label).toLowerCase(),o=0;return n===t||r===t?o+=120:n.startsWith(t)||r.startsWith(t)?o+=96:(n.includes(t)||r.includes(t))&&(o+=72),t.split(/\s+/).filter(Boolean).every(a=>i.includes(a))&&(o+=32),e.object.type===t&&(o+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(a=>typeof a=="string"):[]).some(a=>a.toLowerCase()===t)&&(o+=18),o}function jo(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function Nr(e){return[...new Set(e)]}var jt={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function ko(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function ar(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Tt(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Gr(e,t){return{...e,rotationDeg:ko(e.rotationDeg+t)}}function bn(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=Ft(e),s=ar(t.scale*n,i);if(s===t.scale)return t;let c=s/t.scale,a=r.x-o.x,l=r.y-o.y;return{...t,scale:s,translateX:(1-c)*a+c*t.translateX,translateY:(1-c)*l+c*t.translateY}}function Ct(e,t,n){let r=Ft(e),i=Kl(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),s=Math.max(e.height-n.fitPadding*2,1),c=Math.max(i.width,1),a=Math.max(i.height,1),l=ar(Math.min(o/c,s/a),n),d=ve({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:l,translateX:r.x-(r.x+(d.x-r.x)*l),translateY:r.y-(r.y+(d.y-r.y)*l)}}function Xr(e,t,n,r){let i=e.objects.find(a=>a.objectId===n&&!a.hidden);if(!i)return t;let o=Ft(e),s=ar(Math.max(t.scale,1.8),r),c=ve({x:i.x,y:i.y},o,t.rotationDeg);return{...t,scale:s,translateX:o.x-(o.x+(c.x-o.x)*s),translateY:o.y-(o.y+(c.y-o.y)*s),selectedObjectId:n}}function Kr(e,t){let n=Ft(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function kt(e,t,n){let r=Ft(e),i={x:n.x-t.translateX,y:n.y-t.translateY},o={x:i.x-r.x,y:i.y-r.y},s={x:o.x/Math.max(t.scale,1e-4),y:o.y/Math.max(t.scale,1e-4)},c=ve({x:s.x,y:s.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+c.x,y:r.y+c.y}}function yn(e,t){let n=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(c=>kt(e,t,c)),r=Math.min(...n.map(c=>c.x)),i=Math.min(...n.map(c=>c.y)),o=Math.max(...n.map(c=>c.x)),s=Math.max(...n.map(c=>c.y));return{minX:r,minY:i,maxX:o,maxY:s,width:o-r,height:s-i,centerX:r+(o-r)/2,centerY:i+(s-i)/2}}function Ft(e){return{x:e.width/2,y:e.height/2}}function Kl(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(a=>ve(a,t,n)),i=Math.min(...r.map(a=>a.x)),o=Math.min(...r.map(a=>a.y)),s=Math.max(...r.map(a=>a.x)),c=Math.max(...r.map(a=>a.y));return{minX:i,minY:o,maxX:s,maxY:c,width:s-i,height:c-o,centerX:i+(s-i)/2,centerY:o+(c-o)/2}}var Zr="worldorbit-camera-root";function qe(e,t={}){let n=_r(t.theme),r=pd(t.preset??e.renderPreset??void 0),i=Br({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,s=or(e,t.filter??null),c=e.objects.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)).sort((v,P)=>v.sortKey-P.sortKey),a=e.labels.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)),l=Ql(c),d=i.orbits?Jl(e,s,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)).map(v=>`<line class="wo-leader wo-leader-${v.mode}" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${ue(v.renderId)}" data-group-id="${he(v.groupId??"")}" />`).join(""):"",w=i.relations?e.relations.filter(v=>!v.hidden).filter(v=>s.has(v.fromObjectId)&&s.has(v.toObjectId)).map(v=>`<line class="wo-relation" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${ue(v.renderId)}" data-relation-id="${he(v.relationId)}" />`).join(""):"",I=i.events?e.events.filter(v=>!v.hidden).map(v=>Zl(e,v,s,n)).join(""):"",S=i.objects?c.map(v=>ed(v,t.selectedObjectId??null,n)).join(""):"",k=i.labels?a.map(v=>td(e,v,t.selectedObjectId??null)).join(""):"",C=i.metadata?`<text class="wo-title" x="56" y="64">${ue(e.title)}</text>
|
|
12
|
+
<text class="wo-subtitle" x="56" y="88">${ue(o)}</text>
|
|
13
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${ue(md(e))}</text>`:"",Y=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
14
14
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
15
|
-
${
|
|
16
|
-
<title id="worldorbit-title">${
|
|
17
|
-
<desc id="worldorbit-desc">A ${
|
|
15
|
+
${i.guides?fd(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
|
|
16
|
+
<title id="worldorbit-title">${ue(e.title)}</title>
|
|
17
|
+
<desc id="worldorbit-desc">A ${ue(e.viewMode)} WorldOrbit render with ${c.length} visible objects.</desc>
|
|
18
18
|
<defs>
|
|
19
19
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
20
20
|
<stop offset="0%" stop-color="${n.backgroundStart}" />
|
|
@@ -68,61 +68,61 @@
|
|
|
68
68
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
69
69
|
.wo-object-image { pointer-events: none; }
|
|
70
70
|
</style>
|
|
71
|
-
${
|
|
71
|
+
${Y}
|
|
72
72
|
${C}
|
|
73
73
|
<g data-worldorbit-world="true">
|
|
74
|
-
<g data-worldorbit-camera-root="${
|
|
74
|
+
<g data-worldorbit-camera-root="${Zr}" id="${Zr}">
|
|
75
75
|
<g data-worldorbit-world-content="true">
|
|
76
|
-
${
|
|
77
|
-
${
|
|
78
|
-
${
|
|
79
|
-
${
|
|
80
|
-
${
|
|
81
|
-
${
|
|
82
|
-
${
|
|
76
|
+
${i.orbits?`<g data-layer-id="orbits-back">${d.back}</g>`:""}
|
|
77
|
+
${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
78
|
+
${i.relations?`<g data-layer-id="relations">${w}</g>`:""}
|
|
79
|
+
${i.events?`<g data-layer-id="events">${I}</g>`:""}
|
|
80
|
+
${i.objects?`<g data-layer-id="objects">${S}</g>`:""}
|
|
81
|
+
${i.orbits?`<g data-layer-id="orbits-front">${d.front}</g>`:""}
|
|
82
|
+
${i.labels?`<g data-layer-id="labels">${k}</g>`:""}
|
|
83
83
|
</g>
|
|
84
84
|
</g>
|
|
85
85
|
</g>
|
|
86
|
-
</svg>`}function
|
|
86
|
+
</svg>`}function Zl(e,t,n,r){let i=t.objectIds.filter(a=>n.has(a)).map(a=>e.objects.find(l=>l.objectId===a&&!l.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,s=t.event.label||t.event.id,c=i.map(a=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${a.x}" y2="${a.y}" stroke="${he(o)}" data-event-id="${he(t.eventId)}" data-object-id="${he(a.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${ue(t.renderId)}" data-event-id="${he(t.eventId)}">
|
|
87
87
|
${c}
|
|
88
|
-
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${
|
|
89
|
-
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${
|
|
90
|
-
</g>`}function
|
|
91
|
-
<circle class="wo-selection-ring" cx="${
|
|
92
|
-
${
|
|
93
|
-
${
|
|
88
|
+
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${he(o)}" />
|
|
89
|
+
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${ue(s)}</text>
|
|
90
|
+
</g>`}function Jl(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(s=>!s.hidden&&t.has(s.objectId)&&(n||!sr(s.object)))){let s=o.bandThickness??(o.band?10:1.5),c=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",a=`data-render-id="${ue(o.renderId)}" data-orbit-object-id="${he(o.objectId)}" data-parent-id="${he(o.parentId)}" data-group-id="${he(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${c} wo-orbit-back" d="${o.backArcPath}" stroke-width="${s}" ${a} />`),o.frontArcPath&&i.push(`<path class="${c} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${s}" ${a} />`);continue}if(o.kind==="ellipse"){let l=o.rx??o.radius??0,d=o.ry??o.radius??0;i.push(`<ellipse class="${c} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${l}" ry="${d}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${s}" ${a} />`);continue}i.push(`<circle class="${c} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${s}" ${a} />`)}return{back:r.join(""),front:i.join("")}}function Ql(e){return e.filter(t=>!!t.imageHref).map(t=>id(t)).join("")}function ed(e,t,n){let{object:r,x:i,y:o,radius:s,visualRadius:c}=e,a=t===e.objectId?" wo-object-selected":"",l=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",d=ad(e,n),f=rd(e),w=f?So(r,i,o,s,d,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${l}${a}" data-object-id="${ue(e.objectId)}" data-parent-id="${he(e.parentId??"")}" data-group-id="${he(e.groupId??"")}" data-render-id="${ue(e.renderId)}" tabindex="0" role="button" aria-label="${ue(`${r.type} ${e.objectId}`)}">
|
|
91
|
+
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${c+8}" />
|
|
92
|
+
${nd(e,d)}
|
|
93
|
+
${So(r,i,o,s,d)}
|
|
94
94
|
${f}
|
|
95
95
|
${w}
|
|
96
|
-
</g>`}function
|
|
97
|
-
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*
|
|
98
|
-
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*
|
|
99
|
-
</g>`}function
|
|
100
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${
|
|
101
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${
|
|
102
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${
|
|
103
|
-
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${s}" stroke="${
|
|
104
|
-
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${
|
|
105
|
-
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${
|
|
106
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${
|
|
107
|
-
<svg width="${
|
|
108
|
-
<rect x="0.5" y="0.5" width="${
|
|
109
|
-
<rect x="${
|
|
96
|
+
</g>`}function td(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${ue(t.objectId)}" data-group-id="${he(t.groupId??"")}" data-render-id="${ue(t.renderId)}">
|
|
97
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${ue(t.label)}</text>
|
|
98
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${ue(t.secondaryLabel)}</text>
|
|
99
|
+
</g>`}function So(e,t,n,r,i,o={}){let s=o.outlineOnly?"transparent":i.fill,c=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
100
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${c}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
101
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Do(t,n,r)}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let a=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?a==="black-hole"||a==="nebula"||a==="galaxy"||a==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Jr(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:a==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
|
|
102
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="2" />`:a==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
|
|
103
|
+
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${s}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
104
|
+
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:a==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${s}" stroke="${i.stroke}" stroke-width="1" />
|
|
105
|
+
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:a==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
|
|
106
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Jr(t,n,r)}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function nd(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function rd(e){if(!e.imageHref)return"";let t=od(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${he(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${he(Mo(e))})" />`}function id(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Do(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${Jr(t,n,r)}" />`;break;default:return""}return`<clipPath id="${he(Mo(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function od(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function ad(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=sd(e.object.type,n,t),i=e.fillColor&&gd(e.fillColor)?e.fillColor:r.fill,o=Oo(e.object.properties.albedo),s=Oo(e.object.properties.temperature),c=ld(i,s,o,e.object.type),a=wn(c,"#ffffff",.4)??r.stroke,l=ud(e.object.properties.atmosphere),d=e.object.type==="star"?Eo(wn(c,"#fff2cb",.4)??c,.82):void 0;return{fill:c,stroke:a,glow:d,atmosphere:l,tail:e.object.type==="comet"?Eo(wn(c,"#ffffff",.5)??c,.72):void 0}}function sd(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return cd(t)}}function cd(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function ld(e,t,n,r){let i=e;if(t!==null){let o=dd(t,r);i=wn(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=wn(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function dd(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function ud(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function pd(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function Oo(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Mo(e){return`${e.renderId}-clip`}function Do(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Jr(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function fd(e,t){let n=Array.from({length:10},(i,o)=>{let s=90+o*((e-180)/9);return`<line class="wo-grid" x1="${s}" y1="120" x2="${s}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let s=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${s}" x2="${e-56}" y2="${s}" />`}).join("");return`${n}${r}`}function md(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function sr(e){return e.type==="structure"||e.type==="phenomenon"}function wn(e,t,n){let r=Qr(e),i=Qr(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return hd({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Eo(e,t){let n=Qr(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Qr(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function hd(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function gd(e){return!!e.trim()}function ue(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function he(e){return ue(e)}var Vt=180,Rt=120,Po=10;function Ao(e,t,n){let r=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},i=Math.min((Vt-Po*2)/Math.max(r.width,1),(Rt-Po*2)/Math.max(r.height,1)),o=(Vt-r.width*i)/2-r.minX*i,s=(Rt-r.height*i)/2-r.minY*i,c=yn(e,t),a=n.map(l=>{let d=l.x*i+o,f=l.y*i+s,w=Math.max(1.4,Math.min(l.visualRadius*i,5.2)),I=l.fillColor??bd(l.object.type);return`<circle cx="${Te(d)}" cy="${Te(f)}" r="${Te(w)}" fill="${I}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Vt}px;height:${Rt}px;padding:8px;border-radius:16px;background:rgba(5, 14, 22, 0.78);border:1px solid rgba(179, 216, 255, 0.16);box-shadow:0 14px 28px rgba(0, 0, 0, 0.24);backdrop-filter:blur(8px);pointer-events:none;">
|
|
107
|
+
<svg width="${Vt}" height="${Rt}" viewBox="0 0 ${Vt} ${Rt}" role="presentation" aria-hidden="true">
|
|
108
|
+
<rect x="0.5" y="0.5" width="${Vt-1}" height="${Rt-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
109
|
+
<rect x="${Te(r.minX*i+o)}" y="${Te(r.minY*i+s)}" width="${Te(r.width*i)}" height="${Te(r.height*i)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
110
110
|
${a}
|
|
111
|
-
<rect x="${
|
|
111
|
+
<rect x="${Te(c.minX*i+o)}" y="${Te(c.minY*i+s)}" width="${Te(c.width*i)}" height="${Te(c.height*i)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
|
|
112
112
|
</svg>
|
|
113
|
-
</div>`}function
|
|
113
|
+
</div>`}function bd(e){switch(e){case"star":return"#ffcc67";case"planet":return"#72b7ff";case"moon":return"#c7d7ea";case"belt":case"ring":return"#d9aa74";case"asteroid":return"#a7a5b8";case"comet":return"#9ce7ff";case"structure":return"#ff7f5f";case"phenomenon":return"#78ffd7"}}function Te(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var yd=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function To(e){return{objectId:e.objectId,title:e.objectId,typeLabel:Id(e.object.type),imageHref:e.renderObject.imageHref??null,description:$d(e),tags:vd(e.object.properties.tags),fields:wd(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function Co(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(o=>`<span class="wo-tooltip-tag">${_e(o)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(o=>`<div class="wo-tooltip-field"><dt>${_e(o.label)}</dt><dd>${_e(o.value)}</dd></div>`).join("")}</dl>`:"",i=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${_e(e.objectId)}">
|
|
114
114
|
<div class="wo-tooltip-head">
|
|
115
|
-
${e.imageHref?`<img class="wo-tooltip-image" src="${
|
|
115
|
+
${e.imageHref?`<img class="wo-tooltip-image" src="${kd(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${_e(e.typeLabel.slice(0,1))}</div>`}
|
|
116
116
|
<div class="wo-tooltip-heading">
|
|
117
|
-
<strong>${
|
|
118
|
-
<span>${
|
|
117
|
+
<strong>${_e(e.title)}</strong>
|
|
118
|
+
<span>${_e(e.typeLabel)}</span>
|
|
119
119
|
</div>
|
|
120
120
|
</div>
|
|
121
|
-
${e.description?`<p class="wo-tooltip-description">${
|
|
121
|
+
${e.description?`<p class="wo-tooltip-description">${_e(e.description)}</p>`:""}
|
|
122
122
|
${n}
|
|
123
123
|
${r}
|
|
124
|
-
${
|
|
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=`
|
|
124
|
+
${i.length?`<p class="wo-tooltip-relations">${_e(i.join(" - "))}</p>`:""}
|
|
125
|
+
</article>`}function wd(e){let t=new Map;for(let r of yd){let i=e.object.properties[r];i!==void 0&&t.set(r,{key:r,label:jd(r),value:Lo(i)})}let n=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),e.relatedEvents.length>0&&t.set("events",{key:"events",label:"Events",value:e.relatedEvents.map(r=>r.event.label||r.event.id).join(", ")}),n?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${n.target}`}):n?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${n.target}`}):n?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:n.distance?`Free ${Lo(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function vd(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function $d(e){let t=e.object.info.description?.trim();if(t)return t;let n=e.group?.label?.trim();return n&&n!==e.objectId?n:null}function Lo(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):xd(e)}function xd(e){return`${e.value}${e.unit??""}`}function Id(e){return e.charAt(0).toUpperCase()+e.slice(1)}function jd(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function _e(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function kd(e){return _e(e)}var zt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Fo="worldorbit-viewer-tooltip-style";function _t(e,t){if(Md(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let r={minScale:t.minScale??zt.minScale,maxScale:t.maxScale??zt.maxScale,fitPadding:t.fitPadding??zt.fitPadding},i={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??zt.panStep,zoomStep:t.zoomStep??zt.zoomStep,rotationStep:t.rotationStep??zt.rotationStep},o={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:ze(t.initialFilter),subtitle:t.subtitle},s=e.getAttribute("tabindex"),c=e.style.touchAction,a=e.style.position,l=Sd(t),d=vn(l,o),f={...jt},w=null,I=null,S=null,k=null,C=!1,Y=null,v=null,P=0,ne=!1,X=new Map,Q=null,re=null,U=null,be=null,ee=null,te=null;s===null&&(e.tabIndex=0),Dd(),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":c,e.style.position||(e.style.position="relative");let q=m=>{if(!i.pointer||ne)return;m.preventDefault(),e.focus();let y=xe(m.clientX,m.clientY),$=$n(Math.exp(-m.deltaY*.002),.6,1.6);de(bn(d,f,$,y,r))},we=m=>{if(ne)return;let y=m.pointerType==="touch";if(y&&!i.touch||!y&&!i.pointer||!y&&m.button!==0)return;e.focus(),e.setPointerCapture?.(m.pointerId);let $=Ce(m.clientX,m.clientY);if(y){X.set(m.pointerId,$),X.size===2?Q=zo(d,f,X):X.size===1&&(P=0,C=!1);return}Y=m.pointerId,v=$,P=0,C=!1},le=m=>{if(ne)return;if(m.pointerType==="touch"){if(!i.touch||!X.has(m.pointerId))return;let F=X.get(m.pointerId),Ve=Ce(m.clientX,m.clientY);if(X.set(m.pointerId,Ve),X.size===2){Q||(Q=zo(d,f,X));let Se=Bo(X),nt=Se.distance/Math.max(Q.startDistance,1),Ht=bn(d,Q.startState,nt,Q.startCenter,r),qt=Se.center.x-Q.startViewportCenter.x,Gt=Se.center.y-Q.startViewportCenter.y;de(Tt(Ht,qt,Gt))}else if(X.size===1){let Se=Ve.x-F.x,nt=Ve.y-F.y;P+=Math.abs(Se)+Math.abs(nt),P>2&&(C=!0),de(Tt(f,Se,nt))}return}if(!i.pointer||Y!==m.pointerId||!v)return;let $=Ce(m.clientX,m.clientY),Z=$.x-v.x,z=$.y-v.y;P+=Math.abs(Z)+Math.abs(z),v=$,P>2&&(C=!0),de(Tt(f,Z,z))},De=m=>{if(m.pointerType==="touch"){X.delete(m.pointerId),X.size<2&&(Q=null);return}Y===m.pointerId&&(Y=null,v=null)},We=m=>{if(!i.selection||ne)return;if(C){C=!1;return}let y=cr(m.target);W(y),i.tooltipMode==="pinned"&&(U=y,ke())},D=m=>{let y=cr(m.target);ie(y)},oe=()=>{ie(null)},Ze=m=>{let y=cr(m.target);y&&ie(y)},bt=()=>{ie(null)},T=m=>{if(!i.keyboard||ne)return;let y=cr(m.target);if((m.key==="Enter"||m.key===" ")&&y){m.preventDefault(),W(y),i.tooltipMode==="pinned"&&(U=y,ke());return}switch(m.key){case"Escape":i.tooltipMode==="pinned"&&U&&(m.preventDefault(),U=null,ke());return;case"+":case"=":m.preventDefault(),R.zoomBy(i.zoomStep);return;case"-":m.preventDefault(),R.zoomBy(1/i.zoomStep);return;case"ArrowLeft":m.preventDefault(),R.panBy(-i.panStep,0);return;case"ArrowRight":m.preventDefault(),R.panBy(i.panStep,0);return;case"ArrowUp":m.preventDefault(),R.panBy(0,-i.panStep);return;case"ArrowDown":m.preventDefault(),R.panBy(0,i.panStep);return;case"[":m.preventDefault(),R.rotateBy(-i.rotationStep);return;case"]":m.preventDefault(),R.rotateBy(i.rotationStep);return;case"f":case"F":m.preventDefault(),R.fitToSystem();return;case"0":m.preventDefault(),R.resetView();return}};e.addEventListener("wheel",q,{passive:!1}),e.addEventListener("pointerdown",we),e.addEventListener("pointermove",le),e.addEventListener("pointerup",De),e.addEventListener("pointercancel",De),e.addEventListener("click",We),e.addEventListener("mouseover",D),e.addEventListener("mouseleave",oe),e.addEventListener("focusin",Ze),e.addEventListener("focusout",bt),e.addEventListener("keydown",T);let R={setSource(m){l={kind:"source",value:m},d=vn(l,o),te=null,ye(!0)},setDocument(m){l={kind:"document",value:m},d=vn(l,o),te=null,ye(!0)},setScene(m){l={kind:"scene",value:m},d=m,te=null,ye(!0)},getScene(){return d},getRenderOptions(){return Od(o)},listViewpoints(){return d.viewpoints.slice()},getActiveViewpoint(){return et(te)},goToViewpoint(m){let y=et(m);if(!y)return!1;let $={},Z=Hr(y);if(y.preset!==null&&($.preset=y.preset),l.kind!=="scene"&&y.projection!==d.projection&&($.projection=y.projection),y.camera?$.camera={...y.camera}:o.camera&&($.camera=null),Z&&($.layers=Z),te=y.id,Object.keys($).length>0){let F=Ro($);o=Vo(o,$),l.kind!=="scene"&&F&&(d=vn(l,o)),ye(F)}tt(qr(y),!1,!1);let z=Ut(y);return de(z),W(y.selectedObjectId??y.objectId??null,!1),t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Wt(),Pe(),!0},getActiveEventId(){return o.activeEventId??null},setActiveEvent(m){R.setRenderOptions({activeEventId:m})},search(m,y=12){return Ur(d,m,y)},getFilter(){return o.filter?{...o.filter}:null},setFilter(m){tt(m,!0,!0)},getVisibleObjects(){return Fe()},getFocusPath(m){return Qe(m)},getObjectDetails(m){return K(m)},getSelectionDetails(){return K(f.selectedObjectId)},getTooltipDetails(){return ee},getAtlasState(){return xo(f,o,o.filter??null,te)},setAtlasState(m){let y=typeof m=="string"?Yr(m):m;y.viewpointId&&R.goToViewpoint(y.viewpointId),R.setRenderOptions(y.renderOptions),tt(y.filter??null,!1,!1),de(O({...f,...y.viewerState})),W(y.viewerState.selectedObjectId??null,!1),Wt(),t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Pe()},serializeAtlasState(){return Wr(R.getAtlasState())},captureBookmark(m,y){return Io(m,y,R.getAtlasState())},applyBookmark(m){return typeof m=="string"?(R.setAtlasState(m),!0):(R.setAtlasState(m.atlasState),!0)},setRenderOptions(m){let y=Ro(m);o=Vo(o,m),l.kind!=="scene"&&y&&(d=vn(l,o)),ye(y)},getState(){return{...f}},setState(m){de(O({...f,...m}))},zoomBy(m,y){de(bn(d,f,m,y??{x:d.width/2,y:d.height/2},r))},panBy(m,y){de(Tt(f,m,y))},rotateBy(m){de(Gr(f,m))},fitToSystem(){de(Ct(d,f,r))},focusObject(m){te=null,de(Xr(d,f,m,r)),W(m),i.tooltipMode==="pinned"&&(U=ae(m)?.objectId??null,ke())},pinTooltip(m){U=ae(m)?.objectId??null,ke()},resetView(){let m=Ct(d,{...jt},r);te=null,de(m),W(null),U=null,ke()},exportSvg(){return qe(d,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){ne||(ne=!0,e.removeEventListener("wheel",q),e.removeEventListener("pointerdown",we),e.removeEventListener("pointermove",le),e.removeEventListener("pointerup",De),e.removeEventListener("pointercancel",De),e.removeEventListener("click",We),e.removeEventListener("mouseover",D),e.removeEventListener("mouseleave",oe),e.removeEventListener("focusin",Ze),e.removeEventListener("focusout",bt),e.removeEventListener("keydown",T),k?.remove(),k=null,S?.remove(),S=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=c,e.style.position=a,s===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",s))}};return ye(!0),t.initialViewpointId?R.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?R.focusObject(t.initialSelectionObjectId):Pe(),R;function ye(m){if(e.innerHTML=qe(d,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),I=e.querySelector("#worldorbit-camera-root"),S=null,k=null,i.minimap&&(S=document.createElement("div"),S.dataset.worldorbitMinimapRoot="true",e.append(S)),i.tooltipMode!=="disabled"&&(k=document.createElement("div"),k.className="wo-viewer-tooltip-root",k.dataset.worldorbitTooltip="true",k.hidden=!0,k.addEventListener("click",Tn),e.append(k)),!w||!I)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=m?Ct(d,{...jt},r):O(f),W(f.selectedObjectId&&ae(f.selectedObjectId)?f.selectedObjectId:null,!1),ie(re&&ae(re)?re:null,!1),U=U&&ae(U)?U:null,fe(),Et(),Wt(),t.onViewChange?.({...f}),Pe()}function de(m){f=O(m),fe(),t.onViewChange?.({...f}),Pe()}function O(m){return{scale:$n(m.scale,r.minScale,r.maxScale),rotationDeg:_o(m.rotationDeg),translateX:Number.isFinite(m.translateX)?m.translateX:f.translateX,translateY:Number.isFinite(m.translateY)?m.translateY:f.translateY,selectedObjectId:m.selectedObjectId&&ae(m.selectedObjectId)?m.selectedObjectId:null}}function fe(){I&&(I.setAttribute("transform",Kr(d,f)),Yt(),ke())}function W(m,y=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${xn(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:m&&ae(m)?m:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${xn(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),yt(),ke(),y&&(t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),t.onViewChange?.({...f}),Pe())}function ie(m,y=!0){re===m&&y||(re=m&&ae(m)?m:null,yt(),ke(),y&&(t.onHoverChange?.(ae(re)),t.onHoverDetailsChange?.(K(re))))}function $e(){return ae(f.selectedObjectId)}function ae(m){if(!m)return null;let y=wt();return d.objects.find($=>$.objectId===m&&!$.hidden&&y.has($.objectId))??null}function K(m){let y=ae(m);return y?{objectId:y.objectId,object:y.object,renderObject:y,label:d.labels.find($=>$.objectId===y.objectId&&!$.hidden)??null,group:d.groups.find($=>$.renderId===y.groupId)??null,semanticGroups:d.semanticGroups.filter($=>y.semanticGroupIds.includes($.id)),orbit:d.orbitVisuals.find($=>$.objectId===y.objectId&&!$.hidden)??null,relatedOrbits:d.orbitVisuals.filter($=>!$.hidden&&($.objectId===y.objectId||y.ancestorIds.includes($.objectId)||y.childIds.includes($.objectId))),relations:d.relations.filter($=>!$.hidden&&($.fromObjectId===y.objectId||$.toObjectId===y.objectId)),relatedEvents:d.events.filter($=>!$.hidden&&($.targetObjectId===y.objectId||$.objectIds.includes(y.objectId))),parent:ae(y.parentId),children:y.childIds.map($=>ae($)).filter(Boolean),ancestors:y.ancestorIds.map($=>ae($)).filter(Boolean),focusPath:Qe(y.objectId)}:null}function yt(){for(let m of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))m.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Je(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Je(re,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Je(m,y){let $=K(m);if(!$)return;let Z=new Set([$.objectId,...$.renderObject.childIds,...$.renderObject.ancestorIds]);for(let z of Z)for(let F of e.querySelectorAll(`[data-object-id="${xn(z)}"]`))F.classList.add(y.objectClass);for(let z of $.ancestors)for(let F of e.querySelectorAll(`[data-object-id="${xn(z.objectId)}"]`))F.classList.add(y.ancestorClass);for(let z of $.relatedOrbits)for(let F of e.querySelectorAll(`[data-orbit-object-id="${xn(z.objectId)}"]`))F.classList.add(y.orbitClass)}function Ce(m,y){if(!w)return{x:d.width/2,y:d.height/2};let $=w.getBoundingClientRect();return!$.width||!$.height?{x:d.width/2,y:d.height/2}:{x:(m-$.left)/$.width*d.width,y:(y-$.top)/$.height*d.height}}function xe(m,y){return kt(d,f,Ce(m,y))}function wt(){return or(d,o.filter??null)}function Fe(){let m=wt();return d.objects.filter(y=>!y.hidden&&m.has(y.objectId))}function Qe(m){let y=d.objects.find($=>$.objectId===m&&!$.hidden);return y?[...y.ancestorIds,y.objectId].map($=>ae($)).filter(Boolean):[]}function et(m){return d.viewpoints.find(y=>y.id===m)??null}function Ut(m){let y=_o(m.rotationDeg),$=m.scale!==null&&m.scale!==void 0?$n(m.scale,r.minScale,r.maxScale):null,Z=m.objectId&&d.objects.find(F=>F.objectId===m.objectId&&!F.hidden);if(Z)return Ot({x:Z.x,y:Z.y},$??Math.max(1.8,jt.scale),y,m.selectedObjectId??Z.objectId);let z=Ct(d,{...jt,rotationDeg:y},r);return $===null?{...z,rotationDeg:y,selectedObjectId:m.selectedObjectId??null}:Ot({x:d.contentBounds.centerX,y:d.contentBounds.centerY},$,y,m.selectedObjectId??null)}function Ot(m,y,$,Z){let z={x:d.width/2,y:d.height/2},F=ve(m,z,$);return{scale:y,rotationDeg:$,translateX:z.x-(z.x+(F.x-z.x)*y),translateY:z.y-(z.y+(F.y-z.y)*y),selectedObjectId:Z}}function tt(m,y,$){o={...o,filter:ze(m)},$&&(te=null),ye(!1)}function Et(){t.onFilterChange?.(o.filter??null,Fe())}function Wt(){t.onViewpointChange?.(et(te))}function Pe(){t.onAtlasStateChange?.(R.getAtlasState())}function Yt(){!i.minimap||!S||(S.innerHTML=Ao(d,f,Fe()))}function ke(){if(i.tooltipMode==="disabled"||!k){vt(null);return}let m=Ye();if(!m){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),vt(null);return}let y=K(m.objectId);if(!y){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),vt(null);return}let $=To(y);be=m.objectId,k.hidden=!1,k.dataset.mode=m.mode,k.classList.toggle("is-pinned",m.mode==="pinned"),k.style.pointerEvents="auto",k.style.visibility="hidden",Pn(k,$,m.mode),An(k,y.renderObject),k.style.visibility="visible",vt($)}function Ye(){return U&&ae(U)?{objectId:U,mode:"pinned"}:re&&ae(re)?{objectId:re,mode:"hover"}:null}function Pn(m,y,$){let Z=t.tooltipRenderer?.(y,$);m.innerHTML="",typeof Z=="string"?m.innerHTML=Z:Z instanceof HTMLElement?m.append(Z):m.innerHTML=Co(y,$);let z=document.createElement("div");if(z.className="wo-tooltip-actions",$==="pinned"){let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="unpin",F.textContent="Unpin",z.append(F)}else{let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="pin",F.dataset.objectId=y.objectId,F.textContent="Pin",z.append(F)}z.childElementCount>0&&m.append(z)}function An(m,y){if(!w)return;let $={x:y.anchorX??y.x,y:y.anchorY??y.y-Math.max(y.visualRadius,y.radius)},Z=Ln($),z=w.getBoundingClientRect(),F=e.getBoundingClientRect(),Ve=z.left-F.left+Z.x/Math.max(d.width,1)*z.width,Se=z.top-F.top+Z.y/Math.max(d.height,1)*z.height,nt=Math.max(e.clientWidth-m.offsetWidth-12,12),Ht=Math.max(e.clientHeight-m.offsetHeight-12,12),qt=Se>e.clientHeight*.48,Gt=$n(Ve+18,12,nt),hr=$n(qt?Se-m.offsetHeight-18:Se+18,12,Ht);m.style.left=`${Gt}px`,m.style.top=`${hr}px`}function Ln(m){let y={x:d.width/2,y:d.height/2},$=ve(m,y,f.rotationDeg);return{x:y.x+($.x-y.x)*f.scale+f.translateX,y:y.y+($.y-y.y)*f.scale+f.translateY}}function Tn(m){let y=m.target?.closest("[data-tooltip-action]");if(y){switch(m.preventDefault(),m.stopPropagation(),y.dataset.tooltipAction){case"pin":U=y.dataset.objectId??be;break;case"unpin":U=null;break}ke()}}function vt(m){let y=ee?.objectId!==m?.objectId||ee?.description!==m?.description||ee?.imageHref!==m?.imageHref;ee=m,be=m?.objectId??null,y&&t.onTooltipChange?.(m)}}function Sd(e){if(e.scene)return{kind:"scene",value:e.scene};if(e.document)return{kind:"document",value:e.document};if(e.source)return{kind:"source",value:e.source};throw new Error("Interactive viewer requires an initial render input.")}function vn(e,t){switch(e.kind){case"scene":return e.value;case"document":return Ee(e.value,t);case"source":{let n=dt(e.value);return Ee(n.document,Ed(n,t))}}}function Od(e){return{...e,camera:e.camera?{...e.camera}:null,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme,activeEventId:e.activeEventId??null}}function Vo(e,t){return{...e,...t,camera:t.camera!==void 0?t.camera?{...t.camera}:null:e.camera?{...e.camera}:null,filter:t.filter!==void 0?ze(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function Ro(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.camera!==void 0||e.scaleModel!==void 0||e.activeEventId!==void 0}function Ed(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function zo(e,t,n){let{center:r,distance:i}=Bo(n);return{startState:{...t},startCenter:kt(e,t,r),startViewportCenter:r,startDistance:i}}function Bo(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[n,r]=t;return{center:{x:(n.x+r.x)/2,y:(n.y+r.y)/2},distance:Math.hypot(r.x-n.x,r.y-n.y)}}function cr(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function Md(e){if(typeof window>"u"||typeof document>"u")throw new Error("createInteractiveViewer can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("Interactive viewer requires an HTMLElement container.")}function $n(e,t,n){return Math.min(Math.max(e,t),n)}function _o(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function xn(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Dd(){if(typeof document>"u"||document.getElementById(Fo))return;let e=document.createElement("style");e.id=Fo,e.textContent=`
|
|
126
126
|
.wo-viewer-tooltip-root {
|
|
127
127
|
position: absolute;
|
|
128
128
|
z-index: 12;
|
|
@@ -188,10 +188,10 @@
|
|
|
188
188
|
padding: 6px 12px;
|
|
189
189
|
font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
190
190
|
}
|
|
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=`
|
|
191
|
+
`,document.head.append(e)}function No(e){return encodeURIComponent(JSON.stringify(e))}function ei(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function ti(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=qe(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${lr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${lr(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${lr(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${lr(No(n))}">${r}</div>`}function lr(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function In(e,t={}){try{let n=dt(e),r=Ee(n.document,Ld(n,t));return(t.mode??"static")==="interactive"?ti(ei(r,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${Ad(t.className??"worldorbit-block worldorbit-static")}">${qe(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Uo(n instanceof Error?n.message:String(n))}}function Uo(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Wo(e)}</pre>`}function Wo(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function Ad(e){return Wo(e).replaceAll('"',""")}function Ld(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}var Yo="worldorbit-editor-style",Td=120,Cd=16,Fd=96,Nt=1495978707e-1,Ko=6371,Zo=695700,ri=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),Vd=new Set(["star","planet","moon","asteroid","comet"]),oi=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Rd=["kind","class","culture","color","image","atmosphere","on","source"],zd=["radius","mass","density","gravity","temperature","inner","outer","cycle"],_d=["albedo"],Bd={"defaults-view":{description:"Sets the default camera projection for the atlas.",references:["Topdown = map-like","Isometric = angled overview","Orthographic/Perspective = 3D-ready semantic views"]},"defaults-scale":{description:"Chooses the overall spacing/style preset used by the renderer.",references:["diagram = tighter","presentation = roomier"]},"defaults-units":{description:"Stores a document-wide note about the unit style you want to use.",references:["Example: metric","Example: lore-standard"]},"viewpoint-projection":{description:"Overrides the projection for this saved viewpoint.",references:["Topdown = flat orbital map","Isometric = angled scene","Orthographic/Perspective = stored with current 2D fallback"]},"viewpoint-zoom":{description:"Controls how closely this viewpoint frames the system.",references:["1 = scene fit","2+ = close-up"]},"viewpoint-rotation":{description:"Legacy 2D screen rotation. This is separate from the Schema 2.5 camera block.",references:["90deg = quarter turn","Use camera.azimuth for semantic view direction"]},"viewpoint-camera-azimuth":{description:"Horizontal camera direction in degrees for Schema 2.5 viewpoints.",references:["0 = forward/default","90 = quarter orbit around the scene"]},"viewpoint-camera-elevation":{description:"Vertical camera tilt in degrees for 3D-ready viewpoints.",references:["0 = level","30 = gentle look down"]},"viewpoint-camera-roll":{description:"Rolls the camera around its forward axis.",references:["0 = upright","15 = slight bank"]},"viewpoint-camera-distance":{description:"Semantic camera distance for perspective viewpoints.",references:["4 = close","12 = wide framing"]},"viewpoint-events":{description:"Lists event IDs that this viewpoint should feature in its detail panel.",references:["solar-eclipse-naar","transit-window conjunction"]},"event-kind":{description:"Short semantic event type for tooling and viewer overlays.",references:["solar-eclipse","lunar-eclipse","transit"]},"event-target":{description:"Primary object this event is centered on.",references:["Naar","Seyra"]},"event-participants":{description:"Objects that participate in the event snapshot or description.",references:["Iyath Naar Seyra","Naar Seyra Orun"]},"event-timing":{description:"Free-text timing note for the event.",references:['"Every late bloom season"','"At local midyear"']},"event-visibility":{description:"Notes where or how the event is visible.",references:['"Visible from Naar"','"Southern hemisphere only"']},"event-epoch":{description:"Optional event-wide epoch that event poses inherit unless they override it.",references:['"JY-0001.0"','"Naar bloom cycle year 18"']},"event-referencePlane":{description:"Optional event-wide reference plane for all poses in this snapshot.",references:["ecliptic","naar-equatorial"]},"event-viewpoints":{description:"Viewpoint IDs that should list this event prominently.",references:["naar-system","overview inner-system"]},"placement-target":{description:"Names the body or reference this object is attached to.",references:["orbit Primary","surface Homeworld","at Naar:L4"]},"placement-free":{description:"Stores a free-placement offset or a descriptive label for loose placement.",references:["8au = far from the star",'"outer system" = descriptive note']},"placement-distance":{description:"Mean orbit distance from the target body.",references:["1 au = Earth-Sun distance","384400km = Earth-Moon distance"]},"placement-semiMajor":{description:"Semi-major axis of an orbit, used for elliptical orbits.",references:["1 au = Earth-Sun distance","Use this instead of distance when orbit shape matters"]},"placement-eccentricity":{description:"Controls how stretched the orbit is. Lower is rounder.",references:["0 = circular orbit","0.1 = mildly elliptical"]},"placement-period":{description:"How long one orbit takes.",references:["1 y = one Earth year","27.3d = Moon around Earth"]},"placement-angle":{description:"Rotates the orbit ellipse within the scene.",references:["0deg = default orientation","90deg = quarter turn"]},"placement-inclination":{description:"Tilts the orbit relative to the main orbital plane.",references:["0deg = same plane","5deg = slight tilt"]},"placement-phase":{description:"Starting position of the object along its orbit.",references:["0deg = start position","180deg = opposite side"]},"pose-epoch":{description:"Overrides the effective epoch for this pose only.",references:['"JY-0001.0"',"Falls back to event, object, then system"]},"pose-referencePlane":{description:"Overrides the effective reference plane for this pose only.",references:["naar-equatorial","Falls back to event, object, then system"]},"prop-radius":{description:"Visual body size or real-world-inspired radius value.",references:["1re = Earth radius","1sol = Sun radius"]},"prop-mass":{description:"Optional mass value for the body.",references:["1me = Earth mass","1sol = Sun mass"]},"prop-gravity":{description:"Surface gravity or a custom gravity marker.",references:["1g = Earth-like gravity","0.16g = Moon-like gravity"]},"prop-temperature":{description:"Typical temperature or narrative temperature marker.",references:["288K = Earth-like average","1200K = very hot world"]},"prop-atmosphere":{description:"Short atmosphere descriptor for the object.",references:['"nitrogen-oxygen"','"methane haze"']},"prop-inner":{description:"Inner edge for a belt, ring, or broad phenomenon.",references:["120000km = ring inner edge","2au = belt starts here"]},"prop-outer":{description:"Outer edge for a belt, ring, or broad phenomenon.",references:["190000km = ring outer edge","3au = belt ends here"]}};function Jo(e,t={}){zu(e),_u();let n=Nd(t),r=n.atlasDocument,i=n.source,o=i,s=i,c=n.diagnostics,a=r.objects[0]?{kind:"object",id:r.objects[0].id}:{kind:"system"},l=[],d=[],f=null,w=!1,I=!1,S=!1,k=null,C=null,Y="",v="",P=new Map,ne=t.showTextPane??!0,X=t.showInspector??!0,Q=t.showPreview??!0,re=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(X),e.dataset.woShowTextPane=String(ne),e.dataset.woShowPreview=String(Q),e.innerHTML=Ud();let U=je(e,"[data-editor-toolbar]"),be=je(e,"[data-editor-outline]"),ee=je(e,"[data-editor-stage-shell]"),te=je(e,"[data-editor-stage]"),q=je(e,"[data-editor-overlay]"),we=je(e,"[data-editor-diagnostics]"),le=je(e,"[data-editor-source-diagnostics]"),De=je(e,"[data-editor-status]"),We=je(e,"[data-editor-live]"),D=je(e,"[data-editor-inspector]"),oe=je(e,"[data-editor-source]"),Ze=je(e,"[data-editor-preview-visual]"),bt=je(e,"[data-editor-preview-markup]"),T=null;T=_t(te,{source:i,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:r.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(u){let p=a?ni(a):null;if(w||!u){w||(a?.kind==="event-pose"&&a.id?xe({kind:"event",id:a.id},!1,!0):a?.kind==="object"?xe(p?{kind:"event",id:p}:null,!1,!0):a?.kind==="event"&&a.id&&xe({kind:"event",id:a.id},!1,!0));return}if(p&&na(r,p,u.objectId)){xe({kind:"event-pose",id:p,key:u.objectId},!1,!0);return}xe({kind:"object",id:u.objectId},!1,!0)},onViewChange(){Pe()}}),U.addEventListener("click",Pn),be.addEventListener("click",An),q.addEventListener("pointerdown",z),D?.addEventListener("click",Ln),D?.addEventListener("input",Tn),D?.addEventListener("change",vt),oe?.addEventListener("input",y),oe?.addEventListener("change",$),oe?.addEventListener("blur",$),e.addEventListener("keydown",Z),window.addEventListener("pointermove",F),window.addEventListener("pointerup",Ve),window.addEventListener("pointercancel",Ve);let R={setSource(u){yt(u,!1)&&(de(),Qe())},setAtlasDocument(u){K(u,!1,a,!1),de(),Qe()},getSource(){return i},getAtlasDocument(){return N(r)},getDiagnostics(){return c.map(pr)},getSelection(){return a?{path:{...a}}:null},isDirty(){return S},markSaved(){$e(!0)},selectPath(u){xe(u,!0,!0)},canUndo(){return l.length>0},canRedo(){return d.length>0},undo(){let u=l.pop();return u?(d.unshift(ye()),ae(u),!0):!1},redo(){let u=d.shift();return u?(l.push(ye()),ae(u),!0):!1},addObject(u="planet"){let p=Sn(u,r.objects.map(j=>j.id)),h=cu(u,p,r),g=lu(r,h);return K(g,!0,{kind:"object",id:p}),p},addEvent(){let u=Sn("event",r.events.map(g=>g.id)),p={id:u,kind:"",label:On(u),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},h=N(r);return h.events.push(p),h.events.sort(Go),K(h,!0,{kind:"event",id:u}),u},addViewpoint(){let u=Sn("viewpoint",r.system?.viewpoints.map(g=>g.id)??[]),p={id:u,label:On(u),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:r.system?.defaults.view??"topdown",preset:r.system?.defaults.preset??null,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null},h=N(r);return h.system?.viewpoints.push(p),h.system?.viewpoints.sort((g,j)=>g.id.localeCompare(j.id)),K(h,!0,{kind:"viewpoint",id:u}),u},addAnnotation(){let u=Sn("annotation",r.system?.annotations.map(g=>g.id)??[]),p={id:u,label:On(u),targetObjectId:null,body:"",tags:[],sourceObjectId:null},h=N(r);return h.system?.annotations.push(p),h.system?.annotations.sort((g,j)=>g.id.localeCompare(j.id)),K(h,!0,{kind:"annotation",id:u}),u},addMetadata(u,p){let h=u?.trim()||Sn("metadata",Object.keys(r.system?.atlasMetadata??{})),g=N(r);return g.system&&(g.system.atlasMetadata[h]=p??""),K(g,!0,{kind:"metadata",key:h}),h},removeSelection(){if(!a||a.kind==="system"||a.kind==="defaults")return!1;let u=pu(r,a);return K(u,!0,{kind:"system"}),!0},exportSvg(){return T.exportSvg()},exportEmbedMarkup(){return qo(W(),r)},destroy(){I||(I=!0,U.removeEventListener("click",Pn),be.removeEventListener("click",An),q.removeEventListener("pointerdown",z),D?.removeEventListener("click",Ln),D?.removeEventListener("input",Tn),D?.removeEventListener("change",vt),oe?.removeEventListener("input",y),oe?.removeEventListener("change",$),oe?.removeEventListener("blur",$),e.removeEventListener("keydown",Z),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",Ve),window.removeEventListener("pointercancel",Ve),O(),fe(),T.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Fe(!0),ie(!0),R;function ye(){return{atlasDocument:N(r),selection:a?{...a}:null,source:i}}function de(){l.length=0,d.length=0,Qe()}function O(){k!==null&&(window.clearTimeout(k),k=null)}function fe(){C!==null&&(window.clearTimeout(C),C=null)}function W(){return f?.changed?mt(r):i}function ie(u=!1){let p=o!==s||i!==s||f?.changed===!0;!u&&p===S||(S=p,Xt(),t.onDirtyChange?.(S))}function $e(u=!1){o=i,Et(),s=i,ie(u)}function ae(u){O(),r=N(u.atlasDocument),i=u.source,o=i,c=ht(r),a=wt(u.selection),Je({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),xe(a,!1,!1),Fe(),ie(),Ce()}function K(u,p,h,g=!1){p&&(l.push(ye()),d.length=0),O(),r=N(u),i=mt(r),g||(o=i),c=ht(r),a=wt(h),Je({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),xe(a,!1,!1),Fe(),ie(),Ce()}function yt(u,p){o=u,oe&&oe.value!==u&&(oe.value=u);let h=gn(u);if(!h.ok||!h.value)return c=h.diagnostics.map(E=>({diagnostic:E,path:null})),Ut(),Ot(),et(),tt(),Xt(),Cn(),ie(),t.onDiagnosticsChange?.(c.map(pr)),!1;let g=h.value.atlasDocument??xt(h.value.document),j=hn(g,h.diagnostics);return p&&(l.push(ye()),d.length=0,o=mt(g)),r=N(g),i=mt(r),c=ea(j,ht(r)),a=wt(a),Je({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),Fe(),ie(),Ce(),!0}function Je(u={}){if(!T)return;let p=T.getState(),h=T.getRenderOptions(),g=r.system?.defaults.preset??"atlas-card",j=a?ni(a):null;w=!0,(h.preset!==g||h.projection!=="document"||(h.activeEventId??null)!==j)&&T.setRenderOptions({preset:g,projection:"document",activeEventId:j}),T.setDocument(dn(r)),u.applyViewpointSelection&&a?.kind==="viewpoint"&&a.id?T.goToViewpoint(a.id):u.preserveCamera!==!1?T.setState({...p,selectedObjectId:a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null}):a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key&&T.focusObject(a.key),w=!1}function Ce(){let u={source:i,atlasDocument:N(r),diagnostics:c.map(pr),selection:a?{path:{...a}}:null};t.onDiagnosticsChange?.(u.diagnostics),t.onSelectionChange?.(u.selection),t.onChange?.(u)}function xe(u,p,h=!0){a=wt(u),p&&(w=!0,T.setRenderOptions({activeEventId:a?ni(a):null}),a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key?T.focusObject(a.key):a?.kind==="viewpoint"&&a.id&&T.goToViewpoint(a.id),w=!1),Qe(),et(),D?.contains(document.activeElement)||tt(),Pe(),Xt(),Cn(),h&&t.onSelectionChange?.(a?{path:{...a}}:null)}function wt(u){if(!u)return null;let p=Vr(r,u);return p==null?u.kind==="system"||u.kind==="defaults"?u:null:u}function Fe(u=!1){Qe(),et(),Ut(),Ot(),D?.contains(document.activeElement)||tt(),Et(),Wt(u),Pe(),Xt(),Cn()}function Qe(){let u=U.querySelector("[data-editor-add-object-type]")?.value??"planet";U.innerHTML=`
|
|
192
192
|
<div class="wo-editor-toolbar-group">
|
|
193
193
|
<select data-editor-add-object-type>
|
|
194
|
-
${
|
|
194
|
+
${oi.map(p=>`<option value="${L(p)}"${p===u?" selected":""}>${L(On(p))}</option>`).join("")}
|
|
195
195
|
</select>
|
|
196
196
|
<button type="button" data-editor-action="add-object">Add object</button>
|
|
197
197
|
<button type="button" data-editor-action="add-event">Add event</button>
|
|
@@ -202,64 +202,64 @@
|
|
|
202
202
|
<div class="wo-editor-toolbar-group">
|
|
203
203
|
<button type="button" data-editor-action="remove"${!a||a.kind==="system"||a.kind==="defaults"?" disabled":""}>Remove</button>
|
|
204
204
|
<button type="button" data-editor-action="undo"${l.length===0?" disabled":""}>Undo</button>
|
|
205
|
-
<button type="button" data-editor-action="redo"${
|
|
205
|
+
<button type="button" data-editor-action="redo"${d.length===0?" disabled":""}>Redo</button>
|
|
206
206
|
<button type="button" data-editor-action="format">Format source</button>
|
|
207
207
|
</div>
|
|
208
|
-
`}function
|
|
208
|
+
`}function et(){let u=Ke(a),p=xu(c),h=Object.entries(r.system?.atlasMetadata??{}).sort(([g],[j])=>g.localeCompare(j));be.innerHTML=`
|
|
209
209
|
<div class="wo-editor-outline-section">
|
|
210
210
|
<h3>Atlas</h3>
|
|
211
|
-
${
|
|
212
|
-
${
|
|
211
|
+
${Xe({kind:"system"},"System",u,p)}
|
|
212
|
+
${Xe({kind:"defaults"},"Defaults",u,p)}
|
|
213
213
|
</div>
|
|
214
214
|
<div class="wo-editor-outline-section">
|
|
215
215
|
<h3>Metadata</h3>
|
|
216
|
-
${
|
|
216
|
+
${h.length>0?h.map(([g])=>Xe({kind:"metadata",key:g},g,u,p)).join(""):'<p class="wo-editor-empty">No atlas metadata yet.</p>'}
|
|
217
217
|
</div>
|
|
218
218
|
<div class="wo-editor-outline-section">
|
|
219
219
|
<h3>Viewpoints</h3>
|
|
220
|
-
${(r.system?.viewpoints.length??0)>0?r.system?.viewpoints.map(
|
|
220
|
+
${(r.system?.viewpoints.length??0)>0?r.system?.viewpoints.map(g=>Xe({kind:"viewpoint",id:g.id},g.label,u,p)).join(""):'<p class="wo-editor-empty">No viewpoints yet.</p>'}
|
|
221
221
|
</div>
|
|
222
222
|
<div class="wo-editor-outline-section">
|
|
223
223
|
<h3>Annotations</h3>
|
|
224
|
-
${(r.system?.annotations.length??0)>0?r.system?.annotations.map(
|
|
224
|
+
${(r.system?.annotations.length??0)>0?r.system?.annotations.map(g=>Xe({kind:"annotation",id:g.id},g.label,u,p)).join(""):'<p class="wo-editor-empty">No annotations yet.</p>'}
|
|
225
225
|
</div>
|
|
226
226
|
<div class="wo-editor-outline-section">
|
|
227
227
|
<h3>Events</h3>
|
|
228
|
-
${r.events.length>0?r.events.map(
|
|
228
|
+
${r.events.length>0?r.events.map(g=>Gd(g,u,p)).join(""):'<p class="wo-editor-empty">No events yet.</p>'}
|
|
229
229
|
</div>
|
|
230
230
|
<div class="wo-editor-outline-section">
|
|
231
231
|
<h3>Objects</h3>
|
|
232
|
-
${r.objects.length>0?r.objects.map(
|
|
232
|
+
${r.objects.length>0?r.objects.map(g=>Xe({kind:"object",id:g.id},`${g.id} - ${g.type}`,u,p)).join(""):'<p class="wo-editor-empty">No objects yet.</p>'}
|
|
233
233
|
</div>
|
|
234
|
-
`}function
|
|
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)}">
|
|
234
|
+
`}function Ut(){we.innerHTML=c.length===0?'<p class="wo-editor-empty">No diagnostics.</p>':c.map(u=>{let p=u.path?ur(u.path):"Source",h=Ho(u);return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(u.diagnostic.severity)}">
|
|
239
235
|
<strong>${L(u.diagnostic.severity.toUpperCase())}</strong>
|
|
240
|
-
<span>${L(
|
|
236
|
+
<span>${L(p)}${h?` \xB7 ${L(h)}`:""}</span>
|
|
241
237
|
<p>${L(u.diagnostic.message)}</p>
|
|
242
|
-
</article>`}).join("")}function
|
|
238
|
+
</article>`}).join("")}function Ot(){let u=c.filter(p=>!p.path||p.diagnostic.line!==void 0);le.innerHTML=u.length===0?'<p class="wo-editor-empty">No source diagnostics.</p>':u.map(p=>{let h=Ho(p)??"Source";return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(p.diagnostic.severity)}">
|
|
239
|
+
<strong>${L(p.diagnostic.severity.toUpperCase())}</strong>
|
|
240
|
+
<span>${L(h)}</span>
|
|
241
|
+
<p>${L(p.diagnostic.message)}</p>
|
|
242
|
+
</article>`}).join("")}function tt(){if(!D)return;Yd(D,P);let u={selection:a?{path:{...a}}:null,system:r.system,viewpoints:r.system?.viewpoints??[],events:r.events,objects:r.objects};if(!a){D.innerHTML='<p class="wo-editor-empty">Select an atlas node or object to edit it.</p>';return}let p=pa(a,c);switch(a.kind){case"system":D.innerHTML=p+Xd(u),ut(D,P),rt(a,c);return;case"defaults":D.innerHTML=p+Kd(u),ut(D,P),rt(a,c);return;case"metadata":D.innerHTML=p+Zd(u,a.key??""),ut(D,P),rt(a,c);return;case"viewpoint":D.innerHTML=p+Jd(u,a.id??""),ut(D,P),rt(a,c);return;case"event":D.innerHTML=p+Qd(u,a.id??""),ut(D,P),rt(a,c);return;case"event-pose":D.innerHTML=p+eu(u,a.id??"",a.key??""),ut(D,P),rt(a,c);return;case"annotation":D.innerHTML=p+tu(u,a.id??""),ut(D,P),rt(a,c);return;case"object":D.innerHTML=p+nu(u,a.id??""),ut(D,P),rt(a,c);return}}function Et(){oe&&oe.value!==o&&(oe.value=o)}function Wt(u=!1){if(u){si();return}ai()}function Pe(){if(!T)return;q.innerHTML="";let u=a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null;if(!u)return;let p=T.getObjectDetails(u);if(!p)return;if(Yt(p.renderObject.x,p.renderObject.y,p.renderObject.objectId),p.parent&&Yt(p.parent.x,p.parent.y,`Parent: ${p.parent.objectId}`,!0),p.renderObject.anchorX!==void 0&&p.renderObject.anchorY!==void 0&&Yt(p.renderObject.anchorX,p.renderObject.anchorY,"Anchor",!0),p.object.placement?.mode==="orbit"&&p.orbit){let g=Ye({x:p.renderObject.x,y:p.renderObject.y});q.append(kn("orbit-phase",p.objectId,g,"Phase"));let j=ke(p);q.append(kn("orbit-radius",p.objectId,j,"Size"))}if(p.object.placement?.mode==="at"){q.append(kn("at-reference",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Reference"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag to an object center or nearby Lagrange point.",q.append(g)}if(p.object.placement?.mode==="surface"){q.append(kn("surface-target",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Surface"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag onto another surface-capable body.",q.append(g)}if(p.object.placement?.mode==="free"){q.append(kn("free-distance",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Offset"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag horizontally to change free offset.",q.append(g)}let h=ua(a,c).slice(0,3);if(h.length>0){let g=document.createElement("div");g.className="wo-editor-overlay-diagnostics",g.setAttribute("role","status"),g.setAttribute("aria-live","polite"),g.innerHTML=h.map(j=>`<article class="wo-editor-overlay-diagnostic wo-editor-overlay-diagnostic-${L(j.diagnostic.severity)}">
|
|
243
243
|
<strong>${L(j.diagnostic.severity.toUpperCase())}</strong>
|
|
244
244
|
<p>${L(j.diagnostic.message)}</p>
|
|
245
|
-
</article>`).join(""),
|
|
245
|
+
</article>`).join(""),q.append(g)}}function Yt(u,p,h,g=!1){let j=Ye({x:u,y:p}),E=document.createElement("div");E.className=`wo-editor-hint${g?" is-subtle":""}`,E.style.left=`${j.x}px`,E.style.top=`${j.y}px`,E.textContent=h,q.append(E)}function ke(u){let p=u.orbit;if(!p)return Ye({x:u.renderObject.x,y:u.renderObject.y});let h={x:p.cx+(p.kind==="circle"?p.radius??0:p.rx??0),y:p.cy},g=ve(h,{x:p.cx,y:p.cy},p.rotationDeg);return Ye(g)}function Ye(u){let p=T.getScene(),h=T.getState(),g={x:p.width/2,y:p.height/2},j=ve(u,g,h.rotationDeg),E={x:g.x+(j.x-g.x)*h.scale+h.translateX,y:g.y+(j.y-g.y)*h.scale+h.translateY},B=te.querySelector("svg");if(!B)return E;let J=B.getBoundingClientRect(),se=ee.getBoundingClientRect();return{x:J.left-se.left+E.x/Math.max(p.width,1)*J.width,y:J.top-se.top+E.y/Math.max(p.height,1)*J.height}}function Pn(u){let p=u.target?.closest("[data-editor-action]");if(p)switch(p.dataset.editorAction){case"add-object":{let h=U.querySelector("[data-editor-add-object-type]")?.value;R.addObject(h??"planet");return}case"add-viewpoint":R.addViewpoint();return;case"add-event":R.addEvent();return;case"add-annotation":R.addAnnotation();return;case"add-metadata":R.addMetadata();return;case"remove":R.removeSelection();return;case"undo":R.undo();return;case"redo":R.redo();return;case"format":O(),o=i,Et(),ie();return}}function An(u){let p=u.target?.closest("[data-path-kind]");p&&xe({kind:p.dataset.pathKind,id:p.dataset.pathId||void 0,key:p.dataset.pathKey||void 0},!0,!0)}function Ln(u){let p=u.target?.closest("[data-path-kind]");if(p){xe({kind:p.dataset.pathKind,id:p.dataset.pathId||void 0,key:p.dataset.pathKey||void 0},!0,!0);return}let h=u.target?.closest("[data-editor-action]");if(h&&h.dataset.editorAction==="add-event-pose"){let g=h.dataset.editorEventId||(a?.kind==="event"||a?.kind==="event-pose"?a.id??"":"");if(!g)return;let j=Su(r,g),E=j.events.find(J=>J.id===g),B=E?.positions.at(-1)??E?.positions[0];K(j,!0,B?{kind:"event-pose",id:g,key:B.objectId}:{kind:"event",id:g});return}}function Tn(){m(!1)}function vt(){m(!0)}function m(u){if(!(!a||!D))switch(a.kind){case"system":K(Ht(),u,a,!1);return;case"defaults":K(qt(),u,a,!1);return;case"metadata":K(Gt(a.key??""),u,a,!1);return;case"viewpoint":K(hr(a.id??""),u,a,!1);return;case"event":K(oa(a.id??""),u,a,!1);return;case"event-pose":K(aa(a.id??"",a.key??""),u,a,!1);return;case"annotation":K(sa(a.id??""),u,a,!1);return;case"object":K(ca(a.id??""),u,a,!1);return}}function y(){o=oe?.value??"",ie(),O(),k=window.setTimeout(()=>{k=null,yt(o,!1)},Td)}function $(){O(),yt(oe?.value??"",!0)&&Et()}function Z(u){if(u.key==="Escape"&&f){u.preventDefault(),Se();return}if(!re||u.defaultPrevented||da(u))return;let p=(u.ctrlKey||u.metaKey)&&!u.shiftKey&&u.key.toLowerCase()==="z",h=(u.ctrlKey||u.metaKey)&&(u.shiftKey&&u.key.toLowerCase()==="z"||u.key.toLowerCase()==="y");if(p){u.preventDefault(),R.undo();return}h&&(u.preventDefault(),R.redo())}function z(u){let p=u.target?.closest("[data-handle-kind]");if(!p)return;let h=p.dataset.objectId,g=p.dataset.handleKind;if(!h||!["orbit-phase","orbit-radius","at-reference","surface-target","free-distance"].includes(g))return;if(O(),o!==i&&!yt(o,!0)){u.preventDefault();return}let j=T?.getObjectDetails(h)??null;f={kind:g,objectId:h,pointerId:u.pointerId,path:a?{...a}:{kind:"object",id:h},startedFrom:ye(),changed:!1,orbitRadiusContext:g==="orbit-radius"&&j?bu(r,T.getScene(),j):null},p.setPointerCapture?.(u.pointerId),u.preventDefault()}function F(u){if(!f||f.pointerId!==u.pointerId||!a||Ke(a)!==Ke(f.path))return;let p=T.getObjectDetails(f.objectId);if(!p)return;let h=nt(u.clientX,u.clientY),g=r;switch(f.kind){case"orbit-phase":p.object.placement?.mode==="orbit"&&p.orbit&&(g=fu(r,f.path,f.objectId,p,h));break;case"orbit-radius":p.object.placement?.mode==="orbit"&&p.orbit&&(g=mu(r,f.path,f.objectId,p,h,f.orbitRadiusContext??null));break;case"at-reference":p.object.placement?.mode==="at"&&(g=hu(r,f.path,f.objectId,T.getScene(),h));break;case"surface-target":p.object.placement?.mode==="surface"&&(g=gu(r,f.path,f.objectId,T.getScene(),h));break;case"free-distance":p.object.placement?.mode==="free"&&(g=yu(r,f.path,f.objectId,T.getScene(),p,h));break}g!==r&&(f.changed=!0,r=N(g),c=ht(r),Je({preserveCamera:!0,applyViewpointSelection:!1}),Ut(),Ot(),et(),tt(),Pe(),Xt(),Cn(),ai(),ie())}function Ve(u){if(!f||f.pointerId!==u.pointerId)return;let p=f;if(!f.changed){f=null;return}l.push(f.startedFrom),d.length=0,i=mt(r),o=i,f=null,Fe(),p.kind==="orbit-radius"&&la(p.objectId),ie(),Ce()}function Se(){if(!f)return;let u=f.startedFrom;f=null,r=N(u.atlasDocument),i=u.source,o=i,c=ht(r),xe(u.selection,!1,!1),Je({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),Fe(),ie(),Ce()}function nt(u,p){let h=te.querySelector("svg"),g=T.getScene();if(!h)return{x:g.width/2,y:g.height/2};let j=h.getBoundingClientRect(),E={x:(u-j.left)/Math.max(j.width,1)*g.width,y:(p-j.top)/Math.max(j.height,1)*g.height};return kt(g,T.getState(),E)}function Ht(){let u=N(r),p=D?.querySelector("form[data-editor-form='system']");return!p||!u.system||(u.system.id=ge(p,"system-id")||u.system.id,u.system.title=M(p,"system-title")),u}function qt(){let u=N(r),p=D?.querySelector("form[data-editor-form='defaults']");return!p||!u.system||(u.system.defaults.view=ge(p,"defaults-view")||"topdown",u.system.defaults.scale=M(p,"defaults-scale"),u.system.defaults.units=M(p,"defaults-units"),u.system.defaults.preset=M(p,"defaults-preset")??null,u.system.defaults.theme=M(p,"defaults-theme")),u}function Gt(u){let p=N(r),h=D?.querySelector("form[data-editor-form='metadata']");if(!h||!p.system)return p;let g=ge(h,"metadata-key")||u,j=M(h,"metadata-value")??"";return g!==u?(delete p.system.atlasMetadata[u],p.system.atlasMetadata[g]=j,a={kind:"metadata",key:g},p):(p.system.atlasMetadata[u]=j,p)}function hr(u){let p=N(r),h=D?.querySelector("form[data-editor-form='viewpoint']"),g=p.system?.viewpoints.find(B=>B.id===u);if(!h||!g||!p.system)return p;let j=ge(h,"viewpoint-id")||g.id,E={...g,id:j,label:ge(h,"viewpoint-label")||g.label,summary:M(h,"viewpoint-summary")??"",focusObjectId:M(h,"viewpoint-focus"),selectedObjectId:M(h,"viewpoint-select"),projection:ge(h,"viewpoint-projection")||g.projection,preset:M(h,"viewpoint-preset")??null,zoom:gt(M(h,"viewpoint-zoom")),rotationDeg:gt(M(h,"viewpoint-rotation"))??0,camera:au(h),layers:{background:Be(h,"layer-background"),guides:Be(h,"layer-guides"),"orbits-back":Be(h,"layer-orbits-back"),"orbits-front":Be(h,"layer-orbits-front"),events:Be(h,"layer-events"),objects:Be(h,"layer-objects"),labels:Be(h,"layer-labels"),metadata:Be(h,"layer-metadata")},events:Ge(M(h,"viewpoint-events")),filter:{query:M(h,"filter-query"),objectTypes:su(M(h,"filter-object-types")),tags:Ge(M(h,"filter-tags")),groupIds:Ge(M(h,"filter-groups"))}};return p.system.viewpoints=p.system.viewpoints.filter(B=>B.id!==g.id).concat(E).sort((B,J)=>B.id.localeCompare(J.id)),g.id!==E.id&&(a={kind:"viewpoint",id:E.id}),p}function oa(u){let p=N(r),h=D?.querySelector("form[data-editor-form='event']"),g=p.events.find(B=>B.id===u);if(!h||!g)return p;let j=ge(h,"event-id")||g.id,E={...g,id:j,kind:ge(h,"event-kind"),label:ge(h,"event-label")||g.label,summary:M(h,"event-summary"),targetObjectId:M(h,"event-target"),participantObjectIds:Ge(M(h,"event-participants")),timing:M(h,"event-timing"),visibility:M(h,"event-visibility"),epoch:M(h,"event-epoch"),referencePlane:M(h,"event-referencePlane"),tags:Ge(M(h,"event-tags")),color:M(h,"event-color"),hidden:Be(h,"event-hidden")};return p.events=p.events.filter(B=>B.id!==g.id).concat(E).sort(Go),Eu(p,g.id,E.id,Ge(M(h,"event-viewpoints"))),g.id!==E.id&&(a={kind:"event",id:E.id}),p}function aa(u,p){let h=N(r),g=D?.querySelector("form[data-editor-form='event-pose']"),j=h.events.find(Ae=>Ae.id===u),E=j?.positions.find(Ae=>Ae.objectId===p);if(!g||!j||!E)return h;let J={objectId:ge(g,"pose-object-id")||E.objectId,placement:iu(g,E),epoch:M(g,"pose-epoch"),referencePlane:M(g,"pose-referencePlane")},se=Ue(M(g,"prop-inner")),Fn=Ue(M(g,"prop-outer"));return se&&(J.inner=se),Fn&&(J.outer=Fn),j.positions=j.positions.filter(Ae=>Ae.objectId!==E.objectId).concat(J).sort(mr),j.targetObjectId!==J.objectId&&!j.participantObjectIds.includes(J.objectId)&&(j.participantObjectIds.push(J.objectId),j.participantObjectIds.sort((Ae,Kt)=>Ae.localeCompare(Kt))),E.objectId!==J.objectId&&(a={kind:"event-pose",id:u,key:J.objectId}),h}function sa(u){let p=N(r),h=D?.querySelector("form[data-editor-form='annotation']"),g=p.system?.annotations.find(B=>B.id===u);if(!h||!g||!p.system)return p;let j=ge(h,"annotation-id")||g.id,E={...g,id:j,label:ge(h,"annotation-label")||g.label,targetObjectId:M(h,"annotation-target"),body:M(h,"annotation-body")??"",tags:Ge(M(h,"annotation-tags")),sourceObjectId:M(h,"annotation-source")};return p.system.annotations=p.system.annotations.filter(B=>B.id!==g.id).concat(E).sort((B,J)=>B.id.localeCompare(J.id)),g.id!==E.id&&(a={kind:"annotation",id:E.id}),p}function ca(u){let p=N(r),h=D?.querySelector("form[data-editor-form='object']"),g=p.objects.find(se=>se.id===u);if(!h||!g)return p;let j=ge(h,"object-id")||g.id,E={...g,id:j,type:ge(h,"object-type")||g.type,properties:{...g.properties},info:{...g.info},placement:ru(h,g)};for(let se of Rd)dr(E.properties,se,M(h,`prop-${se}`));for(let se of zd)dr(E.properties,se,ou(M(h,`prop-${se}`)));for(let se of _d)dr(E.properties,se,gt(M(h,`prop-${se}`)));dr(E.properties,"tags",Ge(M(h,"prop-tags"))),E.properties.hidden=Be(h,"prop-hidden");let B=M(h,"info-description");B?E.info.description=B:delete E.info.description;let J=du(p,g.id,E);return g.id!==E.id&&(a={kind:"object",id:E.id}),J}function Xt(){let u=c.filter(g=>g.diagnostic.severity==="error").length,p=c.filter(g=>g.diagnostic.severity==="warning").length,h=a?ur(a):"Nothing selected";De.innerHTML=`
|
|
246
246
|
<span class="wo-editor-status-pill${S?" is-dirty":" is-clean"}">${S?"Unsaved changes":"Saved"}</span>
|
|
247
247
|
<span class="wo-editor-status-pill">Schema ${L(r.version)}</span>
|
|
248
|
-
<span class="wo-editor-status-pill${
|
|
249
|
-
<span class="wo-editor-status-pill">${L(
|
|
250
|
-
`}function
|
|
251
|
-
${
|
|
252
|
-
<strong>${L(
|
|
253
|
-
<span>${L(
|
|
254
|
-
<p>${L(
|
|
248
|
+
<span class="wo-editor-status-pill${u>0?" is-error":p>0?" is-warning":""}">${u} errors \xB7 ${p} warnings</span>
|
|
249
|
+
<span class="wo-editor-status-pill">${L(h)}</span>
|
|
250
|
+
`}function Cn(){let u=c.filter(h=>h.diagnostic.severity==="error").length,p=c.filter(h=>h.diagnostic.severity==="warning").length;We.textContent=`${S?"Unsaved changes.":"Saved."} ${u} errors, ${p} warnings. ${a?ur(a):"Nothing selected"}.`}function ai(){C===null&&(C=window.setTimeout(()=>{C=null,si()},Cd))}function si(){if(!T)return;let u=T.exportSvg();Ze&&u!==Y&&(Ze.innerHTML=u,Y=u);let p=qo(W(),r);bt&&p!==v&&(bt.textContent=p,v=p)}function la(u){if(!T)return;let p=T.getObjectDetails(u);if(!p)return;let h=yn(T.getScene(),T.getState()),g=36/Math.max(T.getState().scale,.001),j=p.renderObject;(j.x<h.minX+g||j.x>h.maxX-g||j.y<h.minY+g||j.y>h.maxY-g)&&T.fitToSystem()}function da(u){let p=u.target;if(!p)return!1;let h=p.tagName.toLowerCase();return p.isContentEditable||h==="input"||h==="textarea"||h==="select"}function gr(u,p){if(!u)return[];let h=Ke(u);return p.filter(g=>{let j=Ke(g.path);return j&&j===h?!0:u.kind==="object"&&g.diagnostic.objectId===u.id})}function ua(u,p){return gr(u,p).filter(h=>{let g=h.diagnostic.field??"";return ri.has(g)||h.diagnostic.message.toLowerCase().includes("placement")||h.diagnostic.message.toLowerCase().includes("orbit")||h.diagnostic.message.toLowerCase().includes("surface")||h.diagnostic.message.toLowerCase().includes("lagrange")||h.diagnostic.message.toLowerCase().includes("anchor")})}function pa(u,p){let h=gr(u,p);return h.length===0?"":`<div class="wo-editor-inspector-summary">
|
|
251
|
+
${h.slice(0,4).map(g=>`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(g.diagnostic.severity)}">
|
|
252
|
+
<strong>${L(g.diagnostic.severity.toUpperCase())}</strong>
|
|
253
|
+
<span>${L(g.diagnostic.field??ur(u))}</span>
|
|
254
|
+
<p>${L(g.diagnostic.message)}</p>
|
|
255
255
|
</article>`).join("")}
|
|
256
|
-
</div>`}function
|
|
256
|
+
</div>`}function rt(u,p){if(!D||!u)return;let h=gr(u,p),g=new Map;for(let j of h)for(let E of Iu(u,j.diagnostic.field)){let B=g.get(E)??[];B.push(j),g.set(E,B)}for(let[j,E]of g){let B=D.querySelector(`[name="${CSS.escape(j)}"]`),J=B?.closest(".wo-editor-field, .wo-editor-checkbox");if(!B||!J)continue;let se=E.some(Kt=>Kt.diagnostic.severity==="error"),Fn=E.some(Kt=>Kt.diagnostic.severity==="warning");J.classList.add(se?"has-error":"has-warning"),B.setAttribute("aria-invalid",se?"true":"false");let Ae=document.createElement("div");Ae.className=`wo-editor-field-note${se?" is-error":Fn?" is-warning":""}`,Ae.textContent=E[0]?.diagnostic.message??"",J.append(Ae)}}}function Nd(e){if(e.atlasDocument){let n=N(e.atlasDocument);return{atlasDocument:n,source:mt(n),diagnostics:ht(n)}}if(e.source){let n=gn(e.source);if(n.ok&&n.value){let r=n.value.atlasDocument??xt(n.value.document);return{atlasDocument:r,source:mt(r),diagnostics:ea(hn(r,n.diagnostics),ht(r))}}}let t=nr("WorldOrbit");return{atlasDocument:t,source:mt(t),diagnostics:ht(t)}}function mt(e){return Kn(e,{schema:e.version})}function Ud(){let e=qd();return`<section class="wo-editor-shell">
|
|
257
257
|
<div class="wo-editor-toolbar" data-editor-toolbar></div>
|
|
258
258
|
<div class="wo-editor-status" data-editor-status role="status" aria-live="polite"></div>
|
|
259
259
|
<div class="wo-editor-main">
|
|
260
260
|
<aside class="wo-editor-sidebar" data-editor-pane="sidebar">
|
|
261
|
-
<div class="wo-editor-panel">${
|
|
262
|
-
<div class="wo-editor-panel">${
|
|
261
|
+
<div class="wo-editor-panel">${jn("Atlas","atlas",'<div class="wo-editor-outline" data-editor-outline></div>')}</div>
|
|
262
|
+
<div class="wo-editor-panel">${jn("Diagnostics","diagnostics",'<div class="wo-editor-diagnostics" data-editor-diagnostics></div>')}</div>
|
|
263
263
|
</aside>
|
|
264
264
|
<div class="wo-editor-stage-panel">
|
|
265
265
|
<div class="wo-editor-stage-shell" data-editor-stage-shell>
|
|
@@ -267,7 +267,7 @@
|
|
|
267
267
|
<div class="wo-editor-overlay" data-editor-overlay></div>
|
|
268
268
|
</div>
|
|
269
269
|
<div class="wo-editor-panel" data-editor-pane="preview">
|
|
270
|
-
${
|
|
270
|
+
${jn("Preview","preview",`<div class="wo-editor-preview">
|
|
271
271
|
<div class="wo-editor-preview-card">
|
|
272
272
|
<h3>Static SVG</h3>
|
|
273
273
|
<div class="wo-editor-preview-visual" data-editor-preview-visual></div>
|
|
@@ -280,11 +280,11 @@
|
|
|
280
280
|
</div>
|
|
281
281
|
</div>
|
|
282
282
|
<aside class="wo-editor-panel wo-editor-inspector" data-editor-pane="inspector">
|
|
283
|
-
${
|
|
283
|
+
${jn("Inspector","inspector","<div data-editor-inspector></div>")}
|
|
284
284
|
</aside>
|
|
285
285
|
</div>
|
|
286
286
|
<div class="wo-editor-panel wo-editor-text-panel" data-editor-pane="text">
|
|
287
|
-
${
|
|
287
|
+
${jn("Source","source",`<textarea
|
|
288
288
|
class="wo-editor-source"
|
|
289
289
|
data-editor-source
|
|
290
290
|
spellcheck="false"
|
|
@@ -298,146 +298,156 @@
|
|
|
298
298
|
></div>`)}
|
|
299
299
|
</div>
|
|
300
300
|
<div class="wo-editor-live-region" data-editor-live aria-live="polite" aria-atomic="true"></div>
|
|
301
|
-
</section>`}function
|
|
301
|
+
</section>`}function jn(e,t,n,r=!0){return`<details class="wo-editor-panel-section" data-editor-panel-section="${L(t)}"${r?" open":""}>
|
|
302
302
|
<summary><span>${L(e)}</span></summary>
|
|
303
303
|
<div class="wo-editor-panel-section-body">${n}</div>
|
|
304
|
-
</details>`}function
|
|
304
|
+
</details>`}function pe(e,t,n,r,i=!1){let o=Hd(e,t);return`<details class="wo-editor-inspector-section" data-editor-form-section="${L(t)}" data-editor-form-id="${L(e)}" data-editor-section-state="${L(o)}"${i?" open":""}>
|
|
305
305
|
<summary><span>${L(n)}</span></summary>
|
|
306
306
|
<div class="wo-editor-inspector-section-body">${r}</div>
|
|
307
|
-
</details>`}function
|
|
308
|
-
<summary aria-label="Explain ${
|
|
307
|
+
</details>`}function fr(e,t){return`<span class="wo-editor-field-label">${L(e)}${Wd(t)}</span>`}function Wd(e){let t=Bd[e];return t?`<details class="wo-editor-field-help">
|
|
308
|
+
<summary aria-label="Explain ${ia(e)}">?</summary>
|
|
309
309
|
<div class="wo-editor-field-help-card">
|
|
310
310
|
<p>${L(t.description)}</p>
|
|
311
311
|
${(t.references?.length??0)>0?`<div class="wo-editor-field-help-chips">${(t.references??[]).map(n=>`<span>${L(n)}</span>`).join("")}</div>`:""}
|
|
312
312
|
</div>
|
|
313
|
-
</details>`:""}function
|
|
314
|
-
${
|
|
315
|
-
${e.positions.length>0?`<div class="wo-editor-outline-children">${[...e.positions].sort(
|
|
316
|
-
</div>`}function
|
|
313
|
+
</details>`:""}function Yd(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;r&&t.set(r,n.open)}}function ut(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;!r||!t.has(r)||(n.open=t.get(r)===!0)}}function Hd(e,t){return`${e}:${t}`}function qd(){return typeof window>"u"?!0:typeof window.matchMedia=="function"?!window.matchMedia("(max-width: 1280px)").matches:window.innerWidth>1280}function Xe(e,t,n,r){let i=Ke(e),o=i?r.get(i):null,s=o&&(o.errors>0||o.warnings>0)?`<span class="wo-editor-outline-badge${o.errors>0?" is-error":" is-warning"}">${o.errors>0?o.errors:o.warnings}</span>`:"";return`<button type="button" class="wo-editor-outline-item${i===n?" is-active":""}" data-path-kind="${L(e.kind)}"${e.id?` data-path-id="${L(e.id)}"`:""}${e.key?` data-path-key="${L(e.key)}"`:""}><span>${L(t)}</span>${s}</button>`}function Gd(e,t,n){return`<div class="wo-editor-outline-group">
|
|
314
|
+
${Xe({kind:"event",id:e.id},e.label||e.id,t,n)}
|
|
315
|
+
${e.positions.length>0?`<div class="wo-editor-outline-children">${[...e.positions].sort(mr).map(r=>Xe({kind:"event-pose",id:e.id,key:r.objectId},r.objectId,t,n)).join("")}</div>`:""}
|
|
316
|
+
</div>`}function Xd(e){return`<form class="wo-editor-form" data-editor-form="system">
|
|
317
317
|
<h2>System</h2>
|
|
318
|
-
${
|
|
319
|
-
${
|
|
320
|
-
</form>`}function
|
|
318
|
+
${pe("system","basics","Basics",`${x("System ID","system-id",e.system?.id??"")}
|
|
319
|
+
${x("Title","system-title",e.system?.title??"")}`,!0)}
|
|
320
|
+
</form>`}function Kd(e){let t=e.system?.defaults;return`<form class="wo-editor-form" data-editor-form="defaults">
|
|
321
321
|
<h2>Defaults</h2>
|
|
322
|
-
${
|
|
323
|
-
${
|
|
324
|
-
${
|
|
325
|
-
${
|
|
326
|
-
${
|
|
327
|
-
</form>`}function
|
|
322
|
+
${pe("defaults","basics","Basics",`${St("Projection","defaults-view",[["topdown","Topdown"],["isometric","Isometric"],["orthographic","Orthographic"],["perspective","Perspective"]],t?.view??"topdown")}
|
|
323
|
+
${x("Scale preset","defaults-scale",t?.scale??"")}
|
|
324
|
+
${x("Units","defaults-units",t?.units??"")}
|
|
325
|
+
${St("Render preset","defaults-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],t?.preset??"")}
|
|
326
|
+
${x("Theme","defaults-theme",t?.theme??"")}`,!0)}
|
|
327
|
+
</form>`}function Zd(e,t){let n=e.system?.atlasMetadata[t]??"";return`<form class="wo-editor-form" data-editor-form="metadata">
|
|
328
328
|
<h2>Metadata</h2>
|
|
329
|
-
${
|
|
330
|
-
${
|
|
331
|
-
</form>`}function
|
|
329
|
+
${pe("metadata","entry","Entry",`${x("Key","metadata-key",t)}
|
|
330
|
+
${Mn("Value","metadata-value",n)}`,!0)}
|
|
331
|
+
</form>`}function Jd(e,t){let n=e.viewpoints.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="viewpoint">
|
|
332
332
|
<h2>Viewpoint</h2>
|
|
333
|
-
${
|
|
334
|
-
${
|
|
335
|
-
${
|
|
336
|
-
${
|
|
337
|
-
${
|
|
338
|
-
${
|
|
339
|
-
${
|
|
340
|
-
${
|
|
341
|
-
${
|
|
342
|
-
${
|
|
333
|
+
${pe("viewpoint","basics","Basics",`${x("ID","viewpoint-id",n.id)}
|
|
334
|
+
${x("Label","viewpoint-label",n.label)}
|
|
335
|
+
${Mn("Summary","viewpoint-summary",n.summary)}
|
|
336
|
+
${x("Focus object","viewpoint-focus",n.focusObjectId??"")}
|
|
337
|
+
${x("Selected object","viewpoint-select",n.selectedObjectId??"")}
|
|
338
|
+
${St("Projection","viewpoint-projection",[["topdown","Topdown"],["isometric","Isometric"],["orthographic","Orthographic"],["perspective","Perspective"]],n.projection)}
|
|
339
|
+
${St("Preset","viewpoint-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],n.preset??"")}
|
|
340
|
+
${x("Zoom","viewpoint-zoom",n.zoom===null?"":String(n.zoom))}
|
|
341
|
+
${x("Rotation","viewpoint-rotation",String(n.rotationDeg))}`,!0)}
|
|
342
|
+
${pe("viewpoint","camera","Camera",`${x("Azimuth","viewpoint-camera-azimuth",n.camera?.azimuth===null||n.camera?.azimuth===void 0?"":String(n.camera.azimuth))}
|
|
343
|
+
${x("Elevation","viewpoint-camera-elevation",n.camera?.elevation===null||n.camera?.elevation===void 0?"":String(n.camera.elevation))}
|
|
344
|
+
${x("Roll","viewpoint-camera-roll",n.camera?.roll===null||n.camera?.roll===void 0?"":String(n.camera.roll))}
|
|
345
|
+
${x("Distance","viewpoint-camera-distance",n.camera?.distance===null||n.camera?.distance===void 0?"":String(n.camera.distance))}
|
|
346
|
+
<p class="wo-editor-inline-note">Rotation stays a 2D screen-rotation hint. The camera block stores Schema 2.5 view direction and framing.</p>`)}
|
|
347
|
+
${pe("viewpoint","layers","Layers",`<fieldset class="wo-editor-fieldset">
|
|
343
348
|
<legend>Layers</legend>
|
|
344
|
-
${
|
|
345
|
-
${
|
|
346
|
-
${
|
|
347
|
-
${
|
|
348
|
-
${
|
|
349
|
-
${
|
|
350
|
-
${
|
|
351
|
-
${
|
|
349
|
+
${Ne("Background","layer-background",n.layers.background!==!1)}
|
|
350
|
+
${Ne("Guides","layer-guides",n.layers.guides!==!1)}
|
|
351
|
+
${Ne("Orbits back","layer-orbits-back",n.layers["orbits-back"]!==!1)}
|
|
352
|
+
${Ne("Orbits front","layer-orbits-front",n.layers["orbits-front"]!==!1)}
|
|
353
|
+
${Ne("Events","layer-events",n.layers.events!==!1)}
|
|
354
|
+
${Ne("Objects","layer-objects",n.layers.objects!==!1)}
|
|
355
|
+
${Ne("Labels","layer-labels",n.layers.labels!==!1)}
|
|
356
|
+
${Ne("Metadata","layer-metadata",n.layers.metadata!==!1)}
|
|
352
357
|
</fieldset>`)}
|
|
353
|
-
${
|
|
354
|
-
${
|
|
355
|
-
${
|
|
356
|
-
${
|
|
357
|
-
${
|
|
358
|
-
</form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function
|
|
358
|
+
${pe("viewpoint","filter","Filter",`${x("Filter query","filter-query",n.filter?.query??"")}
|
|
359
|
+
${x("Filter object types","filter-object-types",n.filter?.objectTypes.join(" ")??"")}
|
|
360
|
+
${x("Filter tags","filter-tags",n.filter?.tags.join(" ")??"")}
|
|
361
|
+
${x("Filter groups","filter-groups",n.filter?.groupIds.join(" ")??"")}
|
|
362
|
+
${x("Events","viewpoint-events",n.events.join(" "))}`)}
|
|
363
|
+
</form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function Qd(e,t){let n=e.events.find(i=>i.id===t);if(!n)return'<p class="wo-editor-empty">Event not found.</p>';let r=e.viewpoints.filter(i=>i.events.includes(n.id)).map(i=>i.id).join(" ");return`<form class="wo-editor-form" data-editor-form="event">
|
|
359
364
|
<h2>Event</h2>
|
|
360
|
-
${
|
|
361
|
-
${
|
|
362
|
-
${
|
|
363
|
-
${
|
|
364
|
-
${
|
|
365
|
-
${
|
|
366
|
-
${
|
|
367
|
-
${
|
|
368
|
-
${
|
|
369
|
-
${
|
|
370
|
-
${
|
|
371
|
-
|
|
372
|
-
|
|
365
|
+
${pe("event","basics","Basics",`${x("ID","event-id",n.id)}
|
|
366
|
+
${x("Kind","event-kind",n.kind)}
|
|
367
|
+
${x("Label","event-label",n.label)}
|
|
368
|
+
${Mn("Summary","event-summary",n.summary??"")}
|
|
369
|
+
${x("Target object","event-target",n.targetObjectId??"")}
|
|
370
|
+
${x("Participants","event-participants",n.participantObjectIds.join(" "))}
|
|
371
|
+
${x("Timing","event-timing",n.timing??"")}
|
|
372
|
+
${x("Visibility","event-visibility",n.visibility??"")}
|
|
373
|
+
${x("Epoch","event-epoch",n.epoch??"")}
|
|
374
|
+
${x("Reference plane","event-referencePlane",n.referencePlane??"")}
|
|
375
|
+
${x("Tags","event-tags",n.tags.join(" "))}
|
|
376
|
+
${x("Color","event-color",n.color??"")}
|
|
377
|
+
${Ne("Hidden","event-hidden",n.hidden===!0)}`,!0)}
|
|
378
|
+
${pe("event","viewpoints","Viewpoints",`${x("Viewpoints","event-viewpoints",r)}`)}
|
|
379
|
+
${pe("event","positions","Positions",`${n.positions.length>0?`<div class="wo-editor-inline-list">${n.positions.map(i=>Xe({kind:"event-pose",id:n.id,key:i.objectId},i.objectId,null,new Map)).join("")}</div>`:'<p class="wo-editor-empty">No event poses yet.</p>'}
|
|
373
380
|
<div class="wo-editor-inline-actions">
|
|
374
381
|
<button type="button" data-editor-action="add-event-pose" data-editor-event-id="${L(n.id)}">Add pose</button>
|
|
375
382
|
</div>`)}
|
|
376
|
-
</form>`}function
|
|
383
|
+
</form>`}function eu(e,t,n){let r=e.events.find(a=>a.id===t),i=r?.positions.find(a=>a.objectId===n);if(!r||!i)return'<p class="wo-editor-empty">Event pose not found.</p>';let o=i.placement?.mode??"",s=i.placement?.mode==="orbit"||i.placement?.mode==="surface"||i.placement?.mode==="at"?i.placement.target:"",c=i.placement?.mode==="free"?i.placement.distance?me(i.placement.distance):i.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="event-pose">
|
|
377
384
|
<h2>Event Pose</h2>
|
|
378
385
|
<p class="wo-editor-inline-note">Event <strong>${L(r.label||r.id)}</strong></p>
|
|
379
|
-
${
|
|
386
|
+
${pe("event-pose","identity","Identity",`${x("Object","pose-object-id",i.objectId)}
|
|
380
387
|
<div class="wo-editor-inline-actions">
|
|
381
388
|
<button type="button" data-path-kind="event" data-path-id="${L(r.id)}">Select event</button>
|
|
382
389
|
</div>`,!0)}
|
|
383
|
-
${
|
|
384
|
-
${
|
|
385
|
-
${
|
|
386
|
-
${
|
|
387
|
-
${
|
|
388
|
-
${
|
|
389
|
-
${
|
|
390
|
-
${
|
|
391
|
-
${
|
|
392
|
-
${
|
|
393
|
-
${
|
|
394
|
-
${
|
|
395
|
-
|
|
390
|
+
${pe("event-pose","placement","Placement",`${St("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],o)}
|
|
391
|
+
${x("Placement target","placement-target",s)}
|
|
392
|
+
${x("Free value","placement-free",c)}
|
|
393
|
+
${x("Distance","placement-distance",i.placement?.mode==="orbit"&&i.placement.distance?me(i.placement.distance):"")}
|
|
394
|
+
${x("Semi-major","placement-semiMajor",i.placement?.mode==="orbit"&&i.placement.semiMajor?me(i.placement.semiMajor):"")}
|
|
395
|
+
${x("Eccentricity","placement-eccentricity",i.placement?.mode==="orbit"&&i.placement.eccentricity!==void 0?String(i.placement.eccentricity):"")}
|
|
396
|
+
${x("Period","placement-period",i.placement?.mode==="orbit"&&i.placement.period?me(i.placement.period):"")}
|
|
397
|
+
${x("Angle","placement-angle",i.placement?.mode==="orbit"&&i.placement.angle?me(i.placement.angle):"")}
|
|
398
|
+
${x("Inclination","placement-inclination",i.placement?.mode==="orbit"&&i.placement.inclination?me(i.placement.inclination):"")}
|
|
399
|
+
${x("Phase","placement-phase",i.placement?.mode==="orbit"&&i.placement.phase?me(i.placement.phase):"")}
|
|
400
|
+
${x("Inner","prop-inner",i.inner?me(i.inner):"")}
|
|
401
|
+
${x("Outer","prop-outer",i.outer?me(i.outer):"")}`,!0)}
|
|
402
|
+
${pe("event-pose","context","Context",`${x("Epoch","pose-epoch",i.epoch??"")}
|
|
403
|
+
${x("Reference plane","pose-referencePlane",i.referencePlane??"")}
|
|
404
|
+
<p class="wo-editor-inline-note">Falls back to event, then object, then system context when left empty.</p>`)}
|
|
405
|
+
</form>`}function tu(e,t){let n=e.system?.annotations.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="annotation">
|
|
396
406
|
<h2>Annotation</h2>
|
|
397
|
-
${
|
|
398
|
-
${
|
|
399
|
-
${
|
|
400
|
-
${
|
|
401
|
-
${
|
|
402
|
-
${
|
|
403
|
-
</form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function
|
|
407
|
+
${pe("annotation","entry","Entry",`${x("ID","annotation-id",n.id)}
|
|
408
|
+
${x("Label","annotation-label",n.label)}
|
|
409
|
+
${x("Target object","annotation-target",n.targetObjectId??"")}
|
|
410
|
+
${x("Source object","annotation-source",n.sourceObjectId??"")}
|
|
411
|
+
${Mn("Body","annotation-body",n.body)}
|
|
412
|
+
${x("Tags","annotation-tags",n.tags.join(" "))}`,!0)}
|
|
413
|
+
</form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function nu(e,t){let n=e.objects.find(s=>s.id===t);if(!n)return'<p class="wo-editor-empty">Object not found.</p>';let r=n.placement?.mode??"",i=n.placement?.mode==="orbit"||n.placement?.mode==="surface"||n.placement?.mode==="at"?n.placement.target:"",o=n.placement?.mode==="free"?n.placement.distance?me(n.placement.distance):n.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="object">
|
|
404
414
|
<h2>Object</h2>
|
|
405
|
-
${
|
|
406
|
-
${
|
|
407
|
-
${
|
|
408
|
-
${
|
|
409
|
-
${
|
|
410
|
-
${
|
|
411
|
-
${
|
|
412
|
-
${
|
|
413
|
-
${
|
|
414
|
-
${
|
|
415
|
-
${
|
|
416
|
-
${
|
|
417
|
-
${
|
|
415
|
+
${pe("object","identity","Identity",`${x("ID","object-id",n.id)}
|
|
416
|
+
${St("Type","object-type",oi.map(s=>[s,On(s)]),n.type)}`,!0)}
|
|
417
|
+
${pe("object","placement","Placement",`${St("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],r)}
|
|
418
|
+
${x("Placement target","placement-target",i)}
|
|
419
|
+
${x("Free value","placement-free",o)}
|
|
420
|
+
${x("Distance","placement-distance",n.placement?.mode==="orbit"&&n.placement.distance?me(n.placement.distance):"")}
|
|
421
|
+
${x("Semi-major","placement-semiMajor",n.placement?.mode==="orbit"&&n.placement.semiMajor?me(n.placement.semiMajor):"")}
|
|
422
|
+
${x("Eccentricity","placement-eccentricity",n.placement?.mode==="orbit"&&n.placement.eccentricity!==void 0?String(n.placement.eccentricity):"")}
|
|
423
|
+
${x("Period","placement-period",n.placement?.mode==="orbit"&&n.placement.period?me(n.placement.period):"")}
|
|
424
|
+
${x("Angle","placement-angle",n.placement?.mode==="orbit"&&n.placement.angle?me(n.placement.angle):"")}
|
|
425
|
+
${x("Inclination","placement-inclination",n.placement?.mode==="orbit"&&n.placement.inclination?me(n.placement.inclination):"")}
|
|
426
|
+
${x("Phase","placement-phase",n.placement?.mode==="orbit"&&n.placement.phase?me(n.placement.phase):"")}`,!0)}
|
|
427
|
+
${pe("object","properties","Properties",`<fieldset class="wo-editor-fieldset">
|
|
418
428
|
<legend>Properties</legend>
|
|
419
|
-
${
|
|
420
|
-
${
|
|
421
|
-
${
|
|
422
|
-
${
|
|
423
|
-
${
|
|
424
|
-
${
|
|
425
|
-
${
|
|
426
|
-
${
|
|
427
|
-
${
|
|
428
|
-
${
|
|
429
|
-
${
|
|
430
|
-
${
|
|
431
|
-
${
|
|
432
|
-
${
|
|
433
|
-
${
|
|
434
|
-
${
|
|
435
|
-
${
|
|
436
|
-
${
|
|
437
|
-
${
|
|
429
|
+
${x("Kind","prop-kind",pt(n.properties.kind))}
|
|
430
|
+
${x("Class","prop-class",pt(n.properties.class))}
|
|
431
|
+
${x("Culture","prop-culture",pt(n.properties.culture))}
|
|
432
|
+
${x("Tags","prop-tags",Mu(n.properties.tags))}
|
|
433
|
+
${x("Color","prop-color",pt(n.properties.color))}
|
|
434
|
+
${x("Image","prop-image",pt(n.properties.image))}
|
|
435
|
+
${Ne("Hidden","prop-hidden",n.properties.hidden===!0)}
|
|
436
|
+
${x("Radius","prop-radius",ft(n.properties.radius))}
|
|
437
|
+
${x("Mass","prop-mass",ft(n.properties.mass))}
|
|
438
|
+
${x("Density","prop-density",ft(n.properties.density))}
|
|
439
|
+
${x("Gravity","prop-gravity",ft(n.properties.gravity))}
|
|
440
|
+
${x("Temperature","prop-temperature",ft(n.properties.temperature))}
|
|
441
|
+
${x("Albedo","prop-albedo",Du(n.properties.albedo))}
|
|
442
|
+
${x("Atmosphere","prop-atmosphere",pt(n.properties.atmosphere))}
|
|
443
|
+
${x("Inner","prop-inner",ft(n.properties.inner))}
|
|
444
|
+
${x("Outer","prop-outer",ft(n.properties.outer))}
|
|
445
|
+
${x("On","prop-on",pt(n.properties.on))}
|
|
446
|
+
${x("Source","prop-source",pt(n.properties.source))}
|
|
447
|
+
${x("Cycle","prop-cycle",ft(n.properties.cycle))}
|
|
438
448
|
</fieldset>`)}
|
|
439
|
-
${
|
|
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=`
|
|
449
|
+
${pe("object","info","Info",`${Mn("Description","info-description",n.info.description??"")}`)}
|
|
450
|
+
</form>`}function x(e,t,n){return`<label class="wo-editor-field">${fr(e,t)}<input name="${L(t)}" value="${ia(n)}" /></label>`}function Mn(e,t,n){return`<label class="wo-editor-field">${fr(e,t)}<textarea name="${L(t)}">${L(n)}</textarea></label>`}function St(e,t,n,r){return`<label class="wo-editor-field">${fr(e,t)}<select name="${L(t)}">${n.map(([i,o])=>`<option value="${L(i)}"${i===r?" selected":""}>${L(o)}</option>`).join("")}</select></label>`}function Ne(e,t,n){return`<label class="wo-editor-checkbox"><input type="checkbox" name="${L(t)}"${n?" checked":""} />${fr(e,t)}</label>`}function kn(e,t,n,r){let i=document.createElement("button");return i.type="button",i.className="wo-editor-handle",i.dataset.handleKind=e,i.dataset.objectId=t,i.style.left=`${n.x}px`,i.style.top=`${n.y}px`,i.textContent=r,i}function ge(e,t){return e.elements.namedItem(t)?.value.trim()??""}function M(e,t){let n=ge(e,t);return n||null}function Be(e,t){return e.elements.namedItem(t)?.checked??!1}function ru(e,t){return Qo(e,t.placement,t.id)}function iu(e,t){return Qo(e,t.placement,t.objectId)}function Qo(e,t,n){let r=ge(e,"placement-mode"),i=M(e,"placement-target");switch(r){case"orbit":return{mode:r,target:i??(t?.mode==="orbit"?t.target:n),distance:Ue(M(e,"placement-distance")),semiMajor:Ue(M(e,"placement-semiMajor")),eccentricity:gt(M(e,"placement-eccentricity"))??void 0,period:Ue(M(e,"placement-period")),angle:Ue(M(e,"placement-angle")),inclination:Ue(M(e,"placement-inclination")),phase:Ue(M(e,"placement-phase"))};case"at":return{mode:r,target:i??n,reference:En(i??n)};case"surface":return{mode:r,target:i??n};case"free":{let o=M(e,"placement-free"),s=Ue(o);return{mode:r,distance:s??void 0,descriptor:s?void 0:o??void 0}}default:return null}}function dr(e,t,n){let r=Array.isArray(n)&&n.length===0;if(n==null||r||n===""){delete e[t];return}e[t]=n}function ou(e){return e?Ue(e)??e:null}function Ue(e){if(!e)return;let t=e.match(/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/);if(t)return{value:Number(t[1]),unit:t[2]??null}}function gt(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function au(e){let t={azimuth:gt(M(e,"viewpoint-camera-azimuth")),elevation:gt(M(e,"viewpoint-camera-elevation")),roll:gt(M(e,"viewpoint-camera-roll")),distance:gt(M(e,"viewpoint-camera-distance"))};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function su(e){return Ge(e).filter(n=>oi.includes(n))}function Ge(e){return e?.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)??[]}function cu(e,t,n){let r=n.objects.find(i=>i.type==="star")?.id??n.objects[0]?.id??t;return{type:e,id:t,properties:{},placement:e==="structure"||e==="phenomenon"?{mode:"at",target:`${r}:L4`,reference:En(`${r}:L4`)}:{mode:"orbit",target:r,distance:{value:1,unit:"au"}},info:{}}}function lu(e,t){let n=N(e);return n.objects=n.objects.filter(r=>r.id!==t.id).concat(t).sort(ta),n}function du(e,t,n){let r=N(e);return r.objects=r.objects.filter(i=>i.id!==t).concat(n).sort(ta),t!==n.id&&uu(r,t,n.id),r}function uu(e,t,n){for(let r of e.objects)if(r.id!==n&&(r.placement?.mode==="orbit"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="surface"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="at")){let i=r.placement.reference;i.kind==="anchor"&&i.objectId===t&&(i.objectId=n),i.kind==="lagrange"&&(i.primary===t&&(i.primary=n),i.secondary===t&&(i.secondary=n)),r.placement.target=ii(i)}for(let r of e.system?.viewpoints??[])r.focusObjectId===t&&(r.focusObjectId=n),r.selectedObjectId===t&&(r.selectedObjectId=n);for(let r of e.system?.annotations??[])r.targetObjectId===t&&(r.targetObjectId=n),r.sourceObjectId===t&&(r.sourceObjectId=n);for(let r of e.events){r.targetObjectId===t&&(r.targetObjectId=n),r.participantObjectIds=r.participantObjectIds.map(i=>i===t?n:i);for(let i of r.positions)if(i.objectId===t&&(i.objectId=n),i.placement?.mode==="orbit"&&i.placement.target===t&&(i.placement.target=n),i.placement?.mode==="surface"&&i.placement.target===t&&(i.placement.target=n),i.placement?.mode==="at"){let o=i.placement.reference;o.kind==="anchor"&&o.objectId===t&&(o.objectId=n),o.kind==="lagrange"&&(o.primary===t&&(o.primary=n),o.secondary===t&&(o.secondary=n)),i.placement.target=ii(o)}r.positions.sort(mr)}}function pu(e,t){let n=Rr(e,t);if(t.kind==="event"&&t.id){for(let r of n.system?.viewpoints??[])r.events=r.events.filter(i=>i!==t.id);return n}if(t.kind!=="object"||!t.id)return n;for(let r of n.objects)if(r.placement?.mode==="orbit"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="surface"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="at"){let i=r.placement.reference;(i.kind==="anchor"&&i.objectId===t.id||i.kind==="lagrange"&&(i.primary===t.id||i.secondary===t.id))&&(r.placement=null)}for(let r of n.system?.viewpoints??[])r.focusObjectId===t.id&&(r.focusObjectId=null),r.selectedObjectId===t.id&&(r.selectedObjectId=null);for(let r of n.system?.annotations??[])r.targetObjectId===t.id&&(r.targetObjectId=null),r.sourceObjectId===t.id&&(r.sourceObjectId=null);for(let r of n.events){r.targetObjectId===t.id&&(r.targetObjectId=null),r.participantObjectIds=r.participantObjectIds.filter(i=>i!==t.id),r.positions=r.positions.filter(i=>i.objectId!==t.id);for(let i of r.positions)if(i.placement?.mode==="orbit"&&i.placement.target===t.id&&(i.placement=null),i.placement?.mode==="surface"&&i.placement.target===t.id&&(i.placement=null),i.placement?.mode==="at"){let o=i.placement.reference;(o.kind==="anchor"&&o.objectId===t.id||o.kind==="lagrange"&&(o.primary===t.id||o.secondary===t.id))&&(i.placement=null)}}return n}function Dn(e,t,n){if(t.kind==="event-pose"&&t.id&&t.key){let i=na(e,t.id,t.key);return i?.placement?{placement:i.placement}:null}let r=ku(e,n);return r?.placement?{placement:r.placement}:null}function fu(e,t,n,r,i){let o=r.orbit;if(!o||r.object.placement?.mode!=="orbit")return e;let s=ve(i,{x:o.cx,y:o.cy},-o.rotationDeg),c=o.kind==="circle"?o.radius??1:o.rx??1,a=o.kind==="circle"?o.radius??1:o.ry??1,l=Math.atan2((s.y-o.cy)/Math.max(a,1),(s.x-o.cx)/Math.max(c,1)),d=Au(l*180/Math.PI),f=N(e),w=Dn(f,t,n);return!w||w.placement.mode!=="orbit"?e:(w.placement.phase={value:Bt(d,2),unit:"deg"},f)}function mu(e,t,n,r,i,o){let s=r.orbit;if(!s||r.object.placement?.mode!=="orbit"||!o)return e;let c=ve(i,{x:s.cx,y:s.cy},-s.rotationDeg),a=Math.max(Math.abs(c.x-s.cx),24),l=Math.max(a-o.radiusOffsetPx,o.innerPx),d=Fu(l,o.innerPx,o.stepPx),f=N(e),w=Dn(f,t,n);if(!w||w.placement.mode!=="orbit")return e;let I=w.placement.semiMajor??w.placement.distance??{value:1,unit:"au"},S=ra(Math.max(d,0),o.preferredUnit??I.unit);return w.placement.semiMajor?w.placement.semiMajor=S:w.placement.distance=S,f}function hu(e,t,n,r,i){let o=vu(r,n,i);if(!o)return e;let s=N(e),c=Dn(s,t,n);return!c||c.placement.mode!=="at"?e:(c.placement.reference=o.reference,c.placement.target=ii(o.reference),s)}function gu(e,t,n,r,i){let o=wu(r,n,i,a=>Vd.has(a.object.type));if(!o)return e;let s=N(e),c=Dn(s,t,n);return!c||c.placement.mode!=="surface"?e:(c.placement.target=o.objectId,s)}function bu(e,t,n){if(n.object.placement?.mode!=="orbit"||!n.orbit||!n.parent)return null;let r=n.object.placement.target,i=t.objects.filter(w=>w.object.placement?.mode==="orbit"&&w.object.placement.target===r&&!w.hidden).length,o=Vu(t.layoutPreset),s=(i>2?54:64)*o*t.scaleModel.orbitDistanceMultiplier,c=n.parent.radius+56*o*t.scaleModel.orbitDistanceMultiplier,a=n.object.placement.semiMajor??n.object.placement.distance??null,l=Tu(a),d=n.orbit.kind==="circle"?n.orbit.radius??1:n.orbit.rx??1,f=Cu(l??0,c,s);return{innerPx:c,stepPx:s,radiusOffsetPx:d-f,preferredUnit:a?.unit??null}}function yu(e,t,n,r,i,o){if(i.object.placement?.mode!=="free")return e;let s=r.width-r.padding-140,c=Math.max(0,s-o.x),a=N(e),l=Dn(a,t,n);if(!l||l.placement.mode!=="free")return e;let d=Lu(l.placement.distance?.unit??null),f=c/Math.max(Fd*r.scaleModel.freePlacementMultiplier,1);return f<.01?(l.placement.distance=void 0,l.placement.descriptor||delete l.placement.descriptor,a):(l.placement.distance=ra(f,d),delete l.placement.descriptor,a)}function wu(e,t,n,r=()=>!0){let i=null,o=Number.POSITIVE_INFINITY;for(let s of e.objects){if(s.hidden||s.objectId===t||!r(s))continue;let c=Math.hypot(n.x-s.x,n.y-s.y);c<o&&(i=s,o=c)}return o<=140?i:null}function vu(e,t,n){let r=null;for(let c of e.objects){if(c.hidden||c.objectId===t)continue;let a=Math.hypot(n.x-c.x,n.y-c.y),l=Math.max(c.visualRadius+16,28);a<=l&&(!r||a<r.distance)&&(r={reference:En(c.objectId),x:c.x,y:c.y,distance:a})}if(r)return{reference:r.reference,x:r.x,y:r.y};let i=[];for(let c of e.objects)c.hidden||c.objectId===t||i.push({reference:En(c.objectId),x:c.x,y:c.y});for(let c of e.orbitVisuals){if(c.hidden||c.objectId===t)continue;let a=e.objects.find(d=>d.objectId===c.parentId&&!d.hidden),l=e.objects.find(d=>d.objectId===c.objectId&&!d.hidden);if(!(!a||!l))for(let d of["L1","L2","L3","L4","L5"]){let f=$u(a,l,d);i.push({reference:En(`${c.objectId}:${d}`),x:f.x,y:f.y})}}let o=null,s=Number.POSITIVE_INFINITY;for(let c of i){let a=Math.hypot(n.x-c.x,n.y-c.y);a<s&&(o=c,s=a)}return s<=140?o:null}function $u(e,t,n){let r=t.x-e.x,i=t.y-e.y,o=Math.hypot(r,i)||1,s=r/o,c=i/o,a=-c,l=s,d=Pu(o*.25,24,68);switch(n){case"L1":return{x:t.x-s*d,y:t.y-c*d};case"L2":return{x:t.x+s*d,y:t.y+c*d};case"L3":return{x:e.x-s*d,y:e.y-c*d};case"L4":return{x:t.x+(s*.5-a*.8660254)*d,y:t.y+(c*.5-l*.8660254)*d};case"L5":return{x:t.x+(s*.5+a*.8660254)*d,y:t.y+(c*.5+l*.8660254)*d}}}function En(e){let t=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(t)return{kind:"lagrange",primary:t[1],secondary:t[2],point:t[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};let r=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return r?{kind:"anchor",objectId:r[1],anchor:r[2]}:{kind:"named",name:e}}function ii(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function ht(e){return zr(e)}function ea(e,t){let n=new Set,r=[];for(let i of[...e,...t]){let o=`${i.diagnostic.code}:${i.diagnostic.message}:${Ke(i.path)}`;n.has(o)||(n.add(o),r.push(pr(i)))}return r}function xu(e){let t=new Map;for(let n of e){let r=Ke(n.path)??(n.diagnostic.objectId?Ke({kind:"object",id:n.diagnostic.objectId}):null);if(!r)continue;let i=t.get(r)??{errors:0,warnings:0};n.diagnostic.severity==="error"?i.errors+=1:n.diagnostic.severity==="warning"&&(i.warnings+=1),t.set(r,i)}return t}function Ho(e){return e.diagnostic.line!==void 0&&e.diagnostic.column!==void 0?`Line ${e.diagnostic.line}:${e.diagnostic.column}`:e.diagnostic.line!==void 0?`Line ${e.diagnostic.line}`:null}function Iu(e,t){if(!t)return[];switch(e.kind){case"system":return t==="id"?["system-id"]:t==="title"?["system-title"]:[];case"defaults":switch(t){case"view":return["defaults-view"];case"scale":return["defaults-scale"];case"units":return["defaults-units"];case"preset":return["defaults-preset"];case"theme":return["defaults-theme"];default:return[]}case"metadata":return t==="key"?["metadata-key"]:["metadata-value"];case"group":switch(t){case"id":return["group-id"];case"label":return["group-label"];case"summary":return["group-summary"];case"color":return["group-color"];case"tags":return["group-tags"];case"hidden":return["group-hidden"];default:return[]}case"viewpoint":switch(t){case"id":return["viewpoint-id"];case"label":return["viewpoint-label"];case"summary":return["viewpoint-summary"];case"focusObjectId":return["viewpoint-focus"];case"selectedObjectId":return["viewpoint-select"];case"projection":return["viewpoint-projection"];case"preset":return["viewpoint-preset"];case"zoom":return["viewpoint-zoom"];case"rotationDeg":return["viewpoint-rotation"];case"camera":return["viewpoint-camera-azimuth","viewpoint-camera-elevation","viewpoint-camera-roll","viewpoint-camera-distance"];case"camera.azimuth":return["viewpoint-camera-azimuth"];case"camera.elevation":return["viewpoint-camera-elevation"];case"camera.roll":return["viewpoint-camera-roll"];case"camera.distance":return["viewpoint-camera-distance"];case"events":return["viewpoint-events"];default:return[]}case"event":switch(t){case"id":return["event-id"];case"kind":return["event-kind"];case"label":return["event-label"];case"summary":return["event-summary"];case"targetObjectId":case"target":return["event-target"];case"participantObjectIds":case"participants":return["event-participants"];case"timing":return["event-timing"];case"visibility":return["event-visibility"];case"epoch":return["event-epoch"];case"referencePlane":return["event-referencePlane"];case"tags":return["event-tags"];case"color":return["event-color"];case"hidden":return["event-hidden"];default:return[]}case"event-pose":return t==="objectId"?["pose-object-id"]:t==="placement"?["placement-mode"]:t==="reference"||t==="target"?["placement-target"]:t==="descriptor"?["placement-free"]:ri.has(t)?[`placement-${t}`]:t==="inner"||t==="outer"?[`prop-${t}`]:t==="epoch"?["pose-epoch"]:t==="referencePlane"?["pose-referencePlane"]:[];case"annotation":switch(t){case"id":return["annotation-id"];case"label":return["annotation-label"];case"targetObjectId":return["annotation-target"];case"sourceObjectId":return["annotation-source"];case"body":return["annotation-body"];case"tags":return["annotation-tags"];default:return[]}case"relation":switch(t){case"id":return["relation-id"];case"from":return["relation-from"];case"to":return["relation-to"];case"kind":return["relation-kind"];case"label":return["relation-label"];case"summary":return["relation-summary"];case"tags":return["relation-tags"];case"color":return["relation-color"];case"hidden":return["relation-hidden"];default:return[]}case"object":return t==="id"?["object-id"]:t==="type"?["object-type"]:t==="placement"?["placement-mode"]:t==="description"?["info-description"]:t==="reference"?["placement-target"]:t==="descriptor"?["placement-free"]:t==="target"?["placement-target"]:ri.has(t)?[`placement-${t}`]:[`prop-${t}`]}}function qo(e,t){return In(e,{mode:"interactive",preset:t.system?.defaults.preset??"atlas-card",projection:t.system?.defaults.view??"topdown"})}function ur(e){switch(e.kind){case"system":return"System";case"defaults":return"Defaults";case"metadata":return`Metadata: ${e.key??""}`;case"group":return`Group: ${e.id??""}`;case"event":return`Event: ${e.id??""}`;case"event-pose":return`Event Pose: ${e.id??""} / ${e.key??""}`;case"object":return`Object: ${e.id??""}`;case"viewpoint":return`Viewpoint: ${e.id??""}`;case"annotation":return`Annotation: ${e.id??""}`;case"relation":return`Relation: ${e.id??""}`}}function Ke(e){return e?`${e.kind}:${e.id??""}:${e.key??""}`:null}function ni(e){return e&&(e.kind==="event"||e.kind==="event-pose")?e.id??null:null}function ta(e,t){return e.id.localeCompare(t.id)}function Go(e,t){return e.id.localeCompare(t.id)}function mr(e,t){return e.objectId.localeCompare(t.objectId)}function ju(e,t){return e.events.find(n=>n.id===t)??null}function na(e,t,n){return ju(e,t)?.positions.find(r=>r.objectId===n)??null}function ku(e,t){return e.objects.find(n=>n.id===t)??null}function Su(e,t){let n=N(e),r=n.events.find(o=>o.id===t);if(!r)return e;let i=n.objects.find(o=>!r.positions.some(s=>s.objectId===o.id))??n.objects[0];return i?(r.targetObjectId!==i.id&&!r.participantObjectIds.includes(i.id)&&(r.participantObjectIds.push(i.id),r.participantObjectIds.sort((o,s)=>o.localeCompare(s))),r.positions.push(Ou(i)),r.positions.sort(mr),n):e}function Ou(e){return{objectId:e.id,placement:e.placement?structuredClone(e.placement):null,inner:Xo(e.properties.inner),outer:Xo(e.properties.outer)}}function Eu(e,t,n,r){let i=new Set(r);for(let o of e.system?.viewpoints??[]){let s=new Set(o.events);s.delete(t),s.delete(n),i.has(o.id)&&s.add(n),o.events=[...s].sort((c,a)=>c.localeCompare(a))}}function Sn(e,t){let n=e.trim()||"item",r=1,i=n;for(;t.includes(i);)r+=1,i=`${n}-${r}`;return i}function On(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function pr(e){return{diagnostic:{...e.diagnostic},path:e.path?{...e.path}:null}}function pt(e){return typeof e=="string"?e:""}function Mu(e){return Array.isArray(e)?e.join(" "):""}function ft(e){return e&&typeof e=="object"&&"value"in e?me(e):""}function Xo(e){return e&&typeof e=="object"&&"value"in e?e:void 0}function Du(e){return typeof e=="number"?String(e):""}function me(e){return`${e.value}${e.unit??""}`}function Bt(e,t){let n=10**t;return Math.round(e*n)/n}function Pu(e,t,n){return Math.min(Math.max(e,t),n)}function Au(e){let t=e%360;return t<0&&(t+=360),t}function Lu(e){switch(e){case"au":case"km":case"re":case"sol":case null:return e;default:return null}}function Tu(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Nt;case"re":return e.value*Ko/Nt;case"sol":return e.value*Zo/Nt;default:return e.value}}function ra(e,t){switch(t){case"km":return{value:Bt(e*Nt,0),unit:t};case"re":return{value:Bt(e*Nt/Ko,3),unit:t};case"sol":return{value:Bt(e*Nt/Zo,4),unit:t};case"au":return{value:Bt(e,3),unit:t};default:return{value:Bt(e,2),unit:null}}}function Cu(e,t,n){return t+n*Ru(Math.max(e,0)+1)}function Fu(e,t,n){return e<=t?0:Math.pow(2,(e-t)/Math.max(n,1e-4))-1}function Vu(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ru(e){return Math.log(e)/Math.log(2)}function L(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function ia(e){return L(e)}function zu(e){if(typeof window>"u"||typeof document>"u")throw new Error("createWorldOrbitEditor can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("WorldOrbit editor requires an HTMLElement container.")}function je(e,t){let n=e.querySelector(t);if(!n)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return n}function _u(){if(document.getElementById(Yo))return;let e=document.createElement("style");e.id=Yo,e.textContent=`
|
|
441
451
|
.wo-editor {
|
|
442
452
|
--wo-editor-sidebar-width: 280px;
|
|
443
453
|
--wo-editor-inspector-width: 360px;
|
|
@@ -891,4 +901,4 @@
|
|
|
891
901
|
.wo-editor-stage { min-height: 440px; }
|
|
892
902
|
.wo-editor-status { flex-direction: column; }
|
|
893
903
|
}
|
|
894
|
-
`,document.head.append(e)}return
|
|
904
|
+
`,document.head.append(e)}return ya(Bu);})();
|