worldorbit 2.5.13 → 2.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -11
- package/dist/browser/core/dist/index.js +1811 -386
- package/dist/browser/editor/dist/index.js +10534 -0
- package/dist/browser/markdown/dist/index.js +1477 -221
- package/dist/browser/viewer/dist/index.js +1569 -230
- package/dist/unpkg/core/dist/index.js +1814 -389
- package/dist/unpkg/editor/dist/index.js +10559 -0
- package/dist/unpkg/markdown/dist/index.js +1480 -224
- package/dist/unpkg/viewer/dist/index.js +1572 -233
- package/dist/unpkg/worldorbit-core.min.js +12 -5
- package/dist/unpkg/worldorbit-editor.min.js +812 -0
- package/dist/unpkg/worldorbit-markdown.min.js +32 -23
- package/dist/unpkg/worldorbit-viewer.min.js +55 -41
- package/dist/unpkg/worldorbit.js +1713 -231
- package/dist/unpkg/worldorbit.min.js +58 -44
- package/package.json +3 -2
- package/packages/core/README.md +5 -1
- package/packages/core/dist/atlas-edit.d.ts +2 -2
- package/packages/core/dist/atlas-edit.js +70 -7
- package/packages/core/dist/atlas-utils.d.ts +22 -0
- package/packages/core/dist/atlas-utils.js +189 -0
- package/packages/core/dist/atlas-validate.d.ts +2 -0
- package/packages/core/dist/atlas-validate.js +285 -0
- package/packages/core/dist/draft-parse.js +786 -153
- package/packages/core/dist/draft.d.ts +3 -0
- package/packages/core/dist/draft.js +47 -3
- package/packages/core/dist/format.js +165 -9
- package/packages/core/dist/load.js +58 -13
- package/packages/core/dist/normalize.js +7 -0
- package/packages/core/dist/scene.js +66 -13
- package/packages/core/dist/types.d.ts +97 -3
- package/packages/editor/dist/editor.js +44 -0
- package/packages/markdown/README.md +1 -1
- package/packages/viewer/README.md +2 -1
- package/packages/viewer/dist/atlas-state.js +7 -1
- package/packages/viewer/dist/atlas-viewer.js +35 -1
- package/packages/viewer/dist/render.js +16 -7
- package/packages/viewer/dist/theme.js +4 -0
- package/packages/viewer/dist/tooltip.js +35 -0
- package/packages/viewer/dist/types.d.ts +7 -0
- package/packages/viewer/dist/viewer.js +4 -0
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDescriptor;var ao=Object.getOwnPropertyNames;var so=Object.prototype.hasOwnProperty;var lo=(e,t)=>{for(var r in t)Ht(e,r,{get:t[r],enumerable:!0})},co=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ao(t))!so.call(e,o)&&o!==r&&Ht(e,o,{get:()=>t[o],enumerable:!(n=io(t,o))||n.enumerable});return e};var uo=e=>co(Ht({},"__esModule",{value:!0}),e);var ks={};lo(ks,{DEFAULT_VIEWER_STATE:()=>me,WORLDORBIT_FIELD_KEYS:()=>Ar,WORLDORBIT_FIELD_SCHEMAS:()=>Gt,WORLDORBIT_OBJECT_TYPES:()=>ze,WORLD_LAYER_ID:()=>Ct,WorldOrbitError:()=>m,clampScale:()=>Ke,cloneAtlasDocument:()=>vt,composeViewerTransform:()=>Vt,createAtlasViewer:()=>Rt,createDiagnostic:()=>Er,createEmbedPayload:()=>Wn,createEmptyAtlasDocument:()=>lr,createInteractiveViewer:()=>he,createWorldOrbitEmbedMarkup:()=>Yn,defineWorldOrbitViewerElement:()=>Hn,deserializeViewerAtlasState:()=>Ot,deserializeWorldOrbitEmbedPayload:()=>vr,detectWorldOrbitSchemaVersion:()=>mr,diagnosticFromError:()=>X,extractWorldOrbitBlocks:()=>wn,fitViewerState:()=>ve,focusViewerState:()=>Lt,formatAtlasDocument:()=>tr,formatDocument:()=>wt,formatDraftDocument:()=>rr,getAtlasDocumentNode:()=>cr,getFieldSchema:()=>ee,getSceneCenter:()=>$e,getThemePreset:()=>In,getViewerVisibleBounds:()=>Ft,invertViewerPoint:()=>Ve,isKnownFieldKey:()=>Ne,listAtlasDocumentPaths:()=>fn,load:()=>Va,loadWorldOrbitSource:()=>se,loadWorldOrbitSourceWithDiagnostics:()=>hr,materializeAtlasDocument:()=>xe,materializeDraftDocument:()=>Qr,mountWorldOrbitEmbeds:()=>Un,normalizeDocument:()=>te,normalizeRotation:()=>gr,normalizeViewerFilter:()=>K,normalizeWithDiagnostics:()=>Cr,panViewerState:()=>Ie,parse:()=>xn,parseSafe:()=>Fa,parseWithDiagnostics:()=>st,parseWorldOrbit:()=>fe,parseWorldOrbitAtlas:()=>xt,parseWorldOrbitDraft:()=>an,removeAtlasDocumentNode:()=>mn,render:()=>La,renderDocumentToScene:()=>H,renderDocumentToSvg:()=>xr,renderSceneToSvg:()=>re,renderSourceToSvg:()=>Mn,resolveAtlasDiagnosticPath:()=>fr,resolveAtlasDiagnostics:()=>dr,resolveLayers:()=>jt,resolveTheme:()=>$t,rotatePoint:()=>ae,rotateViewerState:()=>Dt,sceneViewpointToLayerOptions:()=>Mt,searchSceneObjects:()=>kt,serializeViewerAtlasState:()=>Tt,serializeWorldOrbitEmbedPayload:()=>Ir,stringify:()=>Ea,supportsObjectType:()=>Kt,tokenizeLine:()=>Dr,tokenizeLineDetailed:()=>we,unitFamilyAllowsUnit:()=>Jt,updateAtlasDocumentNode:()=>pn,upgradeDocumentToDraftV2:()=>yt,upgradeDocumentToV2:()=>Xe,upsertAtlasDocumentNode:()=>ur,validateAtlasDocumentWithDiagnostics:()=>hn,validateDocument:()=>Q,validateDocumentWithDiagnostics:()=>lt,viewpointToViewerFilter:()=>At,zoomViewerStateAt:()=>Le});var m=class e extends Error{line;column;constructor(t,r,n){let o=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var Re=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Z=Re.filter(e=>e!=="system"),fo=["star","planet","moon","asteroid","comet","structure","phenomenon"],Mr=["structure","phenomenon"],de=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],po=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function S(e,t){return{key:e,...t}}var ze=new Set(Re),Gt=new Map([S("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:de}),S("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:de,unitFamily:"distance"}),S("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:de,unitFamily:"distance"}),S("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:de}),S("period",{kind:"unit",placement:!0,arity:"single",objectTypes:de,unitFamily:"duration"}),S("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:de,unitFamily:"angle"}),S("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:de,unitFamily:"angle"}),S("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:de,unitFamily:"angle"}),S("at",{kind:"string",placement:!0,arity:"single",objectTypes:Mr}),S("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Mr}),S("free",{kind:"string",placement:!0,arity:"single",objectTypes:po}),S("kind",{kind:"string",placement:!1,arity:"single",objectTypes:Z}),S("class",{kind:"string",placement:!1,arity:"single",objectTypes:Z}),S("culture",{kind:"string",placement:!1,arity:"single",objectTypes:Z}),S("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Re}),S("color",{kind:"string",placement:!1,arity:"single",objectTypes:Re}),S("image",{kind:"string",placement:!1,arity:"single",objectTypes:fo}),S("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Re}),S("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:Z,unitFamily:"radius"}),S("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:Z,unitFamily:"mass"}),S("density",{kind:"unit",placement:!1,arity:"single",objectTypes:Z,unitFamily:"generic"}),S("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:Z,unitFamily:"generic"}),S("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:Z,unitFamily:"generic"}),S("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:Z}),S("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),S("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),S("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),S("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),S("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),S("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),S("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),S("on",{kind:"string",placement:!1,arity:"single",objectTypes:Z}),S("source",{kind:"string",placement:!1,arity:"single",objectTypes:Z}),S("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:Z,unitFamily:"duration"})].map(e=>[e.key,e])),Ar=new Set(Gt.keys());function ee(e){return Gt.get(e)}function Ne(e){return Ar.has(e)}function Kt(e,t){return e.objectTypes.includes(t)}function Jt(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 Dr(e){return we(e).map(t=>t.value)}function we(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,a=!1,s=!1,c=null,d=()=>{i!==null&&(r.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],w=n+u+1;if(s&&f==="\\"){let g=e[u+1];if(g==='"'||g==="\\"){o+=g,u++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=w),a=!0,c=w,s=!0);continue}if(!s&&/\s/.test(f)){d();continue}i===null&&(i=w),o+=f}if(s)throw new m("Unclosed quote in line",t.line,c??n+e.length);return d(),r}function ot(e){return e.match(/^\s*/)?.[0].length??0}function fe(e){let t=e.split(/\r?\n/),r=[],n=null,o=!1,i=null;for(let a=0;a<t.length;a++){let s=t[a],c=a+1;if(!s.trim())continue;let d=ot(s),u=we(s.slice(d),{line:c,columnOffset:d});if(u.length!==0){if(d===0){o=!1,i=null;let f=mo(u,c);r.push(f),n=f;continue}if(!n)throw new m("Indented line without parent object",c,d+1);if(u.length===1&&u[0].value==="info"){o=!0,i=d;continue}o&&d<=(i??0)&&(o=!1),o?n.infoEntries.push(go(u,c)):n.blockFields.push(bo(u,c))}}return{type:"document",objects:r}}function mo(e,t){if(e.length<2)throw new m("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!ze.has(r.value))throw new m(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:ho(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function ho(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=ee(o.value);if(!i)throw new m(`Unknown field "${o.value}"`,t,o.column);n++;let a=[];if(i.arity==="multiple")for(;n<e.length&&!Ne(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new m(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return r}function bo(e,t){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);if(!ee(e[0].value))throw new m(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function go(e,t){if(e.length<2)throw new m("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}var Lr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,yo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),wo=/^[A-Za-z][A-Za-z0-9+.-]*:/;function te(e){let t=null,r=[];for(let n of e.objects){let o=xo(n);if(n.objectType==="system"){if(t)throw m.fromLocation("Only one system object is allowed",n.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",system:t,objects:r}}function xo(e){let t=[...e.inlineFields,...e.blockFields];Io(e.objectType,t);let r=vo(t),n=$o(e.objectType,r),o=jo(r),i=To(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:n,info:i}}function Io(e,t){for(let r of t){let n=ee(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!Kt(n,e))throw m.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw m.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function vo(e){let t=new Map;for(let r of e){if(t.has(r.key))throw m.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function $o(e,t){let r=t.has("orbit"),n=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[r,n,o,i].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw m.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw m.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:it(t,"orbit"),distance:Me(t,"distance"),semiMajor:Me(t,"semiMajor"),eccentricity:Ao(t,"eccentricity"),period:Me(t,"period"),angle:Me(t,"angle"),inclination:Me(t,"inclination"),phase:Me(t,"phase")};if(n){let s=at(t,"at"),c=it(t,"at");return{mode:"at",target:c,reference:Oo(c,s.location)}}if(o)return{mode:"surface",target:it(t,"surface")};if(i){let s=it(t,"free"),c=Mo(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function jo(e){let t={};for(let[r,n]of e.entries()){let o=ee(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=Do(n);break;case"number":t[r]=Fr(Ae(n),r,n.location);break;case"unit":t[r]=Vr(Ae(n),n.location,r);break;case"string":t[r]=So(r,n);break}}return t}function So(e,t){let r=t.values.join(" ").trim();return e==="image"&&ko(r,t.location),r}function ko(e,t){if(!e)throw m.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw m.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(wo);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw m.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function To(e){let t={};for(let r of e){if(r.key in t)throw m.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function Oo(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.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 Vr(e,t,r){let n=e.match(Lr);if(!n)throw m.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=ee(r);if(i?.unitFamily&&!Jt(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function Mo(e){let t=e.match(Lr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Me(e,t){if(!e.has(t))return;let r=at(e,t);return Vr(Ae(r),r.location,t)}function Ao(e,t){if(!e.has(t))return;let r=at(e,t);return Fr(Ae(r),t,r.location)}function Fr(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw m.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function Do(e){let t=Ae(e).toLowerCase(),r=yo.get(t);if(r===void 0)throw m.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function at(e,t){let r=e.get(t);if(!r)throw new m(`Missing value for key "${t}"`);return r}function it(e,t){return Ae(at(e,t))}function Ae(e){if(e.values.length!==1)throw m.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Lo=new Set(["star","planet","moon","asteroid","comet"]);function Q(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new m(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new m(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let o=r.get(n.placement.target);if(!o||!Lo.has(o.type))throw new m(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&Vo(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&Fo(n,n.placement.reference,t))}}function Vo(e,t,r){if(!r.has(t.primary))throw new m(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new m(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Fo(e,t,r){if(!r.has(t.objectId))throw new m(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Er(e){return{...e}}function X(e,t,r=`${t}.failed`){return e instanceof m?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}function st(e){let t;try{t=fe(e)}catch(n){return{ok:!1,value:null,diagnostics:[X(n,"parse")]}}let r;try{r=te(t)}catch(n){return{ok:!1,value:null,diagnostics:[X(n,"normalize")]}}try{Q(r)}catch(n){return{ok:!1,value:null,diagnostics:[X(n,"validate")]}}return{ok:!0,value:{ast:t,document:r},diagnostics:[]}}function Cr(e){try{return{ok:!0,value:te(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[X(t,"normalize")]}}}function lt(e){try{return Q(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[X(t,"validate")]}}}var _e=1495978707e-1,Eo=6371,Co=71492,Po=695700,Bo=63241.077,Ro=206264.806,zo=206264806,_r=.68,No=.2,Wr=28;function H(e,t={}){let r=Wo(t),n=r.width,o=r.height,i=r.padding,a=_o(e),s=Uo(e,t.projection),c=qo(a,t.scaleModel),d=Ho(a),u=e.system?.id??null,f=new Map(e.objects.map($=>[$.id,$])),w=ki(e.objects,f),g=new Map,I=[],x=[],y=[],v=[],D=[],A=new Map,F=new Map;for(let $ of e.objects){let Y=$.placement;if(!Y){y.push($);continue}if(Y.mode==="orbit"){Rr(F,Y.target,$);continue}if(Y.mode==="surface"){Rr(A,Y.target,$);continue}if(Y.mode==="at"){D.push($);continue}v.push($)}let B=v.length>0?n*.42:n/2,L=o/2,E={orbitChildren:F,surfaceChildren:A,objectMap:f,spacingFactor:d,projection:s,scaleModel:c},V=y.find($=>$.type==="star")??y[0]??null;V&&Zt(V,B,L,0,g,I,x,E);let W=y.filter($=>$.id!==V?.id);if(W.length>0){let $=Math.min(n,o)*.28*d*c.orbitDistanceMultiplier;W.forEach((Y,C)=>{let ke=Ue(C,W.length,-Math.PI/2),M=qe(ke,$,s,1);Zt(Y,B+M.x,L+M.y,0,g,I,x,E)})}v.forEach(($,Y)=>{let C=n-i-140-Li($.placement?.mode==="free"?$.placement.distance:void 0,c),ke=Math.max(76,(o-i*2-180)/Math.max(1,v.length)*d)*c.freePlacementMultiplier,M=i+92+Y*ke;g.set($.id,{object:$,x:C,y:M,radius:ft($,0,c),sortKey:mt(C,M,0)}),x.push({object:$,groupId:w.groupIds.get($.id)??null,x1:C-60,y1:M,x2:C-18,y2:M,mode:"free"}),ut($,g,I,x,E,1)}),D.forEach(($,Y)=>{if(g.has($.id)||!$.placement||$.placement.mode!=="at")return;let C=ji($.placement.reference,g,f,Y,D.length,n,o,i,E);g.set($.id,{object:$,x:C.x,y:C.y,radius:ft($,2,c),sortKey:mt(C.x,C.y,2),anchorX:C.anchorX,anchorY:C.anchorY}),C.anchorX!==void 0&&C.anchorY!==void 0&&x.push({object:$,groupId:w.groupIds.get($.id)??null,x1:C.anchorX,y1:C.anchorY,x2:C.x,y2:C.y,mode:"at"}),ut($,g,I,x,E,2)});let O=[...g.values()].map($=>Go($,c,w)),z=I.map($=>Ko($,w.groupIds.get($.object.id)??null)),J=x.map($=>Jo($)),h=Zo(O,o,c.labelMultiplier),j=Qo(z,J,O,h),N=ei(O,z,J,h,w),be=ti(e,s,r.preset,w,f),Se=hi(n,o,O,z,J,h);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:s,scaleModel:c,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${zr(s)} view - ${zr(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:r.preset??"custom"},contentBounds:Se,layers:j,groups:N,viewpoints:be,objects:O,orbitVisuals:z,leaders:J,labels:h}}function ae(e,t,r){let n=gt(r),o=Math.cos(n),i=Math.sin(n),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 _o(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 Wo(e){let t=Yo(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Yo(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 Uo(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function qo(e,t){return{...Xo(e),...t}}function Xo(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 Ho(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Go(e,t,r){let{object:n,x:o,y:i,radius:a,sortKey:s,anchorX:c,anchorY:d}=e;return{renderId:bt(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,x:o,y:i,radius:a,visualRadius:Di(n,a,t),sortKey:s,anchorX:c,anchorY:d,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:Fi(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function Ko(e,t){return{renderId:`${bt(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,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}}function Jo(e){return{renderId:`${bt(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Zo(e,t,r){let n=[],o=[],i=[...e].filter(a=>!a.hidden).sort((a,s)=>a.sortKey-s.sortKey);for(let a of i){let s=a.y>t*.62?-1:1,c=Ei(a,r),d=a.y+s*(a.radius+18*r),u=d+s*(16*r),f=Pr(a.x,d,u,c,s),w=0;for(;o.some(g=>Mi(g,f))&&w<10;)d+=s*14*r,u+=s*14*r,f=Pr(a.x,d,u,c,s),w+=1;o.push(f),n.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,label:a.label,secondaryLabel:a.secondaryLabel,x:a.x,y:d,secondaryY:u,textAnchor:"middle",direction:s<0?"above":"below",hidden:a.hidden})}return n}function Qo(e,t,r,n){let o=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),i=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:o},{id:"orbits-front",renderIds:i},{id:"objects",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ei(e,t,r,n,o){let i=new Map,a=s=>{if(!s)return null;let c=i.get(s);if(c)return c;let d=o.groupRoots.get(s)??null,u={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Ye(0,0,0,0)};return i.set(s,u),u};for(let s of e){let c=a(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=a(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of r){let c=a(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of n){let c=a(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of i.values())s.contentBounds=Ti(s,e,t,r,n);return[...i.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ti(e,t,r,n,o){let i=ri(e,t,r),a=new Map;for(let[d,u]of Object.entries(e.system?.info??{})){if(!d.startsWith("viewpoint."))continue;let[f,w,...g]=d.split(".");if(f!=="viewpoint"||!w||g.length===0)continue;let I=fi(w);if(!I)continue;let x=g.join(".").toLowerCase(),y=a.get(I)??{id:I};ni(y,x,u,t,r,n,o),a.set(I,y)}let s=[...a.values()].map(d=>oi(d,t,r,o)).filter(Boolean),c=s.findIndex(d=>d.id===i.id);return c>=0?s.splice(c,1,{...i,...s[c],layers:{...i.layers,...s[c].layers},filter:s[c].filter??i.filter,generated:!1}):s.unshift(i),s.sort((d,u)=>d.id==="overview"?-1:u.id==="overview"?1:d.label.localeCompare(u.label))}function ri(e,t,r){return{id:"overview",label:e.system?.properties.title?`${String(e.system.properties.title)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function ni(e,t,r,n,o,i,a){let s=r.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"projection":case"view":e.projection=ai(s)??n;return;case"preset":e.preset=si(s)??o;return;case"rotation":case"angle":e.rotationDeg=Yr(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=li(s);return;case"layers":e.layers=ci(s);return;case"query":e.filter={...e.filter??ct(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??ct(),objectTypes:ui(s)};return;case"tags":e.filter={...e.filter??ct(),tags:ht(s)};return;case"groups":e.filter={...e.filter??ct(),groupIds:di(s,i,a)};return}}function oi(e,t,r,n){let o=e.focus&&n.has(e.focus)?e.focus:null,i=e.select&&n.has(e.select)?e.select:o,a=ii(e.filter),s=e.label?.trim()||pi(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||mi(s,o,a),objectId:o,selectedObjectId:i,projection:e.projection??t,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function ct(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ii(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 ai(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function si(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Yr(e){let t=Number(e);return Number.isFinite(t)?t:null}function li(e){let t=Yr(e);return t!==null&&t>0?t:null}function ci(e){let t={};for(let r of ht(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),o=r.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=n)}return t}function ui(e){return ht(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function di(e,t,r){return ht(e).map(n=>n.startsWith("wo-")&&n.endsWith("-group")?n:t.groupIds.has(n)?t.groupIds.get(n)??We(n):(r.has(n),We(n)))}function ht(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function fi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function pi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function mi(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function hi(e,t,r,n,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,u=(f,w)=>{a=Math.min(a,f),s=Math.min(s,w),c=Math.max(c,f),d=Math.max(d,w)};for(let f of n)f.hidden||Ur(f,u);for(let f of o)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of r)f.hidden||qr(f,u);for(let f of i)f.hidden||Xr(f,u);return!Number.isFinite(a)||!Number.isFinite(s)?Ye(0,0,e,t):Ye(a,s,c,d)}function Ur(e,t){let r=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,o=e.ry??e.radius??0,i=Gr(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,Wr*2);for(let a of i)t(a.x-r,a.y-r),t(a.x+r,a.y+r)}function Ye(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function qr(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 Xr(e,t){let n=Ci(e.label,e.secondaryLabel,1);t(e.x-n,e.y-18),t(e.x+n,e.y+8),t(e.x-n,e.secondaryY-14),t(e.x+n,e.secondaryY+8)}function Zt(e,t,r,n,o,i,a,s){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:r,radius:ft(e,n,s.scaleModel),sortKey:mt(t,r,n)}),ut(e,o,i,a,s,n+1))}function ut(e,t,r,n,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(bi),c=gi(s,a.radius,o.spacingFactor,o.scaleModel),d=xi(s,c);s.forEach((f,w)=>{let g=yi(f,w,s.length,a,c,d[w]??c.innerPx,o);r.push({object:f,parentId:e.id,kind:g.kind,cx:g.cx,cy:g.cy,radius:g.radius,rx:g.rx,ry:g.ry,rotationDeg:g.rotationDeg,band:g.band,bandThickness:g.bandThickness,frontArcPath:g.frontArcPath,backArcPath:g.backArcPath}),Zt(f,g.objectX,g.objectY,i,t,r,n,o)});let u=[...o.surfaceChildren.get(e.id)??[]];u.forEach((f,w)=>{let g=Ue(w,u.length,-Math.PI/3),I=28*o.spacingFactor,x=qe(g,a.radius,o.projection,o.projection==="isometric"?.9:1),y=qe(g,a.radius+I,o.projection,o.projection==="isometric"?.9:1),v=a.x+x.x,D=a.y+x.y,A=a.x+y.x,F=a.y+y.y;t.set(f.id,{object:f,x:A,y:F,radius:ft(f,i+1,o.scaleModel),sortKey:mt(A,F,i+1),anchorX:v,anchorY:D}),n.push({object:f,groupId:o.objectMap.has(f.id)?We(Oi(f,o.objectMap)):null,x1:v,y1:D,x2:A,y2:F,mode:"surface"}),ut(f,t,r,n,o,i+1)})}function bi(e,t){let r=dt(e),n=dt(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function gi(e,t,r,n){let o=e.map(f=>dt(f)),i=o.filter(f=>f!==null),a=t+56*r*n.orbitDistanceMultiplier,s=(e.length>2?54:64)*r*n.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 c=Math.min(...i),d=Math.max(...i),u=d-c;return{metrics:o,minMetric:c,maxMetric:d,metricSpread:u,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function yi(e,t,r,n,o,i,a){let s=e.placement,c=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let V=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:V,rotationDeg:0,band:c,bandThickness:c?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-V}}let d=R(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),u=i,f=Math.max(u*Math.sqrt(1-d*d),u*.18),w=er(s.inclination)??0,g=a.projection==="isometric"?Math.max(No,Math.cos(gt(w)))*_r:1,I=Math.max(f*g,u*.14),x=er(s.angle)??0,y=u*d,v=Jr(-y,0,x),D=n.x+v.x,A=n.y+v.y,F=vi(s.phase,t,r),B=Kr(D,A,u,I,x,F),L=a.projection==="topdown"&&d<=1e-4&&Math.abs(x)<=1e-4,E=c?$i(e,u,o,a.scaleModel):void 0;return{kind:L?"circle":"ellipse",cx:L?n.x:D,cy:L?n.y:A,radius:L?u:void 0,rx:L?void 0:u,ry:L?void 0:I,rotationDeg:x,band:c,bandThickness:E,frontArcPath:a.projection==="isometric"||c?Br(D,A,u,I,x,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||c?Br(D,A,u,I,x,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function wi(e,t){return t.innerPx+t.stepPx*Ii(Math.max(e,0)+1)}function xi(e,t){let r=[];return e.forEach((n,o)=>{let i=dt(n),a=t.innerPx+o*t.stepPx,s=i===null?a:wi(i,t),c=o===0?t.innerPx:(r[o-1]??t.innerPx)+t.minimumGapPx;r.push(Math.max(s,c))}),r}function dt(e){return!e.placement||e.placement.mode!=="orbit"?null:pt(e.placement.semiMajor??e.placement.distance??null)}function Ii(e){return Math.log(e)/Math.log(2)}function vi(e,t,r){let n=e?er(e):null;return n!==null?gt(n-90):Ue(t,r,-Math.PI/2)}function $i(e,t,r,n){let o=pt(Qt(e.properties.inner)),i=pt(Qt(e.properties.outer));if(o!==null&&i!==null){let s=Math.abs(i-o);if(r.metricSpread>0)return R(s/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(o,i),1e-4);return R(s/c*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function ji(e,t,r,n,o,i,a,s,c){if(e.kind==="lagrange")return Si(e,t,r,i,a);if(e.kind==="anchor"){let d=t.get(e.objectId);if(d){let u=Ue(n,o,Math.PI/5),f=(d.radius+36)*c.scaleModel.labelMultiplier,w=qe(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:d.x+w.x,y:d.y+w.y,anchorX:d.x,anchorY:d.y}}}if(e.kind==="named"){let d=t.get(e.name);if(d){let u=Ue(n,o,Math.PI/6),f=(d.radius+36)*c.scaleModel.labelMultiplier,w=qe(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:d.x+w.x,y:d.y+w.y,anchorX:d.x,anchorY:d.y}}}return{x:i-s-170,y:a-s-86-n*58*c.scaleModel.freePlacementMultiplier}}function Si(e,t,r,n,o){let i=e.secondary?t.get(e.primary):Ai(e.primary,t,r),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:n*.7,y:o*.25};let s=a.x-i.x,c=a.y-i.y,d=Math.hypot(s,c)||1,u=s/d,f=c/d,w=-f,g=u,I=R(d*.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:i.x-u*I,y:i.y-f*I,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(u*.5-w*.8660254)*I,y:a.y+(f*.5-g*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+w*.8660254)*I,y:a.y+(f*.5+g*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function ki(e,t){let r=new Map,n=new Map;for(let d of e){let u=Hr(d,t);if(r.set(d.id,u),u){let f=n.get(u);f?f.push(d.id):n.set(u,[d.id])}n.has(d.id)||n.set(d.id,[])}let o=new Map,i=new Map,a=new Map,s=d=>{let u=o.get(d);if(u)return u;let f=new Set,w=[],g=r.get(d)??null;for(;g&&!f.has(g);)w.push(g),f.add(g),g=r.get(g)??null;return o.set(d,w),w},c=d=>{let u=a.get(i.get(d)??"");if(u)return u;let f=r.get(d)??null,w=t.get(d),g=d;return w?.placement&&w.placement.mode!=="free"&&f&&(g=c(f)),g};for(let d of e){s(d.id);let u=c(d.id),f=We(u);i.set(d.id,f),a.set(f,u)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:a}}function Hr(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function Ti(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=(u,f)=>{i=Math.min(i,u),a=Math.min(a,f),s=Math.max(s,u),c=Math.max(c,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&qr(u,d);for(let u of r)!u.hidden&&e.orbitIds.includes(u.objectId)&&Ur(u,d);for(let u of n)!u.hidden&&e.leaderIds.includes(u.objectId)&&(d(u.x1,u.y1),d(u.x2,u.y2));for(let u of o)!u.hidden&&e.labelIds.includes(u.objectId)&&Xr(u,d);return!Number.isFinite(i)||!Number.isFinite(a)?Ye(0,0,0,0):Ye(i,a,s,c)}function Oi(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let o=Hr(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function Pr(e,t,r,n,o){return{left:e-n,right:e+n,top:Math.min(t,r)-(o<0?18:12),bottom:Math.max(t,r)+(o<0?8:12)}}function Mi(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ai(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function ft(e,t,r){let n=Vi(e.properties.radius,r);if(n!==null)return n;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return R((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return R(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return R(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return R(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return R(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return R(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return R(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return R(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return R(8*o,r.minBodyRadius,r.maxBodyRadius)}}function Di(e,t,r){let n=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+n,r.maxBodyRadius+10)}}function pt(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/_e;case"m":return e.value/1e3/_e;case"ly":return e.value*Bo;case"pc":return e.value*Ro;case"kpc":return e.value*zo;case"re":return e.value*Eo/_e;case"rj":return e.value*Co/_e;case"sol":return e.value*Po/_e;default:return e.value}}function Li(e,t){let r=pt(e??null);return r===null||r<=0?0:R(r*96*t.freePlacementMultiplier,0,420)}function Vi(e,t){let r=Qt(e);if(!r)return null;let n;switch(r.unit){case"sol":n=R(r.value*22,14,40);break;case"re":n=R(r.value*10,6,18);break;case"km":n=R(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:n=R(r.value*4,4,20);break}return R(n*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Qt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function er(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ue(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function Br(e,t,r,n,o,i,a){let s=Gr(e,t,r,n,o,i,a,Wr);return s.length===0?"":s.map((c,d)=>`${d===0?"M":"L"} ${Nr(c.x)} ${Nr(c.y)}`).join(" ")}function Gr(e,t,r,n,o,i,a,s){let c=[];for(let d=0;d<=s;d+=1){let u=i+(a-i)*d/s;c.push(Kr(e,t,r,n,o,u))}return c}function Kr(e,t,r,n,o,i){let a=r*Math.cos(i),s=n*Math.sin(i),c=Jr(a,s,o);return{x:e+c.x,y:t+c.y}}function Jr(e,t,r){let n=gt(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function qe(e,t,r,n){let o=r==="isometric"?_r*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function mt(e,t,r){return t*1e3+e+r*.01}function R(e,t,r){return Math.min(Math.max(e,t),r)}function Rr(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function bt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function We(e){return`${bt(e)}-group`}function Fi(e){return typeof e=="string"&&e.trim()?e:void 0}function Ei(e,t){let r=e.label.length*4.6*t+18,n=e.secondaryLabel.length*3.9*t+18;return Math.max(r,n,e.visualRadius+18)}function Ci(e,t,r){let n=e.length*4.6*r+18,o=t.length*3.9*r+18;return Math.max(n,o,24)}function zr(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function gt(e){return e*Math.PI/180}function Nr(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function Xe(e,t={}){let r=H(e,t),n=[],o=Ri(e,n),i=zi(e,n),a=Bi(e,r.renderPreset??t.preset??null,r.projection),s=e.system?Pi(e,a,o,i,n,r.renderPreset??t.preset??null):null;return r.viewpoints.some(c=>!c.generated)&&n.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${r.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",sourceVersion:e.version,system:s,objects:e.objects.map(en),diagnostics:n}}function yt(e,t={}){return Hi(Xe(e,t))}function xe(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Ui(e.system),info:qi(e.system)}:null,objects:e.objects.map(en)}}function Qr(e){return xe(e)}function Pi(e,t,r,n,o,i){let a=H(e,{preset:i??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:typeof e.system?.properties.title=="string"?e.system.properties.title:null,defaults:t,atlasMetadata:r,viewpoints:a.viewpoints.map(Ni),annotations:n}}function Bi(e,t,r){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":r,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Ri(e,t){let r={};for(let[o,i]of Object.entries(e.system?.info??{}))o.startsWith("viewpoint.")||o.startsWith("annotation.")||(r[o]=i);let n=Object.keys(r);return n.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${n.length} system info entr${n.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),r}function zi(e,t){let r=new Map;for(let[n,o]of Object.entries(e.system?.info??{})){if(!n.startsWith("annotation."))continue;let[,i,...a]=n.split(".");if(!i||a.length===0)continue;let s=Zr(i);if(!s)continue;let c=r.get(s)??{id:s};switch(a.join(".").toLowerCase()){case"label":c.label=o;break;case"target":case"object":c.targetObjectId=o.trim()||null;break;case"body":case"text":case"description":c.body=o;break;case"tags":c.tags=Wi(o);break}r.set(s,c)}for(let n of e.objects){let o=n.info.description;if(!o)continue;let i=Zr(`${n.id}-notes`);r.has(i)||(r.set(i,{id:i,label:`${n.id} Notes`,targetObjectId:n.id,body:o,tags:Array.isArray(n.properties.tags)?n.properties.tags.filter(a=>typeof a=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${n.id}.info.description into structured atlas annotation "${i}".`,objectId:n.id,field:"description"}))}return[...r.values()].filter(n=>n.body||n.label).map(n=>({id:n.id,label:n.label??Yi(n.id),targetObjectId:n.targetObjectId??null,body:n.body??"",tags:n.tags??[],sourceObjectId:n.targetObjectId??null})).sort((n,o)=>n.label.localeCompare(o.label))}function Ni(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function en(e){return{...e,properties:_i(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function _i(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function Wi(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Zr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Yi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ui(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),t}function qi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg));let o=Xi(r.layers);o&&(t[`${n}.layers`]=o),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??"")}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function Xi(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function Hi(e){return{...e,version:"2.0-draft"}}var tn=["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 wt(e,t={}){let r=t.schema??"auto";if(r==="2.0"||r==="2.0-draft"||e.version==="2.0"||e.version==="2.0-draft"){if(r==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"?{...e,version:"2.0-draft"}:yt(e);return rr(c)}let s=e.version==="2.0"?e:e.version==="2.0-draft"?{...e,version:"2.0"}:Xe(e);return tr(s)}let o=[],i=e;i.system&&o.push(...Gi(i.system));let a=[...i.objects].sort(ir);for(let s of a)o.length>0&&o.push(""),o.push(...Ki(s));return o.join(`
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function Gi(e){return nr("system",e.id,e.properties,null,e.info)}function nn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${U(e.title)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${U(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${U(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${U(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[r,n]of Object.entries(e.atlasMetadata).sort(([o],[i])=>o.localeCompare(i)))t.push(` ${r} ${U(n)}`)}for(let r of e.viewpoints)t.push(""),t.push(...Qi(r));for(let r of e.annotations)t.push(""),t.push(...ea(r));return t}function Ki(e){return nr(e.type,e.id,e.properties,e.placement,e.info)}function on(e){return nr(`object ${e.type}`,e.id,e.properties,e.placement,e.info)}function nr(e,t,r,n,o){let i=[`${e} ${t}`],a=[...Ji(n),...Zi(r)];for(let c of a)i.push(` ${c}`);let s=Object.entries(o).sort(([c],[d])=>c.localeCompare(d));if(s.length>0){a.length>0&&i.push(""),i.push(" info");for(let[c,d]of s)i.push(` ${c} ${U(d)}`)}return i}function Ji(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...De("distance",e.distance),...De("semiMajor",e.semiMajor),...ra("eccentricity",e.eccentricity),...De("period",e.period),...De("angle",e.angle),...De("inclination",e.inclination),...De("phase",e.phase)];case"at":return[`at ${na(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?or(e.distance):e.descriptor??""}`.trim()]}}function Zi(e){return Object.keys(e).sort(ia).map(t=>`${t} ${ta(e[t])}`)}function Qi(e){let t=[`viewpoint ${e.id}`,` label ${U(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 ${U(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let r=oa(e.layers);return r.length>0&&t.push(` layers ${r.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${U(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(U).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function ea(e){let t=[`annotation ${e.id}`,` label ${U(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${U(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(U).join(" ")}`),t}function ta(e){return Array.isArray(e)?e.map(t=>U(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?U(e):or(e)}function or(e){return`${e.value}${e.unit??""}`}function De(e,t){return t?[`${e} ${or(t)}`]:[]}function ra(e,t){return t===void 0?[]:[`${e} ${t}`]}function na(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 oa(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t}function ia(e,t){let r=tn.indexOf(e),n=tn.indexOf(t);return r===-1&&n===-1?e.localeCompare(t):r===-1?1:n===-1?-1:r-n}function ir(e,t){let r=rn(e.type),n=rn(t.type);return r!==n?r-n:e.id.localeCompare(t.id)}function rn(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 U(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function xt(e){return sn(e,"2.0")}function an(e){return sn(e,"2.0-draft")}function sn(e,t){let r=e.split(/\r?\n/),n=!1,o="2.0",i=null,a=null,s=[],c=!1,d=!1,u=new Set,f=new Set;for(let x=0;x<r.length;x++){let y=r[x],v=x+1;if(!y.trim())continue;let D=ot(y),A=we(y.slice(D),{line:v,columnOffset:D});if(A.length!==0){if(!n){o=aa(A,v),n=!0;continue}if(D===0){a=sa(A,v,i,s,u,f,{sawDefaults:c,sawAtlas:d}),a.kind==="system"?i=a.system:a.kind==="defaults"?c=!0:a.kind==="atlas"&&(d=!0);continue}if(!a)throw new m("Indented line without parent atlas section",v,D+1);fa(a,D,A,v)}}if(!n)throw new m('Missing required atlas schema header "schema 2.0"');let g=te({type:"document",objects:s}).objects;return Q({format:"worldorbit",version:"1.0",system:null,objects:g}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:i,objects:g,diagnostics:o==="2.0-draft"&&t==="2.0"?[{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".'}]:[]}}function aa(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||e[1].value.toLowerCase()!=="2.0-draft"&&e[1].value.toLowerCase()!=="2.0")throw new m('Expected atlas header "schema 2.0" or legacy "schema 2.0-draft"',t,e[0]?.column??1);return e[1].value.toLowerCase()==="2.0-draft"?"2.0-draft":"2.0"}function sa(e,t,r,n,o,i,a){switch(e[0]?.value.toLowerCase()){case"system":if(r)throw new m('Atlas section "system" may only appear once',t,e[0].column);return la(e,t);case"defaults":if(!r)throw new m('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(a.sawDefaults)throw new m('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:r,seenFields:new Set};case"atlas":if(!r)throw new m('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(a.sawAtlas)throw new m('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:r,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!r)throw new m('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return ca(e,t,r,o);case"annotation":if(!r)throw new m('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return ua(e,t,r,i);case"object":return da(e,t,n);default:throw new m(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function la(e,t){if(e.length!==2)throw new m("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},seenFields:new Set}}function ca(e,t,r,n){if(e.length!==2)throw new m("Invalid viewpoint declaration",t,e[0]?.column??1);let o=un(e[1].value);if(!o)throw new m("Viewpoint id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate viewpoint id "${o}"`,t,e[1].column);let i={id:o,label:dn(o),summary:"",focusObjectId:null,selectedObjectId:null,projection:r.defaults.view,preset:r.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return r.viewpoints.push(i),n.add(o),{kind:"viewpoint",viewpoint:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function ua(e,t,r,n){if(e.length!==2)throw new m("Invalid annotation declaration",t,e[0]?.column??1);let o=un(e[1].value);if(!o)throw new m("Annotation id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:dn(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function da(e,t,r){if(e.length<3)throw new m("Invalid atlas object declaration",t,e[0]?.column??1);let n=e[1],o=e[2],i=n.value;if(!ze.has(i)||i==="system")throw new m(`Unknown object type "${n.value}"`,t,n.column);let a={type:"object",objectType:i,name:o.value,inlineFields:Sa(e.slice(3),t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}};return r.push(a),{kind:"object",objectNode:a,inInfoBlock:!1,infoIndent:null}}function fa(e,t,r,n){switch(e.kind){case"system":pa(e,r,n);return;case"defaults":ma(e,r,n);return;case"atlas":ha(e,t,r,n);return;case"viewpoint":ba(e,t,r,n);return;case"annotation":ya(e,r,n);return;case"object":wa(e,t,r,n);return}}function pa(e,t,r){if(He(t,e.seenFields,r)!=="title")throw new m(`Unknown system atlas field "${t[0].value}"`,r,t[0].column);e.system.title=pe(t,r)}function ma(e,t,r){let n=He(t,e.seenFields,r),o=pe(t,r);switch(n){case"view":e.system.defaults.view=ln(o,r,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=cn(o,r,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new m(`Unknown defaults field "${t[0].value}"`,r,t[0].column)}}function ha(e,t,r,n){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){if(r.length<2)throw new m("Invalid atlas metadata entry",n,r[0]?.column??1);let o=r[0].value;if(o in e.system.atlasMetadata)throw new m(`Duplicate atlas metadata key "${o}"`,n,r[0].column);e.system.atlasMetadata[o]=pe(r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new m(`Unknown atlas field "${r[0].value}"`,n,r[0].column)}function ba(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){ga(e,r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new m('Duplicate viewpoint field "filter"',n,r[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=He(r,e.seenFields,n),i=pe(r,n);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=ln(i,n,r[0].column);return;case"preset":e.viewpoint.preset=cn(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=va(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=$a(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=Ia(r.slice(1),n);return;default:throw new m(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function ga(e,t,r){let n=He(t,e.seenFilterFields,r),o=e.viewpoint.filter??ja();switch(n){case"query":o.query=pe(t,r);break;case"objecttypes":o.objectTypes=xa(t.slice(1),r);break;case"tags":o.tags=ar(t.slice(1),r,"tags");break;case"groups":o.groupIds=ar(t.slice(1),r,"groups");break;default:throw new m(`Unknown viewpoint filter field "${t[0].value}"`,r,t[0].column)}e.viewpoint.filter=o}function ya(e,t,r){switch(He(t,e.seenFields,r)){case"label":e.annotation.label=pe(t,r);return;case"target":e.annotation.targetObjectId=pe(t,r);return;case"body":e.annotation.body=pe(t,r);return;case"tags":e.annotation.tags=ar(t.slice(1),r,"tags");return;default:throw new m(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function wa(e,t,r,n){if(r.length===1&&r[0].value==="info"){e.inInfoBlock=!0,e.infoIndent=t;return}if(e.inInfoBlock&&t<=(e.infoIndent??0)&&(e.inInfoBlock=!1,e.infoIndent=null),e.inInfoBlock){e.objectNode.infoEntries.push(Ta(r,n));return}e.objectNode.blockFields.push(ka(r,n))}function He(e,t,r){if(e.length<2)throw new m("Invalid atlas field line",r,e[0]?.column??1);let n=e[0].value.toLowerCase();if(t.has(n))throw new m(`Duplicate atlas field "${e[0].value}"`,r,e[0].column);return t.add(n),n}function pe(e,t){if(e.length<2)throw new m("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(r=>r.value).join(" ").trim()}function xa(e,t){if(e.length===0)throw new m("Missing value for atlas field",t);return e.map(r=>{let n=r.value;if(n!=="star"&&n!=="planet"&&n!=="moon"&&n!=="belt"&&n!=="asteroid"&&n!=="comet"&&n!=="ring"&&n!=="structure"&&n!=="phenomenon")throw new m(`Unknown viewpoint object type "${r.value}"`,t,r.column);return n})}function ar(e,t,r){if(e.length===0)throw new m(`Missing value for field "${r}"`,t);return e.map(n=>n.value)}function Ia(e,t){if(e.length===0)throw new m('Missing value for field "layers"',t);let r={};for(let n of e){let o=!n.value.startsWith("-")&&!n.value.startsWith("!"),i=n.value.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){r["orbits-back"]=o,r["orbits-front"]=o;continue}if(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="objects"||i==="labels"||i==="metadata"){r[i]=o;continue}throw new m(`Unknown layer token "${n.value}"`,t,n.column)}return r}function ln(e,t,r){let n=e.toLowerCase();if(n==="topdown"||n==="isometric")return n;throw new m(`Unknown projection "${e}"`,t,r)}function cn(e,t,r){let n=e.toLowerCase();if(n==="diagram"||n==="presentation"||n==="atlas-card"||n==="markdown")return n;throw new m(`Unknown render preset "${e}"`,t,r)}function va(e,t,r,n){let o=Number(e);if(!Number.isFinite(o)||o<=0)throw new m(`Field "${n}" expects a positive number`,t,r);return o}function $a(e,t,r,n){let o=Number(e);if(!Number.isFinite(o))throw new m(`Field "${n}" expects a finite number`,t,r);return o}function ja(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Sa(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=ee(o.value);if(!i)throw new m(`Unknown field "${o.value}"`,t,o.column);n++;let a=[];if(i.arity==="multiple")for(;n<e.length&&!Ne(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new m(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return r}function ka(e,t){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);if(!ee(e[0].value))throw new m(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Ta(e,t){if(e.length<2)throw new m("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function un(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function dn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function lr(e="WorldOrbit"){return{format:"worldorbit",version:"2.0",sourceVersion:"1.0",system:{type:"system",id:e,title:e,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},objects:[],diagnostics:[]}}function vt(e){return structuredClone(e)}function fn(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let r of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:r});for(let r of[...e.system.viewpoints].sort(It))t.push({kind:"viewpoint",id:r.id});for(let r of[...e.system.annotations].sort(It))t.push({kind:"annotation",id:r.id})}for(let r of[...e.objects].sort(It))t.push({kind:"object",id:r.id});return t}function cr(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"object":return t.id?bn(e,t.id):null;case"viewpoint":return t.id?gn(e.system,t.id):null;case"annotation":return t.id?yn(e.system,t.id):null}}function ur(e,t,r){let n=vt(e),o=pr(n);switch(t.kind){case"system":return n.system=r,n;case"defaults":return o.defaults={...o.defaults,...r},n;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return r==null||r===""?delete o.atlasMetadata[t.key]:o.atlasMetadata[t.key]=String(r),n;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return sr(n.objects,r),n;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return sr(o.viewpoints,r),n;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return sr(o.annotations,r),n}}function pn(e,t,r){return ur(e,t,r(cr(e,t)))}function mn(e,t){let r=vt(e),n=pr(r);switch(t.kind){case"metadata":return t.key&&delete n.atlasMetadata[t.key],r;case"object":return t.id&&(r.objects=r.objects.filter(o=>o.id!==t.id)),r;case"viewpoint":return t.id&&(n.viewpoints=n.viewpoints.filter(o=>o.id!==t.id)),r;case"annotation":return t.id&&(n.annotations=n.annotations.filter(o=>o.id!==t.id)),r;default:return r}}function dr(e,t){return t.map(r=>({diagnostic:r,path:fr(e,r)}))}function fr(e,t){if(t.objectId&&bn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("viewpoint.")){let r=t.field.split(".");if(r[1]&&gn(e.system,r[1]))return{kind:"viewpoint",id:r[1]}}if(t.field?.startsWith("annotation.")){let r=t.field.split(".");if(r[1]&&yn(e.system,r[1]))return{kind:"annotation",id:r[1]}}return t.field&&t.field in pr(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function hn(e){let t=xe(e),r=lt(t);return dr(e,r.diagnostics)}function pr(e){return e.system||(e.system=lr().system),e.system}function bn(e,t){return e.objects.find(r=>r.id===t)??null}function gn(e,t){return e?.viewpoints.find(r=>r.id===t)??null}function yn(e,t){return e?.annotations.find(r=>r.id===t)??null}function sr(e,t){let r=e.findIndex(n=>n.id===t.id);if(r===-1){e.push(t),e.sort(It);return}e[r]=t}function It(e,t){return e.id.localeCompare(t.id)}var Oa=/^schema\s+2(?:\.0)?$/i,Ma=/^schema\s+2\.0-draft$/i;function mr(e){for(let t of e.split(/\r?\n/)){let r=t.trim();if(r)return Ma.test(r)?"2.0-draft":Oa.test(r)?"2.0":"1.0"}return"1.0"}function se(e){let t=hr(e);if(!t.ok||!t.value){let r=t.diagnostics[0];throw new m(r?.message??"Failed to load WorldOrbit source",r?.line,r?.column)}return t.value}function hr(e){let t=mr(e);if(t==="2.0"||t==="2.0-draft")return Aa(e,t);let r;try{r=fe(e)}catch(o){return{ok:!1,value:null,diagnostics:[X(o,"parse")]}}let n;try{n=te(r)}catch(o){return{ok:!1,value:null,diagnostics:[X(o,"normalize")]}}try{Q(n)}catch(o){return{ok:!1,value:null,diagnostics:[X(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Aa(e,t){let r;try{r=xt(e)}catch(i){return{ok:!1,value:null,diagnostics:[X(i,"parse","load.atlas.failed")]}}let n;try{n=xe(r)}catch(i){return{ok:!1,value:null,diagnostics:[X(i,"normalize","load.atlas.materialize.failed")]}}try{Q(n)}catch(i){return{ok:!1,value:null,diagnostics:[X(i,"validate","load.atlas.validate.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:n,atlasDocument:r,draftDocument:r,diagnostics:[...r.diagnostics]},diagnostics:[...r.diagnostics]}}var Da=/^```worldorbit(?:\s+(.*))?\s*$/;function wn(e){let t=e.split(/\r?\n/),r=[],n=!1,o=null,i=0,a=[];return t.forEach((s,c)=>{let d=c+1;if(!n){let u=s.match(Da);u&&(n=!0,o=u[1]??null,i=d,a=[]);return}if(s.trim()==="```"){r.push({source:a.join(`
|
|
5
|
-
`),info:o,startLine:i,endLine:d}),n=!1,o=null,i=0,a=[];return}a.push(s)}),r}function xn(e){let t=fe(e),r=te(t);return Q(r),{ast:t,document:r}}function La(e){let t=xn(e);return{...t,scene:H(t.document)}}function Va(e){return se(e)}function Fa(e){return st(e)}function Ea(e,t={}){return wt(e,t)}var Ca={background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Ge={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)",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)",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)",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 $t(e){return e?typeof e=="string"?Ge[e]??Ge.atlas:{...Ge.atlas,...e}:Ge.atlas}function jt(e){return{...Ca,...e}}function In(e){return Ge[e]}function K(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:br(e.objectTypes??[]),tags:br((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:br((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Pa(t)?t:null}function Pa(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function St(e,t){let r=K(t),n=new Set;for(let o of e.objects)if(!o.hidden&&Ba(o,r)&&(n.add(o.objectId),r?.includeAncestors!==!1))for(let i of o.ancestorIds)n.add(i);return r?n:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function kt(e,t,r=12){let n=t.trim().toLowerCase();return n?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Ra(o,n)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,r).map(o=>vn(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,r).map(o=>vn(o,1))}function $n(e,t,r,n){return{version:"2.0",viewpointId:n,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0},filter:K(r)}}function Tt(e){return encodeURIComponent(JSON.stringify(e))}function Ot(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",viewpointId:t.viewpointId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0},filter:K(t.filter??null)}}function jn(e,t,r){let n=e.trim()||"bookmark";return{id:n.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||n,atlasState:{...r,viewerState:{...r.viewerState},renderOptions:{...r.renderOptions,layers:r.renderOptions.layers?{...r.renderOptions.layers}:void 0,scaleModel:r.renderOptions.scaleModel?{...r.renderOptions.scaleModel}:void 0},filter:r.filter?{...r.filter}:null}}}function Mt(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,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 At(e){return e?.filter?K({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function vn(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[]}}function Ba(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type)||t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId)))return!1;if(t.tags?.length){let r=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[];if(!t.tags.every(n=>r.includes(n)))return!1}if(t.query?.trim()){let r=Sn(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function Ra(e,t){let r=e.objectId.toLowerCase(),n=e.label.toLowerCase(),o=Sn(e.object,e.label).toLowerCase(),i=0;return r===t||n===t?i+=120:r.startsWith(t)||n.startsWith(t)?i+=96:(r.includes(t)||n.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(c=>o.includes(c))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(c=>typeof c=="string"):[]).some(c=>c.toLowerCase()===t)&&(i+=18),i}function Sn(e,t){let r=Object.values(e.info),n=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...n,...r].join(" ")}function br(e){return[...new Set(e)]}var me={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function gr(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function Ke(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Ie(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function Dt(e,t){return{...e,rotationDeg:gr(e.rotationDeg+t)}}function Le(e,t,r,n,o){if(!Number.isFinite(r)||r<=0)return t;let i=$e(e),a=Ke(t.scale*r,o);if(a===t.scale)return t;let s=a/t.scale,c=n.x-i.x,d=n.y-i.y;return{...t,scale:a,translateX:(1-s)*c+s*t.translateX,translateY:(1-s)*d+s*t.translateY}}function ve(e,t,r){let n=$e(e),o=za(e.contentBounds,n,t.rotationDeg),i=Math.max(e.width-r.fitPadding*2,1),a=Math.max(e.height-r.fitPadding*2,1),s=Math.max(o.width,1),c=Math.max(o.height,1),d=Ke(Math.min(i/s,a/c),r),u=ae({x:e.contentBounds.centerX,y:e.contentBounds.centerY},n,t.rotationDeg);return{...t,scale:d,translateX:n.x-(n.x+(u.x-n.x)*d),translateY:n.y-(n.y+(u.y-n.y)*d)}}function Lt(e,t,r,n){let o=e.objects.find(c=>c.objectId===r&&!c.hidden);if(!o)return t;let i=$e(e),a=Ke(Math.max(t.scale,1.8),n),s=ae({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:r}}function Vt(e,t){let r=$e(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function Ve(e,t,r){let n=$e(e),o={x:r.x-t.translateX,y:r.y-t.translateY},i={x:o.x-n.x,y:o.y-n.y},a={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},s=ae({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:n.x+s.x,y:n.y+s.y}}function Ft(e,t){let r=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(s=>Ve(e,t,s)),n=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),i=Math.max(...r.map(s=>s.x)),a=Math.max(...r.map(s=>s.y));return{minX:n,minY:o,maxX:i,maxY:a,width:i-n,height:a-o,centerX:n+(i-n)/2,centerY:o+(a-o)/2}}function $e(e){return{x:e.width/2,y:e.height/2}}function za(e,t,r){let n=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(c=>ae(c,t,r)),o=Math.min(...n.map(c=>c.x)),i=Math.min(...n.map(c=>c.y)),a=Math.max(...n.map(c=>c.x)),s=Math.max(...n.map(c=>c.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 Ct="worldorbit-camera-root";function re(e,t={}){let r=$t(t.theme),n=rs(t.preset??e.renderPreset??void 0),o=jt({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,a=St(e,t.filter??null),s=e.objects.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Et(y.object)).sort((y,v)=>y.sortKey-v.sortKey),c=e.labels.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Et(y.object)),d=Wa(s),u=o.orbits?_a(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Et(y.object)).map(y=>`<line class="wo-leader wo-leader-${y.mode}" x1="${y.x1}" y1="${y.y1}" x2="${y.x2}" y2="${y.y2}" data-render-id="${q(y.renderId)}" data-group-id="${le(y.groupId??"")}" />`).join(""):"",w=o.objects?s.map(y=>Ya(y,t.selectedObjectId??null,r)).join(""):"",g=o.labels?c.map(y=>Ua(e,y,t.selectedObjectId??null)).join(""):"",I=o.metadata?`<text class="wo-title" x="56" y="64">${q(e.title)}</text>
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
var WorldOrbit=(()=>{var dr=Object.defineProperty;var _o=Object.getOwnPropertyDescriptor;var zo=Object.getOwnPropertyNames;var No=Object.prototype.hasOwnProperty;var Uo=(e,t)=>{for(var r in t)dr(e,r,{get:t[r],enumerable:!0})},Wo=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of zo(t))!No.call(e,o)&&o!==r&&dr(e,o,{get:()=>t[o],enumerable:!(n=_o(t,o))||n.enumerable});return e};var Yo=e=>Wo(dr({},"__esModule",{value:!0}),e);var Yl={};Uo(Yl,{DEFAULT_VIEWER_STATE:()=>Ie,WORLDORBIT_FIELD_KEYS:()=>Hr,WORLDORBIT_FIELD_SCHEMAS:()=>fr,WORLDORBIT_OBJECT_TYPES:()=>Ge,WORLD_LAYER_ID:()=>Qt,WorldOrbitError:()=>m,clampScale:()=>ut,cloneAtlasDocument:()=>Bt,composeViewerTransform:()=>Kt,createAtlasViewer:()=>rr,createDiagnostic:()=>Zr,createEmbedPayload:()=>ko,createEmptyAtlasDocument:()=>kr,createInteractiveViewer:()=>xe,createWorldOrbitEmbedMarkup:()=>So,defineWorldOrbitViewerElement:()=>To,deserializeViewerAtlasState:()=>Yt,deserializeWorldOrbitEmbedPayload:()=>Rr,detectWorldOrbitSchemaVersion:()=>Mr,diagnosticFromError:()=>Q,extractWorldOrbitBlocks:()=>Qn,fitViewerState:()=>Le,focusViewerState:()=>Xt,formatAtlasDocument:()=>Lt,formatDocument:()=>Ft,formatDraftDocument:()=>yr,getAtlasDocumentNode:()=>Sr,getFieldSchema:()=>Z,getSceneCenter:()=>De,getThemePreset:()=>to,getViewerVisibleBounds:()=>Zt,invertViewerPoint:()=>ze,isKnownFieldKey:()=>pr,listAtlasDocumentPaths:()=>Wn,load:()=>Js,loadWorldOrbitSource:()=>de,loadWorldOrbitSourceWithDiagnostics:()=>Lr,materializeAtlasDocument:()=>nt,materializeDraftDocument:()=>bn,mountWorldOrbitEmbeds:()=>jo,normalizeDocument:()=>pe,normalizeRotation:()=>Fr,normalizeViewerFilter:()=>ee,normalizeWithDiagnostics:()=>Jr,panViewerState:()=>Me,parse:()=>eo,parseSafe:()=>Qs,parseWithDiagnostics:()=>$t,parseWorldOrbit:()=>$e,parseWorldOrbitAtlas:()=>Rt,parseWorldOrbitDraft:()=>En,removeAtlasDocumentNode:()=>Hn,render:()=>Zs,renderDocumentToScene:()=>J,renderDocumentToSvg:()=>Er,renderSceneToSvg:()=>ae,renderSourceToSvg:()=>co,resolveAtlasDiagnosticPath:()=>Ar,resolveAtlasDiagnostics:()=>Or,resolveLayers:()=>zt,resolveTheme:()=>_t,rotatePoint:()=>ue,rotateViewerState:()=>Gt,sceneViewpointToLayerOptions:()=>Ht,searchSceneObjects:()=>Ut,serializeViewerAtlasState:()=>Wt,serializeWorldOrbitEmbedPayload:()=>Cr,stringify:()=>el,supportsObjectType:()=>mr,tokenizeLine:()=>qr,tokenizeLineDetailed:()=>je,unitFamilyAllowsUnit:()=>Xe,updateAtlasDocumentNode:()=>Yn,upgradeDocumentToDraftV2:()=>Mt,upgradeDocumentToV2:()=>rt,upsertAtlasDocumentNode:()=>jr,validateAtlasDocumentWithDiagnostics:()=>qn,validateDocument:()=>me,validateDocumentWithDiagnostics:()=>Qr,viewpointToViewerFilter:()=>qt,zoomViewerStateAt:()=>_e});var m=class e extends Error{line;column;constructor(t,r,n){let o=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var qe=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],te=qe.filter(e=>e!=="system"),Ho=["star","planet","moon","asteroid","comet","structure","phenomenon"],Yr=["structure","phenomenon"],ve=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],qo=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function M(e,t){return{key:e,...t}}var Ge=new Set(qe),fr=new Map([M("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:ve}),M("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:ve,unitFamily:"distance"}),M("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:ve,unitFamily:"distance"}),M("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:ve}),M("period",{kind:"unit",placement:!0,arity:"single",objectTypes:ve,unitFamily:"duration"}),M("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:ve,unitFamily:"angle"}),M("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:ve,unitFamily:"angle"}),M("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:ve,unitFamily:"angle"}),M("at",{kind:"string",placement:!0,arity:"single",objectTypes:Yr}),M("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Yr}),M("free",{kind:"string",placement:!0,arity:"single",objectTypes:qo}),M("kind",{kind:"string",placement:!1,arity:"single",objectTypes:te}),M("class",{kind:"string",placement:!1,arity:"single",objectTypes:te}),M("culture",{kind:"string",placement:!1,arity:"single",objectTypes:te}),M("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:qe}),M("color",{kind:"string",placement:!1,arity:"single",objectTypes:qe}),M("image",{kind:"string",placement:!1,arity:"single",objectTypes:Ho}),M("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:qe}),M("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:te,unitFamily:"radius"}),M("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:te,unitFamily:"mass"}),M("density",{kind:"unit",placement:!1,arity:"single",objectTypes:te,unitFamily:"generic"}),M("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:te,unitFamily:"generic"}),M("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:te,unitFamily:"generic"}),M("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:te}),M("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),M("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),M("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),M("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("on",{kind:"string",placement:!1,arity:"single",objectTypes:te}),M("source",{kind:"string",placement:!1,arity:"single",objectTypes:te}),M("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:te,unitFamily:"duration"})].map(e=>[e.key,e])),Hr=new Set(fr.keys());function Z(e){return fr.get(e)}function pr(e){return Hr.has(e)}function mr(e,t){return e.objectTypes.includes(t)}function Xe(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 qr(e){return je(e).map(t=>t.value)}function je(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,a=!1,s=!1,l=null,d=()=>{i!==null&&(r.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let c=0;c<e.length;c++){let f=e[c],w=n+c+1;if(s&&f==="\\"){let b=e[c+1];if(b==='"'||b==="\\"){o+=b,c++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=w),a=!0,l=w,s=!0);continue}if(!s&&/\s/.test(f)){d();continue}i===null&&(i=w),o+=f}if(s)throw new m("Unclosed quote in line",t.line,l??n+e.length);return d(),r}function yt(e){return e.match(/^\s*/)?.[0].length??0}function $e(e){let t=e.split(/\r?\n/),r=[],n=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 d=yt(s),c=je(s.slice(d),{line:l,columnOffset:d});if(c.length!==0){if(d===0){o=!1,i=null;let f=Go(c,l);r.push(f),n=f;continue}if(!n)throw new m("Indented line without parent object",l,d+1);if(c.length===1&&c[0].value==="info"){o=!0,i=d;continue}o&&d<=(i??0)&&(o=!1),o?n.infoEntries.push(Zo(c,l)):n.blockFields.push(Ko(c,l))}}return{type:"document",objects:r}}function Go(e,t){if(e.length<2)throw new m("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!Ge.has(r.value))throw new m(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:Xo(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function Xo(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=Z(o.value);if(!i)throw new m(`Unknown field "${o.value}"`,t,o.column);n++;let a=[];if(i.arity==="multiple")for(;n<e.length&&!pr(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new m(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return r}function Ko(e,t){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);if(!Z(e[0].value))throw new m(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Zo(e,t){if(e.length<2)throw new m("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}var Gr=/^(-?\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]]),Qo=/^[A-Za-z][A-Za-z0-9+.-]*:/;function pe(e){let t=null,r=[];for(let n of e.objects){let o=ei(n);if(n.objectType==="system"){if(t)throw m.fromLocation("Only one system object is allowed",n.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],objects:r}}function ei(e){let t=[...e.inlineFields,...e.blockFields];ti(e.objectType,t);let r=ri(t),n=ni(e.objectType,r),o=oi(r),i=si(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:n,info:i}}function ti(e,t){for(let r of t){let n=Z(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!mr(n,e))throw m.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw m.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function ri(e){let t=new Map;for(let r of e){if(t.has(r.key))throw m.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function ni(e,t){let r=t.has("orbit"),n=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[r,n,o,i].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw m.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw m.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:wt(t,"orbit"),distance:Ve(t,"distance"),semiMajor:Ve(t,"semiMajor"),eccentricity:ui(t,"eccentricity"),period:Ve(t,"period"),angle:Ve(t,"angle"),inclination:Ve(t,"inclination"),phase:Ve(t,"phase")};if(n){let s=vt(t,"at"),l=wt(t,"at");return{mode:"at",target:l,reference:li(l,s.location)}}if(o)return{mode:"surface",target:wt(t,"surface")};if(i){let s=wt(t,"free"),l=ci(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function oi(e){let t={};for(let[r,n]of e.entries()){let o=Z(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=di(n);break;case"number":t[r]=Kr(Ee(n),r,n.location);break;case"unit":t[r]=Xr(Ee(n),n.location,r);break;case"string":t[r]=ii(r,n);break}}return t}function ii(e,t){let r=t.values.join(" ").trim();return e==="image"&&ai(r,t.location),r}function ai(e,t){if(!e)throw m.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw m.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Qo);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw m.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function si(e){let t={};for(let r of e){if(r.key in t)throw m.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function li(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.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 Xr(e,t,r){let n=e.match(Gr);if(!n)throw m.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=Z(r);if(i?.unitFamily&&!Xe(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function ci(e){let t=e.match(Gr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ve(e,t){if(!e.has(t))return;let r=vt(e,t);return Xr(Ee(r),r.location,t)}function ui(e,t){if(!e.has(t))return;let r=vt(e,t);return Kr(Ee(r),t,r.location)}function Kr(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw m.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function di(e){let t=Ee(e).toLowerCase(),r=Jo.get(t);if(r===void 0)throw m.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function vt(e,t){let r=e.get(t);if(!r)throw new m(`Missing value for key "${t}"`);return r}function wt(e,t){return Ee(vt(e,t))}function Ee(e){if(e.values.length!==1)throw m.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var fi=new Set(["star","planet","moon","asteroid","comet"]);function me(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new m(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new m(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let o=r.get(n.placement.target);if(!o||!fi.has(o.type))throw new m(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&pi(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&mi(n,n.placement.reference,t))}}function pi(e,t,r){if(!r.has(t.primary))throw new m(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new m(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function mi(e,t,r){if(!r.has(t.objectId))throw new m(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Zr(e){return{...e}}function Q(e,t,r=`${t}.failed`){return e instanceof m?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}function $t(e){let t;try{t=$e(e)}catch(n){return{ok:!1,value:null,diagnostics:[Q(n,"parse")]}}let r;try{r=pe(t)}catch(n){return{ok:!1,value:null,diagnostics:[Q(n,"normalize")]}}try{me(r)}catch(n){return{ok:!1,value:null,diagnostics:[Q(n,"validate")]}}return{ok:!0,value:{ast:t,document:r},diagnostics:[]}}function Jr(e){try{return{ok:!0,value:pe(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[Q(t,"normalize")]}}}function Qr(e){try{return me(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[Q(t,"validate")]}}}var Ke=1495978707e-1,hi=6371,gi=71492,bi=695700,yi=63241.077,wi=206264.806,vi=206264806,an=.68,$i=.2,sn=28;function J(e,t={}){let r=xi(t),n=r.width,o=r.height,i=r.padding,a=Ii(e),s=Si(e,t.projection),l=ji(a,t.scaleModel),d=Ai(a),c=e.system?.id??null,f=new Map(e.objects.map(k=>[k.id,k])),w=la(e.objects,f),b=new Map,I=[],v=[],T=[],y=[],$=[],x=new Map,_=new Map;for(let k of e.objects){let K=k.placement;if(!K){T.push(k);continue}if(K.mode==="orbit"){rn(_,K.target,k);continue}if(K.mode==="surface"){rn(x,K.target,k);continue}if(K.mode==="at"){$.push(k);continue}y.push(k)}let P=y.length>0?n*.42:n/2,j=o/2,V={orbitChildren:_,surfaceChildren:x,objectMap:f,spacingFactor:d,projection:s,scaleModel:l},A=T.find(k=>k.type==="star")??T[0]??null;A&&hr(A,P,j,0,b,I,v,V);let W=T.filter(k=>k.id!==A?.id);if(W.length>0){let k=Math.min(n,o)*.28*d*l.orbitDistanceMultiplier;W.forEach((K,S)=>{let ne=Qe(S,W.length,-Math.PI/2),B=et(ne,k,s,1);hr(K,P+B.x,j+B.y,0,b,I,v,V)})}y.forEach((k,K)=>{let S=n-i-140-ma(k.placement?.mode==="free"?k.placement.distance:void 0,l),ne=Math.max(76,(o-i*2-180)/Math.max(1,y.length)*d)*l.freePlacementMultiplier,B=i+92+K*ne;b.set(k.id,{object:k,x:S,y:B,radius:St(k,0,l),sortKey:Ot(S,B,0)}),v.push({object:k,groupId:w.groupIds.get(k.id)??null,x1:S-60,y1:B,x2:S-18,y2:B,mode:"free"}),xt(k,b,I,v,V,1)}),$.forEach((k,K)=>{if(b.has(k.id)||!k.placement||k.placement.mode!=="at")return;let S=aa(k.placement.reference,b,f,K,$.length,n,o,i,V);b.set(k.id,{object:k,x:S.x,y:S.y,radius:St(k,2,l),sortKey:Ot(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&v.push({object:k,groupId:w.groupIds.get(k.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),xt(k,b,I,v,V,2)});let R=[...b.values()].map(k=>Ti(k,l,w)),Y=I.map(k=>Mi(k,w.groupIds.get(k.object.id)??null)),X=v.map(k=>Li(k)),E=Di(R,o,l.labelMultiplier),ye=Ei(e,R),re=Fi(Y,ye,X,R,E),g=Pi(R,Y,X,E,w),O=Vi(e,R),q=Ci(e,s,r.preset,w,f),ke=Zi(n,o,R,Y,X,E);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:s,scaleModel:l,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${nn(s)} view - ${nn(a)} layout`,systemId:c,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:r.preset??"custom"},contentBounds:ke,layers:re,groups:g,semanticGroups:O,viewpoints:q,objects:R,orbitVisuals:Y,relations:ye,leaders:X,labels:E}}function ue(e,t,r){let n=Tt(r),o=Math.cos(n),i=Math.sin(n),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 Ii(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 xi(e){let t=ki(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function ki(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 Si(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function ji(e,t){return{...Oi(e),...t}}function Oi(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 Ai(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ti(e,t,r){let{object:n,x:o,y:i,radius:a,sortKey:s,anchorX:l,anchorY:d}=e,c=n.renderHints?.renderPriority??0;return{renderId:tt(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,semanticGroupIds:[...n.groups??[]],x:o,y:i,radius:a,visualRadius:pa(n,a,t),sortKey:s+c*.001,anchorX:l,anchorY:d,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:ga(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function Mi(e,t){return{renderId:`${tt(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 Li(e){return{renderId:`${tt(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 Di(e,t,r){let n=[],o=[],i=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort((a,s)=>a.sortKey-s.sortKey);for(let a of i){let s=a.y>t*.62?-1:1,l=ba(a,r),d=a.y+s*(a.radius+18*r),c=d+s*(16*r),f=en(a.x,d,c,l,s),w=0;for(;o.some(b=>da(b,f))&&w<10;)d+=s*14*r,c+=s*14*r,f=en(a.x,d,c,l,s),w+=1;o.push(f),n.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,semanticGroupIds:[...a.semanticGroupIds],label:a.label,secondaryLabel:a.secondaryLabel,x:a.x,y:d,secondaryY:c,textAnchor:"middle",direction:s<0?"above":"below",hidden:a.hidden})}return n}function Fi(e,t,r,n,o){let i=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),a=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:i},{id:"orbits-front",renderIds:a},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:n.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 Pi(e,t,r,n,o){let i=new Map,a=s=>{if(!s)return null;let l=i.get(s);if(l)return l;let d=o.groupRoots.get(s)??null,c={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Je(0,0,0,0)};return i.set(s,c),c};for(let s of e){let l=a(s.groupId);l&&!s.hidden&&l.objectIds.push(s.objectId)}for(let s of t){let l=a(s.groupId);l&&!s.hidden&&l.orbitIds.push(s.objectId)}for(let s of r){let l=a(s.groupId);l&&!s.hidden&&l.leaderIds.push(s.objectId)}for(let s of n){let l=a(s.groupId);l&&!s.hidden&&l.labelIds.push(s.objectId)}for(let s of i.values())s.contentBounds=ca(s,e,t,r,n);return[...i.values()].sort((s,l)=>s.label.localeCompare(l.label))}function Vi(e,t){return[...e.groups].map(r=>({id:r.id,label:r.label,summary:r.summary,color:r.color,tags:[...r.tags],hidden:r.hidden,objectIds:t.filter(n=>!n.hidden&&n.semanticGroupIds.includes(r.id)).map(n=>n.objectId)})).sort((r,n)=>r.label.localeCompare(n.label))}function Ei(e,t){let r=new Map(t.map(n=>[n.objectId,n]));return e.relations.map(n=>{let o=r.get(n.from),i=r.get(n.to);return{renderId:`${tt(n.id)}-relation`,relationId:n.id,relation:n,fromObjectId:n.from,toObjectId:n.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:n.hidden||!o||!i||o.hidden||i.hidden}}).sort((n,o)=>n.relation.id.localeCompare(o.relation.id))}function Ci(e,t,r,n,o){let i=Ri(e,t,r),a=new Map;for(let[d,c]of Object.entries(e.system?.info??{})){if(!d.startsWith("viewpoint."))continue;let[f,w,...b]=d.split(".");if(f!=="viewpoint"||!w||b.length===0)continue;let I=Gi(w);if(!I)continue;let v=b.join(".").toLowerCase(),T=a.get(I)??{id:I};Bi(T,v,c,e,t,r,n,o),a.set(I,T)}let s=[...a.values()].map(d=>_i(d,t,r,o)).filter(Boolean),l=s.findIndex(d=>d.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((d,c)=>d.id==="overview"?-1:c.id==="overview"?1:d.label.localeCompare(c.label))}function Ri(e,t,r){let n=e.system?.title??e.system?.properties.title;return{id:"overview",label:n?`${String(n)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Bi(e,t,r,n,o,i,a,s){let l=r.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"projection":case"view":e.projection=Ni(l)??o;return;case"preset":e.preset=Ui(l)??i;return;case"rotation":case"angle":e.rotationDeg=ln(l)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Wi(l);return;case"layers":e.layers=Yi(l);return;case"query":e.filter={...e.filter??It(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??It(),objectTypes:Hi(l)};return;case"tags":e.filter={...e.filter??It(),tags:At(l)};return;case"groups":e.filter={...e.filter??It(),groupIds:qi(l,n,a,s)};return}}function _i(e,t,r,n){let o=e.focus&&n.has(e.focus)?e.focus:null,i=e.select&&n.has(e.select)?e.select:o,a=zi(e.filter),s=e.label?.trim()||Xi(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||Ki(s,o,a),objectId:o,selectedObjectId:i,projection:e.projection??t,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function It(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function zi(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 Ni(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Ui(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ln(e){let t=Number(e);return Number.isFinite(t)?t:null}function Wi(e){let t=ln(e);return t!==null&&t>0?t:null}function Yi(e){let t={};for(let r of At(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),o=r.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=n)}return t}function Hi(e){return At(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function qi(e,t,r,n){return At(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:r.groupIds.has(o)?r.groupIds.get(o)??Ze(o):(n.has(o),Ze(o)))}function At(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Gi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Xi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ki(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function Zi(e,t,r,n,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,c=(f,w)=>{a=Math.min(a,f),s=Math.min(s,w),l=Math.max(l,f),d=Math.max(d,w)};for(let f of n)f.hidden||cn(f,c);for(let f of o)f.hidden||(c(f.x1,f.y1),c(f.x2,f.y2));for(let f of r)f.hidden||un(f,c);for(let f of i)f.hidden||dn(f,c);return!Number.isFinite(a)||!Number.isFinite(s)?Je(0,0,e,t):Je(a,s,l,d)}function cn(e,t){let r=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,o=e.ry??e.radius??0,i=pn(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,sn*2);for(let a of i)t(a.x-r,a.y-r),t(a.x+r,a.y+r)}function Je(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function un(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 dn(e,t){let n=ya(e.label,e.secondaryLabel,1);t(e.x-n,e.y-18),t(e.x+n,e.y+8),t(e.x-n,e.secondaryY-14),t(e.x+n,e.secondaryY+8)}function hr(e,t,r,n,o,i,a,s){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:r,radius:St(e,n,s.scaleModel),sortKey:Ot(t,r,n)}),xt(e,o,i,a,s,n+1))}function xt(e,t,r,n,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(Ji),l=Qi(s,a.radius,o.spacingFactor,o.scaleModel),d=ra(s,l);s.forEach((f,w)=>{let b=ea(f,w,s.length,a,l,d[w]??l.innerPx,o);r.push({object:f,parentId:e.id,kind:b.kind,cx:b.cx,cy:b.cy,radius:b.radius,rx:b.rx,ry:b.ry,rotationDeg:b.rotationDeg,band:b.band,bandThickness:b.bandThickness,frontArcPath:b.frontArcPath,backArcPath:b.backArcPath}),hr(f,b.objectX,b.objectY,i,t,r,n,o)});let c=[...o.surfaceChildren.get(e.id)??[]];c.forEach((f,w)=>{let b=Qe(w,c.length,-Math.PI/3),I=28*o.spacingFactor,v=et(b,a.radius,o.projection,o.projection==="isometric"?.9:1),T=et(b,a.radius+I,o.projection,o.projection==="isometric"?.9:1),y=a.x+v.x,$=a.y+v.y,x=a.x+T.x,_=a.y+T.y;t.set(f.id,{object:f,x,y:_,radius:St(f,i+1,o.scaleModel),sortKey:Ot(x,_,i+1),anchorX:y,anchorY:$}),n.push({object:f,groupId:o.objectMap.has(f.id)?Ze(ua(f,o.objectMap)):null,x1:y,y1:$,x2:x,y2:_,mode:"surface"}),xt(f,t,r,n,o,i+1)})}function Ji(e,t){let r=kt(e),n=kt(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function Qi(e,t,r,n){let o=e.map(f=>kt(f)),i=o.filter(f=>f!==null),a=t+56*r*n.orbitDistanceMultiplier,s=(e.length>2?54:64)*r*n.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),d=Math.max(...i),c=d-l;return{metrics:o,minMetric:l,maxMetric:d,metricSpread:c,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function ea(e,t,r,n,o,i,a){let s=e.placement,l=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let A=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:A,rotationDeg:0,band:l,bandThickness:l?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-A}}let d=z(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),c=i,f=Math.max(c*Math.sqrt(1-d*d),c*.18),w=br(s.inclination)??0,b=a.projection==="isometric"?Math.max($i,Math.cos(Tt(w)))*an:1,I=Math.max(f*b,c*.14),v=br(s.angle)??0,T=c*d,y=hn(-T,0,v),$=n.x+y.x,x=n.y+y.y,_=oa(s.phase,t,r),P=mn($,x,c,I,v,_),j=a.projection==="topdown"&&d<=1e-4&&Math.abs(v)<=1e-4,V=l?ia(e,c,o,a.scaleModel):void 0;return{kind:j?"circle":"ellipse",cx:j?n.x:$,cy:j?n.y:x,radius:j?c:void 0,rx:j?void 0:c,ry:j?void 0:I,rotationDeg:v,band:l,bandThickness:V,frontArcPath:a.projection==="isometric"||l?tn($,x,c,I,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||l?tn($,x,c,I,v,Math.PI,Math.PI*2):void 0,objectX:P.x,objectY:P.y}}function ta(e,t){return t.innerPx+t.stepPx*na(Math.max(e,0)+1)}function ra(e,t){let r=[];return e.forEach((n,o)=>{let i=kt(n),a=t.innerPx+o*t.stepPx,s=i===null?a:ta(i,t),l=o===0?t.innerPx:(r[o-1]??t.innerPx)+t.minimumGapPx;r.push(Math.max(s,l))}),r}function kt(e){return!e.placement||e.placement.mode!=="orbit"?null:jt(e.placement.semiMajor??e.placement.distance??null)}function na(e){return Math.log(e)/Math.log(2)}function oa(e,t,r){let n=e?br(e):null;return n!==null?Tt(n-90):Qe(t,r,-Math.PI/2)}function ia(e,t,r,n){let o=jt(gr(e.properties.inner)),i=jt(gr(e.properties.outer));if(o!==null&&i!==null){let s=Math.abs(i-o);if(r.metricSpread>0)return z(s/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(o,i),1e-4);return z(s/l*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function aa(e,t,r,n,o,i,a,s,l){if(e.kind==="lagrange")return sa(e,t,r,i,a);if(e.kind==="anchor"){let d=t.get(e.objectId);if(d){let c=Qe(n,o,Math.PI/5),f=(d.radius+36)*l.scaleModel.labelMultiplier,w=et(c,f,l.projection,l.projection==="isometric"?.92:1);return{x:d.x+w.x,y:d.y+w.y,anchorX:d.x,anchorY:d.y}}}if(e.kind==="named"){let d=t.get(e.name);if(d){let c=Qe(n,o,Math.PI/6),f=(d.radius+36)*l.scaleModel.labelMultiplier,w=et(c,f,l.projection,l.projection==="isometric"?.92:1);return{x:d.x+w.x,y:d.y+w.y,anchorX:d.x,anchorY:d.y}}}return{x:i-s-170,y:a-s-86-n*58*l.scaleModel.freePlacementMultiplier}}function sa(e,t,r,n,o){let i=e.secondary?t.get(e.primary):fa(e.primary,t,r),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:n*.7,y:o*.25};let s=a.x-i.x,l=a.y-i.y,d=Math.hypot(s,l)||1,c=s/d,f=l/d,w=-f,b=c,I=z(d*.25,24,68);switch(e.point){case"L1":return{x:a.x-c*I,y:a.y-f*I,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+c*I,y:a.y+f*I,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-c*I,y:i.y-f*I,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(c*.5-w*.8660254)*I,y:a.y+(f*.5-b*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(c*.5+w*.8660254)*I,y:a.y+(f*.5+b*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function la(e,t){let r=new Map,n=new Map;for(let d of e){let c=fn(d,t);if(r.set(d.id,c),c){let f=n.get(c);f?f.push(d.id):n.set(c,[d.id])}n.has(d.id)||n.set(d.id,[])}let o=new Map,i=new Map,a=new Map,s=d=>{let c=o.get(d);if(c)return c;let f=new Set,w=[],b=r.get(d)??null;for(;b&&!f.has(b);)w.push(b),f.add(b),b=r.get(b)??null;return o.set(d,w),w},l=d=>{let c=a.get(i.get(d)??"");if(c)return c;let f=r.get(d)??null,w=t.get(d),b=d;return w?.placement&&w.placement.mode!=="free"&&f&&(b=l(f)),b};for(let d of e){s(d.id);let c=l(d.id),f=Ze(c);i.set(d.id,f),a.set(f,c)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:a}}function fn(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function ca(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(c,f)=>{i=Math.min(i,c),a=Math.min(a,f),s=Math.max(s,c),l=Math.max(l,f)};for(let c of t)!c.hidden&&e.objectIds.includes(c.objectId)&&un(c,d);for(let c of r)!c.hidden&&e.orbitIds.includes(c.objectId)&&cn(c,d);for(let c of n)!c.hidden&&e.leaderIds.includes(c.objectId)&&(d(c.x1,c.y1),d(c.x2,c.y2));for(let c of o)!c.hidden&&e.labelIds.includes(c.objectId)&&dn(c,d);return!Number.isFinite(i)||!Number.isFinite(a)?Je(0,0,0,0):Je(i,a,s,l)}function ua(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let o=fn(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function en(e,t,r,n,o){return{left:e-n,right:e+n,top:Math.min(t,r)-(o<0?18:12),bottom:Math.max(t,r)+(o<0?8:12)}}function da(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function fa(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function St(e,t,r){let n=ha(e.properties.radius,r);if(n!==null)return n;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return z((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return z(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return z(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return z(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return z(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return z(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return z(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return z(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return z(8*o,r.minBodyRadius,r.maxBodyRadius)}}function pa(e,t,r){let n=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+n,r.maxBodyRadius+10)}}function jt(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Ke;case"m":return e.value/1e3/Ke;case"ly":return e.value*yi;case"pc":return e.value*wi;case"kpc":return e.value*vi;case"re":return e.value*hi/Ke;case"rj":return e.value*gi/Ke;case"sol":return e.value*bi/Ke;default:return e.value}}function ma(e,t){let r=jt(e??null);return r===null||r<=0?0:z(r*96*t.freePlacementMultiplier,0,420)}function ha(e,t){let r=gr(e);if(!r)return null;let n;switch(r.unit){case"sol":n=z(r.value*22,14,40);break;case"re":n=z(r.value*10,6,18);break;case"km":n=z(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:n=z(r.value*4,4,20);break}return z(n*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function gr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function br(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Qe(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function tn(e,t,r,n,o,i,a){let s=pn(e,t,r,n,o,i,a,sn);return s.length===0?"":s.map((l,d)=>`${d===0?"M":"L"} ${on(l.x)} ${on(l.y)}`).join(" ")}function pn(e,t,r,n,o,i,a,s){let l=[];for(let d=0;d<=s;d+=1){let c=i+(a-i)*d/s;l.push(mn(e,t,r,n,o,c))}return l}function mn(e,t,r,n,o,i){let a=r*Math.cos(i),s=n*Math.sin(i),l=hn(a,s,o);return{x:e+l.x,y:t+l.y}}function hn(e,t,r){let n=Tt(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function et(e,t,r,n){let o=r==="isometric"?an*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Ot(e,t,r){return t*1e3+e+r*.01}function z(e,t,r){return Math.min(Math.max(e,t),r)}function rn(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function tt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Ze(e){return`${tt(e)}-group`}function ga(e){return typeof e=="string"&&e.trim()?e:void 0}function ba(e,t){let r=e.label.length*4.6*t+18,n=e.secondaryLabel.length*3.9*t+18;return Math.max(r,n,e.visualRadius+18)}function ya(e,t,r){let n=e.length*4.6*r+18,o=t.length*3.9*r+18;return Math.max(n,o,24)}function nn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Tt(e){return e*Math.PI/180}function on(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function rt(e,t={}){let r=J(e,t),n=[],o=$a(e,n),i=Ia(e,n),a=va(e,r.renderPreset??t.preset??null,r.projection),s=e.system?wa(e,a,o,i,n,r.renderPreset??t.preset??null):null;return r.viewpoints.some(l=>!l.generated)&&n.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${r.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??[]),objects:e.objects.map(yn),diagnostics:n}}function Mt(e,t={}){return Ma(rt(e,t))}function nt(e){let t=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Oa(e.system),info:Aa(e.system)}:null;return{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:t,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(yn)}}function bn(e){return nt(e)}function wa(e,t,r,n,o,i){let a=J(e,{preset:i??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:r,viewpoints:a.viewpoints.map(xa),annotations:n}}function va(e,t,r){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":r,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function $a(e,t){let r={};for(let[o,i]of Object.entries(e.system?.info??{}))o.startsWith("viewpoint.")||o.startsWith("annotation.")||(r[o]=i);let n=Object.keys(r);return n.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${n.length} system info entr${n.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),r}function Ia(e,t){let r=new Map;for(let[n,o]of Object.entries(e.system?.info??{})){if(!n.startsWith("annotation."))continue;let[,i,...a]=n.split(".");if(!i||a.length===0)continue;let s=gn(i);if(!s)continue;let l=r.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=Sa(o);break}r.set(s,l)}for(let n of e.objects){let o=n.info.description;if(!o)continue;let i=gn(`${n.id}-notes`);r.has(i)||(r.set(i,{id:i,label:`${n.id} Notes`,targetObjectId:n.id,body:o,tags:Array.isArray(n.properties.tags)?n.properties.tags.filter(a=>typeof a=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${n.id}.info.description into structured atlas annotation "${i}".`,objectId:n.id,field:"description"}))}return[...r.values()].filter(n=>n.body||n.label).map(n=>({id:n.id,label:n.label??ja(n.id),targetObjectId:n.targetObjectId??null,body:n.body??"",tags:n.tags??[],sourceObjectId:n.targetObjectId??null})).sort((n,o)=>n.label.localeCompare(o.label))}function xa(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function yn(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,r])=>[t,{...r??{}}])):void 0,properties:ka(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ka(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function Sa(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function gn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ja(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Oa(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 Aa(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg));let o=Ta(r.layers);o&&(t[`${n}.layers`]=o),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??"")}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function Ta(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function Ma(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var wn=["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 Ft(e,t={}){let r=t.schema??"auto";if(r==="2.0"||r==="2.1"||r==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(r==="2.0-draft"){let l=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Mt(e);return yr(l)}let s=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:rt(e);return r==="2.1"&&s.version!=="2.1"?Lt({...s,version:"2.1",schemaVersion:"2.1"}):Lt(s)}let o=[],i=e;i.system&&o.push(...La(i.system));let a=[...i.objects].sort(vr);for(let s of a)o.length>0&&o.push(""),o.push(...Fa(s));return o.join(`
|
|
2
|
+
`)}function Lt(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...$n(e.system));for(let n of[...e.groups].sort(Dt))t.push(""),t.push(...jn(n));for(let n of[...e.relations].sort(Dt))t.push(""),t.push(...On(n));let r=[...e.objects].sort(vr);return r.length>0&&t.at(-1)!==""&&t.push(""),r.forEach((n,o)=>{o>0&&t.push(""),t.push(...In(n))}),t.join(`
|
|
3
|
+
`)}function yr(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},r=["schema 2.0-draft",""];t.system&&r.push(...$n(t.system));for(let o of[...t.groups].sort(Dt))r.push(""),r.push(...jn(o));for(let o of[...t.relations].sort(Dt))r.push(""),r.push(...On(o));let n=[...t.objects].sort(vr);return n.length>0&&r.at(-1)!==""&&r.push(""),n.forEach((o,i)=>{i>0&&r.push(""),r.push(...In(o))}),r.join(`
|
|
4
|
+
`)}function La(e){return Da("system",e.id,e.properties,null,e.info)}function Da(e,t,r,n,o){let i=[`${e} ${t}`],a=[...kn(n),...Sn(r)];for(let l of a)i.push(` ${l}`);let s=Object.entries(o).sort(([l],[d])=>l.localeCompare(d));if(s.length>0){a.length>0&&i.push(""),i.push(" info");for(let[l,d]of s)i.push(` ${l} ${D(d)}`)}return i}function $n(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${D(e.title)}`),e.description&&t.push(` description ${D(e.description)}`),e.epoch&&t.push(` epoch ${D(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${D(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${D(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${D(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${D(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[r,n]of Object.entries(e.atlasMetadata).sort(([o],[i])=>o.localeCompare(i)))t.push(` ${r} ${D(n)}`)}for(let r of e.viewpoints)t.push(""),t.push(...Va(r));for(let r of e.annotations)t.push(""),t.push(...Ea(r));return t}function Fa(e){return xn(e.type,e.id,e)}function In(e){return xn(`object ${e.type}`,e.id,e)}function xn(e,t,r){let n=[`${e} ${t}`],o=[...kn(r.placement),...Sn(r.properties),...Pa(r)];for(let a of o)n.push(` ${a}`);let i=Object.entries(r.info).sort(([a],[s])=>a.localeCompare(s));if(i.length>0){o.length>0&&n.push(""),n.push(" info");for(let[a,s]of i)n.push(` ${a} ${D(s)}`)}for(let a of["climate","habitability","settlement"]){let s=Object.entries(r.typedBlocks?.[a]??{}).sort(([l],[d])=>l.localeCompare(d));if(s.length>0){n.push(""),n.push(` ${a}`);for(let[l,d]of s)n.push(` ${l} ${D(d)}`)}}return n}function kn(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...Ce("distance",e.distance),...Ce("semiMajor",e.semiMajor),...Ca("eccentricity",e.eccentricity),...Ce("period",e.period),...Ce("angle",e.angle),...Ce("inclination",e.inclination),...Ce("phase",e.phase)];case"at":return[`at ${Ra(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?wr(e.distance):e.descriptor??""}`.trim()]}}function Sn(e){return Object.keys(e).sort(_a).map(t=>`${t} ${An(e[t])}`)}function Pa(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${D(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${D(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let r of e.deriveRules??[])t.push(`derive ${r.field} ${r.strategy}`);for(let r of e.validationRules??[])t.push(`validate ${r.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let r of e.tolerances??[])t.push(`tolerance ${r.field} ${An(r.value)}`);return t}function Va(e){let t=[`viewpoint ${e.id}`,` label ${D(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 ${D(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let r=Ba(e.layers);return r.length>0&&t.push(` layers ${r.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${D(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(D).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Ea(e){let t=[`annotation ${e.id}`,` label ${D(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${D(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(D).join(" ")}`),t}function jn(e){let t=[`group ${e.id}`,` label ${D(e.label)}`];return e.summary&&t.push(` summary ${D(e.summary)}`),e.color&&t.push(` color ${D(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(D).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function On(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${D(e.from)}`),e.to&&t.push(` to ${D(e.to)}`),e.kind&&t.push(` kind ${D(e.kind)}`),e.label&&t.push(` label ${D(e.label)}`),e.summary&&t.push(` summary ${D(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(D).join(" ")}`),e.color&&t.push(` color ${D(e.color)}`),e.hidden&&t.push(" hidden true"),t}function An(e){return Array.isArray(e)?e.map(t=>D(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?D(e):wr(e)}function wr(e){return`${e.value}${e.unit??""}`}function Ce(e,t){return t?[`${e} ${wr(t)}`]:[]}function Ca(e,t){return t===void 0?[]:[`${e} ${t}`]}function Ra(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 Ba(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t}function _a(e,t){let r=wn.indexOf(e),n=wn.indexOf(t);return r===-1&&n===-1?e.localeCompare(t):r===-1?1:n===-1?-1:r-n}function vr(e,t){let r=vn(e.type),n=vn(t.type);return r!==n?r-n:e.id.localeCompare(t.id)}function Dt(e,t){return e.id.localeCompare(t.id)}function vn(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 D(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Tn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,za=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Na=/^[A-Za-z][A-Za-z0-9+.-]*:/;function it(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Pt(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function $r(e,t,r){let n=e.match(Tn);if(!n)throw m.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=Z(r);if(i?.unitFamily&&!Xe(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function Ir(e){let t=e.match(Tn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Vt(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw m.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function Oe(e,t,r){let n=za.get(e.toLowerCase());if(n===void 0)throw m.fromLocation(`Invalid boolean value "${e}" for "${t}"`,r);return n}function Mn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.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 Ua(e,t){if(!e)throw m.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw m.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Na);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw m.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function Ln(e,t,r){let n=Z(e);if(!n)throw m.fromLocation(`Unknown field "${e}"`,r);if(n.arity==="single"&&t.length!==1)throw m.fromLocation(`Field "${e}" expects exactly one value`,r);switch(n.kind){case"list":return t;case"boolean":return Oe(ot(t,e,r),e,r);case"number":return Vt(ot(t,e,r),e,r);case"unit":return $r(ot(t,e,r),r,e);case"string":{let o=t.join(" ").trim();return e==="image"&&Ua(o,r),o}}}function xr(e,t,r){let n=Z(e);if(!n)throw m.fromLocation(`Unknown field "${e}"`,r);if(!n.objectTypes.includes(t))throw m.fromLocation(`Field "${e}" is not valid on "${t}"`,r)}function ot(e,t,r){if(e.length!==1)throw m.fromLocation(`Field "${t}" expects exactly one value`,r);return e[0]}var Wa=new Set(["star","planet","moon","asteroid","comet"]),Ya=332946.0487,Ha=1047.3486,Et=1495978707e-1,qa=6371,Ga=695700,Xa=63241.077,Ka=206264.806,Za=206264806;function at(e,t){let r=[],n=new Map(e.objects.map(a=>[a.id,a])),o=new Set(e.groups.map(a=>a.id));e.system||r.push(N("validate.system.required","Atlas documents must declare exactly one system."));let i=new Map;for(let[a,s]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of s){let d=i.get(l);d?r.push(N("validate.id.duplicate",`Duplicate ${a} id "${l}" already used by ${d}.`)):i.set(l,a)}for(let a of e.relations)Ja(a,n,r);for(let a of e.system?.viewpoints??[])Qa(a.filter,o,t,r,a.id);for(let a of e.objects)es(a,e.system,n,o,r);return r}function Ja(e,t,r){e.from?t.has(e.from)||r.push(N("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):r.push(N("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||r.push(N("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):r.push(N("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||r.push(N("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Qa(e,t,r,n,o){if(!(!e||r!=="2.1"))for(let i of e.groupIds)t.has(i)||n.push(he("validate.viewpoint.group.unknown",`Unknown group "${i}" in viewpoint "${o}".`))}function es(e,t,r,n,o){let i=e.placement,a=i?.mode==="orbit"?i:null,s=i?.mode==="orbit"?r.get(i.target)??null:null;if(e.groups)for(let l of e.groups)n.has(l)||o.push(he("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(a&&(r.has(a.target)||o.push(N("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&o.push(N("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&o.push(he("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(he("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!Fn(s?.properties.mass)&&o.push(he("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let l=r.get(i.target);l?Wa.has(l.type)||o.push(N("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(N("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(N("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),ts(e,r,o)||o.push(N("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=r.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&o.push(he("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(N("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(he("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let d=Dn(e,s);if(d===null){o.push(he("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||o.push(is("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${os(d)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){o.push(he("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let d=Pn(a?.period),c=Dn(e,s);if(d===null||c===null)continue;let f=ns(e,"period");Math.abs(d-c)>f&&o.push(N("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function ts(e,t,r){let n=e.placement?.mode==="at"?e.placement.reference:null;return n?n.kind==="named"?t.has(n.name):n.kind==="anchor"?t.has(n.objectId)?!0:(r.push(N("validate.anchor.target.unknown",`Unknown anchor target "${n.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(n.primary)?n.secondary&&!t.has(n.secondary)?(r.push(N("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${n.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(r.push(N("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${n.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Dn(e,t){let r=e.placement;if(!r||r.mode!=="orbit")return null;let n=rs(r.semiMajor??r.distance),o=Fn(t?.properties.mass);return n===null||o===null||o<=0?null:Math.sqrt(n**3/o)*365.25}function rs(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Et;case"m":return e.value/(Et*1e3);case"ly":return e.value*Xa;case"pc":return e.value*Ka;case"kpc":return e.value*Za;case"re":return e.value*qa/Et;case"sol":return e.value*Ga/Et;default:return null}}function Fn(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/Ya;case"mj":return t.value/Ha;default:return null}}function Pn(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){let r=e.tolerances?.find(n=>n.field===t)?.value;return typeof r=="number"?r:r&&typeof r=="object"&&"value"in r?Pn(r)??0:0}function os(e){return`${Math.round(e*100)/100}d`}function N(e,t,r,n){return{code:e,severity:"error",source:"validate",message:t,objectId:r,field:n}}function he(e,t,r,n){return{code:e,severity:"warning",source:"validate",message:t,objectId:r,field:n}}function is(e,t,r,n){return{code:e,severity:"info",source:"validate",message:t,objectId:r,field:n}}var as=new Set(["climate","habitability","settlement"]),Ct=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=Z(e);t&&Ct.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}])Ct.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var ss=new Set(Ct.keys());function Rt(e){return Cn(e)}function En(e){return Cn(e,"2.0-draft")}function Cn(e,t){let r=Us(e),n=r.source.split(/\r?\n/),o=[],i=!1,a="2.0",s=null,l=null,d=[],c=[],f=[],w=!1,b=!1,I=new Set,v=new Set,T=new Set,y=new Set;for(let j=0;j<n.length;j++){let V=n[j],A=j+1;if(!V.trim())continue;let W=yt(V),R=je(V.slice(W),{line:A,columnOffset:W});if(R.length!==0){if(!i){a=ls(R,A),i=!0,r.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:r.comments[0].line,column:r.comments[0].column});continue}if(W===0){l=cs(R,A,a,o,s,d,c,f,I,v,T,y,{sawDefaults:w,sawAtlas:b}),l.kind==="system"?s=l.system:l.kind==="defaults"?w=!0:l.kind==="atlas"&&(b=!0);continue}if(!l)throw new m("Indented line without parent atlas section",A,W+1);gs(l,W,R,A)}}if(!i)throw new m('Missing required atlas schema header "schema 2.0"');let $=d.map(j=>Ds(j,a,o)),x=t??(a==="2.0-draft"?"2.0":a),_={format:"worldorbit",sourceVersion:"1.0",system:s,groups:c,relations:f,objects:$,diagnostics:o};if(x==="2.0-draft"){let j={..._,version:"2.0-draft",schemaVersion:"2.0-draft"};return j.diagnostics.push(...at(j,a)),j}let P={..._,version:x,schemaVersion:x};return a==="2.0-draft"&&P.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".'}),P.diagnostics.push(...at(P,a)),P}function ls(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 m('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let r=e[1].value.toLowerCase();return r==="2.1"?"2.1":r==="2.0-draft"?"2.0-draft":"2.0"}function cs(e,t,r,n,o,i,a,s,l,d,c,f,w){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new m('Atlas section "system" may only appear once',t,e[0].column);return us(e,t,r,n);case"defaults":if(!o)throw new m('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(w.sawDefaults)throw new m('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 m('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(w.sawAtlas)throw new m('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 m('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return ds(e,t,o,l);case"annotation":if(!o)throw new m('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return fs(e,t,o,d);case"group":return ge(r,n,"group",{line:t,column:e[0].column}),ps(e,t,a,c);case"relation":return ge(r,n,"relation",{line:t,column:e[0].column}),ms(e,t,s,f);case"object":return hs(e,t,r,n,i);default:throw new m(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function us(e,t,r,n){if(e.length!==2)throw new m("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:r,diagnostics:n,seenFields:new Set}}function ds(e,t,r,n){if(e.length!==2)throw new m("Invalid viewpoint declaration",t,e[0]?.column??1);let o=it(e[1].value);if(!o)throw new m("Viewpoint id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate viewpoint id "${o}"`,t,e[1].column);let i={id:o,label:Pt(o),summary:"",focusObjectId:null,selectedObjectId:null,projection:r.defaults.view,preset:r.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return r.viewpoints.push(i),n.add(o),{kind:"viewpoint",viewpoint:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function fs(e,t,r,n){if(e.length!==2)throw new m("Invalid annotation declaration",t,e[0]?.column??1);let o=it(e[1].value);if(!o)throw new m("Annotation id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:Pt(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function ps(e,t,r,n){if(e.length!==2)throw new m("Invalid group declaration",t,e[0]?.column??1);let o=it(e[1].value);if(!o)throw new m("Group id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:Pt(o),summary:"",color:null,tags:[],hidden:!1};return r.push(i),n.add(o),{kind:"group",group:i,seenFields:new Set}}function ms(e,t,r,n){if(e.length!==2)throw new m("Invalid relation declaration",t,e[0]?.column??1);let o=it(e[1].value);if(!o)throw new m("Relation id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return r.push(i),n.add(o),{kind:"relation",relation:i,seenFields:new Set}}function hs(e,t,r,n,o){if(e.length<3)throw new m("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],a=e[2],s=i.value;if(!Ge.has(s)||s==="system")throw new m(`Unknown object type "${i.value}"`,t,i.column);let l={objectType:s,id:a.value,fields:Ms(e.slice(3),t,s,r,n),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:r,diagnostics:n,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function gs(e,t,r,n){switch(e.kind){case"system":bs(e,r,n);return;case"defaults":ys(e,r,n);return;case"atlas":ws(e,t,r,n);return;case"viewpoint":vs(e,t,r,n);return;case"annotation":Is(e,r,n);return;case"group":xs(e,r,n);return;case"relation":ks(e,r,n);return;case"object":Ss(e,t,r,n);return}}function bs(e,t,r){let n=Te(t,e.seenFields,r),o=U(t,r);switch(n){case"title":e.system.title=o;return;case"description":ge(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.description=o;return;case"epoch":ge(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":ge(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:r,column:t[0].column}),e.system.referencePlane=o;return;default:throw new m(`Unknown system atlas field "${t[0].value}"`,r,t[0].column)}}function ys(e,t,r){let n=Te(t,e.seenFields,r),o=U(t,r);switch(n){case"view":e.system.defaults.view=Rn(o,r,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=Bn(o,r,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new m(`Unknown defaults field "${t[0].value}"`,r,t[0].column)}}function ws(e,t,r,n){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=zn(r,n,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new m(`Duplicate atlas metadata key "${o.key}"`,n,r[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(r.length===1&&r[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new m(`Unknown atlas field "${r[0].value}"`,n,r[0].column)}function vs(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){$s(e,r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new m('Duplicate viewpoint field "filter"',n,r[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=Te(r,e.seenFields,n),i=U(r,n);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=Rn(i,n,r[0].column);return;case"preset":e.viewpoint.preset=Bn(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=As(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=_n(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=Os(r.slice(1),n);return;default:throw new m(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function $s(e,t,r){let n=Te(t,e.seenFilterFields,r),o=e.viewpoint.filter??Ts();switch(n){case"query":o.query=U(t,r);break;case"objecttypes":o.objectTypes=js(t.slice(1),r);break;case"tags":o.tags=Ae(t.slice(1),r,"tags");break;case"groups":o.groupIds=Ae(t.slice(1),r,"groups");break;default:throw new m(`Unknown viewpoint filter field "${t[0].value}"`,r,t[0].column)}e.viewpoint.filter=o}function Is(e,t,r){switch(Te(t,e.seenFields,r)){case"label":e.annotation.label=U(t,r);return;case"target":e.annotation.targetObjectId=U(t,r);return;case"body":e.annotation.body=U(t,r);return;case"tags":e.annotation.tags=Ae(t.slice(1),r,"tags");return;default:throw new m(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function xs(e,t,r){switch(Te(t,e.seenFields,r)){case"label":e.group.label=U(t,r);return;case"summary":e.group.summary=U(t,r);return;case"color":e.group.color=U(t,r);return;case"tags":e.group.tags=Ae(t.slice(1),r,"tags");return;case"hidden":e.group.hidden=Oe(U(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new m(`Unknown group field "${t[0].value}"`,r,t[0].column)}}function ks(e,t,r){switch(Te(t,e.seenFields,r)){case"from":e.relation.from=U(t,r);return;case"to":e.relation.to=U(t,r);return;case"kind":e.relation.kind=U(t,r);return;case"label":e.relation.label=U(t,r);return;case"summary":e.relation.summary=U(t,r);return;case"tags":e.relation.tags=Ae(t.slice(1),r,"tags");return;case"color":e.relation.color=U(t,r);return;case"hidden":e.relation.hidden=Oe(U(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new m(`Unknown relation field "${t[0].value}"`,r,t[0].column)}}function Ss(e,t,r,n){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),r.length===1){let o=r[0].value.toLowerCase();if(o==="info"||as.has(o)){o!=="info"&&ge(e.sourceSchemaVersion,e.diagnostics,o,{line:n,column:r[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=zn(r,n,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new m(`Duplicate info key "${o.key}"`,n,r[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 m(`Duplicate ${i} key "${o.key}"`,n,r[0].column);a.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(Ls(r,n,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function Te(e,t,r){if(e.length<2)throw new m("Invalid atlas field line",r,e[0]?.column??1);let n=e[0].value.toLowerCase();if(t.has(n))throw new m(`Duplicate atlas field "${e[0].value}"`,r,e[0].column);return t.add(n),n}function U(e,t){if(e.length<2)throw new m("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(r=>r.value).join(" ").trim()}function js(e,t){return Ae(e,t,"objectTypes").filter(r=>r==="star"||r==="planet"||r==="moon"||r==="belt"||r==="asteroid"||r==="comet"||r==="ring"||r==="structure"||r==="phenomenon")}function Os(e,t){let r={};for(let n of Ae(e,t,"layers")){let o=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){r["orbits-back"]=o,r["orbits-front"]=o;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="objects"||i==="labels"||i==="metadata")&&(r[i]=o)}return r}function Ae(e,t,r){if(e.length===0)throw new m(`Missing value for atlas field "${r}"`,t,1);let n=e.map(o=>o.value).filter(Boolean);if(n.length===0)throw new m(`Missing value for atlas field "${r}"`,t,e[0]?.column??1);return n}function Rn(e,t,r){let n=e.toLowerCase();if(n!=="topdown"&&n!=="isometric")throw new m(`Unknown projection "${e}"`,t,r);return n}function Bn(e,t,r){let n=e.toLowerCase();if(n==="diagram"||n==="presentation"||n==="atlas-card"||n==="markdown")return n;throw new m(`Unknown render preset "${e}"`,t,r)}function As(e,t,r,n){let o=_n(e,t,r,n);if(o<=0)throw new m(`Field "${n}" must be greater than zero`,t,r);return o}function _n(e,t,r,n){let o=Number(e);if(!Number.isFinite(o))throw new m(`Invalid numeric value "${e}" for "${n}"`,t,r);return o}function Ts(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ms(e,t,r,n,o){let i=[],a=0;for(;a<e.length;){let s=e[a],l=st(s.value);if(!l)throw new m(`Unknown field "${s.value}"`,t,s.column);l.version==="2.1"&&ge(n,o,s.value,{line:t,column:s.column}),a++;let d=[];if(l.inlineMode==="single"){let c=e[a];c&&(d.push(c),a++)}else if(l.inlineMode==="pair")for(let c=0;c<2;c++){let f=e[a];if(!f)break;d.push(f),a++}else for(;a<e.length&&!ss.has(e[a].value);)d.push(e[a]),a++;if(d.length===0)throw new m(`Missing value for field "${s.value}"`,t,s.column);i.push({type:"field",key:s.value,values:d.map(c=>c.value),location:{line:t,column:s.column}})}return Un(i,r),i}function Ls(e,t,r,n,o){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);let i=st(e[0].value);if(!i)throw new m(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&ge(n,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 Un([a],r),a}function zn(e,t,r){if(e.length<2)throw new m(r,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}function Ds(e,t,r){let n=Fs(e.fields),o=Ps(e.objectType,n),i=Vs(e.objectType,n),a=zs(n.get("groups")?.[0]),s=Vn(n.get("epoch")?.[0]),l=Vn(n.get("referencePlane")?.[0]),d=n.has("tidalLock")?Oe(oe(n.get("tidalLock")[0]),"tidalLock",n.get("tidalLock")[0].location):void 0,c=n.has("resonance")?Rs(n.get("resonance")[0]):void 0,f=Cs(n),w=n.get("derive")?.map(x=>Bs(x)),b=n.get("validate")?.map(x=>({rule:oe(x)})),I=n.has("locked")?[...new Set(n.get("locked").flatMap(x=>x.values))]:void 0,v=n.get("tolerance")?.map(x=>_s(x)),T=Es(e.typedBlockEntries),y=Nn(e.infoEntries,"info"),$={type:e.objectType,id:e.id,properties:i,placement:o,info:y};return a.length>0&&($.groups=a),s&&($.epoch=s),l&&($.referencePlane=l),d!==void 0&&($.tidalLock=d),c&&($.resonance=c),f&&($.renderHints=f),w?.length&&($.deriveRules=w),b?.length&&($.validationRules=b),I?.length&&($.lockedFields=I),v?.length&&($.tolerances=v),T&&Object.keys(T).length>0&&($.typedBlocks=T),t!=="2.1"&&($.groups||$.epoch||$.referencePlane||$.tidalLock!==void 0||$.resonance||$.renderHints||$.deriveRules?.length||$.validationRules?.length||$.lockedFields?.length||$.tolerances?.length||$.typedBlocks)&&ge(t,r,e.id,e.location),$}function Fs(e){let t=new Map;for(let r of e){let n=st(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!n.allowRepeat&&t.has(r.key))throw m.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=t.get(r.key)??[];o.push(r),t.set(r.key,o)}return t}function Ps(e,t){let r=t.get("orbit")?.[0],n=t.get("at")?.[0],o=t.get("surface")?.[0],i=t.get("free")?.[0];if([r,n,o,i].filter(Boolean).length>1){let s=r??n??o??i;throw m.fromLocation("Object has multiple placement modes",s?.location)}if(r)return{mode:"orbit",target:oe(r),distance:Re(t.get("distance")?.[0],"distance"),semiMajor:Re(t.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ns(t.get("eccentricity")?.[0],"eccentricity"),period:Re(t.get("period")?.[0],"period"),angle:Re(t.get("angle")?.[0],"angle"),inclination:Re(t.get("inclination")?.[0],"inclination"),phase:Re(t.get("phase")?.[0],"phase")};if(n){let s=oe(n);return{mode:"at",target:s,reference:Mn(s,n.location)}}if(o)return{mode:"surface",target:oe(o)};if(i){let s=oe(i),l=Ir(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function Vs(e,t){let r={};for(let[n,o]of t.entries()){let i=o[0],a=st(n);!i||!a?.legacySchema||a.legacySchema.placement||(xr(n,e,i.location),r[n]=Ln(n,i.values,i.location))}return r}function Nn(e,t){let r={};for(let n of e){if(n.key in r)throw m.fromLocation(`Duplicate ${t} key "${n.key}"`,n.location);r[n.key]=n.value}return r}function Es(e){let t={};for(let r of Object.keys(e)){let n=e[r];n?.length&&(t[r]=Nn(n,r))}return t}function Cs(e){let t={},r=e.get("renderLabel")?.[0],n=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return r&&(t.renderLabel=Oe(oe(r),"renderLabel",r.location)),n&&(t.renderOrbit=Oe(oe(n),"renderOrbit",n.location)),o&&(t.renderPriority=Vt(oe(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function Rs(e){if(e.values.length!==2)throw m.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw m.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Bs(e){if(e.values.length!==2)throw m.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function _s(e){if(e.values.length!==2)throw m.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],r=Ir(t),n=Number(t);return{field:e.values[0],value:r??(Number.isFinite(n)?n:t)}}function zs(e){return e?[...new Set(e.values)]:[]}function Vn(e){return e&&e.values.join(" ").trim()||null}function Re(e,t){return e?$r(oe(e),e.location,t):void 0}function Ns(e,t){return e?Vt(oe(e),t,e.location):void 0}function oe(e){return ot(e.values,e.key,e.location)}function st(e){return Ct.get(e)}function Un(e,t){for(let r of e){let n=st(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(n.legacySchema){xr(r.key,t,r.location);continue}if((r.key==="renderLabel"||r.key==="renderOrbit"||r.key==="tidalLock")&&r.values.length!==1)throw m.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function ge(e,t,r,n){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function Us(e){let t=[...e],r=[],n=!1,o=!1,i=null,a=1,s=1;for(let l=0;l<t.length;l++){let d=t[l],c=t[l+1];if(o){if(d==="*"&&c==="/"){t[l]=" ",t[l+1]=" ",o=!1,i=null,l++,s+=2;continue}d!==`
|
|
5
|
+
`&&d!=="\r"&&(t[l]=" "),d===`
|
|
6
|
+
`?(a++,s=1):s++;continue}if(!n&&d==="/"&&c==="*"){r.push({kind:"block",line:a,column:s}),t[l]=" ",t[l+1]=" ",o=!0,i={line:a,column:s},l++,s+=2;continue}if(!n&&d==="#"&&!Ws(t,l)){r.push({kind:"line",line:a,column:s}),t[l]=" ";let f=l+1;for(;f<t.length&&t[f]!==`
|
|
7
|
+
`&&t[f]!=="\r";)t[f]=" ",f++;s+=f-l,l=f-1;continue}d==='"'&&t[l-1]!=="\\"&&(n=!n),d===`
|
|
8
|
+
`?(a++,s=1):s++}if(o)throw m.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:r}}function Ws(e,t){let r=t+1,n=0;for(;r<e.length&&/[0-9a-f]/i.test(e[r]??"");)r++,n++;if(![3,4,6,8].includes(n))return!1;let o=e[r];return o===void 0||o===" "||o===" "||o==="\r"||o===`
|
|
9
|
+
`}function kr(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],objects:[],diagnostics:[]}}function Bt(e){return structuredClone(e)}function Wn(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let r of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:r});for(let r of[...e.system.viewpoints].sort(Be))t.push({kind:"viewpoint",id:r.id});for(let r of[...e.system.annotations].sort(Be))t.push({kind:"annotation",id:r.id})}for(let r of[...e.groups].sort(Be))t.push({kind:"group",id:r.id});for(let r of[...e.relations].sort(Be))t.push({kind:"relation",id:r.id});for(let r of[...e.objects].sort(Be))t.push({kind:"object",id:r.id});return t}function Sr(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?Xn(e,t.id):null;case"object":return t.id?Gn(e,t.id):null;case"viewpoint":return t.id?Zn(e.system,t.id):null;case"annotation":return t.id?Jn(e.system,t.id):null;case"relation":return t.id?Kn(e,t.id):null}}function jr(e,t,r){let n=Bt(e),o=Tr(n);switch(t.kind){case"system":return n.system=r,n;case"defaults":return o.defaults={...o.defaults,...r},n;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return r==null||r===""?delete o.atlasMetadata[t.key]:o.atlasMetadata[t.key]=String(r),n;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return lt(n.groups,r),n;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return lt(n.objects,r),n;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return lt(o.viewpoints,r),n;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return lt(o.annotations,r),n;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return lt(n.relations,r),n}}function Yn(e,t,r){return jr(e,t,r(Sr(e,t)))}function Hn(e,t){let r=Bt(e),n=Tr(r);switch(t.kind){case"metadata":return t.key&&delete n.atlasMetadata[t.key],r;case"object":return t.id&&(r.objects=r.objects.filter(o=>o.id!==t.id)),r;case"group":return t.id&&(r.groups=r.groups.filter(o=>o.id!==t.id)),r;case"viewpoint":return t.id&&(n.viewpoints=n.viewpoints.filter(o=>o.id!==t.id)),r;case"annotation":return t.id&&(n.annotations=n.annotations.filter(o=>o.id!==t.id)),r;case"relation":return t.id&&(r.relations=r.relations.filter(o=>o.id!==t.id)),r;default:return r}}function Or(e,t){return t.map(r=>({diagnostic:r,path:Ar(e,r)}))}function Ar(e,t){if(t.objectId&&Gn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let r=t.field.split(".");if(r[1]&&Xn(e,r[1]))return{kind:"group",id:r[1]}}if(t.field?.startsWith("viewpoint.")){let r=t.field.split(".");if(r[1]&&Zn(e.system,r[1]))return{kind:"viewpoint",id:r[1]}}if(t.field?.startsWith("annotation.")){let r=t.field.split(".");if(r[1]&&Jn(e.system,r[1]))return{kind:"annotation",id:r[1]}}if(t.field?.startsWith("relation.")){let r=t.field.split(".");if(r[1]&&Kn(e,r[1]))return{kind:"relation",id:r[1]}}return t.field&&t.field in Tr(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function qn(e){let t=[...e.diagnostics,...at(e,e.version)];return Or(e,t)}function Tr(e){return e.system||(e.system=kr().system),e.system}function Gn(e,t){return e.objects.find(r=>r.id===t)??null}function Xn(e,t){return e.groups.find(r=>r.id===t)??null}function Kn(e,t){return e.relations.find(r=>r.id===t)??null}function Zn(e,t){return e?.viewpoints.find(r=>r.id===t)??null}function Jn(e,t){return e?.annotations.find(r=>r.id===t)??null}function lt(e,t){let r=e.findIndex(n=>n.id===t.id);if(r===-1){e.push(t),e.sort(Be);return}e[r]=t}function Be(e,t){return e.id.localeCompare(t.id)}var Ys=/^schema\s+2(?:\.0|\.1)?$/i,Hs=/^schema\s+2\.1$/i,qs=/^schema\s+2\.0-draft$/i;function Mr(e){for(let t of Gs(e).split(/\r?\n/)){let r=t.trim();if(r)return qs.test(r)?"2.0-draft":Hs.test(r)?"2.1":Ys.test(r)?"2.0":"1.0"}return"1.0"}function Gs(e){let t=[...e],r=!1,n=!1;for(let o=0;o<t.length;o++){let i=t[o],a=t[o+1];if(n){if(i==="*"&&a==="/"){t[o]=" ",t[o+1]=" ",n=!1,o++;continue}i!==`
|
|
10
|
+
`&&i!=="\r"&&(t[o]=" ");continue}if(!r&&i==="/"&&a==="*"){t[o]=" ",t[o+1]=" ",n=!0,o++;continue}if(!r&&i==="#"){t[o]=" ";let s=o+1;for(;s<t.length&&t[s]!==`
|
|
11
|
+
`&&t[s]!=="\r";)t[s]=" ",s++;o=s-1;continue}i==='"'&&t[o-1]!=="\\"&&(r=!r)}return t.join("")}function de(e){let t=Lr(e);if(!t.ok||!t.value){let r=t.diagnostics[0];throw new m(r?.message??"Failed to load WorldOrbit source",r?.line,r?.column)}return t.value}function Lr(e){let t=Mr(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Xs(e,t);let r;try{r=$e(e)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"parse")]}}let n;try{n=pe(r)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"normalize")]}}try{me(n)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Xs(e,t){let r;try{r=Rt(e)}catch(a){return{ok:!1,value:null,diagnostics:[Q(a,"parse","load.atlas.failed")]}}let n=[...r.diagnostics];if(n.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:n};let o;try{o=nt(r)}catch(a){return{ok:!1,value:null,diagnostics:[Q(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:r,draftDocument:r,diagnostics:n},diagnostics:n}}var Ks=/^```worldorbit(?:\s+(.*))?\s*$/;function Qn(e){let t=e.split(/\r?\n/),r=[],n=!1,o=null,i=0,a=[];return t.forEach((s,l)=>{let d=l+1;if(!n){let c=s.match(Ks);c&&(n=!0,o=c[1]??null,i=d,a=[]);return}if(s.trim()==="```"){r.push({source:a.join(`
|
|
12
|
+
`),info:o,startLine:i,endLine:d}),n=!1,o=null,i=0,a=[];return}a.push(s)}),r}function eo(e){let t=$e(e),r=pe(t);return me(r),{ast:t,document:r}}function Zs(e){let t=eo(e);return{...t,scene:J(t.document)}}function Js(e){return de(e)}function Qs(e){return $t(e)}function el(e,t={}){return Ft(e,t)}var tl={background:!0,guides:!0,relations:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},ct={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 _t(e){return e?typeof e=="string"?ct[e]??ct.atlas:{...ct.atlas,...e}:ct.atlas}function zt(e){return{...tl,...e}}function to(e){return ct[e]}function ee(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Dr(e.objectTypes??[]),tags:Dr((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:Dr((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return rl(t)?t:null}function rl(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Nt(e,t){let r=ee(t),n=new Set;for(let o of e.objects)if(!o.hidden&&nl(o,r)&&(n.add(o.objectId),r?.includeAncestors!==!1))for(let i of o.ancestorIds)n.add(i);return r?n:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function Ut(e,t,r=12){let n=t.trim().toLowerCase();return n?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:ol(o,n)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,r).map(o=>ro(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,r).map(o=>ro(o,1))}function no(e,t,r,n){return{version:"2.0",viewpointId:n,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0},filter:ee(r)}}function Wt(e){return encodeURIComponent(JSON.stringify(e))}function Yt(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",viewpointId:t.viewpointId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0},filter:ee(t.filter??null)}}function oo(e,t,r){let n=e.trim()||"bookmark";return{id:n.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||n,atlasState:{...r,viewerState:{...r.viewerState},renderOptions:{...r.renderOptions,layers:r.renderOptions.layers?{...r.renderOptions.layers}:void 0,scaleModel:r.renderOptions.scaleModel?{...r.renderOptions.scaleModel}:void 0},filter:r.filter?{...r.filter}:null}}}function Ht(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function qt(e){return e?.filter?ee({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function ro(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[]}}function nl(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let r=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),n=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!r&&!n)return!1}if(t.tags?.length){let r=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[];if(!t.tags.every(n=>r.includes(n)))return!1}if(t.query?.trim()){let r=io(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function ol(e,t){let r=e.objectId.toLowerCase(),n=e.label.toLowerCase(),o=io(e.object,e.label).toLowerCase(),i=0;return r===t||n===t?i+=120:r.startsWith(t)||n.startsWith(t)?i+=96:(r.includes(t)||n.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(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 io(e,t){let r=Object.values(e.info),n=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...n,...r].join(" ")}function Dr(e){return[...new Set(e)]}var Ie={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Fr(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function ut(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Me(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function Gt(e,t){return{...e,rotationDeg:Fr(e.rotationDeg+t)}}function _e(e,t,r,n,o){if(!Number.isFinite(r)||r<=0)return t;let i=De(e),a=ut(t.scale*r,o);if(a===t.scale)return t;let s=a/t.scale,l=n.x-i.x,d=n.y-i.y;return{...t,scale:a,translateX:(1-s)*l+s*t.translateX,translateY:(1-s)*d+s*t.translateY}}function Le(e,t,r){let n=De(e),o=il(e.contentBounds,n,t.rotationDeg),i=Math.max(e.width-r.fitPadding*2,1),a=Math.max(e.height-r.fitPadding*2,1),s=Math.max(o.width,1),l=Math.max(o.height,1),d=ut(Math.min(i/s,a/l),r),c=ue({x:e.contentBounds.centerX,y:e.contentBounds.centerY},n,t.rotationDeg);return{...t,scale:d,translateX:n.x-(n.x+(c.x-n.x)*d),translateY:n.y-(n.y+(c.y-n.y)*d)}}function Xt(e,t,r,n){let o=e.objects.find(l=>l.objectId===r&&!l.hidden);if(!o)return t;let i=De(e),a=ut(Math.max(t.scale,1.8),n),s=ue({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:r}}function Kt(e,t){let r=De(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function ze(e,t,r){let n=De(e),o={x:r.x-t.translateX,y:r.y-t.translateY},i={x:o.x-n.x,y:o.y-n.y},a={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},s=ue({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:n.x+s.x,y:n.y+s.y}}function Zt(e,t){let r=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(s=>ze(e,t,s)),n=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),i=Math.max(...r.map(s=>s.x)),a=Math.max(...r.map(s=>s.y));return{minX:n,minY:o,maxX:i,maxY:a,width:i-n,height:a-o,centerX:n+(i-n)/2,centerY:o+(a-o)/2}}function De(e){return{x:e.width/2,y:e.height/2}}function il(e,t,r){let n=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(l=>ue(l,t,r)),o=Math.min(...n.map(l=>l.x)),i=Math.min(...n.map(l=>l.y)),a=Math.max(...n.map(l=>l.x)),s=Math.max(...n.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 Qt="worldorbit-camera-root";function ae(e,t={}){let r=_t(t.theme),n=$l(t.preset??e.renderPreset??void 0),o=zt({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,a=Nt(e,t.filter??null),s=e.objects.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Jt(y.object)).sort((y,$)=>y.sortKey-$.sortKey),l=e.labels.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Jt(y.object)),d=ll(s),c=o.orbits?sl(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Jt(y.object)).map(y=>`<line class="wo-leader wo-leader-${y.mode}" x1="${y.x1}" y1="${y.y1}" x2="${y.x2}" y2="${y.y2}" data-render-id="${G(y.renderId)}" data-group-id="${ie(y.groupId??"")}" />`).join(""):"",w=o.relations?e.relations.filter(y=>!y.hidden).filter(y=>a.has(y.fromObjectId)&&a.has(y.toObjectId)).map(y=>`<line class="wo-relation" x1="${y.x1}" y1="${y.y1}" x2="${y.x2}" y2="${y.y2}" data-render-id="${G(y.renderId)}" data-relation-id="${ie(y.relationId)}" />`).join(""):"",b=o.objects?s.map(y=>cl(y,t.selectedObjectId??null,r)).join(""):"",I=o.labels?l.map(y=>ul(e,y,t.selectedObjectId??null)).join(""):"",v=o.metadata?`<text class="wo-title" x="56" y="64">${G(e.title)}</text>
|
|
13
|
+
<text class="wo-subtitle" x="56" y="88">${G(i)}</text>
|
|
14
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${G(xl(e))}</text>`:"",T=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
8
15
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
9
|
-
${o.guides?
|
|
10
|
-
<title id="worldorbit-title">${
|
|
11
|
-
<desc id="worldorbit-desc">A ${
|
|
16
|
+
${o.guides?Il(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">${G(e.title)}</title>
|
|
18
|
+
<desc id="worldorbit-desc">A ${G(e.viewMode)} WorldOrbit render with ${s.length} visible objects.</desc>
|
|
12
19
|
<defs>
|
|
13
20
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
14
21
|
<stop offset="0%" stop-color="${r.backgroundStart}" />
|
|
@@ -32,6 +39,7 @@ var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDe
|
|
|
32
39
|
.wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
|
|
33
40
|
.wo-orbit-front { opacity: 0.9; }
|
|
34
41
|
.wo-orbit-band { stroke: ${r.orbitBand}; stroke-linecap: round; }
|
|
42
|
+
.wo-relation { stroke: ${r.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
|
|
35
43
|
.wo-leader { stroke: ${r.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
|
|
36
44
|
.wo-label { fill: ${r.ink}; font-family: ${r.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
|
|
37
45
|
.wo-label-secondary { fill: ${r.muted}; font-family: ${r.fontFamily}; font-weight: 500; }
|
|
@@ -58,55 +66,56 @@ var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDe
|
|
|
58
66
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
59
67
|
.wo-object-image { pointer-events: none; }
|
|
60
68
|
</style>
|
|
61
|
-
${
|
|
62
|
-
${
|
|
69
|
+
${T}
|
|
70
|
+
${v}
|
|
63
71
|
<g data-worldorbit-world="true">
|
|
64
|
-
<g data-worldorbit-camera-root="${
|
|
72
|
+
<g data-worldorbit-camera-root="${Qt}" id="${Qt}">
|
|
65
73
|
<g data-worldorbit-world-content="true">
|
|
66
|
-
${o.orbits?`<g data-layer-id="orbits-back">${
|
|
74
|
+
${o.orbits?`<g data-layer-id="orbits-back">${c.back}</g>`:""}
|
|
67
75
|
${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
68
|
-
${o.
|
|
69
|
-
${o.
|
|
70
|
-
${o.
|
|
76
|
+
${o.relations?`<g data-layer-id="relations">${w}</g>`:""}
|
|
77
|
+
${o.objects?`<g data-layer-id="objects">${b}</g>`:""}
|
|
78
|
+
${o.orbits?`<g data-layer-id="orbits-front">${c.front}</g>`:""}
|
|
79
|
+
${o.labels?`<g data-layer-id="labels">${I}</g>`:""}
|
|
71
80
|
</g>
|
|
72
81
|
</g>
|
|
73
82
|
</g>
|
|
74
|
-
</svg>`}function
|
|
83
|
+
</svg>`}function Er(e,t={}){return ae(J(e,t),t)}function co(e,t={}){let r=de(e);return Er(r.document,al(r,t))}function al(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function sl(e,t,r){let n=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(r||!Jt(a.object)))){let a=i.bandThickness??(i.band?10:1.5),s=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",l=`data-render-id="${G(i.renderId)}" data-orbit-object-id="${ie(i.objectId)}" data-parent-id="${ie(i.parentId)}" data-group-id="${ie(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&n.push(`<path class="${s} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${l} />`),i.frontArcPath&&o.push(`<path class="${s} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${l} />`);continue}if(i.kind==="ellipse"){let d=i.rx??i.radius??0,c=i.ry??i.radius??0;o.push(`<ellipse class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${d}" ry="${c}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${a}" ${l} />`);continue}o.push(`<circle class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${l} />`)}return{back:n.join(""),front:o.join("")}}function ll(e){return e.filter(t=>!!t.imageHref).map(t=>pl(t)).join("")}function cl(e,t,r){let{object:n,x:o,y:i,radius:a,visualRadius:s}=e,l=t===e.objectId?" wo-object-selected":"",d=n.properties.kind?` wo-kind-${String(n.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",c=hl(e,r),f=fl(e),w=f?ao(n,o,i,a,c,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${n.type}${d}${l}" data-object-id="${G(e.objectId)}" data-parent-id="${ie(e.parentId??"")}" data-group-id="${ie(e.groupId??"")}" data-render-id="${G(e.renderId)}" tabindex="0" role="button" aria-label="${G(`${n.type} ${e.objectId}`)}">
|
|
75
84
|
<circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${s+8}" />
|
|
76
|
-
${
|
|
77
|
-
${
|
|
85
|
+
${dl(e,c)}
|
|
86
|
+
${ao(n,o,i,a,c)}
|
|
78
87
|
${f}
|
|
79
88
|
${w}
|
|
80
|
-
</g>`}function
|
|
81
|
-
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${
|
|
82
|
-
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${
|
|
83
|
-
</g>`}function
|
|
89
|
+
</g>`}function ul(e,t,r){let n=r===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${n}" data-object-id="${G(t.objectId)}" data-group-id="${ie(t.groupId??"")}" data-render-id="${G(t.renderId)}">
|
|
90
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${G(t.label)}</text>
|
|
91
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${G(t.secondaryLabel)}</text>
|
|
92
|
+
</g>`}function ao(e,t,r,n,o,i={}){let a=i.outlineOnly?"transparent":o.fill,s=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${r}" r="${n*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
84
93
|
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-n*2} ${r+n*1.3} Q ${t-n*.7} ${r+n*.3} ${t-n*.45} ${r}" fill="none" stroke="${s}" stroke-width="${Math.max(2,n*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
85
|
-
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${
|
|
86
|
-
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:
|
|
94
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${fo(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let l=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?l==="black-hole"||l==="nebula"||l==="galaxy"||l==="dwarf-galaxy"?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${Pr(t,r,n)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:l==="black-hole"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.4}" ry="${n*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
|
|
95
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:l==="galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.6}" ry="${n}" fill="${o.halo??"none"}" stroke="none" />
|
|
87
96
|
<ellipse cx="${t}" cy="${r}" rx="${n*1.5}" ry="${n*.42}" fill="${a}" stroke="${o.stroke}" stroke-width="1.2" />
|
|
88
|
-
<circle cx="${t}" cy="${r}" r="${n*.28}" fill="${o.core??"#fff"}" stroke="none" />`:
|
|
89
|
-
<circle cx="${t}" cy="${r}" r="${n*.25}" fill="${o.core??"#fff"}" stroke="none" />`:
|
|
90
|
-
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${
|
|
91
|
-
<svg width="${
|
|
92
|
-
<rect x="0.5" y="0.5" width="${
|
|
93
|
-
<rect x="${
|
|
94
|
-
${
|
|
95
|
-
<rect x="${
|
|
97
|
+
<circle cx="${t}" cy="${r}" r="${n*.28}" fill="${o.core??"#fff"}" stroke="none" />`:l==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*1.6}" ry="${n*.55}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />
|
|
98
|
+
<circle cx="${t}" cy="${r}" r="${n*.25}" fill="${o.core??"#fff"}" stroke="none" />`:l==="nebula"?`<circle cx="${t}" cy="${r}" r="${n*2.2}" fill="${o.halo??"none"}" stroke="none" />
|
|
99
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${Pr(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function dl(e,t){if(!t.atmosphere)return"";let{object:r,x:n,y:o,radius:i}=e;return r.type!=="planet"&&r.type!=="moon"&&r.type!=="asteroid"?"":`<circle cx="${n}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function fl(e){if(!e.imageHref)return"";let t=ml(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${ie(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${ie(uo(e))})" />`}function pl(e){let{x:t,y:r,radius:n}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${r}" r="${n}" />`;break;case"structure":o=`<polygon points="${fo(t,r,n)}" />`;break;case"phenomenon":o=`<polygon points="${Pr(t,r,n)}" />`;break;default:return""}return`<clipPath id="${ie(uo(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function ml(e){let{object:t,x:r,y:n,radius:o}=e;switch(t.type){case"structure":return{x:r-o,y:n-o,width:o*2,height:o*2};case"phenomenon":return{x:r-o*1.2,y:n-o*1.2,width:o*2.4,height:o*2.4};default:return{x:r-o,y:n-o,width:o*2,height:o*2}}}function hl(e,t){let r=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),n=gl(e.object.type,r,t),o=e.fillColor&&Sl(e.fillColor)?e.fillColor:n.fill,i=so(e.object.properties.albedo),a=so(e.object.properties.temperature),s=yl(o,a,i,e.object.type),l=dt(s,"#ffffff",.4)??n.stroke,d=vl(e.object.properties.atmosphere),c=e.object.type==="star"?lo(dt(s,"#fff2cb",.4)??s,.82):void 0;return{fill:s,stroke:l,glow:c,atmosphere:d,tail:e.object.type==="comet"?lo(dt(s,"#ffffff",.5)??s,.72):void 0}}function gl(e,t,r){switch(e){case"star":return{fill:r.starCore,stroke:r.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:r.accentStrong,stroke:"#fff2ea"};case"phenomenon":return bl(t)}}function bl(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 yl(e,t,r,n){let o=e;if(t!==null){let i=wl(t,n);o=dt(o,i,n==="star"?.42:.2)??o}if(r!==null){let i=Math.min(Math.max(r,0),1);o=dt(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function wl(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function vl(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 $l(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 so(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function uo(e){return`${e.renderId}-clip`}function fo(e,t,r){return`${e},${t-r} ${e+r},${t} ${e},${t+r} ${e-r},${t}`}function Pr(e,t,r){return`${e},${t-r*1.2} ${e+r*.9},${t-r*.3} ${e+r*1.2},${t+r*.8} ${e},${t+r*1.2} ${e-r*1.1},${t+r*.3} ${e-r*.8},${t-r*.8}`}function Il(e,t){let r=Array.from({length:10},(o,i)=>{let a=90+i*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),n=Array.from({length:6},(o,i)=>{let a=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${r}${n}`}function xl(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Jt(e){return e.type==="structure"||e.type==="phenomenon"}function dt(e,t,r){let n=Vr(e),o=Vr(t);if(!n||!o)return;let i=Math.min(Math.max(r,0),1);return kl({r:Math.round(n.r+(o.r-n.r)*i),g:Math.round(n.g+(o.g-n.g)*i),b:Math.round(n.b+(o.b-n.b)*i)})}function lo(e,t){let r=Vr(e);return r?`rgba(${r.r}, ${r.g}, ${r.b}, ${t})`:e}function Vr(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 kl(e){let t=r=>r.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Sl(e){return!!e.trim()}function G(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function ie(e){return G(e)}var Ne=180,Ue=120,po=10;function mo(e,t,r){let n=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},o=Math.min((Ne-po*2)/Math.max(n.width,1),(Ue-po*2)/Math.max(n.height,1)),i=(Ne-n.width*o)/2-n.minX*o,a=(Ue-n.height*o)/2-n.minY*o,s=Zt(e,t),l=r.map(d=>{let c=d.x*o+i,f=d.y*o+a,w=Math.max(1.4,Math.min(d.visualRadius*o,5.2)),b=d.fillColor??jl(d.object.type);return`<circle cx="${se(c)}" cy="${se(f)}" r="${se(w)}" fill="${b}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Ne}px;height:${Ue}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;">
|
|
100
|
+
<svg width="${Ne}" height="${Ue}" viewBox="0 0 ${Ne} ${Ue}" role="presentation" aria-hidden="true">
|
|
101
|
+
<rect x="0.5" y="0.5" width="${Ne-1}" height="${Ue-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
102
|
+
<rect x="${se(n.minX*o+i)}" y="${se(n.minY*o+a)}" width="${se(n.width*o)}" height="${se(n.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
103
|
+
${l}
|
|
104
|
+
<rect x="${se(s.minX*o+i)}" y="${se(s.minY*o+a)}" width="${se(s.width*o)}" height="${se(s.height*o)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
|
|
96
105
|
</svg>
|
|
97
|
-
</div>`}function
|
|
106
|
+
</div>`}function jl(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 se(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Ol=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function go(e){return{objectId:e.objectId,title:e.objectId,typeLabel:Dl(e.object.type),imageHref:e.renderObject.imageHref??null,description:Ml(e),tags:Tl(e.object.properties.tags),fields:Al(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function bo(e,t){let r=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${fe(i)}</span>`).join("")}</div>`:"",n=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${fe(i.label)}</dt><dd>${fe(i.value)}</dd></div>`).join("")}</dl>`:"",o=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${fe(e.objectId)}">
|
|
98
107
|
<div class="wo-tooltip-head">
|
|
99
|
-
${e.imageHref?`<img class="wo-tooltip-image" src="${
|
|
108
|
+
${e.imageHref?`<img class="wo-tooltip-image" src="${Pl(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${fe(e.typeLabel.slice(0,1))}</div>`}
|
|
100
109
|
<div class="wo-tooltip-heading">
|
|
101
|
-
<strong>${
|
|
102
|
-
<span>${
|
|
110
|
+
<strong>${fe(e.title)}</strong>
|
|
111
|
+
<span>${fe(e.typeLabel)}</span>
|
|
103
112
|
</div>
|
|
104
113
|
</div>
|
|
105
|
-
${e.description?`<p class="wo-tooltip-description">${
|
|
114
|
+
${e.description?`<p class="wo-tooltip-description">${fe(e.description)}</p>`:""}
|
|
106
115
|
${r}
|
|
107
116
|
${n}
|
|
108
|
-
${o.length?`<p class="wo-tooltip-relations">${
|
|
109
|
-
</article>`}function cs(e){let t=new Map;for(let n of ls){let o=e.object.properties[n];o!==void 0&&t.set(n,{key:n,label:ms(n),value:Fn(o)})}let r=e.object.placement;return r?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${r.target}`}):r?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${r.target}`}):r?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:r.distance?`Free ${Fn(r.distance)}`:`Free ${r.descriptor??"custom"}`}),[...t.values()]}function us(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function ds(e){let t=e.object.info.description?.trim();if(t)return t;let r=e.group?.label?.trim();return r&&r!==e.objectId?r:null}function Fn(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):fs(e)}function fs(e){return`${e.value}${e.unit??""}`}function ps(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ms(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function ce(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function hs(e){return ce(e)}var Ce={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Pn="worldorbit-viewer-tooltip-style";function he(e,t){if(ws(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let n={minScale:t.minScale??Ce.minScale,maxScale:t.maxScale??Ce.maxScale,fitPadding:t.fitPadding??Ce.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??Ce.panStep,zoomStep:t.zoomStep??Ce.zoomStep,rotationStep:t.rotationStep??Ce.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:K(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,c=e.style.position,d=bs(t),u=Ze(d,i),f={...me},w=null,g=null,I=null,x=null,y=!1,v=null,D=null,A=0,F=!1,B=new Map,L=null,E=null,V=null,W=null,O=null,z=null;a===null&&(e.tabIndex=0),xs(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let J=l=>{if(!o.pointer||F)return;l.preventDefault(),e.focus();let p=Gn(l.clientX,l.clientY),b=Qe(Math.exp(-l.deltaY*.002),.6,1.6);G(Le(u,f,b,p,n))},h=l=>{if(F)return;let p=l.pointerType==="touch";if(p&&!o.touch||!p&&!o.pointer||!p&&l.button!==0)return;e.focus(),e.setPointerCapture?.(l.pointerId);let b=rt(l.clientX,l.clientY);if(p){B.set(l.pointerId,b),B.size===2?L=zn(u,f,B):B.size===1&&(A=0,y=!1);return}v=l.pointerId,D=b,A=0,y=!1},j=l=>{if(F)return;if(l.pointerType==="touch"){if(!o.touch||!B.has(l.pointerId))return;let k=B.get(l.pointerId),Be=rt(l.clientX,l.clientY);if(B.set(l.pointerId,Be),B.size===2){L||(L=zn(u,f,B));let ie=_n(B),Oe=ie.distance/Math.max(L.startDistance,1),Ut=Le(u,L.startState,Oe,L.startCenter,n),qt=ie.center.x-L.startViewportCenter.x,Xt=ie.center.y-L.startViewportCenter.y;G(Ie(Ut,qt,Xt))}else if(B.size===1){let ie=Be.x-k.x,Oe=Be.y-k.y;A+=Math.abs(ie)+Math.abs(Oe),A>2&&(y=!0),G(Ie(f,ie,Oe))}return}if(!o.pointer||v!==l.pointerId||!D)return;let b=rt(l.clientX,l.clientY),P=b.x-D.x,T=b.y-D.y;A+=Math.abs(P)+Math.abs(T),D=b,A>2&&(y=!0),G(Ie(f,P,T))},N=l=>{if(l.pointerType==="touch"){B.delete(l.pointerId),B.size<2&&(L=null);return}v===l.pointerId&&(v=null,D=null)},be=l=>{if(!o.selection||F)return;if(y){y=!1;return}let p=Pt(l.target);ye(p),o.tooltipMode==="pinned"&&(V=p,oe())},Se=l=>{let p=Pt(l.target);Pe(p)},$=()=>{Pe(null)},Y=l=>{let p=Pt(l.target);p&&Pe(p)},C=()=>{Pe(null)},ke=l=>{if(!o.keyboard||F)return;let p=Pt(l.target);if((l.key==="Enter"||l.key===" ")&&p){l.preventDefault(),ye(p),o.tooltipMode==="pinned"&&(V=p,oe());return}switch(l.key){case"Escape":o.tooltipMode==="pinned"&&V&&(l.preventDefault(),V=null,oe());return;case"+":case"=":l.preventDefault(),M.zoomBy(o.zoomStep);return;case"-":l.preventDefault(),M.zoomBy(1/o.zoomStep);return;case"ArrowLeft":l.preventDefault(),M.panBy(-o.panStep,0);return;case"ArrowRight":l.preventDefault(),M.panBy(o.panStep,0);return;case"ArrowUp":l.preventDefault(),M.panBy(0,-o.panStep);return;case"ArrowDown":l.preventDefault(),M.panBy(0,o.panStep);return;case"[":l.preventDefault(),M.rotateBy(-o.rotationStep);return;case"]":l.preventDefault(),M.rotateBy(o.rotationStep);return;case"f":case"F":l.preventDefault(),M.fitToSystem();return;case"0":l.preventDefault(),M.resetView();return}};e.addEventListener("wheel",J,{passive:!1}),e.addEventListener("pointerdown",h),e.addEventListener("pointermove",j),e.addEventListener("pointerup",N),e.addEventListener("pointercancel",N),e.addEventListener("click",be),e.addEventListener("mouseover",Se),e.addEventListener("mouseleave",$),e.addEventListener("focusin",Y),e.addEventListener("focusout",C),e.addEventListener("keydown",ke);let M={setSource(l){d={kind:"source",value:l},u=Ze(d,i),z=null,ge(!0)},setDocument(l){d={kind:"document",value:l},u=Ze(d,i),z=null,ge(!0)},setScene(l){d={kind:"scene",value:l},u=l,z=null,ge(!0)},getScene(){return u},getRenderOptions(){return gs(i)},listViewpoints(){return u.viewpoints.slice()},getActiveViewpoint(){return _t(z)},goToViewpoint(l){let p=_t(l);if(!p)return!1;let b={},P=Mt(p);if(p.preset!==null&&(b.preset=p.preset),d.kind!=="scene"&&p.projection!==u.projection&&(b.projection=p.projection),P&&(b.layers=P),z=p.id,Object.keys(b).length>0){let k=Rn(b);i=Bn(i,b),d.kind!=="scene"&&k&&(u=Ze(d,i)),ge(k)}Wt(At(p),!1,!1);let T=Kn(p);return G(T),ye(p.selectedObjectId??p.objectId??null,!1),t.onSelectionChange?.(zt()),t.onSelectionDetailsChange?.(ue(f.selectedObjectId)),Yt(),Te(),!0},search(l,p=12){return kt(u,l,p)},getFilter(){return i.filter?{...i.filter}:null},setFilter(l){Wt(l,!0,!0)},getVisibleObjects(){return Nt()},getFocusPath(l){return Tr(l)},getObjectDetails(l){return ue(l)},getSelectionDetails(){return ue(f.selectedObjectId)},getTooltipDetails(){return O},getAtlasState(){return $n(f,i,i.filter??null,z)},setAtlasState(l){let p=typeof l=="string"?Ot(l):l;p.viewpointId&&M.goToViewpoint(p.viewpointId),M.setRenderOptions(p.renderOptions),Wt(p.filter??null,!1,!1),G(tt({...f,...p.viewerState})),ye(p.viewerState.selectedObjectId??null,!1),Yt(),t.onSelectionChange?.(zt()),t.onSelectionDetailsChange?.(ue(f.selectedObjectId)),Te()},serializeAtlasState(){return Tt(M.getAtlasState())},captureBookmark(l,p){return jn(l,p,M.getAtlasState())},applyBookmark(l){return typeof l=="string"?(M.setAtlasState(l),!0):(M.setAtlasState(l.atlasState),!0)},setRenderOptions(l){let p=Rn(l);i=Bn(i,l),d.kind!=="scene"&&p&&(u=Ze(d,i)),ge(p)},getState(){return{...f}},setState(l){G(tt({...f,...l}))},zoomBy(l,p){G(Le(u,f,l,p??{x:u.width/2,y:u.height/2},n))},panBy(l,p){G(Ie(f,l,p))},rotateBy(l){G(Dt(f,l))},fitToSystem(){G(ve(u,f,n))},focusObject(l){z=null,G(Lt(u,f,l,n)),ye(l),o.tooltipMode==="pinned"&&(V=_(l)?.objectId??null,oe())},pinTooltip(l){V=_(l)?.objectId??null,oe()},resetView(){let l=ve(u,{...me},n);z=null,G(l),ye(null),V=null,oe()},exportSvg(){return re(u,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){F||(F=!0,e.removeEventListener("wheel",J),e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",j),e.removeEventListener("pointerup",N),e.removeEventListener("pointercancel",N),e.removeEventListener("click",be),e.removeEventListener("mouseover",Se),e.removeEventListener("mouseleave",$),e.removeEventListener("focusin",Y),e.removeEventListener("focusout",C),e.removeEventListener("keydown",ke),x?.remove(),x=null,I?.remove(),I=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=s,e.style.position=c,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return ge(!0),t.initialViewpointId?M.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?M.focusObject(t.initialSelectionObjectId):Te(),M;function ge(l){if(e.innerHTML=re(u,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),g=e.querySelector("#worldorbit-camera-root"),I=null,x=null,o.minimap&&(I=document.createElement("div"),I.dataset.worldorbitMinimapRoot="true",e.append(I)),o.tooltipMode!=="disabled"&&(x=document.createElement("div"),x.className="wo-viewer-tooltip-root",x.dataset.worldorbitTooltip="true",x.hidden=!0,x.addEventListener("click",no),e.append(x)),!w||!g)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=l?ve(u,{...me},n):tt(f),ye(f.selectedObjectId&&_(f.selectedObjectId)?f.selectedObjectId:null,!1),Pe(E&&_(E)?E:null,!1),V=V&&_(V)?V:null,$r(),Jn(),Yt(),t.onViewChange?.({...f}),Te()}function G(l){f=tt(l),$r(),t.onViewChange?.({...f}),Te()}function tt(l){return{scale:Qe(l.scale,n.minScale,n.maxScale),rotationDeg:Nn(l.rotationDeg),translateX:Number.isFinite(l.translateX)?l.translateX:f.translateX,translateY:Number.isFinite(l.translateY)?l.translateY:f.translateY,selectedObjectId:l.selectedObjectId&&_(l.selectedObjectId)?l.selectedObjectId:null}}function $r(){g&&(g.setAttribute("transform",Vt(u,f)),Zn(),oe())}function ye(l,p=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${et(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:l&&_(l)?l:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${et(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),jr(),oe(),p&&(t.onSelectionChange?.(zt()),t.onSelectionDetailsChange?.(ue(f.selectedObjectId)),t.onViewChange?.({...f}),Te())}function Pe(l,p=!0){E===l&&p||(E=l&&_(l)?l:null,jr(),oe(),p&&(t.onHoverChange?.(_(E)),t.onHoverDetailsChange?.(ue(E))))}function zt(){return _(f.selectedObjectId)}function _(l){if(!l)return null;let p=kr();return u.objects.find(b=>b.objectId===l&&!b.hidden&&p.has(b.objectId))??null}function ue(l){let p=_(l);return p?{objectId:p.objectId,object:p.object,renderObject:p,label:u.labels.find(b=>b.objectId===p.objectId&&!b.hidden)??null,group:u.groups.find(b=>b.renderId===p.groupId)??null,orbit:u.orbitVisuals.find(b=>b.objectId===p.objectId&&!b.hidden)??null,relatedOrbits:u.orbitVisuals.filter(b=>!b.hidden&&(b.objectId===p.objectId||p.ancestorIds.includes(b.objectId)||p.childIds.includes(b.objectId))),parent:_(p.parentId),children:p.childIds.map(b=>_(b)).filter(Boolean),ancestors:p.ancestorIds.map(b=>_(b)).filter(Boolean),focusPath:Tr(p.objectId)}:null}function jr(){for(let l of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))l.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Sr(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Sr(E,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Sr(l,p){let b=ue(l);if(!b)return;let P=new Set([b.objectId,...b.renderObject.childIds,...b.renderObject.ancestorIds]);for(let T of P)for(let k of e.querySelectorAll(`[data-object-id="${et(T)}"]`))k.classList.add(p.objectClass);for(let T of b.ancestors)for(let k of e.querySelectorAll(`[data-object-id="${et(T.objectId)}"]`))k.classList.add(p.ancestorClass);for(let T of b.relatedOrbits)for(let k of e.querySelectorAll(`[data-orbit-object-id="${et(T.objectId)}"]`))k.classList.add(p.orbitClass)}function rt(l,p){if(!w)return{x:u.width/2,y:u.height/2};let b=w.getBoundingClientRect();return!b.width||!b.height?{x:u.width/2,y:u.height/2}:{x:(l-b.left)/b.width*u.width,y:(p-b.top)/b.height*u.height}}function Gn(l,p){return Ve(u,f,rt(l,p))}function kr(){return St(u,i.filter??null)}function Nt(){let l=kr();return u.objects.filter(p=>!p.hidden&&l.has(p.objectId))}function Tr(l){let p=u.objects.find(b=>b.objectId===l&&!b.hidden);return p?[...p.ancestorIds,p.objectId].map(b=>_(b)).filter(Boolean):[]}function _t(l){return u.viewpoints.find(p=>p.id===l)??null}function Kn(l){let p=Nn(l.rotationDeg),b=l.scale!==null&&l.scale!==void 0?Qe(l.scale,n.minScale,n.maxScale):null,P=l.objectId&&u.objects.find(k=>k.objectId===l.objectId&&!k.hidden);if(P)return Or({x:P.x,y:P.y},b??Math.max(1.8,me.scale),p,l.selectedObjectId??P.objectId);let T=ve(u,{...me,rotationDeg:p},n);return b===null?{...T,rotationDeg:p,selectedObjectId:l.selectedObjectId??null}:Or({x:u.contentBounds.centerX,y:u.contentBounds.centerY},b,p,l.selectedObjectId??null)}function Or(l,p,b,P){let T={x:u.width/2,y:u.height/2},k=ae(l,T,b);return{scale:p,rotationDeg:b,translateX:T.x-(T.x+(k.x-T.x)*p),translateY:T.y-(T.y+(k.y-T.y)*p),selectedObjectId:P}}function Wt(l,p,b){i={...i,filter:K(l)},b&&(z=null),ge(!1)}function Jn(){t.onFilterChange?.(i.filter??null,Nt())}function Yt(){t.onViewpointChange?.(_t(z))}function Te(){t.onAtlasStateChange?.(M.getAtlasState())}function Zn(){!o.minimap||!I||(I.innerHTML=Vn(u,f,Nt()))}function oe(){if(o.tooltipMode==="disabled"||!x){nt(null);return}let l=Qn();if(!l){x.hidden=!0,x.innerHTML="",x.removeAttribute("data-mode"),nt(null);return}let p=ue(l.objectId);if(!p){x.hidden=!0,x.innerHTML="",x.removeAttribute("data-mode"),nt(null);return}let b=En(p);W=l.objectId,x.hidden=!1,x.dataset.mode=l.mode,x.classList.toggle("is-pinned",l.mode==="pinned"),x.style.pointerEvents="auto",x.style.visibility="hidden",eo(x,b,l.mode),to(x,p.renderObject),x.style.visibility="visible",nt(b)}function Qn(){return V&&_(V)?{objectId:V,mode:"pinned"}:E&&_(E)?{objectId:E,mode:"hover"}:null}function eo(l,p,b){let P=t.tooltipRenderer?.(p,b);l.innerHTML="",typeof P=="string"?l.innerHTML=P:P instanceof HTMLElement?l.append(P):l.innerHTML=Cn(p,b);let T=document.createElement("div");if(T.className="wo-tooltip-actions",b==="pinned"){let k=document.createElement("button");k.type="button",k.className="wo-tooltip-action",k.dataset.tooltipAction="unpin",k.textContent="Unpin",T.append(k)}else{let k=document.createElement("button");k.type="button",k.className="wo-tooltip-action",k.dataset.tooltipAction="pin",k.dataset.objectId=p.objectId,k.textContent="Pin",T.append(k)}T.childElementCount>0&&l.append(T)}function to(l,p){if(!w)return;let b={x:p.anchorX??p.x,y:p.anchorY??p.y-Math.max(p.visualRadius,p.radius)},P=ro(b),T=w.getBoundingClientRect(),k=e.getBoundingClientRect(),Be=T.left-k.left+P.x/Math.max(u.width,1)*T.width,ie=T.top-k.top+P.y/Math.max(u.height,1)*T.height,Oe=Math.max(e.clientWidth-l.offsetWidth-12,12),Ut=Math.max(e.clientHeight-l.offsetHeight-12,12),qt=ie>e.clientHeight*.48,Xt=Qe(Be+18,12,Oe),oo=Qe(qt?ie-l.offsetHeight-18:ie+18,12,Ut);l.style.left=`${Xt}px`,l.style.top=`${oo}px`}function ro(l){let p={x:u.width/2,y:u.height/2},b=ae(l,p,f.rotationDeg);return{x:p.x+(b.x-p.x)*f.scale+f.translateX,y:p.y+(b.y-p.y)*f.scale+f.translateY}}function no(l){let p=l.target?.closest("[data-tooltip-action]");if(p){switch(l.preventDefault(),l.stopPropagation(),p.dataset.tooltipAction){case"pin":V=p.dataset.objectId??W;break;case"unpin":V=null;break}oe()}}function nt(l){let p=O?.objectId!==l?.objectId||O?.description!==l?.description||O?.imageHref!==l?.imageHref;O=l,W=l?.objectId??null,p&&t.onTooltipChange?.(l)}}function bs(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 Ze(e,t){switch(e.kind){case"scene":return e.value;case"document":return H(e.value,t);case"source":{let r=se(e.value);return H(r.document,ys(r,t))}}}function gs(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme}}function Bn(e,t){return{...e,...t,filter:t.filter!==void 0?K(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 Rn(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0}function ys(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function zn(e,t,r){let{center:n,distance:o}=_n(r);return{startState:{...t},startCenter:Ve(e,t,n),startViewportCenter:n,startDistance:o}}function _n(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[r,n]=t;return{center:{x:(r.x+n.x)/2,y:(r.y+n.y)/2},distance:Math.hypot(n.x-r.x,n.y-r.y)}}function Pt(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function ws(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 Qe(e,t,r){return Math.min(Math.max(e,t),r)}function Nn(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function et(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function xs(){if(typeof document>"u"||document.getElementById(Pn))return;let e=document.createElement("style");e.id=Pn,e.textContent=`
|
|
117
|
+
${o.length?`<p class="wo-tooltip-relations">${fe(o.join(" - "))}</p>`:""}
|
|
118
|
+
</article>`}function Al(e){let t=new Map;for(let n of Ol){let o=e.object.properties[n];o!==void 0&&t.set(n,{key:n,label:Fl(n),value:ho(o)})}let r=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),r?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${r.target}`}):r?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${r.target}`}):r?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:r.distance?`Free ${ho(r.distance)}`:`Free ${r.descriptor??"custom"}`}),[...t.values()]}function Tl(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Ml(e){let t=e.object.info.description?.trim();if(t)return t;let r=e.group?.label?.trim();return r&&r!==e.objectId?r:null}function ho(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):Ll(e)}function Ll(e){return`${e.value}${e.unit??""}`}function Dl(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Fl(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function fe(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Pl(e){return fe(e)}var We={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},yo="worldorbit-viewer-tooltip-style";function xe(e,t){if(Rl(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let n={minScale:t.minScale??We.minScale,maxScale:t.maxScale??We.maxScale,fitPadding:t.fitPadding??We.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??We.panStep,zoomStep:t.zoomStep??We.zoomStep,rotationStep:t.rotationStep??We.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:ee(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,l=e.style.position,d=Vl(t),c=ft(d,i),f={...Ie},w=null,b=null,I=null,v=null,T=!1,y=null,$=null,x=0,_=!1,P=new Map,j=null,V=null,A=null,W=null,R=null,Y=null;a===null&&(e.tabIndex=0),Bl(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let X=u=>{if(!o.pointer||_)return;u.preventDefault(),e.focus();let p=Mo(u.clientX,u.clientY),h=pt(Math.exp(-u.deltaY*.002),.6,1.6);B(_e(c,f,h,p,n))},E=u=>{if(_)return;let p=u.pointerType==="touch";if(p&&!o.touch||!p&&!o.pointer||!p&&u.button!==0)return;e.focus(),e.setPointerCapture?.(u.pointerId);let h=gt(u.clientX,u.clientY);if(p){P.set(u.pointerId,h),P.size===2?j=$o(c,f,P):P.size===1&&(x=0,T=!1);return}y=u.pointerId,$=h,x=0,T=!1},ye=u=>{if(_)return;if(u.pointerType==="touch"){if(!o.touch||!P.has(u.pointerId))return;let L=P.get(u.pointerId),He=gt(u.clientX,u.clientY);if(P.set(u.pointerId,He),P.size===2){j||(j=$o(c,f,P));let ce=xo(P),Pe=ce.distance/Math.max(j.startDistance,1),lr=_e(c,j.startState,Pe,j.startCenter,n),cr=ce.center.x-j.startViewportCenter.x,ur=ce.center.y-j.startViewportCenter.y;B(Me(lr,cr,ur))}else if(P.size===1){let ce=He.x-L.x,Pe=He.y-L.y;x+=Math.abs(ce)+Math.abs(Pe),x>2&&(T=!0),B(Me(f,ce,Pe))}return}if(!o.pointer||y!==u.pointerId||!$)return;let h=gt(u.clientX,u.clientY),C=h.x-$.x,F=h.y-$.y;x+=Math.abs(C)+Math.abs(F),$=h,x>2&&(T=!0),B(Me(f,C,F))},re=u=>{if(u.pointerType==="touch"){P.delete(u.pointerId),P.size<2&&(j=null);return}y===u.pointerId&&(y=null,$=null)},g=u=>{if(!o.selection||_)return;if(T){T=!1;return}let p=er(u.target);Se(p),o.tooltipMode==="pinned"&&(A=p,le())},O=u=>{let p=er(u.target);Ye(p)},q=()=>{Ye(null)},ke=u=>{let p=er(u.target);p&&Ye(p)},k=()=>{Ye(null)},K=u=>{if(!o.keyboard||_)return;let p=er(u.target);if((u.key==="Enter"||u.key===" ")&&p){u.preventDefault(),Se(p),o.tooltipMode==="pinned"&&(A=p,le());return}switch(u.key){case"Escape":o.tooltipMode==="pinned"&&A&&(u.preventDefault(),A=null,le());return;case"+":case"=":u.preventDefault(),S.zoomBy(o.zoomStep);return;case"-":u.preventDefault(),S.zoomBy(1/o.zoomStep);return;case"ArrowLeft":u.preventDefault(),S.panBy(-o.panStep,0);return;case"ArrowRight":u.preventDefault(),S.panBy(o.panStep,0);return;case"ArrowUp":u.preventDefault(),S.panBy(0,-o.panStep);return;case"ArrowDown":u.preventDefault(),S.panBy(0,o.panStep);return;case"[":u.preventDefault(),S.rotateBy(-o.rotationStep);return;case"]":u.preventDefault(),S.rotateBy(o.rotationStep);return;case"f":case"F":u.preventDefault(),S.fitToSystem();return;case"0":u.preventDefault(),S.resetView();return}};e.addEventListener("wheel",X,{passive:!1}),e.addEventListener("pointerdown",E),e.addEventListener("pointermove",ye),e.addEventListener("pointerup",re),e.addEventListener("pointercancel",re),e.addEventListener("click",g),e.addEventListener("mouseover",O),e.addEventListener("mouseleave",q),e.addEventListener("focusin",ke),e.addEventListener("focusout",k),e.addEventListener("keydown",K);let S={setSource(u){d={kind:"source",value:u},c=ft(d,i),Y=null,ne(!0)},setDocument(u){d={kind:"document",value:u},c=ft(d,i),Y=null,ne(!0)},setScene(u){d={kind:"scene",value:u},c=u,Y=null,ne(!0)},getScene(){return c},getRenderOptions(){return El(i)},listViewpoints(){return c.viewpoints.slice()},getActiveViewpoint(){return ir(Y)},goToViewpoint(u){let p=ir(u);if(!p)return!1;let h={},C=Ht(p);if(p.preset!==null&&(h.preset=p.preset),d.kind!=="scene"&&p.projection!==c.projection&&(h.projection=p.projection),C&&(h.layers=C),Y=p.id,Object.keys(h).length>0){let L=vo(h);i=wo(i,h),d.kind!=="scene"&&L&&(c=ft(d,i)),ne(L)}ar(qt(p),!1,!1);let F=Lo(p);return B(F),Se(p.selectedObjectId??p.objectId??null,!1),t.onSelectionChange?.(nr()),t.onSelectionDetailsChange?.(we(f.selectedObjectId)),sr(),Fe(),!0},search(u,p=12){return Ut(c,u,p)},getFilter(){return i.filter?{...i.filter}:null},setFilter(u){ar(u,!0,!0)},getVisibleObjects(){return or()},getFocusPath(u){return Ur(u)},getObjectDetails(u){return we(u)},getSelectionDetails(){return we(f.selectedObjectId)},getTooltipDetails(){return R},getAtlasState(){return no(f,i,i.filter??null,Y)},setAtlasState(u){let p=typeof u=="string"?Yt(u):u;p.viewpointId&&S.goToViewpoint(p.viewpointId),S.setRenderOptions(p.renderOptions),ar(p.filter??null,!1,!1),B(ht({...f,...p.viewerState})),Se(p.viewerState.selectedObjectId??null,!1),sr(),t.onSelectionChange?.(nr()),t.onSelectionDetailsChange?.(we(f.selectedObjectId)),Fe()},serializeAtlasState(){return Wt(S.getAtlasState())},captureBookmark(u,p){return oo(u,p,S.getAtlasState())},applyBookmark(u){return typeof u=="string"?(S.setAtlasState(u),!0):(S.setAtlasState(u.atlasState),!0)},setRenderOptions(u){let p=vo(u);i=wo(i,u),d.kind!=="scene"&&p&&(c=ft(d,i)),ne(p)},getState(){return{...f}},setState(u){B(ht({...f,...u}))},zoomBy(u,p){B(_e(c,f,u,p??{x:c.width/2,y:c.height/2},n))},panBy(u,p){B(Me(f,u,p))},rotateBy(u){B(Gt(f,u))},fitToSystem(){B(Le(c,f,n))},focusObject(u){Y=null,B(Xt(c,f,u,n)),Se(u),o.tooltipMode==="pinned"&&(A=H(u)?.objectId??null,le())},pinTooltip(u){A=H(u)?.objectId??null,le()},resetView(){let u=Le(c,{...Ie},n);Y=null,B(u),Se(null),A=null,le()},exportSvg(){return ae(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){_||(_=!0,e.removeEventListener("wheel",X),e.removeEventListener("pointerdown",E),e.removeEventListener("pointermove",ye),e.removeEventListener("pointerup",re),e.removeEventListener("pointercancel",re),e.removeEventListener("click",g),e.removeEventListener("mouseover",O),e.removeEventListener("mouseleave",q),e.removeEventListener("focusin",ke),e.removeEventListener("focusout",k),e.removeEventListener("keydown",K),v?.remove(),v=null,I?.remove(),I=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 ne(!0),t.initialViewpointId?S.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?S.focusObject(t.initialSelectionObjectId):Fe(),S;function ne(u){if(e.innerHTML=ae(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),b=e.querySelector("#worldorbit-camera-root"),I=null,v=null,o.minimap&&(I=document.createElement("div"),I.dataset.worldorbitMinimapRoot="true",e.append(I)),o.tooltipMode!=="disabled"&&(v=document.createElement("div"),v.className="wo-viewer-tooltip-root",v.dataset.worldorbitTooltip="true",v.hidden=!0,v.addEventListener("click",Ro),e.append(v)),!w||!b)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=u?Le(c,{...Ie},n):ht(f),Se(f.selectedObjectId&&H(f.selectedObjectId)?f.selectedObjectId:null,!1),Ye(V&&H(V)?V:null,!1),A=A&&H(A)?A:null,Br(),Do(),sr(),t.onViewChange?.({...f}),Fe()}function B(u){f=ht(u),Br(),t.onViewChange?.({...f}),Fe()}function ht(u){return{scale:pt(u.scale,n.minScale,n.maxScale),rotationDeg:Io(u.rotationDeg),translateX:Number.isFinite(u.translateX)?u.translateX:f.translateX,translateY:Number.isFinite(u.translateY)?u.translateY:f.translateY,selectedObjectId:u.selectedObjectId&&H(u.selectedObjectId)?u.selectedObjectId:null}}function Br(){b&&(b.setAttribute("transform",Kt(c,f)),Fo(),le())}function Se(u,p=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${mt(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:u&&H(u)?u:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${mt(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),_r(),le(),p&&(t.onSelectionChange?.(nr()),t.onSelectionDetailsChange?.(we(f.selectedObjectId)),t.onViewChange?.({...f}),Fe())}function Ye(u,p=!0){V===u&&p||(V=u&&H(u)?u:null,_r(),le(),p&&(t.onHoverChange?.(H(V)),t.onHoverDetailsChange?.(we(V))))}function nr(){return H(f.selectedObjectId)}function H(u){if(!u)return null;let p=Nr();return c.objects.find(h=>h.objectId===u&&!h.hidden&&p.has(h.objectId))??null}function we(u){let p=H(u);return p?{objectId:p.objectId,object:p.object,renderObject:p,label:c.labels.find(h=>h.objectId===p.objectId&&!h.hidden)??null,group:c.groups.find(h=>h.renderId===p.groupId)??null,semanticGroups:c.semanticGroups.filter(h=>p.semanticGroupIds.includes(h.id)),orbit:c.orbitVisuals.find(h=>h.objectId===p.objectId&&!h.hidden)??null,relatedOrbits:c.orbitVisuals.filter(h=>!h.hidden&&(h.objectId===p.objectId||p.ancestorIds.includes(h.objectId)||p.childIds.includes(h.objectId))),relations:c.relations.filter(h=>!h.hidden&&(h.fromObjectId===p.objectId||h.toObjectId===p.objectId)),parent:H(p.parentId),children:p.childIds.map(h=>H(h)).filter(Boolean),ancestors:p.ancestorIds.map(h=>H(h)).filter(Boolean),focusPath:Ur(p.objectId)}:null}function _r(){for(let u of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))u.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");zr(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),zr(V,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function zr(u,p){let h=we(u);if(!h)return;let C=new Set([h.objectId,...h.renderObject.childIds,...h.renderObject.ancestorIds]);for(let F of C)for(let L of e.querySelectorAll(`[data-object-id="${mt(F)}"]`))L.classList.add(p.objectClass);for(let F of h.ancestors)for(let L of e.querySelectorAll(`[data-object-id="${mt(F.objectId)}"]`))L.classList.add(p.ancestorClass);for(let F of h.relatedOrbits)for(let L of e.querySelectorAll(`[data-orbit-object-id="${mt(F.objectId)}"]`))L.classList.add(p.orbitClass)}function gt(u,p){if(!w)return{x:c.width/2,y:c.height/2};let h=w.getBoundingClientRect();return!h.width||!h.height?{x:c.width/2,y:c.height/2}:{x:(u-h.left)/h.width*c.width,y:(p-h.top)/h.height*c.height}}function Mo(u,p){return ze(c,f,gt(u,p))}function Nr(){return Nt(c,i.filter??null)}function or(){let u=Nr();return c.objects.filter(p=>!p.hidden&&u.has(p.objectId))}function Ur(u){let p=c.objects.find(h=>h.objectId===u&&!h.hidden);return p?[...p.ancestorIds,p.objectId].map(h=>H(h)).filter(Boolean):[]}function ir(u){return c.viewpoints.find(p=>p.id===u)??null}function Lo(u){let p=Io(u.rotationDeg),h=u.scale!==null&&u.scale!==void 0?pt(u.scale,n.minScale,n.maxScale):null,C=u.objectId&&c.objects.find(L=>L.objectId===u.objectId&&!L.hidden);if(C)return Wr({x:C.x,y:C.y},h??Math.max(1.8,Ie.scale),p,u.selectedObjectId??C.objectId);let F=Le(c,{...Ie,rotationDeg:p},n);return h===null?{...F,rotationDeg:p,selectedObjectId:u.selectedObjectId??null}:Wr({x:c.contentBounds.centerX,y:c.contentBounds.centerY},h,p,u.selectedObjectId??null)}function Wr(u,p,h,C){let F={x:c.width/2,y:c.height/2},L=ue(u,F,h);return{scale:p,rotationDeg:h,translateX:F.x-(F.x+(L.x-F.x)*p),translateY:F.y-(F.y+(L.y-F.y)*p),selectedObjectId:C}}function ar(u,p,h){i={...i,filter:ee(u)},h&&(Y=null),ne(!1)}function Do(){t.onFilterChange?.(i.filter??null,or())}function sr(){t.onViewpointChange?.(ir(Y))}function Fe(){t.onAtlasStateChange?.(S.getAtlasState())}function Fo(){!o.minimap||!I||(I.innerHTML=mo(c,f,or()))}function le(){if(o.tooltipMode==="disabled"||!v){bt(null);return}let u=Po();if(!u){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),bt(null);return}let p=we(u.objectId);if(!p){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),bt(null);return}let h=go(p);W=u.objectId,v.hidden=!1,v.dataset.mode=u.mode,v.classList.toggle("is-pinned",u.mode==="pinned"),v.style.pointerEvents="auto",v.style.visibility="hidden",Vo(v,h,u.mode),Eo(v,p.renderObject),v.style.visibility="visible",bt(h)}function Po(){return A&&H(A)?{objectId:A,mode:"pinned"}:V&&H(V)?{objectId:V,mode:"hover"}:null}function Vo(u,p,h){let C=t.tooltipRenderer?.(p,h);u.innerHTML="",typeof C=="string"?u.innerHTML=C:C instanceof HTMLElement?u.append(C):u.innerHTML=bo(p,h);let F=document.createElement("div");if(F.className="wo-tooltip-actions",h==="pinned"){let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="unpin",L.textContent="Unpin",F.append(L)}else{let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="pin",L.dataset.objectId=p.objectId,L.textContent="Pin",F.append(L)}F.childElementCount>0&&u.append(F)}function Eo(u,p){if(!w)return;let h={x:p.anchorX??p.x,y:p.anchorY??p.y-Math.max(p.visualRadius,p.radius)},C=Co(h),F=w.getBoundingClientRect(),L=e.getBoundingClientRect(),He=F.left-L.left+C.x/Math.max(c.width,1)*F.width,ce=F.top-L.top+C.y/Math.max(c.height,1)*F.height,Pe=Math.max(e.clientWidth-u.offsetWidth-12,12),lr=Math.max(e.clientHeight-u.offsetHeight-12,12),cr=ce>e.clientHeight*.48,ur=pt(He+18,12,Pe),Bo=pt(cr?ce-u.offsetHeight-18:ce+18,12,lr);u.style.left=`${ur}px`,u.style.top=`${Bo}px`}function Co(u){let p={x:c.width/2,y:c.height/2},h=ue(u,p,f.rotationDeg);return{x:p.x+(h.x-p.x)*f.scale+f.translateX,y:p.y+(h.y-p.y)*f.scale+f.translateY}}function Ro(u){let p=u.target?.closest("[data-tooltip-action]");if(p){switch(u.preventDefault(),u.stopPropagation(),p.dataset.tooltipAction){case"pin":A=p.dataset.objectId??W;break;case"unpin":A=null;break}le()}}function bt(u){let p=R?.objectId!==u?.objectId||R?.description!==u?.description||R?.imageHref!==u?.imageHref;R=u,W=u?.objectId??null,p&&t.onTooltipChange?.(u)}}function Vl(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 ft(e,t){switch(e.kind){case"scene":return e.value;case"document":return J(e.value,t);case"source":{let r=de(e.value);return J(r.document,Cl(r,t))}}}function El(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme}}function wo(e,t){return{...e,...t,filter:t.filter!==void 0?ee(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 vo(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0}function Cl(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function $o(e,t,r){let{center:n,distance:o}=xo(r);return{startState:{...t},startCenter:ze(e,t,n),startViewportCenter:n,startDistance:o}}function xo(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[r,n]=t;return{center:{x:(r.x+n.x)/2,y:(r.y+n.y)/2},distance:Math.hypot(n.x-r.x,n.y-r.y)}}function er(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function Rl(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 pt(e,t,r){return Math.min(Math.max(e,t),r)}function Io(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function mt(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Bl(){if(typeof document>"u"||document.getElementById(yo))return;let e=document.createElement("style");e.id=yo,e.textContent=`
|
|
110
119
|
.wo-viewer-tooltip-root {
|
|
111
120
|
position: absolute;
|
|
112
121
|
z-index: 12;
|
|
@@ -172,7 +181,7 @@ var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDe
|
|
|
172
181
|
padding: 6px 12px;
|
|
173
182
|
font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
174
183
|
}
|
|
175
|
-
`,document.head.append(e)}var
|
|
184
|
+
`,document.head.append(e)}var _l="[data-worldorbit-embed]";function Cr(e){return encodeURIComponent(JSON.stringify(e))}function Rr(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 ko(e,t,r={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:r.initialViewpointId,initialSelectionObjectId:r.initialSelectionObjectId,initialFilter:r.initialFilter??null,atlasState:r.atlasState??null,minimap:r.minimap}}}function So(e,t={}){let r={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},n=ae(e.scene,{theme:r.options?.theme,layers:r.options?.layers,filter:r.options?.initialFilter??null,selectedObjectId:r.options?.initialSelectionObjectId??null,subtitle:r.options?.subtitle,preset:r.options?.preset});return`<div class="${tr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${tr(r.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${tr(r.options?.initialViewpointId??"")}" data-worldorbit-payload="${tr(Cr(r))}">${n}</div>`}function jo(e=document,t={}){let r=new Map,n=[...e.querySelectorAll(_l)];for(let o of n){let i=zl(o),a=t.mode??i.mode,s=t.theme??i.options?.theme,l=t.layers??i.options?.layers,d=t.subtitle??i.options?.subtitle,c=t.preset??i.options?.preset??i.scene.renderPreset??void 0,f=t.viewer?.initialFilter??i.options?.initialFilter??null,w=t.viewer?.initialViewpointId??i.options?.initialViewpointId,b=t.viewer?.initialSelectionObjectId??i.options?.initialSelectionObjectId,I=t.viewer?.minimap??i.options?.minimap;if(a==="interactive"){let v=xe(o,{...t.viewer,scene:i.scene,width:t.width??i.scene.width,height:t.height??i.scene.height,padding:t.padding??i.scene.padding,preset:c,theme:s,layers:l,subtitle:d,initialFilter:f,initialViewpointId:w,initialSelectionObjectId:b,minimap:I});i.options?.atlasState&&v.setAtlasState(i.options.atlasState),r.set(o,v),t.onMount?.(v,o)}else o.innerHTML=ae(i.scene,{width:t.width??i.scene.width,height:t.height??i.scene.height,padding:t.padding??i.scene.padding,preset:c,theme:s,layers:l,filter:f,selectedObjectId:b??null,subtitle:d}),t.onMount?.(null,o);o.dataset.worldorbitMounted="true"}return{viewers:[...r.values()],destroy(){for(let[o,i]of r.entries())i.destroy(),o.removeAttribute("data-worldorbit-mounted");r.clear()}}}function zl(e){let t=e.dataset.worldorbitPayload;if(!t)throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");return Rr(t)}function tr(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}var Oo="worldorbit-atlas-viewer-style";function rr(e,t){if(typeof document>"u")throw new Error("Atlas viewer requires a browser environment.");Ul();let r={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=Nl(r);let n=e.querySelector("[data-atlas-toolbar]"),o=e.querySelector("[data-atlas-search]"),i=e.querySelector("[data-atlas-type-filter]"),a=e.querySelector("[data-atlas-group-filter]"),s=e.querySelector("[data-atlas-viewpoint]"),l=e.querySelector("[data-atlas-bookmark]"),d=e.querySelector("[data-atlas-bookmarks]"),c=e.querySelector("[data-atlas-results]"),f=e.querySelector("[data-atlas-inspector]"),w=e.querySelector("[data-atlas-stage]");if(!w)throw new Error("Atlas viewer failed to initialize its stage container.");let b=ee(t.initialFilter??null),I=t.initialQuery?.trim()??b?.query??"",v=t.initialObjectType??(b?.objectTypes?.length===1?b.objectTypes[0]:null),T=b?.groupIds?.[0]??null,y=[],$;$=xe(w,{...t,initialFilter:null,onSelectionChange(g){$&&E(),t.onSelectionChange?.(g)},onSelectionDetailsChange(g){$&&E(),t.onSelectionDetailsChange?.(g)},onFilterChange(g,O){$&&(A(g),X(),E()),t.onFilterChange?.(g,O)},onViewpointChange(g){$&&(Y(),E()),t.onViewpointChange?.(g)},onAtlasStateChange(g){$&&E(),t.onAtlasStateChange?.(g)},onViewChange(g){$&&E(),t.onViewChange?.(g)}}),j(),W(),R(),A($.getFilter()),re(),X(),E(),o?.addEventListener("input",()=>{I=o.value.trim(),j()}),i?.addEventListener("change",()=>{v=i.value||null,j()}),a?.addEventListener("change",()=>{T=a.value||null,j()}),s?.addEventListener("change",()=>{let g=x();if(!s.value){g.resetView(),j();return}g.goToViewpoint(s.value),E()}),l?.addEventListener("click",()=>{let g=x(),O=g.getActiveViewpoint()?.label??g.getSelectionDetails()?.objectId??`Bookmark ${y.length+1}`;y=[...y,g.captureBookmark(O,O)],re(),E()}),d?.addEventListener("click",g=>{let O=g.target?.closest("[data-bookmark-id]");if(!O)return;let q=y.find(k=>k.id===O.dataset.bookmarkId);if(!q)return;let ke=x();ke.applyBookmark(q),A(ke.getFilter()),X(),E()}),c?.addEventListener("click",g=>{let O=g.target?.closest("[data-object-id]");O&&(x().focusObject(O.dataset.objectId??""),E())});function x(){if(!$)throw new Error("Atlas viewer is not initialized.");return $}return{element:e,get viewer(){return x()},getViewer(){return x()},setSource(g){x().setSource(g),P()},setDocument(g){x().setDocument(g),P()},setScene(g){x().setScene(g),P()},getAtlasState(){return x().getAtlasState()},setAtlasState(g){let O=x();O.setAtlasState(g),A(O.getFilter()),X(),E()},getInspectorSnapshot(){return ye()},getSearchQuery(){return I},setSearchQuery(g){I=g.trim(),o&&(o.value=I),j()},getObjectTypeFilter(){return v},setObjectTypeFilter(g){v=g,i&&(i.value=g??""),j()},listSearchResults(g=6){return x().search(I,g)},listBookmarks(){return y.map(Ao)},captureBookmark(g,O){let q=x().captureBookmark(g,O);return y=[...y,q],re(),E(),Ao(q)},applyBookmark(g){let O=x(),q=O.applyBookmark(g);return q&&(A(O.getFilter()),X(),E()),q},goToViewpoint(g){let O=x().goToViewpoint(g);return O&&E(),O},exportSvg(){return x().exportSvg()},destroy(){x().destroy(),e.innerHTML="",e.classList.remove("wo-atlas-viewer")}};function P(){W(),R(),j(),re(),X(),E()}function j(){x().setFilter(V()),W(),X(),E()}function V(){return ee({query:I||void 0,objectTypes:v?[v]:void 0,tags:b?.tags,groupIds:T?[T]:b?.groupIds,includeAncestors:b?.includeAncestors??!0})}function A(g){I=g?.query?.trim()??"",v=g?.objectTypes?.length===1?g.objectTypes[0]:null,T=g?.groupIds?.length===1?g.groupIds[0]:null,o&&document.activeElement!==o&&(o.value=I),i&&(i.value=v??""),a&&(a.value=T??"")}function W(){if(!s)return;let g=x(),O=g.getActiveViewpoint()?.id??"";s.innerHTML=['<option value="">Scene default</option>',...g.listViewpoints().map(q=>`<option value="${be(q.id)}">${be(q.label)}</option>`)].join(""),s.value=O}function R(){if(!a)return;let g=x();a.innerHTML=['<option value="">All groups</option>',...g.getScene().semanticGroups.map(O=>`<option value="${be(O.id)}">${be(O.label)}</option>`)].join(""),a.value=T??""}function Y(){s&&(s.value=x().getActiveViewpoint()?.id??"")}function X(){if(!c)return;let g=x().search(I,6);c.innerHTML=g.map(O=>`<button type="button" class="wo-atlas-pill" data-object-id="${be(O.objectId)}">${be(O.objectId)} - ${be(O.type)}</button>`).join("")}function E(){let g=ye();f&&(f.textContent=JSON.stringify(g,null,2)),t.onInspectorChange?.(g)}function ye(){let g=x();return{selection:g.getSelectionDetails(),activeViewpoint:g.getActiveViewpoint(),filter:g.getFilter(),atlasState:g.getAtlasState(),visibleObjectIds:g.getVisibleObjects().map(O=>O.objectId),scene:{title:g.getScene().title,projection:g.getScene().projection,renderPreset:g.getScene().renderPreset,groupCount:g.getScene().groups.length,semanticGroupCount:g.getScene().semanticGroups.length,relationCount:g.getScene().relations.length,viewpointCount:g.getScene().viewpoints.length}}}function re(){d&&(d.innerHTML=y.map(g=>`<button type="button" class="wo-atlas-pill" data-bookmark-id="${be(g.id)}">${be(g.label)}</button>`).join(""))}}function Nl(e){let t=[e.search?`<label class="wo-atlas-field">
|
|
176
185
|
<span>Search</span>
|
|
177
186
|
<input data-atlas-search type="text" placeholder="Search objects, tags, or types" />
|
|
178
187
|
</label>`:"",e.typeFilter?`<label class="wo-atlas-field">
|
|
@@ -189,6 +198,11 @@ var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDe
|
|
|
189
198
|
<option value="structure">Structure</option>
|
|
190
199
|
<option value="phenomenon">Phenomenon</option>
|
|
191
200
|
</select>
|
|
201
|
+
</label>`:"",e.groupFilter?`<label class="wo-atlas-field">
|
|
202
|
+
<span>Group</span>
|
|
203
|
+
<select data-atlas-group-filter>
|
|
204
|
+
<option value="">All groups</option>
|
|
205
|
+
</select>
|
|
192
206
|
</label>`:"",e.viewpointSelect?`<label class="wo-atlas-field">
|
|
193
207
|
<span>Viewpoint</span>
|
|
194
208
|
<select data-atlas-viewpoint>
|
|
@@ -204,7 +218,7 @@ var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDe
|
|
|
204
218
|
<div class="wo-atlas-results" data-atlas-results></div>
|
|
205
219
|
${e.bookmarks?'<div class="wo-atlas-bookmarks" data-atlas-bookmarks></div>':""}
|
|
206
220
|
</div>
|
|
207
|
-
</section>`}function
|
|
221
|
+
</section>`}function Ul(){if(document.getElementById(Oo))return;let e=document.createElement("style");e.id=Oo,e.textContent=`
|
|
208
222
|
.wo-atlas-shell { display: grid; gap: 16px; min-width: 0; }
|
|
209
223
|
.wo-atlas-toolbar { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; }
|
|
210
224
|
.wo-atlas-workspace { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); }
|
|
@@ -238,4 +252,4 @@ var WorldOrbit=(()=>{var Ht=Object.defineProperty;var io=Object.getOwnPropertyDe
|
|
|
238
252
|
.wo-atlas-workspace { grid-template-columns: 1fr; }
|
|
239
253
|
.wo-atlas-inspector { min-height: 220px; }
|
|
240
254
|
}
|
|
241
|
-
`,document.head.append(e)}function
|
|
255
|
+
`,document.head.append(e)}function Ao(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 be(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 n=this.getAttribute("source")??this.textContent??"",o=this.getAttribute("mode")??"interactive";if(!n.trim()){this.innerHTML="";return}let i=Wl(n),a=J(i),s=this.getAttribute("theme")??void 0;if(o==="static"){this.innerHTML=ae(a,{theme:s});return}if(o==="atlas"){this.viewer=rr(this,{scene:a,theme:s});return}this.viewer=xe(this,{scene:a,theme:s})}}customElements.define(e,t)}function Wl(e){return de(e).document}return Yo(Yl);})();
|