worldorbit 2.5.17 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -15
- package/dist/browser/core/dist/index.js +502 -61
- package/dist/browser/editor/dist/index.js +619 -71
- package/dist/browser/markdown/dist/index.js +464 -51
- package/dist/browser/viewer/dist/index.js +495 -62
- package/dist/unpkg/core/dist/index.js +502 -61
- package/dist/unpkg/editor/dist/index.js +619 -71
- package/dist/unpkg/markdown/dist/index.js +464 -51
- package/dist/unpkg/viewer/dist/index.js +495 -62
- package/dist/unpkg/worldorbit-core.min.js +12 -12
- package/dist/unpkg/worldorbit-editor.min.js +208 -198
- package/dist/unpkg/worldorbit-markdown.min.js +38 -38
- package/dist/unpkg/worldorbit-viewer.min.js +56 -56
- package/dist/unpkg/worldorbit.js +533 -72
- package/dist/unpkg/worldorbit.min.js +60 -60
- package/package.json +1 -1
- package/packages/core/dist/atlas-edit.js +1 -1
- package/packages/core/dist/atlas-validate.js +99 -10
- package/packages/core/dist/draft-parse.js +190 -15
- package/packages/core/dist/draft.js +50 -11
- package/packages/core/dist/format.js +36 -5
- package/packages/core/dist/load.js +9 -2
- package/packages/core/dist/scene.js +158 -24
- package/packages/core/dist/types.d.ts +19 -2
- package/packages/editor/dist/editor.js +105 -4
- package/packages/viewer/dist/atlas-state.js +5 -2
- package/packages/viewer/dist/atlas-viewer.js +19 -8
- package/packages/viewer/dist/types.d.ts +5 -2
- package/packages/viewer/dist/viewer.js +16 -0
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
"use strict";var WorldOrbitViewer=(()=>{var Qt=Object.defineProperty;var Kr=Object.getOwnPropertyDescriptor;var Zr=Object.getOwnPropertyNames;var Jr=Object.prototype.hasOwnProperty;var Qr=(e,t)=>{for(var n in t)Qt(e,n,{get:t[n],enumerable:!0})},eo=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Zr(t))!Jr.call(e,o)&&o!==n&&Qt(e,o,{get:()=>t[o],enumerable:!(r=Kr(t,o))||r.enumerable});return e};var to=e=>eo(Qt({},"__esModule",{value:!0}),e);var el={};Qr(el,{DEFAULT_VIEWER_STATE:()=>$e,WORLD_LAYER_ID:()=>zt,clampScale:()=>ot,composeViewerTransform:()=>Rt,createAtlasViewer:()=>Wt,createEmbedPayload:()=>Fr,createInteractiveViewer:()=>Ie,createWorldOrbitEmbedMarkup:()=>Pr,defineWorldOrbitViewerElement:()=>Br,deserializeViewerAtlasState:()=>bt,deserializeWorldOrbitEmbedPayload:()=>hn,fitViewerState:()=>Se,focusViewerState:()=>Ct,getSceneCenter:()=>Oe,getThemePreset:()=>$n,getViewerVisibleBounds:()=>Bt,invertViewerPoint:()=>Ce,mountWorldOrbitEmbeds:()=>Vr,normalizeRotation:()=>un,normalizeViewerFilter:()=>te,panViewerState:()=>je,renderDocumentToSvg:()=>pn,renderSceneToSvg:()=>ae,renderSourceToSvg:()=>vr,resolveLayers:()=>pt,resolveTheme:()=>ft,rotateViewerState:()=>Vt,sceneViewpointToLayerOptions:()=>yt,searchSceneObjects:()=>ht,serializeViewerAtlasState:()=>gt,serializeWorldOrbitEmbedPayload:()=>mn,viewpointToViewerFilter:()=>wt,zoomViewerStateAt:()=>Ve});var no={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Ue={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function ft(e){return e?typeof e=="string"?Ue[e]??Ue.atlas:{...Ue.atlas,...e}:Ue.atlas}function pt(e){return{...no,...e}}function $n(e){return Ue[e]}function te(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:en(e.objectTypes??[]),tags:en((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:en((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return ro(t)?t:null}function ro(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function mt(e,t){let n=te(t),r=new Set;for(let o of e.objects)if(!o.hidden&&oo(o,n)&&(r.add(o.objectId),n?.includeAncestors!==!1))for(let i of o.ancestorIds)r.add(i);return n?r:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function ht(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:io(o,r)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,n).map(o=>In(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,n).map(o=>In(o,1))}function xn(e,t,n,r){return{version:"2.0",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:te(n)}}function gt(e){return encodeURIComponent(JSON.stringify(e))}function bt(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",viewpointId:t.viewpointId??null,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null},filter:te(t.filter??null)}}function kn(e,t,n){let r=e.trim()||"bookmark";return{id:r.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||r,atlasState:{...n,viewerState:{...n.viewerState},renderOptions:{...n.renderOptions,layers:n.renderOptions.layers?{...n.renderOptions.layers}:void 0,scaleModel:n.renderOptions.scaleModel?{...n.renderOptions.scaleModel}:void 0,activeEventId:n.renderOptions.activeEventId??null},filter:n.filter?{...n.filter}:null}}}function yt(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,events:e.layers.events,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function wt(e){return e?.filter?te({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function In(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[]}}function oo(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=jn(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>n.includes(o)))return!1}return!0}function io(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),o=jn(e.object,e.label).toLowerCase(),i=0;return n===t||r===t?i+=120:n.startsWith(t)||r.startsWith(t)?i+=96:(n.includes(t)||r.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(l=>o.includes(l))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(l=>typeof l=="string"):[]).some(l=>l.toLowerCase()===t)&&(i+=18),i}function jn(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function en(e){return[...new Set(e)]}var p=class e extends Error{line;column;constructor(t,n,r){let o=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var We=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],re=We.filter(e=>e!=="system"),ao=["star","planet","moon","asteroid","comet","structure","phenomenon"],Sn=["structure","phenomenon"],ge=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],so=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function S(e,t){return{key:e,...t}}var vt=new Set(We),On=new Map([S("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:ge}),S("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:ge,unitFamily:"distance"}),S("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:ge,unitFamily:"distance"}),S("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:ge}),S("period",{kind:"unit",placement:!0,arity:"single",objectTypes:ge,unitFamily:"duration"}),S("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:ge,unitFamily:"angle"}),S("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:ge,unitFamily:"angle"}),S("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:ge,unitFamily:"angle"}),S("at",{kind:"string",placement:!0,arity:"single",objectTypes:Sn}),S("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Sn}),S("free",{kind:"string",placement:!0,arity:"single",objectTypes:so}),S("kind",{kind:"string",placement:!1,arity:"single",objectTypes:re}),S("class",{kind:"string",placement:!1,arity:"single",objectTypes:re}),S("culture",{kind:"string",placement:!1,arity:"single",objectTypes:re}),S("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:We}),S("color",{kind:"string",placement:!1,arity:"single",objectTypes:We}),S("image",{kind:"string",placement:!1,arity:"single",objectTypes:ao}),S("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:We}),S("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"radius"}),S("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"mass"}),S("density",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"generic"}),S("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"generic"}),S("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"generic"}),S("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:re}),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:re}),S("source",{kind:"string",placement:!1,arity:"single",objectTypes:re}),S("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"duration"})].map(e=>[e.key,e])),lo=new Set(On.keys());function ne(e){return On.get(e)}function An(e){return lo.has(e)}function Ln(e,t){return e.objectTypes.includes(t)}function $t(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 Ye(e,t={}){let n=[],r=t.columnOffset??0,o="",i=null,a=!1,s=!1,l=null,c=()=>{i!==null&&(n.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],b=r+u+1;if(s&&f==="\\"){let w=e[u+1];if(w==='"'||w==="\\"){o+=w,u++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=b),a=!0,l=b,s=!0);continue}if(!s&&/\s/.test(f)){c();continue}i===null&&(i=b),o+=f}if(s)throw new p("Unclosed quote in line",t.line,l??r+e.length);return c(),n}function It(e){return e.match(/^\s*/)?.[0].length??0}function He(e){let t=e.split(/\r?\n/),n=[],r=null,o=!1,i=null;for(let a=0;a<t.length;a++){let s=t[a],l=a+1;if(!s.trim())continue;let c=It(s),u=Ye(s.slice(c),{line:l,columnOffset:c});if(u.length!==0){if(c===0){o=!1,i=null;let f=co(u,l);n.push(f),r=f;continue}if(!r)throw new p("Indented line without parent object",l,c+1);if(u.length===1&&u[0].value==="info"){o=!0,i=c;continue}o&&c<=(i??0)&&(o=!1),o?r.infoEntries.push(po(u,l)):r.blockFields.push(fo(u,l))}}return{type:"document",objects:n}}function co(e,t){if(e.length<2)throw new p("Invalid object declaration",t,e[0]?.column??1);let[n,r,...o]=e;if(!vt.has(n.value))throw new p(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:uo(o,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function uo(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r],i=ne(o.value);if(!i)throw new p(`Unknown field "${o.value}"`,t,o.column);r++;let a=[];if(i.arity==="multiple")for(;r<e.length&&!An(e[r].value);)a.push(e[r]),r++;else{let s=e[r];s&&(a.push(s),r++)}if(a.length===0)throw new p(`Missing value for field "${o.value}"`,t,o.column);n.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return n}function fo(e,t){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);if(!ne(e[0].value))throw new p(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function po(e,t){if(e.length<2)throw new p("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Tn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,mo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ho=/^[A-Za-z][A-Za-z0-9+.-]*:/;function qe(e){let t=null,n=[];for(let r of e.objects){let o=go(r);if(r.objectType==="system"){if(t)throw p.fromLocation("Only one system object is allowed",r.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function go(e){let t=[...e.inlineFields,...e.blockFields];bo(e.objectType,t);let n=yo(t),r=wo(e.objectType,n),o=vo(n),i=xo(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:r,info:i}}function bo(e,t){for(let n of t){let r=ne(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Ln(r,e))throw p.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function yo(e){let t=new Map;for(let n of e){if(t.has(n.key))throw p.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function wo(e,t){let n=t.has("orbit"),r=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[n,r,o,i].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw p.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw p.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:xt(t,"orbit"),distance:Ee(t,"distance"),semiMajor:Ee(t,"semiMajor"),eccentricity:So(t,"eccentricity"),period:Ee(t,"period"),angle:Ee(t,"angle"),inclination:Ee(t,"inclination"),phase:Ee(t,"phase")};if(r){let s=kt(t,"at"),l=xt(t,"at");return{mode:"at",target:l,reference:ko(l,s.location)}}if(o)return{mode:"surface",target:xt(t,"surface")};if(i){let s=xt(t,"free"),l=jo(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function vo(e){let t={};for(let[n,r]of e.entries()){let o=ne(n);if(!(!o||o.placement))switch(o.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Oo(r);break;case"number":t[n]=En(De(r),n,r.location);break;case"unit":t[n]=Mn(De(r),r.location,n);break;case"string":t[n]=$o(n,r);break}}return t}function $o(e,t){let n=t.values.join(" ").trim();return e==="image"&&Io(n,t.location),n}function Io(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(ho);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function xo(e){let t={};for(let n of e){if(n.key in t)throw p.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function ko(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Mn(e,t,n){let r=e.match(Tn);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=ne(n);if(i?.unitFamily&&!$t(i.unitFamily,o.unit))throw p.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function jo(e){let t=e.match(Tn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ee(e,t){if(!e.has(t))return;let n=kt(e,t);return Mn(De(n),n.location,t)}function So(e,t){if(!e.has(t))return;let n=kt(e,t);return En(De(n),t,n.location)}function En(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Oo(e){let t=De(e).toLowerCase(),n=mo.get(t);if(n===void 0)throw p.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function kt(e,t){let n=e.get(t);if(!n)throw new p(`Missing value for key "${t}"`);return n}function xt(e,t){return De(kt(e,t))}function De(e){if(e.values.length!==1)throw p.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Ao=new Set(["star","planet","moon","asteroid","comet"]);function Ge(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new p(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new p(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let o=n.get(r.placement.target);if(!o||!Ao.has(o.type))throw new p(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Lo(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&To(r,r.placement.reference,t))}}function Lo(e,t,n){if(!n.has(t.primary))throw new p(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new p(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function To(e,t,n){if(!n.has(t.objectId))throw new p(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function ke(e,t,n=`${t}.failed`){return e instanceof p?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var Xe=1495978707e-1,Mo=6371,Eo=71492,Do=695700,Fo=63241.077,Po=206264.806,Vo=206264806,Rn=.68,Co=.2,Bn=28;function ue(e,t={}){let n=_o(t),r=n.width,o=n.height,i=n.padding,a=Bo(e),s=No(e,t.projection),l=Uo(a,t.scaleModel),c=Yo(a),u=e.system?.id??null,f=t.activeEventId??null,b=Ro(e.objects,e.events??[],f),w=new Map(b.map(x=>[x.id,x])),$=Ti(b,w),v=new Map,j=[],A=[],h=[],I=[],U=[],C=new Map,D=new Map;for(let x of b){let P=x.placement;if(!P){h.push(x);continue}if(P.mode==="orbit"){Pn(D,P.target,x);continue}if(P.mode==="surface"){Pn(C,P.target,x);continue}if(P.mode==="at"){U.push(x);continue}I.push(x)}let z=I.length>0?r*.42:r/2,T=o/2,H={orbitChildren:D,surfaceChildren:C,objectMap:w,spacingFactor:c,projection:s,scaleModel:l},F=h.find(x=>x.type==="star")??h[0]??null;F&&tn(F,z,T,0,v,j,A,H);let W=h.filter(x=>x.id!==F?.id);if(W.length>0){let x=Math.min(r,o)*.28*c*l.orbitDistanceMultiplier;W.forEach((P,B)=>{let Le=Qe(B,W.length,-Math.PI/2),J=et(Le,x,s,1);tn(P,z+J.x,T+J.y,0,v,j,A,H)})}I.forEach((x,P)=>{let B=r-i-140-Vi(x.placement?.mode==="free"?x.placement.distance:void 0,l),Le=Math.max(76,(o-i*2-180)/Math.max(1,I.length)*c)*l.freePlacementMultiplier,J=i+92+P*Le;v.set(x.id,{object:x,x:B,y:J,radius:At(x,0,l),sortKey:Tt(B,J,0)}),A.push({object:x,groupId:$.groupIds.get(x.id)??null,x1:B-60,y1:J,x2:B-18,y2:J,mode:"free"}),St(x,v,j,A,H,1)}),U.forEach((x,P)=>{if(v.has(x.id)||!x.placement||x.placement.mode!=="at")return;let B=Ai(x.placement.reference,v,w,P,U.length,r,o,i,H);v.set(x.id,{object:x,x:B.x,y:B.y,radius:At(x,2,l),sortKey:Tt(B.x,B.y,2),anchorX:B.anchorX,anchorY:B.anchorY}),B.anchorX!==void 0&&B.anchorY!==void 0&&A.push({object:x,groupId:$.groupIds.get(x.id)??null,x1:B.anchorX,y1:B.anchorY,x2:B.x,y2:B.y,mode:"at"}),St(x,v,j,A,H,2)});let R=[...v.values()].map(x=>Ho(x,l,$)),M=j.map(x=>qo(x,$.groupIds.get(x.object.id)??null)),Z=A.map(x=>Go(x)),ee=Xo(R,r,o,l.labelMultiplier),y=ri(e,R),k=oi(e.events??[],R,f),X=ei(M,y,k,Z,R,ee),xe=ti(R,M,Z,ee,$,l.labelMultiplier),Ae=ni(e,R),ct=ii(e,s,n.preset,$,w),_=wi(r,o,R,M,Z,ee,l.labelMultiplier);return{width:r,height:o,padding:i,renderPreset:n.preset,projection:s,scaleModel:l,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Vn(s)} view - ${Vn(a)} layout`,systemId:u,viewMode:s,layoutPreset:a,metadata:{format:e.format,version:e.version,view:s,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:_,layers:X,groups:xe,semanticGroups:Ae,viewpoints:ct,events:k,activeEventId:f,objects:R,orbitVisuals:M,relations:y,leaders:Z,labels:ee}}function pe(e,t,n){let r=Mt(n),o=Math.cos(r),i=Math.sin(r),a=e.x-t.x,s=e.y-t.y;return{x:t.x+a*o-s*i,y:t.y+a*i+s*o}}function Ro(e,t,n){let r=e.map(a=>structuredClone(a));if(!n)return r;let o=t.find(a=>a.id===n);if(!o)return r;let i=new Map(r.map(a=>[a.id,a]));for(let a of o.positions){let s=i.get(a.objectId);s&&(s.placement=a.placement?structuredClone(a.placement):null,a.inner?s.properties.inner={...a.inner}:delete s.properties.inner,a.outer?s.properties.outer={...a.outer}:delete s.properties.outer)}return r}function Bo(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 _o(e){let t=zo(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function zo(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 No(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Uo(e,t){return{...Wo(e),...t}}function Wo(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 Yo(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ho(e,t,n){let{object:r,x:o,y:i,radius:a,sortKey:s,anchorX:l,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:Fe(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:o,y:i,radius:a,visualRadius:Pi(r,a,t),sortKey:s+u*.001,anchorX:l,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ri(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function qo(e,t){return{renderId:`${Fe(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function Go(e){return{renderId:`${Fe(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Xo(e,t,n,r){let o=[],i=[],a=new Map(e.map(l=>[l.objectId,l])),s=[...e].filter(l=>!l.hidden&&l.object.renderHints?.renderLabel!==!1).sort(Ko);for(let l of s){let c=Zo(l,a,i,t,n,r)??zn(l,_n(l,a.get(l.parentId??"")??null,n),0,r);i.push(qn(l,c,r)),o.push({renderId:`${l.renderId}-label`,objectId:l.objectId,object:l.object,groupId:l.groupId,semanticGroupIds:[...l.semanticGroupIds],label:l.label,secondaryLabel:l.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:l.hidden})}return o}function Ko(e,t){let n=Dn(e)-Dn(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Dn(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function Zo(e,t,n,r,o,i){for(let a of Jo(e,t,r,o)){let s=a==="left"||a==="right"?4:6;for(let l=0;l<=s;l+=1){let c=zn(e,a,l,i),u=qn(e,c,i);if(!n.some(f=>Di(f,u)))return c}}return null}function Jo(e,t,n,r){let o=e.parentId?t.get(e.parentId)??null:null,i=_n(e,o,r),a=i==="below"?"above":"below",s=Qo(e,o,n),l=s==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[s,i,l,a]:[i,s,a,l]}function _n(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function Qo(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function zn(e,t,n,r){let o=14*r;switch(t){case"above":{let i=e.y-(e.radius+18*r+n*o);return{x:e.x,labelY:i,secondaryY:i-16*r,textAnchor:"middle",direction:t}}case"below":{let i=e.y+e.radius+18*r+n*o;return{x:e.x,labelY:i,secondaryY:i+16*r,textAnchor:"middle",direction:t}}case"left":{let i=e.x-(e.visualRadius+16*r+n*o),a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let i=e.x+e.visualRadius+16*r+n*o,a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function ei(e,t,n,r,o,i){let a=e.filter(l=>!l.hidden&&!!l.backArcPath).map(l=>l.renderId),s=e.filter(l=>!l.hidden).map(l=>l.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:s},{id:"relations",renderIds:t.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"events",renderIds:n.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"objects",renderIds:o.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"labels",renderIds:i.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ti(e,t,n,r,o,i){let a=new Map,s=l=>{if(!l)return null;let c=a.get(l);if(c)return c;let u=o.groupRoots.get(l)??null,f={renderId:l,rootObjectId:u,label:u??l,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Je(0,0,0,0)};return a.set(l,f),f};for(let l of e){let c=s(l.groupId);c&&!l.hidden&&c.objectIds.push(l.objectId)}for(let l of t){let c=s(l.groupId);c&&!l.hidden&&c.orbitIds.push(l.objectId)}for(let l of n){let c=s(l.groupId);c&&!l.hidden&&c.leaderIds.push(l.objectId)}for(let l of r){let c=s(l.groupId);c&&!l.hidden&&c.labelIds.push(l.objectId)}for(let l of a.values())l.contentBounds=Mi(l,e,t,n,r,i);return[...a.values()].sort((l,c)=>l.label.localeCompare(c.label))}function ni(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function ri(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let o=n.get(r.from),i=n.get(r.to);return{renderId:`${Fe(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:r.hidden||!o||!i||o.hidden||i.hidden}}).sort((r,o)=>r.relation.id.localeCompare(o.relation.id))}function oi(e,t,n){let r=new Map(t.map(o=>[o.objectId,o]));return e.map(o=>{let i=[...new Set([...o.targetObjectId?[o.targetObjectId]:[],...o.participantObjectIds])],a=i.map(c=>r.get(c)).filter(Boolean),s=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,l=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${Fe(o.id)}-event`,eventId:o.id,event:o,objectIds:i,participantIds:[...o.participantObjectIds],targetObjectId:o.targetObjectId,x:s,y:l,hidden:o.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&o.id!==n}}).sort((o,i)=>o.event.id.localeCompare(i.event.id))}function ii(e,t,n,r,o){let i=ai(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,b,...w]=c.split(".");if(f!=="viewpoint"||!b||w.length===0)continue;let $=gi(b);if(!$)continue;let v=w.join(".").toLowerCase(),j=a.get($)??{id:$};si(j,v,u,e,t,n,r,o),a.set($,j)}let s=[...a.values()].map(c=>li(c,t,n,o)).filter(Boolean),l=s.findIndex(c=>c.id===i.id);return l>=0?s.splice(l,1,{...i,...s[l],layers:{...i.layers,...s[l].layers},filter:s[l].filter??i.filter,generated:!1}):s.unshift(i),s.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function ai(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function si(e,t,n,r,o,i,a,s){let l=n.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"events":e.eventIds=Ze(l);return;case"projection":case"view":e.projection=ui(l)??o;return;case"preset":e.preset=di(l)??i;return;case"rotation":case"angle":e.rotationDeg=Nn(l)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=fi(l);return;case"layers":e.layers=pi(l);return;case"query":e.filter={...e.filter??jt(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??jt(),objectTypes:mi(l)};return;case"tags":e.filter={...e.filter??jt(),tags:Ze(l)};return;case"groups":e.filter={...e.filter??jt(),groupIds:hi(l,r,a,s)};return}}function li(e,t,n,r){let o=e.focus&&r.has(e.focus)?e.focus:null,i=e.select&&r.has(e.select)?e.select:o,a=ci(e.filter),s=e.label?.trim()||bi(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||yi(s,o,a),objectId:o,selectedObjectId:i,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function jt(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ci(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 ui(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function di(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Nn(e){let t=Number(e);return Number.isFinite(t)?t:null}function fi(e){let t=Nn(e);return t!==null&&t>0?t:null}function pi(e){let t={};for(let n of Ze(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),o=n.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="events"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=r)}return t}function mi(e){return Ze(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function hi(e,t,n,r){return Ze(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:n.groupIds.has(o)?n.groupIds.get(o)??Ke(o):(r.has(o),Ke(o)))}function Ze(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function gi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function bi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function yi(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function wi(e,t,n,r,o,i,a){let s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(b,w)=>{s=Math.min(s,b),l=Math.min(l,w),c=Math.max(c,b),u=Math.max(u,w)};for(let b of r)b.hidden||Un(b,f);for(let b of o)b.hidden||(f(b.x1,b.y1),f(b.x2,b.y2));for(let b of n)b.hidden||Wn(b,f);for(let b of i)b.hidden||Yn(b,f,a);return!Number.isFinite(s)||!Number.isFinite(l)?Je(0,0,e,t):Je(s,l,c,u)}function Un(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,o=e.ry??e.radius??0,i=Xn(e.cx,e.cy,r,o,e.rotationDeg,0,Math.PI*2,Bn*2);for(let a of i)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function Je(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Wn(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 Yn(e,t,n){let r=Gn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function tn(e,t,n,r,o,i,a,s){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:n,radius:At(e,r,s.scaleModel),sortKey:Tt(t,n,r)}),St(e,o,i,a,s,r+1))}function St(e,t,n,r,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(vi),l=$i(s,a.radius,o.spacingFactor,o.scaleModel),c=ki(s,l);s.forEach((f,b)=>{let w=Ii(f,b,s.length,a,l,c[b]??l.innerPx,o);n.push({object:f,parentId:e.id,kind:w.kind,cx:w.cx,cy:w.cy,radius:w.radius,rx:w.rx,ry:w.ry,rotationDeg:w.rotationDeg,band:w.band,bandThickness:w.bandThickness,frontArcPath:w.frontArcPath,backArcPath:w.backArcPath}),tn(f,w.objectX,w.objectY,i,t,n,r,o)});let u=[...o.surfaceChildren.get(e.id)??[]];u.forEach((f,b)=>{let w=Qe(b,u.length,-Math.PI/3),$=28*o.spacingFactor,v=et(w,a.radius,o.projection,o.projection==="isometric"?.9:1),j=et(w,a.radius+$,o.projection,o.projection==="isometric"?.9:1),A=a.x+v.x,h=a.y+v.y,I=a.x+j.x,U=a.y+j.y;t.set(f.id,{object:f,x:I,y:U,radius:At(f,i+1,o.scaleModel),sortKey:Tt(I,U,i+1),anchorX:A,anchorY:h}),r.push({object:f,groupId:o.objectMap.has(f.id)?Ke(Ei(f,o.objectMap)):null,x1:A,y1:h,x2:I,y2:U,mode:"surface"}),St(f,t,n,r,o,i+1)})}function vi(e,t){let n=Ot(e),r=Ot(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function $i(e,t,n,r){let o=e.map(f=>Ot(f)),i=o.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,s=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42};let l=Math.min(...i),c=Math.max(...i),u=c-l;return{metrics:o,minMetric:l,maxMetric:c,metricSpread:u,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function Ii(e,t,n,r,o,i,a){let s=e.placement,l=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let T=o.innerPx+t*o.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:T,rotationDeg:0,band:l,bandThickness:l?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-T}}let c=Y(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),u=i,f=Math.max(u*Math.sqrt(1-c*c),u*.18),b=rn(s.inclination)??0,w=a.projection==="isometric"?Math.max(Co,Math.cos(Mt(b)))*Rn:1,$=Math.max(f*w,u*.14),v=rn(s.angle)??0,j=u*c,A=Zn(-j,0,v),h=r.x+A.x,I=r.y+A.y,U=Si(s.phase,t,n),C=Kn(h,I,u,$,v,U),D=a.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,z=l?Oi(e,u,o,a.scaleModel):void 0;return{kind:D?"circle":"ellipse",cx:D?r.x:h,cy:D?r.y:I,radius:D?u:void 0,rx:D?void 0:u,ry:D?void 0:$,rotationDeg:v,band:l,bandThickness:z,frontArcPath:a.projection==="isometric"||l?Fn(h,I,u,$,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||l?Fn(h,I,u,$,v,Math.PI,Math.PI*2):void 0,objectX:C.x,objectY:C.y}}function xi(e,t){return t.innerPx+t.stepPx*ji(Math.max(e,0)+1)}function ki(e,t){let n=[];return e.forEach((r,o)=>{let i=Ot(r),a=t.innerPx+o*t.stepPx,s=i===null?a:xi(i,t),l=o===0?t.innerPx:(n[o-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(s,l))}),n}function Ot(e){return!e.placement||e.placement.mode!=="orbit"?null:Lt(e.placement.semiMajor??e.placement.distance??null)}function ji(e){return Math.log(e)/Math.log(2)}function Si(e,t,n){let r=e?rn(e):null;return r!==null?Mt(r-90):Qe(t,n,-Math.PI/2)}function Oi(e,t,n,r){let o=Lt(nn(e.properties.inner)),i=Lt(nn(e.properties.outer));if(o!==null&&i!==null){let s=Math.abs(i-o);if(n.metricSpread>0)return Y(s/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(o,i),1e-4);return Y(s/l*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ai(e,t,n,r,o,i,a,s,l){if(e.kind==="lagrange")return Li(e,t,n,i,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Qe(r,o,Math.PI/5),f=(c.radius+36)*l.scaleModel.labelMultiplier,b=et(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=Qe(r,o,Math.PI/6),f=(c.radius+36)*l.scaleModel.labelMultiplier,b=et(u,f,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}return{x:i-s-170,y:a-s-86-r*58*l.scaleModel.freePlacementMultiplier}}function Li(e,t,n,r,o){let i=e.secondary?t.get(e.primary):Fi(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:r*.7,y:o*.25};let s=a.x-i.x,l=a.y-i.y,c=Math.hypot(s,l)||1,u=s/c,f=l/c,b=-f,w=u,$=Y(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*$,y:a.y-f*$,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*$,y:a.y+f*$,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-u*$,y:i.y-f*$,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(u*.5-b*.8660254)*$,y:a.y+(f*.5-w*.8660254)*$,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+b*.8660254)*$,y:a.y+(f*.5+w*.8660254)*$,anchorX:a.x,anchorY:a.y}}}function Ti(e,t){let n=new Map,r=new Map;for(let c of e){let u=Hn(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let o=new Map,i=new Map,a=new Map,s=c=>{let u=o.get(c);if(u)return u;let f=new Set,b=[],w=n.get(c)??null;for(;w&&!f.has(w);)b.push(w),f.add(w),w=n.get(w)??null;return o.set(c,b),b},l=c=>{let u=a.get(i.get(c)??"");if(u)return u;let f=n.get(c)??null,b=t.get(c),w=c;return b?.placement&&b.placement.mode!=="free"&&f&&(w=l(f)),w};for(let c of e){s(c.id);let u=l(c.id),f=Ke(u);i.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:o,groupIds:i,groupRoots:a}}function Hn(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Mi(e,t,n,r,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,b)=>{a=Math.min(a,f),s=Math.min(s,b),l=Math.max(l,f),c=Math.max(c,b)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Wn(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Un(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of o)!f.hidden&&e.labelIds.includes(f.objectId)&&Yn(f,u,i);return!Number.isFinite(a)||!Number.isFinite(s)?Je(0,0,0,0):Je(a,s,l,c)}function Ei(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let o=Hn(n,t);if(!o)break;let i=t.get(o);if(!i)break;n=i}return n.id}function qn(e,t,n){return Gn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Gn(e,t,n,r,o,i,a,s){let l=Bi(i,a,s),c=l*2,u=o==="above"?18:12,f=o==="above"?8:12,b=e-l,w=e+l;return r==="start"?(b=e,w=e+c):r==="end"&&(b=e-c,w=e),{left:b,right:w,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function Di(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Fi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function At(e,t,n){let r=Ci(e.properties.radius,n);if(r!==null)return r;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return Y((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return Y(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return Y(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return Y(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return Y(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return Y(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return Y(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return Y(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return Y(8*o,n.minBodyRadius,n.maxBodyRadius)}}function Pi(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Lt(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Xe;case"m":return e.value/1e3/Xe;case"ly":return e.value*Fo;case"pc":return e.value*Po;case"kpc":return e.value*Vo;case"re":return e.value*Mo/Xe;case"rj":return e.value*Eo/Xe;case"sol":return e.value*Do/Xe;default:return e.value}}function Vi(e,t){let n=Lt(e??null);return n===null||n<=0?0:Y(n*96*t.freePlacementMultiplier,0,420)}function Ci(e,t){let n=nn(e);if(!n)return null;let r;switch(n.unit){case"sol":r=Y(n.value*22,14,40);break;case"re":r=Y(n.value*10,6,18);break;case"km":r=Y(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=Y(n.value*4,4,20);break}return Y(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function nn(e){return!e||typeof e!="object"||!("value"in e)?null:e}function rn(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Qe(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Fn(e,t,n,r,o,i,a){let s=Xn(e,t,n,r,o,i,a,Bn);return s.length===0?"":s.map((l,c)=>`${c===0?"M":"L"} ${Cn(l.x)} ${Cn(l.y)}`).join(" ")}function Xn(e,t,n,r,o,i,a,s){let l=[];for(let c=0;c<=s;c+=1){let u=i+(a-i)*c/s;l.push(Kn(e,t,n,r,o,u))}return l}function Kn(e,t,n,r,o,i){let a=n*Math.cos(i),s=r*Math.sin(i),l=Zn(a,s,o);return{x:e+l.x,y:t+l.y}}function Zn(e,t,n){let r=Mt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function et(e,t,n,r){let o=n==="isometric"?Rn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Tt(e,t,n){return t*1e3+e+n*.01}function Y(e,t,n){return Math.min(Math.max(e,t),n)}function Pn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function Fe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Ke(e){return`${Fe(e)}-group`}function Ri(e){return typeof e=="string"&&e.trim()?e:void 0}function Bi(e,t,n){let r=e.length*4.6*n+18,o=t.length*3.9*n+18;return Math.max(r,o,24)}function Vn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Mt(e){return e*Math.PI/180}function Cn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function on(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Yi(e.system),info:Hi(e.system)}:null,r=e.objects.map(_i);return Ui(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(zi),objects:r}}function _i(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:Wi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function zi(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Ni)}}function Ni(e){return{objectId:e.objectId,placement:Jn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Jn(e){return e?structuredClone(e):null}function Ui(e,t,n){if(!n)return;let r=t.find(i=>i.id===n);if(!r)return;let o=new Map(e.map(i=>[i.id,i]));for(let i of r.positions){let a=o.get(i.objectId);a&&(a.placement=Jn(i.placement),i.inner?a.properties.inner={...i.inner}:delete a.properties.inner,i.outer?a.properties.outer={...i.outer}:delete a.properties.outer)}}function Wi(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Yi(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function Hi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let o=qi(n.layers);o&&(t[`${r}.layers`]=o),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function qi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}var Qn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ki=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Zi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Pe(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function nt(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function an(e,t,n){let r=e.match(Qn);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=ne(n);if(i?.unitFamily&&!$t(i.unitFamily,o.unit))throw p.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function sn(e){let t=e.match(Qn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Et(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function be(e,t,n){let r=Ki.get(e.toLowerCase());if(r===void 0)throw p.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function er(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Ji(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Zi);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function tr(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw p.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return be(tt(t,e,n),e,n);case"number":return Et(tt(t,e,n),e,n);case"unit":return an(tt(t,e,n),n,e);case"string":{let o=t.join(" ").trim();return e==="image"&&Ji(o,n),o}}}function ln(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw p.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function tt(e,t,n){if(e.length!==1)throw p.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var rr=new Set(["star","planet","moon","asteroid","comet"]),Qi=332946.0487,ea=1047.3486,Dt=1495978707e-1,ta=6371,na=695700,ra=63241.077,oa=206264.806,ia=206264806;function Ft(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),o=new Set(e.groups.map(s=>s.id)),i=new Set(e.events.map(s=>s.id));e.system||n.push(O("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[s,l]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of l){let u=a.get(c);u?n.push(O("validate.id.duplicate",`Duplicate ${s} id "${c}" already used by ${u}.`)):a.set(c,s)}for(let s of e.relations)aa(s,r,n);for(let s of e.system?.viewpoints??[])sa(s.filter,s.events??[],o,i,t,n,s.id);for(let s of e.objects)la(s,e.system,r,o,n);for(let s of e.events)ca(s,r,n);return n}function aa(e,t,n){e.from?t.has(e.from)||n.push(O("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(O("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(O("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(O("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(O("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function sa(e,t,n,r,o,i,a){if(o==="2.1"){if(e)for(let s of e.groupIds)n.has(s)||i.push(Q("validate.viewpoint.group.unknown",`Unknown group "${s}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.groups`));for(let s of t)r.has(s)||i.push(Q("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.events`))}}function la(e,t,n,r,o){let i=e.placement,a=i?.mode==="orbit"?i:null,s=i?.mode==="orbit"?n.get(i.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||o.push(Q("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(a&&(n.has(a.target)||o.push(O("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&o.push(O("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&o.push(Q("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(Q("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!or(s?.properties.mass)&&o.push(Q("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let l=n.get(i.target);l?rr.has(l.type)||o.push(O("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(O("validate.surface.target.unknown",`Unknown placement target "${i.target}" on "${e.id}".`,e.id,"surface"))}if(i?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&o.push(O("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),da(e,n,o)||o.push(O("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&o.push(Q("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(O("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){o.push(Q("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=nr(e,s);if(c===null){o.push(Q("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||o.push(ha("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${ma(c)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){o.push(Q("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=ir(a?.period),u=nr(e,s);if(c===null||u===null)continue;let f=pa(e,"period");Math.abs(c-u)>f&&o.push(O("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function ca(e,t,n){let r=`event.${e.id}`,o=new Set;e.kind.trim()||n.push(O("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(O("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(O("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let i=new Set;for(let s of e.participantObjectIds){if(o.add(s),i.has(s)){n.push(Q("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${s}".`,void 0,`${r}.participants`));continue}i.add(s),t.has(s)||n.push(O("validate.event.participants.unknown",`Unknown event participant "${s}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(Q("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(Q("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&n.push(Q("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let a=new Set;for(let s of e.positions){let l=`${r}.pose.${s.objectId}`;if(a.has(s.objectId)){n.push(O("validate.event.pose.duplicate",`Event "${e.id}" defines "${s.objectId}" more than once in positions.`,void 0,l));continue}a.add(s.objectId);let c=t.get(s.objectId);if(!c){n.push(O("validate.event.pose.object.unknown",`Unknown event pose object "${s.objectId}" on "${e.id}".`,void 0,l));continue}o.has(s.objectId)||n.push(Q("validate.event.pose.unreferenced",`Event pose "${s.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,l)),ua(s,c,t,n,l,e.id)}}function ua(e,t,n,r,o,i){let a=e.placement;if(!a){r.push(O("validate.event.pose.placement.required",`Event "${i}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(a.mode==="orbit"){n.has(a.target)||r.push(O("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.orbit`)),a.distance&&a.semiMajor&&r.push(O("validate.event.pose.orbit.distanceConflict",`Event "${i}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`));return}if(a.mode==="surface"){let s=n.get(a.target);s?rr.has(s.type)||r.push(O("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${i}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):r.push(O("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(O("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${i}:${e.objectId}".`,void 0,`${o}.at`));let s=a.reference;s.kind==="named"&&!n.has(s.name)?r.push(O("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):s.kind==="anchor"&&!n.has(s.objectId)?r.push(O("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${s.objectId}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):s.kind==="lagrange"&&(n.has(s.primary)?s.secondary&&!n.has(s.secondary)&&r.push(O("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${s.secondary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):r.push(O("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${s.primary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)))}}function da(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(O("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(O("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(O("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function nr(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=fa(n.semiMajor??n.distance),o=or(t?.properties.mass);return r===null||o===null||o<=0?null:Math.sqrt(r**3/o)*365.25}function fa(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Dt;case"m":return e.value/(Dt*1e3);case"ly":return e.value*ra;case"pc":return e.value*oa;case"kpc":return e.value*ia;case"re":return e.value*ta/Dt;case"sol":return e.value*na/Dt;default:return null}}function or(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Qi;case"mj":return t.value/ea;default:return null}}function ir(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function pa(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?ir(n)??0:0}function ma(e){return`${Math.round(e*100)/100}d`}function O(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function Q(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function ha(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var ga=new Set(["climate","habitability","settlement"]),Pt=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=ne(e);t&&Pt.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Pt.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var ba=new Set(Pt.keys()),ya=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function cn(e){return wa(e)}function wa(e,t){let n=os(e),r=n.source.split(/\r?\n/),o=[],i=!1,a="2.0",s=null,l=null,c=[],u=[],f=[],b=[],w=new Map,$=!1,v=!1,j=new Set,A=new Set,h=new Set,I=new Set,U=new Set;for(let F=0;F<r.length;F++){let W=r[F],R=F+1;if(!W.trim())continue;let M=It(W),Z=Ye(W.slice(M),{line:R,columnOffset:M});if(Z.length!==0){if(!i){a=va(Z,R),i=!0,n.comments.length>0&&a!=="2.1"&&o.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(M===0){l=$a(Z,R,a,o,s,c,u,f,b,w,j,A,h,I,U,{sawDefaults:$,sawAtlas:v}),l.kind==="system"?s=l.system:l.kind==="defaults"?$=!0:l.kind==="atlas"&&(v=!0);continue}if(!l)throw new p("Indented line without parent atlas section",R,M+1);La(l,M,Z,R)}}if(!i)throw new p('Missing required atlas schema header "schema 2.0"');let C=c.map(F=>qa(F,a,o)),D=b.map(F=>Ga(F,w.get(F.id)??[])),z=t??(a==="2.0-draft"?"2.0":a),T={format:"worldorbit",sourceVersion:"1.0",system:s,groups:u,relations:f,events:D,objects:C,diagnostics:o};if(z==="2.0-draft"){let F={...T,version:"2.0-draft",schemaVersion:"2.0-draft"};return F.diagnostics.push(...Ft(F,a)),F}let H={...T,version:z,schemaVersion:z};return a==="2.0-draft"&&H.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),H.diagnostics.push(...Ft(H,a)),H}function va(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new p('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function $a(e,t,n,r,o,i,a,s,l,c,u,f,b,w,$,v){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new p('Atlas section "system" may only appear once',t,e[0].column);return Ia(e,t,n,r);case"defaults":if(!o)throw new p('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new p('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:o,seenFields:new Set};case"atlas":if(!o)throw new p('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new p('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:o,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!o)throw new p('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return xa(e,t,o,u,n,r);case"annotation":if(!o)throw new p('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return ka(e,t,o,f);case"group":return oe(n,r,"group",{line:t,column:e[0].column}),ja(e,t,a,b);case"relation":return oe(n,r,"relation",{line:t,column:e[0].column}),Sa(e,t,s,w);case"event":return oe(n,r,"event",{line:t,column:e[0].column}),Oa(e,t,l,c,$,n,r);case"object":return Aa(e,t,n,r,i);default:throw new p(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Ia(e,t,n,r){if(e.length!==2)throw new p("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function xa(e,t,n,r,o,i){if(e.length!==2)throw new p("Invalid viewpoint declaration",t,e[0]?.column??1);let a=Pe(e[1].value);if(!a)throw new p("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new p(`Duplicate viewpoint id "${a}"`,t,e[1].column);let s={id:a,label:nt(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(s),r.add(a),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:o,diagnostics:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function ka(e,t,n,r){if(e.length!==2)throw new p("Invalid annotation declaration",t,e[0]?.column??1);let o=Pe(e[1].value);if(!o)throw new p("Annotation id must not be empty",t,e[1].column);if(r.has(o))throw new p(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:nt(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(i),r.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function ja(e,t,n,r){if(e.length!==2)throw new p("Invalid group declaration",t,e[0]?.column??1);let o=Pe(e[1].value);if(!o)throw new p("Group id must not be empty",t,e[1].column);if(r.has(o))throw new p(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:nt(o),summary:"",color:null,tags:[],hidden:!1};return n.push(i),r.add(o),{kind:"group",group:i,seenFields:new Set}}function Sa(e,t,n,r){if(e.length!==2)throw new p("Invalid relation declaration",t,e[0]?.column??1);let o=Pe(e[1].value);if(!o)throw new p("Relation id must not be empty",t,e[1].column);if(r.has(o))throw new p(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(i),r.add(o),{kind:"relation",relation:i,seenFields:new Set}}function Oa(e,t,n,r,o,i,a){if(e.length!==2)throw new p("Invalid event declaration",t,e[0]?.column??1);let s=Pe(e[1].value);if(!s)throw new p("Event id must not be empty",t,e[1].column);if(o.has(s))throw new p(`Duplicate event id "${s}"`,t,e[1].column);let l={id:s,kind:"",label:nt(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(l),r.set(s,c),o.add(s),{kind:"event",event:l,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Aa(e,t,n,r,o){if(e.length<3)throw new p("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],a=e[2],s=i.value;if(!vt.has(s)||s==="system")throw new p(`Unknown object type "${i.value}"`,t,i.column);let l={objectType:s,id:a.value,fields:Ya(e.slice(3),t,s,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function La(e,t,n,r){switch(e.kind){case"system":Ta(e,n,r);return;case"defaults":Ma(e,n,r);return;case"atlas":Ea(e,t,n,r);return;case"viewpoint":Da(e,t,n,r);return;case"annotation":Pa(e,n,r);return;case"group":Va(e,n,r);return;case"relation":Ca(e,n,r);return;case"event":Ra(e,t,n,r);return;case"object":_a(e,t,n,r);return}}function Ta(e,t,n){let r=we(t,e.seenFields,n),o=V(t,n);switch(r){case"title":e.system.title=o;return;case"description":oe(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=o;return;case"epoch":oe(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":oe(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=o;return;default:throw new p(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Ma(e,t,n){let r=we(t,e.seenFields,n),o=V(t,n);switch(r){case"view":e.system.defaults.view=sr(o,n,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=lr(o,n,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new p(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Ea(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=ur(n,r,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new p(`Duplicate atlas metadata key "${o.key}"`,r,n[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new p(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Da(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Fa(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new p('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=we(n,e.seenFields,r),i=V(n,r);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=sr(i,r,n[0].column);return;case"preset":e.viewpoint.preset=lr(i,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Ua(i,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=cr(i,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=Na(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=de(n.slice(1),r,"events");return;default:throw new p(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Fa(e,t,n){let r=we(t,e.seenFilterFields,n),o=e.viewpoint.filter??Wa();switch(r){case"query":o.query=V(t,n);break;case"objecttypes":o.objectTypes=za(t.slice(1),n);break;case"tags":o.tags=de(t.slice(1),n,"tags");break;case"groups":o.groupIds=de(t.slice(1),n,"groups");break;default:throw new p(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=o}function Pa(e,t,n){switch(we(t,e.seenFields,n)){case"label":e.annotation.label=V(t,n);return;case"target":e.annotation.targetObjectId=V(t,n);return;case"body":e.annotation.body=V(t,n);return;case"tags":e.annotation.tags=de(t.slice(1),n,"tags");return;default:throw new p(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Va(e,t,n){switch(we(t,e.seenFields,n)){case"label":e.group.label=V(t,n);return;case"summary":e.group.summary=V(t,n);return;case"color":e.group.color=V(t,n);return;case"tags":e.group.tags=de(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=be(V(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Ca(e,t,n){switch(we(t,e.seenFields,n)){case"from":e.relation.from=V(t,n);return;case"to":e.relation.to=V(t,n);return;case"kind":e.relation.kind=V(t,n);return;case"label":e.relation.label=V(t,n);return;case"summary":e.relation.summary=V(t,n);return;case"tags":e.relation.tags=de(t.slice(1),n,"tags");return;case"color":e.relation.color=V(t,n);return;case"hidden":e.relation.hidden=be(V(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Ra(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){e.activePose.fields.push(Ba(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new p(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let i=n[1].value;if(!i.trim())throw new p("Event pose object id must not be empty",r,n[1].column);let a={objectId:i,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new p('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(we(n,e.seenFields,r)){case"kind":e.event.kind=V(n,r);return;case"label":e.event.label=V(n,r);return;case"summary":e.event.summary=V(n,r);return;case"target":e.event.targetObjectId=V(n,r);return;case"participants":e.event.participantObjectIds=de(n.slice(1),r,"participants");return;case"timing":e.event.timing=V(n,r);return;case"visibility":e.event.visibility=V(n,r);return;case"tags":e.event.tags=de(n.slice(1),r,"tags");return;case"color":e.event.color=V(n,r);return;case"hidden":e.event.hidden=be(V(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new p(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Ba(e,t,n){if(e.length<2)throw new p("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!ya.has(r))throw new p(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new p(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}}}function _a(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let o=n[0].value.toLowerCase();if(o==="info"||ga.has(o)){o!=="info"&&oe(e.sourceSchemaVersion,e.diagnostics,o,{line:r,column:n[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=ur(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new p(`Duplicate info key "${o.key}"`,r,n[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,a=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(a.has(o.key))throw new p(`Duplicate ${i} key "${o.key}"`,r,n[0].column);a.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(Ha(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function we(e,t,n){if(e.length<2)throw new p("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new p(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function V(e,t){if(e.length<2)throw new p("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function za(e,t){return de(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Na(e,t,n,r){let o={};for(let i of de(e,t,"layers")){let a=!i.startsWith("-")&&!i.startsWith("!"),s=i.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){o["orbits-back"]=a,o["orbits-front"]=a;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata")&&(s==="events"&&n&&r&&oe(n,r,"layers.events",{line:t,column:e[0]?.column??1}),o[s]=a)}return o}function de(e,t,n){if(e.length===0)throw new p(`Missing value for atlas field "${n}"`,t,1);let r=e.map(o=>o.value).filter(Boolean);if(r.length===0)throw new p(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function sr(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new p(`Unknown projection "${e}"`,t,n);return r}function lr(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new p(`Unknown render preset "${e}"`,t,n)}function Ua(e,t,n,r){let o=cr(e,t,n,r);if(o<=0)throw new p(`Field "${r}" must be greater than zero`,t,n);return o}function cr(e,t,n,r){let o=Number(e);if(!Number.isFinite(o))throw new p(`Invalid numeric value "${e}" for "${r}"`,t,n);return o}function Wa(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ya(e,t,n,r,o){let i=[],a=0;for(;a<e.length;){let s=e[a],l=rt(s.value);if(!l)throw new p(`Unknown field "${s.value}"`,t,s.column);l.version==="2.1"&&oe(r,o,s.value,{line:t,column:s.column}),a++;let c=[];if(l.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(l.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!ba.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new p(`Missing value for field "${s.value}"`,t,s.column);i.push({type:"field",key:s.value,values:c.map(u=>u.value),location:{line:t,column:s.column}})}return mr(i,n),i}function Ha(e,t,n,r,o){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);let i=rt(e[0].value);if(!i)throw new p(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&oe(r,o,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return mr([a],n),a}function ur(e,t,n){if(e.length<2)throw new p(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function qa(e,t,n){let r=dr(e.fields),o=fr(r),i=Ka(e.objectType,r),a=ns(r.get("groups")?.[0]),s=ar(r.get("epoch")?.[0]),l=ar(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?be(ie(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Qa(r.get("resonance")[0]):void 0,f=Ja(r),b=r.get("derive")?.map(I=>es(I)),w=r.get("validate")?.map(I=>({rule:ie(I)})),$=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,v=r.get("tolerance")?.map(I=>ts(I)),j=Za(e.typedBlockEntries),A=pr(e.infoEntries,"info"),h={type:e.objectType,id:e.id,properties:i,placement:o,info:A};return a.length>0&&(h.groups=a),s&&(h.epoch=s),l&&(h.referencePlane=l),c!==void 0&&(h.tidalLock=c),u&&(h.resonance=u),f&&(h.renderHints=f),b?.length&&(h.deriveRules=b),w?.length&&(h.validationRules=w),$?.length&&(h.lockedFields=$),v?.length&&(h.tolerances=v),j&&Object.keys(j).length>0&&(h.typedBlocks=j),t!=="2.1"&&(h.groups||h.epoch||h.referencePlane||h.tidalLock!==void 0||h.resonance||h.renderHints||h.deriveRules?.length||h.validationRules?.length||h.lockedFields?.length||h.tolerances?.length||h.typedBlocks)&&oe(t,n,e.id,e.location),h}function Ga(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Xa(n))}}function Xa(e){let t=dr(e.fields),n=fr(t);return{objectId:e.objectId,placement:n,inner:ye(t.get("inner")?.[0],"inner"),outer:ye(t.get("outer")?.[0],"outer")}}function dr(e){let t=new Map;for(let n of e){let r=rt(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw p.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=t.get(n.key)??[];o.push(n),t.set(n.key,o)}return t}function fr(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],o=e.get("free")?.[0];if([t,n,r,o].filter(Boolean).length>1){let a=t??n??r??o;throw p.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:ie(t),distance:ye(e.get("distance")?.[0],"distance"),semiMajor:ye(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:rs(e.get("eccentricity")?.[0],"eccentricity"),period:ye(e.get("period")?.[0],"period"),angle:ye(e.get("angle")?.[0],"angle"),inclination:ye(e.get("inclination")?.[0],"inclination"),phase:ye(e.get("phase")?.[0],"phase")};if(n){let a=ie(n);return{mode:"at",target:a,reference:er(a,n.location)}}if(r)return{mode:"surface",target:ie(r)};if(o){let a=ie(o),s=sn(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function Ka(e,t){let n={};for(let[r,o]of t.entries()){let i=o[0],a=rt(r);!i||!a?.legacySchema||a.legacySchema.placement||(ln(r,e,i.location),n[r]=tr(r,i.values,i.location))}return n}function pr(e,t){let n={};for(let r of e){if(r.key in n)throw p.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Za(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=pr(r,n))}return t}function Ja(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return n&&(t.renderLabel=be(ie(n),"renderLabel",n.location)),r&&(t.renderOrbit=be(ie(r),"renderOrbit",r.location)),o&&(t.renderPriority=Et(ie(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function Qa(e){if(e.values.length!==2)throw p.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw p.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function es(e){if(e.values.length!==2)throw p.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function ts(e){if(e.values.length!==2)throw p.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=sn(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ns(e){return e?[...new Set(e.values)]:[]}function ar(e){return e&&e.values.join(" ").trim()||null}function ye(e,t){return e?an(ie(e),e.location,t):void 0}function rs(e,t){return e?Et(ie(e),t,e.location):void 0}function ie(e){return tt(e.values,e.key,e.location)}function rt(e){return Pt.get(e)}function mr(e,t){for(let n of e){let r=rt(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){ln(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function oe(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function os(e){let t=[...e],n=[],r=!1,o=!1,i=null,a=1,s=1;for(let l=0;l<t.length;l++){let c=t[l],u=t[l+1];if(o){if(c==="*"&&u==="/"){t[l]=" ",t[l+1]=" ",o=!1,i=null,l++,s+=2;continue}c!==`
|
|
2
|
-
`&&c!=="\r"&&(t[
|
|
3
|
-
`?(a++,
|
|
4
|
-
`&&t[f]!=="\r";)t[f]=" ",f++;
|
|
5
|
-
`?(a++,
|
|
6
|
-
`}var
|
|
7
|
-
`&&
|
|
8
|
-
`&&t[
|
|
9
|
-
<text class="wo-subtitle" x="56" y="88">${
|
|
10
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${
|
|
1
|
+
"use strict";var WorldOrbitViewer=(()=>{var sn=Object.defineProperty;var di=Object.getOwnPropertyDescriptor;var fi=Object.getOwnPropertyNames;var pi=Object.prototype.hasOwnProperty;var mi=(e,t)=>{for(var n in t)sn(e,n,{get:t[n],enumerable:!0})},hi=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of fi(t))!pi.call(e,i)&&i!==n&&sn(e,i,{get:()=>t[i],enumerable:!(r=di(t,i))||r.enumerable});return e};var gi=e=>hi(sn({},"__esModule",{value:!0}),e);var wl={};mi(wl,{DEFAULT_VIEWER_STATE:()=>Oe,WORLD_LAYER_ID:()=>Xt,clampScale:()=>ct,composeViewerTransform:()=>Ht,createAtlasViewer:()=>Jt,createEmbedPayload:()=>Xr,createInteractiveViewer:()=>Ae,createWorldOrbitEmbedMarkup:()=>Kr,defineWorldOrbitViewerElement:()=>ei,deserializeViewerAtlasState:()=>It,deserializeWorldOrbitEmbedPayload:()=>Ln,fitViewerState:()=>Pe,focusViewerState:()=>Yt,getSceneCenter:()=>Ee,getThemePreset:()=>Fn,getViewerVisibleBounds:()=>qt,invertViewerPoint:()=>Ne,mountWorldOrbitEmbeds:()=>Zr,normalizeRotation:()=>kn,normalizeViewerFilter:()=>te,panViewerState:()=>Me,renderDocumentToSvg:()=>On,renderSceneToSvg:()=>se,renderSourceToSvg:()=>Fr,resolveLayers:()=>yt,resolveTheme:()=>bt,rotateViewerState:()=>Wt,sceneViewpointToLayerOptions:()=>xt,searchSceneObjects:()=>vt,serializeViewerAtlasState:()=>$t,serializeWorldOrbitEmbedPayload:()=>An,viewpointToViewerFilter:()=>kt,zoomViewerStateAt:()=>_e});var bi={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},qe={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function bt(e){return e?typeof e=="string"?qe[e]??qe.atlas:{...qe.atlas,...e}:qe.atlas}function yt(e){return{...bi,...e}}function Fn(e){return qe[e]}function te(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:ln(e.objectTypes??[]),tags:ln((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:ln((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return yi(t)?t:null}function yi(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function wt(e,t){let n=te(t),r=new Set;for(let i of e.objects)if(!i.hidden&&wi(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function vt(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(i=>!i.hidden).map(i=>({object:i,score:vi(i,r)})).filter(i=>i.score>0).sort((i,o)=>o.score-i.score||i.object.label.localeCompare(o.object.label)).slice(0,n).map(i=>Cn(i.object,i.score)):e.objects.filter(i=>!i.hidden).slice().sort((i,o)=>i.label.localeCompare(o.label)).slice(0,n).map(i=>Cn(i,1))}function Vn(e,t,n,r){return{version:"2.5",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:te(n)}}function $t(e){return encodeURIComponent(JSON.stringify(e))}function It(e){let t=JSON.parse(decodeURIComponent(e));return{version:t.version==="2.0"?"2.0":"2.5",viewpointId:t.viewpointId??null,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,camera:t.renderOptions?.camera?{...t.renderOptions.camera}:null,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null},filter:te(t.filter??null)}}function Rn(e,t,n){let r=e.trim()||"bookmark";return{id:r.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||r,atlasState:{...n,viewerState:{...n.viewerState},renderOptions:{...n.renderOptions,camera:n.renderOptions.camera?{...n.renderOptions.camera}:null,layers:n.renderOptions.layers?{...n.renderOptions.layers}:void 0,scaleModel:n.renderOptions.scaleModel?{...n.renderOptions.scaleModel}:void 0,activeEventId:n.renderOptions.activeEventId??null},filter:n.filter?{...n.filter}:null}}}function xt(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,events:e.layers.events,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function kt(e){return e?.filter?te({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function Cn(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[]}}function wi(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=zn(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function vi(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),i=zn(e.object,e.label).toLowerCase(),o=0;return n===t||r===t?o+=120:n.startsWith(t)||r.startsWith(t)?o+=96:(n.includes(t)||r.includes(t))&&(o+=72),t.split(/\s+/).filter(Boolean).every(s=>i.includes(s))&&(o+=32),e.object.type===t&&(o+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(s=>typeof s=="string"):[]).some(s=>s.toLowerCase()===t)&&(o+=18),o}function zn(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function ln(e){return[...new Set(e)]}var p=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var Ge=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],re=Ge.filter(e=>e!=="system"),$i=["star","planet","moon","asteroid","comet","structure","phenomenon"],Bn=["structure","phenomenon"],$e=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Ii=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function A(e,t){return{key:e,...t}}var jt=new Set(Ge),_n=new Map([A("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:$e}),A("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"distance"}),A("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"distance"}),A("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:$e}),A("period",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"duration"}),A("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"angle"}),A("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"angle"}),A("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:$e,unitFamily:"angle"}),A("at",{kind:"string",placement:!0,arity:"single",objectTypes:Bn}),A("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Bn}),A("free",{kind:"string",placement:!0,arity:"single",objectTypes:Ii}),A("kind",{kind:"string",placement:!1,arity:"single",objectTypes:re}),A("class",{kind:"string",placement:!1,arity:"single",objectTypes:re}),A("culture",{kind:"string",placement:!1,arity:"single",objectTypes:re}),A("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Ge}),A("color",{kind:"string",placement:!1,arity:"single",objectTypes:Ge}),A("image",{kind:"string",placement:!1,arity:"single",objectTypes:$i}),A("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Ge}),A("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"radius"}),A("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"mass"}),A("density",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"generic"}),A("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"generic"}),A("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"generic"}),A("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:re}),A("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),A("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),A("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),A("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),A("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),A("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),A("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),A("on",{kind:"string",placement:!1,arity:"single",objectTypes:re}),A("source",{kind:"string",placement:!1,arity:"single",objectTypes:re}),A("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:re,unitFamily:"duration"})].map(e=>[e.key,e])),xi=new Set(_n.keys());function ne(e){return _n.get(e)}function Nn(e){return xi.has(e)}function Un(e,t){return e.objectTypes.includes(t)}function St(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 Xe(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],b=r+u+1;if(l&&f==="\\"){let w=e[u+1];if(w==='"'||w==="\\"){i+=w,u++;continue}}if(f==='"'){l?l=!1:(o===null&&(o=b),a=!0,s=b,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}o===null&&(o=b),i+=f}if(l)throw new p("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Ot(e){return e.match(/^\s*/)?.[0].length??0}function Ke(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=Ot(l),u=Xe(l.slice(c),{line:s,columnOffset:c});if(u.length!==0){if(c===0){i=!1,o=null;let f=ki(u,s);n.push(f),r=f;continue}if(!r)throw new p("Indented line without parent object",s,c+1);if(u.length===1&&u[0].value==="info"){i=!0,o=c;continue}i&&c<=(o??0)&&(i=!1),i?r.infoEntries.push(Oi(u,s)):r.blockFields.push(Si(u,s))}}return{type:"document",objects:n}}function ki(e,t){if(e.length<2)throw new p("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!jt.has(n.value))throw new p(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:ji(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function ji(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=ne(i.value);if(!o)throw new p(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Nn(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new p(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function Si(e,t){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);if(!ne(e[0].value))throw new p(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Oi(e,t){if(e.length<2)throw new p("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Wn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ai=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Li=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Ze(e){let t=null,n=[];for(let r of e.objects){let i=Ti(r);if(r.objectType==="system"){if(t)throw p.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Ti(e){let t=[...e.inlineFields,...e.blockFields];Mi(e.objectType,t);let n=Pi(t),r=Ei(e.objectType,n),i=Di(n),o=Vi(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Mi(e,t){for(let n of t){let r=ne(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Un(r,e))throw p.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Pi(e){let t=new Map;for(let n of e){if(t.has(n.key))throw p.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Ei(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw p.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw p.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:At(t,"orbit"),distance:Ve(t,"distance"),semiMajor:Ve(t,"semiMajor"),eccentricity:Bi(t,"eccentricity"),period:Ve(t,"period"),angle:Ve(t,"angle"),inclination:Ve(t,"inclination"),phase:Ve(t,"phase")};if(r){let l=Lt(t,"at"),s=At(t,"at");return{mode:"at",target:s,reference:Ri(s,l.location)}}if(i)return{mode:"surface",target:At(t,"surface")};if(o){let l=At(t,"free"),s=zi(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function Di(e){let t={};for(let[n,r]of e.entries()){let i=ne(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=_i(r);break;case"number":t[n]=Hn(Re(r),n,r.location);break;case"unit":t[n]=Yn(Re(r),r.location,n);break;case"string":t[n]=Fi(n,r);break}}return t}function Fi(e,t){let n=t.values.join(" ").trim();return e==="image"&&Ci(n,t.location),n}function Ci(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Li);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Vi(e){let t={};for(let n of e){if(n.key in t)throw p.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Ri(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Yn(e,t,n){let r=e.match(Wn);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=ne(n);if(o?.unitFamily&&!St(o.unitFamily,i.unit))throw p.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function zi(e){let t=e.match(Wn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ve(e,t){if(!e.has(t))return;let n=Lt(e,t);return Yn(Re(n),n.location,t)}function Bi(e,t){if(!e.has(t))return;let n=Lt(e,t);return Hn(Re(n),t,n.location)}function Hn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function _i(e){let t=Re(e).toLowerCase(),n=Ai.get(t);if(n===void 0)throw p.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Lt(e,t){let n=e.get(t);if(!n)throw new p(`Missing value for key "${t}"`);return n}function At(e,t){return Re(Lt(e,t))}function Re(e){if(e.values.length!==1)throw p.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Ni=new Set(["star","planet","moon","asteroid","comet"]);function Je(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new p(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new p(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Ni.has(i.type))throw new p(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Ui(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Wi(r,r.placement.reference,t))}}function Ui(e,t,n){if(!n.has(t.primary))throw new p(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new p(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Wi(e,t,n){if(!n.has(t.objectId))throw new p(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Le(e,t,n=`${t}.failed`){return e instanceof p?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var Qe=1495978707e-1,Yi=6371,Hi=71492,qi=695700,Gi=63241.077,Xi=206264.806,Ki=206264806,Qn=.68,Zi=.2,er=28;function fe(e,t={}){let n=eo(t),r=n.width,i=n.height,o=n.padding,a=Qi(e),l=no(e,t.projection),s=mn(t.camera??null),c=pn(l,s),u=oo(a,t.scaleModel),f=so(a),b=e.system?.id??null,w=t.activeEventId??null,I=Ji(e.objects,e.events??[],w),v=new Map(I.map(k=>[k.id,k])),j=Yo(I,v),O=new Map,h=[],$=[],W=[],F=[],T=[],_=new Map,M=new Map;for(let k of I){let Q=k.placement;if(!Q){W.push(k);continue}if(Q.mode==="orbit"){Kn(M,Q.target,k);continue}if(Q.mode==="surface"){Kn(_,Q.target,k);continue}if(Q.mode==="at"){T.push(k);continue}F.push(k)}let Z=F.length>0?r*.42:r/2,R=i/2,N={orbitChildren:M,surfaceChildren:_,objectMap:v,spacingFactor:f,projection:c,scaleModel:u},Y=W.find(k=>k.type==="star")??W[0]??null;Y&&un(Y,Z,R,0,O,h,$,N);let E=W.filter(k=>k.id!==Y?.id);if(E.length>0){let k=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;E.forEach((Q,C)=>{let ge=it(C,E.length,-Math.PI/2),oe=ot(ge,k,c,1);un(Q,Z+oe.x,R+oe.y,0,O,h,$,N)})}F.forEach((k,Q)=>{let C=r-o-140-Zo(k.placement?.mode==="free"?k.placement.distance:void 0,u),ge=Math.max(76,(i-o*2-180)/Math.max(1,F.length)*f)*u.freePlacementMultiplier,oe=o+92+Q*ge;O.set(k.id,{object:k,x:C,y:oe,radius:Dt(k,0,u),sortKey:Ct(C,oe,0)}),$.push({object:k,groupId:j.groupIds.get(k.id)??null,x1:C-60,y1:oe,x2:C-18,y2:oe,mode:"free"}),Pt(k,O,h,$,N,1)}),T.forEach((k,Q)=>{if(O.has(k.id)||!k.placement||k.placement.mode!=="at")return;let C=Uo(k.placement.reference,O,v,Q,T.length,r,i,o,N);O.set(k.id,{object:k,x:C.x,y:C.y,radius:Dt(k,2,u),sortKey:Ct(C.x,C.y,2),anchorX:C.anchorX,anchorY:C.anchorY}),C.anchorX!==void 0&&C.anchorY!==void 0&&$.push({object:k,groupId:j.groupIds.get(k.id)??null,x1:C.anchorX,y1:C.anchorY,x2:C.x,y2:C.y,mode:"at"}),Pt(k,O,h,$,N,2)});let H=[...O.values()].map(k=>lo(k,u,j)),ee=h.map(k=>co(k,j.groupIds.get(k.object.id)??null)),y=$.map(k=>uo(k)),x=fo(H,r,i,u.labelMultiplier),z=vo(e,H),ce=$o(e.events??[],H,w),De=bo(ee,z,ce,y,H,x),mt=yo(H,ee,y,x,j,u.labelMultiplier),B=wo(e,H),he=Io(e,l,n.preset,j,v),J=Do(r,i,H,ee,y,x,u.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:io(l,c,a,s),systemId:b,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:J,layers:De,groups:mt,semanticGroups:B,viewpoints:he,events:ce,activeEventId:w,objects:H,orbitVisuals:ee,relations:z,leaders:y,labels:x}}function be(e,t,n){let r=Vt(n),i=Math.cos(r),o=Math.sin(r),a=e.x-t.x,l=e.y-t.y;return{x:t.x+a*i-l*o,y:t.y+a*o+l*i}}function Ji(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function Qi(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 eo(e){let t=to(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function to(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 no(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return rr(n)??"topdown"}function pn(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function mn(e){if(!e)return null;let t={azimuth:cn(e.azimuth),elevation:cn(e.elevation),roll:cn(e.roll),distance:ro(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function cn(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ro(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function io(e,t,n,r){let i=[`${Zn(e)} view`,`${Zn(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function oo(e,t){return{...ao(e),...t}}function ao(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 so(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function lo(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:ze(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:a,visualRadius:Ko(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Qo(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function co(e,t){return{renderId:`${ze(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function uo(e){return{renderId:`${ze(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function fo(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(po);for(let s of l){let c=mo(s,a,o,t,n,r)??nr(s,tr(s,a.get(s.parentId??"")??null,n),0,r);o.push(lr(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function po(e,t){let n=qn(e)-qn(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function qn(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function mo(e,t,n,r,i,o){for(let a of ho(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=nr(e,a,s,o),u=lr(e,c,o);if(!n.some(f=>Go(f,u)))return c}}return null}function ho(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=tr(e,i,r),a=o==="below"?"above":"below",l=go(e,i,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,o,s,a]:[o,l,a,s]}function tr(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function go(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function nr(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function bo(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function yo(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:rt(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Ho(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function wo(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function vo(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${ze(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function $o(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${ze(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function Io(e,t,n,r,i){let o=xo(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,b,...w]=c.split(".");if(f!=="viewpoint"||!b||w.length===0)continue;let I=Mo(b);if(!I)continue;let v=w.join(".").toLowerCase(),j=a.get(I)??{id:I};ko(j,v,u,e,t,n,r,i),a.set(I,j)}let l=[...a.values()].map(c=>jo(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function xo(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=mn(null),a=pn(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function ko(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=nt(s);return;case"projection":case"view":e.projection=rr(s)??i;return;case"preset":e.preset=Oo(s)??o;return;case"rotation":case"angle":e.rotationDeg=et(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Mt(),azimuth:et(s)};return;case"camera.elevation":e.camera={...e.camera??Mt(),elevation:et(s)};return;case"camera.roll":e.camera={...e.camera??Mt(),roll:et(s)};return;case"camera.distance":e.camera={...e.camera??Mt(),distance:Gn(s)};return;case"zoom":case"scale":e.scale=Gn(s);return;case"layers":e.layers=Ao(s);return;case"query":e.filter={...e.filter??Tt(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Tt(),objectTypes:Lo(s)};return;case"tags":e.filter={...e.filter??Tt(),tags:nt(s)};return;case"groups":e.filter={...e.filter??Tt(),groupIds:To(s,r,a,l)};return}}function jo(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=So(e.filter),l=e.label?.trim()||Po(e.id),s=e.projection??t,c=mn(e.camera??null),u=pn(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||Eo(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Tt(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Mt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function So(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 rr(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Oo(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function et(e){let t=Number(e);return Number.isFinite(t)?t:null}function Gn(e){let t=et(e);return t!==null&&t>0?t:null}function Ao(e){let t={};for(let n of nt(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Lo(e){return nt(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,n,r){return nt(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??tt(i):(r.has(i),tt(i)))}function nt(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Mo(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Po(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Eo(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Do(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(b,w)=>{l=Math.min(l,b),s=Math.min(s,w),c=Math.max(c,b),u=Math.max(u,w)};for(let b of r)b.hidden||ir(b,f);for(let b of i)b.hidden||(f(b.x1,b.y1),f(b.x2,b.y2));for(let b of n)b.hidden||or(b,f);for(let b of o)b.hidden||ar(b,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?rt(0,0,e,t):rt(l,s,c,u)}function ir(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=ur(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,er*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function rt(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function or(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 ar(e,t,n){let r=cr(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function un(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Dt(e,r,l.scaleModel),sortKey:Ct(t,n,r)}),Pt(e,i,o,a,l,r+1))}function Pt(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(Fo),s=Co(l,a.radius,i.spacingFactor,i.scaleModel),c=zo(l,s);l.forEach((f,b)=>{let w=Vo(f,b,l.length,a,s,c[b]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:w.kind,cx:w.cx,cy:w.cy,radius:w.radius,rx:w.rx,ry:w.ry,rotationDeg:w.rotationDeg,band:w.band,bandThickness:w.bandThickness,frontArcPath:w.frontArcPath,backArcPath:w.backArcPath}),un(f,w.objectX,w.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,b)=>{let w=it(b,u.length,-Math.PI/3),I=28*i.spacingFactor,v=ot(w,a.radius,i.projection,i.projection==="isometric"?.9:1),j=ot(w,a.radius+I,i.projection,i.projection==="isometric"?.9:1),O=a.x+v.x,h=a.y+v.y,$=a.x+j.x,W=a.y+j.y;t.set(f.id,{object:f,x:$,y:W,radius:Dt(f,o+1,i.scaleModel),sortKey:Ct($,W,o+1),anchorX:O,anchorY:h}),r.push({object:f,groupId:i.objectMap.has(f.id)?tt(qo(f,i.objectMap)):null,x1:O,y1:h,x2:$,y2:W,mode:"surface"}),Pt(f,t,n,r,i,o+1)})}function Fo(e,t){let n=Et(e),r=Et(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Co(e,t,n,r){let i=e.map(f=>Et(f)),o=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...o),c=Math.max(...o),u=c-s;return{metrics:i,minMetric:s,maxMetric:c,metricSpread:u,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function Vo(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let M=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:M,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-M}}let c=q(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,f=Math.max(u*Math.sqrt(1-c*c),u*.18),b=fn(l.inclination)??0,w=a.projection==="isometric"?Math.max(Zi,Math.cos(Vt(b)))*Qn:1,I=Math.max(f*w,u*.14),v=fn(l.angle)??0,j=u*c,O=fr(-j,0,v),h=r.x+O.x,$=r.y+O.y,W=_o(l.phase,t,n),F=dr(h,$,u,I,v,W),T=a.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,_=s?No(e,u,i,a.scaleModel):void 0;return{kind:T?"circle":"ellipse",cx:T?r.x:h,cy:T?r.y:$,radius:T?u:void 0,rx:T?void 0:u,ry:T?void 0:I,rotationDeg:v,band:s,bandThickness:_,frontArcPath:a.projection==="isometric"||s?Xn(h,$,u,I,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Xn(h,$,u,I,v,Math.PI,Math.PI*2):void 0,objectX:F.x,objectY:F.y}}function Ro(e,t){return t.innerPx+t.stepPx*Bo(Math.max(e,0)+1)}function zo(e,t){let n=[];return e.forEach((r,i)=>{let o=Et(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Ro(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Et(e){return!e.placement||e.placement.mode!=="orbit"?null:Ft(e.placement.semiMajor??e.placement.distance??null)}function Bo(e){return Math.log(e)/Math.log(2)}function _o(e,t,n){let r=e?fn(e):null;return r!==null?Vt(r-90):it(t,n,-Math.PI/2)}function No(e,t,n,r){let i=Ft(dn(e.properties.inner)),o=Ft(dn(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.metricSpread>0)return q(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return q(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Uo(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Wo(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=it(r,i,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,b=ot(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=it(r,i,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,b=ot(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+b.x,y:c.y+b.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Wo(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Xo(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,f=s/c,b=-f,w=u,I=q(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*I,y:a.y-f*I,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*I,y:a.y+f*I,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*I,y:o.y-f*I,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-b*.8660254)*I,y:a.y+(f*.5-w*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+b*.8660254)*I,y:a.y+(f*.5+w*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function Yo(e,t){let n=new Map,r=new Map;for(let c of e){let u=sr(c,t);if(n.set(c.id,u),u){let f=r.get(u);f?f.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let f=new Set,b=[],w=n.get(c)??null;for(;w&&!f.has(w);)b.push(w),f.add(w),w=n.get(w)??null;return i.set(c,b),b},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let f=n.get(c)??null,b=t.get(c),w=c;return b?.placement&&b.placement.mode!=="free"&&f&&(w=s(f)),w};for(let c of e){l(c.id);let u=s(c.id),f=tt(u);o.set(c.id,f),a.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function sr(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Ho(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(f,b)=>{a=Math.min(a,f),l=Math.min(l,b),s=Math.max(s,f),c=Math.max(c,b)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&or(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&ir(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&ar(f,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?rt(0,0,0,0):rt(a,l,s,c)}function qo(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=sr(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function lr(e,t,n){return cr(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function cr(e,t,n,r,i,o,a,l){let s=ea(o,a,l),c=s*2,u=i==="above"?18:12,f=i==="above"?8:12,b=e-s,w=e+s;return r==="start"?(b=e,w=e+c):r==="end"&&(b=e-c,w=e),{left:b,right:w,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function Go(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Xo(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Dt(e,t,n){let r=Jo(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return q((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return q(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return q(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return q(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return q(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return q(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return q(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return q(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return q(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Ko(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Ft(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Qe;case"m":return e.value/1e3/Qe;case"ly":return e.value*Gi;case"pc":return e.value*Xi;case"kpc":return e.value*Ki;case"re":return e.value*Yi/Qe;case"rj":return e.value*Hi/Qe;case"sol":return e.value*qi/Qe;default:return e.value}}function Zo(e,t){let n=Ft(e??null);return n===null||n<=0?0:q(n*96*t.freePlacementMultiplier,0,420)}function Jo(e,t){let n=dn(e);if(!n)return null;let r;switch(n.unit){case"sol":r=q(n.value*22,14,40);break;case"re":r=q(n.value*10,6,18);break;case"km":r=q(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=q(n.value*4,4,20);break}return q(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function dn(e){return!e||typeof e!="object"||!("value"in e)?null:e}function fn(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function it(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Xn(e,t,n,r,i,o,a){let l=ur(e,t,n,r,i,o,a,er);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Jn(s.x)} ${Jn(s.y)}`).join(" ")}function ur(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(dr(e,t,n,r,i,u))}return s}function dr(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=fr(a,l,i);return{x:e+s.x,y:t+s.y}}function fr(e,t,n){let r=Vt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ot(e,t,n,r){let i=n==="isometric"?Qn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Ct(e,t,n){return t*1e3+e+n*.01}function q(e,t,n){return Math.min(Math.max(e,t),n)}function Kn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ze(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function tt(e){return`${ze(e)}-group`}function Qo(e){return typeof e=="string"&&e.trim()?e:void 0}function ea(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Zn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Vt(e){return e*Math.PI/180}function Jn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function hn(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:aa(e.system),info:sa(e.system)}:null,r=e.objects.map(ta);return ia(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(na),objects:r}}function ta(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:oa(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function na(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ra)}}function ra(e){return{objectId:e.objectId,placement:pr(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function pr(e){return e?structuredClone(e):null}function ia(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=pr(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function oa(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function aa(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function sa(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=la(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function la(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var mr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,da=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),fa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Be(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function st(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function gn(e,t,n){let r=e.match(mr);if(!r)throw p.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=ne(n);if(o?.unitFamily&&!St(o.unitFamily,i.unit))throw p.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function bn(e){let t=e.match(mr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Rt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw p.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Ie(e,t,n){let r=da.get(e.toLowerCase());if(r===void 0)throw p.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function hr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw p.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function pa(e,t){if(!e)throw p.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw p.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(fa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw p.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function gr(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw p.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Ie(at(t,e,n),e,n);case"number":return Rt(at(t,e,n),e,n);case"unit":return gn(at(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&pa(i,n),i}}}function yn(e,t,n){let r=ne(e);if(!r)throw p.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw p.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function at(e,t,n){if(e.length!==1)throw p.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var yr=new Set(["star","planet","moon","asteroid","comet"]),ma=332946.0487,ha=1047.3486,zt=1495978707e-1,ga=6371,ba=695700,ya=63241.077,wa=206264.806,va=206264806;function Bt(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(S("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(S("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)$a(l,r,n);for(let l of e.system?.viewpoints??[])Ia(l,i,o,t,n,r);for(let l of e.objects)xa(l,e.system,r,i,n);for(let l of e.events)ka(l,e.system,r,n);return n}function $a(e,t,n){e.from?t.has(e.from)||n.push(S("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(S("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(S("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(S("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(S("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Ia(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let l of a.groupIds)t.has(l)||i.push(V("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(V("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Aa(e.projection,i,`viewpoint.${e.id}.projection`,e.id),La(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function xa(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(V("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(V("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(V("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(S("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(S("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(V("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(V("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!vn(l?.properties.mass)&&i.push(V("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?yr.has(s.type)||i.push(S("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(S("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(S("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Sa(e,n,i)||i.push(S("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(V("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(S("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(V("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=br(e,l);if(c===null){i.push(V("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(wn("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Ea(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(V("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=wr(a?.period),u=br(e,l);if(c===null||u===null)continue;let f=Pa(e,"period");Math.abs(c-u)>f&&i.push(S("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function ka(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(S("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(V("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(V("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(S("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(S("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(V("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(S("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(V("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(V("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(V("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(S("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let f=n.get(c.objectId);if(!f){r.push(S("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(V("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),ja(c,f,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(V("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function ja(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(S("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(S("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(S("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!Ta(r,t,n,e)&&o.push(V("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!Ma(r,t,n,e)&&o.push(V("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!vn(i.get(s.target)?.properties.mass)&&o.push(V("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?yr.has(c.type)||o.push(S("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(S("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(S("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(S("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(S("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(S("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(S("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Sa(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(S("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(S("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(S("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function br(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Oa(n.semiMajor??n.distance),i=vn(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Oa(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/zt;case"m":return e.value/(zt*1e3);case"ly":return e.value*ya;case"pc":return e.value*wa;case"kpc":return e.value*va;case"re":return e.value*ga/zt;case"sol":return e.value*ba/zt;default:return null}}function vn(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/ma;case"mj":return t.value/ha;default:return null}}function wr(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Aa(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(S("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function La(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[f,b]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])b!==null&&(!Number.isFinite(b)||f==="distance"&&b<=0)&&r.push(S("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(b)}" in viewpoint "${i}".`,void 0,`${c}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(V("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(V("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(wn("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(V("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(wn("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Ta(e,t,n,r){return xe(r?.epoch)??xe(n?.epoch)??xe(t.epoch)??xe(e?.epoch)??null}function Ma(e,t,n,r){return xe(r?.referencePlane)??xe(n?.referencePlane)??xe(t.referencePlane)??xe(e?.referencePlane)??null}function xe(e){return typeof e=="string"&&e.trim()?e.trim():null}function Pa(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?wr(n)??0:0}function Ea(e){return`${Math.round(e*100)/100}d`}function S(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function V(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function wn(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Da=new Set(["climate","habitability","settlement"]),Nt=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=ne(e);t&&Nt.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Nt.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Fa=new Set(Nt.keys()),$r=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function $n(e){return Ca(e)}function Ca(e,t){let n=Is(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],f=[],b=[],w=new Map,I=!1,v=!1,j=new Set,O=new Set,h=new Set,$=new Set,W=new Set;for(let R=0;R<r.length;R++){let N=r[R],Y=R+1;if(!N.trim())continue;let E=Ot(N),H=Xe(N.slice(E),{line:Y,columnOffset:E});if(H.length!==0){if(!o){a=Va(H,Y),o=!0,n.comments.length>0&&Ut(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(E===0){s=Ra(H,Y,a,i,l,c,u,f,b,w,j,O,h,$,W,{sawDefaults:I,sawAtlas:v}),s.kind==="system"?l=s.system:s.kind==="defaults"?I=!0:s.kind==="atlas"&&(v=!0);continue}if(!s)throw new p("Indented line without parent atlas section",Y,E+1);Ha(s,E,H,Y)}}if(!o)throw new p('Missing required atlas schema header "schema 2.0"');let F=c.map(R=>ds(R,a,i)),T=b.map(R=>fs(R,w.get(R.id)??[])),_=t??(a==="2.0-draft"?"2.0":a),M={format:"worldorbit",sourceVersion:"1.0",system:l,groups:u,relations:f,events:T,objects:F,diagnostics:i};if(_==="2.0-draft"){let R={...M,version:"2.0-draft",schemaVersion:"2.0-draft"};return R.diagnostics.push(...Bt(R,a)),R}let Z={...M,version:_,schemaVersion:_};return a==="2.0-draft"&&Z.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),Z.diagnostics.push(...Bt(Z,a)),Z}function Va(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new p('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Ra(e,t,n,r,i,o,a,l,s,c,u,f,b,w,I,v){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new p('Atlas section "system" may only appear once',t,e[0].column);return za(e,t,n,r);case"defaults":if(!i)throw new p('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new p('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new p('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new p('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new p('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Ba(e,t,i,u,n,r);case"annotation":if(!i)throw new p('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return _a(e,t,i,f);case"group":return ie(n,r,"group",{line:t,column:e[0].column}),Na(e,t,a,b);case"relation":return ie(n,r,"relation",{line:t,column:e[0].column}),Ua(e,t,l,w);case"event":return ie(n,r,"event",{line:t,column:e[0].column}),Wa(e,t,s,c,I,n,r);case"object":return Ya(e,t,n,r,o);default:throw new p(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function za(e,t,n,r){if(e.length!==2)throw new p("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Ba(e,t,n,r,i,o){if(e.length!==2)throw new p("Invalid viewpoint declaration",t,e[0]?.column??1);let a=Be(e[1].value);if(!a)throw new p("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new p(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:st(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function _a(e,t,n,r){if(e.length!==2)throw new p("Invalid annotation declaration",t,e[0]?.column??1);let i=Be(e[1].value);if(!i)throw new p("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new p(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:st(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Na(e,t,n,r){if(e.length!==2)throw new p("Invalid group declaration",t,e[0]?.column??1);let i=Be(e[1].value);if(!i)throw new p("Group id must not be empty",t,e[1].column);if(r.has(i))throw new p(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:st(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function Ua(e,t,n,r){if(e.length!==2)throw new p("Invalid relation declaration",t,e[0]?.column??1);let i=Be(e[1].value);if(!i)throw new p("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new p(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function Wa(e,t,n,r,i,o,a){if(e.length!==2)throw new p("Invalid event declaration",t,e[0]?.column??1);let l=Be(e[1].value);if(!l)throw new p("Event id must not be empty",t,e[1].column);if(i.has(l))throw new p(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:st(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Ya(e,t,n,r,i){if(e.length<3)throw new p("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!jt.has(l)||l==="system")throw new p(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:cs(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Ha(e,t,n,r){switch(e.kind){case"system":qa(e,n,r);return;case"defaults":Ga(e,n,r);return;case"atlas":Xa(e,t,n,r);return;case"viewpoint":Ka(e,t,n,r);return;case"annotation":Qa(e,n,r);return;case"group":es(e,n,r);return;case"relation":ts(e,n,r);return;case"event":ns(e,t,n,r);return;case"object":is(e,t,n,r);return}}function qa(e,t,n){let r=ye(t,e.seenFields,n),i=D(t,n);switch(r){case"title":e.system.title=i;return;case"description":ie(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":ie(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":ie(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new p(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Ga(e,t,n){let r=ye(t,e.seenFields,n),i=D(t,n);switch(r){case"view":xr(i)&&Te(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Ir(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=kr(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new p(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Xa(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=jr(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new p(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new p(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Ka(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){Za(e,n,r);return}if(e.inFilter){Ja(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(Te(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new p('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??xn();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new p('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=ye(n,e.seenFields,r),o=D(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":xr(o)&&Te(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Ir(o,r,n[0].column);return;case"preset":e.viewpoint.preset=kr(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=In(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=je(o,r,n[0].column,"rotation");return;case"camera":Te(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ls(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=as(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":ie(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=pe(n.slice(1),r,"events");return;default:throw new p(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Za(e,t,n){let r=ye(t,e.seenCameraFields,n),i=D(t,n),o=e.viewpoint.camera??xn();switch(r){case"azimuth":o.azimuth=je(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=je(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=je(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=In(i,n,t[0].column,"camera.distance");break;default:throw new p(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function Ja(e,t,n){let r=ye(t,e.seenFilterFields,n),i=e.viewpoint.filter??ss();switch(r){case"query":i.query=D(t,n);break;case"objecttypes":i.objectTypes=os(t.slice(1),n);break;case"tags":i.tags=pe(t.slice(1),n,"tags");break;case"groups":i.groupIds=pe(t.slice(1),n,"groups");break;default:throw new p(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function Qa(e,t,n){switch(ye(t,e.seenFields,n)){case"label":e.annotation.label=D(t,n);return;case"target":e.annotation.targetObjectId=D(t,n);return;case"body":e.annotation.body=D(t,n);return;case"tags":e.annotation.tags=pe(t.slice(1),n,"tags");return;default:throw new p(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function es(e,t,n){switch(ye(t,e.seenFields,n)){case"label":e.group.label=D(t,n);return;case"summary":e.group.summary=D(t,n);return;case"color":e.group.color=D(t,n);return;case"tags":e.group.tags=pe(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Ie(D(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ts(e,t,n){switch(ye(t,e.seenFields,n)){case"from":e.relation.from=D(t,n);return;case"to":e.relation.to=D(t,n);return;case"kind":e.relation.kind=D(t,n);return;case"label":e.relation.label=D(t,n);return;case"summary":e.relation.summary=D(t,n);return;case"tags":e.relation.tags=pe(t.slice(1),n,"tags");return;case"color":e.relation.color=D(t,n);return;case"hidden":e.relation.hidden=Ie(D(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new p(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function ns(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&Te(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(rs(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new p(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new p("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new p('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(ye(n,e.seenFields,r)){case"kind":e.event.kind=D(n,r);return;case"label":e.event.label=D(n,r);return;case"summary":e.event.summary=D(n,r);return;case"target":e.event.targetObjectId=D(n,r);return;case"participants":e.event.participantObjectIds=pe(n.slice(1),r,"participants");return;case"timing":e.event.timing=D(n,r);return;case"visibility":e.event.visibility=D(n,r);return;case"epoch":Te(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=D(n,r);return;case"referenceplane":Te(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=D(n,r);return;case"tags":e.event.tags=pe(n.slice(1),r,"tags");return;case"color":e.event.color=D(n,r);return;case"hidden":e.event.hidden=Ie(D(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new p(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function rs(e,t,n){if(e.length<2)throw new p("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!$r.has(r))throw new p(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new p(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function is(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Da.has(i)){i!=="info"&&ie(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=jr(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new p(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new p(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(us(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function ye(e,t,n){if(e.length<2)throw new p("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new p(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function D(e,t){if(e.length<2)throw new p("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function os(e,t){return pe(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function as(e,t,n,r){let i={};for(let o of pe(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&ie(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function pe(e,t,n){if(e.length===0)throw new p(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new p(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Ir(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new p(`Unknown projection "${e}"`,t,n);return r}function xr(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function kr(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new p(`Unknown render preset "${e}"`,t,n)}function In(e,t,n,r){let i=je(e,t,n,r);if(i<=0)throw new p(`Field "${r}" must be greater than zero`,t,n);return i}function je(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new p(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function ss(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function xn(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ls(e,t,n){if(e.length===0||e.length%2!==0)throw new p('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:xn(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new p(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=je(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=je(c,t,a.column,"camera.elevation");break;case"roll":r.roll=je(c,t,a.column,"camera.roll");break;case"distance":r.distance=In(c,t,a.column,"camera.distance");break;default:throw new p(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function cs(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=lt(l.value);if(!s)throw new p(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&ie(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!Fa.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new p(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return Lr(o,n),o}function us(e,t,n,r,i){if(e.length<2)throw new p("Invalid field line",t,e[0]?.column??1);let o=lt(e[0].value);if(!o)throw new p(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&ie(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return Lr([a],n),a}function jr(e,t,n){if(e.length<2)throw new p(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function ds(e,t,n){let r=Sr(e.fields),i=Or(r),o=ms(e.objectType,r),a=vs(r.get("groups")?.[0]),l=_t(r.get("epoch")?.[0]),s=_t(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?Ie(ae(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?bs(r.get("resonance")[0]):void 0,f=gs(r),b=r.get("derive")?.map($=>ys($)),w=r.get("validate")?.map($=>({rule:ae($)})),I=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,v=r.get("tolerance")?.map($=>ws($)),j=hs(e.typedBlockEntries),O=Ar(e.infoEntries,"info"),h={type:e.objectType,id:e.id,properties:o,placement:i,info:O};return a.length>0&&(h.groups=a),l&&(h.epoch=l),s&&(h.referencePlane=s),c!==void 0&&(h.tidalLock=c),u&&(h.resonance=u),f&&(h.renderHints=f),b?.length&&(h.deriveRules=b),w?.length&&(h.validationRules=w),I?.length&&(h.lockedFields=I),v?.length&&(h.tolerances=v),j&&Object.keys(j).length>0&&(h.typedBlocks=j),Ut(t,"2.1")&&(h.groups||h.epoch||h.referencePlane||h.tidalLock!==void 0||h.resonance||h.renderHints||h.deriveRules?.length||h.validationRules?.length||h.lockedFields?.length||h.tolerances?.length||h.typedBlocks)&&ie(t,n,e.id,e.location),h}function fs(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ps(n))}}function ps(e){let t=Sr(e.fields,"event-pose"),n=Or(t);return{objectId:e.objectId,placement:n,inner:ke(t.get("inner")?.[0],"inner"),outer:ke(t.get("outer")?.[0],"outer"),epoch:_t(t.get("epoch")?.[0]),referencePlane:_t(t.get("referencePlane")?.[0])}}function Sr(e,t="object"){let n=new Map;for(let r of e){let i=lt(r.key);if(!i&&!$r.has(r.key))throw p.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw p.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Or(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw p.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:ae(t),distance:ke(e.get("distance")?.[0],"distance"),semiMajor:ke(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:$s(e.get("eccentricity")?.[0],"eccentricity"),period:ke(e.get("period")?.[0],"period"),angle:ke(e.get("angle")?.[0],"angle"),inclination:ke(e.get("inclination")?.[0],"inclination"),phase:ke(e.get("phase")?.[0],"phase")};if(n){let a=ae(n);return{mode:"at",target:a,reference:hr(a,n.location)}}if(r)return{mode:"surface",target:ae(r)};if(i){let a=ae(i),l=bn(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function ms(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=lt(r);!o||!a?.legacySchema||a.legacySchema.placement||(yn(r,e,o.location),n[r]=gr(r,o.values,o.location))}return n}function Ar(e,t){let n={};for(let r of e){if(r.key in n)throw p.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function hs(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Ar(r,n))}return t}function gs(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Ie(ae(n),"renderLabel",n.location)),r&&(t.renderOrbit=Ie(ae(r),"renderOrbit",r.location)),i&&(t.renderPriority=Rt(ae(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function bs(e){if(e.values.length!==2)throw p.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw p.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function ys(e){if(e.values.length!==2)throw p.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function ws(e){if(e.values.length!==2)throw p.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=bn(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function vs(e){return e?[...new Set(e.values)]:[]}function _t(e){return e&&e.values.join(" ").trim()||null}function ke(e,t){return e?gn(ae(e),e.location,t):void 0}function $s(e,t){return e?Rt(ae(e),t,e.location):void 0}function ae(e){return at(e.values,e.key,e.location)}function lt(e){return Nt.get(e)}function Lr(e,t){for(let n of e){let r=lt(n.key);if(!r)throw p.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){yn(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw p.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function ie(e,t,n,r){Ut(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Te(e,t,n,r){Ut(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Ut(e,t){return vr(e)<vr(t)}function vr(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Is(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
|
|
2
|
+
`&&c!=="\r"&&(t[s]=" "),c===`
|
|
3
|
+
`?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!xs(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
|
|
4
|
+
`&&t[f]!=="\r";)t[f]=" ",f++;l+=f-s,s=f-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
|
|
5
|
+
`?(a++,l=1):l++}if(i)throw p.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function xs(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
|
|
6
|
+
`}var ks=/^schema\s+2(?:\.0|\.1|\.5)?$/i,js=/^schema\s+2\.1$/i,Ss=/^schema\s+2\.5$/i,Os=/^schema\s+2\.0-draft$/i;function Tr(e){for(let t of As(e).split(/\r?\n/)){let n=t.trim();if(n)return Os.test(n)?"2.0-draft":js.test(n)?"2.1":Ss.test(n)?"2.5":ks.test(n)?"2.0":"1.0"}return"1.0"}function As(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
|
|
7
|
+
`&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let l=i+1;for(;l<t.length&&t[l]!==`
|
|
8
|
+
`&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function Se(e){let t=Mr(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new p(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Mr(e){let t=Tr(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Ls(e,t);let n;try{n=Ke(e)}catch(i){return{ok:!1,value:null,diagnostics:[Le(i,"parse")]}}let r;try{r=Ze(n)}catch(i){return{ok:!1,value:null,diagnostics:[Le(i,"normalize")]}}try{Je(r)}catch(i){return{ok:!1,value:null,diagnostics:[Le(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ls(e,t){let n;try{n=$n(e)}catch(a){return{ok:!1,value:null,diagnostics:[Le(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=hn(n)}catch(a){return{ok:!1,value:null,diagnostics:[Le(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Oe={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function kn(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function ct(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Me(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Wt(e,t){return{...e,rotationDeg:kn(e.rotationDeg+t)}}function _e(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=Ee(e),a=ct(t.scale*n,i);if(a===t.scale)return t;let l=a/t.scale,s=r.x-o.x,c=r.y-o.y;return{...t,scale:a,translateX:(1-l)*s+l*t.translateX,translateY:(1-l)*c+l*t.translateY}}function Pe(e,t,n){let r=Ee(e),i=Ps(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),a=Math.max(e.height-n.fitPadding*2,1),l=Math.max(i.width,1),s=Math.max(i.height,1),c=ct(Math.min(o/l,a/s),n),u=be({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:c,translateX:r.x-(r.x+(u.x-r.x)*c),translateY:r.y-(r.y+(u.y-r.y)*c)}}function Yt(e,t,n,r){let i=e.objects.find(s=>s.objectId===n&&!s.hidden);if(!i)return t;let o=Ee(e),a=ct(Math.max(t.scale,1.8),r),l=be({x:i.x,y:i.y},o,t.rotationDeg);return{...t,scale:a,translateX:o.x-(o.x+(l.x-o.x)*a),translateY:o.y-(o.y+(l.y-o.y)*a),selectedObjectId:n}}function Ht(e,t){let n=Ee(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function Ne(e,t,n){let r=Ee(e),i={x:n.x-t.translateX,y:n.y-t.translateY},o={x:i.x-r.x,y:i.y-r.y},a={x:o.x/Math.max(t.scale,1e-4),y:o.y/Math.max(t.scale,1e-4)},l=be({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+l.x,y:r.y+l.y}}function qt(e,t){let n=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(l=>Ne(e,t,l)),r=Math.min(...n.map(l=>l.x)),i=Math.min(...n.map(l=>l.y)),o=Math.max(...n.map(l=>l.x)),a=Math.max(...n.map(l=>l.y));return{minX:r,minY:i,maxX:o,maxY:a,width:o-r,height:a-i,centerX:r+(o-r)/2,centerY:i+(a-i)/2}}function Ee(e){return{x:e.width/2,y:e.height/2}}function Ps(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(s=>be(s,t,n)),i=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),a=Math.max(...r.map(s=>s.x)),l=Math.max(...r.map(s=>s.y));return{minX:i,minY:o,maxX:a,maxY:l,width:a-i,height:l-o,centerX:i+(a-i)/2,centerY:o+(l-o)/2}}var Xt="worldorbit-camera-root";function se(e,t={}){let n=bt(t.theme),r=Xs(t.preset??e.renderPreset??void 0),i=yt({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=wt(e,t.filter??null),l=e.objects.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>i.structures||!Gt(h.object)).sort((h,$)=>h.sortKey-$.sortKey),s=e.labels.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>i.structures||!Gt(h.object)),c=Cs(l),u=i.orbits?Fs(e,a,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>i.structures||!Gt(h.object)).map(h=>`<line class="wo-leader wo-leader-${h.mode}" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${G(h.renderId)}" data-group-id="${K(h.groupId??"")}" />`).join(""):"",b=i.relations?e.relations.filter(h=>!h.hidden).filter(h=>a.has(h.fromObjectId)&&a.has(h.toObjectId)).map(h=>`<line class="wo-relation" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${G(h.renderId)}" data-relation-id="${K(h.relationId)}" />`).join(""):"",w=i.events?e.events.filter(h=>!h.hidden).map(h=>Es(e,h,a,n)).join(""):"",I=i.objects?l.map(h=>Vs(h,t.selectedObjectId??null,n)).join(""):"",v=i.labels?s.map(h=>Rs(e,h,t.selectedObjectId??null)).join(""):"",j=i.metadata?`<text class="wo-title" x="56" y="64">${G(e.title)}</text>
|
|
9
|
+
<text class="wo-subtitle" x="56" y="88">${G(o)}</text>
|
|
10
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${G(Zs(e))}</text>`:"",O=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
11
11
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
12
|
-
${
|
|
13
|
-
<title id="worldorbit-title">${
|
|
14
|
-
<desc id="worldorbit-desc">A ${
|
|
12
|
+
${i.guides?Ks(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
|
|
13
|
+
<title id="worldorbit-title">${G(e.title)}</title>
|
|
14
|
+
<desc id="worldorbit-desc">A ${G(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
|
|
15
15
|
<defs>
|
|
16
16
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
17
17
|
<stop offset="0%" stop-color="${n.backgroundStart}" />
|
|
@@ -65,61 +65,61 @@
|
|
|
65
65
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
66
66
|
.wo-object-image { pointer-events: none; }
|
|
67
67
|
</style>
|
|
68
|
-
${
|
|
68
|
+
${O}
|
|
69
69
|
${j}
|
|
70
70
|
<g data-worldorbit-world="true">
|
|
71
|
-
<g data-worldorbit-camera-root="${
|
|
71
|
+
<g data-worldorbit-camera-root="${Xt}" id="${Xt}">
|
|
72
72
|
<g data-worldorbit-world-content="true">
|
|
73
|
-
${
|
|
74
|
-
${
|
|
75
|
-
${
|
|
76
|
-
${
|
|
77
|
-
${
|
|
78
|
-
${
|
|
79
|
-
${
|
|
73
|
+
${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
|
|
74
|
+
${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
|
|
75
|
+
${i.relations?`<g data-layer-id="relations">${b}</g>`:""}
|
|
76
|
+
${i.events?`<g data-layer-id="events">${w}</g>`:""}
|
|
77
|
+
${i.objects?`<g data-layer-id="objects">${I}</g>`:""}
|
|
78
|
+
${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
|
|
79
|
+
${i.labels?`<g data-layer-id="labels">${v}</g>`:""}
|
|
80
80
|
</g>
|
|
81
81
|
</g>
|
|
82
82
|
</g>
|
|
83
|
-
</svg>`}function
|
|
84
|
-
${
|
|
85
|
-
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${K(
|
|
86
|
-
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${
|
|
87
|
-
</g>`}function
|
|
88
|
-
<circle class="wo-selection-ring" cx="${
|
|
89
|
-
${
|
|
90
|
-
${
|
|
83
|
+
</svg>`}function Es(e,t,n,r){let i=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,a=t.event.label||t.event.id,l=i.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${K(o)}" data-event-id="${K(t.eventId)}" data-object-id="${K(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${G(t.renderId)}" data-event-id="${K(t.eventId)}">
|
|
84
|
+
${l}
|
|
85
|
+
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${K(o)}" />
|
|
86
|
+
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${G(a)}</text>
|
|
87
|
+
</g>`}function On(e,t={}){return se(fe(e,t),t)}function Fr(e,t={}){let n=Se(e);return On(n.document,Ds(n,t))}function Ds(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Fs(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!Gt(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${G(o.renderId)}" data-orbit-object-id="${K(o.objectId)}" data-parent-id="${K(o.parentId)}" data-group-id="${K(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function Cs(e){return e.filter(t=>!!t.imageHref).map(t=>_s(t)).join("")}function Vs(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=Us(e,n),f=Bs(e),b=f?Pr(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${G(e.objectId)}" data-parent-id="${K(e.parentId??"")}" data-group-id="${K(e.groupId??"")}" data-render-id="${G(e.renderId)}" tabindex="0" role="button" aria-label="${G(`${r.type} ${e.objectId}`)}">
|
|
88
|
+
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
|
|
89
|
+
${zs(e,u)}
|
|
90
|
+
${Pr(r,i,o,a,u)}
|
|
91
91
|
${f}
|
|
92
92
|
${b}
|
|
93
|
-
</g>`}function
|
|
94
|
-
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*
|
|
95
|
-
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*
|
|
96
|
-
</g>`}function
|
|
97
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
98
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
99
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
100
|
-
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${
|
|
101
|
-
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${
|
|
102
|
-
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${
|
|
103
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${
|
|
104
|
-
<svg width="${
|
|
105
|
-
<rect x="0.5" y="0.5" width="${
|
|
106
|
-
<rect x="${
|
|
107
|
-
${
|
|
108
|
-
<rect x="${
|
|
93
|
+
</g>`}function Rs(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${G(t.objectId)}" data-group-id="${K(t.groupId??"")}" data-render-id="${G(t.renderId)}">
|
|
94
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${G(t.label)}</text>
|
|
95
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${G(t.secondaryLabel)}</text>
|
|
96
|
+
</g>`}function Pr(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
97
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
98
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Vr(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${jn(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
|
|
99
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
|
|
100
|
+
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
101
|
+
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
|
|
102
|
+
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
|
|
103
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${jn(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function zs(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Bs(e){if(!e.imageHref)return"";let t=Ns(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${K(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${K(Cr(e))})" />`}function _s(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Vr(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${jn(t,n,r)}" />`;break;default:return""}return`<clipPath id="${K(Cr(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Ns(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function Us(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Ws(e.object.type,n,t),i=e.fillColor&&Qs(e.fillColor)?e.fillColor:r.fill,o=Er(e.object.properties.albedo),a=Er(e.object.properties.temperature),l=Hs(i,a,o,e.object.type),s=ut(l,"#ffffff",.4)??r.stroke,c=Gs(e.object.properties.atmosphere),u=e.object.type==="star"?Dr(ut(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Dr(ut(l,"#ffffff",.5)??l,.72):void 0}}function Ws(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ys(t)}}function Ys(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 Hs(e,t,n,r){let i=e;if(t!==null){let o=qs(t,r);i=ut(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=ut(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function qs(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Gs(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 Xs(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 Er(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Cr(e){return`${e.renderId}-clip`}function Vr(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function jn(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function Ks(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function Zs(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Gt(e){return e.type==="structure"||e.type==="phenomenon"}function ut(e,t,n){let r=Sn(e),i=Sn(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return Js({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Dr(e,t){let n=Sn(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Sn(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 Js(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Qs(e){return!!e.trim()}function G(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function K(e){return G(e)}var Ue=180,We=120,Rr=10;function zr(e,t,n){let r=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},i=Math.min((Ue-Rr*2)/Math.max(r.width,1),(We-Rr*2)/Math.max(r.height,1)),o=(Ue-r.width*i)/2-r.minX*i,a=(We-r.height*i)/2-r.minY*i,l=qt(e,t),s=n.map(c=>{let u=c.x*i+o,f=c.y*i+a,b=Math.max(1.4,Math.min(c.visualRadius*i,5.2)),w=c.fillColor??el(c.object.type);return`<circle cx="${le(u)}" cy="${le(f)}" r="${le(b)}" fill="${w}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Ue}px;height:${We}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;">
|
|
104
|
+
<svg width="${Ue}" height="${We}" viewBox="0 0 ${Ue} ${We}" role="presentation" aria-hidden="true">
|
|
105
|
+
<rect x="0.5" y="0.5" width="${Ue-1}" height="${We-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
|
|
106
|
+
<rect x="${le(r.minX*i+o)}" y="${le(r.minY*i+a)}" width="${le(r.width*i)}" height="${le(r.height*i)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
|
|
107
|
+
${s}
|
|
108
|
+
<rect x="${le(l.minX*i+o)}" y="${le(l.minY*i+a)}" width="${le(l.width*i)}" height="${le(l.height*i)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
|
|
109
109
|
</svg>
|
|
110
|
-
</div>`}function
|
|
110
|
+
</div>`}function el(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 le(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var tl=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function _r(e){return{objectId:e.objectId,title:e.objectId,typeLabel:al(e.object.type),imageHref:e.renderObject.imageHref??null,description:il(e),tags:rl(e.object.properties.tags),fields:nl(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function Nr(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(o=>`<span class="wo-tooltip-tag">${me(o)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(o=>`<div class="wo-tooltip-field"><dt>${me(o.label)}</dt><dd>${me(o.value)}</dd></div>`).join("")}</dl>`:"",i=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${me(e.objectId)}">
|
|
111
111
|
<div class="wo-tooltip-head">
|
|
112
|
-
${e.imageHref?`<img class="wo-tooltip-image" src="${
|
|
112
|
+
${e.imageHref?`<img class="wo-tooltip-image" src="${ll(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${me(e.typeLabel.slice(0,1))}</div>`}
|
|
113
113
|
<div class="wo-tooltip-heading">
|
|
114
|
-
<strong>${
|
|
115
|
-
<span>${
|
|
114
|
+
<strong>${me(e.title)}</strong>
|
|
115
|
+
<span>${me(e.typeLabel)}</span>
|
|
116
116
|
</div>
|
|
117
117
|
</div>
|
|
118
|
-
${e.description?`<p class="wo-tooltip-description">${
|
|
118
|
+
${e.description?`<p class="wo-tooltip-description">${me(e.description)}</p>`:""}
|
|
119
119
|
${n}
|
|
120
120
|
${r}
|
|
121
|
-
${
|
|
122
|
-
</article>`}function Cs(e){let t=new Map;for(let r of Vs){let o=e.object.properties[r];o!==void 0&&t.set(r,{key:r,label:Ns(r),value:jr(o)})}let n=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),e.relatedEvents.length>0&&t.set("events",{key:"events",label:"Events",value:e.relatedEvents.map(r=>r.event.label||r.event.id).join(", ")}),n?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${n.target}`}):n?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${n.target}`}):n?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:n.distance?`Free ${jr(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function Rs(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Bs(e){let t=e.object.info.description?.trim();if(t)return t;let n=e.group?.label?.trim();return n&&n!==e.objectId?n:null}function jr(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):_s(e)}function _s(e){return`${e.value}${e.unit??""}`}function zs(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Ns(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function fe(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Us(e){return fe(e)}var _e={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Ar="worldorbit-viewer-tooltip-style";function Ie(e,t){if(qs(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let r={minScale:t.minScale??_e.minScale,maxScale:t.maxScale??_e.maxScale,fitPadding:t.fitPadding??_e.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??_e.panStep,zoomStep:t.zoomStep??_e.zoomStep,rotationStep:t.rotationStep??_e.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:te(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,l=e.style.position,c=Ws(t),u=at(c,i),f={...$e},b=null,w=null,$=null,v=null,j=!1,A=null,h=null,I=0,U=!1,C=new Map,D=null,z=null,T=null,H=null,F=null,W=null;a===null&&(e.tabIndex=0),Gs(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let R=d=>{if(!o.pointer||U)return;d.preventDefault(),e.focus();let m=_r(d.clientX,d.clientY),g=st(Math.exp(-d.deltaY*.002),.6,1.6);P(Ve(u,f,g,m,r))},M=d=>{if(U)return;let m=d.pointerType==="touch";if(m&&!o.touch||!m&&!o.pointer||!m&&d.button!==0)return;e.focus(),e.setPointerCapture?.(d.pointerId);let g=ut(d.clientX,d.clientY);if(m){C.set(d.pointerId,g),C.size===2?D=Mr(u,f,C):C.size===1&&(I=0,j=!1);return}A=d.pointerId,h=g,I=0,j=!1},Z=d=>{if(U)return;if(d.pointerType==="touch"){if(!o.touch||!C.has(d.pointerId))return;let L=C.get(d.pointerId),Ne=ut(d.clientX,d.clientY);if(C.set(d.pointerId,Ne),C.size===2){D||(D=Mr(u,f,C));let ce=Dr(C),Me=ce.distance/Math.max(D.startDistance,1),Kt=Ve(u,D.startState,Me,D.startCenter,r),Zt=ce.center.x-D.startViewportCenter.x,Jt=ce.center.y-D.startViewportCenter.y;P(je(Kt,Zt,Jt))}else if(C.size===1){let ce=Ne.x-L.x,Me=Ne.y-L.y;I+=Math.abs(ce)+Math.abs(Me),I>2&&(j=!0),P(je(f,ce,Me))}return}if(!o.pointer||A!==d.pointerId||!h)return;let g=ut(d.clientX,d.clientY),N=g.x-h.x,E=g.y-h.y;I+=Math.abs(N)+Math.abs(E),h=g,I>2&&(j=!0),P(je(f,N,E))},ee=d=>{if(d.pointerType==="touch"){C.delete(d.pointerId),C.size<2&&(D=null);return}A===d.pointerId&&(A=null,h=null)},y=d=>{if(!o.selection||U)return;if(j){j=!1;return}let m=Nt(d.target);J(m),o.tooltipMode==="pinned"&&(T=m,le())},k=d=>{let m=Nt(d.target);ze(m)},X=()=>{ze(null)},xe=d=>{let m=Nt(d.target);m&&ze(m)},Ae=()=>{ze(null)},ct=d=>{if(!o.keyboard||U)return;let m=Nt(d.target);if((d.key==="Enter"||d.key===" ")&&m){d.preventDefault(),J(m),o.tooltipMode==="pinned"&&(T=m,le());return}switch(d.key){case"Escape":o.tooltipMode==="pinned"&&T&&(d.preventDefault(),T=null,le());return;case"+":case"=":d.preventDefault(),_.zoomBy(o.zoomStep);return;case"-":d.preventDefault(),_.zoomBy(1/o.zoomStep);return;case"ArrowLeft":d.preventDefault(),_.panBy(-o.panStep,0);return;case"ArrowRight":d.preventDefault(),_.panBy(o.panStep,0);return;case"ArrowUp":d.preventDefault(),_.panBy(0,-o.panStep);return;case"ArrowDown":d.preventDefault(),_.panBy(0,o.panStep);return;case"[":d.preventDefault(),_.rotateBy(-o.rotationStep);return;case"]":d.preventDefault(),_.rotateBy(o.rotationStep);return;case"f":case"F":d.preventDefault(),_.fitToSystem();return;case"0":d.preventDefault(),_.resetView();return}};e.addEventListener("wheel",R,{passive:!1}),e.addEventListener("pointerdown",M),e.addEventListener("pointermove",Z),e.addEventListener("pointerup",ee),e.addEventListener("pointercancel",ee),e.addEventListener("click",y),e.addEventListener("mouseover",k),e.addEventListener("mouseleave",X),e.addEventListener("focusin",xe),e.addEventListener("focusout",Ae),e.addEventListener("keydown",ct);let _={setSource(d){c={kind:"source",value:d},u=at(c,i),W=null,x(!0)},setDocument(d){c={kind:"document",value:d},u=at(c,i),W=null,x(!0)},setScene(d){c={kind:"scene",value:d},u=d,W=null,x(!0)},getScene(){return u},getRenderOptions(){return Ys(i)},listViewpoints(){return u.viewpoints.slice()},getActiveViewpoint(){return qt(W)},goToViewpoint(d){let m=qt(d);if(!m)return!1;let g={},N=yt(m);if(m.preset!==null&&(g.preset=m.preset),c.kind!=="scene"&&m.projection!==u.projection&&(g.projection=m.projection),N&&(g.layers=N),W=m.id,Object.keys(g).length>0){let L=Tr(g);i=Lr(i,g),c.kind!=="scene"&&L&&(u=at(c,i)),x(L)}Gt(wt(m),!1,!1);let E=zr(m);return P(E),J(m.selectedObjectId??m.objectId??null,!1),t.onSelectionChange?.(Yt()),t.onSelectionDetailsChange?.(he(f.selectedObjectId)),Xt(),Te(),!0},getActiveEventId(){return i.activeEventId??null},setActiveEvent(d){_.setRenderOptions({activeEventId:d})},search(d,m=12){return ht(u,d,m)},getFilter(){return i.filter?{...i.filter}:null},setFilter(d){Gt(d,!0,!0)},getVisibleObjects(){return Ht()},getFocusPath(d){return wn(d)},getObjectDetails(d){return he(d)},getSelectionDetails(){return he(f.selectedObjectId)},getTooltipDetails(){return F},getAtlasState(){return xn(f,i,i.filter??null,W)},setAtlasState(d){let m=typeof d=="string"?bt(d):d;m.viewpointId&&_.goToViewpoint(m.viewpointId),_.setRenderOptions(m.renderOptions),Gt(m.filter??null,!1,!1),P(B({...f,...m.viewerState})),J(m.viewerState.selectedObjectId??null,!1),Xt(),t.onSelectionChange?.(Yt()),t.onSelectionDetailsChange?.(he(f.selectedObjectId)),Te()},serializeAtlasState(){return gt(_.getAtlasState())},captureBookmark(d,m){return kn(d,m,_.getAtlasState())},applyBookmark(d){return typeof d=="string"?(_.setAtlasState(d),!0):(_.setAtlasState(d.atlasState),!0)},setRenderOptions(d){let m=Tr(d);i=Lr(i,d),c.kind!=="scene"&&m&&(u=at(c,i)),x(m)},getState(){return{...f}},setState(d){P(B({...f,...d}))},zoomBy(d,m){P(Ve(u,f,d,m??{x:u.width/2,y:u.height/2},r))},panBy(d,m){P(je(f,d,m))},rotateBy(d){P(Vt(f,d))},fitToSystem(){P(Se(u,f,r))},focusObject(d){W=null,P(Ct(u,f,d,r)),J(d),o.tooltipMode==="pinned"&&(T=G(d)?.objectId??null,le())},pinTooltip(d){T=G(d)?.objectId??null,le()},resetView(){let d=Se(u,{...$e},r);W=null,P(d),J(null),T=null,le()},exportSvg(){return ae(u,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){U||(U=!0,e.removeEventListener("wheel",R),e.removeEventListener("pointerdown",M),e.removeEventListener("pointermove",Z),e.removeEventListener("pointerup",ee),e.removeEventListener("pointercancel",ee),e.removeEventListener("click",y),e.removeEventListener("mouseover",k),e.removeEventListener("mouseleave",X),e.removeEventListener("focusin",xe),e.removeEventListener("focusout",Ae),e.removeEventListener("keydown",ct),v?.remove(),v=null,$?.remove(),$=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=s,e.style.position=l,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return x(!0),t.initialViewpointId?_.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?_.focusObject(t.initialSelectionObjectId):Te(),_;function x(d){if(e.innerHTML=ae(u,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),b=e.querySelector('[data-worldorbit-svg="true"]'),w=e.querySelector("#worldorbit-camera-root"),$=null,v=null,o.minimap&&($=document.createElement("div"),$.dataset.worldorbitMinimapRoot="true",e.append($)),o.tooltipMode!=="disabled"&&(v=document.createElement("div"),v.className="wo-viewer-tooltip-root",v.dataset.worldorbitTooltip="true",v.hidden=!0,v.addEventListener("click",Gr),e.append(v)),!b||!w)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=d?Se(u,{...$e},r):B(f),J(f.selectedObjectId&&G(f.selectedObjectId)?f.selectedObjectId:null,!1),ze(z&&G(z)?z:null,!1),T=T&&G(T)?T:null,Le(),Nr(),Xt(),t.onViewChange?.({...f}),Te()}function P(d){f=B(d),Le(),t.onViewChange?.({...f}),Te()}function B(d){return{scale:st(d.scale,r.minScale,r.maxScale),rotationDeg:Er(d.rotationDeg),translateX:Number.isFinite(d.translateX)?d.translateX:f.translateX,translateY:Number.isFinite(d.translateY)?d.translateY:f.translateY,selectedObjectId:d.selectedObjectId&&G(d.selectedObjectId)?d.selectedObjectId:null}}function Le(){w&&(w.setAttribute("transform",Rt(u,f)),Ur(),le())}function J(d,m=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${lt(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:d&&G(d)?d:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${lt(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),gn(),le(),m&&(t.onSelectionChange?.(Yt()),t.onSelectionDetailsChange?.(he(f.selectedObjectId)),t.onViewChange?.({...f}),Te())}function ze(d,m=!0){z===d&&m||(z=d&&G(d)?d:null,gn(),le(),m&&(t.onHoverChange?.(G(z)),t.onHoverDetailsChange?.(he(z))))}function Yt(){return G(f.selectedObjectId)}function G(d){if(!d)return null;let m=yn();return u.objects.find(g=>g.objectId===d&&!g.hidden&&m.has(g.objectId))??null}function he(d){let m=G(d);return m?{objectId:m.objectId,object:m.object,renderObject:m,label:u.labels.find(g=>g.objectId===m.objectId&&!g.hidden)??null,group:u.groups.find(g=>g.renderId===m.groupId)??null,semanticGroups:u.semanticGroups.filter(g=>m.semanticGroupIds.includes(g.id)),orbit:u.orbitVisuals.find(g=>g.objectId===m.objectId&&!g.hidden)??null,relatedOrbits:u.orbitVisuals.filter(g=>!g.hidden&&(g.objectId===m.objectId||m.ancestorIds.includes(g.objectId)||m.childIds.includes(g.objectId))),relations:u.relations.filter(g=>!g.hidden&&(g.fromObjectId===m.objectId||g.toObjectId===m.objectId)),relatedEvents:u.events.filter(g=>!g.hidden&&(g.targetObjectId===m.objectId||g.objectIds.includes(m.objectId))),parent:G(m.parentId),children:m.childIds.map(g=>G(g)).filter(Boolean),ancestors:m.ancestorIds.map(g=>G(g)).filter(Boolean),focusPath:wn(m.objectId)}:null}function gn(){for(let d of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))d.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");bn(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),bn(z,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function bn(d,m){let g=he(d);if(!g)return;let N=new Set([g.objectId,...g.renderObject.childIds,...g.renderObject.ancestorIds]);for(let E of N)for(let L of e.querySelectorAll(`[data-object-id="${lt(E)}"]`))L.classList.add(m.objectClass);for(let E of g.ancestors)for(let L of e.querySelectorAll(`[data-object-id="${lt(E.objectId)}"]`))L.classList.add(m.ancestorClass);for(let E of g.relatedOrbits)for(let L of e.querySelectorAll(`[data-orbit-object-id="${lt(E.objectId)}"]`))L.classList.add(m.orbitClass)}function ut(d,m){if(!b)return{x:u.width/2,y:u.height/2};let g=b.getBoundingClientRect();return!g.width||!g.height?{x:u.width/2,y:u.height/2}:{x:(d-g.left)/g.width*u.width,y:(m-g.top)/g.height*u.height}}function _r(d,m){return Ce(u,f,ut(d,m))}function yn(){return mt(u,i.filter??null)}function Ht(){let d=yn();return u.objects.filter(m=>!m.hidden&&d.has(m.objectId))}function wn(d){let m=u.objects.find(g=>g.objectId===d&&!g.hidden);return m?[...m.ancestorIds,m.objectId].map(g=>G(g)).filter(Boolean):[]}function qt(d){return u.viewpoints.find(m=>m.id===d)??null}function zr(d){let m=Er(d.rotationDeg),g=d.scale!==null&&d.scale!==void 0?st(d.scale,r.minScale,r.maxScale):null,N=d.objectId&&u.objects.find(L=>L.objectId===d.objectId&&!L.hidden);if(N)return vn({x:N.x,y:N.y},g??Math.max(1.8,$e.scale),m,d.selectedObjectId??N.objectId);let E=Se(u,{...$e,rotationDeg:m},r);return g===null?{...E,rotationDeg:m,selectedObjectId:d.selectedObjectId??null}:vn({x:u.contentBounds.centerX,y:u.contentBounds.centerY},g,m,d.selectedObjectId??null)}function vn(d,m,g,N){let E={x:u.width/2,y:u.height/2},L=pe(d,E,g);return{scale:m,rotationDeg:g,translateX:E.x-(E.x+(L.x-E.x)*m),translateY:E.y-(E.y+(L.y-E.y)*m),selectedObjectId:N}}function Gt(d,m,g){i={...i,filter:te(d)},g&&(W=null),x(!1)}function Nr(){t.onFilterChange?.(i.filter??null,Ht())}function Xt(){t.onViewpointChange?.(qt(W))}function Te(){t.onAtlasStateChange?.(_.getAtlasState())}function Ur(){!o.minimap||!$||($.innerHTML=kr(u,f,Ht()))}function le(){if(o.tooltipMode==="disabled"||!v){dt(null);return}let d=Wr();if(!d){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),dt(null);return}let m=he(d.objectId);if(!m){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),dt(null);return}let g=Sr(m);H=d.objectId,v.hidden=!1,v.dataset.mode=d.mode,v.classList.toggle("is-pinned",d.mode==="pinned"),v.style.pointerEvents="auto",v.style.visibility="hidden",Yr(v,g,d.mode),Hr(v,m.renderObject),v.style.visibility="visible",dt(g)}function Wr(){return T&&G(T)?{objectId:T,mode:"pinned"}:z&&G(z)?{objectId:z,mode:"hover"}:null}function Yr(d,m,g){let N=t.tooltipRenderer?.(m,g);d.innerHTML="",typeof N=="string"?d.innerHTML=N:N instanceof HTMLElement?d.append(N):d.innerHTML=Or(m,g);let E=document.createElement("div");if(E.className="wo-tooltip-actions",g==="pinned"){let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="unpin",L.textContent="Unpin",E.append(L)}else{let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="pin",L.dataset.objectId=m.objectId,L.textContent="Pin",E.append(L)}E.childElementCount>0&&d.append(E)}function Hr(d,m){if(!b)return;let g={x:m.anchorX??m.x,y:m.anchorY??m.y-Math.max(m.visualRadius,m.radius)},N=qr(g),E=b.getBoundingClientRect(),L=e.getBoundingClientRect(),Ne=E.left-L.left+N.x/Math.max(u.width,1)*E.width,ce=E.top-L.top+N.y/Math.max(u.height,1)*E.height,Me=Math.max(e.clientWidth-d.offsetWidth-12,12),Kt=Math.max(e.clientHeight-d.offsetHeight-12,12),Zt=ce>e.clientHeight*.48,Jt=st(Ne+18,12,Me),Xr=st(Zt?ce-d.offsetHeight-18:ce+18,12,Kt);d.style.left=`${Jt}px`,d.style.top=`${Xr}px`}function qr(d){let m={x:u.width/2,y:u.height/2},g=pe(d,m,f.rotationDeg);return{x:m.x+(g.x-m.x)*f.scale+f.translateX,y:m.y+(g.y-m.y)*f.scale+f.translateY}}function Gr(d){let m=d.target?.closest("[data-tooltip-action]");if(m){switch(d.preventDefault(),d.stopPropagation(),m.dataset.tooltipAction){case"pin":T=m.dataset.objectId??H;break;case"unpin":T=null;break}le()}}function dt(d){let m=F?.objectId!==d?.objectId||F?.description!==d?.description||F?.imageHref!==d?.imageHref;F=d,H=d?.objectId??null,m&&t.onTooltipChange?.(d)}}function Ws(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 at(e,t){switch(e.kind){case"scene":return e.value;case"document":return ue(e.value,t);case"source":{let n=ve(e.value);return ue(n.document,Hs(n,t))}}}function Ys(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme,activeEventId:e.activeEventId??null}}function Lr(e,t){return{...e,...t,filter:t.filter!==void 0?te(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 Tr(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0||e.activeEventId!==void 0}function Hs(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Mr(e,t,n){let{center:r,distance:o}=Dr(n);return{startState:{...t},startCenter:Ce(e,t,r),startViewportCenter:r,startDistance:o}}function Dr(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[n,r]=t;return{center:{x:(n.x+r.x)/2,y:(n.y+r.y)/2},distance:Math.hypot(r.x-n.x,r.y-n.y)}}function Nt(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function qs(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 st(e,t,n){return Math.min(Math.max(e,t),n)}function Er(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function lt(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Gs(){if(typeof document>"u"||document.getElementById(Ar))return;let e=document.createElement("style");e.id=Ar,e.textContent=`
|
|
121
|
+
${i.length?`<p class="wo-tooltip-relations">${me(i.join(" - "))}</p>`:""}
|
|
122
|
+
</article>`}function nl(e){let t=new Map;for(let r of tl){let i=e.object.properties[r];i!==void 0&&t.set(r,{key:r,label:sl(r),value:Br(i)})}let n=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),e.relatedEvents.length>0&&t.set("events",{key:"events",label:"Events",value:e.relatedEvents.map(r=>r.event.label||r.event.id).join(", ")}),n?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${n.target}`}):n?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${n.target}`}):n?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:n.distance?`Free ${Br(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function rl(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function il(e){let t=e.object.info.description?.trim();if(t)return t;let n=e.group?.label?.trim();return n&&n!==e.objectId?n:null}function Br(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):ol(e)}function ol(e){return`${e.value}${e.unit??""}`}function al(e){return e.charAt(0).toUpperCase()+e.slice(1)}function sl(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function me(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function ll(e){return me(e)}var Ye={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Ur="worldorbit-viewer-tooltip-style";function Ae(e,t){if(fl(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let r={minScale:t.minScale??Ye.minScale,maxScale:t.maxScale??Ye.maxScale,fitPadding:t.fitPadding??Ye.fitPadding},i={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??Ye.panStep,zoomStep:t.zoomStep??Ye.zoomStep,rotationStep:t.rotationStep??Ye.rotationStep},o={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:te(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),l=e.style.touchAction,s=e.style.position,c=cl(t),u=dt(c,o),f={...Oe},b=null,w=null,I=null,v=null,j=!1,O=null,h=null,$=0,W=!1,F=new Map,T=null,_=null,M=null,Z=null,R=null,N=null;a===null&&(e.tabIndex=0),pl(),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":l,e.style.position||(e.style.position="relative");let Y=d=>{if(!i.pointer||W)return;d.preventDefault(),e.focus();let m=ti(d.clientX,d.clientY),g=ft(Math.exp(-d.deltaY*.002),.6,1.6);J(_e(u,f,g,m,r))},E=d=>{if(W)return;let m=d.pointerType==="touch";if(m&&!i.touch||!m&&!i.pointer||!m&&d.button!==0)return;e.focus(),e.setPointerCapture?.(d.pointerId);let g=ht(d.clientX,d.clientY);if(m){F.set(d.pointerId,g),F.size===2?T=Hr(u,f,F):F.size===1&&($=0,j=!1);return}O=d.pointerId,h=g,$=0,j=!1},H=d=>{if(W)return;if(d.pointerType==="touch"){if(!i.touch||!F.has(d.pointerId))return;let L=F.get(d.pointerId),He=ht(d.clientX,d.clientY);if(F.set(d.pointerId,He),F.size===2){T||(T=Hr(u,f,F));let de=Gr(F),Ce=de.distance/Math.max(T.startDistance,1),rn=_e(u,T.startState,Ce,T.startCenter,r),on=de.center.x-T.startViewportCenter.x,an=de.center.y-T.startViewportCenter.y;J(Me(rn,on,an))}else if(F.size===1){let de=He.x-L.x,Ce=He.y-L.y;$+=Math.abs(de)+Math.abs(Ce),$>2&&(j=!0),J(Me(f,de,Ce))}return}if(!i.pointer||O!==d.pointerId||!h)return;let g=ht(d.clientX,d.clientY),U=g.x-h.x,P=g.y-h.y;$+=Math.abs(U)+Math.abs(P),h=g,$>2&&(j=!0),J(Me(f,U,P))},ee=d=>{if(d.pointerType==="touch"){F.delete(d.pointerId),F.size<2&&(T=null);return}O===d.pointerId&&(O=null,h=null)},y=d=>{if(!i.selection||W)return;if(j){j=!1;return}let m=Kt(d.target);C(m),i.tooltipMode==="pinned"&&(M=m,ue())},x=d=>{let m=Kt(d.target);ge(m)},z=()=>{ge(null)},ce=d=>{let m=Kt(d.target);m&&ge(m)},De=()=>{ge(null)},mt=d=>{if(!i.keyboard||W)return;let m=Kt(d.target);if((d.key==="Enter"||d.key===" ")&&m){d.preventDefault(),C(m),i.tooltipMode==="pinned"&&(M=m,ue());return}switch(d.key){case"Escape":i.tooltipMode==="pinned"&&M&&(d.preventDefault(),M=null,ue());return;case"+":case"=":d.preventDefault(),B.zoomBy(i.zoomStep);return;case"-":d.preventDefault(),B.zoomBy(1/i.zoomStep);return;case"ArrowLeft":d.preventDefault(),B.panBy(-i.panStep,0);return;case"ArrowRight":d.preventDefault(),B.panBy(i.panStep,0);return;case"ArrowUp":d.preventDefault(),B.panBy(0,-i.panStep);return;case"ArrowDown":d.preventDefault(),B.panBy(0,i.panStep);return;case"[":d.preventDefault(),B.rotateBy(-i.rotationStep);return;case"]":d.preventDefault(),B.rotateBy(i.rotationStep);return;case"f":case"F":d.preventDefault(),B.fitToSystem();return;case"0":d.preventDefault(),B.resetView();return}};e.addEventListener("wheel",Y,{passive:!1}),e.addEventListener("pointerdown",E),e.addEventListener("pointermove",H),e.addEventListener("pointerup",ee),e.addEventListener("pointercancel",ee),e.addEventListener("click",y),e.addEventListener("mouseover",x),e.addEventListener("mouseleave",z),e.addEventListener("focusin",ce),e.addEventListener("focusout",De),e.addEventListener("keydown",mt);let B={setSource(d){c={kind:"source",value:d},u=dt(c,o),N=null,he(!0)},setDocument(d){c={kind:"document",value:d},u=dt(c,o),N=null,he(!0)},setScene(d){c={kind:"scene",value:d},u=d,N=null,he(!0)},getScene(){return u},getRenderOptions(){return ul(o)},listViewpoints(){return u.viewpoints.slice()},getActiveViewpoint(){return en(N)},goToViewpoint(d){let m=en(d);if(!m)return!1;let g={},U=xt(m);if(m.preset!==null&&(g.preset=m.preset),c.kind!=="scene"&&m.projection!==u.projection&&(g.projection=m.projection),m.camera?g.camera={...m.camera}:o.camera&&(g.camera=null),U&&(g.layers=U),N=m.id,Object.keys(g).length>0){let L=Yr(g);o=Wr(o,g),c.kind!=="scene"&&L&&(u=dt(c,o)),he(L)}tn(kt(m),!1,!1);let P=ni(m);return J(P),C(m.selectedObjectId??m.objectId??null,!1),t.onSelectionChange?.(oe()),t.onSelectionDetailsChange?.(ve(f.selectedObjectId)),nn(),Fe(),!0},getActiveEventId(){return o.activeEventId??null},setActiveEvent(d){B.setRenderOptions({activeEventId:d})},search(d,m=12){return vt(u,d,m)},getFilter(){return o.filter?{...o.filter}:null},setFilter(d){tn(d,!0,!0)},getVisibleObjects(){return Qt()},getFocusPath(d){return En(d)},getObjectDetails(d){return ve(d)},getSelectionDetails(){return ve(f.selectedObjectId)},getTooltipDetails(){return R},getAtlasState(){return Vn(f,o,o.filter??null,N)},setAtlasState(d){let m=typeof d=="string"?It(d):d;m.viewpointId&&B.goToViewpoint(m.viewpointId),B.setRenderOptions(m.renderOptions),tn(m.filter??null,!1,!1),J(k({...f,...m.viewerState})),C(m.viewerState.selectedObjectId??null,!1),nn(),t.onSelectionChange?.(oe()),t.onSelectionDetailsChange?.(ve(f.selectedObjectId)),Fe()},serializeAtlasState(){return $t(B.getAtlasState())},captureBookmark(d,m){return Rn(d,m,B.getAtlasState())},applyBookmark(d){return typeof d=="string"?(B.setAtlasState(d),!0):(B.setAtlasState(d.atlasState),!0)},setRenderOptions(d){let m=Yr(d);o=Wr(o,d),c.kind!=="scene"&&m&&(u=dt(c,o)),he(m)},getState(){return{...f}},setState(d){J(k({...f,...d}))},zoomBy(d,m){J(_e(u,f,d,m??{x:u.width/2,y:u.height/2},r))},panBy(d,m){J(Me(f,d,m))},rotateBy(d){J(Wt(f,d))},fitToSystem(){J(Pe(u,f,r))},focusObject(d){N=null,J(Yt(u,f,d,r)),C(d),i.tooltipMode==="pinned"&&(M=X(d)?.objectId??null,ue())},pinTooltip(d){M=X(d)?.objectId??null,ue()},resetView(){let d=Pe(u,{...Oe},r);N=null,J(d),C(null),M=null,ue()},exportSvg(){return se(u,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){W||(W=!0,e.removeEventListener("wheel",Y),e.removeEventListener("pointerdown",E),e.removeEventListener("pointermove",H),e.removeEventListener("pointerup",ee),e.removeEventListener("pointercancel",ee),e.removeEventListener("click",y),e.removeEventListener("mouseover",x),e.removeEventListener("mouseleave",z),e.removeEventListener("focusin",ce),e.removeEventListener("focusout",De),e.removeEventListener("keydown",mt),v?.remove(),v=null,I?.remove(),I=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=l,e.style.position=s,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return he(!0),t.initialViewpointId?B.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?B.focusObject(t.initialSelectionObjectId):Fe(),B;function he(d){if(e.innerHTML=se(u,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId}),b=e.querySelector('[data-worldorbit-svg="true"]'),w=e.querySelector("#worldorbit-camera-root"),I=null,v=null,i.minimap&&(I=document.createElement("div"),I.dataset.worldorbitMinimapRoot="true",e.append(I)),i.tooltipMode!=="disabled"&&(v=document.createElement("div"),v.className="wo-viewer-tooltip-root",v.dataset.worldorbitTooltip="true",v.hidden=!0,v.addEventListener("click",ci),e.append(v)),!b||!w)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=d?Pe(u,{...Oe},r):k(f),C(f.selectedObjectId&&X(f.selectedObjectId)?f.selectedObjectId:null,!1),ge(_&&X(_)?_:null,!1),M=M&&X(M)?M:null,Q(),ri(),nn(),t.onViewChange?.({...f}),Fe()}function J(d){f=k(d),Q(),t.onViewChange?.({...f}),Fe()}function k(d){return{scale:ft(d.scale,r.minScale,r.maxScale),rotationDeg:qr(d.rotationDeg),translateX:Number.isFinite(d.translateX)?d.translateX:f.translateX,translateY:Number.isFinite(d.translateY)?d.translateY:f.translateY,selectedObjectId:d.selectedObjectId&&X(d.selectedObjectId)?d.selectedObjectId:null}}function Q(){w&&(w.setAttribute("transform",Ht(u,f)),ii(),ue())}function C(d,m=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${pt(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:d&&X(d)?d:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${pt(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),Tn(),ue(),m&&(t.onSelectionChange?.(oe()),t.onSelectionDetailsChange?.(ve(f.selectedObjectId)),t.onViewChange?.({...f}),Fe())}function ge(d,m=!0){_===d&&m||(_=d&&X(d)?d:null,Tn(),ue(),m&&(t.onHoverChange?.(X(_)),t.onHoverDetailsChange?.(ve(_))))}function oe(){return X(f.selectedObjectId)}function X(d){if(!d)return null;let m=Pn();return u.objects.find(g=>g.objectId===d&&!g.hidden&&m.has(g.objectId))??null}function ve(d){let m=X(d);return m?{objectId:m.objectId,object:m.object,renderObject:m,label:u.labels.find(g=>g.objectId===m.objectId&&!g.hidden)??null,group:u.groups.find(g=>g.renderId===m.groupId)??null,semanticGroups:u.semanticGroups.filter(g=>m.semanticGroupIds.includes(g.id)),orbit:u.orbitVisuals.find(g=>g.objectId===m.objectId&&!g.hidden)??null,relatedOrbits:u.orbitVisuals.filter(g=>!g.hidden&&(g.objectId===m.objectId||m.ancestorIds.includes(g.objectId)||m.childIds.includes(g.objectId))),relations:u.relations.filter(g=>!g.hidden&&(g.fromObjectId===m.objectId||g.toObjectId===m.objectId)),relatedEvents:u.events.filter(g=>!g.hidden&&(g.targetObjectId===m.objectId||g.objectIds.includes(m.objectId))),parent:X(m.parentId),children:m.childIds.map(g=>X(g)).filter(Boolean),ancestors:m.ancestorIds.map(g=>X(g)).filter(Boolean),focusPath:En(m.objectId)}:null}function Tn(){for(let d of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))d.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Mn(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Mn(_,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Mn(d,m){let g=ve(d);if(!g)return;let U=new Set([g.objectId,...g.renderObject.childIds,...g.renderObject.ancestorIds]);for(let P of U)for(let L of e.querySelectorAll(`[data-object-id="${pt(P)}"]`))L.classList.add(m.objectClass);for(let P of g.ancestors)for(let L of e.querySelectorAll(`[data-object-id="${pt(P.objectId)}"]`))L.classList.add(m.ancestorClass);for(let P of g.relatedOrbits)for(let L of e.querySelectorAll(`[data-orbit-object-id="${pt(P.objectId)}"]`))L.classList.add(m.orbitClass)}function ht(d,m){if(!b)return{x:u.width/2,y:u.height/2};let g=b.getBoundingClientRect();return!g.width||!g.height?{x:u.width/2,y:u.height/2}:{x:(d-g.left)/g.width*u.width,y:(m-g.top)/g.height*u.height}}function ti(d,m){return Ne(u,f,ht(d,m))}function Pn(){return wt(u,o.filter??null)}function Qt(){let d=Pn();return u.objects.filter(m=>!m.hidden&&d.has(m.objectId))}function En(d){let m=u.objects.find(g=>g.objectId===d&&!g.hidden);return m?[...m.ancestorIds,m.objectId].map(g=>X(g)).filter(Boolean):[]}function en(d){return u.viewpoints.find(m=>m.id===d)??null}function ni(d){let m=qr(d.rotationDeg),g=d.scale!==null&&d.scale!==void 0?ft(d.scale,r.minScale,r.maxScale):null,U=d.objectId&&u.objects.find(L=>L.objectId===d.objectId&&!L.hidden);if(U)return Dn({x:U.x,y:U.y},g??Math.max(1.8,Oe.scale),m,d.selectedObjectId??U.objectId);let P=Pe(u,{...Oe,rotationDeg:m},r);return g===null?{...P,rotationDeg:m,selectedObjectId:d.selectedObjectId??null}:Dn({x:u.contentBounds.centerX,y:u.contentBounds.centerY},g,m,d.selectedObjectId??null)}function Dn(d,m,g,U){let P={x:u.width/2,y:u.height/2},L=be(d,P,g);return{scale:m,rotationDeg:g,translateX:P.x-(P.x+(L.x-P.x)*m),translateY:P.y-(P.y+(L.y-P.y)*m),selectedObjectId:U}}function tn(d,m,g){o={...o,filter:te(d)},g&&(N=null),he(!1)}function ri(){t.onFilterChange?.(o.filter??null,Qt())}function nn(){t.onViewpointChange?.(en(N))}function Fe(){t.onAtlasStateChange?.(B.getAtlasState())}function ii(){!i.minimap||!I||(I.innerHTML=zr(u,f,Qt()))}function ue(){if(i.tooltipMode==="disabled"||!v){gt(null);return}let d=oi();if(!d){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),gt(null);return}let m=ve(d.objectId);if(!m){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),gt(null);return}let g=_r(m);Z=d.objectId,v.hidden=!1,v.dataset.mode=d.mode,v.classList.toggle("is-pinned",d.mode==="pinned"),v.style.pointerEvents="auto",v.style.visibility="hidden",ai(v,g,d.mode),si(v,m.renderObject),v.style.visibility="visible",gt(g)}function oi(){return M&&X(M)?{objectId:M,mode:"pinned"}:_&&X(_)?{objectId:_,mode:"hover"}:null}function ai(d,m,g){let U=t.tooltipRenderer?.(m,g);d.innerHTML="",typeof U=="string"?d.innerHTML=U:U instanceof HTMLElement?d.append(U):d.innerHTML=Nr(m,g);let P=document.createElement("div");if(P.className="wo-tooltip-actions",g==="pinned"){let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="unpin",L.textContent="Unpin",P.append(L)}else{let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="pin",L.dataset.objectId=m.objectId,L.textContent="Pin",P.append(L)}P.childElementCount>0&&d.append(P)}function si(d,m){if(!b)return;let g={x:m.anchorX??m.x,y:m.anchorY??m.y-Math.max(m.visualRadius,m.radius)},U=li(g),P=b.getBoundingClientRect(),L=e.getBoundingClientRect(),He=P.left-L.left+U.x/Math.max(u.width,1)*P.width,de=P.top-L.top+U.y/Math.max(u.height,1)*P.height,Ce=Math.max(e.clientWidth-d.offsetWidth-12,12),rn=Math.max(e.clientHeight-d.offsetHeight-12,12),on=de>e.clientHeight*.48,an=ft(He+18,12,Ce),ui=ft(on?de-d.offsetHeight-18:de+18,12,rn);d.style.left=`${an}px`,d.style.top=`${ui}px`}function li(d){let m={x:u.width/2,y:u.height/2},g=be(d,m,f.rotationDeg);return{x:m.x+(g.x-m.x)*f.scale+f.translateX,y:m.y+(g.y-m.y)*f.scale+f.translateY}}function ci(d){let m=d.target?.closest("[data-tooltip-action]");if(m){switch(d.preventDefault(),d.stopPropagation(),m.dataset.tooltipAction){case"pin":M=m.dataset.objectId??Z;break;case"unpin":M=null;break}ue()}}function gt(d){let m=R?.objectId!==d?.objectId||R?.description!==d?.description||R?.imageHref!==d?.imageHref;R=d,Z=d?.objectId??null,m&&t.onTooltipChange?.(d)}}function cl(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 dt(e,t){switch(e.kind){case"scene":return e.value;case"document":return fe(e.value,t);case"source":{let n=Se(e.value);return fe(n.document,dl(n,t))}}}function ul(e){return{...e,camera:e.camera?{...e.camera}:null,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme,activeEventId:e.activeEventId??null}}function Wr(e,t){return{...e,...t,camera:t.camera!==void 0?t.camera?{...t.camera}:null:e.camera?{...e.camera}:null,filter:t.filter!==void 0?te(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 Yr(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.camera!==void 0||e.scaleModel!==void 0||e.activeEventId!==void 0}function dl(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Hr(e,t,n){let{center:r,distance:i}=Gr(n);return{startState:{...t},startCenter:Ne(e,t,r),startViewportCenter:r,startDistance:i}}function Gr(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[n,r]=t;return{center:{x:(n.x+r.x)/2,y:(n.y+r.y)/2},distance:Math.hypot(r.x-n.x,r.y-n.y)}}function Kt(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function fl(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 ft(e,t,n){return Math.min(Math.max(e,t),n)}function qr(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function pt(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function pl(){if(typeof document>"u"||document.getElementById(Ur))return;let e=document.createElement("style");e.id=Ur,e.textContent=`
|
|
123
123
|
.wo-viewer-tooltip-root {
|
|
124
124
|
position: absolute;
|
|
125
125
|
z-index: 12;
|
|
@@ -185,7 +185,7 @@
|
|
|
185
185
|
padding: 6px 12px;
|
|
186
186
|
font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
|
|
187
187
|
}
|
|
188
|
-
`,document.head.append(e)}var
|
|
188
|
+
`,document.head.append(e)}var ml="[data-worldorbit-embed]";function An(e){return encodeURIComponent(JSON.stringify(e))}function Ln(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 Xr(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Kr(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=se(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${Zt(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Zt(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Zt(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${Zt(An(n))}">${r}</div>`}function Zr(e=document,t={}){let n=new Map,r=[...e.querySelectorAll(ml)];for(let i of r){let o=hl(i),a=t.mode??o.mode,l=t.theme??o.options?.theme,s=t.layers??o.options?.layers,c=t.subtitle??o.options?.subtitle,u=t.preset??o.options?.preset??o.scene.renderPreset??void 0,f=t.viewer?.initialFilter??o.options?.initialFilter??null,b=t.viewer?.initialViewpointId??o.options?.initialViewpointId,w=t.viewer?.initialSelectionObjectId??o.options?.initialSelectionObjectId,I=t.viewer?.minimap??o.options?.minimap;if(a==="interactive"){let v=Ae(i,{...t.viewer,scene:o.scene,width:t.width??o.scene.width,height:t.height??o.scene.height,padding:t.padding??o.scene.padding,preset:u,theme:l,layers:s,subtitle:c,initialFilter:f,initialViewpointId:b,initialSelectionObjectId:w,minimap:I});o.options?.atlasState&&v.setAtlasState(o.options.atlasState),n.set(i,v),t.onMount?.(v,i)}else i.innerHTML=se(o.scene,{width:t.width??o.scene.width,height:t.height??o.scene.height,padding:t.padding??o.scene.padding,preset:u,theme:l,layers:s,filter:f,selectedObjectId:w??null,subtitle:c}),t.onMount?.(null,i);i.dataset.worldorbitMounted="true"}return{viewers:[...n.values()],destroy(){for(let[i,o]of n.entries())o.destroy(),i.removeAttribute("data-worldorbit-mounted");n.clear()}}}function hl(e){let t=e.dataset.worldorbitPayload;if(!t)throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");return Ln(t)}function Zt(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}var Jr="worldorbit-atlas-viewer-style";function Jt(e,t){if(typeof document>"u")throw new Error("Atlas viewer requires a browser environment.");bl();let n={search:t.controls?.search??!0,typeFilter:t.controls?.typeFilter??!0,groupFilter:t.controls?.groupFilter??!0,viewpointSelect:t.controls?.viewpointSelect??!0,inspector:t.controls?.inspector??!0,bookmarks:t.controls?.bookmarks??!0};e.classList.add("wo-atlas-viewer"),e.innerHTML=gl(n);let r=e.querySelector("[data-atlas-toolbar]"),i=e.querySelector("[data-atlas-search]"),o=e.querySelector("[data-atlas-type-filter]"),a=e.querySelector("[data-atlas-group-filter]"),l=e.querySelector("[data-atlas-viewpoint]"),s=e.querySelector("[data-atlas-bookmark]"),c=e.querySelector("[data-atlas-bookmarks]"),u=e.querySelector("[data-atlas-results]"),f=e.querySelector("[data-atlas-inspector]"),b=e.querySelector("[data-atlas-stage]");if(!b)throw new Error("Atlas viewer failed to initialize its stage container.");let w=te(t.initialFilter??null),I=t.initialQuery?.trim()??w?.query??"",v=t.initialObjectType??(w?.objectTypes?.length===1?w.objectTypes[0]:null),j=w?.groupIds?.[0]??null,O=[],h;h=Ae(b,{...t,initialFilter:null,onSelectionChange(y){h&&E(),t.onSelectionChange?.(y)},onSelectionDetailsChange(y){h&&E(),t.onSelectionDetailsChange?.(y)},onFilterChange(y,x){h&&(M(y),Y(),E()),t.onFilterChange?.(y,x)},onViewpointChange(y){h&&(N(),E()),t.onViewpointChange?.(y)},onAtlasStateChange(y){h&&E(),t.onAtlasStateChange?.(y)},onViewChange(y){h&&E(),t.onViewChange?.(y)}}),T(),Z(),R(),M(h.getFilter()),ee(),Y(),E(),i?.addEventListener("input",()=>{I=i.value.trim(),T()}),o?.addEventListener("change",()=>{v=o.value||null,T()}),a?.addEventListener("change",()=>{j=a.value||null,T()}),l?.addEventListener("change",()=>{let y=$();if(!l.value){y.resetView(),T();return}y.goToViewpoint(l.value),E()}),s?.addEventListener("click",()=>{let y=$(),x=y.getActiveViewpoint()?.label??y.getSelectionDetails()?.objectId??`Bookmark ${O.length+1}`;O=[...O,y.captureBookmark(x,x)],ee(),E()}),c?.addEventListener("click",y=>{let x=y.target?.closest("[data-bookmark-id]");if(!x)return;let z=O.find(De=>De.id===x.dataset.bookmarkId);if(!z)return;let ce=$();ce.applyBookmark(z),M(ce.getFilter()),Y(),E()}),u?.addEventListener("click",y=>{let x=y.target?.closest("[data-object-id]");x&&($().focusObject(x.dataset.objectId??""),E())});function $(){if(!h)throw new Error("Atlas viewer is not initialized.");return h}return{element:e,get viewer(){return $()},getViewer(){return $()},setSource(y){$().setSource(y),F()},setDocument(y){$().setDocument(y),F()},setScene(y){$().setScene(y),F()},getAtlasState(){return $().getAtlasState()},setAtlasState(y){let x=$();x.setAtlasState(y),M(x.getFilter()),Y(),E()},getInspectorSnapshot(){return H()},getSearchQuery(){return I},setSearchQuery(y){I=y.trim(),i&&(i.value=I),T()},getObjectTypeFilter(){return v},setObjectTypeFilter(y){v=y,o&&(o.value=y??""),T()},listSearchResults(y=6){return $().search(I,y)},listBookmarks(){return O.map(Qr)},captureBookmark(y,x){let z=$().captureBookmark(y,x);return O=[...O,z],ee(),E(),Qr(z)},applyBookmark(y){let x=$(),z=x.applyBookmark(y);return z&&(M(x.getFilter()),Y(),E()),z},goToViewpoint(y){let x=$().goToViewpoint(y);return x&&E(),x},exportSvg(){return $().exportSvg()},destroy(){$().destroy(),e.innerHTML="",e.classList.remove("wo-atlas-viewer")}};function F(){Z(),R(),T(),ee(),Y(),E()}function T(){$().setFilter(_()),Z(),Y(),E()}function _(){return te({query:I||void 0,objectTypes:v?[v]:void 0,tags:w?.tags,groupIds:j?[j]:w?.groupIds,includeAncestors:w?.includeAncestors??!0})}function M(y){I=y?.query?.trim()??"",v=y?.objectTypes?.length===1?y.objectTypes[0]:null,j=y?.groupIds?.length===1?y.groupIds[0]:null,i&&document.activeElement!==i&&(i.value=I),o&&(o.value=v??""),a&&(a.value=j??"")}function Z(){if(!l)return;let y=$(),x=y.getActiveViewpoint()?.id??"";l.innerHTML=['<option value="">Scene default</option>',...y.listViewpoints().map(z=>`<option value="${we(z.id)}">${we(z.label)}</option>`)].join(""),l.value=x}function R(){if(!a)return;let y=$();a.innerHTML=['<option value="">All groups</option>',...y.getScene().semanticGroups.map(x=>`<option value="${we(x.id)}">${we(x.label)}</option>`)].join(""),a.value=j??""}function N(){l&&(l.value=$().getActiveViewpoint()?.id??"")}function Y(){if(!u)return;let y=$().search(I,6);u.innerHTML=y.map(x=>`<button type="button" class="wo-atlas-pill" data-object-id="${we(x.objectId)}">${we(x.objectId)} - ${we(x.type)}</button>`).join("")}function E(){let y=H();f&&(f.textContent=JSON.stringify(y,null,2)),t.onInspectorChange?.(y)}function H(){let y=$(),x=y.getScene(),z=x.camera;return{selection:y.getSelectionDetails(),activeViewpoint:y.getActiveViewpoint(),filter:y.getFilter(),atlasState:y.getAtlasState(),visibleObjectIds:y.getVisibleObjects().map(ce=>ce.objectId),scene:{title:x.title,projection:x.projection,renderProjection:x.renderProjection,camera:z?{azimuth:z.azimuth,elevation:z.elevation,roll:z.roll,distance:z.distance}:null,renderPreset:x.renderPreset,groupCount:x.groups.length,semanticGroupCount:x.semanticGroups.length,relationCount:x.relations.length,eventCount:x.events.length,viewpointCount:x.viewpoints.length}}}function ee(){c&&(c.innerHTML=O.map(y=>`<button type="button" class="wo-atlas-pill" data-bookmark-id="${we(y.id)}">${we(y.label)}</button>`).join(""))}}function gl(e){let t=[e.search?`<label class="wo-atlas-field">
|
|
189
189
|
<span>Search</span>
|
|
190
190
|
<input data-atlas-search type="text" placeholder="Search objects, tags, or types" />
|
|
191
191
|
</label>`:"",e.typeFilter?`<label class="wo-atlas-field">
|
|
@@ -222,7 +222,7 @@
|
|
|
222
222
|
<div class="wo-atlas-results" data-atlas-results></div>
|
|
223
223
|
${e.bookmarks?'<div class="wo-atlas-bookmarks" data-atlas-bookmarks></div>':""}
|
|
224
224
|
</div>
|
|
225
|
-
</section>`}function
|
|
225
|
+
</section>`}function bl(){if(document.getElementById(Jr))return;let e=document.createElement("style");e.id=Jr,e.textContent=`
|
|
226
226
|
.wo-atlas-shell { display: grid; gap: 16px; min-width: 0; }
|
|
227
227
|
.wo-atlas-toolbar { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; }
|
|
228
228
|
.wo-atlas-workspace { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); }
|
|
@@ -256,4 +256,4 @@
|
|
|
256
256
|
.wo-atlas-workspace { grid-template-columns: 1fr; }
|
|
257
257
|
.wo-atlas-inspector { min-height: 220px; }
|
|
258
258
|
}
|
|
259
|
-
`,document.head.append(e)}function
|
|
259
|
+
`,document.head.append(e)}function Qr(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 we(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function ei(e="worldorbit-viewer"){if(typeof window>"u"||typeof customElements>"u"||customElements.get(e))return;class t extends HTMLElement{static get observedAttributes(){return["source","mode","theme"]}viewer=null;connectedCallback(){this.renderCurrent()}disconnectedCallback(){this.viewer?.destroy(),this.viewer=null}attributeChangedCallback(){this.isConnected&&this.renderCurrent()}renderCurrent(){this.viewer?.destroy(),this.viewer=null;let r=this.getAttribute("source")??this.textContent??"",i=this.getAttribute("mode")??"interactive";if(!r.trim()){this.innerHTML="";return}let o=yl(r),a=fe(o),l=this.getAttribute("theme")??void 0;if(i==="static"){this.innerHTML=se(a,{theme:l});return}if(i==="atlas"){this.viewer=Jt(this,{scene:a,theme:l});return}this.viewer=Ae(this,{scene:a,theme:l})}}customElements.define(e,t)}function yl(e){return Se(e).document}return gi(wl);})();
|