worldorbit 2.5.10 → 2.5.12
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var WorldOrbitViewer=(()=>{var Ct=Object.defineProperty;var bn=Object.getOwnPropertyDescriptor;var gn=Object.getOwnPropertyNames;var yn=Object.prototype.hasOwnProperty;var wn=(e,t)=>{for(var r in t)Ct(e,r,{get:t[r],enumerable:!0})},xn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gn(t))!yn.call(e,o)&&o!==r&&Ct(e,o,{get:()=>t[o],enumerable:!(n=bn(t,o))||n.enumerable});return e};var In=e=>xn(Ct({},"__esModule",{value:!0}),e);var wa={};wn(wa,{DEFAULT_VIEWER_STATE:()=>ue,WORLD_LAYER_ID:()=>jt,clampScale:()=>_e,composeViewerTransform:()=>It,createAtlasViewer:()=>Tt,createEmbedPayload:()=>Jr,createInteractiveViewer:()=>de,createWorldOrbitEmbedMarkup:()=>Zr,defineWorldOrbitViewerElement:()=>rn,deserializeViewerAtlasState:()=>tt,deserializeWorldOrbitEmbedPayload:()=>Ht,fitViewerState:()=>be,focusViewerState:()=>xt,getSceneCenter:()=>ge,getThemePreset:()=>tr,getViewerVisibleBounds:()=>vt,invertViewerPoint:()=>ke,mountWorldOrbitEmbeds:()=>Qr,normalizeRotation:()=>Wt,normalizeViewerFilter:()=>q,panViewerState:()=>je,renderDocumentToSvg:()=>qt,renderSceneToSvg:()=>K,renderSourceToSvg:()=>Pr,resolveLayers:()=>Je,resolveTheme:()=>Ke,rotateViewerState:()=>wt,sceneViewpointToLayerOptions:()=>rt,searchSceneObjects:()=>Qe,serializeViewerAtlasState:()=>et,serializeWorldOrbitEmbedPayload:()=>Xt,viewpointToViewerFilter:()=>nt,zoomViewerStateAt:()=>Se});var vn={background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Le={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 Ke(e){return e?typeof e=="string"?Le[e]??Le.atlas:{...Le.atlas,...e}:Le.atlas}function Je(e){return{...vn,...e}}function tr(e){return Le[e]}function q(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Pt(e.objectTypes??[]),tags:Pt((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:Pt((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return $n(t)?t:null}function $n(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Ze(e,t){let r=q(t),n=new Set;for(let o of e.objects)if(!o.hidden&&jn(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 Qe(e,t,r=12){let n=t.trim().toLowerCase();return n?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Sn(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=>rr(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,r).map(o=>rr(o,1))}function nr(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:q(r)}}function et(e){return encodeURIComponent(JSON.stringify(e))}function tt(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:q(t.filter??null)}}function or(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 rt(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 nt(e){return e?.filter?q({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function rr(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 jn(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=ir(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function Sn(e,t){let r=e.objectId.toLowerCase(),n=e.label.toLowerCase(),o=ir(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(u=>o.includes(u))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(u=>typeof u=="string"):[]).some(u=>u.toLowerCase()===t)&&(i+=18),i}function ir(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 Pt(e){return[...new Set(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 Ve=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],G=Ve.filter(e=>e!=="system"),kn=["star","planet","moon","asteroid","comet","structure","phenomenon"],ar=["structure","phenomenon"],ie=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Tn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function k(e,t){return{key:e,...t}}var ot=new Set(Ve),sr=new Map([k("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:ie}),k("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:ie,unitFamily:"distance"}),k("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:ie,unitFamily:"distance"}),k("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:ie}),k("period",{kind:"unit",placement:!0,arity:"single",objectTypes:ie,unitFamily:"duration"}),k("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:ie,unitFamily:"angle"}),k("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:ie,unitFamily:"angle"}),k("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:ie,unitFamily:"angle"}),k("at",{kind:"string",placement:!0,arity:"single",objectTypes:ar}),k("surface",{kind:"string",placement:!0,arity:"single",objectTypes:ar}),k("free",{kind:"string",placement:!0,arity:"single",objectTypes:Tn}),k("kind",{kind:"string",placement:!1,arity:"single",objectTypes:G}),k("class",{kind:"string",placement:!1,arity:"single",objectTypes:G}),k("culture",{kind:"string",placement:!1,arity:"single",objectTypes:G}),k("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Ve}),k("color",{kind:"string",placement:!1,arity:"single",objectTypes:Ve}),k("image",{kind:"string",placement:!1,arity:"single",objectTypes:kn}),k("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Ve}),k("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"radius"}),k("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"mass"}),k("density",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"generic"}),k("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"generic"}),k("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"generic"}),k("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:G}),k("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),k("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),k("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),k("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),k("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),k("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),k("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),k("on",{kind:"string",placement:!1,arity:"single",objectTypes:G}),k("source",{kind:"string",placement:!1,arity:"single",objectTypes:G}),k("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"duration"})].map(e=>[e.key,e])),On=new Set(sr.keys());function Q(e){return sr.get(e)}function it(e){return On.has(e)}function lr(e,t){return e.objectTypes.includes(t)}function cr(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 Fe(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,a=!1,s=!1,u=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],b=n+c+1;if(s&&f==="\\"){let w=e[c+1];if(w==='"'||w==="\\"){o+=w,c++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=b),a=!0,u=b,s=!0);continue}if(!s&&/\s/.test(f)){d();continue}i===null&&(i=b),o+=f}if(s)throw new m("Unclosed quote in line",t.line,u??n+e.length);return d(),r}function at(e){return e.match(/^\s*/)?.[0].length??0}function Ee(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],u=a+1;if(!s.trim())continue;let d=at(s),c=Fe(s.slice(d),{line:u,columnOffset:d});if(c.length!==0){if(d===0){o=!1,i=null;let f=Mn(c,u);r.push(f),n=f;continue}if(!n)throw new m("Indented line without parent object",u,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(Ln(c,u)):n.blockFields.push(Dn(c,u))}}return{type:"document",objects:r}}function Mn(e,t){if(e.length<2)throw new m("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!ot.has(r.value))throw new m(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:An(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function An(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=Q(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&&!it(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 Dn(e,t){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);if(!Q(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 Ln(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 ur=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Vn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Fn=/^[A-Za-z][A-Za-z0-9+.-]*:/;function he(e){let t=null,r=[];for(let n of e.objects){let o=En(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 En(e){let t=[...e.inlineFields,...e.blockFields];Cn(e.objectType,t);let r=Pn(t),n=Bn(e.objectType,r),o=Rn(r),i=_n(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 Cn(e,t){for(let r of t){let n=Q(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!lr(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 Pn(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 Bn(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:st(t,"orbit"),distance:ve(t,"distance"),semiMajor:ve(t,"semiMajor"),eccentricity:Un(t,"eccentricity"),period:ve(t,"period"),angle:ve(t,"angle"),inclination:ve(t,"inclination"),phase:ve(t,"phase")};if(n){let s=lt(t,"at"),u=st(t,"at");return{mode:"at",target:u,reference:Wn(u,s.location)}}if(o)return{mode:"surface",target:st(t,"surface")};if(i){let s=st(t,"free"),u=Yn(s);return{mode:"free",distance:u??void 0,descriptor:u?void 0:s}}return null}function Rn(e){let t={};for(let[r,n]of e.entries()){let o=Q(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=qn(n);break;case"number":t[r]=fr($e(n),r,n.location);break;case"unit":t[r]=dr($e(n),n.location,r);break;case"string":t[r]=zn(r,n);break}}return t}function zn(e,t){let r=t.values.join(" ").trim();return e==="image"&&Nn(r,t.location),r}function Nn(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(Fn);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 _n(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 Wn(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 dr(e,t,r){let n=e.match(ur);if(!n)throw m.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=Q(r);if(i?.unitFamily&&!cr(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function Yn(e){let t=e.match(ur);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ve(e,t){if(!e.has(t))return;let r=lt(e,t);return dr($e(r),r.location,t)}function Un(e,t){if(!e.has(t))return;let r=lt(e,t);return fr($e(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 qn(e){let t=$e(e).toLowerCase(),r=Vn.get(t);if(r===void 0)throw m.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function lt(e,t){let r=e.get(t);if(!r)throw new m(`Missing value for key "${t}"`);return r}function st(e,t){return $e(lt(e,t))}function $e(e){if(e.values.length!==1)throw m.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Xn=new Set(["star","planet","moon","asteroid","comet"]);function ae(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||!Xn.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"&&Hn(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&Gn(n,n.placement.reference,t))}}function Hn(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 Gn(e,t,r){if(!r.has(t.objectId))throw new m(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function se(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)}}var Ce=1495978707e-1,Kn=6371,Jn=71492,Zn=695700,Qn=63241.077,eo=206264.806,to=206264806,yr=.68,ro=.2,wr=28;function ee(e,t={}){let r=oo(t),n=r.width,o=r.height,i=r.padding,a=no(e),s=ao(e,t.projection),u=so(a,t.scaleModel),d=co(a),c=e.system?.id??null,f=new Map(e.objects.map($=>[$.id,$])),b=zo(e.objects,f),w=new Map,I=[],x=[],y=[],v=[],A=[],C=new Map,P=new Map;for(let $ of e.objects){let Y=$.placement;if(!Y){y.push($);continue}if(Y.mode==="orbit"){hr(P,Y.target,$);continue}if(Y.mode==="surface"){hr(C,Y.target,$);continue}if(Y.mode==="at"){A.push($);continue}v.push($)}let L=v.length>0?n*.42:n/2,B=o/2,D={orbitChildren:P,surfaceChildren:C,objectMap:f,spacingFactor:d,projection:s,scaleModel:u},V=y.find($=>$.type==="star")??y[0]??null;V&&Bt(V,L,B,0,w,I,x,D);let W=y.filter($=>$.id!==V?.id);if(W.length>0){let $=Math.min(n,o)*.28*d*u.orbitDistanceMultiplier;W.forEach((Y,F)=>{let xe=Re(F,W.length,-Math.PI/2),M=ze(xe,$,s,1);Bt(Y,L+M.x,B+M.y,0,w,I,x,D)})}v.forEach(($,Y)=>{let F=n-i-140-qo($.placement?.mode==="free"?$.placement.distance:void 0,u),xe=Math.max(76,(o-i*2-180)/Math.max(1,v.length)*d)*u.freePlacementMultiplier,M=i+92+Y*xe;w.set($.id,{object:$,x:F,y:M,radius:ft($,0,u),sortKey:mt(F,M,0)}),x.push({object:$,groupId:b.groupIds.get($.id)??null,x1:F-60,y1:M,x2:F-18,y2:M,mode:"free"}),ut($,w,I,x,D,1)}),A.forEach(($,Y)=>{if(w.has($.id)||!$.placement||$.placement.mode!=="at")return;let F=Bo($.placement.reference,w,f,Y,A.length,n,o,i,D);w.set($.id,{object:$,x:F.x,y:F.y,radius:ft($,2,u),sortKey:mt(F.x,F.y,2),anchorX:F.anchorX,anchorY:F.anchorY}),F.anchorX!==void 0&&F.anchorY!==void 0&&x.push({object:$,groupId:b.groupIds.get($.id)??null,x1:F.anchorX,y1:F.anchorY,x2:F.x,y2:F.y,mode:"at"}),ut($,w,I,x,D,2)});let O=[...w.values()].map($=>uo($,u,b)),z=I.map($=>fo($,b.groupIds.get($.object.id)??null)),X=x.map($=>po($)),h=mo(O,o,u.labelMultiplier),j=ho(z,X,O,h),N=bo(O,z,X,h,b),fe=go(e,s,r.preset,b,f),we=Do(n,o,O,z,X,h);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:s,scaleModel:u,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${br(s)} view - ${br(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:we,layers:j,groups:N,viewpoints:fe,objects:O,orbitVisuals:z,leaders:X,labels:h}}function ne(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 no(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 oo(e){let t=io(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function io(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 ao(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function so(e,t){return{...lo(e),...t}}function lo(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 co(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function uo(e,t,r){let{object:n,x:o,y:i,radius:a,sortKey:s,anchorX:u,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:Uo(n,a,t),sortKey:s,anchorX:u,anchorY:d,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:Ho(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function fo(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 po(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 mo(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,u=Go(a,r),d=a.y+s*(a.radius+18*r),c=d+s*(16*r),f=pr(a.x,d,c,u,s),b=0;for(;o.some(w=>Wo(w,f))&&b<10;)d+=s*14*r,c+=s*14*r,f=pr(a.x,d,c,u,s),b+=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:c,textAnchor:"middle",direction:s<0?"above":"below",hidden:a.hidden})}return n}function ho(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 bo(e,t,r,n,o){let i=new Map,a=s=>{if(!s)return null;let u=i.get(s);if(u)return u;let d=o.groupRoots.get(s)??null,c={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Be(0,0,0,0)};return i.set(s,c),c};for(let s of e){let u=a(s.groupId);u&&!s.hidden&&u.objectIds.push(s.objectId)}for(let s of t){let u=a(s.groupId);u&&!s.hidden&&u.orbitIds.push(s.objectId)}for(let s of r){let u=a(s.groupId);u&&!s.hidden&&u.leaderIds.push(s.objectId)}for(let s of n){let u=a(s.groupId);u&&!s.hidden&&u.labelIds.push(s.objectId)}for(let s of i.values())s.contentBounds=No(s,e,t,r,n);return[...i.values()].sort((s,u)=>s.label.localeCompare(u.label))}function go(e,t,r,n,o){let i=yo(e,t,r),a=new Map;for(let[d,c]of Object.entries(e.system?.info??{})){if(!d.startsWith("viewpoint."))continue;let[f,b,...w]=d.split(".");if(f!=="viewpoint"||!b||w.length===0)continue;let I=Oo(b);if(!I)continue;let x=w.join(".").toLowerCase(),y=a.get(I)??{id:I};wo(y,x,c,t,r,n,o),a.set(I,y)}let s=[...a.values()].map(d=>xo(d,t,r,o)).filter(Boolean),u=s.findIndex(d=>d.id===i.id);return u>=0?s.splice(u,1,{...i,...s[u],layers:{...i.layers,...s[u].layers},filter:s[u].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 yo(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 wo(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=vo(s)??n;return;case"preset":e.preset=$o(s)??o;return;case"rotation":case"angle":e.rotationDeg=xr(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=jo(s);return;case"layers":e.layers=So(s);return;case"query":e.filter={...e.filter??ct(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??ct(),objectTypes:ko(s)};return;case"tags":e.filter={...e.filter??ct(),tags:ht(s)};return;case"groups":e.filter={...e.filter??ct(),groupIds:To(s,i,a)};return}}function xo(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=Io(e.filter),s=e.label?.trim()||Mo(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||Ao(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 Io(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 vo(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function $o(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function xr(e){let t=Number(e);return Number.isFinite(t)?t:null}function jo(e){let t=xr(e);return t!==null&&t>0?t:null}function So(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 ko(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 To(e,t,r){return ht(e).map(n=>n.startsWith("wo-")&&n.endsWith("-group")?n:t.groupIds.has(n)?t.groupIds.get(n)??Pe(n):(r.has(n),Pe(n)))}function ht(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Oo(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Mo(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ao(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 Do(e,t,r,n,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,c=(f,b)=>{a=Math.min(a,f),s=Math.min(s,b),u=Math.max(u,f),d=Math.max(d,b)};for(let f of n)f.hidden||Ir(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||vr(f,c);for(let f of i)f.hidden||$r(f,c);return!Number.isFinite(a)||!Number.isFinite(s)?Be(0,0,e,t):Be(a,s,u,d)}function Ir(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=Sr(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 Be(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 vr(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 $r(e,t){let n=Ko(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 Bt(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(Lo),u=Vo(s,a.radius,o.spacingFactor,o.scaleModel);s.forEach((c,f)=>{let b=Fo(c,f,s.length,a,u,o);r.push({object:c,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}),Bt(c,b.objectX,b.objectY,i,t,r,n,o)});let d=[...o.surfaceChildren.get(e.id)??[]];d.forEach((c,f)=>{let b=Re(f,d.length,-Math.PI/3),w=28*o.spacingFactor,I=ze(b,a.radius,o.projection,o.projection==="isometric"?.9:1),x=ze(b,a.radius+w,o.projection,o.projection==="isometric"?.9:1),y=a.x+I.x,v=a.y+I.y,A=a.x+x.x,C=a.y+x.y;t.set(c.id,{object:c,x:A,y:C,radius:ft(c,i+1,o.scaleModel),sortKey:mt(A,C,i+1),anchorX:y,anchorY:v}),n.push({object:c,groupId:o.objectMap.has(c.id)?Pe(_o(c,o.objectMap)):null,x1:y,y1:v,x2:A,y2:C,mode:"surface"}),ut(c,t,r,n,o,i+1)})}function Lo(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 Vo(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)};let u=Math.min(...i),d=Math.max(...i),c=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:c,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s)}}function Fo(e,t,r,n,o,i){let a=e.placement,s=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let D=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:D,rotationDeg:0,band:s,bandThickness:s?12*i.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-D}}let u=R(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),d=Eo(e,t,o),c=Math.max(d*Math.sqrt(1-u*u),d*.18),f=zt(a.inclination)??0,b=i.projection==="isometric"?Math.max(ro,Math.cos(gt(f)))*yr:1,w=Math.max(c*b,d*.14),I=zt(a.angle)??0,x=d*u,y=Tr(-x,0,I),v=n.x+y.x,A=n.y+y.y,C=Co(a.phase,t,r),P=kr(v,A,d,w,I,C),L=i.projection==="topdown"&&u<=1e-4&&Math.abs(I)<=1e-4,B=s?Po(e,d,o,i.scaleModel):void 0;return{kind:L?"circle":"ellipse",cx:L?n.x:v,cy:L?n.y:A,radius:L?d:void 0,rx:L?void 0:d,ry:L?void 0:w,rotationDeg:I,band:s,bandThickness:B,frontArcPath:i.projection==="isometric"||s?mr(v,A,d,w,I,0,Math.PI):void 0,backArcPath:i.projection==="isometric"||s?mr(v,A,d,w,I,Math.PI,Math.PI*2):void 0,objectX:P.x,objectY:P.y}}function Eo(e,t,r){let n=dt(e);return n===null?r.innerPx+t*r.stepPx:r.metricSpread>0?r.innerPx+(n-r.minMetric)/r.metricSpread*r.pixelSpread:r.innerPx+Math.log10(n+1)*r.stepPx}function dt(e){return!e.placement||e.placement.mode!=="orbit"?null:pt(e.placement.semiMajor??e.placement.distance??null)}function Co(e,t,r){let n=e?zt(e):null;return n!==null?gt(n-90):Re(t,r,-Math.PI/2)}function Po(e,t,r,n){let o=pt(Rt(e.properties.inner)),i=pt(Rt(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 u=Math.max(Math.max(o,i),1e-4);return R(s/u*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function Bo(e,t,r,n,o,i,a,s,u){if(e.kind==="lagrange")return Ro(e,t,r,i,a);if(e.kind==="anchor"){let d=t.get(e.objectId);if(d){let c=Re(n,o,Math.PI/5),f=(d.radius+36)*u.scaleModel.labelMultiplier,b=ze(c,f,u.projection,u.projection==="isometric"?.92:1);return{x:d.x+b.x,y:d.y+b.y,anchorX:d.x,anchorY:d.y}}}if(e.kind==="named"){let d=t.get(e.name);if(d){let c=Re(n,o,Math.PI/6),f=(d.radius+36)*u.scaleModel.labelMultiplier,b=ze(c,f,u.projection,u.projection==="isometric"?.92:1);return{x:d.x+b.x,y:d.y+b.y,anchorX:d.x,anchorY:d.y}}}return{x:i-s-170,y:a-s-86-n*58*u.scaleModel.freePlacementMultiplier}}function Ro(e,t,r,n,o){let i=e.secondary?t.get(e.primary):Yo(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,u=a.y-i.y,d=Math.hypot(s,u)||1,c=s/d,f=u/d,b=-f,w=c,I=R(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-b*.8660254)*I,y:a.y+(f*.5-w*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(c*.5+b*.8660254)*I,y:a.y+(f*.5+w*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function zo(e,t){let r=new Map,n=new Map;for(let d of e){let c=jr(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,b=[],w=r.get(d)??null;for(;w&&!f.has(w);)b.push(w),f.add(w),w=r.get(w)??null;return o.set(d,b),b},u=d=>{let c=a.get(i.get(d)??"");if(c)return c;let f=r.get(d)??null,b=t.get(d),w=d;return b?.placement&&b.placement.mode!=="free"&&f&&(w=u(f)),w};for(let d of e){s(d.id);let c=u(d.id),f=Pe(c);i.set(d.id,f),a.set(f,c)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:a}}function jr(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 No(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(c,f)=>{i=Math.min(i,c),a=Math.min(a,f),s=Math.max(s,c),u=Math.max(u,f)};for(let c of t)!c.hidden&&e.objectIds.includes(c.objectId)&&vr(c,d);for(let c of r)!c.hidden&&e.orbitIds.includes(c.objectId)&&Ir(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)&&$r(c,d);return!Number.isFinite(i)||!Number.isFinite(a)?Be(0,0,0,0):Be(i,a,s,u)}function _o(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=jr(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 Wo(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Yo(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=Xo(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 Uo(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/Ce;case"m":return e.value/1e3/Ce;case"ly":return e.value*Qn;case"pc":return e.value*eo;case"kpc":return e.value*to;case"re":return e.value*Kn/Ce;case"rj":return e.value*Jn/Ce;case"sol":return e.value*Zn/Ce;default:return e.value}}function qo(e,t){let r=pt(e??null);return r===null||r<=0?0:R(r*96*t.freePlacementMultiplier,0,420)}function Xo(e,t){let r=Rt(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 Rt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function zt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Re(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function mr(e,t,r,n,o,i,a){let s=Sr(e,t,r,n,o,i,a,wr);return s.length===0?"":s.map((u,d)=>`${d===0?"M":"L"} ${gr(u.x)} ${gr(u.y)}`).join(" ")}function Sr(e,t,r,n,o,i,a,s){let u=[];for(let d=0;d<=s;d+=1){let c=i+(a-i)*d/s;u.push(kr(e,t,r,n,o,c))}return u}function kr(e,t,r,n,o,i){let a=r*Math.cos(i),s=n*Math.sin(i),u=Tr(a,s,o);return{x:e+u.x,y:t+u.y}}function Tr(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 ze(e,t,r,n){let o=r==="isometric"?yr*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 hr(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 Pe(e){return`${bt(e)}-group`}function Ho(e){return typeof e=="string"&&e.trim()?e:void 0}function Go(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 Ko(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 br(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function gt(e){return e*Math.PI/180}function gr(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function yt(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Qo(e.system),info:ei(e.system)}:null,objects:e.objects.map(Jo)}}function Jo(e){return{...e,properties:Zo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Zo(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 Qo(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 ei(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=ti(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 ti(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 _t(e){return oi(e,"2.0")}function oi(e,t){let r=e.split(/\r?\n/),n=!1,o="2.0",i=null,a=null,s=[],u=!1,d=!1,c=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 A=at(y),C=Fe(y.slice(A),{line:v,columnOffset:A});if(C.length!==0){if(!n){o=ii(C,v),n=!0;continue}if(A===0){a=ai(C,v,i,s,c,f,{sawDefaults:u,sawAtlas:d}),a.kind==="system"?i=a.system:a.kind==="defaults"?u=!0:a.kind==="atlas"&&(d=!0);continue}if(!a)throw new m("Indented line without parent atlas section",v,A+1);di(a,A,C,v)}}if(!n)throw new m('Missing required atlas schema header "schema 2.0"');let w=he({type:"document",objects:s}).objects;return ae({format:"worldorbit",version:"1.0",system:null,objects:w}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:i,objects:w,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 ii(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 ai(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 si(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 li(e,t,r,o);case"annotation":if(!r)throw new m('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return ci(e,t,r,i);case"object":return ui(e,t,n);default:throw new m(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function si(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 li(e,t,r,n){if(e.length!==2)throw new m("Invalid viewpoint declaration",t,e[0]?.column??1);let o=Ar(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:Dr(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 ci(e,t,r,n){if(e.length!==2)throw new m("Invalid annotation declaration",t,e[0]?.column??1);let o=Ar(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:Dr(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function ui(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(!ot.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:ji(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 di(e,t,r,n){switch(e.kind){case"system":fi(e,r,n);return;case"defaults":pi(e,r,n);return;case"atlas":mi(e,t,r,n);return;case"viewpoint":hi(e,t,r,n);return;case"annotation":gi(e,r,n);return;case"object":yi(e,t,r,n);return}}function fi(e,t,r){if(Ne(t,e.seenFields,r)!=="title")throw new m(`Unknown system atlas field "${t[0].value}"`,r,t[0].column);e.system.title=le(t,r)}function pi(e,t,r){let n=Ne(t,e.seenFields,r),o=le(t,r);switch(n){case"view":e.system.defaults.view=Or(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=Mr(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 mi(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]=le(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 hi(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){bi(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=Ne(r,e.seenFields,n),i=le(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=Or(i,n,r[0].column);return;case"preset":e.viewpoint.preset=Mr(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=Ii(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=vi(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=xi(r.slice(1),n);return;default:throw new m(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function bi(e,t,r){let n=Ne(t,e.seenFilterFields,r),o=e.viewpoint.filter??$i();switch(n){case"query":o.query=le(t,r);break;case"objecttypes":o.objectTypes=wi(t.slice(1),r);break;case"tags":o.tags=Nt(t.slice(1),r,"tags");break;case"groups":o.groupIds=Nt(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 gi(e,t,r){switch(Ne(t,e.seenFields,r)){case"label":e.annotation.label=le(t,r);return;case"target":e.annotation.targetObjectId=le(t,r);return;case"body":e.annotation.body=le(t,r);return;case"tags":e.annotation.tags=Nt(t.slice(1),r,"tags");return;default:throw new m(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function yi(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(ki(r,n));return}e.objectNode.blockFields.push(Si(r,n))}function Ne(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 le(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 wi(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 Nt(e,t,r){if(e.length===0)throw new m(`Missing value for field "${r}"`,t);return e.map(n=>n.value)}function xi(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 Or(e,t,r){let n=e.toLowerCase();if(n==="topdown"||n==="isometric")return n;throw new m(`Unknown projection "${e}"`,t,r)}function Mr(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 Ii(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 vi(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 $i(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ji(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=Q(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&&!it(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 Si(e,t){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);if(!Q(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 ki(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 Ar(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Dr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}var Oi=/^schema\s+2(?:\.0)?$/i,Mi=/^schema\s+2\.0-draft$/i;function Lr(e){for(let t of e.split(/\r?\n/)){let r=t.trim();if(r)return Mi.test(r)?"2.0-draft":Oi.test(r)?"2.0":"1.0"}return"1.0"}function ce(e){let t=Vr(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 Vr(e){let t=Lr(e);if(t==="2.0"||t==="2.0-draft")return Ai(e,t);let r;try{r=Ee(e)}catch(o){return{ok:!1,value:null,diagnostics:[se(o,"parse")]}}let n;try{n=he(r)}catch(o){return{ok:!1,value:null,diagnostics:[se(o,"normalize")]}}try{ae(n)}catch(o){return{ok:!1,value:null,diagnostics:[se(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ai(e,t){let r;try{r=_t(e)}catch(i){return{ok:!1,value:null,diagnostics:[se(i,"parse","load.atlas.failed")]}}let n;try{n=yt(r)}catch(i){return{ok:!1,value:null,diagnostics:[se(i,"normalize","load.atlas.materialize.failed")]}}try{ae(n)}catch(i){return{ok:!1,value:null,diagnostics:[se(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 ue={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Wt(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function _e(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function je(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function wt(e,t){return{...e,rotationDeg:Wt(e.rotationDeg+t)}}function Se(e,t,r,n,o){if(!Number.isFinite(r)||r<=0)return t;let i=ge(e),a=_e(t.scale*r,o);if(a===t.scale)return t;let s=a/t.scale,u=n.x-i.x,d=n.y-i.y;return{...t,scale:a,translateX:(1-s)*u+s*t.translateX,translateY:(1-s)*d+s*t.translateY}}function be(e,t,r){let n=ge(e),o=Vi(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),u=Math.max(o.height,1),d=_e(Math.min(i/s,a/u),r),c=ne({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(u=>u.objectId===r&&!u.hidden);if(!o)return t;let i=ge(e),a=_e(Math.max(t.scale,1.8),n),s=ne({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 It(e,t){let r=ge(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function ke(e,t,r){let n=ge(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=ne({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:n.x+s.x,y:n.y+s.y}}function vt(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=>ke(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 ge(e){return{x:e.width/2,y:e.height/2}}function Vi(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(u=>ne(u,t,r)),o=Math.min(...n.map(u=>u.x)),i=Math.min(...n.map(u=>u.y)),a=Math.max(...n.map(u=>u.x)),s=Math.max(...n.map(u=>u.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 jt="worldorbit-camera-root";function K(e,t={}){let r=Ke(t.theme),n=Gi(t.preset??e.renderPreset??void 0),o=Je({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,a=Ze(e,t.filter??null),s=e.objects.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!$t(y.object)).sort((y,v)=>y.sortKey-v.sortKey),u=e.labels.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!$t(y.object)),d=Ci(s),c=o.orbits?Ei(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||!$t(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="${U(y.renderId)}" data-group-id="${te(y.groupId??"")}" />`).join(""):"",b=o.objects?s.map(y=>Pi(y,t.selectedObjectId??null,r)).join(""):"",w=o.labels?u.map(y=>Bi(e,y,t.selectedObjectId??null)).join(""):"",I=o.metadata?`<text class="wo-title" x="56" y="64">${U(e.title)}</text>
|
|
1
|
+
"use strict";var WorldOrbitViewer=(()=>{var Bt=Object.defineProperty;var bn=Object.getOwnPropertyDescriptor;var gn=Object.getOwnPropertyNames;var yn=Object.prototype.hasOwnProperty;var wn=(e,t)=>{for(var r in t)Bt(e,r,{get:t[r],enumerable:!0})},xn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gn(t))!yn.call(e,o)&&o!==r&&Bt(e,o,{get:()=>t[o],enumerable:!(n=bn(t,o))||n.enumerable});return e};var In=e=>xn(Bt({},"__esModule",{value:!0}),e);var wa={};wn(wa,{DEFAULT_VIEWER_STATE:()=>de,WORLD_LAYER_ID:()=>kt,clampScale:()=>Ye,composeViewerTransform:()=>$t,createAtlasViewer:()=>Mt,createEmbedPayload:()=>Qr,createInteractiveViewer:()=>fe,createWorldOrbitEmbedMarkup:()=>en,defineWorldOrbitViewerElement:()=>on,deserializeViewerAtlasState:()=>nt,deserializeWorldOrbitEmbedPayload:()=>Kt,fitViewerState:()=>ye,focusViewerState:()=>vt,getSceneCenter:()=>we,getThemePreset:()=>nr,getViewerVisibleBounds:()=>jt,invertViewerPoint:()=>Oe,mountWorldOrbitEmbeds:()=>tn,normalizeRotation:()=>Ut,normalizeViewerFilter:()=>X,panViewerState:()=>ge,renderDocumentToSvg:()=>Ht,renderSceneToSvg:()=>K,renderSourceToSvg:()=>Rr,resolveLayers:()=>Qe,resolveTheme:()=>Ze,rotateViewerState:()=>It,sceneViewpointToLayerOptions:()=>ot,searchSceneObjects:()=>tt,serializeViewerAtlasState:()=>rt,serializeWorldOrbitEmbedPayload:()=>Gt,viewpointToViewerFilter:()=>it,zoomViewerStateAt:()=>Te});var vn={background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Fe={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 Ze(e){return e?typeof e=="string"?Fe[e]??Fe.atlas:{...Fe.atlas,...e}:Fe.atlas}function Qe(e){return{...vn,...e}}function nr(e){return Fe[e]}function X(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Rt(e.objectTypes??[]),tags:Rt((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:Rt((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return $n(t)?t:null}function $n(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function et(e,t){let r=X(t),n=new Set;for(let o of e.objects)if(!o.hidden&&jn(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 tt(e,t,r=12){let n=t.trim().toLowerCase();return n?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Sn(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=>or(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,r).map(o=>or(o,1))}function ir(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:X(r)}}function rt(e){return encodeURIComponent(JSON.stringify(e))}function nt(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:X(t.filter??null)}}function ar(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 ot(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 it(e){return e?.filter?X({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function or(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 jn(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=sr(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function Sn(e,t){let r=e.objectId.toLowerCase(),n=e.label.toLowerCase(),o=sr(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(u=>o.includes(u))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(u=>typeof u=="string"):[]).some(u=>u.toLowerCase()===t)&&(i+=18),i}function sr(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 Rt(e){return[...new Set(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 Ee=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],G=Ee.filter(e=>e!=="system"),kn=["star","planet","moon","asteroid","comet","structure","phenomenon"],lr=["structure","phenomenon"],ae=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Tn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function S(e,t){return{key:e,...t}}var at=new Set(Ee),cr=new Map([S("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:ae}),S("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:ae,unitFamily:"distance"}),S("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:ae,unitFamily:"distance"}),S("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:ae}),S("period",{kind:"unit",placement:!0,arity:"single",objectTypes:ae,unitFamily:"duration"}),S("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:ae,unitFamily:"angle"}),S("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:ae,unitFamily:"angle"}),S("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:ae,unitFamily:"angle"}),S("at",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),S("surface",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),S("free",{kind:"string",placement:!0,arity:"single",objectTypes:Tn}),S("kind",{kind:"string",placement:!1,arity:"single",objectTypes:G}),S("class",{kind:"string",placement:!1,arity:"single",objectTypes:G}),S("culture",{kind:"string",placement:!1,arity:"single",objectTypes:G}),S("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Ee}),S("color",{kind:"string",placement:!1,arity:"single",objectTypes:Ee}),S("image",{kind:"string",placement:!1,arity:"single",objectTypes:kn}),S("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Ee}),S("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"radius"}),S("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"mass"}),S("density",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"generic"}),S("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"generic"}),S("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"generic"}),S("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:G}),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:G}),S("source",{kind:"string",placement:!1,arity:"single",objectTypes:G}),S("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:G,unitFamily:"duration"})].map(e=>[e.key,e])),On=new Set(cr.keys());function ee(e){return cr.get(e)}function st(e){return On.has(e)}function ur(e,t){return e.objectTypes.includes(t)}function dr(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 Ce(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,a=!1,s=!1,u=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],b=n+c+1;if(s&&f==="\\"){let w=e[c+1];if(w==='"'||w==="\\"){o+=w,c++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=b),a=!0,u=b,s=!0);continue}if(!s&&/\s/.test(f)){d();continue}i===null&&(i=b),o+=f}if(s)throw new m("Unclosed quote in line",t.line,u??n+e.length);return d(),r}function lt(e){return e.match(/^\s*/)?.[0].length??0}function Pe(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],u=a+1;if(!s.trim())continue;let d=lt(s),c=Ce(s.slice(d),{line:u,columnOffset:d});if(c.length!==0){if(d===0){o=!1,i=null;let f=Mn(c,u);r.push(f),n=f;continue}if(!n)throw new m("Indented line without parent object",u,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(Ln(c,u)):n.blockFields.push(Dn(c,u))}}return{type:"document",objects:r}}function Mn(e,t){if(e.length<2)throw new m("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!at.has(r.value))throw new m(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:An(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function An(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&&!st(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 Dn(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 Ln(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 fr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Vn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Fn=/^[A-Za-z][A-Za-z0-9+.-]*:/;function be(e){let t=null,r=[];for(let n of e.objects){let o=En(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 En(e){let t=[...e.inlineFields,...e.blockFields];Cn(e.objectType,t);let r=Pn(t),n=Bn(e.objectType,r),o=Rn(r),i=_n(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 Cn(e,t){for(let r of t){let n=ee(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!ur(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 Pn(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 Bn(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:ct(t,"orbit"),distance:Se(t,"distance"),semiMajor:Se(t,"semiMajor"),eccentricity:Un(t,"eccentricity"),period:Se(t,"period"),angle:Se(t,"angle"),inclination:Se(t,"inclination"),phase:Se(t,"phase")};if(n){let s=ut(t,"at"),u=ct(t,"at");return{mode:"at",target:u,reference:Wn(u,s.location)}}if(o)return{mode:"surface",target:ct(t,"surface")};if(i){let s=ct(t,"free"),u=Yn(s);return{mode:"free",distance:u??void 0,descriptor:u?void 0:s}}return null}function Rn(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]=qn(n);break;case"number":t[r]=mr(ke(n),r,n.location);break;case"unit":t[r]=pr(ke(n),n.location,r);break;case"string":t[r]=zn(r,n);break}}return t}function zn(e,t){let r=t.values.join(" ").trim();return e==="image"&&Nn(r,t.location),r}function Nn(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(Fn);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 _n(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 Wn(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 pr(e,t,r){let n=e.match(fr);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&&!dr(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function Yn(e){let t=e.match(fr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Se(e,t){if(!e.has(t))return;let r=ut(e,t);return pr(ke(r),r.location,t)}function Un(e,t){if(!e.has(t))return;let r=ut(e,t);return mr(ke(r),t,r.location)}function mr(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw m.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function qn(e){let t=ke(e).toLowerCase(),r=Vn.get(t);if(r===void 0)throw m.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function ut(e,t){let r=e.get(t);if(!r)throw new m(`Missing value for key "${t}"`);return r}function ct(e,t){return ke(ut(e,t))}function ke(e){if(e.values.length!==1)throw m.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Xn=new Set(["star","planet","moon","asteroid","comet"]);function se(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||!Xn.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"&&Hn(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&Gn(n,n.placement.reference,t))}}function Hn(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 Gn(e,t,r){if(!r.has(t.objectId))throw new m(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function le(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)}}var Be=1495978707e-1,Kn=6371,Jn=71492,Zn=695700,Qn=63241.077,eo=206264.806,to=206264806,xr=.68,ro=.2,Ir=28;function te(e,t={}){let r=oo(t),n=r.width,o=r.height,i=r.padding,a=no(e),s=ao(e,t.projection),u=so(a,t.scaleModel),d=co(a),c=e.system?.id??null,f=new Map(e.objects.map($=>[$.id,$])),b=zo(e.objects,f),w=new Map,I=[],x=[],y=[],v=[],A=[],L=new Map,P=new Map;for(let $ of e.objects){let Y=$.placement;if(!Y){y.push($);continue}if(Y.mode==="orbit"){gr(P,Y.target,$);continue}if(Y.mode==="surface"){gr(L,Y.target,$);continue}if(Y.mode==="at"){A.push($);continue}v.push($)}let D=v.length>0?n*.42:n/2,B=o/2,V={orbitChildren:P,surfaceChildren:L,objectMap:f,spacingFactor:d,projection:s,scaleModel:u},F=y.find($=>$.type==="star")??y[0]??null;F&&zt(F,D,B,0,w,I,x,V);let W=y.filter($=>$.id!==F?.id);if(W.length>0){let $=Math.min(n,o)*.28*d*u.orbitDistanceMultiplier;W.forEach((Y,E)=>{let ve=Ne(E,W.length,-Math.PI/2),M=_e(ve,$,s,1);zt(Y,D+M.x,B+M.y,0,w,I,x,V)})}v.forEach(($,Y)=>{let E=n-i-140-qo($.placement?.mode==="free"?$.placement.distance:void 0,u),ve=Math.max(76,(o-i*2-180)/Math.max(1,v.length)*d)*u.freePlacementMultiplier,M=i+92+Y*ve;w.set($.id,{object:$,x:E,y:M,radius:mt($,0,u),sortKey:bt(E,M,0)}),x.push({object:$,groupId:b.groupIds.get($.id)??null,x1:E-60,y1:M,x2:E-18,y2:M,mode:"free"}),ft($,w,I,x,V,1)}),A.forEach(($,Y)=>{if(w.has($.id)||!$.placement||$.placement.mode!=="at")return;let E=Bo($.placement.reference,w,f,Y,A.length,n,o,i,V);w.set($.id,{object:$,x:E.x,y:E.y,radius:mt($,2,u),sortKey:bt(E.x,E.y,2),anchorX:E.anchorX,anchorY:E.anchorY}),E.anchorX!==void 0&&E.anchorY!==void 0&&x.push({object:$,groupId:b.groupIds.get($.id)??null,x1:E.anchorX,y1:E.anchorY,x2:E.x,y2:E.y,mode:"at"}),ft($,w,I,x,V,2)});let O=[...w.values()].map($=>uo($,u,b)),z=I.map($=>fo($,b.groupIds.get($.object.id)??null)),H=x.map($=>po($)),h=mo(O,o,u.labelMultiplier),j=ho(z,H,O,h),N=bo(O,z,H,h,b),pe=go(e,s,r.preset,b,f),Ie=Do(n,o,O,z,H,h);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:s,scaleModel:u,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${yr(s)} view - ${yr(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:Ie,layers:j,groups:N,viewpoints:pe,objects:O,orbitVisuals:z,leaders:H,labels:h}}function oe(e,t,r){let n=wt(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 no(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 oo(e){let t=io(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function io(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 ao(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function so(e,t){return{...lo(e),...t}}function lo(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 co(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function uo(e,t,r){let{object:n,x:o,y:i,radius:a,sortKey:s,anchorX:u,anchorY:d}=e;return{renderId:yt(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:Uo(n,a,t),sortKey:s,anchorX:u,anchorY:d,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:Ho(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function fo(e,t){return{renderId:`${yt(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 po(e){return{renderId:`${yt(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 mo(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,u=Go(a,r),d=a.y+s*(a.radius+18*r),c=d+s*(16*r),f=hr(a.x,d,c,u,s),b=0;for(;o.some(w=>Wo(w,f))&&b<10;)d+=s*14*r,c+=s*14*r,f=hr(a.x,d,c,u,s),b+=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:c,textAnchor:"middle",direction:s<0?"above":"below",hidden:a.hidden})}return n}function ho(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 bo(e,t,r,n,o){let i=new Map,a=s=>{if(!s)return null;let u=i.get(s);if(u)return u;let d=o.groupRoots.get(s)??null,c={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ze(0,0,0,0)};return i.set(s,c),c};for(let s of e){let u=a(s.groupId);u&&!s.hidden&&u.objectIds.push(s.objectId)}for(let s of t){let u=a(s.groupId);u&&!s.hidden&&u.orbitIds.push(s.objectId)}for(let s of r){let u=a(s.groupId);u&&!s.hidden&&u.leaderIds.push(s.objectId)}for(let s of n){let u=a(s.groupId);u&&!s.hidden&&u.labelIds.push(s.objectId)}for(let s of i.values())s.contentBounds=No(s,e,t,r,n);return[...i.values()].sort((s,u)=>s.label.localeCompare(u.label))}function go(e,t,r,n,o){let i=yo(e,t,r),a=new Map;for(let[d,c]of Object.entries(e.system?.info??{})){if(!d.startsWith("viewpoint."))continue;let[f,b,...w]=d.split(".");if(f!=="viewpoint"||!b||w.length===0)continue;let I=Oo(b);if(!I)continue;let x=w.join(".").toLowerCase(),y=a.get(I)??{id:I};wo(y,x,c,t,r,n,o),a.set(I,y)}let s=[...a.values()].map(d=>xo(d,t,r,o)).filter(Boolean),u=s.findIndex(d=>d.id===i.id);return u>=0?s.splice(u,1,{...i,...s[u],layers:{...i.layers,...s[u].layers},filter:s[u].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 yo(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 wo(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=vo(s)??n;return;case"preset":e.preset=$o(s)??o;return;case"rotation":case"angle":e.rotationDeg=vr(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=jo(s);return;case"layers":e.layers=So(s);return;case"query":e.filter={...e.filter??dt(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??dt(),objectTypes:ko(s)};return;case"tags":e.filter={...e.filter??dt(),tags:gt(s)};return;case"groups":e.filter={...e.filter??dt(),groupIds:To(s,i,a)};return}}function xo(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=Io(e.filter),s=e.label?.trim()||Mo(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||Ao(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 dt(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Io(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 vo(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function $o(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function vr(e){let t=Number(e);return Number.isFinite(t)?t:null}function jo(e){let t=vr(e);return t!==null&&t>0?t:null}function So(e){let t={};for(let r of gt(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 ko(e){return gt(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function To(e,t,r){return gt(e).map(n=>n.startsWith("wo-")&&n.endsWith("-group")?n:t.groupIds.has(n)?t.groupIds.get(n)??Re(n):(r.has(n),Re(n)))}function gt(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Oo(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Mo(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ao(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 Do(e,t,r,n,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,c=(f,b)=>{a=Math.min(a,f),s=Math.min(s,b),u=Math.max(u,f),d=Math.max(d,b)};for(let f of n)f.hidden||$r(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||jr(f,c);for(let f of i)f.hidden||Sr(f,c);return!Number.isFinite(a)||!Number.isFinite(s)?ze(0,0,e,t):ze(a,s,u,d)}function $r(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=Tr(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,Ir*2);for(let a of i)t(a.x-r,a.y-r),t(a.x+r,a.y+r)}function ze(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 jr(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 Sr(e,t){let n=Ko(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:mt(e,n,s.scaleModel),sortKey:bt(t,r,n)}),ft(e,o,i,a,s,n+1))}function ft(e,t,r,n,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(Lo),u=Vo(s,a.radius,o.spacingFactor,o.scaleModel);s.forEach((c,f)=>{let b=Fo(c,f,s.length,a,u,o);r.push({object:c,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}),zt(c,b.objectX,b.objectY,i,t,r,n,o)});let d=[...o.surfaceChildren.get(e.id)??[]];d.forEach((c,f)=>{let b=Ne(f,d.length,-Math.PI/3),w=28*o.spacingFactor,I=_e(b,a.radius,o.projection,o.projection==="isometric"?.9:1),x=_e(b,a.radius+w,o.projection,o.projection==="isometric"?.9:1),y=a.x+I.x,v=a.y+I.y,A=a.x+x.x,L=a.y+x.y;t.set(c.id,{object:c,x:A,y:L,radius:mt(c,i+1,o.scaleModel),sortKey:bt(A,L,i+1),anchorX:y,anchorY:v}),n.push({object:c,groupId:o.objectMap.has(c.id)?Re(_o(c,o.objectMap)):null,x1:y,y1:v,x2:A,y2:L,mode:"surface"}),ft(c,t,r,n,o,i+1)})}function Lo(e,t){let r=pt(e),n=pt(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 Vo(e,t,r,n){let o=e.map(f=>pt(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)};let u=Math.min(...i),d=Math.max(...i),c=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:c,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s)}}function Fo(e,t,r,n,o,i){let a=e.placement,s=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let V=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:V,rotationDeg:0,band:s,bandThickness:s?12*i.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-V}}let u=R(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),d=Eo(e,t,o),c=Math.max(d*Math.sqrt(1-u*u),d*.18),f=_t(a.inclination)??0,b=i.projection==="isometric"?Math.max(ro,Math.cos(wt(f)))*xr:1,w=Math.max(c*b,d*.14),I=_t(a.angle)??0,x=d*u,y=Mr(-x,0,I),v=n.x+y.x,A=n.y+y.y,L=Co(a.phase,t,r),P=Or(v,A,d,w,I,L),D=i.projection==="topdown"&&u<=1e-4&&Math.abs(I)<=1e-4,B=s?Po(e,d,o,i.scaleModel):void 0;return{kind:D?"circle":"ellipse",cx:D?n.x:v,cy:D?n.y:A,radius:D?d:void 0,rx:D?void 0:d,ry:D?void 0:w,rotationDeg:I,band:s,bandThickness:B,frontArcPath:i.projection==="isometric"||s?br(v,A,d,w,I,0,Math.PI):void 0,backArcPath:i.projection==="isometric"||s?br(v,A,d,w,I,Math.PI,Math.PI*2):void 0,objectX:P.x,objectY:P.y}}function Eo(e,t,r){let n=pt(e);return n===null?r.innerPx+t*r.stepPx:r.metricSpread>0?r.innerPx+(n-r.minMetric)/r.metricSpread*r.pixelSpread:r.innerPx+Math.log10(n+1)*r.stepPx}function pt(e){return!e.placement||e.placement.mode!=="orbit"?null:ht(e.placement.semiMajor??e.placement.distance??null)}function Co(e,t,r){let n=e?_t(e):null;return n!==null?wt(n-90):Ne(t,r,-Math.PI/2)}function Po(e,t,r,n){let o=ht(Nt(e.properties.inner)),i=ht(Nt(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 u=Math.max(Math.max(o,i),1e-4);return R(s/u*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function Bo(e,t,r,n,o,i,a,s,u){if(e.kind==="lagrange")return Ro(e,t,r,i,a);if(e.kind==="anchor"){let d=t.get(e.objectId);if(d){let c=Ne(n,o,Math.PI/5),f=(d.radius+36)*u.scaleModel.labelMultiplier,b=_e(c,f,u.projection,u.projection==="isometric"?.92:1);return{x:d.x+b.x,y:d.y+b.y,anchorX:d.x,anchorY:d.y}}}if(e.kind==="named"){let d=t.get(e.name);if(d){let c=Ne(n,o,Math.PI/6),f=(d.radius+36)*u.scaleModel.labelMultiplier,b=_e(c,f,u.projection,u.projection==="isometric"?.92:1);return{x:d.x+b.x,y:d.y+b.y,anchorX:d.x,anchorY:d.y}}}return{x:i-s-170,y:a-s-86-n*58*u.scaleModel.freePlacementMultiplier}}function Ro(e,t,r,n,o){let i=e.secondary?t.get(e.primary):Yo(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,u=a.y-i.y,d=Math.hypot(s,u)||1,c=s/d,f=u/d,b=-f,w=c,I=R(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-b*.8660254)*I,y:a.y+(f*.5-w*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(c*.5+b*.8660254)*I,y:a.y+(f*.5+w*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function zo(e,t){let r=new Map,n=new Map;for(let d of e){let c=kr(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,b=[],w=r.get(d)??null;for(;w&&!f.has(w);)b.push(w),f.add(w),w=r.get(w)??null;return o.set(d,b),b},u=d=>{let c=a.get(i.get(d)??"");if(c)return c;let f=r.get(d)??null,b=t.get(d),w=d;return b?.placement&&b.placement.mode!=="free"&&f&&(w=u(f)),w};for(let d of e){s(d.id);let c=u(d.id),f=Re(c);i.set(d.id,f),a.set(f,c)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:a}}function kr(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 No(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(c,f)=>{i=Math.min(i,c),a=Math.min(a,f),s=Math.max(s,c),u=Math.max(u,f)};for(let c of t)!c.hidden&&e.objectIds.includes(c.objectId)&&jr(c,d);for(let c of r)!c.hidden&&e.orbitIds.includes(c.objectId)&&$r(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)&&Sr(c,d);return!Number.isFinite(i)||!Number.isFinite(a)?ze(0,0,0,0):ze(i,a,s,u)}function _o(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=kr(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function hr(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 Wo(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Yo(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function mt(e,t,r){let n=Xo(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 Uo(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 ht(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Be;case"m":return e.value/1e3/Be;case"ly":return e.value*Qn;case"pc":return e.value*eo;case"kpc":return e.value*to;case"re":return e.value*Kn/Be;case"rj":return e.value*Jn/Be;case"sol":return e.value*Zn/Be;default:return e.value}}function qo(e,t){let r=ht(e??null);return r===null||r<=0?0:R(r*96*t.freePlacementMultiplier,0,420)}function Xo(e,t){let r=Nt(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 Nt(e){return!e||typeof e!="object"||!("value"in e)?null:e}function _t(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ne(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function br(e,t,r,n,o,i,a){let s=Tr(e,t,r,n,o,i,a,Ir);return s.length===0?"":s.map((u,d)=>`${d===0?"M":"L"} ${wr(u.x)} ${wr(u.y)}`).join(" ")}function Tr(e,t,r,n,o,i,a,s){let u=[];for(let d=0;d<=s;d+=1){let c=i+(a-i)*d/s;u.push(Or(e,t,r,n,o,c))}return u}function Or(e,t,r,n,o,i){let a=r*Math.cos(i),s=n*Math.sin(i),u=Mr(a,s,o);return{x:e+u.x,y:t+u.y}}function Mr(e,t,r){let n=wt(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function _e(e,t,r,n){let o=r==="isometric"?xr*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function bt(e,t,r){return t*1e3+e+r*.01}function R(e,t,r){return Math.min(Math.max(e,t),r)}function gr(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function yt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Re(e){return`${yt(e)}-group`}function Ho(e){return typeof e=="string"&&e.trim()?e:void 0}function Go(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 Ko(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 yr(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function wt(e){return e*Math.PI/180}function wr(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function xt(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Qo(e.system),info:ei(e.system)}:null,objects:e.objects.map(Jo)}}function Jo(e){return{...e,properties:Zo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Zo(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 Qo(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 ei(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=ti(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 ti(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 Yt(e){return oi(e,"2.0")}function oi(e,t){let r=e.split(/\r?\n/),n=!1,o="2.0",i=null,a=null,s=[],u=!1,d=!1,c=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 A=lt(y),L=Ce(y.slice(A),{line:v,columnOffset:A});if(L.length!==0){if(!n){o=ii(L,v),n=!0;continue}if(A===0){a=ai(L,v,i,s,c,f,{sawDefaults:u,sawAtlas:d}),a.kind==="system"?i=a.system:a.kind==="defaults"?u=!0:a.kind==="atlas"&&(d=!0);continue}if(!a)throw new m("Indented line without parent atlas section",v,A+1);di(a,A,L,v)}}if(!n)throw new m('Missing required atlas schema header "schema 2.0"');let w=be({type:"document",objects:s}).objects;return se({format:"worldorbit",version:"1.0",system:null,objects:w}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:i,objects:w,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 ii(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 ai(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 si(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 li(e,t,r,o);case"annotation":if(!r)throw new m('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return ci(e,t,r,i);case"object":return ui(e,t,n);default:throw new m(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function si(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 li(e,t,r,n){if(e.length!==2)throw new m("Invalid viewpoint declaration",t,e[0]?.column??1);let o=Lr(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:Vr(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 ci(e,t,r,n){if(e.length!==2)throw new m("Invalid annotation declaration",t,e[0]?.column??1);let o=Lr(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:Vr(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function ui(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(!at.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:ji(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 di(e,t,r,n){switch(e.kind){case"system":fi(e,r,n);return;case"defaults":pi(e,r,n);return;case"atlas":mi(e,t,r,n);return;case"viewpoint":hi(e,t,r,n);return;case"annotation":gi(e,r,n);return;case"object":yi(e,t,r,n);return}}function fi(e,t,r){if(We(t,e.seenFields,r)!=="title")throw new m(`Unknown system atlas field "${t[0].value}"`,r,t[0].column);e.system.title=ce(t,r)}function pi(e,t,r){let n=We(t,e.seenFields,r),o=ce(t,r);switch(n){case"view":e.system.defaults.view=Ar(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=Dr(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 mi(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]=ce(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 hi(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){bi(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=We(r,e.seenFields,n),i=ce(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=Ar(i,n,r[0].column);return;case"preset":e.viewpoint.preset=Dr(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=Ii(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=vi(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=xi(r.slice(1),n);return;default:throw new m(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function bi(e,t,r){let n=We(t,e.seenFilterFields,r),o=e.viewpoint.filter??$i();switch(n){case"query":o.query=ce(t,r);break;case"objecttypes":o.objectTypes=wi(t.slice(1),r);break;case"tags":o.tags=Wt(t.slice(1),r,"tags");break;case"groups":o.groupIds=Wt(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 gi(e,t,r){switch(We(t,e.seenFields,r)){case"label":e.annotation.label=ce(t,r);return;case"target":e.annotation.targetObjectId=ce(t,r);return;case"body":e.annotation.body=ce(t,r);return;case"tags":e.annotation.tags=Wt(t.slice(1),r,"tags");return;default:throw new m(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function yi(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(ki(r,n));return}e.objectNode.blockFields.push(Si(r,n))}function We(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 ce(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 wi(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 Wt(e,t,r){if(e.length===0)throw new m(`Missing value for field "${r}"`,t);return e.map(n=>n.value)}function xi(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 Ar(e,t,r){let n=e.toLowerCase();if(n==="topdown"||n==="isometric")return n;throw new m(`Unknown projection "${e}"`,t,r)}function Dr(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 Ii(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 vi(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 $i(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ji(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&&!st(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 Si(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 ki(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 Lr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Vr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}var Oi=/^schema\s+2(?:\.0)?$/i,Mi=/^schema\s+2\.0-draft$/i;function Fr(e){for(let t of e.split(/\r?\n/)){let r=t.trim();if(r)return Mi.test(r)?"2.0-draft":Oi.test(r)?"2.0":"1.0"}return"1.0"}function ue(e){let t=Er(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 Er(e){let t=Fr(e);if(t==="2.0"||t==="2.0-draft")return Ai(e,t);let r;try{r=Pe(e)}catch(o){return{ok:!1,value:null,diagnostics:[le(o,"parse")]}}let n;try{n=be(r)}catch(o){return{ok:!1,value:null,diagnostics:[le(o,"normalize")]}}try{se(n)}catch(o){return{ok:!1,value:null,diagnostics:[le(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ai(e,t){let r;try{r=Yt(e)}catch(i){return{ok:!1,value:null,diagnostics:[le(i,"parse","load.atlas.failed")]}}let n;try{n=xt(r)}catch(i){return{ok:!1,value:null,diagnostics:[le(i,"normalize","load.atlas.materialize.failed")]}}try{se(n)}catch(i){return{ok:!1,value:null,diagnostics:[le(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 de={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Ut(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function Ye(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function ge(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function It(e,t){return{...e,rotationDeg:Ut(e.rotationDeg+t)}}function Te(e,t,r,n,o){if(!Number.isFinite(r)||r<=0)return t;let i=we(e),a=Ye(t.scale*r,o);if(a===t.scale)return t;let s=a/t.scale,u=n.x-i.x,d=n.y-i.y;return{...t,scale:a,translateX:(1-s)*u+s*t.translateX,translateY:(1-s)*d+s*t.translateY}}function ye(e,t,r){let n=we(e),o=Vi(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),u=Math.max(o.height,1),d=Ye(Math.min(i/s,a/u),r),c=oe({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 vt(e,t,r,n){let o=e.objects.find(u=>u.objectId===r&&!u.hidden);if(!o)return t;let i=we(e),a=Ye(Math.max(t.scale,1.8),n),s=oe({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 $t(e,t){let r=we(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function Oe(e,t,r){let n=we(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=oe({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:n.x+s.x,y:n.y+s.y}}function jt(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=>Oe(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 we(e){return{x:e.width/2,y:e.height/2}}function Vi(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(u=>oe(u,t,r)),o=Math.min(...n.map(u=>u.x)),i=Math.min(...n.map(u=>u.y)),a=Math.max(...n.map(u=>u.x)),s=Math.max(...n.map(u=>u.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 kt="worldorbit-camera-root";function K(e,t={}){let r=Ze(t.theme),n=Gi(t.preset??e.renderPreset??void 0),o=Qe({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,a=et(e,t.filter??null),s=e.objects.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!St(y.object)).sort((y,v)=>y.sortKey-v.sortKey),u=e.labels.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!St(y.object)),d=Ci(s),c=o.orbits?Ei(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||!St(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="${U(y.renderId)}" data-group-id="${re(y.groupId??"")}" />`).join(""):"",b=o.objects?s.map(y=>Pi(y,t.selectedObjectId??null,r)).join(""):"",w=o.labels?u.map(y=>Bi(e,y,t.selectedObjectId??null)).join(""):"",I=o.metadata?`<text class="wo-title" x="56" y="64">${U(e.title)}</text>
|
|
2
2
|
<text class="wo-subtitle" x="56" y="88">${U(i)}</text>
|
|
3
3
|
<text class="wo-meta" x="56" y="${e.height-42}">${U(Ji(e))}</text>`:"",x=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
4
4
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
${x}
|
|
58
58
|
${I}
|
|
59
59
|
<g data-worldorbit-world="true">
|
|
60
|
-
<g data-worldorbit-camera-root="${
|
|
60
|
+
<g data-worldorbit-camera-root="${kt}" id="${kt}">
|
|
61
61
|
<g data-worldorbit-world-content="true">
|
|
62
62
|
${o.orbits?`<g data-layer-id="orbits-back">${c.back}</g>`:""}
|
|
63
63
|
${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
@@ -67,42 +67,42 @@
|
|
|
67
67
|
</g>
|
|
68
68
|
</g>
|
|
69
69
|
</g>
|
|
70
|
-
</svg>`}function
|
|
70
|
+
</svg>`}function Ht(e,t={}){return K(te(e,t),t)}function Rr(e,t={}){let r=ue(e);return Ht(r.document,Fi(r,t))}function Fi(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function Ei(e,t,r){let n=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(r||!St(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",u=`data-render-id="${U(i.renderId)}" data-orbit-object-id="${re(i.objectId)}" data-parent-id="${re(i.parentId)}" data-group-id="${re(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&n.push(`<path class="${s} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${u} />`),i.frontArcPath&&o.push(`<path class="${s} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${u} />`);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}" ${u} />`);continue}o.push(`<circle class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${u} />`)}return{back:n.join(""),front:o.join("")}}function Ci(e){return e.filter(t=>!!t.imageHref).map(t=>Ni(t)).join("")}function Pi(e,t,r){let{object:n,x:o,y:i,radius:a,visualRadius:s}=e,u=t===e.objectId?" wo-object-selected":"",d=n.properties.kind?` wo-kind-${String(n.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",c=Wi(e,r),f=zi(e),b=f?Cr(n,o,i,a,c,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${n.type}${d}${u}" data-object-id="${U(e.objectId)}" data-parent-id="${re(e.parentId??"")}" data-group-id="${re(e.groupId??"")}" data-render-id="${U(e.renderId)}" tabindex="0" role="button" aria-label="${U(`${n.type} ${e.objectId}`)}">
|
|
71
71
|
<circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${s+8}" />
|
|
72
72
|
${Ri(e,c)}
|
|
73
|
-
${
|
|
73
|
+
${Cr(n,o,i,a,c)}
|
|
74
74
|
${f}
|
|
75
75
|
${b}
|
|
76
|
-
</g>`}function Bi(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="${U(t.objectId)}" data-group-id="${
|
|
76
|
+
</g>`}function Bi(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="${U(t.objectId)}" data-group-id="${re(t.groupId??"")}" data-render-id="${U(t.renderId)}">
|
|
77
77
|
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${U(t.label)}</text>
|
|
78
78
|
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${U(t.secondaryLabel)}</text>
|
|
79
|
-
</g>`}function
|
|
79
|
+
</g>`}function Cr(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" />
|
|
80
80
|
<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" />
|
|
81
|
-
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${
|
|
81
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Nr(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let u=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?u==="black-hole"||u==="nebula"||u==="galaxy"||u==="dwarf-galaxy"?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${qt(t,r,n)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:u==="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" />
|
|
82
82
|
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:u==="galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.6}" ry="${n}" fill="${o.halo??"none"}" stroke="none" />
|
|
83
83
|
<ellipse cx="${t}" cy="${r}" rx="${n*1.5}" ry="${n*.42}" fill="${a}" stroke="${o.stroke}" stroke-width="1.2" />
|
|
84
84
|
<circle cx="${t}" cy="${r}" r="${n*.28}" fill="${o.core??"#fff"}" stroke="none" />`:u==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*1.6}" ry="${n*.55}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />
|
|
85
85
|
<circle cx="${t}" cy="${r}" r="${n*.25}" fill="${o.core??"#fff"}" stroke="none" />`:u==="nebula"?`<circle cx="${t}" cy="${r}" r="${n*2.2}" fill="${o.halo??"none"}" stroke="none" />
|
|
86
|
-
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${
|
|
87
|
-
<svg width="${
|
|
88
|
-
<rect x="0.5" y="0.5" width="${
|
|
86
|
+
<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${qt(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Ri(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 zi(e){if(!e.imageHref)return"";let t=_i(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${re(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${re(zr(e))})" />`}function Ni(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="${Nr(t,r,n)}" />`;break;case"phenomenon":o=`<polygon points="${qt(t,r,n)}" />`;break;default:return""}return`<clipPath id="${re(zr(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function _i(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 Wi(e,t){let r=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),n=Yi(e.object.type,r,t),o=e.fillColor&&Qi(e.fillColor)?e.fillColor:n.fill,i=Pr(e.object.properties.albedo),a=Pr(e.object.properties.temperature),s=qi(o,a,i,e.object.type),u=Ue(s,"#ffffff",.4)??n.stroke,d=Hi(e.object.properties.atmosphere),c=e.object.type==="star"?Br(Ue(s,"#fff2cb",.4)??s,.82):void 0;return{fill:s,stroke:u,glow:c,atmosphere:d,tail:e.object.type==="comet"?Br(Ue(s,"#ffffff",.5)??s,.72):void 0}}function Yi(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 Ui(t)}}function Ui(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 qi(e,t,r,n){let o=e;if(t!==null){let i=Xi(t,n);o=Ue(o,i,n==="star"?.42:.2)??o}if(r!==null){let i=Math.min(Math.max(r,0),1);o=Ue(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function Xi(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Hi(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 Gi(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 Pr(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function zr(e){return`${e.renderId}-clip`}function Nr(e,t,r){return`${e},${t-r} ${e+r},${t} ${e},${t+r} ${e-r},${t}`}function qt(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 Ki(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 Ji(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function St(e){return e.type==="structure"||e.type==="phenomenon"}function Ue(e,t,r){let n=Xt(e),o=Xt(t);if(!n||!o)return;let i=Math.min(Math.max(r,0),1);return Zi({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 Br(e,t){let r=Xt(e);return r?`rgba(${r.r}, ${r.g}, ${r.b}, ${t})`:e}function Xt(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 Zi(e){let t=r=>r.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Qi(e){return!!e.trim()}function U(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function re(e){return U(e)}var Me=180,Ae=120,_r=10;function Wr(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((Me-_r*2)/Math.max(n.width,1),(Ae-_r*2)/Math.max(n.height,1)),i=(Me-n.width*o)/2-n.minX*o,a=(Ae-n.height*o)/2-n.minY*o,s=jt(e,t),u=r.map(d=>{let c=d.x*o+i,f=d.y*o+a,b=Math.max(1.4,Math.min(d.visualRadius*o,5.2)),w=d.fillColor??ea(d.object.type);return`<circle cx="${J(c)}" cy="${J(f)}" r="${J(b)}" fill="${w}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Me}px;height:${Ae}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;">
|
|
87
|
+
<svg width="${Me}" height="${Ae}" viewBox="0 0 ${Me} ${Ae}" role="presentation" aria-hidden="true">
|
|
88
|
+
<rect x="0.5" y="0.5" width="${Me-1}" height="${Ae-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
89
89
|
<rect x="${J(n.minX*o+i)}" y="${J(n.minY*o+a)}" width="${J(n.width*o)}" height="${J(n.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
90
90
|
${u}
|
|
91
91
|
<rect x="${J(s.minX*o+i)}" y="${J(s.minY*o+a)}" width="${J(s.width*o)}" height="${J(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" />
|
|
92
92
|
</svg>
|
|
93
|
-
</div>`}function ea(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 J(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var ta=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function
|
|
93
|
+
</div>`}function ea(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 J(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var ta=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function Ur(e){return{objectId:e.objectId,title:e.objectId,typeLabel:aa(e.object.type),imageHref:e.renderObject.imageHref??null,description:oa(e),tags:na(e.object.properties.tags),fields:ra(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function qr(e,t){let r=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${ne(i)}</span>`).join("")}</div>`:"",n=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${ne(i.label)}</dt><dd>${ne(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="${ne(e.objectId)}">
|
|
94
94
|
<div class="wo-tooltip-head">
|
|
95
|
-
${e.imageHref?`<img class="wo-tooltip-image" src="${la(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${
|
|
95
|
+
${e.imageHref?`<img class="wo-tooltip-image" src="${la(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${ne(e.typeLabel.slice(0,1))}</div>`}
|
|
96
96
|
<div class="wo-tooltip-heading">
|
|
97
|
-
<strong>${
|
|
98
|
-
<span>${
|
|
97
|
+
<strong>${ne(e.title)}</strong>
|
|
98
|
+
<span>${ne(e.typeLabel)}</span>
|
|
99
99
|
</div>
|
|
100
100
|
</div>
|
|
101
|
-
${e.description?`<p class="wo-tooltip-description">${
|
|
101
|
+
${e.description?`<p class="wo-tooltip-description">${ne(e.description)}</p>`:""}
|
|
102
102
|
${r}
|
|
103
103
|
${n}
|
|
104
|
-
${o.length?`<p class="wo-tooltip-relations">${
|
|
105
|
-
</article>`}function ra(e){let t=new Map;for(let n of ta){let o=e.object.properties[n];o!==void 0&&t.set(n,{key:n,label:sa(n),value:_r(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 ${_r(r.distance)}`:`Free ${r.descriptor??"custom"}`}),[...t.values()]}function na(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function oa(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 _r(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):ia(e)}function ia(e){return`${e.value}${e.unit??""}`}function aa(e){return e.charAt(0).toUpperCase()+e.slice(1)}function sa(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function re(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function la(e){return re(e)}var Me={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Ur="worldorbit-viewer-tooltip-style";function de(e,t){if(fa(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??Me.minScale,maxScale:t.maxScale??Me.maxScale,fitPadding:t.fitPadding??Me.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??Me.panStep,zoomStep:t.zoomStep??Me.zoomStep,rotationStep:t.rotationStep??Me.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:q(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,u=e.style.position,d=ca(t),c=Ye(d,i),f={...ue},b=null,w=null,I=null,x=null,y=!1,v=null,A=null,C=0,P=!1,L=new Map,B=null,D=null,V=null,W=null,O=null,z=null;a===null&&(e.tabIndex=0),pa(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let X=l=>{if(!o.pointer||P)return;l.preventDefault(),e.focus();let p=nn(l.clientX,l.clientY),g=Ue(Math.exp(-l.deltaY*.002),.6,1.6);H(Se(c,f,g,p,n))},h=l=>{if(P)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 g=He(l.clientX,l.clientY);if(p){L.set(l.pointerId,g),L.size===2&&(B=Hr(c,f,L));return}v=l.pointerId,A=g,C=0,y=!1},j=l=>{if(P)return;if(l.pointerType==="touch"){if(!o.touch||!L.has(l.pointerId))return;if(L.set(l.pointerId,He(l.clientX,l.clientY)),L.size===2){B||(B=Hr(c,f,L));let S=Kr(L),Vt=S.distance/Math.max(B.startDistance,1),De=Se(c,B.startState,Vt,B.startCenter,n),Ft=S.center.x-B.startViewportCenter.x,Et=S.center.y-B.startViewportCenter.y;H(je(De,Ft,Et))}return}if(!o.pointer||v!==l.pointerId||!A)return;let g=He(l.clientX,l.clientY),E=g.x-A.x,T=g.y-A.y;C+=Math.abs(E)+Math.abs(T),A=g,C>2&&(y=!0),H(je(f,E,T))},N=l=>{if(l.pointerType==="touch"){L.delete(l.pointerId),L.size<2&&(B=null);return}v===l.pointerId&&(v=null,A=null)},fe=l=>{if(!o.selection||P)return;if(y){y=!1;return}let p=St(l.target);me(p),o.tooltipMode==="pinned"&&(V=p,Z())},we=l=>{let p=St(l.target);Ae(p)},$=()=>{Ae(null)},Y=l=>{let p=St(l.target);p&&Ae(p)},F=()=>{Ae(null)},xe=l=>{if(!o.keyboard||P)return;let p=St(l.target);if((l.key==="Enter"||l.key===" ")&&p){l.preventDefault(),me(p),o.tooltipMode==="pinned"&&(V=p,Z());return}switch(l.key){case"Escape":o.tooltipMode==="pinned"&&V&&(l.preventDefault(),V=null,Z());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",X,{passive:!1}),e.addEventListener("pointerdown",h),e.addEventListener("pointermove",j),e.addEventListener("pointerup",N),e.addEventListener("pointercancel",N),e.addEventListener("click",fe),e.addEventListener("mouseover",we),e.addEventListener("mouseleave",$),e.addEventListener("focusin",Y),e.addEventListener("focusout",F),e.addEventListener("keydown",xe);let M={setSource(l){d={kind:"source",value:l},c=Ye(d,i),z=null,pe(!0)},setDocument(l){d={kind:"document",value:l},c=Ye(d,i),z=null,pe(!0)},setScene(l){d={kind:"scene",value:l},c=l,z=null,pe(!0)},getScene(){return c},getRenderOptions(){return ua(i)},listViewpoints(){return c.viewpoints.slice()},getActiveViewpoint(){return At(z)},goToViewpoint(l){let p=At(l);if(!p)return!1;let g={},E=rt(p);if(p.preset!==null&&(g.preset=p.preset),d.kind!=="scene"&&p.projection!==c.projection&&(g.projection=p.projection),E&&(g.layers=E),z=p.id,Object.keys(g).length>0){let S=Xr(g);i=qr(i,g),d.kind!=="scene"&&S&&(c=Ye(d,i)),pe(S)}Dt(nt(p),!1,!1);let T=on(p);return H(T),me(p.selectedObjectId??p.objectId??null,!1),t.onSelectionChange?.(Ot()),t.onSelectionDetailsChange?.(oe(f.selectedObjectId)),Lt(),Ie(),!0},search(l,p=12){return Qe(c,l,p)},getFilter(){return i.filter?{...i.filter}:null},setFilter(l){Dt(l,!0,!0)},getVisibleObjects(){return Mt()},getFocusPath(l){return Qt(l)},getObjectDetails(l){return oe(l)},getSelectionDetails(){return oe(f.selectedObjectId)},getTooltipDetails(){return O},getAtlasState(){return nr(f,i,i.filter??null,z)},setAtlasState(l){let p=typeof l=="string"?tt(l):l;p.viewpointId&&M.goToViewpoint(p.viewpointId),M.setRenderOptions(p.renderOptions),Dt(p.filter??null,!1,!1),H(Xe({...f,...p.viewerState})),me(p.viewerState.selectedObjectId??null,!1),Lt(),t.onSelectionChange?.(Ot()),t.onSelectionDetailsChange?.(oe(f.selectedObjectId)),Ie()},serializeAtlasState(){return et(M.getAtlasState())},captureBookmark(l,p){return or(l,p,M.getAtlasState())},applyBookmark(l){return typeof l=="string"?(M.setAtlasState(l),!0):(M.setAtlasState(l.atlasState),!0)},setRenderOptions(l){let p=Xr(l);i=qr(i,l),d.kind!=="scene"&&p&&(c=Ye(d,i)),pe(p)},getState(){return{...f}},setState(l){H(Xe({...f,...l}))},zoomBy(l,p){H(Se(c,f,l,p??{x:c.width/2,y:c.height/2},n))},panBy(l,p){H(je(f,l,p))},rotateBy(l){H(wt(f,l))},fitToSystem(){H(be(c,f,n))},focusObject(l){z=null,H(xt(c,f,l,n)),me(l),o.tooltipMode==="pinned"&&(V=_(l)?.objectId??null,Z())},pinTooltip(l){V=_(l)?.objectId??null,Z()},resetView(){let l=be(c,{...ue},n);z=null,H(l),me(null),V=null,Z()},exportSvg(){return K(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){P||(P=!0,e.removeEventListener("wheel",X),e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",j),e.removeEventListener("pointerup",N),e.removeEventListener("pointercancel",N),e.removeEventListener("click",fe),e.removeEventListener("mouseover",we),e.removeEventListener("mouseleave",$),e.removeEventListener("focusin",Y),e.removeEventListener("focusout",F),e.removeEventListener("keydown",xe),x?.remove(),x=null,I?.remove(),I=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=s,e.style.position=u,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return pe(!0),t.initialViewpointId?M.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?M.focusObject(t.initialSelectionObjectId):Ie(),M;function pe(l){if(e.innerHTML=K(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),b=e.querySelector('[data-worldorbit-svg="true"]'),w=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",fn),e.append(x)),!b||!w)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=l?be(c,{...ue},n):Xe(f),me(f.selectedObjectId&&_(f.selectedObjectId)?f.selectedObjectId:null,!1),Ae(D&&_(D)?D:null,!1),V=V&&_(V)?V:null,Gt(),an(),Lt(),t.onViewChange?.({...f}),Ie()}function H(l){f=Xe(l),Gt(),t.onViewChange?.({...f}),Ie()}function Xe(l){return{scale:Ue(l.scale,n.minScale,n.maxScale),rotationDeg:Gr(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 Gt(){w&&(w.setAttribute("transform",It(c,f)),sn(),Z())}function me(l,p=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${qe(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:l&&_(l)?l:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${qe(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),Kt(),Z(),p&&(t.onSelectionChange?.(Ot()),t.onSelectionDetailsChange?.(oe(f.selectedObjectId)),t.onViewChange?.({...f}),Ie())}function Ae(l,p=!0){D===l&&p||(D=l&&_(l)?l:null,Kt(),Z(),p&&(t.onHoverChange?.(_(D)),t.onHoverDetailsChange?.(oe(D))))}function Ot(){return _(f.selectedObjectId)}function _(l){if(!l)return null;let p=Zt();return c.objects.find(g=>g.objectId===l&&!g.hidden&&p.has(g.objectId))??null}function oe(l){let p=_(l);return p?{objectId:p.objectId,object:p.object,renderObject:p,label:c.labels.find(g=>g.objectId===p.objectId&&!g.hidden)??null,group:c.groups.find(g=>g.renderId===p.groupId)??null,orbit:c.orbitVisuals.find(g=>g.objectId===p.objectId&&!g.hidden)??null,relatedOrbits:c.orbitVisuals.filter(g=>!g.hidden&&(g.objectId===p.objectId||p.ancestorIds.includes(g.objectId)||p.childIds.includes(g.objectId))),parent:_(p.parentId),children:p.childIds.map(g=>_(g)).filter(Boolean),ancestors:p.ancestorIds.map(g=>_(g)).filter(Boolean),focusPath:Qt(p.objectId)}:null}function Kt(){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");Jt(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Jt(D,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Jt(l,p){let g=oe(l);if(!g)return;let E=new Set([g.objectId,...g.renderObject.childIds,...g.renderObject.ancestorIds]);for(let T of E)for(let S of e.querySelectorAll(`[data-object-id="${qe(T)}"]`))S.classList.add(p.objectClass);for(let T of g.ancestors)for(let S of e.querySelectorAll(`[data-object-id="${qe(T.objectId)}"]`))S.classList.add(p.ancestorClass);for(let T of g.relatedOrbits)for(let S of e.querySelectorAll(`[data-orbit-object-id="${qe(T.objectId)}"]`))S.classList.add(p.orbitClass)}function He(l,p){if(!b)return{x:c.width/2,y:c.height/2};let g=b.getBoundingClientRect();return!g.width||!g.height?{x:c.width/2,y:c.height/2}:{x:(l-g.left)/g.width*c.width,y:(p-g.top)/g.height*c.height}}function nn(l,p){return ke(c,f,He(l,p))}function Zt(){return Ze(c,i.filter??null)}function Mt(){let l=Zt();return c.objects.filter(p=>!p.hidden&&l.has(p.objectId))}function Qt(l){let p=c.objects.find(g=>g.objectId===l&&!g.hidden);return p?[...p.ancestorIds,p.objectId].map(g=>_(g)).filter(Boolean):[]}function At(l){return c.viewpoints.find(p=>p.id===l)??null}function on(l){let p=Gr(l.rotationDeg),g=l.scale!==null&&l.scale!==void 0?Ue(l.scale,n.minScale,n.maxScale):null,E=l.objectId&&c.objects.find(S=>S.objectId===l.objectId&&!S.hidden);if(E)return er({x:E.x,y:E.y},g??Math.max(1.8,ue.scale),p,l.selectedObjectId??E.objectId);let T=be(c,{...ue,rotationDeg:p},n);return g===null?{...T,rotationDeg:p,selectedObjectId:l.selectedObjectId??null}:er({x:c.contentBounds.centerX,y:c.contentBounds.centerY},g,p,l.selectedObjectId??null)}function er(l,p,g,E){let T={x:c.width/2,y:c.height/2},S=ne(l,T,g);return{scale:p,rotationDeg:g,translateX:T.x-(T.x+(S.x-T.x)*p),translateY:T.y-(T.y+(S.y-T.y)*p),selectedObjectId:E}}function Dt(l,p,g){i={...i,filter:q(l)},g&&(z=null),pe(!1)}function an(){t.onFilterChange?.(i.filter??null,Mt())}function Lt(){t.onViewpointChange?.(At(z))}function Ie(){t.onAtlasStateChange?.(M.getAtlasState())}function sn(){!o.minimap||!I||(I.innerHTML=Nr(c,f,Mt()))}function Z(){if(o.tooltipMode==="disabled"||!x){Ge(null);return}let l=ln();if(!l){x.hidden=!0,x.innerHTML="",x.removeAttribute("data-mode"),Ge(null);return}let p=oe(l.objectId);if(!p){x.hidden=!0,x.innerHTML="",x.removeAttribute("data-mode"),Ge(null);return}let g=Wr(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",cn(x,g,l.mode),un(x,p.renderObject),x.style.visibility="visible",Ge(g)}function ln(){return V&&_(V)?{objectId:V,mode:"pinned"}:D&&_(D)?{objectId:D,mode:"hover"}:null}function cn(l,p,g){let E=t.tooltipRenderer?.(p,g);l.innerHTML="",typeof E=="string"?l.innerHTML=E:E instanceof HTMLElement?l.append(E):l.innerHTML=Yr(p,g);let T=document.createElement("div");if(T.className="wo-tooltip-actions",g==="pinned"){let S=document.createElement("button");S.type="button",S.className="wo-tooltip-action",S.dataset.tooltipAction="unpin",S.textContent="Unpin",T.append(S)}else{let S=document.createElement("button");S.type="button",S.className="wo-tooltip-action",S.dataset.tooltipAction="pin",S.dataset.objectId=p.objectId,S.textContent="Pin",T.append(S)}T.childElementCount>0&&l.append(T)}function un(l,p){if(!b)return;let g={x:p.anchorX??p.x,y:p.anchorY??p.y-Math.max(p.visualRadius,p.radius)},E=dn(g),T=b.getBoundingClientRect(),S=e.getBoundingClientRect(),Vt=T.left-S.left+E.x/Math.max(c.width,1)*T.width,De=T.top-S.top+E.y/Math.max(c.height,1)*T.height,Ft=Math.max(e.clientWidth-l.offsetWidth-12,12),Et=Math.max(e.clientHeight-l.offsetHeight-12,12),pn=De>e.clientHeight*.48,mn=Ue(Vt+18,12,Ft),hn=Ue(pn?De-l.offsetHeight-18:De+18,12,Et);l.style.left=`${mn}px`,l.style.top=`${hn}px`}function dn(l){let p={x:c.width/2,y:c.height/2},g=ne(l,p,f.rotationDeg);return{x:p.x+(g.x-p.x)*f.scale+f.translateX,y:p.y+(g.y-p.y)*f.scale+f.translateY}}function fn(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}Z()}}function Ge(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 ca(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 Ye(e,t){switch(e.kind){case"scene":return e.value;case"document":return ee(e.value,t);case"source":{let r=ce(e.value);return ee(r.document,da(r,t))}}}function ua(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 qr(e,t){return{...e,...t,filter:t.filter!==void 0?q(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 Xr(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 da(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function Hr(e,t,r){let{center:n,distance:o}=Kr(r);return{startState:{...t},startCenter:ke(e,t,n),startViewportCenter:n,startDistance:o}}function Kr(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 St(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function fa(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 Ue(e,t,r){return Math.min(Math.max(e,t),r)}function Gr(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function qe(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function pa(){if(typeof document>"u"||document.getElementById(Ur))return;let e=document.createElement("style");e.id=Ur,e.textContent=`
|
|
104
|
+
${o.length?`<p class="wo-tooltip-relations">${ne(o.join(" - "))}</p>`:""}
|
|
105
|
+
</article>`}function ra(e){let t=new Map;for(let n of ta){let o=e.object.properties[n];o!==void 0&&t.set(n,{key:n,label:sa(n),value:Yr(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 ${Yr(r.distance)}`:`Free ${r.descriptor??"custom"}`}),[...t.values()]}function na(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function oa(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 Yr(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):ia(e)}function ia(e){return`${e.value}${e.unit??""}`}function aa(e){return e.charAt(0).toUpperCase()+e.slice(1)}function sa(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function ne(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function la(e){return ne(e)}var De={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Xr="worldorbit-viewer-tooltip-style";function fe(e,t){if(fa(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??De.minScale,maxScale:t.maxScale??De.maxScale,fitPadding:t.fitPadding??De.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??De.panStep,zoomStep:t.zoomStep??De.zoomStep,rotationStep:t.rotationStep??De.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:X(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,u=e.style.position,d=ca(t),c=qe(d,i),f={...de},b=null,w=null,I=null,x=null,y=!1,v=null,A=null,L=0,P=!1,D=new Map,B=null,V=null,F=null,W=null,O=null,z=null;a===null&&(e.tabIndex=0),pa(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let H=l=>{if(!o.pointer||P)return;l.preventDefault(),e.focus();let p=an(l.clientX,l.clientY),g=Xe(Math.exp(-l.deltaY*.002),.6,1.6);q(Te(c,f,g,p,n))},h=l=>{if(P)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 g=Ke(l.clientX,l.clientY);if(p){D.set(l.pointerId,g),D.size===2?B=Kr(c,f,D):D.size===1&&(L=0,y=!1);return}v=l.pointerId,A=g,L=0,y=!1},j=l=>{if(P)return;if(l.pointerType==="touch"){if(!o.touch||!D.has(l.pointerId))return;let k=D.get(l.pointerId),Ve=Ke(l.clientX,l.clientY);if(D.set(l.pointerId,Ve),D.size===2){B||(B=Kr(c,f,D));let Q=Zr(D),je=Q.distance/Math.max(B.startDistance,1),Et=Te(c,B.startState,je,B.startCenter,n),Ct=Q.center.x-B.startViewportCenter.x,Pt=Q.center.y-B.startViewportCenter.y;q(ge(Et,Ct,Pt))}else if(D.size===1){let Q=Ve.x-k.x,je=Ve.y-k.y;L+=Math.abs(Q)+Math.abs(je),L>2&&(y=!0),q(ge(f,Q,je))}return}if(!o.pointer||v!==l.pointerId||!A)return;let g=Ke(l.clientX,l.clientY),C=g.x-A.x,T=g.y-A.y;L+=Math.abs(C)+Math.abs(T),A=g,L>2&&(y=!0),q(ge(f,C,T))},N=l=>{if(l.pointerType==="touch"){D.delete(l.pointerId),D.size<2&&(B=null);return}v===l.pointerId&&(v=null,A=null)},pe=l=>{if(!o.selection||P)return;if(y){y=!1;return}let p=Tt(l.target);he(p),o.tooltipMode==="pinned"&&(F=p,Z())},Ie=l=>{let p=Tt(l.target);Le(p)},$=()=>{Le(null)},Y=l=>{let p=Tt(l.target);p&&Le(p)},E=()=>{Le(null)},ve=l=>{if(!o.keyboard||P)return;let p=Tt(l.target);if((l.key==="Enter"||l.key===" ")&&p){l.preventDefault(),he(p),o.tooltipMode==="pinned"&&(F=p,Z());return}switch(l.key){case"Escape":o.tooltipMode==="pinned"&&F&&(l.preventDefault(),F=null,Z());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",H,{passive:!1}),e.addEventListener("pointerdown",h),e.addEventListener("pointermove",j),e.addEventListener("pointerup",N),e.addEventListener("pointercancel",N),e.addEventListener("click",pe),e.addEventListener("mouseover",Ie),e.addEventListener("mouseleave",$),e.addEventListener("focusin",Y),e.addEventListener("focusout",E),e.addEventListener("keydown",ve);let M={setSource(l){d={kind:"source",value:l},c=qe(d,i),z=null,me(!0)},setDocument(l){d={kind:"document",value:l},c=qe(d,i),z=null,me(!0)},setScene(l){d={kind:"scene",value:l},c=l,z=null,me(!0)},getScene(){return c},getRenderOptions(){return ua(i)},listViewpoints(){return c.viewpoints.slice()},getActiveViewpoint(){return Lt(z)},goToViewpoint(l){let p=Lt(l);if(!p)return!1;let g={},C=ot(p);if(p.preset!==null&&(g.preset=p.preset),d.kind!=="scene"&&p.projection!==c.projection&&(g.projection=p.projection),C&&(g.layers=C),z=p.id,Object.keys(g).length>0){let k=Gr(g);i=Hr(i,g),d.kind!=="scene"&&k&&(c=qe(d,i)),me(k)}Vt(it(p),!1,!1);let T=sn(p);return q(T),he(p.selectedObjectId??p.objectId??null,!1),t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(ie(f.selectedObjectId)),Ft(),$e(),!0},search(l,p=12){return tt(c,l,p)},getFilter(){return i.filter?{...i.filter}:null},setFilter(l){Vt(l,!0,!0)},getVisibleObjects(){return Dt()},getFocusPath(l){return tr(l)},getObjectDetails(l){return ie(l)},getSelectionDetails(){return ie(f.selectedObjectId)},getTooltipDetails(){return O},getAtlasState(){return ir(f,i,i.filter??null,z)},setAtlasState(l){let p=typeof l=="string"?nt(l):l;p.viewpointId&&M.goToViewpoint(p.viewpointId),M.setRenderOptions(p.renderOptions),Vt(p.filter??null,!1,!1),q(Ge({...f,...p.viewerState})),he(p.viewerState.selectedObjectId??null,!1),Ft(),t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(ie(f.selectedObjectId)),$e()},serializeAtlasState(){return rt(M.getAtlasState())},captureBookmark(l,p){return ar(l,p,M.getAtlasState())},applyBookmark(l){return typeof l=="string"?(M.setAtlasState(l),!0):(M.setAtlasState(l.atlasState),!0)},setRenderOptions(l){let p=Gr(l);i=Hr(i,l),d.kind!=="scene"&&p&&(c=qe(d,i)),me(p)},getState(){return{...f}},setState(l){q(Ge({...f,...l}))},zoomBy(l,p){q(Te(c,f,l,p??{x:c.width/2,y:c.height/2},n))},panBy(l,p){q(ge(f,l,p))},rotateBy(l){q(It(f,l))},fitToSystem(){q(ye(c,f,n))},focusObject(l){z=null,q(vt(c,f,l,n)),he(l),o.tooltipMode==="pinned"&&(F=_(l)?.objectId??null,Z())},pinTooltip(l){F=_(l)?.objectId??null,Z()},resetView(){let l=ye(c,{...de},n);z=null,q(l),he(null),F=null,Z()},exportSvg(){return K(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){P||(P=!0,e.removeEventListener("wheel",H),e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",j),e.removeEventListener("pointerup",N),e.removeEventListener("pointercancel",N),e.removeEventListener("click",pe),e.removeEventListener("mouseover",Ie),e.removeEventListener("mouseleave",$),e.removeEventListener("focusin",Y),e.removeEventListener("focusout",E),e.removeEventListener("keydown",ve),x?.remove(),x=null,I?.remove(),I=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=s,e.style.position=u,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return me(!0),t.initialViewpointId?M.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?M.focusObject(t.initialSelectionObjectId):$e(),M;function me(l){if(e.innerHTML=K(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),b=e.querySelector('[data-worldorbit-svg="true"]'),w=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",mn),e.append(x)),!b||!w)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=l?ye(c,{...de},n):Ge(f),he(f.selectedObjectId&&_(f.selectedObjectId)?f.selectedObjectId:null,!1),Le(V&&_(V)?V:null,!1),F=F&&_(F)?F:null,Jt(),ln(),Ft(),t.onViewChange?.({...f}),$e()}function q(l){f=Ge(l),Jt(),t.onViewChange?.({...f}),$e()}function Ge(l){return{scale:Xe(l.scale,n.minScale,n.maxScale),rotationDeg:Jr(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 Jt(){w&&(w.setAttribute("transform",$t(c,f)),cn(),Z())}function he(l,p=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${He(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:l&&_(l)?l:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${He(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),Zt(),Z(),p&&(t.onSelectionChange?.(At()),t.onSelectionDetailsChange?.(ie(f.selectedObjectId)),t.onViewChange?.({...f}),$e())}function Le(l,p=!0){V===l&&p||(V=l&&_(l)?l:null,Zt(),Z(),p&&(t.onHoverChange?.(_(V)),t.onHoverDetailsChange?.(ie(V))))}function At(){return _(f.selectedObjectId)}function _(l){if(!l)return null;let p=er();return c.objects.find(g=>g.objectId===l&&!g.hidden&&p.has(g.objectId))??null}function ie(l){let p=_(l);return p?{objectId:p.objectId,object:p.object,renderObject:p,label:c.labels.find(g=>g.objectId===p.objectId&&!g.hidden)??null,group:c.groups.find(g=>g.renderId===p.groupId)??null,orbit:c.orbitVisuals.find(g=>g.objectId===p.objectId&&!g.hidden)??null,relatedOrbits:c.orbitVisuals.filter(g=>!g.hidden&&(g.objectId===p.objectId||p.ancestorIds.includes(g.objectId)||p.childIds.includes(g.objectId))),parent:_(p.parentId),children:p.childIds.map(g=>_(g)).filter(Boolean),ancestors:p.ancestorIds.map(g=>_(g)).filter(Boolean),focusPath:tr(p.objectId)}:null}function Zt(){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");Qt(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Qt(V,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Qt(l,p){let g=ie(l);if(!g)return;let C=new Set([g.objectId,...g.renderObject.childIds,...g.renderObject.ancestorIds]);for(let T of C)for(let k of e.querySelectorAll(`[data-object-id="${He(T)}"]`))k.classList.add(p.objectClass);for(let T of g.ancestors)for(let k of e.querySelectorAll(`[data-object-id="${He(T.objectId)}"]`))k.classList.add(p.ancestorClass);for(let T of g.relatedOrbits)for(let k of e.querySelectorAll(`[data-orbit-object-id="${He(T.objectId)}"]`))k.classList.add(p.orbitClass)}function Ke(l,p){if(!b)return{x:c.width/2,y:c.height/2};let g=b.getBoundingClientRect();return!g.width||!g.height?{x:c.width/2,y:c.height/2}:{x:(l-g.left)/g.width*c.width,y:(p-g.top)/g.height*c.height}}function an(l,p){return Oe(c,f,Ke(l,p))}function er(){return et(c,i.filter??null)}function Dt(){let l=er();return c.objects.filter(p=>!p.hidden&&l.has(p.objectId))}function tr(l){let p=c.objects.find(g=>g.objectId===l&&!g.hidden);return p?[...p.ancestorIds,p.objectId].map(g=>_(g)).filter(Boolean):[]}function Lt(l){return c.viewpoints.find(p=>p.id===l)??null}function sn(l){let p=Jr(l.rotationDeg),g=l.scale!==null&&l.scale!==void 0?Xe(l.scale,n.minScale,n.maxScale):null,C=l.objectId&&c.objects.find(k=>k.objectId===l.objectId&&!k.hidden);if(C)return rr({x:C.x,y:C.y},g??Math.max(1.8,de.scale),p,l.selectedObjectId??C.objectId);let T=ye(c,{...de,rotationDeg:p},n);return g===null?{...T,rotationDeg:p,selectedObjectId:l.selectedObjectId??null}:rr({x:c.contentBounds.centerX,y:c.contentBounds.centerY},g,p,l.selectedObjectId??null)}function rr(l,p,g,C){let T={x:c.width/2,y:c.height/2},k=oe(l,T,g);return{scale:p,rotationDeg:g,translateX:T.x-(T.x+(k.x-T.x)*p),translateY:T.y-(T.y+(k.y-T.y)*p),selectedObjectId:C}}function Vt(l,p,g){i={...i,filter:X(l)},g&&(z=null),me(!1)}function ln(){t.onFilterChange?.(i.filter??null,Dt())}function Ft(){t.onViewpointChange?.(Lt(z))}function $e(){t.onAtlasStateChange?.(M.getAtlasState())}function cn(){!o.minimap||!I||(I.innerHTML=Wr(c,f,Dt()))}function Z(){if(o.tooltipMode==="disabled"||!x){Je(null);return}let l=un();if(!l){x.hidden=!0,x.innerHTML="",x.removeAttribute("data-mode"),Je(null);return}let p=ie(l.objectId);if(!p){x.hidden=!0,x.innerHTML="",x.removeAttribute("data-mode"),Je(null);return}let g=Ur(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",dn(x,g,l.mode),fn(x,p.renderObject),x.style.visibility="visible",Je(g)}function un(){return F&&_(F)?{objectId:F,mode:"pinned"}:V&&_(V)?{objectId:V,mode:"hover"}:null}function dn(l,p,g){let C=t.tooltipRenderer?.(p,g);l.innerHTML="",typeof C=="string"?l.innerHTML=C:C instanceof HTMLElement?l.append(C):l.innerHTML=qr(p,g);let T=document.createElement("div");if(T.className="wo-tooltip-actions",g==="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 fn(l,p){if(!b)return;let g={x:p.anchorX??p.x,y:p.anchorY??p.y-Math.max(p.visualRadius,p.radius)},C=pn(g),T=b.getBoundingClientRect(),k=e.getBoundingClientRect(),Ve=T.left-k.left+C.x/Math.max(c.width,1)*T.width,Q=T.top-k.top+C.y/Math.max(c.height,1)*T.height,je=Math.max(e.clientWidth-l.offsetWidth-12,12),Et=Math.max(e.clientHeight-l.offsetHeight-12,12),Ct=Q>e.clientHeight*.48,Pt=Xe(Ve+18,12,je),hn=Xe(Ct?Q-l.offsetHeight-18:Q+18,12,Et);l.style.left=`${Pt}px`,l.style.top=`${hn}px`}function pn(l){let p={x:c.width/2,y:c.height/2},g=oe(l,p,f.rotationDeg);return{x:p.x+(g.x-p.x)*f.scale+f.translateX,y:p.y+(g.y-p.y)*f.scale+f.translateY}}function mn(l){let p=l.target?.closest("[data-tooltip-action]");if(p){switch(l.preventDefault(),l.stopPropagation(),p.dataset.tooltipAction){case"pin":F=p.dataset.objectId??W;break;case"unpin":F=null;break}Z()}}function Je(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 ca(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 qe(e,t){switch(e.kind){case"scene":return e.value;case"document":return te(e.value,t);case"source":{let r=ue(e.value);return te(r.document,da(r,t))}}}function ua(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 Hr(e,t){return{...e,...t,filter:t.filter!==void 0?X(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 Gr(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 da(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function Kr(e,t,r){let{center:n,distance:o}=Zr(r);return{startState:{...t},startCenter:Oe(e,t,n),startViewportCenter:n,startDistance:o}}function Zr(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 Tt(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function fa(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 Xe(e,t,r){return Math.min(Math.max(e,t),r)}function Jr(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function He(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function pa(){if(typeof document>"u"||document.getElementById(Xr))return;let e=document.createElement("style");e.id=Xr,e.textContent=`
|
|
106
106
|
.wo-viewer-tooltip-root {
|
|
107
107
|
position: absolute;
|
|
108
108
|
z-index: 12;
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
padding: 6px 12px;
|
|
169
169
|
font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
170
170
|
}
|
|
171
|
-
`,document.head.append(e)}var ma="[data-worldorbit-embed]";function
|
|
171
|
+
`,document.head.append(e)}var ma="[data-worldorbit-embed]";function Gt(e){return encodeURIComponent(JSON.stringify(e))}function Kt(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 Qr(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 en(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=K(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="${Ot(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Ot(r.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Ot(r.options?.initialViewpointId??"")}" data-worldorbit-payload="${Ot(Gt(r))}">${n}</div>`}function tn(e=document,t={}){let r=new Map,n=[...e.querySelectorAll(ma)];for(let o of n){let i=ha(o),a=t.mode??i.mode,s=t.theme??i.options?.theme,u=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,b=t.viewer?.initialViewpointId??i.options?.initialViewpointId,w=t.viewer?.initialSelectionObjectId??i.options?.initialSelectionObjectId,I=t.viewer?.minimap??i.options?.minimap;if(a==="interactive"){let x=fe(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:u,subtitle:d,initialFilter:f,initialViewpointId:b,initialSelectionObjectId:w,minimap:I});i.options?.atlasState&&x.setAtlasState(i.options.atlasState),r.set(o,x),t.onMount?.(x,o)}else o.innerHTML=K(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:u,filter:f,selectedObjectId:w??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 ha(e){let t=e.dataset.worldorbitPayload;if(!t)throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");return Kt(t)}function Ot(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}var rn="worldorbit-atlas-viewer-style";function Mt(e,t){if(typeof document>"u")throw new Error("Atlas viewer requires a browser environment.");ga();let r={search:t.controls?.search??!0,typeFilter:t.controls?.typeFilter??!0,viewpointSelect:t.controls?.viewpointSelect??!0,inspector:t.controls?.inspector??!0,bookmarks:t.controls?.bookmarks??!0};e.classList.add("wo-atlas-viewer"),e.innerHTML=ba(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-viewpoint]"),s=e.querySelector("[data-atlas-bookmark]"),u=e.querySelector("[data-atlas-bookmarks]"),d=e.querySelector("[data-atlas-results]"),c=e.querySelector("[data-atlas-inspector]"),f=e.querySelector("[data-atlas-stage]");if(!f)throw new Error("Atlas viewer failed to initialize its stage container.");let b=X(t.initialFilter??null),w=t.initialQuery?.trim()??b?.query??"",I=t.initialObjectType??(b?.objectTypes?.length===1?b.objectTypes[0]:null),x=[],y;y=fe(f,{...t,initialFilter:null,onSelectionChange(h){y&&O(),t.onSelectionChange?.(h)},onSelectionDetailsChange(h){y&&O(),t.onSelectionDetailsChange?.(h)},onFilterChange(h,j){y&&(B(h),W(),O()),t.onFilterChange?.(h,j)},onViewpointChange(h){y&&(F(),O()),t.onViewpointChange?.(h)},onAtlasStateChange(h){y&&O(),t.onAtlasStateChange?.(h)},onViewChange(h){y&&O(),t.onViewChange?.(h)}}),P(),V(),B(y.getFilter()),H(),W(),O(),o?.addEventListener("input",()=>{w=o.value.trim(),P()}),i?.addEventListener("change",()=>{I=i.value||null,P()}),a?.addEventListener("change",()=>{let h=v();if(!a.value){h.resetView(),P();return}h.goToViewpoint(a.value),O()}),s?.addEventListener("click",()=>{let h=v(),j=h.getActiveViewpoint()?.label??h.getSelectionDetails()?.objectId??`Bookmark ${x.length+1}`;x=[...x,h.captureBookmark(j,j)],H(),O()}),u?.addEventListener("click",h=>{let j=h.target?.closest("[data-bookmark-id]");if(!j)return;let N=x.find(Ie=>Ie.id===j.dataset.bookmarkId);if(!N)return;let pe=v();pe.applyBookmark(N),B(pe.getFilter()),W(),O()}),d?.addEventListener("click",h=>{let j=h.target?.closest("[data-object-id]");j&&(v().focusObject(j.dataset.objectId??""),O())});function v(){if(!y)throw new Error("Atlas viewer is not initialized.");return y}return{element:e,get viewer(){return v()},getViewer(){return v()},setSource(h){v().setSource(h),L()},setDocument(h){v().setDocument(h),L()},setScene(h){v().setScene(h),L()},getAtlasState(){return v().getAtlasState()},setAtlasState(h){let j=v();j.setAtlasState(h),B(j.getFilter()),W(),O()},getInspectorSnapshot(){return z()},getSearchQuery(){return w},setSearchQuery(h){w=h.trim(),o&&(o.value=w),P()},getObjectTypeFilter(){return I},setObjectTypeFilter(h){I=h,i&&(i.value=h??""),P()},listSearchResults(h=6){return v().search(w,h)},listBookmarks(){return x.map(nn)},captureBookmark(h,j){let N=v().captureBookmark(h,j);return x=[...x,N],H(),O(),nn(N)},applyBookmark(h){let j=v(),N=j.applyBookmark(h);return N&&(B(j.getFilter()),W(),O()),N},goToViewpoint(h){let j=v().goToViewpoint(h);return j&&O(),j},exportSvg(){return v().exportSvg()},destroy(){v().destroy(),e.innerHTML="",e.classList.remove("wo-atlas-viewer")}};function L(){V(),P(),H(),W(),O()}function P(){v().setFilter(D()),V(),W(),O()}function D(){return X({query:w||void 0,objectTypes:I?[I]:void 0,tags:b?.tags,groupIds:b?.groupIds,includeAncestors:b?.includeAncestors??!0})}function B(h){w=h?.query?.trim()??"",I=h?.objectTypes?.length===1?h.objectTypes[0]:null,o&&document.activeElement!==o&&(o.value=w),i&&(i.value=I??"")}function V(){if(!a)return;let h=v(),j=h.getActiveViewpoint()?.id??"";a.innerHTML=['<option value="">Scene default</option>',...h.listViewpoints().map(N=>`<option value="${xe(N.id)}">${xe(N.label)}</option>`)].join(""),a.value=j}function F(){a&&(a.value=v().getActiveViewpoint()?.id??"")}function W(){if(!d)return;let h=v().search(w,6);d.innerHTML=h.map(j=>`<button type="button" class="wo-atlas-pill" data-object-id="${xe(j.objectId)}">${xe(j.objectId)} - ${xe(j.type)}</button>`).join("")}function O(){let h=z();c&&(c.textContent=JSON.stringify(h,null,2)),t.onInspectorChange?.(h)}function z(){let h=v();return{selection:h.getSelectionDetails(),activeViewpoint:h.getActiveViewpoint(),filter:h.getFilter(),atlasState:h.getAtlasState(),visibleObjectIds:h.getVisibleObjects().map(j=>j.objectId),scene:{title:h.getScene().title,projection:h.getScene().projection,renderPreset:h.getScene().renderPreset,groupCount:h.getScene().groups.length,viewpointCount:h.getScene().viewpoints.length}}}function H(){u&&(u.innerHTML=x.map(h=>`<button type="button" class="wo-atlas-pill" data-bookmark-id="${xe(h.id)}">${xe(h.label)}</button>`).join(""))}}function ba(e){let t=[e.search?`<label class="wo-atlas-field">
|
|
172
172
|
<span>Search</span>
|
|
173
173
|
<input data-atlas-search type="text" placeholder="Search objects, tags, or types" />
|
|
174
174
|
</label>`:"",e.typeFilter?`<label class="wo-atlas-field">
|
|
@@ -200,7 +200,7 @@
|
|
|
200
200
|
<div class="wo-atlas-results" data-atlas-results></div>
|
|
201
201
|
${e.bookmarks?'<div class="wo-atlas-bookmarks" data-atlas-bookmarks></div>':""}
|
|
202
202
|
</div>
|
|
203
|
-
</section>`}function ga(){if(document.getElementById(
|
|
203
|
+
</section>`}function ga(){if(document.getElementById(rn))return;let e=document.createElement("style");e.id=rn,e.textContent=`
|
|
204
204
|
.wo-atlas-shell { display: grid; gap: 16px; min-width: 0; }
|
|
205
205
|
.wo-atlas-toolbar { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; }
|
|
206
206
|
.wo-atlas-workspace { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); }
|
|
@@ -234,4 +234,4 @@
|
|
|
234
234
|
.wo-atlas-workspace { grid-template-columns: 1fr; }
|
|
235
235
|
.wo-atlas-inspector { min-height: 220px; }
|
|
236
236
|
}
|
|
237
|
-
`,document.head.append(e)}function
|
|
237
|
+
`,document.head.append(e)}function nn(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 xe(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function on(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=ya(n),a=te(i),s=this.getAttribute("theme")??void 0;if(o==="static"){this.innerHTML=K(a,{theme:s});return}if(o==="atlas"){this.viewer=Mt(this,{scene:a,theme:s});return}this.viewer=fe(this,{scene:a,theme:s})}}customElements.define(e,t)}function ya(e){return ue(e).document}return In(wa);})();
|