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,21 +1,21 @@
|
|
|
1
|
-
var WorldOrbit=(()=>{var mn=Object.defineProperty;var Jo=Object.getOwnPropertyDescriptor;var Qo=Object.getOwnPropertyNames;var ei=Object.prototype.hasOwnProperty;var ti=(e,t)=>{for(var n in t)mn(e,n,{get:t[n],enumerable:!0})},ni=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Qo(t))!ei.call(e,o)&&o!==n&&mn(e,o,{get:()=>t[o],enumerable:!(r=Jo(t,o))||r.enumerable});return e};var ri=e=>ni(mn({},"__esModule",{value:!0}),e);var vc={};ti(vc,{DEFAULT_VIEWER_STATE:()=>Oe,WORLDORBIT_FIELD_KEYS:()=>Xn,WORLDORBIT_FIELD_SCHEMAS:()=>hn,WORLDORBIT_OBJECT_TYPES:()=>Qe,WORLD_LAYER_ID:()=>tn,WorldOrbitError:()=>p,clampScale:()=>mt,cloneAtlasDocument:()=>_t,composeViewerTransform:()=>Jt,createAtlasViewer:()=>on,createDiagnostic:()=>er,createEmbedPayload:()=>Vo,createEmptyAtlasDocument:()=>An,createInteractiveViewer:()=>Ae,createWorldOrbitEmbedMarkup:()=>Co,defineWorldOrbitViewerElement:()=>zo,deserializeViewerAtlasState:()=>qt,deserializeWorldOrbitEmbedPayload:()=>Nn,detectWorldOrbitSchemaVersion:()=>Fn,diagnosticFromError:()=>oe,extractWorldOrbitBlocks:()=>fo,fitViewerState:()=>De,focusViewerState:()=>Zt,formatAtlasDocument:()=>Ft,formatDocument:()=>Pt,formatDraftDocument:()=>$n,getAtlasDocumentNode:()=>Ln,getFieldSchema:()=>ne,getSceneCenter:()=>Fe,getThemePreset:()=>mo,getViewerVisibleBounds:()=>Qt,invertViewerPoint:()=>He,isKnownFieldKey:()=>gn,listAtlasDocumentPaths:()=>eo,load:()=>Sl,loadWorldOrbitSource:()=>he,loadWorldOrbitSourceWithDiagnostics:()=>Pn,materializeAtlasDocument:()=>lt,materializeDraftDocument:()=>xr,mountWorldOrbitEmbeds:()=>Ro,normalizeDocument:()=>be,normalizeRotation:()=>Cn,normalizeViewerFilter:()=>ie,normalizeWithDiagnostics:()=>tr,panViewerState:()=>Ee,parse:()=>po,parseSafe:()=>Ol,parseWithDiagnostics:()=>jt,parseWorldOrbit:()=>Ie,parseWorldOrbitAtlas:()=>Bt,parseWorldOrbitDraft:()=>Wr,removeAtlasDocumentNode:()=>no,render:()=>jl,renderDocumentToScene:()=>re,renderDocumentToSvg:()=>_n,renderSceneToSvg:()=>ce,renderSourceToSvg:()=>Io,resolveAtlasDiagnosticPath:()=>En,resolveAtlasDiagnostics:()=>Mn,resolveLayers:()=>Ut,resolveTheme:()=>Nt,rotatePoint:()=>pe,rotateViewerState:()=>Kt,sceneViewpointToLayerOptions:()=>Gt,searchSceneObjects:()=>Yt,serializeViewerAtlasState:()=>Ht,serializeWorldOrbitEmbedPayload:()=>zn,stringify:()=>Al,supportsObjectType:()=>bn,tokenizeLine:()=>Kn,tokenizeLineDetailed:()=>Te,unitFamilyAllowsUnit:()=>et,updateAtlasDocumentNode:()=>to,upgradeDocumentToDraftV2:()=>Dt,upgradeDocumentToV2:()=>st,upsertAtlasDocumentNode:()=>Tn,validateAtlasDocumentWithDiagnostics:()=>ro,validateDocument:()=>ye,validateDocumentWithDiagnostics:()=>nr,viewpointToViewerFilter:()=>Xt,zoomViewerStateAt:()=>Ye});var p=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 Je=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ae=Je.filter(e=>e!=="system"),oi=["star","planet","moon","asteroid","comet","structure","phenomenon"],Gn=["structure","phenomenon"],$e=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ii=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function O(e,t){return{key:e,...t}}var Qe=new Set(Je),hn=new Map([O("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:$e}),O("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"distance"}),O("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"distance"}),O("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:$e}),O("period",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"duration"}),O("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"angle"}),O("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"angle"}),O("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"angle"}),O("at",{kind:"string",placement:!0,arity:"single",objectTypes:Gn}),O("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Gn}),O("free",{kind:"string",placement:!0,arity:"single",objectTypes:ii}),O("kind",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),O("class",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),O("culture",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),O("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Je}),O("color",{kind:"string",placement:!1,arity:"single",objectTypes:Je}),O("image",{kind:"string",placement:!1,arity:"single",objectTypes:oi}),O("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Je}),O("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"radius"}),O("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"mass"}),O("density",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"generic"}),O("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"generic"}),O("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"generic"}),O("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:ae}),O("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),O("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),O("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),O("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),O("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),O("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),O("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),O("on",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),O("source",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),O("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"duration"})].map(e=>[e.key,e])),Xn=new Set(hn.keys());function ne(e){return hn.get(e)}function gn(e){return Xn.has(e)}function bn(e,t){return e.objectTypes.includes(t)}function et(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 Kn(e){return Te(e).map(t=>t.value)}function Te(e,t={}){let n=[],r=t.columnOffset??0,o="",i=null,a=!1,s=!1,l=null,c=()=>{i!==null&&(n.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],b=r+u+1;if(s&&f==="\\"){let w=e[u+1];if(w==='"'||w==="\\"){o+=w,u++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=b),a=!0,l=b,s=!0);continue}if(!s&&/\s/.test(f)){c();continue}i===null&&(i=b),o+=f}if(s)throw new p("Unclosed quote in line",t.line,l??r+e.length);return c(),n}function It(e){return e.match(/^\s*/)?.[0].length??0}function Ie(e){let t=e.split(/\r?\n/),n=[],r=null,o=!1,i=null;for(let a=0;a<t.length;a++){let s=t[a],l=a+1;if(!s.trim())continue;let c=It(s),u=Te(s.slice(c),{line:l,columnOffset:c});if(u.length!==0){if(c===0){o=!1,i=null;let f=ai(u,l);n.push(f),r=f;continue}if(!r)throw new p("Indented line without parent object",l,c+1);if(u.length===1&&u[0].value==="info"){o=!0,i=c;continue}o&&c<=(i??0)&&(o=!1),o?r.infoEntries.push(ci(u,l)):r.blockFields.push(li(u,l))}}return{type:"document",objects:n}}function ai(e,t){if(e.length<2)throw new p("Invalid object declaration",t,e[0]?.column??1);let[n,r,...o]=e;if(!Qe.has(n.value))throw new p(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:si(o,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function si(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r],i=ne(o.value);if(!i)throw new p(`Unknown field "${o.value}"`,t,o.column);r++;let a=[];if(i.arity==="multiple")for(;r<e.length&&!gn(e[r].value);)a.push(e[r]),r++;else{let s=e[r];s&&(a.push(s),r++)}if(a.length===0)throw new p(`Missing value for field "${o.value}"`,t,o.column);n.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return n}function li(e,t){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);if(!ne(e[0].value))throw new p(`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 ci(e,t){if(e.length<2)throw new p("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 Zn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,ui=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),di=/^[A-Za-z][A-Za-z0-9+.-]*:/;function be(e){let t=null,n=[];for(let r of e.objects){let o=fi(r);if(r.objectType==="system"){if(t)throw p.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 fi(e){let t=[...e.inlineFields,...e.blockFields];pi(e.objectType,t);let n=mi(t),r=hi(e.objectType,n),o=gi(n),i=wi(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 pi(e,t){for(let n of t){let r=ne(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(!bn(r,e))throw p.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function mi(e){let t=new Map;for(let n of e){if(t.has(n.key))throw p.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function hi(e,t){let n=t.has("orbit"),r=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[n,r,o,i].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw p.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw p.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:xt(t,"orbit"),distance:Be(t,"distance"),semiMajor:Be(t,"semiMajor"),eccentricity:Ii(t,"eccentricity"),period:Be(t,"period"),angle:Be(t,"angle"),inclination:Be(t,"inclination"),phase:Be(t,"phase")};if(r){let s=kt(t,"at"),l=xt(t,"at");return{mode:"at",target:l,reference:vi(l,s.location)}}if(o)return{mode:"surface",target:xt(t,"surface")};if(i){let s=xt(t,"free"),l=$i(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function gi(e){let t={};for(let[n,r]of e.entries()){let o=ne(n);if(!(!o||o.placement))switch(o.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=xi(r);break;case"number":t[n]=Qn(_e(r),n,r.location);break;case"unit":t[n]=Jn(_e(r),r.location,n);break;case"string":t[n]=bi(n,r);break}}return t}function bi(e,t){let n=t.values.join(" ").trim();return e==="image"&&yi(n,t.location),n}function yi(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(di);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function wi(e){let t={};for(let n of e){if(n.key in t)throw p.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function vi(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.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 p.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 Jn(e,t,n){let r=e.match(Zn);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=ne(n);if(i?.unitFamily&&!et(i.unitFamily,o.unit))throw p.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function $i(e){let t=e.match(Zn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Be(e,t){if(!e.has(t))return;let n=kt(e,t);return Jn(_e(n),n.location,t)}function Ii(e,t){if(!e.has(t))return;let n=kt(e,t);return Qn(_e(n),t,n.location)}function Qn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function xi(e){let t=_e(e).toLowerCase(),n=ui.get(t);if(n===void 0)throw p.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function kt(e,t){let n=e.get(t);if(!n)throw new p(`Missing value for key "${t}"`);return n}function xt(e,t){return _e(kt(e,t))}function _e(e){if(e.values.length!==1)throw p.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var ki=new Set(["star","planet","moon","asteroid","comet"]);function ye(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new p(`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 p(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let o=n.get(r.placement.target);if(!o||!ki.has(o.type))throw new p(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&ji(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Si(r,r.placement.reference,t))}}function ji(e,t,n){if(!n.has(t.primary))throw new p(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new p(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Si(e,t,n){if(!n.has(t.objectId))throw new p(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function er(e){return{...e}}function oe(e,t,n=`${t}.failed`){return e instanceof p?{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)}}function jt(e){let t;try{t=Ie(e)}catch(r){return{ok:!1,value:null,diagnostics:[oe(r,"parse")]}}let n;try{n=be(t)}catch(r){return{ok:!1,value:null,diagnostics:[oe(r,"normalize")]}}try{ye(n)}catch(r){return{ok:!1,value:null,diagnostics:[oe(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function tr(e){try{return{ok:!0,value:be(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[oe(t,"normalize")]}}}function nr(e){try{return ye(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[oe(t,"validate")]}}}var tt=1495978707e-1,Oi=6371,Ai=71492,Li=695700,Ti=63241.077,Mi=206264.806,Ei=206264806,lr=.68,Di=.2,cr=28;function re(e,t={}){let n=Vi(t),r=n.width,o=n.height,i=n.padding,a=Pi(e),s=Ri(e,t.projection),l=Bi(a,t.scaleModel),c=zi(a),u=e.system?.id??null,f=t.activeEventId??null,b=Fi(e.objects,e.events??[],f),w=new Map(b.map(x=>[x.id,x])),$=Sa(b,w),v=new Map,S=[],L=[],h=[],I=[],W=[],R=new Map,F=new Map;for(let x of b){let V=x.placement;if(!V){h.push(x);continue}if(V.mode==="orbit"){ir(F,V.target,x);continue}if(V.mode==="surface"){ir(R,V.target,x);continue}if(V.mode==="at"){W.push(x);continue}I.push(x)}let N=I.length>0?r*.42:r/2,M=o/2,q={orbitChildren:F,surfaceChildren:R,objectMap:w,spacingFactor:c,projection:s,scaleModel:l},P=h.find(x=>x.type==="star")??h[0]??null;P&&yn(P,N,M,0,v,S,L,q);let Y=h.filter(x=>x.id!==P?.id);if(Y.length>0){let x=Math.min(r,o)*.28*c*l.orbitDistanceMultiplier;Y.forEach((V,_)=>{let Ve=it(_,Y.length,-Math.PI/2),Q=at(Ve,x,s,1);yn(V,N+Q.x,M+Q.y,0,v,S,L,q)})}I.forEach((x,V)=>{let _=r-i-140-Ea(x.placement?.mode==="free"?x.placement.distance:void 0,l),Ve=Math.max(76,(o-i*2-180)/Math.max(1,I.length)*c)*l.freePlacementMultiplier,Q=i+92+V*Ve;v.set(x.id,{object:x,x:_,y:Q,radius:Lt(x,0,l),sortKey:Mt(_,Q,0)}),L.push({object:x,groupId:$.groupIds.get(x.id)??null,x1:_-60,y1:Q,x2:_-18,y2:Q,mode:"free"}),Ot(x,v,S,L,q,1)}),W.forEach((x,V)=>{if(v.has(x.id)||!x.placement||x.placement.mode!=="at")return;let _=ka(x.placement.reference,v,w,V,W.length,r,o,i,q);v.set(x.id,{object:x,x:_.x,y:_.y,radius:Lt(x,2,l),sortKey:Mt(_.x,_.y,2),anchorX:_.anchorX,anchorY:_.anchorY}),_.anchorX!==void 0&&_.anchorY!==void 0&&L.push({object:x,groupId:$.groupIds.get(x.id)??null,x1:_.anchorX,y1:_.anchorY,x2:_.x,y2:_.y,mode:"at"}),Ot(x,v,S,L,q,2)});let B=[...v.values()].map(x=>Ni(x,l,$)),E=S.map(x=>Ui(x,$.groupIds.get(x.object.id)??null)),J=L.map(x=>Wi(x)),te=Yi(B,r,o,l.labelMultiplier),y=Qi(e,B),j=ea(e.events??[],B,f),K=Ki(E,y,j,J,B,te),Le=Zi(B,E,J,te,$,l.labelMultiplier),Pe=Ji(e,B),wt=ta(e,s,n.preset,$,w),z=ha(r,o,B,E,J,te,l.labelMultiplier);return{width:r,height:o,padding:i,renderPreset:n.preset,projection:s,scaleModel:l,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${ar(s)} view - ${ar(a)} layout`,systemId:u,viewMode:s,layoutPreset:a,metadata:{format:e.format,version:e.version,view:s,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:z,layers:K,groups:Le,semanticGroups:Pe,viewpoints:wt,events:j,activeEventId:f,objects:B,orbitVisuals:E,relations:y,leaders:J,labels:te}}function pe(e,t,n){let r=Et(n),o=Math.cos(r),i=Math.sin(r),a=e.x-t.x,s=e.y-t.y;return{x:t.x+a*o-s*i,y:t.y+a*i+s*o}}function Fi(e,t,n){let r=e.map(a=>structuredClone(a));if(!n)return r;let o=t.find(a=>a.id===n);if(!o)return r;let i=new Map(r.map(a=>[a.id,a]));for(let a of o.positions){let s=i.get(a.objectId);s&&(s.placement=a.placement?structuredClone(a.placement):null,a.inner?s.properties.inner={...a.inner}:delete s.properties.inner,a.outer?s.properties.outer={...a.outer}:delete s.properties.outer)}return r}function Pi(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 Vi(e){let t=Ci(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Ci(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 Ri(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Bi(e,t){return{..._i(e),...t}}function _i(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 zi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ni(e,t,n){let{object:r,x:o,y:i,radius:a,sortKey:s,anchorX:l,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:ze(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:a,visualRadius:Ma(r,a,t),sortKey:s+u*.001,anchorX:l,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Fa(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Ui(e,t){return{renderId:`${ze(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 Wi(e){return{renderId:`${ze(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 Yi(e,t,n,r){let o=[],i=[],a=new Map(e.map(l=>[l.objectId,l])),s=[...e].filter(l=>!l.hidden&&l.object.renderHints?.renderLabel!==!1).sort(Hi);for(let l of s){let c=qi(l,a,i,t,n,r)??dr(l,ur(l,a.get(l.parentId??"")??null,n),0,r);i.push(br(l,c,r)),o.push({renderId:`${l.renderId}-label`,objectId:l.objectId,object:l.object,groupId:l.groupId,semanticGroupIds:[...l.semanticGroupIds],label:l.label,secondaryLabel:l.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:l.hidden})}return o}function Hi(e,t){let n=rr(e)-rr(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 rr(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 qi(e,t,n,r,o,i){for(let a of Gi(e,t,r,o)){let s=a==="left"||a==="right"?4:6;for(let l=0;l<=s;l+=1){let c=dr(e,a,l,i),u=br(e,c,i);if(!n.some(f=>La(f,u)))return c}}return null}function Gi(e,t,n,r){let o=e.parentId?t.get(e.parentId)??null:null,i=ur(e,o,r),a=i==="below"?"above":"below",s=Xi(e,o,n),l=s==="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"?[s,i,l,a]:[i,s,a,l]}function ur(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 Xi(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 dr(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),a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let i=e.x+e.visualRadius+16*r+n*o,a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function Ki(e,t,n,r,o,i){let a=e.filter(l=>!l.hidden&&!!l.backArcPath).map(l=>l.renderId),s=e.filter(l=>!l.hidden).map(l=>l.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:s},{id:"relations",renderIds:t.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"events",renderIds:n.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"objects",renderIds:o.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"labels",renderIds:i.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Zi(e,t,n,r,o,i){let a=new Map,s=l=>{if(!l)return null;let c=a.get(l);if(c)return c;let u=o.groupRoots.get(l)??null,f={renderId:l,rootObjectId:u,label:u??l,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ot(0,0,0,0)};return a.set(l,f),f};for(let l of e){let c=s(l.groupId);c&&!l.hidden&&c.objectIds.push(l.objectId)}for(let l of t){let c=s(l.groupId);c&&!l.hidden&&c.orbitIds.push(l.objectId)}for(let l of n){let c=s(l.groupId);c&&!l.hidden&&c.leaderIds.push(l.objectId)}for(let l of r){let c=s(l.groupId);c&&!l.hidden&&c.labelIds.push(l.objectId)}for(let l of a.values())l.contentBounds=Oa(l,e,t,n,r,i);return[...a.values()].sort((l,c)=>l.label.localeCompare(c.label))}function Ji(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 Qi(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:`${ze(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 ea(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])],a=i.map(c=>r.get(c)).filter(Boolean),s=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,l=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${ze(o.id)}-event`,eventId:o.id,event:o,objectIds:i,participantIds:[...o.participantObjectIds],targetObjectId:o.targetObjectId,x:s,y:l,hidden:o.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&o.id!==n}}).sort((o,i)=>o.event.id.localeCompare(i.event.id))}function ta(e,t,n,r,o){let i=na(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,b,...w]=c.split(".");if(f!=="viewpoint"||!b||w.length===0)continue;let $=fa(b);if(!$)continue;let v=w.join(".").toLowerCase(),S=a.get($)??{id:$};ra(S,v,u,e,t,n,r,o),a.set($,S)}let s=[...a.values()].map(c=>oa(c,t,n,o)).filter(Boolean),l=s.findIndex(c=>c.id===i.id);return l>=0?s.splice(l,1,{...i,...s[l],layers:{...i.layers,...s[l].layers},filter:s[l].filter??i.filter,generated:!1}):s.unshift(i),s.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function na(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 ra(e,t,n,r,o,i,a,s){let l=n.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"events":e.eventIds=rt(l);return;case"projection":case"view":e.projection=aa(l)??o;return;case"preset":e.preset=sa(l)??i;return;case"rotation":case"angle":e.rotationDeg=fr(l)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=la(l);return;case"layers":e.layers=ca(l);return;case"query":e.filter={...e.filter??St(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??St(),objectTypes:ua(l)};return;case"tags":e.filter={...e.filter??St(),tags:rt(l)};return;case"groups":e.filter={...e.filter??St(),groupIds:da(l,r,a,s)};return}}function oa(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,a=ia(e.filter),s=e.label?.trim()||pa(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||ma(s,o,a),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:a,generated:!1}}function St(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ia(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 aa(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function sa(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function fr(e){let t=Number(e);return Number.isFinite(t)?t:null}function la(e){let t=fr(e);return t!==null&&t>0?t:null}function ca(e){let t={};for(let n of rt(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 ua(e){return rt(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function da(e,t,n,r){return rt(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)??nt(o):(r.has(o),nt(o)))}function rt(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function fa(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function pa(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ma(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 ha(e,t,n,r,o,i,a){let s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(b,w)=>{s=Math.min(s,b),l=Math.min(l,w),c=Math.max(c,b),u=Math.max(u,w)};for(let b of r)b.hidden||pr(b,f);for(let b of o)b.hidden||(f(b.x1,b.y1),f(b.x2,b.y2));for(let b of n)b.hidden||mr(b,f);for(let b of i)b.hidden||hr(b,f,a);return!Number.isFinite(s)||!Number.isFinite(l)?ot(0,0,e,t):ot(s,l,c,u)}function pr(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=wr(e.cx,e.cy,r,o,e.rotationDeg,0,Math.PI*2,cr*2);for(let a of i)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function ot(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 mr(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 hr(e,t,n){let r=yr(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 yn(e,t,n,r,o,i,a,s){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:n,radius:Lt(e,r,s.scaleModel),sortKey:Mt(t,n,r)}),Ot(e,o,i,a,s,r+1))}function Ot(e,t,n,r,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(ga),l=ba(s,a.radius,o.spacingFactor,o.scaleModel),c=va(s,l);s.forEach((f,b)=>{let w=ya(f,b,s.length,a,l,c[b]??l.innerPx,o);n.push({object:f,parentId:e.id,kind:w.kind,cx:w.cx,cy:w.cy,radius:w.radius,rx:w.rx,ry:w.ry,rotationDeg:w.rotationDeg,band:w.band,bandThickness:w.bandThickness,frontArcPath:w.frontArcPath,backArcPath:w.backArcPath}),yn(f,w.objectX,w.objectY,i,t,n,r,o)});let u=[...o.surfaceChildren.get(e.id)??[]];u.forEach((f,b)=>{let w=it(b,u.length,-Math.PI/3),$=28*o.spacingFactor,v=at(w,a.radius,o.projection,o.projection==="isometric"?.9:1),S=at(w,a.radius+$,o.projection,o.projection==="isometric"?.9:1),L=a.x+v.x,h=a.y+v.y,I=a.x+S.x,W=a.y+S.y;t.set(f.id,{object:f,x:I,y:W,radius:Lt(f,i+1,o.scaleModel),sortKey:Mt(I,W,i+1),anchorX:L,anchorY:h}),r.push({object:f,groupId:o.objectMap.has(f.id)?nt(Aa(f,o.objectMap)):null,x1:L,y1:h,x2:I,y2:W,mode:"surface"}),Ot(f,t,n,r,o,i+1)})}function ga(e,t){let n=At(e),r=At(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 ba(e,t,n,r){let o=e.map(f=>At(f)),i=o.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,s=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42};let l=Math.min(...i),c=Math.max(...i),u=c-l;return{metrics:o,minMetric:l,maxMetric:c,metricSpread:u,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function ya(e,t,n,r,o,i,a){let s=e.placement,l=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let M=o.innerPx+t*o.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:M,rotationDeg:0,band:l,bandThickness:l?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-M}}let c=H(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),u=i,f=Math.max(u*Math.sqrt(1-c*c),u*.18),b=vn(s.inclination)??0,w=a.projection==="isometric"?Math.max(Di,Math.cos(Et(b)))*lr:1,$=Math.max(f*w,u*.14),v=vn(s.angle)??0,S=u*c,L=$r(-S,0,v),h=r.x+L.x,I=r.y+L.y,W=Ia(s.phase,t,n),R=vr(h,I,u,$,v,W),F=a.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,N=l?xa(e,u,o,a.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:h,cy:F?r.y:I,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:$,rotationDeg:v,band:l,bandThickness:N,frontArcPath:a.projection==="isometric"||l?or(h,I,u,$,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||l?or(h,I,u,$,v,Math.PI,Math.PI*2):void 0,objectX:R.x,objectY:R.y}}function wa(e,t){return t.innerPx+t.stepPx*$a(Math.max(e,0)+1)}function va(e,t){let n=[];return e.forEach((r,o)=>{let i=At(r),a=t.innerPx+o*t.stepPx,s=i===null?a:wa(i,t),l=o===0?t.innerPx:(n[o-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(s,l))}),n}function At(e){return!e.placement||e.placement.mode!=="orbit"?null:Tt(e.placement.semiMajor??e.placement.distance??null)}function $a(e){return Math.log(e)/Math.log(2)}function Ia(e,t,n){let r=e?vn(e):null;return r!==null?Et(r-90):it(t,n,-Math.PI/2)}function xa(e,t,n,r){let o=Tt(wn(e.properties.inner)),i=Tt(wn(e.properties.outer));if(o!==null&&i!==null){let s=Math.abs(i-o);if(n.metricSpread>0)return H(s/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(o,i),1e-4);return H(s/l*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function ka(e,t,n,r,o,i,a,s,l){if(e.kind==="lagrange")return ja(e,t,n,i,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=it(r,o,Math.PI/5),f=(c.radius+36)*l.scaleModel.labelMultiplier,b=at(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=it(r,o,Math.PI/6),f=(c.radius+36)*l.scaleModel.labelMultiplier,b=at(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}return{x:i-s-170,y:a-s-86-r*58*l.scaleModel.freePlacementMultiplier}}function ja(e,t,n,r,o){let i=e.secondary?t.get(e.primary):Ta(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:r*.7,y:o*.25};let s=a.x-i.x,l=a.y-i.y,c=Math.hypot(s,l)||1,u=s/c,f=l/c,b=-f,w=u,$=H(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*$,y:a.y-f*$,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*$,y:a.y+f*$,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-u*$,y:i.y-f*$,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(u*.5-b*.8660254)*$,y:a.y+(f*.5-w*.8660254)*$,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+b*.8660254)*$,y:a.y+(f*.5+w*.8660254)*$,anchorX:a.x,anchorY:a.y}}}function Sa(e,t){let n=new Map,r=new Map;for(let c of e){let u=gr(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let o=new Map,i=new Map,a=new Map,s=c=>{let u=o.get(c);if(u)return u;let f=new Set,b=[],w=n.get(c)??null;for(;w&&!f.has(w);)b.push(w),f.add(w),w=n.get(w)??null;return o.set(c,b),b},l=c=>{let u=a.get(i.get(c)??"");if(u)return u;let f=n.get(c)??null,b=t.get(c),w=c;return b?.placement&&b.placement.mode!=="free"&&f&&(w=l(f)),w};for(let c of e){s(c.id);let u=l(c.id),f=nt(u);i.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:o,groupIds:i,groupRoots:a}}function gr(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 Oa(e,t,n,r,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,b)=>{a=Math.min(a,f),s=Math.min(s,b),l=Math.max(l,f),c=Math.max(c,b)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&mr(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&pr(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of o)!f.hidden&&e.labelIds.includes(f.objectId)&&hr(f,u,i);return!Number.isFinite(a)||!Number.isFinite(s)?ot(0,0,0,0):ot(a,s,l,c)}function Aa(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=gr(n,t);if(!o)break;let i=t.get(o);if(!i)break;n=i}return n.id}function br(e,t,n){return yr(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function yr(e,t,n,r,o,i,a,s){let l=Pa(i,a,s),c=l*2,u=o==="above"?18:12,f=o==="above"?8:12,b=e-l,w=e+l;return r==="start"?(b=e,w=e+c):r==="end"&&(b=e-c,w=e),{left:b,right:w,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function La(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ta(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Lt(e,t,n){let r=Da(e.properties.radius,n);if(r!==null)return r;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return H((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return H(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return H(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return H(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return H(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return H(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return H(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return H(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return H(8*o,n.minBodyRadius,n.maxBodyRadius)}}function Ma(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 Tt(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/tt;case"m":return e.value/1e3/tt;case"ly":return e.value*Ti;case"pc":return e.value*Mi;case"kpc":return e.value*Ei;case"re":return e.value*Oi/tt;case"rj":return e.value*Ai/tt;case"sol":return e.value*Li/tt;default:return e.value}}function Ea(e,t){let n=Tt(e??null);return n===null||n<=0?0:H(n*96*t.freePlacementMultiplier,0,420)}function Da(e,t){let n=wn(e);if(!n)return null;let r;switch(n.unit){case"sol":r=H(n.value*22,14,40);break;case"re":r=H(n.value*10,6,18);break;case"km":r=H(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=H(n.value*4,4,20);break}return H(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function wn(e){return!e||typeof e!="object"||!("value"in e)?null:e}function vn(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function it(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function or(e,t,n,r,o,i,a){let s=wr(e,t,n,r,o,i,a,cr);return s.length===0?"":s.map((l,c)=>`${c===0?"M":"L"} ${sr(l.x)} ${sr(l.y)}`).join(" ")}function wr(e,t,n,r,o,i,a,s){let l=[];for(let c=0;c<=s;c+=1){let u=i+(a-i)*c/s;l.push(vr(e,t,n,r,o,u))}return l}function vr(e,t,n,r,o,i){let a=n*Math.cos(i),s=r*Math.sin(i),l=$r(a,s,o);return{x:e+l.x,y:t+l.y}}function $r(e,t,n){let r=Et(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function at(e,t,n,r){let o=n==="isometric"?lr*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Mt(e,t,n){return t*1e3+e+n*.01}function H(e,t,n){return Math.min(Math.max(e,t),n)}function ir(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ze(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function nt(e){return`${ze(e)}-group`}function Fa(e){return typeof e=="string"&&e.trim()?e:void 0}function Pa(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 ar(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Et(e){return e*Math.PI/180}function sr(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function st(e,t={}){let n=re(e,t),r=[],o=Ra(e,r),i=Ba(e,r),a=Ca(e,n.renderPreset??t.preset??null,n.projection),s=e.system?Va(e,a,o,i,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(l=>!l.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(l=>!l.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:s,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(kr),diagnostics:r}}function Dt(e,t={}){return Ka(st(e,t))}function lt(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:qa(e.system),info:Ga(e.system)}:null,r=e.objects.map(kr);return Ua(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(za),objects:r}}function xr(e){return lt(e)}function Va(e,t,n,r,o,i){let a=re(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:a.viewpoints.map(_a),annotations:r}}function Ca(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 Ra(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 Ba(e,t){let n=new Map;for(let[r,o]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,i,...a]=r.split(".");if(!i||a.length===0)continue;let s=Ir(i);if(!s)continue;let l=n.get(s)??{id:s};switch(a.join(".").toLowerCase()){case"label":l.label=o;break;case"target":case"object":l.targetObjectId=o.trim()||null;break;case"body":case"text":case"description":l.body=o;break;case"tags":l.tags=Ya(o);break}n.set(s,l)}for(let r of e.objects){let o=r.info.description;if(!o)continue;let i=Ir(`${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(a=>typeof a=="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??Ha(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 _a(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 kr(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:Wa(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function za(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Na)}}function Na(e){return{objectId:e.objectId,placement:jr(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function jr(e){return e?structuredClone(e):null}function Ua(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 a=o.get(i.objectId);a&&(a.placement=jr(i.placement),i.inner?a.properties.inner={...i.inner}:delete a.properties.inner,i.outer?a.properties.outer={...i.outer}:delete a.properties.outer)}}function Wa(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 Ya(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ir(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ha(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function qa(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 Ga(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=Xa(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 Xa(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 Ka(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Sr=["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 Pt(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 l=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Dt(e);return $n(l)}let s=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:st(e);return n==="2.1"&&s.version!=="2.1"?Ft({...s,version:"2.1",schemaVersion:"2.1"}):Ft(s)}let o=[],i=e;i.system&&o.push(...Za(i.system));let a=[...i.objects].sort(kn);for(let s of a)o.length>0&&o.push(""),o.push(...Qa(s));return o.join(`
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function Za(e){return Ja("system",e.id,e.properties,null,e.info)}function Ja(e,t,n,r,o){let i=[`${e} ${t}`],a=[...In(r),...Mr(n)];for(let l of a)i.push(` ${l}`);let s=Object.entries(o).sort(([l],[c])=>l.localeCompare(c));if(s.length>0){a.length>0&&i.push(""),i.push(" info");for(let[l,c]of s)i.push(` ${l} ${k(c)}`)}return i}function Ar(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${k(e.title)}`),e.description&&t.push(` description ${k(e.description)}`),e.epoch&&t.push(` epoch ${k(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${k(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${k(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${k(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${k(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} ${k(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...ts(n));for(let n of e.annotations)t.push(""),t.push(...ns(n));return t}function Qa(e){return Tr(e.type,e.id,e)}function Lr(e){return Tr(`object ${e.type}`,e.id,e)}function Tr(e,t,n){let r=[`${e} ${t}`],o=[...In(n.placement),...Mr(n.properties),...es(n)];for(let a of o)r.push(` ${a}`);let i=Object.entries(n.info).sort(([a],[s])=>a.localeCompare(s));if(i.length>0){o.length>0&&r.push(""),r.push(" info");for(let[a,s]of i)r.push(` ${a} ${k(s)}`)}for(let a of["climate","habitability","settlement"]){let s=Object.entries(n.typedBlocks?.[a]??{}).sort(([l],[c])=>l.localeCompare(c));if(s.length>0){r.push(""),r.push(` ${a}`);for(let[l,c]of s)r.push(` ${l} ${k(c)}`)}}return r}function In(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...xe("distance",e.distance),...xe("semiMajor",e.semiMajor),...os("eccentricity",e.eccentricity),...xe("period",e.period),...xe("angle",e.angle),...xe("inclination",e.inclination),...xe("phase",e.phase)];case"at":return[`at ${is(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?xn(e.distance):e.descriptor??""}`.trim()]}}function Mr(e){return Object.keys(e).sort(ss).map(t=>`${t} ${Pr(e[t])}`)}function es(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${k(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${k(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} ${Pr(n.value)}`);return t}function ts(e){let t=[`viewpoint ${e.id}`,` label ${k(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 ${k(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=as(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 ${k(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(k).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function ns(e){let t=[`annotation ${e.id}`,` label ${k(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${k(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(k).join(" ")}`),t}function Er(e){let t=[`group ${e.id}`,` label ${k(e.label)}`];return e.summary&&t.push(` summary ${k(e.summary)}`),e.color&&t.push(` color ${k(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(k).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Dr(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${k(e.from)}`),e.to&&t.push(` to ${k(e.to)}`),e.kind&&t.push(` kind ${k(e.kind)}`),e.label&&t.push(` label ${k(e.label)}`),e.summary&&t.push(` summary ${k(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(k).join(" ")}`),e.color&&t.push(` color ${k(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Fr(e){let t=[`event ${e.id}`,` kind ${k(e.kind)}`];if(e.label&&t.push(` label ${k(e.label)}`),e.summary&&t.push(` summary ${k(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${k(e.timing)}`),e.visibility&&t.push(` visibility ${k(e.visibility)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(k).join(" ")}`),e.color&&t.push(` color ${k(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(ls)){t.push(` pose ${n.objectId}`);for(let r of rs(n))t.push(` ${r}`)}}return t}function rs(e){return[...In(e.placement),...xe("inner",e.inner),...xe("outer",e.outer)]}function Pr(e){return Array.isArray(e)?e.map(t=>k(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?k(e):xn(e)}function xn(e){return`${e.value}${e.unit??""}`}function xe(e,t){return t?[`${e} ${xn(t)}`]:[]}function os(e,t){return t===void 0?[]:[`${e} ${t}`]}function is(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 as(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 ss(e,t){let n=Sr.indexOf(e),r=Sr.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function kn(e,t){let n=Or(e.type),r=Or(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function Ne(e,t){return e.id.localeCompare(t.id)}function ls(e,t){return e.objectId.localeCompare(t.objectId)}function Or(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 k(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Vr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,cs=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),us=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Ue(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ut(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function jn(e,t,n){let r=e.match(Vr);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=ne(n);if(i?.unitFamily&&!et(i.unitFamily,o.unit))throw p.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function Sn(e){let t=e.match(Vr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Vt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ke(e,t,n){let r=cs.get(e.toLowerCase());if(r===void 0)throw p.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Cr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.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 p.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 ds(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(us);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Rr(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw p.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return ke(ct(t,e,n),e,n);case"number":return Vt(ct(t,e,n),e,n);case"unit":return jn(ct(t,e,n),n,e);case"string":{let o=t.join(" ").trim();return e==="image"&&ds(o,n),o}}}function On(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw p.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function ct(e,t,n){if(e.length!==1)throw p.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var _r=new Set(["star","planet","moon","asteroid","comet"]),fs=332946.0487,ps=1047.3486,Ct=1495978707e-1,ms=6371,hs=695700,gs=63241.077,bs=206264.806,ys=206264806;function dt(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),o=new Set(e.groups.map(s=>s.id)),i=new Set(e.events.map(s=>s.id));e.system||n.push(A("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[s,l]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of l){let u=a.get(c);u?n.push(A("validate.id.duplicate",`Duplicate ${s} id "${c}" already used by ${u}.`)):a.set(c,s)}for(let s of e.relations)ws(s,r,n);for(let s of e.system?.viewpoints??[])vs(s.filter,s.events??[],o,i,t,n,s.id);for(let s of e.objects)$s(s,e.system,r,o,n);for(let s of e.events)Is(s,r,n);return n}function ws(e,t,n){e.from?t.has(e.from)||n.push(A("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(A("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(A("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(A("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(A("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function vs(e,t,n,r,o,i,a){if(o==="2.1"){if(e)for(let s of e.groupIds)n.has(s)||i.push(ee("validate.viewpoint.group.unknown",`Unknown group "${s}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.groups`));for(let s of t)r.has(s)||i.push(ee("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.events`))}}function $s(e,t,n,r,o){let i=e.placement,a=i?.mode==="orbit"?i:null,s=i?.mode==="orbit"?n.get(i.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||o.push(ee("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(a&&(n.has(a.target)||o.push(A("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&o.push(A("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&o.push(ee("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(ee("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!zr(s?.properties.mass)&&o.push(ee("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let l=n.get(i.target);l?_r.has(l.type)||o.push(A("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(A("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(A("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),ks(e,n,o)||o.push(A("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&o.push(ee("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(A("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){o.push(ee("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=Br(e,s);if(c===null){o.push(ee("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||o.push(As("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Os(c)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){o.push(ee("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=Nr(a?.period),u=Br(e,s);if(c===null||u===null)continue;let f=Ss(e,"period");Math.abs(c-u)>f&&o.push(A("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Is(e,t,n){let r=`event.${e.id}`,o=new Set;e.kind.trim()||n.push(A("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(A("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(A("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let i=new Set;for(let s of e.participantObjectIds){if(o.add(s),i.has(s)){n.push(ee("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${s}".`,void 0,`${r}.participants`));continue}i.add(s),t.has(s)||n.push(A("validate.event.participants.unknown",`Unknown event participant "${s}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(ee("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(ee("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(ee("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let a=new Set;for(let s of e.positions){let l=`${r}.pose.${s.objectId}`;if(a.has(s.objectId)){n.push(A("validate.event.pose.duplicate",`Event "${e.id}" defines "${s.objectId}" more than once in positions.`,void 0,l));continue}a.add(s.objectId);let c=t.get(s.objectId);if(!c){n.push(A("validate.event.pose.object.unknown",`Unknown event pose object "${s.objectId}" on "${e.id}".`,void 0,l));continue}o.has(s.objectId)||n.push(ee("validate.event.pose.unreferenced",`Event pose "${s.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,l)),xs(s,c,t,n,l,e.id)}}function xs(e,t,n,r,o,i){let a=e.placement;if(!a){r.push(A("validate.event.pose.placement.required",`Event "${i}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(a.mode==="orbit"){n.has(a.target)||r.push(A("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.orbit`)),a.distance&&a.semiMajor&&r.push(A("validate.event.pose.orbit.distanceConflict",`Event "${i}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`));return}if(a.mode==="surface"){let s=n.get(a.target);s?_r.has(s.type)||r.push(A("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${i}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):r.push(A("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(A("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 s=a.reference;s.kind==="named"&&!n.has(s.name)?r.push(A("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):s.kind==="anchor"&&!n.has(s.objectId)?r.push(A("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${s.objectId}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):s.kind==="lagrange"&&(n.has(s.primary)?s.secondary&&!n.has(s.secondary)&&r.push(A("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${s.secondary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):r.push(A("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${s.primary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)))}}function ks(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(A("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(A("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(A("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Br(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=js(n.semiMajor??n.distance),o=zr(t?.properties.mass);return r===null||o===null||o<=0?null:Math.sqrt(r**3/o)*365.25}function js(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ct;case"m":return e.value/(Ct*1e3);case"ly":return e.value*gs;case"pc":return e.value*bs;case"kpc":return e.value*ys;case"re":return e.value*ms/Ct;case"sol":return e.value*hs/Ct;default:return null}}function zr(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/fs;case"mj":return t.value/ps;default:return null}}function Nr(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 Ss(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Nr(n)??0:0}function Os(e){return`${Math.round(e*100)/100}d`}function A(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function ee(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function As(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ls=new Set(["climate","habitability","settlement"]),Rt=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=ne(e);t&&Rt.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}])Rt.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Ts=new Set(Rt.keys()),Ms=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function Bt(e){return Yr(e)}function Wr(e){return Yr(e,"2.0-draft")}function Yr(e,t){let n=gl(e),r=n.source.split(/\r?\n/),o=[],i=!1,a="2.0",s=null,l=null,c=[],u=[],f=[],b=[],w=new Map,$=!1,v=!1,S=new Set,L=new Set,h=new Set,I=new Set,W=new Set;for(let P=0;P<r.length;P++){let Y=r[P],B=P+1;if(!Y.trim())continue;let E=It(Y),J=Te(Y.slice(E),{line:B,columnOffset:E});if(J.length!==0){if(!i){a=Es(J,B),i=!0,n.comments.length>0&&a!=="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 ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(E===0){l=Ds(J,B,a,o,s,c,u,f,b,w,S,L,h,I,W,{sawDefaults:$,sawAtlas:v}),l.kind==="system"?s=l.system:l.kind==="defaults"?$=!0:l.kind==="atlas"&&(v=!0);continue}if(!l)throw new p("Indented line without parent atlas section",B,E+1);zs(l,E,J,B)}}if(!i)throw new p('Missing required atlas schema header "schema 2.0"');let R=c.map(P=>il(P,a,o)),F=b.map(P=>al(P,w.get(P.id)??[])),N=t??(a==="2.0-draft"?"2.0":a),M={format:"worldorbit",sourceVersion:"1.0",system:s,groups:u,relations:f,events:F,objects:R,diagnostics:o};if(N==="2.0-draft"){let P={...M,version:"2.0-draft",schemaVersion:"2.0-draft"};return P.diagnostics.push(...dt(P,a)),P}let q={...M,version:N,schemaVersion:N};return a==="2.0-draft"&&q.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".'}),q.diagnostics.push(...dt(q,a)),q}function Es(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 p('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 Ds(e,t,n,r,o,i,a,s,l,c,u,f,b,w,$,v){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new p('Atlas section "system" may only appear once',t,e[0].column);return Fs(e,t,n,r);case"defaults":if(!o)throw new p('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new p('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 p('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new p('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 p('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Ps(e,t,o,u,n,r);case"annotation":if(!o)throw new p('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Vs(e,t,o,f);case"group":return se(n,r,"group",{line:t,column:e[0].column}),Cs(e,t,a,b);case"relation":return se(n,r,"relation",{line:t,column:e[0].column}),Rs(e,t,s,w);case"event":return se(n,r,"event",{line:t,column:e[0].column}),Bs(e,t,l,c,$,n,r);case"object":return _s(e,t,n,r,i);default:throw new p(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Fs(e,t,n,r){if(e.length!==2)throw new p("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 Ps(e,t,n,r,o,i){if(e.length!==2)throw new p("Invalid viewpoint declaration",t,e[0]?.column??1);let a=Ue(e[1].value);if(!a)throw new p("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new p(`Duplicate viewpoint id "${a}"`,t,e[1].column);let s={id:a,label:ut(a),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(s),r.add(a),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:o,diagnostics:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Vs(e,t,n,r){if(e.length!==2)throw new p("Invalid annotation declaration",t,e[0]?.column??1);let o=Ue(e[1].value);if(!o)throw new p("Annotation id must not be empty",t,e[1].column);if(r.has(o))throw new p(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:ut(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(i),r.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function Cs(e,t,n,r){if(e.length!==2)throw new p("Invalid group declaration",t,e[0]?.column??1);let o=Ue(e[1].value);if(!o)throw new p("Group id must not be empty",t,e[1].column);if(r.has(o))throw new p(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:ut(o),summary:"",color:null,tags:[],hidden:!1};return n.push(i),r.add(o),{kind:"group",group:i,seenFields:new Set}}function Rs(e,t,n,r){if(e.length!==2)throw new p("Invalid relation declaration",t,e[0]?.column??1);let o=Ue(e[1].value);if(!o)throw new p("Relation id must not be empty",t,e[1].column);if(r.has(o))throw new p(`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 Bs(e,t,n,r,o,i,a){if(e.length!==2)throw new p("Invalid event declaration",t,e[0]?.column??1);let s=Ue(e[1].value);if(!s)throw new p("Event id must not be empty",t,e[1].column);if(o.has(s))throw new p(`Duplicate event id "${s}"`,t,e[1].column);let l={id:s,kind:"",label:ut(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(l),r.set(s,c),o.add(s),{kind:"event",event:l,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function _s(e,t,n,r,o){if(e.length<3)throw new p("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],a=e[2],s=i.value;if(!Qe.has(s)||s==="system")throw new p(`Unknown object type "${i.value}"`,t,i.column);let l={objectType:s,id:a.value,fields:rl(e.slice(3),t,s,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function zs(e,t,n,r){switch(e.kind){case"system":Ns(e,n,r);return;case"defaults":Us(e,n,r);return;case"atlas":Ws(e,t,n,r);return;case"viewpoint":Ys(e,t,n,r);return;case"annotation":qs(e,n,r);return;case"group":Gs(e,n,r);return;case"relation":Xs(e,n,r);return;case"event":Ks(e,t,n,r);return;case"object":Js(e,t,n,r);return}}function Ns(e,t,n){let r=Se(t,e.seenFields,n),o=C(t,n);switch(r){case"title":e.system.title=o;return;case"description":se(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=o;return;case"epoch":se(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=o;return;default:throw new p(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Us(e,t,n){let r=Se(t,e.seenFields,n),o=C(t,n);switch(r){case"view":e.system.defaults.view=Hr(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=qr(o,n,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new p(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Ws(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=Xr(n,r,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new p(`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 p(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Ys(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Hs(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new p('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=Se(n,e.seenFields,r),i=C(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=Hr(i,r,n[0].column);return;case"preset":e.viewpoint.preset=qr(i,r,n[0].column);return;case"zoom":e.viewpoint.zoom=tl(i,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Gr(i,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=el(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=me(n.slice(1),r,"events");return;default:throw new p(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Hs(e,t,n){let r=Se(t,e.seenFilterFields,n),o=e.viewpoint.filter??nl();switch(r){case"query":o.query=C(t,n);break;case"objecttypes":o.objectTypes=Qs(t.slice(1),n);break;case"tags":o.tags=me(t.slice(1),n,"tags");break;case"groups":o.groupIds=me(t.slice(1),n,"groups");break;default:throw new p(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=o}function qs(e,t,n){switch(Se(t,e.seenFields,n)){case"label":e.annotation.label=C(t,n);return;case"target":e.annotation.targetObjectId=C(t,n);return;case"body":e.annotation.body=C(t,n);return;case"tags":e.annotation.tags=me(t.slice(1),n,"tags");return;default:throw new p(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Gs(e,t,n){switch(Se(t,e.seenFields,n)){case"label":e.group.label=C(t,n);return;case"summary":e.group.summary=C(t,n);return;case"color":e.group.color=C(t,n);return;case"tags":e.group.tags=me(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=ke(C(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Xs(e,t,n){switch(Se(t,e.seenFields,n)){case"from":e.relation.from=C(t,n);return;case"to":e.relation.to=C(t,n);return;case"kind":e.relation.kind=C(t,n);return;case"label":e.relation.label=C(t,n);return;case"summary":e.relation.summary=C(t,n);return;case"tags":e.relation.tags=me(t.slice(1),n,"tags");return;case"color":e.relation.color=C(t,n);return;case"hidden":e.relation.hidden=ke(C(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Ks(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(Zs(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new p(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let i=n[1].value;if(!i.trim())throw new p("Event pose object id must not be empty",r,n[1].column);let a={objectId:i,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new p('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(Se(n,e.seenFields,r)){case"kind":e.event.kind=C(n,r);return;case"label":e.event.label=C(n,r);return;case"summary":e.event.summary=C(n,r);return;case"target":e.event.targetObjectId=C(n,r);return;case"participants":e.event.participantObjectIds=me(n.slice(1),r,"participants");return;case"timing":e.event.timing=C(n,r);return;case"visibility":e.event.visibility=C(n,r);return;case"tags":e.event.tags=me(n.slice(1),r,"tags");return;case"color":e.event.color=C(n,r);return;case"hidden":e.event.hidden=ke(C(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new p(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Zs(e,t,n){if(e.length<2)throw new p("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Ms.has(r))throw new p(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new p(`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 Js(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"||Ls.has(o)){o!=="info"&&se(e.sourceSchemaVersion,e.diagnostics,o,{line:r,column:n[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=Xr(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new p(`Duplicate info key "${o.key}"`,r,n[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,a=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(a.has(o.key))throw new p(`Duplicate ${i} key "${o.key}"`,r,n[0].column);a.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(ol(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function Se(e,t,n){if(e.length<2)throw new p("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new p(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function C(e,t){if(e.length<2)throw new p("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Qs(e,t){return me(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function el(e,t,n,r){let o={};for(let i of me(e,t,"layers")){let a=!i.startsWith("-")&&!i.startsWith("!"),s=i.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){o["orbits-back"]=a,o["orbits-front"]=a;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata")&&(s==="events"&&n&&r&&se(n,r,"layers.events",{line:t,column:e[0]?.column??1}),o[s]=a)}return o}function me(e,t,n){if(e.length===0)throw new p(`Missing value for atlas field "${n}"`,t,1);let r=e.map(o=>o.value).filter(Boolean);if(r.length===0)throw new p(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Hr(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new p(`Unknown projection "${e}"`,t,n);return r}function qr(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new p(`Unknown render preset "${e}"`,t,n)}function tl(e,t,n,r){let o=Gr(e,t,n,r);if(o<=0)throw new p(`Field "${r}" must be greater than zero`,t,n);return o}function Gr(e,t,n,r){let o=Number(e);if(!Number.isFinite(o))throw new p(`Invalid numeric value "${e}" for "${r}"`,t,n);return o}function nl(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function rl(e,t,n,r,o){let i=[],a=0;for(;a<e.length;){let s=e[a],l=ft(s.value);if(!l)throw new p(`Unknown field "${s.value}"`,t,s.column);l.version==="2.1"&&se(r,o,s.value,{line:t,column:s.column}),a++;let c=[];if(l.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(l.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!Ts.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new p(`Missing value for field "${s.value}"`,t,s.column);i.push({type:"field",key:s.value,values:c.map(u=>u.value),location:{line:t,column:s.column}})}return Qr(i,n),i}function ol(e,t,n,r,o){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);let i=ft(e[0].value);if(!i)throw new p(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&se(r,o,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return Qr([a],n),a}function Xr(e,t,n){if(e.length<2)throw new p(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 il(e,t,n){let r=Kr(e.fields),o=Zr(r),i=ll(e.objectType,r),a=ml(r.get("groups")?.[0]),s=Ur(r.get("epoch")?.[0]),l=Ur(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?ke(le(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?dl(r.get("resonance")[0]):void 0,f=ul(r),b=r.get("derive")?.map(I=>fl(I)),w=r.get("validate")?.map(I=>({rule:le(I)})),$=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,v=r.get("tolerance")?.map(I=>pl(I)),S=cl(e.typedBlockEntries),L=Jr(e.infoEntries,"info"),h={type:e.objectType,id:e.id,properties:i,placement:o,info:L};return a.length>0&&(h.groups=a),s&&(h.epoch=s),l&&(h.referencePlane=l),c!==void 0&&(h.tidalLock=c),u&&(h.resonance=u),f&&(h.renderHints=f),b?.length&&(h.deriveRules=b),w?.length&&(h.validationRules=w),$?.length&&(h.lockedFields=$),v?.length&&(h.tolerances=v),S&&Object.keys(S).length>0&&(h.typedBlocks=S),t!=="2.1"&&(h.groups||h.epoch||h.referencePlane||h.tidalLock!==void 0||h.resonance||h.renderHints||h.deriveRules?.length||h.validationRules?.length||h.lockedFields?.length||h.tolerances?.length||h.typedBlocks)&&se(t,n,e.id,e.location),h}function al(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>sl(n))}}function sl(e){let t=Kr(e.fields),n=Zr(t);return{objectId:e.objectId,placement:n,inner:je(t.get("inner")?.[0],"inner"),outer:je(t.get("outer")?.[0],"outer")}}function Kr(e){let t=new Map;for(let n of e){let r=ft(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw p.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=t.get(n.key)??[];o.push(n),t.set(n.key,o)}return t}function Zr(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 a=t??n??r??o;throw p.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:le(t),distance:je(e.get("distance")?.[0],"distance"),semiMajor:je(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:hl(e.get("eccentricity")?.[0],"eccentricity"),period:je(e.get("period")?.[0],"period"),angle:je(e.get("angle")?.[0],"angle"),inclination:je(e.get("inclination")?.[0],"inclination"),phase:je(e.get("phase")?.[0],"phase")};if(n){let a=le(n);return{mode:"at",target:a,reference:Cr(a,n.location)}}if(r)return{mode:"surface",target:le(r)};if(o){let a=le(o),s=Sn(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function ll(e,t){let n={};for(let[r,o]of t.entries()){let i=o[0],a=ft(r);!i||!a?.legacySchema||a.legacySchema.placement||(On(r,e,i.location),n[r]=Rr(r,i.values,i.location))}return n}function Jr(e,t){let n={};for(let r of e){if(r.key in n)throw p.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function cl(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Jr(r,n))}return t}function ul(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return n&&(t.renderLabel=ke(le(n),"renderLabel",n.location)),r&&(t.renderOrbit=ke(le(r),"renderOrbit",r.location)),o&&(t.renderPriority=Vt(le(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function dl(e){if(e.values.length!==2)throw p.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw p.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function fl(e){if(e.values.length!==2)throw p.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function pl(e){if(e.values.length!==2)throw p.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Sn(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ml(e){return e?[...new Set(e.values)]:[]}function Ur(e){return e&&e.values.join(" ").trim()||null}function je(e,t){return e?jn(le(e),e.location,t):void 0}function hl(e,t){return e?Vt(le(e),t,e.location):void 0}function le(e){return ct(e.values,e.key,e.location)}function ft(e){return Rt.get(e)}function Qr(e,t){for(let n of e){let r=ft(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){On(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function se(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 gl(e){let t=[...e],n=[],r=!1,o=!1,i=null,a=1,s=1;for(let l=0;l<t.length;l++){let c=t[l],u=t[l+1];if(o){if(c==="*"&&u==="/"){t[l]=" ",t[l+1]=" ",o=!1,i=null,l++,s+=2;continue}c!==`
|
|
5
|
-
`&&c!=="\r"&&(t[
|
|
6
|
-
`?(a++,
|
|
7
|
-
`&&t[f]!=="\r";)t[f]=" ",f++;
|
|
8
|
-
`?(a++,
|
|
9
|
-
`}function
|
|
10
|
-
`&&
|
|
11
|
-
`&&t[
|
|
12
|
-
`),info:o,startLine:i,endLine:c}),r=!1,o=null,i=0,a=[];return}a.push(s)}),n}function po(e){let t=Ie(e),n=be(t);return ye(n),{ast:t,document:n}}function jl(e){let t=po(e);return{...t,scene:re(t.document)}}function Sl(e){return he(e)}function Ol(e){return jt(e)}function Al(e,t={}){return Pt(e,t)}var Ll={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},pt={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 Nt(e){return e?typeof e=="string"?pt[e]??pt.atlas:{...pt.atlas,...e}:pt.atlas}function Ut(e){return{...Ll,...e}}function mo(e){return pt[e]}function ie(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Vn(e.objectTypes??[]),tags:Vn((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Vn((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Tl(t)?t:null}function Tl(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Wt(e,t){let n=ie(t),r=new Set;for(let o of e.objects)if(!o.hidden&&Ml(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 Yt(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:El(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=>ho(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,n).map(o=>ho(o,1))}function go(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:ie(n)}}function Ht(e){return encodeURIComponent(JSON.stringify(e))}function qt(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:ie(t.filter??null)}}function bo(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 Gt(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 Xt(e){return e?.filter?ie({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function ho(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 Ml(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=yo(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>n.includes(o)))return!1}return!0}function El(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),o=yo(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(l=>o.includes(l))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(l=>typeof l=="string"):[]).some(l=>l.toLowerCase()===t)&&(i+=18),i}function yo(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 Vn(e){return[...new Set(e)]}var Oe={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Cn(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function mt(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Ee(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Kt(e,t){return{...e,rotationDeg:Cn(e.rotationDeg+t)}}function Ye(e,t,n,r,o){if(!Number.isFinite(n)||n<=0)return t;let i=Fe(e),a=mt(t.scale*n,o);if(a===t.scale)return t;let s=a/t.scale,l=r.x-i.x,c=r.y-i.y;return{...t,scale:a,translateX:(1-s)*l+s*t.translateX,translateY:(1-s)*c+s*t.translateY}}function De(e,t,n){let r=Fe(e),o=Dl(e.contentBounds,r,t.rotationDeg),i=Math.max(e.width-n.fitPadding*2,1),a=Math.max(e.height-n.fitPadding*2,1),s=Math.max(o.width,1),l=Math.max(o.height,1),c=mt(Math.min(i/s,a/l),n),u=pe({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:c,translateX:r.x-(r.x+(u.x-r.x)*c),translateY:r.y-(r.y+(u.y-r.y)*c)}}function Zt(e,t,n,r){let o=e.objects.find(l=>l.objectId===n&&!l.hidden);if(!o)return t;let i=Fe(e),a=mt(Math.max(t.scale,1.8),r),s=pe({x:o.x,y:o.y},i,t.rotationDeg);return{...t,scale:a,translateX:i.x-(i.x+(s.x-i.x)*a),translateY:i.y-(i.y+(s.y-i.y)*a),selectedObjectId:n}}function Jt(e,t){let n=Fe(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function He(e,t,n){let r=Fe(e),o={x:n.x-t.translateX,y:n.y-t.translateY},i={x:o.x-r.x,y:o.y-r.y},a={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},s=pe({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+s.x,y:r.y+s.y}}function Qt(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(s=>He(e,t,s)),r=Math.min(...n.map(s=>s.x)),o=Math.min(...n.map(s=>s.y)),i=Math.max(...n.map(s=>s.x)),a=Math.max(...n.map(s=>s.y));return{minX:r,minY:o,maxX:i,maxY:a,width:i-r,height:a-o,centerX:r+(i-r)/2,centerY:o+(a-o)/2}}function Fe(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(l=>pe(l,t,n)),o=Math.min(...r.map(l=>l.x)),i=Math.min(...r.map(l=>l.y)),a=Math.max(...r.map(l=>l.x)),s=Math.max(...r.map(l=>l.y));return{minX:o,minY:i,maxX:a,maxY:s,width:a-o,height:s-i,centerX:o+(a-o)/2,centerY:i+(s-i)/2}}var tn="worldorbit-camera-root";function ce(e,t={}){let n=Nt(t.theme),r=Kl(t.preset??e.renderPreset??void 0),o=Ut({...r.layers,...t.layers}),i=t.subtitle??e.subtitle,a=Wt(e,t.filter??null),s=e.objects.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>o.structures||!en(h.object)).sort((h,I)=>h.sortKey-I.sortKey),l=e.labels.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>o.structures||!en(h.object)),c=Cl(s),u=o.orbits?Vl(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>o.structures||!en(h.object)).map(h=>`<line class="wo-leader wo-leader-${h.mode}" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${G(h.renderId)}" data-group-id="${Z(h.groupId??"")}" />`).join(""):"",b=o.relations?e.relations.filter(h=>!h.hidden).filter(h=>a.has(h.fromObjectId)&&a.has(h.toObjectId)).map(h=>`<line class="wo-relation" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${G(h.renderId)}" data-relation-id="${Z(h.relationId)}" />`).join(""):"",w=o.events?e.events.filter(h=>!h.hidden).map(h=>Fl(e,h,a,n)).join(""):"",$=o.objects?s.map(h=>Rl(h,t.selectedObjectId??null,n)).join(""):"",v=o.labels?l.map(h=>Bl(e,h,t.selectedObjectId??null)).join(""):"",S=o.metadata?`<text class="wo-title" x="56" y="64">${G(e.title)}</text>
|
|
13
|
-
<text class="wo-subtitle" x="56" y="88">${
|
|
14
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${
|
|
1
|
+
var WorldOrbit=(()=>{var $n=Object.defineProperty;var po=Object.getOwnPropertyDescriptor;var mo=Object.getOwnPropertyNames;var ho=Object.prototype.hasOwnProperty;var go=(e,t)=>{for(var n in t)$n(e,n,{get:t[n],enumerable:!0})},bo=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of mo(t))!ho.call(e,i)&&i!==n&&$n(e,i,{get:()=>t[i],enumerable:!(r=po(t,i))||r.enumerable});return e};var yo=e=>bo($n({},"__esModule",{value:!0}),e);var Bc={};go(Bc,{DEFAULT_VIEWER_STATE:()=>Ee,WORLDORBIT_FIELD_KEYS:()=>cr,WORLDORBIT_FIELD_SCHEMAS:()=>In,WORLDORBIT_OBJECT_TYPES:()=>rt,WORLD_LAYER_ID:()=>un,WorldOrbitError:()=>p,clampScale:()=>wt,cloneAtlasDocument:()=>Gt,composeViewerTransform:()=>sn,createAtlasViewer:()=>pn,createDiagnostic:()=>mr,createEmbedPayload:()=>Ki,createEmptyAtlasDocument:()=>Nn,createInteractiveViewer:()=>De,createWorldOrbitEmbedMarkup:()=>Zi,defineWorldOrbitViewerElement:()=>to,deserializeViewerAtlasState:()=>tn,deserializeWorldOrbitEmbedPayload:()=>nr,detectWorldOrbitSchemaVersion:()=>Gn,diagnosticFromError:()=>ie,extractWorldOrbitBlocks:()=>Si,fitViewerState:()=>ze,focusViewerState:()=>an,formatAtlasDocument:()=>Bt,formatDocument:()=>_t,formatDraftDocument:()=>Mn,getAtlasDocumentNode:()=>Un,getFieldSchema:()=>ne,getSceneCenter:()=>Be,getThemePreset:()=>Ai,getViewerVisibleBounds:()=>ln,invertViewerPoint:()=>Ze,isKnownFieldKey:()=>xn,listAtlasDocumentPaths:()=>hi,load:()=>Hl,loadWorldOrbitSource:()=>be,loadWorldOrbitSourceWithDiagnostics:()=>Xn,materializeAtlasDocument:()=>pt,materializeDraftDocument:()=>Rr,mountWorldOrbitEmbeds:()=>Ji,normalizeDocument:()=>$e,normalizeRotation:()=>Zn,normalizeViewerFilter:()=>oe,normalizeWithDiagnostics:()=>hr,panViewerState:()=>Re,parse:()=>Oi,parseSafe:()=>ql,parseWithDiagnostics:()=>Tt,parseWorldOrbit:()=>Oe,parseWorldOrbitAtlas:()=>Ht,parseWorldOrbitDraft:()=>oi,removeAtlasDocumentNode:()=>bi,render:()=>Yl,renderDocumentToScene:()=>re,renderDocumentToSvg:()=>er,renderSceneToSvg:()=>ue,renderSourceToSvg:()=>Ci,resolveAtlasDiagnosticPath:()=>Hn,resolveAtlasDiagnostics:()=>Yn,resolveLayers:()=>Zt,resolveTheme:()=>Kt,rotatePoint:()=>he,rotateViewerState:()=>on,sceneViewpointToLayerOptions:()=>nn,searchSceneObjects:()=>Qt,serializeViewerAtlasState:()=>en,serializeWorldOrbitEmbedPayload:()=>tr,stringify:()=>Gl,supportsObjectType:()=>kn,tokenizeLine:()=>ur,tokenizeLineDetailed:()=>Fe,unitFamilyAllowsUnit:()=>it,updateAtlasDocumentNode:()=>gi,upgradeDocumentToDraftV2:()=>zt,upgradeDocumentToV2:()=>ft,upsertAtlasDocumentNode:()=>Wn,validateAtlasDocumentWithDiagnostics:()=>yi,validateDocument:()=>Ie,validateDocumentWithDiagnostics:()=>gr,viewpointToViewerFilter:()=>rn,zoomViewerStateAt:()=>Ke});var p=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 nt=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ae=nt.filter(e=>e!=="system"),wo=["star","planet","moon","asteroid","comet","structure","phenomenon"],lr=["structure","phenomenon"],Se=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],vo=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function L(e,t){return{key:e,...t}}var rt=new Set(nt),In=new Map([L("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Se}),L("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Se,unitFamily:"distance"}),L("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Se,unitFamily:"distance"}),L("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Se}),L("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Se,unitFamily:"duration"}),L("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Se,unitFamily:"angle"}),L("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Se,unitFamily:"angle"}),L("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Se,unitFamily:"angle"}),L("at",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),L("surface",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),L("free",{kind:"string",placement:!0,arity:"single",objectTypes:vo}),L("kind",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),L("class",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),L("culture",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),L("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:nt}),L("color",{kind:"string",placement:!1,arity:"single",objectTypes:nt}),L("image",{kind:"string",placement:!1,arity:"single",objectTypes:wo}),L("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:nt}),L("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"radius"}),L("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"mass"}),L("density",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"generic"}),L("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"generic"}),L("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"generic"}),L("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:ae}),L("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),L("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),L("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),L("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),L("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),L("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),L("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),L("on",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),L("source",{kind:"string",placement:!1,arity:"single",objectTypes:ae}),L("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:ae,unitFamily:"duration"})].map(e=>[e.key,e])),cr=new Set(In.keys());function ne(e){return In.get(e)}function xn(e){return cr.has(e)}function kn(e,t){return e.objectTypes.includes(t)}function it(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 ur(e){return Fe(e).map(t=>t.value)}function Fe(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],b=r+u+1;if(l&&f==="\\"){let w=e[u+1];if(w==='"'||w==="\\"){i+=w,u++;continue}}if(f==='"'){l?l=!1:(o===null&&(o=b),a=!0,s=b,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=b),i+=f}if(l)throw new p("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Ot(e){return e.match(/^\s*/)?.[0].length??0}function Oe(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=Ot(l),u=Fe(l.slice(c),{line:s,columnOffset:c});if(u.length!==0){if(c===0){i=!1,o=null;let f=$o(u,s);n.push(f),r=f;continue}if(!r)throw new p("Indented line without parent object",s,c+1);if(u.length===1&&u[0].value==="info"){i=!0,o=c;continue}i&&c<=(o??0)&&(i=!1),i?r.infoEntries.push(ko(u,s)):r.blockFields.push(xo(u,s))}}return{type:"document",objects:n}}function $o(e,t){if(e.length<2)throw new p("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!rt.has(n.value))throw new p(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Io(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Io(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=ne(i.value);if(!o)throw new p(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!xn(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new p(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function xo(e,t){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);if(!ne(e[0].value))throw new p(`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 ko(e,t){if(e.length<2)throw new p("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 dr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,jo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),So=/^[A-Za-z][A-Za-z0-9+.-]*:/;function $e(e){let t=null,n=[];for(let r of e.objects){let i=Oo(r);if(r.objectType==="system"){if(t)throw p.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 Oo(e){let t=[...e.inlineFields,...e.blockFields];Ao(e.objectType,t);let n=Lo(t),r=To(e.objectType,n),i=Mo(n),o=Do(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 Ao(e,t){for(let n of t){let r=ne(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(!kn(r,e))throw p.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Lo(e){let t=new Map;for(let n of e){if(t.has(n.key))throw p.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function To(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw p.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw p.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:At(t,"orbit"),distance:We(t,"distance"),semiMajor:We(t,"semiMajor"),eccentricity:Vo(t,"eccentricity"),period:We(t,"period"),angle:We(t,"angle"),inclination:We(t,"inclination"),phase:We(t,"phase")};if(r){let l=Lt(t,"at"),s=At(t,"at");return{mode:"at",target:s,reference:Fo(s,l.location)}}if(i)return{mode:"surface",target:At(t,"surface")};if(o){let l=At(t,"free"),s=Co(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function Mo(e){let t={};for(let[n,r]of e.entries()){let i=ne(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Ro(r);break;case"number":t[n]=pr(Ye(r),n,r.location);break;case"unit":t[n]=fr(Ye(r),r.location,n);break;case"string":t[n]=Po(n,r);break}}return t}function Po(e,t){let n=t.values.join(" ").trim();return e==="image"&&Eo(n,t.location),n}function Eo(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(So);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Do(e){let t={};for(let n of e){if(n.key in t)throw p.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Fo(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.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 p.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 fr(e,t,n){let r=e.match(dr);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=ne(n);if(o?.unitFamily&&!it(o.unitFamily,i.unit))throw p.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Co(e){let t=e.match(dr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function We(e,t){if(!e.has(t))return;let n=Lt(e,t);return fr(Ye(n),n.location,t)}function Vo(e,t){if(!e.has(t))return;let n=Lt(e,t);return pr(Ye(n),t,n.location)}function pr(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Ro(e){let t=Ye(e).toLowerCase(),n=jo.get(t);if(n===void 0)throw p.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Lt(e,t){let n=e.get(t);if(!n)throw new p(`Missing value for key "${t}"`);return n}function At(e,t){return Ye(Lt(e,t))}function Ye(e){if(e.values.length!==1)throw p.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var zo=new Set(["star","planet","moon","asteroid","comet"]);function Ie(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new p(`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 p(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!zo.has(i.type))throw new p(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Bo(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&_o(r,r.placement.reference,t))}}function Bo(e,t,n){if(!n.has(t.primary))throw new p(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new p(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function _o(e,t,n){if(!n.has(t.objectId))throw new p(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function mr(e){return{...e}}function ie(e,t,n=`${t}.failed`){return e instanceof p?{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)}}function Tt(e){let t;try{t=Oe(e)}catch(r){return{ok:!1,value:null,diagnostics:[ie(r,"parse")]}}let n;try{n=$e(t)}catch(r){return{ok:!1,value:null,diagnostics:[ie(r,"normalize")]}}try{Ie(n)}catch(r){return{ok:!1,value:null,diagnostics:[ie(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function hr(e){try{return{ok:!0,value:$e(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[ie(t,"normalize")]}}}function gr(e){try{return Ie(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[ie(t,"validate")]}}}var ot=1495978707e-1,No=6371,Uo=71492,Wo=695700,Yo=63241.077,Ho=206264.806,qo=206264806,xr=.68,Go=.2,kr=28;function re(e,t={}){let n=Zo(t),r=n.width,i=n.height,o=n.padding,a=Ko(e),l=Qo(e,t.projection),s=Tn(t.camera??null),c=Ln(l,s),u=na(a,t.scaleModel),f=ia(a),b=e.system?.id??null,w=t.activeEventId??null,I=Xo(e.objects,e.events??[],w),v=new Map(I.map(k=>[k.id,k])),S=_a(I,v),A=new Map,h=[],$=[],Y=[],C=[],M=[],N=new Map,P=new Map;for(let k of I){let ee=k.placement;if(!ee){Y.push(k);continue}if(ee.mode==="orbit"){vr(P,ee.target,k);continue}if(ee.mode==="surface"){vr(N,ee.target,k);continue}if(ee.mode==="at"){M.push(k);continue}C.push(k)}let J=C.length>0?r*.42:r/2,z=i/2,U={orbitChildren:P,surfaceChildren:N,objectMap:v,spacingFactor:f,projection:c,scaleModel:u},H=Y.find(k=>k.type==="star")??Y[0]??null;H&&Sn(H,J,z,0,A,h,$,U);let D=Y.filter(k=>k.id!==H?.id);if(D.length>0){let k=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;D.forEach((ee,V)=>{let ve=ut(V,D.length,-Math.PI/2),le=dt(ve,k,c,1);Sn(ee,J+le.x,z+le.y,0,A,h,$,U)})}C.forEach((k,ee)=>{let V=r-o-140-qa(k.placement?.mode==="free"?k.placement.distance:void 0,u),ve=Math.max(76,(i-o*2-180)/Math.max(1,C.length)*f)*u.freePlacementMultiplier,le=o+92+ee*ve;A.set(k.id,{object:k,x:V,y:le,radius:Ft(k,0,u),sortKey:Vt(V,le,0)}),$.push({object:k,groupId:S.groupIds.get(k.id)??null,x1:V-60,y1:le,x2:V-18,y2:le,mode:"free"}),Et(k,A,h,$,U,1)}),M.forEach((k,ee)=>{if(A.has(k.id)||!k.placement||k.placement.mode!=="at")return;let V=za(k.placement.reference,A,v,ee,M.length,r,i,o,U);A.set(k.id,{object:k,x:V.x,y:V.y,radius:Ft(k,2,u),sortKey:Vt(V.x,V.y,2),anchorX:V.anchorX,anchorY:V.anchorY}),V.anchorX!==void 0&&V.anchorY!==void 0&&$.push({object:k,groupId:S.groupIds.get(k.id)??null,x1:V.anchorX,y1:V.anchorY,x2:V.x,y2:V.y,mode:"at"}),Et(k,A,h,$,U,2)});let q=[...A.values()].map(k=>oa(k,u,S)),te=h.map(k=>aa(k,S.groupIds.get(k.object.id)??null)),y=$.map(k=>sa(k)),x=la(q,r,i,u.labelMultiplier),B=ga(e,q),fe=ba(e.events??[],q,w),_e=pa(te,B,fe,y,q,x),kt=ma(q,te,y,x,S,u.labelMultiplier),_=ha(e,q),we=ya(e,l,n.preset,S,v),Q=Ta(r,i,q,te,y,x,u.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ta(l,c,a,s),systemId:b,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:Q,layers:_e,groups:kt,semanticGroups:_,viewpoints:we,events:fe,activeEventId:w,objects:q,orbitVisuals:te,relations:B,leaders:y,labels:x}}function he(e,t,n){let r=Rt(n),i=Math.cos(r),o=Math.sin(r),a=e.x-t.x,l=e.y-t.y;return{x:t.x+a*i-l*o,y:t.y+a*o+l*i}}function Xo(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function Ko(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 Zo(e){let t=Jo(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Jo(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 Qo(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return Or(n)??"topdown"}function Ln(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 Tn(e){if(!e)return null;let t={azimuth:jn(e.azimuth),elevation:jn(e.elevation),roll:jn(e.roll),distance:ea(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function jn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ea(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ta(e,t,n,r){let i=[`${$r(e)} view`,`${$r(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 na(e,t){return{...ra(e),...t}}function ra(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 ia(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function oa(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:He(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:a,visualRadius:Ha(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Xa(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function aa(e,t){return{renderId:`${He(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 sa(e){return{renderId:`${He(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 la(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(ca);for(let s of l){let c=ua(s,a,o,t,n,r)??Sr(s,jr(s,a.get(s.parentId??"")??null,n),0,r);o.push(Pr(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function ca(e,t){let n=br(e)-br(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 br(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 ua(e,t,n,r,i,o){for(let a of da(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=Sr(e,a,s,o),u=Pr(e,c,o);if(!n.some(f=>Wa(f,u)))return c}}return null}function da(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=jr(e,i,r),a=o==="below"?"above":"below",l=fa(e,i,n),s=l==="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"?[l,o,s,a]:[o,l,a,s]}function jr(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 fa(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 Sr(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),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function pa(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ma(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ct(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Na(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ha(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 ga(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:`${He(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 ba(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])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${He(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function ya(e,t,n,r,i){let o=wa(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,b,...w]=c.split(".");if(f!=="viewpoint"||!b||w.length===0)continue;let I=Oa(b);if(!I)continue;let v=w.join(".").toLowerCase(),S=a.get(I)??{id:I};va(S,v,u,e,t,n,r,i),a.set(I,S)}let l=[...a.values()].map(c=>$a(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function wa(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=Tn(null),a=Ln(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:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function va(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=lt(s);return;case"projection":case"view":e.projection=Or(s)??i;return;case"preset":e.preset=xa(s)??o;return;case"rotation":case"angle":e.rotationDeg=at(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Pt(),azimuth:at(s)};return;case"camera.elevation":e.camera={...e.camera??Pt(),elevation:at(s)};return;case"camera.roll":e.camera={...e.camera??Pt(),roll:at(s)};return;case"camera.distance":e.camera={...e.camera??Pt(),distance:yr(s)};return;case"zoom":case"scale":e.scale=yr(s);return;case"layers":e.layers=ka(s);return;case"query":e.filter={...e.filter??Mt(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Mt(),objectTypes:ja(s)};return;case"tags":e.filter={...e.filter??Mt(),tags:lt(s)};return;case"groups":e.filter={...e.filter??Mt(),groupIds:Sa(s,r,a,l)};return}}function $a(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,a=Ia(e.filter),l=e.label?.trim()||Aa(e.id),s=e.projection??t,c=Tn(e.camera??null),u=Ln(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||La(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Mt(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Pt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ia(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 Or(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function xa(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function at(e){let t=Number(e);return Number.isFinite(t)?t:null}function yr(e){let t=at(e);return t!==null&&t>0?t:null}function ka(e){let t={};for(let n of lt(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 ja(e){return lt(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Sa(e,t,n,r){return lt(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)??st(i):(r.has(i),st(i)))}function lt(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Oa(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Aa(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function La(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 Ta(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(b,w)=>{l=Math.min(l,b),s=Math.min(s,w),c=Math.max(c,b),u=Math.max(u,w)};for(let b of r)b.hidden||Ar(b,f);for(let b of i)b.hidden||(f(b.x1,b.y1),f(b.x2,b.y2));for(let b of n)b.hidden||Lr(b,f);for(let b of o)b.hidden||Tr(b,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?ct(0,0,e,t):ct(l,s,c,u)}function Ar(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=Dr(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,kr*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function ct(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 Lr(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 Tr(e,t,n){let r=Er(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 Sn(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ft(e,r,l.scaleModel),sortKey:Vt(t,n,r)}),Et(e,i,o,a,l,r+1))}function Et(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(Ma),s=Pa(l,a.radius,i.spacingFactor,i.scaleModel),c=Fa(l,s);l.forEach((f,b)=>{let w=Ea(f,b,l.length,a,s,c[b]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:w.kind,cx:w.cx,cy:w.cy,radius:w.radius,rx:w.rx,ry:w.ry,rotationDeg:w.rotationDeg,band:w.band,bandThickness:w.bandThickness,frontArcPath:w.frontArcPath,backArcPath:w.backArcPath}),Sn(f,w.objectX,w.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,b)=>{let w=ut(b,u.length,-Math.PI/3),I=28*i.spacingFactor,v=dt(w,a.radius,i.projection,i.projection==="isometric"?.9:1),S=dt(w,a.radius+I,i.projection,i.projection==="isometric"?.9:1),A=a.x+v.x,h=a.y+v.y,$=a.x+S.x,Y=a.y+S.y;t.set(f.id,{object:f,x:$,y:Y,radius:Ft(f,o+1,i.scaleModel),sortKey:Vt($,Y,o+1),anchorX:A,anchorY:h}),r.push({object:f,groupId:i.objectMap.has(f.id)?st(Ua(f,i.objectMap)):null,x1:A,y1:h,x2:$,y2:Y,mode:"surface"}),Et(f,t,n,r,i,o+1)})}function Ma(e,t){let n=Dt(e),r=Dt(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 Pa(e,t,n,r){let i=e.map(f=>Dt(f)),o=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...o),c=Math.max(...o),u=c-s;return{metrics:i,minMetric:s,maxMetric:c,metricSpread:u,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function Ea(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let P=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:P,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-P}}let c=G(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),b=An(l.inclination)??0,w=a.projection==="isometric"?Math.max(Go,Math.cos(Rt(b)))*xr:1,I=Math.max(f*w,u*.14),v=An(l.angle)??0,S=u*c,A=Cr(-S,0,v),h=r.x+A.x,$=r.y+A.y,Y=Va(l.phase,t,n),C=Fr(h,$,u,I,v,Y),M=a.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,N=s?Ra(e,u,i,a.scaleModel):void 0;return{kind:M?"circle":"ellipse",cx:M?r.x:h,cy:M?r.y:$,radius:M?u:void 0,rx:M?void 0:u,ry:M?void 0:I,rotationDeg:v,band:s,bandThickness:N,frontArcPath:a.projection==="isometric"||s?wr(h,$,u,I,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?wr(h,$,u,I,v,Math.PI,Math.PI*2):void 0,objectX:C.x,objectY:C.y}}function Da(e,t){return t.innerPx+t.stepPx*Ca(Math.max(e,0)+1)}function Fa(e,t){let n=[];return e.forEach((r,i)=>{let o=Dt(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Da(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Dt(e){return!e.placement||e.placement.mode!=="orbit"?null:Ct(e.placement.semiMajor??e.placement.distance??null)}function Ca(e){return Math.log(e)/Math.log(2)}function Va(e,t,n){let r=e?An(e):null;return r!==null?Rt(r-90):ut(t,n,-Math.PI/2)}function Ra(e,t,n,r){let i=Ct(On(e.properties.inner)),o=Ct(On(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return G(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return G(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function za(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Ba(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=ut(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,b=dt(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=ut(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,b=dt(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Ba(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Ya(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,f=s/c,b=-f,w=u,I=G(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*I,y:a.y-f*I,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*I,y:a.y+f*I,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*I,y:o.y-f*I,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-b*.8660254)*I,y:a.y+(f*.5-w*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+b*.8660254)*I,y:a.y+(f*.5+w*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function _a(e,t){let n=new Map,r=new Map;for(let c of e){let u=Mr(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let f=new Set,b=[],w=n.get(c)??null;for(;w&&!f.has(w);)b.push(w),f.add(w),w=n.get(w)??null;return i.set(c,b),b},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,b=t.get(c),w=c;return b?.placement&&b.placement.mode!=="free"&&f&&(w=s(f)),w};for(let c of e){l(c.id);let u=s(c.id),f=st(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function Mr(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 Na(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,b)=>{a=Math.min(a,f),l=Math.min(l,b),s=Math.max(s,f),c=Math.max(c,b)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Lr(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Ar(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&Tr(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?ct(0,0,0,0):ct(a,l,s,c)}function Ua(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=Mr(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function Pr(e,t,n){return Er(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Er(e,t,n,r,i,o,a,l){let s=Ka(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,b=e-s,w=e+s;return r==="start"?(b=e,w=e+c):r==="end"&&(b=e-c,w=e),{left:b,right:w,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function Wa(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ya(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ft(e,t,n){let r=Ga(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return G((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return G(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return G(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return G(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return G(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return G(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return G(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return G(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return G(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Ha(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 Ct(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ot;case"m":return e.value/1e3/ot;case"ly":return e.value*Yo;case"pc":return e.value*Ho;case"kpc":return e.value*qo;case"re":return e.value*No/ot;case"rj":return e.value*Uo/ot;case"sol":return e.value*Wo/ot;default:return e.value}}function qa(e,t){let n=Ct(e??null);return n===null||n<=0?0:G(n*96*t.freePlacementMultiplier,0,420)}function Ga(e,t){let n=On(e);if(!n)return null;let r;switch(n.unit){case"sol":r=G(n.value*22,14,40);break;case"re":r=G(n.value*10,6,18);break;case"km":r=G(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=G(n.value*4,4,20);break}return G(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function On(e){return!e||typeof e!="object"||!("value"in e)?null:e}function An(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ut(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function wr(e,t,n,r,i,o,a){let l=Dr(e,t,n,r,i,o,a,kr);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Ir(s.x)} ${Ir(s.y)}`).join(" ")}function Dr(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(Fr(e,t,n,r,i,u))}return s}function Fr(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=Cr(a,l,i);return{x:e+s.x,y:t+s.y}}function Cr(e,t,n){let r=Rt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function dt(e,t,n,r){let i=n==="isometric"?xr*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Vt(e,t,n){return t*1e3+e+n*.01}function G(e,t,n){return Math.min(Math.max(e,t),n)}function vr(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function He(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function st(e){return`${He(e)}-group`}function Xa(e){return typeof e=="string"&&e.trim()?e:void 0}function Ka(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 $r(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Rt(e){return e*Math.PI/180}function Ir(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ft(e,t={}){let n=re(e,t),r=[],i=Qa(e,r),o=es(e,r),a=Ja(e,n.renderPreset??t.preset??null,n.projection),l=e.system?Za(e,a,i,o,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(s=>!s.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(s=>!s.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:l,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(zr),diagnostics:r}}function zt(e,t={}){return ds(ft(e,t))}function pt(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:ls(e.system),info:cs(e.system)}:null,r=e.objects.map(zr);return is(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(ns),objects:r}}function Rr(e){return pt(e)}function Za(e,t,n,r,i,o){let a=re(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:a.viewpoints.map(ts),annotations:r}}function Ja(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 Qa(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 es(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,o,...a]=r.split(".");if(!o||a.length===0)continue;let l=Vr(o);if(!l)continue;let s=n.get(l)??{id:l};switch(a.join(".").toLowerCase()){case"label":s.label=i;break;case"target":case"object":s.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":s.body=i;break;case"tags":s.tags=as(i);break}n.set(l,s)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let o=Vr(`${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(a=>typeof a=="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??ss(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 ts(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 zr(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:os(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ns(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(rs)}}function rs(e){return{objectId:e.objectId,placement:Br(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 Br(e){return e?structuredClone(e):null}function is(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=Br(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function os(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 as(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Vr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ss(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ls(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 cs(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=us(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 us(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 ds(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var _r=["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 _t(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 s=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"}:zt(e);return Mn(s)}let l=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"}:ft(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&l.version!==n?Bt({...l,version:n,schemaVersion:n}):Bt(l)}let i=[],o=e;o.system&&i.push(...fs(o.system));let a=[...o.objects].sort(Dn);for(let l of a)i.length>0&&i.push(""),i.push(...ms(l));return i.join(`
|
|
2
|
+
`)}function Bt(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Ur(e.system));for(let r of[...e.groups].sort(qe))t.push(""),t.push(...qr(r));for(let r of[...e.relations].sort(qe))t.push(""),t.push(...Gr(r));for(let r of[...e.events].sort(qe))t.push(""),t.push(...Xr(r));let n=[...e.objects].sort(Dn);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Wr(r))}),t.join(`
|
|
3
|
+
`)}function Mn(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(...Ur(t.system));for(let i of[...t.groups].sort(qe))n.push(""),n.push(...qr(i));for(let i of[...t.relations].sort(qe))n.push(""),n.push(...Gr(i));for(let i of[...t.events].sort(qe))n.push(""),n.push(...Xr(i));let r=[...t.objects].sort(Dn);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,o)=>{o>0&&n.push(""),n.push(...Wr(i))}),n.join(`
|
|
4
|
+
`)}function fs(e){return ps("system",e.id,e.properties,null,e.info)}function ps(e,t,n,r,i){let o=[`${e} ${t}`],a=[...Pn(r),...Hr(n)];for(let s of a)o.push(` ${s}`);let l=Object.entries(i).sort(([s],[c])=>s.localeCompare(c));if(l.length>0){a.length>0&&o.push(""),o.push(" info");for(let[s,c]of l)o.push(` ${s} ${j(c)}`)}return o}function Ur(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${j(e.title)}`),e.description&&t.push(` description ${j(e.description)}`),e.epoch&&t.push(` epoch ${j(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${j(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${j(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${j(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${j(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} ${j(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...gs(n));for(let n of e.annotations)t.push(""),t.push(...bs(n));return t}function ms(e){return Yr(e.type,e.id,e)}function Wr(e){return Yr(`object ${e.type}`,e.id,e)}function Yr(e,t,n){let r=[`${e} ${t}`],i=[...Pn(n.placement),...Hr(n.properties),...hs(n)];for(let a of i)r.push(` ${a}`);let o=Object.entries(n.info).sort(([a],[l])=>a.localeCompare(l));if(o.length>0){i.length>0&&r.push(""),r.push(" info");for(let[a,l]of o)r.push(` ${a} ${j(l)}`)}for(let a of["climate","habitability","settlement"]){let l=Object.entries(n.typedBlocks?.[a]??{}).sort(([s],[c])=>s.localeCompare(c));if(l.length>0){r.push(""),r.push(` ${a}`);for(let[s,c]of l)r.push(` ${s} ${j(c)}`)}}return r}function Pn(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...Ae("distance",e.distance),...Ae("semiMajor",e.semiMajor),...vs("eccentricity",e.eccentricity),...Ae("period",e.period),...Ae("angle",e.angle),...Ae("inclination",e.inclination),...Ae("phase",e.phase)];case"at":return[`at ${$s(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?En(e.distance):e.descriptor??""}`.trim()]}}function Hr(e){return Object.keys(e).sort(xs).map(t=>`${t} ${Kr(e[t])}`)}function hs(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${j(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${j(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} ${Kr(n.value)}`);return t}function gs(e){let t=[`viewpoint ${e.id}`,` label ${j(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 ${j(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&&ws(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=Is(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 ${j(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(j).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function bs(e){let t=[`annotation ${e.id}`,` label ${j(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${j(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(j).join(" ")}`),t}function qr(e){let t=[`group ${e.id}`,` label ${j(e.label)}`];return e.summary&&t.push(` summary ${j(e.summary)}`),e.color&&t.push(` color ${j(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(j).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Gr(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${j(e.from)}`),e.to&&t.push(` to ${j(e.to)}`),e.kind&&t.push(` kind ${j(e.kind)}`),e.label&&t.push(` label ${j(e.label)}`),e.summary&&t.push(` summary ${j(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(j).join(" ")}`),e.color&&t.push(` color ${j(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Xr(e){let t=[`event ${e.id}`,` kind ${j(e.kind)}`];if(e.label&&t.push(` label ${j(e.label)}`),e.summary&&t.push(` summary ${j(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${j(e.timing)}`),e.visibility&&t.push(` visibility ${j(e.visibility)}`),e.epoch&&t.push(` epoch ${j(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${j(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(j).join(" ")}`),e.color&&t.push(` color ${j(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(ks)){t.push(` pose ${n.objectId}`);for(let r of ys(n))t.push(` ${r}`)}}return t}function ys(e){return[...Pn(e.placement),...e.epoch?[`epoch ${j(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${j(e.referencePlane)}`]:[],...Ae("inner",e.inner),...Ae("outer",e.outer)]}function ws(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Kr(e){return Array.isArray(e)?e.map(t=>j(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?j(e):En(e)}function En(e){return`${e.value}${e.unit??""}`}function Ae(e,t){return t?[`${e} ${En(t)}`]:[]}function vs(e,t){return t===void 0?[]:[`${e} ${t}`]}function $s(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 Is(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 xs(e,t){let n=_r.indexOf(e),r=_r.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Dn(e,t){let n=Nr(e.type),r=Nr(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function qe(e,t){return e.id.localeCompare(t.id)}function ks(e,t){return e.objectId.localeCompare(t.objectId)}function Nr(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 j(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Zr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,js=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Ss=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Ge(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ht(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Fn(e,t,n){let r=e.match(Zr);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=ne(n);if(o?.unitFamily&&!it(o.unitFamily,i.unit))throw p.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Cn(e){let t=e.match(Zr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Le(e,t,n){let r=js.get(e.toLowerCase());if(r===void 0)throw p.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Jr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.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 p.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 Os(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Ss);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Qr(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw p.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Le(mt(t,e,n),e,n);case"number":return Nt(mt(t,e,n),e,n);case"unit":return Fn(mt(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Os(i,n),i}}}function Vn(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw p.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function mt(e,t,n){if(e.length!==1)throw p.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var ti=new Set(["star","planet","moon","asteroid","comet"]),As=332946.0487,Ls=1047.3486,Ut=1495978707e-1,Ts=6371,Ms=695700,Ps=63241.077,Es=206264.806,Ds=206264806;function gt(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(O("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(O("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)Fs(l,r,n);for(let l of e.system?.viewpoints??[])Cs(l,i,o,t,n,r);for(let l of e.objects)Vs(l,e.system,r,i,n);for(let l of e.events)Rs(l,e.system,r,n);return n}function Fs(e,t,n){e.from?t.has(e.from)||n.push(O("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(O("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(O("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(O("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(O("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Cs(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let l of a.groupIds)t.has(l)||i.push(R("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(R("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Ns(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Us(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function Vs(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(R("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(R("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(R("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(O("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(O("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(R("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(R("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!zn(l?.properties.mass)&&i.push(R("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?ti.has(s.type)||i.push(O("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(O("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(O("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Bs(e,n,i)||i.push(O("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(R("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(O("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(R("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=ei(e,l);if(c===null){i.push(R("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(Rn("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${qs(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(R("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=ni(a?.period),u=ei(e,l);if(c===null||u===null)continue;let f=Hs(e,"period");Math.abs(c-u)>f&&i.push(O("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Rs(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(O("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(R("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(R("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(O("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(O("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(R("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(O("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(R("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(R("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(R("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(O("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let f=n.get(c.objectId);if(!f){r.push(O("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(R("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),zs(c,f,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(R("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function zs(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(O("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(O("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(O("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!Ws(r,t,n,e)&&o.push(R("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!Ys(r,t,n,e)&&o.push(R("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!zn(i.get(s.target)?.properties.mass)&&o.push(R("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?ti.has(c.type)||o.push(O("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(O("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(O("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(O("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(O("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(O("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(O("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Bs(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(O("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(O("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(O("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function ei(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=_s(n.semiMajor??n.distance),i=zn(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function _s(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ut;case"m":return e.value/(Ut*1e3);case"ly":return e.value*Ps;case"pc":return e.value*Es;case"kpc":return e.value*Ds;case"re":return e.value*Ts/Ut;case"sol":return e.value*Ms/Ut;default:return null}}function zn(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/As;case"mj":return t.value/Ls;default:return null}}function ni(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 Ns(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(O("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Us(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,b]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])b!==null&&(!Number.isFinite(b)||f==="distance"&&b<=0)&&r.push(O("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(b)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(R("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(R("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,c)),t==="isometric"&&e.elevation!==null&&r.push(Rn("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(R("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(Rn("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Ws(e,t,n,r){return Te(r?.epoch)??Te(n?.epoch)??Te(t.epoch)??Te(e?.epoch)??null}function Ys(e,t,n,r){return Te(r?.referencePlane)??Te(n?.referencePlane)??Te(t.referencePlane)??Te(e?.referencePlane)??null}function Te(e){return typeof e=="string"&&e.trim()?e.trim():null}function Hs(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?ni(n)??0:0}function qs(e){return`${Math.round(e*100)/100}d`}function O(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function R(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Rn(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Gs=new Set(["climate","habitability","settlement"]),Yt=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=ne(e);t&&Yt.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}])Yt.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Xs=new Set(Yt.keys()),ii=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function Ht(e){return ai(e)}function oi(e){return ai(e,"2.0-draft")}function ai(e,t){let n=Fl(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],b=[],w=new Map,I=!1,v=!1,S=new Set,A=new Set,h=new Set,$=new Set,Y=new Set;for(let z=0;z<r.length;z++){let U=r[z],H=z+1;if(!U.trim())continue;let D=Ot(U),q=Fe(U.slice(D),{line:H,columnOffset:D});if(q.length!==0){if(!o){a=Ks(q,H),o=!0,n.comments.length>0&&qt(a,"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 ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(D===0){s=Zs(q,H,a,i,l,c,u,f,b,w,S,A,h,$,Y,{sawDefaults:I,sawAtlas:v}),s.kind==="system"?l=s.system:s.kind==="defaults"?I=!0:s.kind==="atlas"&&(v=!0);continue}if(!s)throw new p("Indented line without parent atlas section",H,D+1);ol(s,D,q,H)}}if(!o)throw new p('Missing required atlas schema header "schema 2.0"');let C=c.map(z=>kl(z,a,i)),M=b.map(z=>jl(z,w.get(z.id)??[])),N=t??(a==="2.0-draft"?"2.0":a),P={format:"worldorbit",sourceVersion:"1.0",system:l,groups:u,relations:f,events:M,objects:C,diagnostics:i};if(N==="2.0-draft"){let z={...P,version:"2.0-draft",schemaVersion:"2.0-draft"};return z.diagnostics.push(...gt(z,a)),z}let J={...P,version:N,schemaVersion:N};return a==="2.0-draft"&&J.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".'}),J.diagnostics.push(...gt(J,a)),J}function Ks(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 p('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 Zs(e,t,n,r,i,o,a,l,s,c,u,f,b,w,I,v){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new p('Atlas section "system" may only appear once',t,e[0].column);return Js(e,t,n,r);case"defaults":if(!i)throw new p('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new p('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 p('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new p('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 p('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Qs(e,t,i,u,n,r);case"annotation":if(!i)throw new p('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return el(e,t,i,f);case"group":return se(n,r,"group",{line:t,column:e[0].column}),tl(e,t,a,b);case"relation":return se(n,r,"relation",{line:t,column:e[0].column}),nl(e,t,l,w);case"event":return se(n,r,"event",{line:t,column:e[0].column}),rl(e,t,s,c,I,n,r);case"object":return il(e,t,n,r,o);default:throw new p(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Js(e,t,n,r){if(e.length!==2)throw new p("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 Qs(e,t,n,r,i,o){if(e.length!==2)throw new p("Invalid viewpoint declaration",t,e[0]?.column??1);let a=Ge(e[1].value);if(!a)throw new p("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new p(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:ht(a),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(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function el(e,t,n,r){if(e.length!==2)throw new p("Invalid annotation declaration",t,e[0]?.column??1);let i=Ge(e[1].value);if(!i)throw new p("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new p(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:ht(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function tl(e,t,n,r){if(e.length!==2)throw new p("Invalid group declaration",t,e[0]?.column??1);let i=Ge(e[1].value);if(!i)throw new p("Group id must not be empty",t,e[1].column);if(r.has(i))throw new p(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:ht(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function nl(e,t,n,r){if(e.length!==2)throw new p("Invalid relation declaration",t,e[0]?.column??1);let i=Ge(e[1].value);if(!i)throw new p("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new p(`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 rl(e,t,n,r,i,o,a){if(e.length!==2)throw new p("Invalid event declaration",t,e[0]?.column??1);let l=Ge(e[1].value);if(!l)throw new p("Event id must not be empty",t,e[1].column);if(i.has(l))throw new p(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:ht(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function il(e,t,n,r,i){if(e.length<3)throw new p("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!rt.has(l)||l==="system")throw new p(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:Il(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ol(e,t,n,r){switch(e.kind){case"system":al(e,n,r);return;case"defaults":sl(e,n,r);return;case"atlas":ll(e,t,n,r);return;case"viewpoint":cl(e,t,n,r);return;case"annotation":fl(e,n,r);return;case"group":pl(e,n,r);return;case"relation":ml(e,n,r);return;case"event":hl(e,t,n,r);return;case"object":bl(e,t,n,r);return}}function al(e,t,n){let r=xe(t,e.seenFields,n),i=F(t,n);switch(r){case"title":e.system.title=i;return;case"description":se(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":se(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new p(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function sl(e,t,n){let r=xe(t,e.seenFields,n),i=F(t,n);switch(r){case"view":li(i)&&Ce(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=si(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=ci(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new p(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ll(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=ui(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new p(`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 p(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function cl(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){ul(e,n,r);return}if(e.inFilter){dl(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(Ce(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new p('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??_n();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new p('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=xe(n,e.seenFields,r),o=F(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":li(o)&&Ce(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=si(o,r,n[0].column);return;case"preset":e.viewpoint.preset=ci(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Bn(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Pe(o,r,n[0].column,"rotation");return;case"camera":Ce(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=$l(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=wl(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=ge(n.slice(1),r,"events");return;default:throw new p(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function ul(e,t,n){let r=xe(t,e.seenCameraFields,n),i=F(t,n),o=e.viewpoint.camera??_n();switch(r){case"azimuth":o.azimuth=Pe(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=Pe(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=Pe(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=Bn(i,n,t[0].column,"camera.distance");break;default:throw new p(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function dl(e,t,n){let r=xe(t,e.seenFilterFields,n),i=e.viewpoint.filter??vl();switch(r){case"query":i.query=F(t,n);break;case"objecttypes":i.objectTypes=yl(t.slice(1),n);break;case"tags":i.tags=ge(t.slice(1),n,"tags");break;case"groups":i.groupIds=ge(t.slice(1),n,"groups");break;default:throw new p(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function fl(e,t,n){switch(xe(t,e.seenFields,n)){case"label":e.annotation.label=F(t,n);return;case"target":e.annotation.targetObjectId=F(t,n);return;case"body":e.annotation.body=F(t,n);return;case"tags":e.annotation.tags=ge(t.slice(1),n,"tags");return;default:throw new p(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function pl(e,t,n){switch(xe(t,e.seenFields,n)){case"label":e.group.label=F(t,n);return;case"summary":e.group.summary=F(t,n);return;case"color":e.group.color=F(t,n);return;case"tags":e.group.tags=ge(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Le(F(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ml(e,t,n){switch(xe(t,e.seenFields,n)){case"from":e.relation.from=F(t,n);return;case"to":e.relation.to=F(t,n);return;case"kind":e.relation.kind=F(t,n);return;case"label":e.relation.label=F(t,n);return;case"summary":e.relation.summary=F(t,n);return;case"tags":e.relation.tags=ge(t.slice(1),n,"tags");return;case"color":e.relation.color=F(t,n);return;case"hidden":e.relation.hidden=Le(F(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function hl(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")&&Ce(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(gl(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new p(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new p("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new p('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(xe(n,e.seenFields,r)){case"kind":e.event.kind=F(n,r);return;case"label":e.event.label=F(n,r);return;case"summary":e.event.summary=F(n,r);return;case"target":e.event.targetObjectId=F(n,r);return;case"participants":e.event.participantObjectIds=ge(n.slice(1),r,"participants");return;case"timing":e.event.timing=F(n,r);return;case"visibility":e.event.visibility=F(n,r);return;case"epoch":Ce(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=F(n,r);return;case"referenceplane":Ce(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=F(n,r);return;case"tags":e.event.tags=ge(n.slice(1),r,"tags");return;case"color":e.event.color=F(n,r);return;case"hidden":e.event.hidden=Le(F(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new p(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function gl(e,t,n){if(e.length<2)throw new p("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!ii.has(r))throw new p(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new p(`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 bl(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"||Gs.has(i)){i!=="info"&&se(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=ui(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new p(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new p(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(xl(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function xe(e,t,n){if(e.length<2)throw new p("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new p(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function F(e,t){if(e.length<2)throw new p("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function yl(e,t){return ge(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function wl(e,t,n,r){let i={};for(let o of ge(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&se(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function ge(e,t,n){if(e.length===0)throw new p(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new p(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function si(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new p(`Unknown projection "${e}"`,t,n);return r}function li(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function ci(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new p(`Unknown render preset "${e}"`,t,n)}function Bn(e,t,n,r){let i=Pe(e,t,n,r);if(i<=0)throw new p(`Field "${r}" must be greater than zero`,t,n);return i}function Pe(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new p(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function vl(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function _n(){return{azimuth:null,elevation:null,roll:null,distance:null}}function $l(e,t,n){if(e.length===0||e.length%2!==0)throw new p('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:_n(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new p(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=Pe(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=Pe(c,t,a.column,"camera.elevation");break;case"roll":r.roll=Pe(c,t,a.column,"camera.roll");break;case"distance":r.distance=Bn(c,t,a.column,"camera.distance");break;default:throw new p(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function Il(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=bt(l.value);if(!s)throw new p(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&se(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!Xs.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new p(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return mi(o,n),o}function xl(e,t,n,r,i){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);let o=bt(e[0].value);if(!o)throw new p(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&se(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return mi([a],n),a}function ui(e,t,n){if(e.length<2)throw new p(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 kl(e,t,n){let r=di(e.fields),i=fi(r),o=Ol(e.objectType,r),a=El(r.get("groups")?.[0]),l=Wt(r.get("epoch")?.[0]),s=Wt(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?Le(ce(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Tl(r.get("resonance")[0]):void 0,f=Ll(r),b=r.get("derive")?.map($=>Ml($)),w=r.get("validate")?.map($=>({rule:ce($)})),I=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,v=r.get("tolerance")?.map($=>Pl($)),S=Al(e.typedBlockEntries),A=pi(e.infoEntries,"info"),h={type:e.objectType,id:e.id,properties:o,placement:i,info:A};return a.length>0&&(h.groups=a),l&&(h.epoch=l),s&&(h.referencePlane=s),c!==void 0&&(h.tidalLock=c),u&&(h.resonance=u),f&&(h.renderHints=f),b?.length&&(h.deriveRules=b),w?.length&&(h.validationRules=w),I?.length&&(h.lockedFields=I),v?.length&&(h.tolerances=v),S&&Object.keys(S).length>0&&(h.typedBlocks=S),qt(t,"2.1")&&(h.groups||h.epoch||h.referencePlane||h.tidalLock!==void 0||h.resonance||h.renderHints||h.deriveRules?.length||h.validationRules?.length||h.lockedFields?.length||h.tolerances?.length||h.typedBlocks)&&se(t,n,e.id,e.location),h}function jl(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Sl(n))}}function Sl(e){let t=di(e.fields,"event-pose"),n=fi(t);return{objectId:e.objectId,placement:n,inner:Me(t.get("inner")?.[0],"inner"),outer:Me(t.get("outer")?.[0],"outer"),epoch:Wt(t.get("epoch")?.[0]),referencePlane:Wt(t.get("referencePlane")?.[0])}}function di(e,t="object"){let n=new Map;for(let r of e){let i=bt(r.key);if(!i&&!ii.has(r.key))throw p.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw p.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function fi(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 a=t??n??r??i;throw p.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:ce(t),distance:Me(e.get("distance")?.[0],"distance"),semiMajor:Me(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Dl(e.get("eccentricity")?.[0],"eccentricity"),period:Me(e.get("period")?.[0],"period"),angle:Me(e.get("angle")?.[0],"angle"),inclination:Me(e.get("inclination")?.[0],"inclination"),phase:Me(e.get("phase")?.[0],"phase")};if(n){let a=ce(n);return{mode:"at",target:a,reference:Jr(a,n.location)}}if(r)return{mode:"surface",target:ce(r)};if(i){let a=ce(i),l=Cn(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function Ol(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=bt(r);!o||!a?.legacySchema||a.legacySchema.placement||(Vn(r,e,o.location),n[r]=Qr(r,o.values,o.location))}return n}function pi(e,t){let n={};for(let r of e){if(r.key in n)throw p.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Al(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=pi(r,n))}return t}function Ll(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Le(ce(n),"renderLabel",n.location)),r&&(t.renderOrbit=Le(ce(r),"renderOrbit",r.location)),i&&(t.renderPriority=Nt(ce(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Tl(e){if(e.values.length!==2)throw p.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw p.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ml(e){if(e.values.length!==2)throw p.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Pl(e){if(e.values.length!==2)throw p.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Cn(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function El(e){return e?[...new Set(e.values)]:[]}function Wt(e){return e&&e.values.join(" ").trim()||null}function Me(e,t){return e?Fn(ce(e),e.location,t):void 0}function Dl(e,t){return e?Nt(ce(e),t,e.location):void 0}function ce(e){return mt(e.values,e.key,e.location)}function bt(e){return Yt.get(e)}function mi(e,t){for(let n of e){let r=bt(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Vn(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function se(e,t,n,r){qt(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 Ce(e,t,n,r){qt(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 qt(e,t){return ri(e)<ri(t)}function ri(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 Fl(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
|
|
5
|
+
`&&c!=="\r"&&(t[s]=" "),c===`
|
|
6
|
+
`?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!Cl(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
|
|
7
|
+
`&&t[f]!=="\r";)t[f]=" ",f++;l+=f-s,s=f-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
|
|
8
|
+
`?(a++,l=1):l++}if(i)throw p.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function Cl(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 Nn(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 Gt(e){return structuredClone(e)}function hi(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(Ve))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(Ve))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(Ve))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(Ve))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(Ve)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(ji))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(Ve))t.push({kind:"object",id:n.id});return t}function Un(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?vi(e,t.id):null;case"event":return t.id?Xt(e,t.id):null;case"event-pose":return t.id&&t.key?Ii(e,t.id,t.key):null;case"object":return t.id?wi(e,t.id):null;case"viewpoint":return t.id?xi(e.system,t.id):null;case"annotation":return t.id?ki(e.system,t.id):null;case"relation":return t.id?$i(e,t.id):null}}function Wn(e,t,n){let r=Gt(e),i=qn(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return Xe(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return Xe(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return Vl(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return Xe(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return Xe(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return Xe(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return Xe(r.relations,n),r}}function gi(e,t,n){return Wn(e,t,n(Un(e,t)))}function bi(e,t){let n=Gt(e),r=qn(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=Xt(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 Yn(e,t){return t.map(n=>({diagnostic:n,path:Hn(e,n)}))}function Hn(e,t){if(t.objectId&&wi(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&vi(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&xi(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&ki(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&$i(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&Xt(e,n[1]))return n[2]==="pose"&&n[3]&&Ii(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 qn(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function yi(e){let t=[...e.diagnostics,...gt(e,e.version)];return Yn(e,t)}function qn(e){return e.system||(e.system=Nn().system),e.system}function wi(e,t){return e.objects.find(n=>n.id===t)??null}function vi(e,t){return e.groups.find(n=>n.id===t)??null}function $i(e,t){return e.relations.find(n=>n.id===t)??null}function Xt(e,t){return e.events.find(n=>n.id===t)??null}function Ii(e,t,n){return Xt(e,t)?.positions.find(r=>r.objectId===n)??null}function xi(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function ki(e,t){return e?.annotations.find(n=>n.id===t)??null}function Xe(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(Ve);return}e[n]=t}function Vl(e,t,n){let r=e.find(o=>o.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(o=>o.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(ji);return}r.positions[i]=n}function Ve(e,t){return e.id.localeCompare(t.id)}function ji(e,t){return e.objectId.localeCompare(t.objectId)}var Rl=/^schema\s+2(?:\.0|\.1|\.5)?$/i,zl=/^schema\s+2\.1$/i,Bl=/^schema\s+2\.5$/i,_l=/^schema\s+2\.0-draft$/i;function Gn(e){for(let t of Nl(e).split(/\r?\n/)){let n=t.trim();if(n)return _l.test(n)?"2.0-draft":zl.test(n)?"2.1":Bl.test(n)?"2.5":Rl.test(n)?"2.0":"1.0"}return"1.0"}function Nl(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
|
|
10
|
+
`&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let l=i+1;for(;l<t.length&&t[l]!==`
|
|
11
|
+
`&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function be(e){let t=Xn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new p(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Xn(e){let t=Gn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Ul(e,t);let n;try{n=Oe(e)}catch(i){return{ok:!1,value:null,diagnostics:[ie(i,"parse")]}}let r;try{r=$e(n)}catch(i){return{ok:!1,value:null,diagnostics:[ie(i,"normalize")]}}try{Ie(r)}catch(i){return{ok:!1,value:null,diagnostics:[ie(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ul(e,t){let n;try{n=Ht(e)}catch(a){return{ok:!1,value:null,diagnostics:[ie(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=pt(n)}catch(a){return{ok:!1,value:null,diagnostics:[ie(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Wl=/^```worldorbit(?:\s+(.*))?\s*$/;function Si(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,o=0,a=[];return t.forEach((l,s)=>{let c=s+1;if(!r){let u=l.match(Wl);u&&(r=!0,i=u[1]??null,o=c,a=[]);return}if(l.trim()==="```"){n.push({source:a.join(`
|
|
12
|
+
`),info:i,startLine:o,endLine:c}),r=!1,i=null,o=0,a=[];return}a.push(l)}),n}function Oi(e){let t=Oe(e),n=$e(t);return Ie(n),{ast:t,document:n}}function Yl(e){let t=Oi(e);return{...t,scene:re(t.document)}}function Hl(e){return be(e)}function ql(e){return Tt(e)}function Gl(e,t={}){return _t(e,t)}var Xl={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},yt={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 Kt(e){return e?typeof e=="string"?yt[e]??yt.atlas:{...yt.atlas,...e}:yt.atlas}function Zt(e){return{...Xl,...e}}function Ai(e){return yt[e]}function oe(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Kn(e.objectTypes??[]),tags:Kn((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Kn((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Kl(t)?t:null}function Kl(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Jt(e,t){let n=oe(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Zl(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 Qt(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(i=>!i.hidden).map(i=>({object:i,score:Jl(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=>Li(i.object,i.score)):e.objects.filter(i=>!i.hidden).slice().sort((i,o)=>i.label.localeCompare(o.label)).slice(0,n).map(i=>Li(i,1))}function Ti(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:oe(n)}}function en(e){return encodeURIComponent(JSON.stringify(e))}function tn(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:oe(t.filter??null)}}function Mi(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 nn(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 rn(e){return e?.filter?oe({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function Li(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 Zl(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=Pi(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function Jl(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),i=Pi(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(s=>i.includes(s))&&(o+=32),e.object.type===t&&(o+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(s=>typeof s=="string"):[]).some(s=>s.toLowerCase()===t)&&(o+=18),o}function Pi(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 Kn(e){return[...new Set(e)]}var Ee={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Zn(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function wt(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Re(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function on(e,t){return{...e,rotationDeg:Zn(e.rotationDeg+t)}}function Ke(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=Be(e),a=wt(t.scale*n,i);if(a===t.scale)return t;let l=a/t.scale,s=r.x-o.x,c=r.y-o.y;return{...t,scale:a,translateX:(1-l)*s+l*t.translateX,translateY:(1-l)*c+l*t.translateY}}function ze(e,t,n){let r=Be(e),i=Ql(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),a=Math.max(e.height-n.fitPadding*2,1),l=Math.max(i.width,1),s=Math.max(i.height,1),c=wt(Math.min(o/l,a/s),n),u=he({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:c,translateX:r.x-(r.x+(u.x-r.x)*c),translateY:r.y-(r.y+(u.y-r.y)*c)}}function an(e,t,n,r){let i=e.objects.find(s=>s.objectId===n&&!s.hidden);if(!i)return t;let o=Be(e),a=wt(Math.max(t.scale,1.8),r),l=he({x:i.x,y:i.y},o,t.rotationDeg);return{...t,scale:a,translateX:o.x-(o.x+(l.x-o.x)*a),translateY:o.y-(o.y+(l.y-o.y)*a),selectedObjectId:n}}function sn(e,t){let n=Be(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function Ze(e,t,n){let r=Be(e),i={x:n.x-t.translateX,y:n.y-t.translateY},o={x:i.x-r.x,y:i.y-r.y},a={x:o.x/Math.max(t.scale,1e-4),y:o.y/Math.max(t.scale,1e-4)},l=he({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+l.x,y:r.y+l.y}}function ln(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(l=>Ze(e,t,l)),r=Math.min(...n.map(l=>l.x)),i=Math.min(...n.map(l=>l.y)),o=Math.max(...n.map(l=>l.x)),a=Math.max(...n.map(l=>l.y));return{minX:r,minY:i,maxX:o,maxY:a,width:o-r,height:a-i,centerX:r+(o-r)/2,centerY:i+(a-i)/2}}function Be(e){return{x:e.width/2,y:e.height/2}}function Ql(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(s=>he(s,t,n)),i=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),a=Math.max(...r.map(s=>s.x)),l=Math.max(...r.map(s=>s.y));return{minX:i,minY:o,maxX:a,maxY:l,width:a-i,height:l-o,centerX:i+(a-i)/2,centerY:o+(l-o)/2}}var un="worldorbit-camera-root";function ue(e,t={}){let n=Kt(t.theme),r=gc(t.preset??e.renderPreset??void 0),i=Zt({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Jt(e,t.filter??null),l=e.objects.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>i.structures||!cn(h.object)).sort((h,$)=>h.sortKey-$.sortKey),s=e.labels.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>i.structures||!cn(h.object)),c=rc(l),u=i.orbits?nc(e,a,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>i.structures||!cn(h.object)).map(h=>`<line class="wo-leader wo-leader-${h.mode}" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${X(h.renderId)}" data-group-id="${Z(h.groupId??"")}" />`).join(""):"",b=i.relations?e.relations.filter(h=>!h.hidden).filter(h=>a.has(h.fromObjectId)&&a.has(h.toObjectId)).map(h=>`<line class="wo-relation" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${X(h.renderId)}" data-relation-id="${Z(h.relationId)}" />`).join(""):"",w=i.events?e.events.filter(h=>!h.hidden).map(h=>ec(e,h,a,n)).join(""):"",I=i.objects?l.map(h=>ic(h,t.selectedObjectId??null,n)).join(""):"",v=i.labels?s.map(h=>oc(e,h,t.selectedObjectId??null)).join(""):"",S=i.metadata?`<text class="wo-title" x="56" y="64">${X(e.title)}</text>
|
|
13
|
+
<text class="wo-subtitle" x="56" y="88">${X(o)}</text>
|
|
14
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${X(yc(e))}</text>`:"",A=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
15
15
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
16
|
-
${
|
|
17
|
-
<title id="worldorbit-title">${
|
|
18
|
-
<desc id="worldorbit-desc">A ${
|
|
16
|
+
${i.guides?bc(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">
|
|
17
|
+
<title id="worldorbit-title">${X(e.title)}</title>
|
|
18
|
+
<desc id="worldorbit-desc">A ${X(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
|
|
19
19
|
<defs>
|
|
20
20
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
21
21
|
<stop offset="0%" stop-color="${n.backgroundStart}" />
|
|
@@ -69,61 +69,61 @@ var WorldOrbit=(()=>{var mn=Object.defineProperty;var Jo=Object.getOwnPropertyDe
|
|
|
69
69
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
70
70
|
.wo-object-image { pointer-events: none; }
|
|
71
71
|
</style>
|
|
72
|
-
${
|
|
72
|
+
${A}
|
|
73
73
|
${S}
|
|
74
74
|
<g data-worldorbit-world="true">
|
|
75
|
-
<g data-worldorbit-camera-root="${
|
|
75
|
+
<g data-worldorbit-camera-root="${un}" id="${un}">
|
|
76
76
|
<g data-worldorbit-world-content="true">
|
|
77
|
-
${
|
|
78
|
-
${
|
|
79
|
-
${
|
|
80
|
-
${
|
|
81
|
-
${
|
|
82
|
-
${
|
|
83
|
-
${
|
|
77
|
+
${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
|
|
78
|
+
${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
79
|
+
${i.relations?`<g data-layer-id="relations">${b}</g>`:""}
|
|
80
|
+
${i.events?`<g data-layer-id="events">${w}</g>`:""}
|
|
81
|
+
${i.objects?`<g data-layer-id="objects">${I}</g>`:""}
|
|
82
|
+
${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
|
|
83
|
+
${i.labels?`<g data-layer-id="labels">${v}</g>`:""}
|
|
84
84
|
</g>
|
|
85
85
|
</g>
|
|
86
86
|
</g>
|
|
87
|
-
</svg>`}function
|
|
88
|
-
${
|
|
89
|
-
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${Z(
|
|
90
|
-
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${
|
|
91
|
-
</g>`}function
|
|
92
|
-
<circle class="wo-selection-ring" cx="${
|
|
93
|
-
${
|
|
94
|
-
${
|
|
87
|
+
</svg>`}function ec(e,t,n,r){let i=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,a=t.event.label||t.event.id,l=i.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${Z(o)}" data-event-id="${Z(t.eventId)}" data-object-id="${Z(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${X(t.renderId)}" data-event-id="${Z(t.eventId)}">
|
|
88
|
+
${l}
|
|
89
|
+
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${Z(o)}" />
|
|
90
|
+
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${X(a)}</text>
|
|
91
|
+
</g>`}function er(e,t={}){return ue(re(e,t),t)}function Ci(e,t={}){let n=be(e);return er(n.document,tc(n,t))}function tc(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function nc(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!cn(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${X(o.renderId)}" data-orbit-object-id="${Z(o.objectId)}" data-parent-id="${Z(o.parentId)}" data-group-id="${Z(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function rc(e){return e.filter(t=>!!t.imageHref).map(t=>lc(t)).join("")}function ic(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=uc(e,n),f=sc(e),b=f?Ei(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${X(e.objectId)}" data-parent-id="${Z(e.parentId??"")}" data-group-id="${Z(e.groupId??"")}" data-render-id="${X(e.renderId)}" tabindex="0" role="button" aria-label="${X(`${r.type} ${e.objectId}`)}">
|
|
92
|
+
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
|
|
93
|
+
${ac(e,u)}
|
|
94
|
+
${Ei(r,i,o,a,u)}
|
|
95
95
|
${f}
|
|
96
96
|
${b}
|
|
97
|
-
</g>`}function
|
|
98
|
-
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*
|
|
99
|
-
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*
|
|
100
|
-
</g>`}function
|
|
101
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
102
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
103
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
104
|
-
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${
|
|
105
|
-
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${
|
|
106
|
-
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${
|
|
107
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
108
|
-
<svg width="${
|
|
109
|
-
<rect x="0.5" y="0.5" width="${
|
|
110
|
-
<rect x="${
|
|
111
|
-
${
|
|
112
|
-
<rect x="${
|
|
97
|
+
</g>`}function oc(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="${X(t.objectId)}" data-group-id="${Z(t.groupId??"")}" data-render-id="${X(t.renderId)}">
|
|
98
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${X(t.label)}</text>
|
|
99
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${X(t.secondaryLabel)}</text>
|
|
100
|
+
</g>`}function Ei(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=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" />
|
|
101
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" 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="${a}" 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="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
102
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Ri(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Jn(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:s==="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" />
|
|
103
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
|
|
104
|
+
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
105
|
+
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
|
|
106
|
+
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
|
|
107
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Jn(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function ac(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 sc(e){if(!e.imageHref)return"";let t=cc(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${Z(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${Z(Vi(e))})" />`}function lc(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="${Ri(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${Jn(t,n,r)}" />`;break;default:return""}return`<clipPath id="${Z(Vi(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function cc(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 uc(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=dc(e.object.type,n,t),i=e.fillColor&&vc(e.fillColor)?e.fillColor:r.fill,o=Di(e.object.properties.albedo),a=Di(e.object.properties.temperature),l=pc(i,a,o,e.object.type),s=vt(l,"#ffffff",.4)??r.stroke,c=hc(e.object.properties.atmosphere),u=e.object.type==="star"?Fi(vt(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Fi(vt(l,"#ffffff",.5)??l,.72):void 0}}function dc(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 fc(t)}}function fc(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 pc(e,t,n,r){let i=e;if(t!==null){let o=mc(t,r);i=vt(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=vt(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function mc(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function hc(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 gc(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 Di(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Vi(e){return`${e.renderId}-clip`}function Ri(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Jn(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 bc(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function yc(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function cn(e){return e.type==="structure"||e.type==="phenomenon"}function vt(e,t,n){let r=Qn(e),i=Qn(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return wc({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 Fi(e,t){let n=Qn(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Qn(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 wc(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function vc(e){return!!e.trim()}function X(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function Z(e){return X(e)}var Je=180,Qe=120,zi=10;function Bi(e,t,n){let r=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},i=Math.min((Je-zi*2)/Math.max(r.width,1),(Qe-zi*2)/Math.max(r.height,1)),o=(Je-r.width*i)/2-r.minX*i,a=(Qe-r.height*i)/2-r.minY*i,l=ln(e,t),s=n.map(c=>{let u=c.x*i+o,f=c.y*i+a,b=Math.max(1.4,Math.min(c.visualRadius*i,5.2)),w=c.fillColor??$c(c.object.type);return`<circle cx="${de(u)}" cy="${de(f)}" r="${de(b)}" fill="${w}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Je}px;height:${Qe}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;">
|
|
108
|
+
<svg width="${Je}" height="${Qe}" viewBox="0 0 ${Je} ${Qe}" role="presentation" aria-hidden="true">
|
|
109
|
+
<rect x="0.5" y="0.5" width="${Je-1}" height="${Qe-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
110
|
+
<rect x="${de(r.minX*i+o)}" y="${de(r.minY*i+a)}" width="${de(r.width*i)}" height="${de(r.height*i)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
111
|
+
${s}
|
|
112
|
+
<rect x="${de(l.minX*i+o)}" y="${de(l.minY*i+a)}" width="${de(l.width*i)}" height="${de(l.height*i)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
|
|
113
113
|
</svg>
|
|
114
|
-
</div>`}function
|
|
114
|
+
</div>`}function $c(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 de(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Ic=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function Ni(e){return{objectId:e.objectId,title:e.objectId,typeLabel:Oc(e.object.type),imageHref:e.renderObject.imageHref??null,description:jc(e),tags:kc(e.object.properties.tags),fields:xc(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function Ui(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(o=>`<span class="wo-tooltip-tag">${ye(o)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(o=>`<div class="wo-tooltip-field"><dt>${ye(o.label)}</dt><dd>${ye(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="${ye(e.objectId)}">
|
|
115
115
|
<div class="wo-tooltip-head">
|
|
116
|
-
${e.imageHref?`<img class="wo-tooltip-image" src="${
|
|
116
|
+
${e.imageHref?`<img class="wo-tooltip-image" src="${Lc(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${ye(e.typeLabel.slice(0,1))}</div>`}
|
|
117
117
|
<div class="wo-tooltip-heading">
|
|
118
|
-
<strong>${
|
|
119
|
-
<span>${
|
|
118
|
+
<strong>${ye(e.title)}</strong>
|
|
119
|
+
<span>${ye(e.typeLabel)}</span>
|
|
120
120
|
</div>
|
|
121
121
|
</div>
|
|
122
|
-
${e.description?`<p class="wo-tooltip-description">${
|
|
122
|
+
${e.description?`<p class="wo-tooltip-description">${ye(e.description)}</p>`:""}
|
|
123
123
|
${n}
|
|
124
124
|
${r}
|
|
125
|
-
${
|
|
126
|
-
</article>`}function rc(e){let t=new Map;for(let r of nc){let o=e.object.properties[r];o!==void 0&&t.set(r,{key:r,label:lc(r),value:Oo(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 ${Oo(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function oc(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function ic(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 Oo(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):ac(e)}function ac(e){return`${e.value}${e.unit??""}`}function sc(e){return e.charAt(0).toUpperCase()+e.slice(1)}function lc(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function ge(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function cc(e){return ge(e)}var Xe={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},To="worldorbit-viewer-tooltip-style";function Ae(e,t){if(pc(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??Xe.minScale,maxScale:t.maxScale??Xe.maxScale,fitPadding:t.fitPadding??Xe.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??Xe.panStep,zoomStep:t.zoomStep??Xe.zoomStep,rotationStep:t.rotationStep??Xe.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:ie(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,l=e.style.position,c=uc(t),u=gt(c,i),f={...Oe},b=null,w=null,$=null,v=null,S=!1,L=null,h=null,I=0,W=!1,R=new Map,F=null,N=null,M=null,q=null,P=null,Y=null;a===null&&(e.tabIndex=0),mc(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let B=d=>{if(!o.pointer||W)return;d.preventDefault(),e.focus();let m=No(d.clientX,d.clientY),g=bt(Math.exp(-d.deltaY*.002),.6,1.6);V(Ye(u,f,g,m,r))},E=d=>{if(W)return;let m=d.pointerType==="touch";if(m&&!o.touch||!m&&!o.pointer||!m&&d.button!==0)return;e.focus(),e.setPointerCapture?.(d.pointerId);let g=vt(d.clientX,d.clientY);if(m){R.set(d.pointerId,g),R.size===2?F=Do(u,f,R):R.size===1&&(I=0,S=!1);return}L=d.pointerId,h=g,I=0,S=!1},J=d=>{if(W)return;if(d.pointerType==="touch"){if(!o.touch||!R.has(d.pointerId))return;let T=R.get(d.pointerId),Ze=vt(d.clientX,d.clientY);if(R.set(d.pointerId,Ze),R.size===2){F||(F=Do(u,f,R));let fe=Po(R),Re=fe.distance/Math.max(F.startDistance,1),dn=Ye(u,F.startState,Re,F.startCenter,r),fn=fe.center.x-F.startViewportCenter.x,pn=fe.center.y-F.startViewportCenter.y;V(Ee(dn,fn,pn))}else if(R.size===1){let fe=Ze.x-T.x,Re=Ze.y-T.y;I+=Math.abs(fe)+Math.abs(Re),I>2&&(S=!0),V(Ee(f,fe,Re))}return}if(!o.pointer||L!==d.pointerId||!h)return;let g=vt(d.clientX,d.clientY),U=g.x-h.x,D=g.y-h.y;I+=Math.abs(U)+Math.abs(D),h=g,I>2&&(S=!0),V(Ee(f,U,D))},te=d=>{if(d.pointerType==="touch"){R.delete(d.pointerId),R.size<2&&(F=null);return}L===d.pointerId&&(L=null,h=null)},y=d=>{if(!o.selection||W)return;if(S){S=!1;return}let m=nn(d.target);Q(m),o.tooltipMode==="pinned"&&(M=m,de())},j=d=>{let m=nn(d.target);Ke(m)},K=()=>{Ke(null)},Le=d=>{let m=nn(d.target);m&&Ke(m)},Pe=()=>{Ke(null)},wt=d=>{if(!o.keyboard||W)return;let m=nn(d.target);if((d.key==="Enter"||d.key===" ")&&m){d.preventDefault(),Q(m),o.tooltipMode==="pinned"&&(M=m,de());return}switch(d.key){case"Escape":o.tooltipMode==="pinned"&&M&&(d.preventDefault(),M=null,de());return;case"+":case"=":d.preventDefault(),z.zoomBy(o.zoomStep);return;case"-":d.preventDefault(),z.zoomBy(1/o.zoomStep);return;case"ArrowLeft":d.preventDefault(),z.panBy(-o.panStep,0);return;case"ArrowRight":d.preventDefault(),z.panBy(o.panStep,0);return;case"ArrowUp":d.preventDefault(),z.panBy(0,-o.panStep);return;case"ArrowDown":d.preventDefault(),z.panBy(0,o.panStep);return;case"[":d.preventDefault(),z.rotateBy(-o.rotationStep);return;case"]":d.preventDefault(),z.rotateBy(o.rotationStep);return;case"f":case"F":d.preventDefault(),z.fitToSystem();return;case"0":d.preventDefault(),z.resetView();return}};e.addEventListener("wheel",B,{passive:!1}),e.addEventListener("pointerdown",E),e.addEventListener("pointermove",J),e.addEventListener("pointerup",te),e.addEventListener("pointercancel",te),e.addEventListener("click",y),e.addEventListener("mouseover",j),e.addEventListener("mouseleave",K),e.addEventListener("focusin",Le),e.addEventListener("focusout",Pe),e.addEventListener("keydown",wt);let z={setSource(d){c={kind:"source",value:d},u=gt(c,i),Y=null,x(!0)},setDocument(d){c={kind:"document",value:d},u=gt(c,i),Y=null,x(!0)},setScene(d){c={kind:"scene",value:d},u=d,Y=null,x(!0)},getScene(){return u},getRenderOptions(){return dc(i)},listViewpoints(){return u.viewpoints.slice()},getActiveViewpoint(){return ln(Y)},goToViewpoint(d){let m=ln(d);if(!m)return!1;let g={},U=Gt(m);if(m.preset!==null&&(g.preset=m.preset),c.kind!=="scene"&&m.projection!==u.projection&&(g.projection=m.projection),U&&(g.layers=U),Y=m.id,Object.keys(g).length>0){let T=Eo(g);i=Mo(i,g),c.kind!=="scene"&&T&&(u=gt(c,i)),x(T)}cn(Xt(m),!1,!1);let D=Uo(m);return V(D),Q(m.selectedObjectId??m.objectId??null,!1),t.onSelectionChange?.(an()),t.onSelectionDetailsChange?.(ve(f.selectedObjectId)),un(),Ce(),!0},getActiveEventId(){return i.activeEventId??null},setActiveEvent(d){z.setRenderOptions({activeEventId:d})},search(d,m=12){return Yt(u,d,m)},getFilter(){return i.filter?{...i.filter}:null},setFilter(d){cn(d,!0,!0)},getVisibleObjects(){return sn()},getFocusPath(d){return Hn(d)},getObjectDetails(d){return ve(d)},getSelectionDetails(){return ve(f.selectedObjectId)},getTooltipDetails(){return P},getAtlasState(){return go(f,i,i.filter??null,Y)},setAtlasState(d){let m=typeof d=="string"?qt(d):d;m.viewpointId&&z.goToViewpoint(m.viewpointId),z.setRenderOptions(m.renderOptions),cn(m.filter??null,!1,!1),V(_({...f,...m.viewerState})),Q(m.viewerState.selectedObjectId??null,!1),un(),t.onSelectionChange?.(an()),t.onSelectionDetailsChange?.(ve(f.selectedObjectId)),Ce()},serializeAtlasState(){return Ht(z.getAtlasState())},captureBookmark(d,m){return bo(d,m,z.getAtlasState())},applyBookmark(d){return typeof d=="string"?(z.setAtlasState(d),!0):(z.setAtlasState(d.atlasState),!0)},setRenderOptions(d){let m=Eo(d);i=Mo(i,d),c.kind!=="scene"&&m&&(u=gt(c,i)),x(m)},getState(){return{...f}},setState(d){V(_({...f,...d}))},zoomBy(d,m){V(Ye(u,f,d,m??{x:u.width/2,y:u.height/2},r))},panBy(d,m){V(Ee(f,d,m))},rotateBy(d){V(Kt(f,d))},fitToSystem(){V(De(u,f,r))},focusObject(d){Y=null,V(Zt(u,f,d,r)),Q(d),o.tooltipMode==="pinned"&&(M=X(d)?.objectId??null,de())},pinTooltip(d){M=X(d)?.objectId??null,de()},resetView(){let d=De(u,{...Oe},r);Y=null,V(d),Q(null),M=null,de()},exportSvg(){return ce(u,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){W||(W=!0,e.removeEventListener("wheel",B),e.removeEventListener("pointerdown",E),e.removeEventListener("pointermove",J),e.removeEventListener("pointerup",te),e.removeEventListener("pointercancel",te),e.removeEventListener("click",y),e.removeEventListener("mouseover",j),e.removeEventListener("mouseleave",K),e.removeEventListener("focusin",Le),e.removeEventListener("focusout",Pe),e.removeEventListener("keydown",wt),v?.remove(),v=null,$?.remove(),$=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=s,e.style.position=l,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return x(!0),t.initialViewpointId?z.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?z.focusObject(t.initialSelectionObjectId):Ce(),z;function x(d){if(e.innerHTML=ce(u,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),b=e.querySelector('[data-worldorbit-svg="true"]'),w=e.querySelector("#worldorbit-camera-root"),$=null,v=null,o.minimap&&($=document.createElement("div"),$.dataset.worldorbitMinimapRoot="true",e.append($)),o.tooltipMode!=="disabled"&&(v=document.createElement("div"),v.className="wo-viewer-tooltip-root",v.dataset.worldorbitTooltip="true",v.hidden=!0,v.addEventListener("click",Ko),e.append(v)),!b||!w)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=d?De(u,{...Oe},r):_(f),Q(f.selectedObjectId&&X(f.selectedObjectId)?f.selectedObjectId:null,!1),Ke(N&&X(N)?N:null,!1),M=M&&X(M)?M:null,Ve(),Wo(),un(),t.onViewChange?.({...f}),Ce()}function V(d){f=_(d),Ve(),t.onViewChange?.({...f}),Ce()}function _(d){return{scale:bt(d.scale,r.minScale,r.maxScale),rotationDeg:Fo(d.rotationDeg),translateX:Number.isFinite(d.translateX)?d.translateX:f.translateX,translateY:Number.isFinite(d.translateY)?d.translateY:f.translateY,selectedObjectId:d.selectedObjectId&&X(d.selectedObjectId)?d.selectedObjectId:null}}function Ve(){w&&(w.setAttribute("transform",Jt(u,f)),Yo(),de())}function Q(d,m=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${yt(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:d&&X(d)?d:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${yt(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),Un(),de(),m&&(t.onSelectionChange?.(an()),t.onSelectionDetailsChange?.(ve(f.selectedObjectId)),t.onViewChange?.({...f}),Ce())}function Ke(d,m=!0){N===d&&m||(N=d&&X(d)?d:null,Un(),de(),m&&(t.onHoverChange?.(X(N)),t.onHoverDetailsChange?.(ve(N))))}function an(){return X(f.selectedObjectId)}function X(d){if(!d)return null;let m=Yn();return u.objects.find(g=>g.objectId===d&&!g.hidden&&m.has(g.objectId))??null}function ve(d){let m=X(d);return m?{objectId:m.objectId,object:m.object,renderObject:m,label:u.labels.find(g=>g.objectId===m.objectId&&!g.hidden)??null,group:u.groups.find(g=>g.renderId===m.groupId)??null,semanticGroups:u.semanticGroups.filter(g=>m.semanticGroupIds.includes(g.id)),orbit:u.orbitVisuals.find(g=>g.objectId===m.objectId&&!g.hidden)??null,relatedOrbits:u.orbitVisuals.filter(g=>!g.hidden&&(g.objectId===m.objectId||m.ancestorIds.includes(g.objectId)||m.childIds.includes(g.objectId))),relations:u.relations.filter(g=>!g.hidden&&(g.fromObjectId===m.objectId||g.toObjectId===m.objectId)),relatedEvents:u.events.filter(g=>!g.hidden&&(g.targetObjectId===m.objectId||g.objectIds.includes(m.objectId))),parent:X(m.parentId),children:m.childIds.map(g=>X(g)).filter(Boolean),ancestors:m.ancestorIds.map(g=>X(g)).filter(Boolean),focusPath:Hn(m.objectId)}:null}function Un(){for(let d of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))d.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Wn(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Wn(N,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Wn(d,m){let g=ve(d);if(!g)return;let U=new Set([g.objectId,...g.renderObject.childIds,...g.renderObject.ancestorIds]);for(let D of U)for(let T of e.querySelectorAll(`[data-object-id="${yt(D)}"]`))T.classList.add(m.objectClass);for(let D of g.ancestors)for(let T of e.querySelectorAll(`[data-object-id="${yt(D.objectId)}"]`))T.classList.add(m.ancestorClass);for(let D of g.relatedOrbits)for(let T of e.querySelectorAll(`[data-orbit-object-id="${yt(D.objectId)}"]`))T.classList.add(m.orbitClass)}function vt(d,m){if(!b)return{x:u.width/2,y:u.height/2};let g=b.getBoundingClientRect();return!g.width||!g.height?{x:u.width/2,y:u.height/2}:{x:(d-g.left)/g.width*u.width,y:(m-g.top)/g.height*u.height}}function No(d,m){return He(u,f,vt(d,m))}function Yn(){return Wt(u,i.filter??null)}function sn(){let d=Yn();return u.objects.filter(m=>!m.hidden&&d.has(m.objectId))}function Hn(d){let m=u.objects.find(g=>g.objectId===d&&!g.hidden);return m?[...m.ancestorIds,m.objectId].map(g=>X(g)).filter(Boolean):[]}function ln(d){return u.viewpoints.find(m=>m.id===d)??null}function Uo(d){let m=Fo(d.rotationDeg),g=d.scale!==null&&d.scale!==void 0?bt(d.scale,r.minScale,r.maxScale):null,U=d.objectId&&u.objects.find(T=>T.objectId===d.objectId&&!T.hidden);if(U)return qn({x:U.x,y:U.y},g??Math.max(1.8,Oe.scale),m,d.selectedObjectId??U.objectId);let D=De(u,{...Oe,rotationDeg:m},r);return g===null?{...D,rotationDeg:m,selectedObjectId:d.selectedObjectId??null}:qn({x:u.contentBounds.centerX,y:u.contentBounds.centerY},g,m,d.selectedObjectId??null)}function qn(d,m,g,U){let D={x:u.width/2,y:u.height/2},T=pe(d,D,g);return{scale:m,rotationDeg:g,translateX:D.x-(D.x+(T.x-D.x)*m),translateY:D.y-(D.y+(T.y-D.y)*m),selectedObjectId:U}}function cn(d,m,g){i={...i,filter:ie(d)},g&&(Y=null),x(!1)}function Wo(){t.onFilterChange?.(i.filter??null,sn())}function un(){t.onViewpointChange?.(ln(Y))}function Ce(){t.onAtlasStateChange?.(z.getAtlasState())}function Yo(){!o.minimap||!$||($.innerHTML=So(u,f,sn()))}function de(){if(o.tooltipMode==="disabled"||!v){$t(null);return}let d=Ho();if(!d){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),$t(null);return}let m=ve(d.objectId);if(!m){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),$t(null);return}let g=Ao(m);q=d.objectId,v.hidden=!1,v.dataset.mode=d.mode,v.classList.toggle("is-pinned",d.mode==="pinned"),v.style.pointerEvents="auto",v.style.visibility="hidden",qo(v,g,d.mode),Go(v,m.renderObject),v.style.visibility="visible",$t(g)}function Ho(){return M&&X(M)?{objectId:M,mode:"pinned"}:N&&X(N)?{objectId:N,mode:"hover"}:null}function qo(d,m,g){let U=t.tooltipRenderer?.(m,g);d.innerHTML="",typeof U=="string"?d.innerHTML=U:U instanceof HTMLElement?d.append(U):d.innerHTML=Lo(m,g);let D=document.createElement("div");if(D.className="wo-tooltip-actions",g==="pinned"){let T=document.createElement("button");T.type="button",T.className="wo-tooltip-action",T.dataset.tooltipAction="unpin",T.textContent="Unpin",D.append(T)}else{let T=document.createElement("button");T.type="button",T.className="wo-tooltip-action",T.dataset.tooltipAction="pin",T.dataset.objectId=m.objectId,T.textContent="Pin",D.append(T)}D.childElementCount>0&&d.append(D)}function Go(d,m){if(!b)return;let g={x:m.anchorX??m.x,y:m.anchorY??m.y-Math.max(m.visualRadius,m.radius)},U=Xo(g),D=b.getBoundingClientRect(),T=e.getBoundingClientRect(),Ze=D.left-T.left+U.x/Math.max(u.width,1)*D.width,fe=D.top-T.top+U.y/Math.max(u.height,1)*D.height,Re=Math.max(e.clientWidth-d.offsetWidth-12,12),dn=Math.max(e.clientHeight-d.offsetHeight-12,12),fn=fe>e.clientHeight*.48,pn=bt(Ze+18,12,Re),Zo=bt(fn?fe-d.offsetHeight-18:fe+18,12,dn);d.style.left=`${pn}px`,d.style.top=`${Zo}px`}function Xo(d){let m={x:u.width/2,y:u.height/2},g=pe(d,m,f.rotationDeg);return{x:m.x+(g.x-m.x)*f.scale+f.translateX,y:m.y+(g.y-m.y)*f.scale+f.translateY}}function Ko(d){let m=d.target?.closest("[data-tooltip-action]");if(m){switch(d.preventDefault(),d.stopPropagation(),m.dataset.tooltipAction){case"pin":M=m.dataset.objectId??q;break;case"unpin":M=null;break}de()}}function $t(d){let m=P?.objectId!==d?.objectId||P?.description!==d?.description||P?.imageHref!==d?.imageHref;P=d,q=d?.objectId??null,m&&t.onTooltipChange?.(d)}}function uc(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 gt(e,t){switch(e.kind){case"scene":return e.value;case"document":return re(e.value,t);case"source":{let n=he(e.value);return re(n.document,fc(n,t))}}}function dc(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 Mo(e,t){return{...e,...t,filter:t.filter!==void 0?ie(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 Eo(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 fc(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Do(e,t,n){let{center:r,distance:o}=Po(n);return{startState:{...t},startCenter:He(e,t,r),startViewportCenter:r,startDistance:o}}function Po(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 nn(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function pc(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 bt(e,t,n){return Math.min(Math.max(e,t),n)}function Fo(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function yt(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function mc(){if(typeof document>"u"||document.getElementById(To))return;let e=document.createElement("style");e.id=To,e.textContent=`
|
|
125
|
+
${i.length?`<p class="wo-tooltip-relations">${ye(i.join(" - "))}</p>`:""}
|
|
126
|
+
</article>`}function xc(e){let t=new Map;for(let r of Ic){let i=e.object.properties[r];i!==void 0&&t.set(r,{key:r,label:Ac(r),value:_i(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 ${_i(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function kc(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function jc(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 _i(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):Sc(e)}function Sc(e){return`${e.value}${e.unit??""}`}function Oc(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Ac(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function ye(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Lc(e){return ye(e)}var et={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Wi="worldorbit-viewer-tooltip-style";function De(e,t){if(Ec(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??et.minScale,maxScale:t.maxScale??et.maxScale,fitPadding:t.fitPadding??et.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??et.panStep,zoomStep:t.zoomStep??et.zoomStep,rotationStep:t.rotationStep??et.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:oe(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),l=e.style.touchAction,s=e.style.position,c=Tc(t),u=$t(c,o),f={...Ee},b=null,w=null,I=null,v=null,S=!1,A=null,h=null,$=0,Y=!1,C=new Map,M=null,N=null,P=null,J=null,z=null,U=null;a===null&&(e.tabIndex=0),Dc(),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":l,e.style.position||(e.style.position="relative");let H=d=>{if(!i.pointer||Y)return;d.preventDefault(),e.focus();let m=no(d.clientX,d.clientY),g=It(Math.exp(-d.deltaY*.002),.6,1.6);Q(Ke(u,f,g,m,r))},D=d=>{if(Y)return;let m=d.pointerType==="touch";if(m&&!i.touch||!m&&!i.pointer||!m&&d.button!==0)return;e.focus(),e.setPointerCapture?.(d.pointerId);let g=jt(d.clientX,d.clientY);if(m){C.set(d.pointerId,g),C.size===2?M=qi(u,f,C):C.size===1&&($=0,S=!1);return}A=d.pointerId,h=g,$=0,S=!1},q=d=>{if(Y)return;if(d.pointerType==="touch"){if(!i.touch||!C.has(d.pointerId))return;let T=C.get(d.pointerId),tt=jt(d.clientX,d.clientY);if(C.set(d.pointerId,tt),C.size===2){M||(M=qi(u,f,C));let me=Xi(C),Ue=me.distance/Math.max(M.startDistance,1),yn=Ke(u,M.startState,Ue,M.startCenter,r),wn=me.center.x-M.startViewportCenter.x,vn=me.center.y-M.startViewportCenter.y;Q(Re(yn,wn,vn))}else if(C.size===1){let me=tt.x-T.x,Ue=tt.y-T.y;$+=Math.abs(me)+Math.abs(Ue),$>2&&(S=!0),Q(Re(f,me,Ue))}return}if(!i.pointer||A!==d.pointerId||!h)return;let g=jt(d.clientX,d.clientY),W=g.x-h.x,E=g.y-h.y;$+=Math.abs(W)+Math.abs(E),h=g,$>2&&(S=!0),Q(Re(f,W,E))},te=d=>{if(d.pointerType==="touch"){C.delete(d.pointerId),C.size<2&&(M=null);return}A===d.pointerId&&(A=null,h=null)},y=d=>{if(!i.selection||Y)return;if(S){S=!1;return}let m=dn(d.target);V(m),i.tooltipMode==="pinned"&&(P=m,pe())},x=d=>{let m=dn(d.target);ve(m)},B=()=>{ve(null)},fe=d=>{let m=dn(d.target);m&&ve(m)},_e=()=>{ve(null)},kt=d=>{if(!i.keyboard||Y)return;let m=dn(d.target);if((d.key==="Enter"||d.key===" ")&&m){d.preventDefault(),V(m),i.tooltipMode==="pinned"&&(P=m,pe());return}switch(d.key){case"Escape":i.tooltipMode==="pinned"&&P&&(d.preventDefault(),P=null,pe());return;case"+":case"=":d.preventDefault(),_.zoomBy(i.zoomStep);return;case"-":d.preventDefault(),_.zoomBy(1/i.zoomStep);return;case"ArrowLeft":d.preventDefault(),_.panBy(-i.panStep,0);return;case"ArrowRight":d.preventDefault(),_.panBy(i.panStep,0);return;case"ArrowUp":d.preventDefault(),_.panBy(0,-i.panStep);return;case"ArrowDown":d.preventDefault(),_.panBy(0,i.panStep);return;case"[":d.preventDefault(),_.rotateBy(-i.rotationStep);return;case"]":d.preventDefault(),_.rotateBy(i.rotationStep);return;case"f":case"F":d.preventDefault(),_.fitToSystem();return;case"0":d.preventDefault(),_.resetView();return}};e.addEventListener("wheel",H,{passive:!1}),e.addEventListener("pointerdown",D),e.addEventListener("pointermove",q),e.addEventListener("pointerup",te),e.addEventListener("pointercancel",te),e.addEventListener("click",y),e.addEventListener("mouseover",x),e.addEventListener("mouseleave",B),e.addEventListener("focusin",fe),e.addEventListener("focusout",_e),e.addEventListener("keydown",kt);let _={setSource(d){c={kind:"source",value:d},u=$t(c,o),U=null,we(!0)},setDocument(d){c={kind:"document",value:d},u=$t(c,o),U=null,we(!0)},setScene(d){c={kind:"scene",value:d},u=d,U=null,we(!0)},getScene(){return u},getRenderOptions(){return Mc(o)},listViewpoints(){return u.viewpoints.slice()},getActiveViewpoint(){return hn(U)},goToViewpoint(d){let m=hn(d);if(!m)return!1;let g={},W=nn(m);if(m.preset!==null&&(g.preset=m.preset),c.kind!=="scene"&&m.projection!==u.projection&&(g.projection=m.projection),m.camera?g.camera={...m.camera}:o.camera&&(g.camera=null),W&&(g.layers=W),U=m.id,Object.keys(g).length>0){let T=Hi(g);o=Yi(o,g),c.kind!=="scene"&&T&&(u=$t(c,o)),we(T)}gn(rn(m),!1,!1);let E=ro(m);return Q(E),V(m.selectedObjectId??m.objectId??null,!1),t.onSelectionChange?.(le()),t.onSelectionDetailsChange?.(je(f.selectedObjectId)),bn(),Ne(),!0},getActiveEventId(){return o.activeEventId??null},setActiveEvent(d){_.setRenderOptions({activeEventId:d})},search(d,m=12){return Qt(u,d,m)},getFilter(){return o.filter?{...o.filter}:null},setFilter(d){gn(d,!0,!0)},getVisibleObjects(){return mn()},getFocusPath(d){return ar(d)},getObjectDetails(d){return je(d)},getSelectionDetails(){return je(f.selectedObjectId)},getTooltipDetails(){return z},getAtlasState(){return Ti(f,o,o.filter??null,U)},setAtlasState(d){let m=typeof d=="string"?tn(d):d;m.viewpointId&&_.goToViewpoint(m.viewpointId),_.setRenderOptions(m.renderOptions),gn(m.filter??null,!1,!1),Q(k({...f,...m.viewerState})),V(m.viewerState.selectedObjectId??null,!1),bn(),t.onSelectionChange?.(le()),t.onSelectionDetailsChange?.(je(f.selectedObjectId)),Ne()},serializeAtlasState(){return en(_.getAtlasState())},captureBookmark(d,m){return Mi(d,m,_.getAtlasState())},applyBookmark(d){return typeof d=="string"?(_.setAtlasState(d),!0):(_.setAtlasState(d.atlasState),!0)},setRenderOptions(d){let m=Hi(d);o=Yi(o,d),c.kind!=="scene"&&m&&(u=$t(c,o)),we(m)},getState(){return{...f}},setState(d){Q(k({...f,...d}))},zoomBy(d,m){Q(Ke(u,f,d,m??{x:u.width/2,y:u.height/2},r))},panBy(d,m){Q(Re(f,d,m))},rotateBy(d){Q(on(f,d))},fitToSystem(){Q(ze(u,f,r))},focusObject(d){U=null,Q(an(u,f,d,r)),V(d),i.tooltipMode==="pinned"&&(P=K(d)?.objectId??null,pe())},pinTooltip(d){P=K(d)?.objectId??null,pe()},resetView(){let d=ze(u,{...Ee},r);U=null,Q(d),V(null),P=null,pe()},exportSvg(){return ue(u,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){Y||(Y=!0,e.removeEventListener("wheel",H),e.removeEventListener("pointerdown",D),e.removeEventListener("pointermove",q),e.removeEventListener("pointerup",te),e.removeEventListener("pointercancel",te),e.removeEventListener("click",y),e.removeEventListener("mouseover",x),e.removeEventListener("mouseleave",B),e.removeEventListener("focusin",fe),e.removeEventListener("focusout",_e),e.removeEventListener("keydown",kt),v?.remove(),v=null,I?.remove(),I=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=l,e.style.position=s,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return we(!0),t.initialViewpointId?_.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?_.focusObject(t.initialSelectionObjectId):Ne(),_;function we(d){if(e.innerHTML=ue(u,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId}),b=e.querySelector('[data-worldorbit-svg="true"]'),w=e.querySelector("#worldorbit-camera-root"),I=null,v=null,i.minimap&&(I=document.createElement("div"),I.dataset.worldorbitMinimapRoot="true",e.append(I)),i.tooltipMode!=="disabled"&&(v=document.createElement("div"),v.className="wo-viewer-tooltip-root",v.dataset.worldorbitTooltip="true",v.hidden=!0,v.addEventListener("click",uo),e.append(v)),!b||!w)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=d?ze(u,{...Ee},r):k(f),V(f.selectedObjectId&&K(f.selectedObjectId)?f.selectedObjectId:null,!1),ve(N&&K(N)?N:null,!1),P=P&&K(P)?P:null,ee(),io(),bn(),t.onViewChange?.({...f}),Ne()}function Q(d){f=k(d),ee(),t.onViewChange?.({...f}),Ne()}function k(d){return{scale:It(d.scale,r.minScale,r.maxScale),rotationDeg:Gi(d.rotationDeg),translateX:Number.isFinite(d.translateX)?d.translateX:f.translateX,translateY:Number.isFinite(d.translateY)?d.translateY:f.translateY,selectedObjectId:d.selectedObjectId&&K(d.selectedObjectId)?d.selectedObjectId:null}}function ee(){w&&(w.setAttribute("transform",sn(u,f)),oo(),pe())}function V(d,m=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${xt(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:d&&K(d)?d:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${xt(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),rr(),pe(),m&&(t.onSelectionChange?.(le()),t.onSelectionDetailsChange?.(je(f.selectedObjectId)),t.onViewChange?.({...f}),Ne())}function ve(d,m=!0){N===d&&m||(N=d&&K(d)?d:null,rr(),pe(),m&&(t.onHoverChange?.(K(N)),t.onHoverDetailsChange?.(je(N))))}function le(){return K(f.selectedObjectId)}function K(d){if(!d)return null;let m=or();return u.objects.find(g=>g.objectId===d&&!g.hidden&&m.has(g.objectId))??null}function je(d){let m=K(d);return m?{objectId:m.objectId,object:m.object,renderObject:m,label:u.labels.find(g=>g.objectId===m.objectId&&!g.hidden)??null,group:u.groups.find(g=>g.renderId===m.groupId)??null,semanticGroups:u.semanticGroups.filter(g=>m.semanticGroupIds.includes(g.id)),orbit:u.orbitVisuals.find(g=>g.objectId===m.objectId&&!g.hidden)??null,relatedOrbits:u.orbitVisuals.filter(g=>!g.hidden&&(g.objectId===m.objectId||m.ancestorIds.includes(g.objectId)||m.childIds.includes(g.objectId))),relations:u.relations.filter(g=>!g.hidden&&(g.fromObjectId===m.objectId||g.toObjectId===m.objectId)),relatedEvents:u.events.filter(g=>!g.hidden&&(g.targetObjectId===m.objectId||g.objectIds.includes(m.objectId))),parent:K(m.parentId),children:m.childIds.map(g=>K(g)).filter(Boolean),ancestors:m.ancestorIds.map(g=>K(g)).filter(Boolean),focusPath:ar(m.objectId)}:null}function rr(){for(let d of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))d.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");ir(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),ir(N,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function ir(d,m){let g=je(d);if(!g)return;let W=new Set([g.objectId,...g.renderObject.childIds,...g.renderObject.ancestorIds]);for(let E of W)for(let T of e.querySelectorAll(`[data-object-id="${xt(E)}"]`))T.classList.add(m.objectClass);for(let E of g.ancestors)for(let T of e.querySelectorAll(`[data-object-id="${xt(E.objectId)}"]`))T.classList.add(m.ancestorClass);for(let E of g.relatedOrbits)for(let T of e.querySelectorAll(`[data-orbit-object-id="${xt(E.objectId)}"]`))T.classList.add(m.orbitClass)}function jt(d,m){if(!b)return{x:u.width/2,y:u.height/2};let g=b.getBoundingClientRect();return!g.width||!g.height?{x:u.width/2,y:u.height/2}:{x:(d-g.left)/g.width*u.width,y:(m-g.top)/g.height*u.height}}function no(d,m){return Ze(u,f,jt(d,m))}function or(){return Jt(u,o.filter??null)}function mn(){let d=or();return u.objects.filter(m=>!m.hidden&&d.has(m.objectId))}function ar(d){let m=u.objects.find(g=>g.objectId===d&&!g.hidden);return m?[...m.ancestorIds,m.objectId].map(g=>K(g)).filter(Boolean):[]}function hn(d){return u.viewpoints.find(m=>m.id===d)??null}function ro(d){let m=Gi(d.rotationDeg),g=d.scale!==null&&d.scale!==void 0?It(d.scale,r.minScale,r.maxScale):null,W=d.objectId&&u.objects.find(T=>T.objectId===d.objectId&&!T.hidden);if(W)return sr({x:W.x,y:W.y},g??Math.max(1.8,Ee.scale),m,d.selectedObjectId??W.objectId);let E=ze(u,{...Ee,rotationDeg:m},r);return g===null?{...E,rotationDeg:m,selectedObjectId:d.selectedObjectId??null}:sr({x:u.contentBounds.centerX,y:u.contentBounds.centerY},g,m,d.selectedObjectId??null)}function sr(d,m,g,W){let E={x:u.width/2,y:u.height/2},T=he(d,E,g);return{scale:m,rotationDeg:g,translateX:E.x-(E.x+(T.x-E.x)*m),translateY:E.y-(E.y+(T.y-E.y)*m),selectedObjectId:W}}function gn(d,m,g){o={...o,filter:oe(d)},g&&(U=null),we(!1)}function io(){t.onFilterChange?.(o.filter??null,mn())}function bn(){t.onViewpointChange?.(hn(U))}function Ne(){t.onAtlasStateChange?.(_.getAtlasState())}function oo(){!i.minimap||!I||(I.innerHTML=Bi(u,f,mn()))}function pe(){if(i.tooltipMode==="disabled"||!v){St(null);return}let d=ao();if(!d){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),St(null);return}let m=je(d.objectId);if(!m){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),St(null);return}let g=Ni(m);J=d.objectId,v.hidden=!1,v.dataset.mode=d.mode,v.classList.toggle("is-pinned",d.mode==="pinned"),v.style.pointerEvents="auto",v.style.visibility="hidden",so(v,g,d.mode),lo(v,m.renderObject),v.style.visibility="visible",St(g)}function ao(){return P&&K(P)?{objectId:P,mode:"pinned"}:N&&K(N)?{objectId:N,mode:"hover"}:null}function so(d,m,g){let W=t.tooltipRenderer?.(m,g);d.innerHTML="",typeof W=="string"?d.innerHTML=W:W instanceof HTMLElement?d.append(W):d.innerHTML=Ui(m,g);let E=document.createElement("div");if(E.className="wo-tooltip-actions",g==="pinned"){let T=document.createElement("button");T.type="button",T.className="wo-tooltip-action",T.dataset.tooltipAction="unpin",T.textContent="Unpin",E.append(T)}else{let T=document.createElement("button");T.type="button",T.className="wo-tooltip-action",T.dataset.tooltipAction="pin",T.dataset.objectId=m.objectId,T.textContent="Pin",E.append(T)}E.childElementCount>0&&d.append(E)}function lo(d,m){if(!b)return;let g={x:m.anchorX??m.x,y:m.anchorY??m.y-Math.max(m.visualRadius,m.radius)},W=co(g),E=b.getBoundingClientRect(),T=e.getBoundingClientRect(),tt=E.left-T.left+W.x/Math.max(u.width,1)*E.width,me=E.top-T.top+W.y/Math.max(u.height,1)*E.height,Ue=Math.max(e.clientWidth-d.offsetWidth-12,12),yn=Math.max(e.clientHeight-d.offsetHeight-12,12),wn=me>e.clientHeight*.48,vn=It(tt+18,12,Ue),fo=It(wn?me-d.offsetHeight-18:me+18,12,yn);d.style.left=`${vn}px`,d.style.top=`${fo}px`}function co(d){let m={x:u.width/2,y:u.height/2},g=he(d,m,f.rotationDeg);return{x:m.x+(g.x-m.x)*f.scale+f.translateX,y:m.y+(g.y-m.y)*f.scale+f.translateY}}function uo(d){let m=d.target?.closest("[data-tooltip-action]");if(m){switch(d.preventDefault(),d.stopPropagation(),m.dataset.tooltipAction){case"pin":P=m.dataset.objectId??J;break;case"unpin":P=null;break}pe()}}function St(d){let m=z?.objectId!==d?.objectId||z?.description!==d?.description||z?.imageHref!==d?.imageHref;z=d,J=d?.objectId??null,m&&t.onTooltipChange?.(d)}}function Tc(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 $t(e,t){switch(e.kind){case"scene":return e.value;case"document":return re(e.value,t);case"source":{let n=be(e.value);return re(n.document,Pc(n,t))}}}function Mc(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 Yi(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?oe(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 Hi(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 Pc(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function qi(e,t,n){let{center:r,distance:i}=Xi(n);return{startState:{...t},startCenter:Ze(e,t,r),startViewportCenter:r,startDistance:i}}function Xi(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 dn(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function Ec(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 It(e,t,n){return Math.min(Math.max(e,t),n)}function Gi(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function xt(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Dc(){if(typeof document>"u"||document.getElementById(Wi))return;let e=document.createElement("style");e.id=Wi,e.textContent=`
|
|
127
127
|
.wo-viewer-tooltip-root {
|
|
128
128
|
position: absolute;
|
|
129
129
|
z-index: 12;
|
|
@@ -189,7 +189,7 @@ var WorldOrbit=(()=>{var mn=Object.defineProperty;var Jo=Object.getOwnPropertyDe
|
|
|
189
189
|
padding: 6px 12px;
|
|
190
190
|
font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
191
191
|
}
|
|
192
|
-
`,document.head.append(e)}var
|
|
192
|
+
`,document.head.append(e)}var Fc="[data-worldorbit-embed]";function tr(e){return encodeURIComponent(JSON.stringify(e))}function nr(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",mode:t.mode??"interactive",scene:t.scene,options:t.options?{...t.options,initialFilter:t.options.initialFilter??null,atlasState:t.options.atlasState??null}:void 0}}function Ki(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 Zi(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=ue(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="${fn(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${fn(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${fn(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${fn(tr(n))}">${r}</div>`}function Ji(e=document,t={}){let n=new Map,r=[...e.querySelectorAll(Fc)];for(let i of r){let o=Cc(i),a=t.mode??o.mode,l=t.theme??o.options?.theme,s=t.layers??o.options?.layers,c=t.subtitle??o.options?.subtitle,u=t.preset??o.options?.preset??o.scene.renderPreset??void 0,f=t.viewer?.initialFilter??o.options?.initialFilter??null,b=t.viewer?.initialViewpointId??o.options?.initialViewpointId,w=t.viewer?.initialSelectionObjectId??o.options?.initialSelectionObjectId,I=t.viewer?.minimap??o.options?.minimap;if(a==="interactive"){let v=De(i,{...t.viewer,scene:o.scene,width:t.width??o.scene.width,height:t.height??o.scene.height,padding:t.padding??o.scene.padding,preset:u,theme:l,layers:s,subtitle:c,initialFilter:f,initialViewpointId:b,initialSelectionObjectId:w,minimap:I});o.options?.atlasState&&v.setAtlasState(o.options.atlasState),n.set(i,v),t.onMount?.(v,i)}else i.innerHTML=ue(o.scene,{width:t.width??o.scene.width,height:t.height??o.scene.height,padding:t.padding??o.scene.padding,preset:u,theme:l,layers:s,filter:f,selectedObjectId:w??null,subtitle:c}),t.onMount?.(null,i);i.dataset.worldorbitMounted="true"}return{viewers:[...n.values()],destroy(){for(let[i,o]of n.entries())o.destroy(),i.removeAttribute("data-worldorbit-mounted");n.clear()}}}function Cc(e){let t=e.dataset.worldorbitPayload;if(!t)throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");return nr(t)}function fn(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}var Qi="worldorbit-atlas-viewer-style";function pn(e,t){if(typeof document>"u")throw new Error("Atlas viewer requires a browser environment.");Rc();let n={search:t.controls?.search??!0,typeFilter:t.controls?.typeFilter??!0,groupFilter:t.controls?.groupFilter??!0,viewpointSelect:t.controls?.viewpointSelect??!0,inspector:t.controls?.inspector??!0,bookmarks:t.controls?.bookmarks??!0};e.classList.add("wo-atlas-viewer"),e.innerHTML=Vc(n);let r=e.querySelector("[data-atlas-toolbar]"),i=e.querySelector("[data-atlas-search]"),o=e.querySelector("[data-atlas-type-filter]"),a=e.querySelector("[data-atlas-group-filter]"),l=e.querySelector("[data-atlas-viewpoint]"),s=e.querySelector("[data-atlas-bookmark]"),c=e.querySelector("[data-atlas-bookmarks]"),u=e.querySelector("[data-atlas-results]"),f=e.querySelector("[data-atlas-inspector]"),b=e.querySelector("[data-atlas-stage]");if(!b)throw new Error("Atlas viewer failed to initialize its stage container.");let w=oe(t.initialFilter??null),I=t.initialQuery?.trim()??w?.query??"",v=t.initialObjectType??(w?.objectTypes?.length===1?w.objectTypes[0]:null),S=w?.groupIds?.[0]??null,A=[],h;h=De(b,{...t,initialFilter:null,onSelectionChange(y){h&&D(),t.onSelectionChange?.(y)},onSelectionDetailsChange(y){h&&D(),t.onSelectionDetailsChange?.(y)},onFilterChange(y,x){h&&(P(y),H(),D()),t.onFilterChange?.(y,x)},onViewpointChange(y){h&&(U(),D()),t.onViewpointChange?.(y)},onAtlasStateChange(y){h&&D(),t.onAtlasStateChange?.(y)},onViewChange(y){h&&D(),t.onViewChange?.(y)}}),M(),J(),z(),P(h.getFilter()),te(),H(),D(),i?.addEventListener("input",()=>{I=i.value.trim(),M()}),o?.addEventListener("change",()=>{v=o.value||null,M()}),a?.addEventListener("change",()=>{S=a.value||null,M()}),l?.addEventListener("change",()=>{let y=$();if(!l.value){y.resetView(),M();return}y.goToViewpoint(l.value),D()}),s?.addEventListener("click",()=>{let y=$(),x=y.getActiveViewpoint()?.label??y.getSelectionDetails()?.objectId??`Bookmark ${A.length+1}`;A=[...A,y.captureBookmark(x,x)],te(),D()}),c?.addEventListener("click",y=>{let x=y.target?.closest("[data-bookmark-id]");if(!x)return;let B=A.find(_e=>_e.id===x.dataset.bookmarkId);if(!B)return;let fe=$();fe.applyBookmark(B),P(fe.getFilter()),H(),D()}),u?.addEventListener("click",y=>{let x=y.target?.closest("[data-object-id]");x&&($().focusObject(x.dataset.objectId??""),D())});function $(){if(!h)throw new Error("Atlas viewer is not initialized.");return h}return{element:e,get viewer(){return $()},getViewer(){return $()},setSource(y){$().setSource(y),C()},setDocument(y){$().setDocument(y),C()},setScene(y){$().setScene(y),C()},getAtlasState(){return $().getAtlasState()},setAtlasState(y){let x=$();x.setAtlasState(y),P(x.getFilter()),H(),D()},getInspectorSnapshot(){return q()},getSearchQuery(){return I},setSearchQuery(y){I=y.trim(),i&&(i.value=I),M()},getObjectTypeFilter(){return v},setObjectTypeFilter(y){v=y,o&&(o.value=y??""),M()},listSearchResults(y=6){return $().search(I,y)},listBookmarks(){return A.map(eo)},captureBookmark(y,x){let B=$().captureBookmark(y,x);return A=[...A,B],te(),D(),eo(B)},applyBookmark(y){let x=$(),B=x.applyBookmark(y);return B&&(P(x.getFilter()),H(),D()),B},goToViewpoint(y){let x=$().goToViewpoint(y);return x&&D(),x},exportSvg(){return $().exportSvg()},destroy(){$().destroy(),e.innerHTML="",e.classList.remove("wo-atlas-viewer")}};function C(){J(),z(),M(),te(),H(),D()}function M(){$().setFilter(N()),J(),H(),D()}function N(){return oe({query:I||void 0,objectTypes:v?[v]:void 0,tags:w?.tags,groupIds:S?[S]:w?.groupIds,includeAncestors:w?.includeAncestors??!0})}function P(y){I=y?.query?.trim()??"",v=y?.objectTypes?.length===1?y.objectTypes[0]:null,S=y?.groupIds?.length===1?y.groupIds[0]:null,i&&document.activeElement!==i&&(i.value=I),o&&(o.value=v??""),a&&(a.value=S??"")}function J(){if(!l)return;let y=$(),x=y.getActiveViewpoint()?.id??"";l.innerHTML=['<option value="">Scene default</option>',...y.listViewpoints().map(B=>`<option value="${ke(B.id)}">${ke(B.label)}</option>`)].join(""),l.value=x}function z(){if(!a)return;let y=$();a.innerHTML=['<option value="">All groups</option>',...y.getScene().semanticGroups.map(x=>`<option value="${ke(x.id)}">${ke(x.label)}</option>`)].join(""),a.value=S??""}function U(){l&&(l.value=$().getActiveViewpoint()?.id??"")}function H(){if(!u)return;let y=$().search(I,6);u.innerHTML=y.map(x=>`<button type="button" class="wo-atlas-pill" data-object-id="${ke(x.objectId)}">${ke(x.objectId)} - ${ke(x.type)}</button>`).join("")}function D(){let y=q();f&&(f.textContent=JSON.stringify(y,null,2)),t.onInspectorChange?.(y)}function q(){let y=$(),x=y.getScene(),B=x.camera;return{selection:y.getSelectionDetails(),activeViewpoint:y.getActiveViewpoint(),filter:y.getFilter(),atlasState:y.getAtlasState(),visibleObjectIds:y.getVisibleObjects().map(fe=>fe.objectId),scene:{title:x.title,projection:x.projection,renderProjection:x.renderProjection,camera:B?{azimuth:B.azimuth,elevation:B.elevation,roll:B.roll,distance:B.distance}:null,renderPreset:x.renderPreset,groupCount:x.groups.length,semanticGroupCount:x.semanticGroups.length,relationCount:x.relations.length,eventCount:x.events.length,viewpointCount:x.viewpoints.length}}}function te(){c&&(c.innerHTML=A.map(y=>`<button type="button" class="wo-atlas-pill" data-bookmark-id="${ke(y.id)}">${ke(y.label)}</button>`).join(""))}}function Vc(e){let t=[e.search?`<label class="wo-atlas-field">
|
|
193
193
|
<span>Search</span>
|
|
194
194
|
<input data-atlas-search type="text" placeholder="Search objects, tags, or types" />
|
|
195
195
|
</label>`:"",e.typeFilter?`<label class="wo-atlas-field">
|
|
@@ -226,7 +226,7 @@ var WorldOrbit=(()=>{var mn=Object.defineProperty;var Jo=Object.getOwnPropertyDe
|
|
|
226
226
|
<div class="wo-atlas-results" data-atlas-results></div>
|
|
227
227
|
${e.bookmarks?'<div class="wo-atlas-bookmarks" data-atlas-bookmarks></div>':""}
|
|
228
228
|
</div>
|
|
229
|
-
</section>`}function
|
|
229
|
+
</section>`}function Rc(){if(document.getElementById(Qi))return;let e=document.createElement("style");e.id=Qi,e.textContent=`
|
|
230
230
|
.wo-atlas-shell { display: grid; gap: 16px; min-width: 0; }
|
|
231
231
|
.wo-atlas-toolbar { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; }
|
|
232
232
|
.wo-atlas-workspace { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); }
|
|
@@ -260,4 +260,4 @@ var WorldOrbit=(()=>{var mn=Object.defineProperty;var Jo=Object.getOwnPropertyDe
|
|
|
260
260
|
.wo-atlas-workspace { grid-template-columns: 1fr; }
|
|
261
261
|
.wo-atlas-inspector { min-height: 220px; }
|
|
262
262
|
}
|
|
263
|
-
`,document.head.append(e)}function
|
|
263
|
+
`,document.head.append(e)}function eo(e){return{...e,atlasState:{...e.atlasState,viewerState:{...e.atlasState.viewerState},renderOptions:{...e.atlasState.renderOptions,layers:e.atlasState.renderOptions.layers?{...e.atlasState.renderOptions.layers}:void 0,scaleModel:e.atlasState.renderOptions.scaleModel?{...e.atlasState.renderOptions.scaleModel}:void 0},filter:e.atlasState.filter?{...e.atlasState.filter}:null}}}function ke(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function to(e="worldorbit-viewer"){if(typeof window>"u"||typeof customElements>"u"||customElements.get(e))return;class t extends HTMLElement{static get observedAttributes(){return["source","mode","theme"]}viewer=null;connectedCallback(){this.renderCurrent()}disconnectedCallback(){this.viewer?.destroy(),this.viewer=null}attributeChangedCallback(){this.isConnected&&this.renderCurrent()}renderCurrent(){this.viewer?.destroy(),this.viewer=null;let r=this.getAttribute("source")??this.textContent??"",i=this.getAttribute("mode")??"interactive";if(!r.trim()){this.innerHTML="";return}let o=zc(r),a=re(o),l=this.getAttribute("theme")??void 0;if(i==="static"){this.innerHTML=ue(a,{theme:l});return}if(i==="atlas"){this.viewer=pn(this,{scene:a,theme:l});return}this.viewer=De(this,{scene:a,theme:l})}}customElements.define(e,t)}function zc(e){return be(e).document}return yo(Bc);})();
|