worldorbit 2.5.15 → 2.5.17

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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/core/dist/index.js +2444 -342
  3. package/dist/browser/editor/dist/index.js +11702 -0
  4. package/dist/browser/markdown/dist/index.js +2207 -392
  5. package/dist/browser/viewer/dist/index.js +2302 -382
  6. package/dist/unpkg/core/dist/index.js +2447 -345
  7. package/dist/unpkg/editor/dist/index.js +11727 -0
  8. package/dist/unpkg/markdown/dist/index.js +2210 -395
  9. package/dist/unpkg/viewer/dist/index.js +2305 -385
  10. package/dist/unpkg/worldorbit-core.min.js +12 -12
  11. package/dist/unpkg/worldorbit-editor.min.js +894 -0
  12. package/dist/unpkg/worldorbit-markdown.min.js +66 -58
  13. package/dist/unpkg/worldorbit-viewer.min.js +76 -68
  14. package/dist/unpkg/worldorbit.js +797 -78
  15. package/dist/unpkg/worldorbit.min.js +80 -72
  16. package/package.json +3 -2
  17. package/packages/core/dist/atlas-edit.js +74 -0
  18. package/packages/core/dist/atlas-validate.js +122 -8
  19. package/packages/core/dist/draft-parse.js +212 -8
  20. package/packages/core/dist/draft.d.ts +5 -2
  21. package/packages/core/dist/draft.js +59 -3
  22. package/packages/core/dist/format.js +63 -1
  23. package/packages/core/dist/normalize.js +1 -0
  24. package/packages/core/dist/scene.js +248 -46
  25. package/packages/core/dist/types.d.ts +41 -2
  26. package/packages/editor/dist/editor.d.ts +2 -0
  27. package/packages/editor/dist/editor.js +3578 -0
  28. package/packages/editor/dist/index.d.ts +2 -0
  29. package/packages/editor/dist/index.js +1 -0
  30. package/packages/editor/dist/types.d.ts +55 -0
  31. package/packages/editor/dist/types.js +1 -0
  32. package/packages/markdown/dist/html.d.ts +3 -0
  33. package/packages/markdown/dist/html.js +57 -0
  34. package/packages/markdown/dist/index.d.ts +4 -0
  35. package/packages/markdown/dist/index.js +3 -0
  36. package/packages/markdown/dist/rehype.d.ts +10 -0
  37. package/packages/markdown/dist/rehype.js +49 -0
  38. package/packages/markdown/dist/remark.d.ts +9 -0
  39. package/packages/markdown/dist/remark.js +28 -0
  40. package/packages/markdown/dist/types.d.ts +11 -0
  41. package/packages/markdown/dist/types.js +1 -0
  42. package/packages/viewer/dist/atlas-state.js +6 -0
  43. package/packages/viewer/dist/atlas-viewer.js +1 -0
  44. package/packages/viewer/dist/render.js +31 -2
  45. package/packages/viewer/dist/theme.js +1 -0
  46. package/packages/viewer/dist/tooltip.js +9 -0
  47. package/packages/viewer/dist/types.d.ts +8 -1
  48. package/packages/viewer/dist/viewer.js +12 -1
@@ -1,117 +1,125 @@
1
- "use strict";var WorldOrbitViewer=(()=>{var Jt=Object.defineProperty;var Nn=Object.getOwnPropertyDescriptor;var Un=Object.getOwnPropertyNames;var Wn=Object.prototype.hasOwnProperty;var Yn=(e,t)=>{for(var r in t)Jt(e,r,{get:t[r],enumerable:!0})},Hn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Un(t))!Wn.call(e,o)&&o!==r&&Jt(e,o,{get:()=>t[o],enumerable:!(n=Nn(t,o))||n.enumerable});return e};var qn=e=>Hn(Jt({},"__esModule",{value:!0}),e);var Ds={};Yn(Ds,{DEFAULT_VIEWER_STATE:()=>be,WORLD_LAYER_ID:()=>_t,clampScale:()=>tt,composeViewerTransform:()=>Ct,createAtlasViewer:()=>Ut,createEmbedPayload:()=>jn,createInteractiveViewer:()=>ye,createWorldOrbitEmbedMarkup:()=>On,defineWorldOrbitViewerElement:()=>Ln,deserializeViewerAtlasState:()=>mt,deserializeWorldOrbitEmbedPayload:()=>pr,fitViewerState:()=>je,focusViewerState:()=>Et,getSceneCenter:()=>Oe,getThemePreset:()=>vr,getViewerVisibleBounds:()=>Rt,invertViewerPoint:()=>Pe,mountWorldOrbitEmbeds:()=>An,normalizeRotation:()=>lr,normalizeViewerFilter:()=>K,panViewerState:()=>Se,renderDocumentToSvg:()=>dr,renderSceneToSvg:()=>ne,renderSourceToSvg:()=>fn,resolveLayers:()=>ut,resolveTheme:()=>ct,rotateViewerState:()=>Vt,sceneViewpointToLayerOptions:()=>ht,searchSceneObjects:()=>ft,serializeViewerAtlasState:()=>pt,serializeWorldOrbitEmbedPayload:()=>fr,viewpointToViewerFilter:()=>gt,zoomViewerStateAt:()=>Fe});var Gn={background:!0,guides:!0,relations:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},_e={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 ct(e){return e?typeof e=="string"?_e[e]??_e.atlas:{..._e.atlas,...e}:_e.atlas}function ut(e){return{...Gn,...e}}function vr(e){return _e[e]}function K(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Qt(e.objectTypes??[]),tags:Qt((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:Qt((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Xn(t)?t:null}function Xn(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function dt(e,t){let r=K(t),n=new Set;for(let o of e.objects)if(!o.hidden&&Kn(o,r)&&(n.add(o.objectId),r?.includeAncestors!==!1))for(let i of o.ancestorIds)n.add(i);return r?n:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function ft(e,t,r=12){let n=t.trim().toLowerCase();return n?e.objects.filter(o=>!o.hidden).map(o=>({object:o,score:Zn(o,n)})).filter(o=>o.score>0).sort((o,i)=>i.score-o.score||o.object.label.localeCompare(i.object.label)).slice(0,r).map(o=>$r(o.object,o.score)):e.objects.filter(o=>!o.hidden).slice().sort((o,i)=>o.label.localeCompare(i.label)).slice(0,r).map(o=>$r(o,1))}function Ir(e,t,r,n){return{version:"2.0",viewpointId:n,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0},filter:K(r)}}function pt(e){return encodeURIComponent(JSON.stringify(e))}function mt(e){let t=JSON.parse(decodeURIComponent(e));return{version:"2.0",viewpointId:t.viewpointId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0},filter:K(t.filter??null)}}function xr(e,t,r){let n=e.trim()||"bookmark";return{id:n.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||n,atlasState:{...r,viewerState:{...r.viewerState},renderOptions:{...r.renderOptions,layers:r.renderOptions.layers?{...r.renderOptions.layers}:void 0,scaleModel:r.renderOptions.scaleModel?{...r.renderOptions.scaleModel}:void 0},filter:r.filter?{...r.filter}:null}}}function ht(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function gt(e){return e?.filter?K({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function $r(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[]}}function Kn(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let r=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),n=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!r&&!n)return!1}if(t.tags?.length){let r=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[];if(!t.tags.every(n=>r.includes(n)))return!1}if(t.query?.trim()){let r=kr(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function Zn(e,t){let r=e.objectId.toLowerCase(),n=e.label.toLowerCase(),o=kr(e.object,e.label).toLowerCase(),i=0;return r===t||n===t?i+=120:r.startsWith(t)||n.startsWith(t)?i+=96:(r.includes(t)||n.includes(t))&&(i+=72),t.split(/\s+/).filter(Boolean).every(l=>o.includes(l))&&(i+=32),e.object.type===t&&(i+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(l=>typeof l=="string"):[]).some(l=>l.toLowerCase()===t)&&(i+=18),i}function kr(e,t){let r=Object.values(e.info),n=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...n,...r].join(" ")}function Qt(e){return[...new Set(e)]}var m=class e extends Error{line;column;constructor(t,r,n){let o=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var ze=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],J=ze.filter(e=>e!=="system"),Jn=["star","planet","moon","asteroid","comet","structure","phenomenon"],Sr=["structure","phenomenon"],he=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Qn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function M(e,t){return{key:e,...t}}var bt=new Set(ze),jr=new Map([M("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:he}),M("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:he,unitFamily:"distance"}),M("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:he,unitFamily:"distance"}),M("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:he}),M("period",{kind:"unit",placement:!0,arity:"single",objectTypes:he,unitFamily:"duration"}),M("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:he,unitFamily:"angle"}),M("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:he,unitFamily:"angle"}),M("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:he,unitFamily:"angle"}),M("at",{kind:"string",placement:!0,arity:"single",objectTypes:Sr}),M("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Sr}),M("free",{kind:"string",placement:!0,arity:"single",objectTypes:Qn}),M("kind",{kind:"string",placement:!1,arity:"single",objectTypes:J}),M("class",{kind:"string",placement:!1,arity:"single",objectTypes:J}),M("culture",{kind:"string",placement:!1,arity:"single",objectTypes:J}),M("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ze}),M("color",{kind:"string",placement:!1,arity:"single",objectTypes:ze}),M("image",{kind:"string",placement:!1,arity:"single",objectTypes:Jn}),M("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ze}),M("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:J,unitFamily:"radius"}),M("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:J,unitFamily:"mass"}),M("density",{kind:"unit",placement:!1,arity:"single",objectTypes:J,unitFamily:"generic"}),M("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:J,unitFamily:"generic"}),M("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:J,unitFamily:"generic"}),M("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:J}),M("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),M("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),M("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),M("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),M("on",{kind:"string",placement:!1,arity:"single",objectTypes:J}),M("source",{kind:"string",placement:!1,arity:"single",objectTypes:J}),M("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:J,unitFamily:"duration"})].map(e=>[e.key,e])),eo=new Set(jr.keys());function Z(e){return jr.get(e)}function Or(e){return eo.has(e)}function Ar(e,t){return e.objectTypes.includes(t)}function yt(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 Ne(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,a=!1,s=!1,l=null,d=()=>{i!==null&&(r.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let c=0;c<e.length;c++){let f=e[c],w=n+c+1;if(s&&f==="\\"){let b=e[c+1];if(b==='"'||b==="\\"){o+=b,c++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=w),a=!0,l=w,s=!0);continue}if(!s&&/\s/.test(f)){d();continue}i===null&&(i=w),o+=f}if(s)throw new m("Unclosed quote in line",t.line,l??n+e.length);return d(),r}function wt(e){return e.match(/^\s*/)?.[0].length??0}function Ue(e){let t=e.split(/\r?\n/),r=[],n=null,o=!1,i=null;for(let a=0;a<t.length;a++){let s=t[a],l=a+1;if(!s.trim())continue;let d=wt(s),c=Ne(s.slice(d),{line:l,columnOffset:d});if(c.length!==0){if(d===0){o=!1,i=null;let f=to(c,l);r.push(f),n=f;continue}if(!n)throw new m("Indented line without parent object",l,d+1);if(c.length===1&&c[0].value==="info"){o=!0,i=d;continue}o&&d<=(i??0)&&(o=!1),o?n.infoEntries.push(oo(c,l)):n.blockFields.push(no(c,l))}}return{type:"document",objects:r}}function to(e,t){if(e.length<2)throw new m("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!bt.has(r.value))throw new m(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:ro(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function ro(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=Z(o.value);if(!i)throw new m(`Unknown field "${o.value}"`,t,o.column);n++;let a=[];if(i.arity==="multiple")for(;n<e.length&&!Or(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new m(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return r}function no(e,t){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);if(!Z(e[0].value))throw new m(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function oo(e,t){if(e.length<2)throw new m("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}var Tr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,io=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ao=/^[A-Za-z][A-Za-z0-9+.-]*:/;function We(e){let t=null,r=[];for(let n of e.objects){let o=so(n);if(n.objectType==="system"){if(t)throw m.fromLocation("Only one system object is allowed",n.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],objects:r}}function so(e){let t=[...e.inlineFields,...e.blockFields];lo(e.objectType,t);let r=co(t),n=uo(e.objectType,r),o=fo(r),i=ho(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:n,info:i}}function lo(e,t){for(let r of t){let n=Z(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!Ar(n,e))throw m.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw m.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function co(e){let t=new Map;for(let r of e){if(t.has(r.key))throw m.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function uo(e,t){let r=t.has("orbit"),n=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[r,n,o,i].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw m.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw m.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:vt(t,"orbit"),distance:Me(t,"distance"),semiMajor:Me(t,"semiMajor"),eccentricity:yo(t,"eccentricity"),period:Me(t,"period"),angle:Me(t,"angle"),inclination:Me(t,"inclination"),phase:Me(t,"phase")};if(n){let s=$t(t,"at"),l=vt(t,"at");return{mode:"at",target:l,reference:go(l,s.location)}}if(o)return{mode:"surface",target:vt(t,"surface")};if(i){let s=vt(t,"free"),l=bo(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function fo(e){let t={};for(let[r,n]of e.entries()){let o=Z(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=wo(n);break;case"number":t[r]=Lr(Le(n),r,n.location);break;case"unit":t[r]=Mr(Le(n),n.location,r);break;case"string":t[r]=po(r,n);break}}return t}function po(e,t){let r=t.values.join(" ").trim();return e==="image"&&mo(r,t.location),r}function mo(e,t){if(!e)throw m.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw m.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(ao);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw m.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function ho(e){let t={};for(let r of e){if(r.key in t)throw m.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function go(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Mr(e,t,r){let n=e.match(Tr);if(!n)throw m.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=Z(r);if(i?.unitFamily&&!yt(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function bo(e){let t=e.match(Tr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Me(e,t){if(!e.has(t))return;let r=$t(e,t);return Mr(Le(r),r.location,t)}function yo(e,t){if(!e.has(t))return;let r=$t(e,t);return Lr(Le(r),t,r.location)}function Lr(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw m.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function wo(e){let t=Le(e).toLowerCase(),r=io.get(t);if(r===void 0)throw m.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function $t(e,t){let r=e.get(t);if(!r)throw new m(`Missing value for key "${t}"`);return r}function vt(e,t){return Le($t(e,t))}function Le(e){if(e.values.length!==1)throw m.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var vo=new Set(["star","planet","moon","asteroid","comet"]);function Ye(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new m(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new m(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let o=r.get(n.placement.target);if(!o||!vo.has(o.type))throw new m(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&$o(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&Io(n,n.placement.reference,t))}}function $o(e,t,r){if(!r.has(t.primary))throw new m(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new m(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Io(e,t,r){if(!r.has(t.objectId))throw new m(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function $e(e,t,r=`${t}.failed`){return e instanceof m?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}var He=1495978707e-1,xo=6371,ko=71492,So=695700,jo=63241.077,Oo=206264.806,Ao=206264806,Cr=.68,To=.2,Rr=28;function se(e,t={}){let r=Lo(t),n=r.width,o=r.height,i=r.padding,a=Mo(e),s=Fo(e,t.projection),l=Po(a,t.scaleModel),d=Eo(a),c=e.system?.id??null,f=new Map(e.objects.map(k=>[k.id,k])),w=gi(e.objects,f),b=new Map,I=[],v=[],T=[],y=[],$=[],x=new Map,B=new Map;for(let k of e.objects){let X=k.placement;if(!X){T.push(k);continue}if(X.mode==="orbit"){Pr(B,X.target,k);continue}if(X.mode==="surface"){Pr(x,X.target,k);continue}if(X.mode==="at"){$.push(k);continue}y.push(k)}let F=y.length>0?n*.42:n/2,j=o/2,P={orbitChildren:B,surfaceChildren:x,objectMap:f,spacingFactor:d,projection:s,scaleModel:l},A=T.find(k=>k.type==="star")??T[0]??null;A&&er(A,F,j,0,b,I,v,P);let U=T.filter(k=>k.id!==A?.id);if(U.length>0){let k=Math.min(n,o)*.28*d*l.orbitDistanceMultiplier;U.forEach((X,S)=>{let ee=Xe(S,U.length,-Math.PI/2),R=Ke(ee,k,s,1);er(X,F+R.x,j+R.y,0,b,I,v,P)})}y.forEach((k,X)=>{let S=n-i-140-Ii(k.placement?.mode==="free"?k.placement.distance:void 0,l),ee=Math.max(76,(o-i*2-180)/Math.max(1,y.length)*d)*l.freePlacementMultiplier,R=i+92+X*ee;b.set(k.id,{object:k,x:S,y:R,radius:St(k,0,l),sortKey:Ot(S,R,0)}),v.push({object:k,groupId:w.groupIds.get(k.id)??null,x1:S-60,y1:R,x2:S-18,y2:R,mode:"free"}),xt(k,b,I,v,P,1)}),$.forEach((k,X)=>{if(b.has(k.id)||!k.placement||k.placement.mode!=="at")return;let S=mi(k.placement.reference,b,f,X,$.length,n,o,i,P);b.set(k.id,{object:k,x:S.x,y:S.y,radius:St(k,2,l),sortKey:Ot(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&v.push({object:k,groupId:w.groupIds.get(k.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),xt(k,b,I,v,P,2)});let C=[...b.values()].map(k=>Co(k,l,w)),W=I.map(k=>Ro(k,w.groupIds.get(k.object.id)??null)),G=v.map(k=>Bo(k)),V=_o(C,o,l.labelMultiplier),pe=Wo(e,C),Q=zo(W,pe,G,C,V),g=No(C,W,G,V,w),O=Uo(e,C),H=Yo(e,s,r.preset,w,f),we=ii(n,o,C,W,G,V);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:s,scaleModel:l,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Vr(s)} view - ${Vr(a)} layout`,systemId:c,viewMode:s,layoutPreset:a,metadata:{format:e.format,version:e.version,view:s,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:r.preset??"custom"},contentBounds:we,layers:Q,groups:g,semanticGroups:O,viewpoints:H,objects:C,orbitVisuals:W,relations:pe,leaders:G,labels:V}}function ce(e,t,r){let n=Tt(r),o=Math.cos(n),i=Math.sin(n),a=e.x-t.x,s=e.y-t.y;return{x:t.x+a*o-s*i,y:t.y+a*i+s*o}}function Mo(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 Lo(e){let t=Do(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Do(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 Fo(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Po(e,t){return{...Vo(e),...t}}function Vo(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 Eo(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Co(e,t,r){let{object:n,x:o,y:i,radius:a,sortKey:s,anchorX:l,anchorY:d}=e,c=n.renderHints?.renderPriority??0;return{renderId:Ze(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,semanticGroupIds:[...n.groups??[]],x:o,y:i,radius:a,visualRadius:$i(n,a,t),sortKey:s+c*.001,anchorX:l,anchorY:d,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:ki(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function Ro(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 Bo(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 _o(e,t,r){let n=[],o=[],i=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort((a,s)=>a.sortKey-s.sortKey);for(let a of i){let s=a.y>t*.62?-1:1,l=Si(a,r),d=a.y+s*(a.radius+18*r),c=d+s*(16*r),f=Dr(a.x,d,c,l,s),w=0;for(;o.some(b=>wi(b,f))&&w<10;)d+=s*14*r,c+=s*14*r,f=Dr(a.x,d,c,l,s),w+=1;o.push(f),n.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,semanticGroupIds:[...a.semanticGroupIds],label:a.label,secondaryLabel:a.secondaryLabel,x:a.x,y:d,secondaryY:c,textAnchor:"middle",direction:s<0?"above":"below",hidden:a.hidden})}return n}function zo(e,t,r,n,o){let i=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),a=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:i},{id:"orbits-front",renderIds:a},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function No(e,t,r,n,o){let i=new Map,a=s=>{if(!s)return null;let l=i.get(s);if(l)return l;let d=o.groupRoots.get(s)??null,c={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Ge(0,0,0,0)};return i.set(s,c),c};for(let s of e){let l=a(s.groupId);l&&!s.hidden&&l.objectIds.push(s.objectId)}for(let s of t){let l=a(s.groupId);l&&!s.hidden&&l.orbitIds.push(s.objectId)}for(let s of r){let l=a(s.groupId);l&&!s.hidden&&l.leaderIds.push(s.objectId)}for(let s of n){let l=a(s.groupId);l&&!s.hidden&&l.labelIds.push(s.objectId)}for(let s of i.values())s.contentBounds=bi(s,e,t,r,n);return[...i.values()].sort((s,l)=>s.label.localeCompare(l.label))}function Uo(e,t){return[...e.groups].map(r=>({id:r.id,label:r.label,summary:r.summary,color:r.color,tags:[...r.tags],hidden:r.hidden,objectIds:t.filter(n=>!n.hidden&&n.semanticGroupIds.includes(r.id)).map(n=>n.objectId)})).sort((r,n)=>r.label.localeCompare(n.label))}function Wo(e,t){let r=new Map(t.map(n=>[n.objectId,n]));return e.relations.map(n=>{let o=r.get(n.from),i=r.get(n.to);return{renderId:`${Ze(n.id)}-relation`,relationId:n.id,relation:n,fromObjectId:n.from,toObjectId:n.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:n.hidden||!o||!i||o.hidden||i.hidden}}).sort((n,o)=>n.relation.id.localeCompare(o.relation.id))}function Yo(e,t,r,n,o){let i=Ho(e,t,r),a=new Map;for(let[d,c]of Object.entries(e.system?.info??{})){if(!d.startsWith("viewpoint."))continue;let[f,w,...b]=d.split(".");if(f!=="viewpoint"||!w||b.length===0)continue;let I=ri(w);if(!I)continue;let v=b.join(".").toLowerCase(),T=a.get(I)??{id:I};qo(T,v,c,e,t,r,n,o),a.set(I,T)}let s=[...a.values()].map(d=>Go(d,t,r,o)).filter(Boolean),l=s.findIndex(d=>d.id===i.id);return l>=0?s.splice(l,1,{...i,...s[l],layers:{...i.layers,...s[l].layers},filter:s[l].filter??i.filter,generated:!1}):s.unshift(i),s.sort((d,c)=>d.id==="overview"?-1:c.id==="overview"?1:d.label.localeCompare(c.label))}function Ho(e,t,r){let n=e.system?.title??e.system?.properties.title;return{id:"overview",label:n?`${String(n)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function qo(e,t,r,n,o,i,a,s){let l=r.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"projection":case"view":e.projection=Ko(l)??o;return;case"preset":e.preset=Zo(l)??i;return;case"rotation":case"angle":e.rotationDeg=Br(l)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Jo(l);return;case"layers":e.layers=Qo(l);return;case"query":e.filter={...e.filter??It(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??It(),objectTypes:ei(l)};return;case"tags":e.filter={...e.filter??It(),tags:At(l)};return;case"groups":e.filter={...e.filter??It(),groupIds:ti(l,n,a,s)};return}}function Go(e,t,r,n){let o=e.focus&&n.has(e.focus)?e.focus:null,i=e.select&&n.has(e.select)?e.select:o,a=Xo(e.filter),s=e.label?.trim()||ni(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||oi(s,o,a),objectId:o,selectedObjectId:i,projection:e.projection??t,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function It(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Xo(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 Ko(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Zo(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Br(e){let t=Number(e);return Number.isFinite(t)?t:null}function Jo(e){let t=Br(e);return t!==null&&t>0?t:null}function Qo(e){let t={};for(let r of At(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),o=r.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=n)}return t}function ei(e){return At(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function ti(e,t,r,n){return At(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:r.groupIds.has(o)?r.groupIds.get(o)??qe(o):(n.has(o),qe(o)))}function At(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function ri(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ni(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function oi(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function ii(e,t,r,n,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,c=(f,w)=>{a=Math.min(a,f),s=Math.min(s,w),l=Math.max(l,f),d=Math.max(d,w)};for(let f of n)f.hidden||_r(f,c);for(let f of o)f.hidden||(c(f.x1,f.y1),c(f.x2,f.y2));for(let f of r)f.hidden||zr(f,c);for(let f of i)f.hidden||Nr(f,c);return!Number.isFinite(a)||!Number.isFinite(s)?Ge(0,0,e,t):Ge(a,s,l,d)}function _r(e,t){let r=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,o=e.ry??e.radius??0,i=Wr(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,Rr*2);for(let a of i)t(a.x-r,a.y-r),t(a.x+r,a.y+r)}function Ge(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function zr(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 Nr(e,t){let n=ji(e.label,e.secondaryLabel,1);t(e.x-n,e.y-18),t(e.x+n,e.y+8),t(e.x-n,e.secondaryY-14),t(e.x+n,e.secondaryY+8)}function er(e,t,r,n,o,i,a,s){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:r,radius:St(e,n,s.scaleModel),sortKey:Ot(t,r,n)}),xt(e,o,i,a,s,n+1))}function xt(e,t,r,n,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(ai),l=si(s,a.radius,o.spacingFactor,o.scaleModel),d=ui(s,l);s.forEach((f,w)=>{let b=li(f,w,s.length,a,l,d[w]??l.innerPx,o);r.push({object:f,parentId:e.id,kind:b.kind,cx:b.cx,cy:b.cy,radius:b.radius,rx:b.rx,ry:b.ry,rotationDeg:b.rotationDeg,band:b.band,bandThickness:b.bandThickness,frontArcPath:b.frontArcPath,backArcPath:b.backArcPath}),er(f,b.objectX,b.objectY,i,t,r,n,o)});let c=[...o.surfaceChildren.get(e.id)??[]];c.forEach((f,w)=>{let b=Xe(w,c.length,-Math.PI/3),I=28*o.spacingFactor,v=Ke(b,a.radius,o.projection,o.projection==="isometric"?.9:1),T=Ke(b,a.radius+I,o.projection,o.projection==="isometric"?.9:1),y=a.x+v.x,$=a.y+v.y,x=a.x+T.x,B=a.y+T.y;t.set(f.id,{object:f,x,y:B,radius:St(f,i+1,o.scaleModel),sortKey:Ot(x,B,i+1),anchorX:y,anchorY:$}),n.push({object:f,groupId:o.objectMap.has(f.id)?qe(yi(f,o.objectMap)):null,x1:y,y1:$,x2:x,y2:B,mode:"surface"}),xt(f,t,r,n,o,i+1)})}function ai(e,t){let r=kt(e),n=kt(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function si(e,t,r,n){let o=e.map(f=>kt(f)),i=o.filter(f=>f!==null),a=t+56*r*n.orbitDistanceMultiplier,s=(e.length>2?54:64)*r*n.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42};let l=Math.min(...i),d=Math.max(...i),c=d-l;return{metrics:o,minMetric:l,maxMetric:d,metricSpread:c,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function li(e,t,r,n,o,i,a){let s=e.placement,l=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let A=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:A,rotationDeg:0,band:l,bandThickness:l?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-A}}let d=_(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),c=i,f=Math.max(c*Math.sqrt(1-d*d),c*.18),w=rr(s.inclination)??0,b=a.projection==="isometric"?Math.max(To,Math.cos(Tt(w)))*Cr:1,I=Math.max(f*b,c*.14),v=rr(s.angle)??0,T=c*d,y=Hr(-T,0,v),$=n.x+y.x,x=n.y+y.y,B=fi(s.phase,t,r),F=Yr($,x,c,I,v,B),j=a.projection==="topdown"&&d<=1e-4&&Math.abs(v)<=1e-4,P=l?pi(e,c,o,a.scaleModel):void 0;return{kind:j?"circle":"ellipse",cx:j?n.x:$,cy:j?n.y:x,radius:j?c:void 0,rx:j?void 0:c,ry:j?void 0:I,rotationDeg:v,band:l,bandThickness:P,frontArcPath:a.projection==="isometric"||l?Fr($,x,c,I,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||l?Fr($,x,c,I,v,Math.PI,Math.PI*2):void 0,objectX:F.x,objectY:F.y}}function ci(e,t){return t.innerPx+t.stepPx*di(Math.max(e,0)+1)}function ui(e,t){let r=[];return e.forEach((n,o)=>{let i=kt(n),a=t.innerPx+o*t.stepPx,s=i===null?a:ci(i,t),l=o===0?t.innerPx:(r[o-1]??t.innerPx)+t.minimumGapPx;r.push(Math.max(s,l))}),r}function kt(e){return!e.placement||e.placement.mode!=="orbit"?null:jt(e.placement.semiMajor??e.placement.distance??null)}function di(e){return Math.log(e)/Math.log(2)}function fi(e,t,r){let n=e?rr(e):null;return n!==null?Tt(n-90):Xe(t,r,-Math.PI/2)}function pi(e,t,r,n){let o=jt(tr(e.properties.inner)),i=jt(tr(e.properties.outer));if(o!==null&&i!==null){let s=Math.abs(i-o);if(r.metricSpread>0)return _(s/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(o,i),1e-4);return _(s/l*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function mi(e,t,r,n,o,i,a,s,l){if(e.kind==="lagrange")return hi(e,t,r,i,a);if(e.kind==="anchor"){let d=t.get(e.objectId);if(d){let c=Xe(n,o,Math.PI/5),f=(d.radius+36)*l.scaleModel.labelMultiplier,w=Ke(c,f,l.projection,l.projection==="isometric"?.92:1);return{x:d.x+w.x,y:d.y+w.y,anchorX:d.x,anchorY:d.y}}}if(e.kind==="named"){let d=t.get(e.name);if(d){let c=Xe(n,o,Math.PI/6),f=(d.radius+36)*l.scaleModel.labelMultiplier,w=Ke(c,f,l.projection,l.projection==="isometric"?.92:1);return{x:d.x+w.x,y:d.y+w.y,anchorX:d.x,anchorY:d.y}}}return{x:i-s-170,y:a-s-86-n*58*l.scaleModel.freePlacementMultiplier}}function hi(e,t,r,n,o){let i=e.secondary?t.get(e.primary):vi(e.primary,t,r),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:n*.7,y:o*.25};let s=a.x-i.x,l=a.y-i.y,d=Math.hypot(s,l)||1,c=s/d,f=l/d,w=-f,b=c,I=_(d*.25,24,68);switch(e.point){case"L1":return{x:a.x-c*I,y:a.y-f*I,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+c*I,y:a.y+f*I,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-c*I,y:i.y-f*I,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(c*.5-w*.8660254)*I,y:a.y+(f*.5-b*.8660254)*I,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(c*.5+w*.8660254)*I,y:a.y+(f*.5+b*.8660254)*I,anchorX:a.x,anchorY:a.y}}}function gi(e,t){let r=new Map,n=new Map;for(let d of e){let c=Ur(d,t);if(r.set(d.id,c),c){let f=n.get(c);f?f.push(d.id):n.set(c,[d.id])}n.has(d.id)||n.set(d.id,[])}let o=new Map,i=new Map,a=new Map,s=d=>{let c=o.get(d);if(c)return c;let f=new Set,w=[],b=r.get(d)??null;for(;b&&!f.has(b);)w.push(b),f.add(b),b=r.get(b)??null;return o.set(d,w),w},l=d=>{let c=a.get(i.get(d)??"");if(c)return c;let f=r.get(d)??null,w=t.get(d),b=d;return w?.placement&&w.placement.mode!=="free"&&f&&(b=l(f)),b};for(let d of e){s(d.id);let c=l(d.id),f=qe(c);i.set(d.id,f),a.set(f,c)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:a}}function Ur(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function bi(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(c,f)=>{i=Math.min(i,c),a=Math.min(a,f),s=Math.max(s,c),l=Math.max(l,f)};for(let c of t)!c.hidden&&e.objectIds.includes(c.objectId)&&zr(c,d);for(let c of r)!c.hidden&&e.orbitIds.includes(c.objectId)&&_r(c,d);for(let c of n)!c.hidden&&e.leaderIds.includes(c.objectId)&&(d(c.x1,c.y1),d(c.x2,c.y2));for(let c of o)!c.hidden&&e.labelIds.includes(c.objectId)&&Nr(c,d);return!Number.isFinite(i)||!Number.isFinite(a)?Ge(0,0,0,0):Ge(i,a,s,l)}function yi(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let o=Ur(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function Dr(e,t,r,n,o){return{left:e-n,right:e+n,top:Math.min(t,r)-(o<0?18:12),bottom:Math.max(t,r)+(o<0?8:12)}}function wi(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function vi(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function St(e,t,r){let n=xi(e.properties.radius,r);if(n!==null)return n;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return _((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return _(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return _(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return _(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return _(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return _(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return _(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return _(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return _(8*o,r.minBodyRadius,r.maxBodyRadius)}}function $i(e,t,r){let n=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+n,r.maxBodyRadius+10)}}function jt(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/He;case"m":return e.value/1e3/He;case"ly":return e.value*jo;case"pc":return e.value*Oo;case"kpc":return e.value*Ao;case"re":return e.value*xo/He;case"rj":return e.value*ko/He;case"sol":return e.value*So/He;default:return e.value}}function Ii(e,t){let r=jt(e??null);return r===null||r<=0?0:_(r*96*t.freePlacementMultiplier,0,420)}function xi(e,t){let r=tr(e);if(!r)return null;let n;switch(r.unit){case"sol":n=_(r.value*22,14,40);break;case"re":n=_(r.value*10,6,18);break;case"km":n=_(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:n=_(r.value*4,4,20);break}return _(n*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function tr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function rr(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Xe(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function Fr(e,t,r,n,o,i,a){let s=Wr(e,t,r,n,o,i,a,Rr);return s.length===0?"":s.map((l,d)=>`${d===0?"M":"L"} ${Er(l.x)} ${Er(l.y)}`).join(" ")}function Wr(e,t,r,n,o,i,a,s){let l=[];for(let d=0;d<=s;d+=1){let c=i+(a-i)*d/s;l.push(Yr(e,t,r,n,o,c))}return l}function Yr(e,t,r,n,o,i){let a=r*Math.cos(i),s=n*Math.sin(i),l=Hr(a,s,o);return{x:e+l.x,y:t+l.y}}function Hr(e,t,r){let n=Tt(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function Ke(e,t,r,n){let o=r==="isometric"?Cr*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function Ot(e,t,r){return t*1e3+e+r*.01}function _(e,t,r){return Math.min(Math.max(e,t),r)}function Pr(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function Ze(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function qe(e){return`${Ze(e)}-group`}function ki(e){return typeof e=="string"&&e.trim()?e:void 0}function Si(e,t){let r=e.label.length*4.6*t+18,n=e.secondaryLabel.length*3.9*t+18;return Math.max(r,n,e.visualRadius+18)}function ji(e,t,r){let n=e.length*4.6*r+18,o=t.length*3.9*r+18;return Math.max(n,o,24)}function Vr(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Tt(e){return e*Math.PI/180}function Er(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function nr(e){let t=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Ti(e.system),info:Mi(e.system)}:null;return{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:t,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),objects:e.objects.map(Oi)}}function Oi(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,r])=>[t,{...r??{}}])):void 0,properties:Ai(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ai(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function Ti(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 Mi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg));let o=Li(r.layers);o&&(t[`${n}.layers`]=o),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??"")}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function Li(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}var qr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Pi=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Vi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Qe(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Mt(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function or(e,t,r){let n=e.match(qr);if(!n)throw m.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=Z(r);if(i?.unitFamily&&!yt(i.unitFamily,o.unit))throw m.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function ir(e){let t=e.match(qr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Lt(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw m.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function Ie(e,t,r){let n=Pi.get(e.toLowerCase());if(n===void 0)throw m.fromLocation(`Invalid boolean value "${e}" for "${t}"`,r);return n}function Gr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw m.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Ei(e,t){if(!e)throw m.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw m.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Vi);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw m.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function Xr(e,t,r){let n=Z(e);if(!n)throw m.fromLocation(`Unknown field "${e}"`,r);if(n.arity==="single"&&t.length!==1)throw m.fromLocation(`Field "${e}" expects exactly one value`,r);switch(n.kind){case"list":return t;case"boolean":return Ie(Je(t,e,r),e,r);case"number":return Lt(Je(t,e,r),e,r);case"unit":return or(Je(t,e,r),r,e);case"string":{let o=t.join(" ").trim();return e==="image"&&Ei(o,r),o}}}function ar(e,t,r){let n=Z(e);if(!n)throw m.fromLocation(`Unknown field "${e}"`,r);if(!n.objectTypes.includes(t))throw m.fromLocation(`Field "${e}" is not valid on "${t}"`,r)}function Je(e,t,r){if(e.length!==1)throw m.fromLocation(`Field "${t}" expects exactly one value`,r);return e[0]}var Ci=new Set(["star","planet","moon","asteroid","comet"]),Ri=332946.0487,Bi=1047.3486,Dt=1495978707e-1,_i=6371,zi=695700,Ni=63241.077,Ui=206264.806,Wi=206264806;function Ft(e,t){let r=[],n=new Map(e.objects.map(a=>[a.id,a])),o=new Set(e.groups.map(a=>a.id));e.system||r.push(z("validate.system.required","Atlas documents must declare exactly one system."));let i=new Map;for(let[a,s]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of s){let d=i.get(l);d?r.push(z("validate.id.duplicate",`Duplicate ${a} id "${l}" already used by ${d}.`)):i.set(l,a)}for(let a of e.relations)Yi(a,n,r);for(let a of e.system?.viewpoints??[])Hi(a.filter,o,t,r,a.id);for(let a of e.objects)qi(a,e.system,n,o,r);return r}function Yi(e,t,r){e.from?t.has(e.from)||r.push(z("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):r.push(z("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||r.push(z("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):r.push(z("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||r.push(z("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Hi(e,t,r,n,o){if(!(!e||r!=="2.1"))for(let i of e.groupIds)t.has(i)||n.push(ue("validate.viewpoint.group.unknown",`Unknown group "${i}" in viewpoint "${o}".`))}function qi(e,t,r,n,o){let i=e.placement,a=i?.mode==="orbit"?i:null,s=i?.mode==="orbit"?r.get(i.target)??null:null;if(e.groups)for(let l of e.groups)n.has(l)||o.push(ue("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(a&&(r.has(a.target)||o.push(z("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&o.push(z("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&o.push(ue("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(ue("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!Zr(s?.properties.mass)&&o.push(ue("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let l=r.get(i.target);l?Ci.has(l.type)||o.push(z("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(z("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(z("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Gi(e,r,o)||o.push(z("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=r.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&o.push(ue("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(z("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(ue("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let d=Kr(e,s);if(d===null){o.push(ue("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||o.push(Ji("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Zi(d)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){o.push(ue("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let d=Jr(a?.period),c=Kr(e,s);if(d===null||c===null)continue;let f=Ki(e,"period");Math.abs(d-c)>f&&o.push(z("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Gi(e,t,r){let n=e.placement?.mode==="at"?e.placement.reference:null;return n?n.kind==="named"?t.has(n.name):n.kind==="anchor"?t.has(n.objectId)?!0:(r.push(z("validate.anchor.target.unknown",`Unknown anchor target "${n.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(n.primary)?n.secondary&&!t.has(n.secondary)?(r.push(z("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${n.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(r.push(z("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${n.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Kr(e,t){let r=e.placement;if(!r||r.mode!=="orbit")return null;let n=Xi(r.semiMajor??r.distance),o=Zr(t?.properties.mass);return n===null||o===null||o<=0?null:Math.sqrt(n**3/o)*365.25}function Xi(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*Ni;case"pc":return e.value*Ui;case"kpc":return e.value*Wi;case"re":return e.value*_i/Dt;case"sol":return e.value*zi/Dt;default:return null}}function Zr(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Ri;case"mj":return t.value/Bi;default:return null}}function Jr(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 Ki(e,t){let r=e.tolerances?.find(n=>n.field===t)?.value;return typeof r=="number"?r:r&&typeof r=="object"&&"value"in r?Jr(r)??0:0}function Zi(e){return`${Math.round(e*100)/100}d`}function z(e,t,r,n){return{code:e,severity:"error",source:"validate",message:t,objectId:r,field:n}}function ue(e,t,r,n){return{code:e,severity:"warning",source:"validate",message:t,objectId:r,field:n}}function Ji(e,t,r,n){return{code:e,severity:"info",source:"validate",message:t,objectId:r,field:n}}var Qi=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=Z(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 ea=new Set(Pt.keys());function sr(e){return ta(e)}function ta(e,t){let r=Ca(e),n=r.source.split(/\r?\n/),o=[],i=!1,a="2.0",s=null,l=null,d=[],c=[],f=[],w=!1,b=!1,I=new Set,v=new Set,T=new Set,y=new Set;for(let j=0;j<n.length;j++){let P=n[j],A=j+1;if(!P.trim())continue;let U=wt(P),C=Ne(P.slice(U),{line:A,columnOffset:U});if(C.length!==0){if(!i){a=ra(C,A),i=!0,r.comments.length>0&&a!=="2.1"&&o.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:r.comments[0].line,column:r.comments[0].column});continue}if(U===0){l=na(C,A,a,o,s,d,c,f,I,v,T,y,{sawDefaults:w,sawAtlas:b}),l.kind==="system"?s=l.system:l.kind==="defaults"?w=!0:l.kind==="atlas"&&(b=!0);continue}if(!l)throw new m("Indented line without parent atlas section",A,U+1);ua(l,U,C,A)}}if(!i)throw new m('Missing required atlas schema header "schema 2.0"');let $=d.map(j=>ja(j,a,o)),x=t??(a==="2.0-draft"?"2.0":a),B={format:"worldorbit",sourceVersion:"1.0",system:s,groups:c,relations:f,objects:$,diagnostics:o};if(x==="2.0-draft"){let j={...B,version:"2.0-draft",schemaVersion:"2.0-draft"};return j.diagnostics.push(...Ft(j,a)),j}let F={...B,version:x,schemaVersion:x};return a==="2.0-draft"&&F.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".'}),F.diagnostics.push(...Ft(F,a)),F}function ra(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new m('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let r=e[1].value.toLowerCase();return r==="2.1"?"2.1":r==="2.0-draft"?"2.0-draft":"2.0"}function na(e,t,r,n,o,i,a,s,l,d,c,f,w){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new m('Atlas section "system" may only appear once',t,e[0].column);return oa(e,t,r,n);case"defaults":if(!o)throw new m('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(w.sawDefaults)throw new m('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:o,seenFields:new Set};case"atlas":if(!o)throw new m('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(w.sawAtlas)throw new m('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:o,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!o)throw new m('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return ia(e,t,o,l);case"annotation":if(!o)throw new m('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return aa(e,t,o,d);case"group":return de(r,n,"group",{line:t,column:e[0].column}),sa(e,t,a,c);case"relation":return de(r,n,"relation",{line:t,column:e[0].column}),la(e,t,s,f);case"object":return ca(e,t,r,n,i);default:throw new m(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function oa(e,t,r,n){if(e.length!==2)throw new m("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:r,diagnostics:n,seenFields:new Set}}function ia(e,t,r,n){if(e.length!==2)throw new m("Invalid viewpoint declaration",t,e[0]?.column??1);let o=Qe(e[1].value);if(!o)throw new m("Viewpoint id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate viewpoint id "${o}"`,t,e[1].column);let i={id:o,label:Mt(o),summary:"",focusObjectId:null,selectedObjectId:null,projection:r.defaults.view,preset:r.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return r.viewpoints.push(i),n.add(o),{kind:"viewpoint",viewpoint:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function aa(e,t,r,n){if(e.length!==2)throw new m("Invalid annotation declaration",t,e[0]?.column??1);let o=Qe(e[1].value);if(!o)throw new m("Annotation id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:Mt(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function sa(e,t,r,n){if(e.length!==2)throw new m("Invalid group declaration",t,e[0]?.column??1);let o=Qe(e[1].value);if(!o)throw new m("Group id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:Mt(o),summary:"",color:null,tags:[],hidden:!1};return r.push(i),n.add(o),{kind:"group",group:i,seenFields:new Set}}function la(e,t,r,n){if(e.length!==2)throw new m("Invalid relation declaration",t,e[0]?.column??1);let o=Qe(e[1].value);if(!o)throw new m("Relation id must not be empty",t,e[1].column);if(n.has(o))throw new m(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return r.push(i),n.add(o),{kind:"relation",relation:i,seenFields:new Set}}function ca(e,t,r,n,o){if(e.length<3)throw new m("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],a=e[2],s=i.value;if(!bt.has(s)||s==="system")throw new m(`Unknown object type "${i.value}"`,t,i.column);let l={objectType:s,id:a.value,fields:ka(e.slice(3),t,s,r,n),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:r,diagnostics:n,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ua(e,t,r,n){switch(e.kind){case"system":da(e,r,n);return;case"defaults":fa(e,r,n);return;case"atlas":pa(e,t,r,n);return;case"viewpoint":ma(e,t,r,n);return;case"annotation":ga(e,r,n);return;case"group":ba(e,r,n);return;case"relation":ya(e,r,n);return;case"object":wa(e,t,r,n);return}}function da(e,t,r){let n=ke(t,e.seenFields,r),o=N(t,r);switch(n){case"title":e.system.title=o;return;case"description":de(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.description=o;return;case"epoch":de(e.sourceSchemaVersion,e.diagnostics,n,{line:r,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":de(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:r,column:t[0].column}),e.system.referencePlane=o;return;default:throw new m(`Unknown system atlas field "${t[0].value}"`,r,t[0].column)}}function fa(e,t,r){let n=ke(t,e.seenFields,r),o=N(t,r);switch(n){case"view":e.system.defaults.view=en(o,r,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=tn(o,r,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new m(`Unknown defaults field "${t[0].value}"`,r,t[0].column)}}function pa(e,t,r,n){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=nn(r,n,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new m(`Duplicate atlas metadata key "${o.key}"`,n,r[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(r.length===1&&r[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new m(`Unknown atlas field "${r[0].value}"`,n,r[0].column)}function ma(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){ha(e,r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new m('Duplicate viewpoint field "filter"',n,r[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=ke(r,e.seenFields,n),i=N(r,n);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=en(i,n,r[0].column);return;case"preset":e.viewpoint.preset=tn(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=Ia(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=rn(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=$a(r.slice(1),n);return;default:throw new m(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function ha(e,t,r){let n=ke(t,e.seenFilterFields,r),o=e.viewpoint.filter??xa();switch(n){case"query":o.query=N(t,r);break;case"objecttypes":o.objectTypes=va(t.slice(1),r);break;case"tags":o.tags=xe(t.slice(1),r,"tags");break;case"groups":o.groupIds=xe(t.slice(1),r,"groups");break;default:throw new m(`Unknown viewpoint filter field "${t[0].value}"`,r,t[0].column)}e.viewpoint.filter=o}function ga(e,t,r){switch(ke(t,e.seenFields,r)){case"label":e.annotation.label=N(t,r);return;case"target":e.annotation.targetObjectId=N(t,r);return;case"body":e.annotation.body=N(t,r);return;case"tags":e.annotation.tags=xe(t.slice(1),r,"tags");return;default:throw new m(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function ba(e,t,r){switch(ke(t,e.seenFields,r)){case"label":e.group.label=N(t,r);return;case"summary":e.group.summary=N(t,r);return;case"color":e.group.color=N(t,r);return;case"tags":e.group.tags=xe(t.slice(1),r,"tags");return;case"hidden":e.group.hidden=Ie(N(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new m(`Unknown group field "${t[0].value}"`,r,t[0].column)}}function ya(e,t,r){switch(ke(t,e.seenFields,r)){case"from":e.relation.from=N(t,r);return;case"to":e.relation.to=N(t,r);return;case"kind":e.relation.kind=N(t,r);return;case"label":e.relation.label=N(t,r);return;case"summary":e.relation.summary=N(t,r);return;case"tags":e.relation.tags=xe(t.slice(1),r,"tags");return;case"color":e.relation.color=N(t,r);return;case"hidden":e.relation.hidden=Ie(N(t,r),"hidden",{line:r,column:t[0].column});return;default:throw new m(`Unknown relation field "${t[0].value}"`,r,t[0].column)}}function wa(e,t,r,n){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),r.length===1){let o=r[0].value.toLowerCase();if(o==="info"||Qi.has(o)){o!=="info"&&de(e.sourceSchemaVersion,e.diagnostics,o,{line:n,column:r[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=nn(r,n,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new m(`Duplicate info key "${o.key}"`,n,r[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,a=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(a.has(o.key))throw new m(`Duplicate ${i} key "${o.key}"`,n,r[0].column);a.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(Sa(r,n,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function ke(e,t,r){if(e.length<2)throw new m("Invalid atlas field line",r,e[0]?.column??1);let n=e[0].value.toLowerCase();if(t.has(n))throw new m(`Duplicate atlas field "${e[0].value}"`,r,e[0].column);return t.add(n),n}function N(e,t){if(e.length<2)throw new m("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(r=>r.value).join(" ").trim()}function va(e,t){return xe(e,t,"objectTypes").filter(r=>r==="star"||r==="planet"||r==="moon"||r==="belt"||r==="asteroid"||r==="comet"||r==="ring"||r==="structure"||r==="phenomenon")}function $a(e,t){let r={};for(let n of xe(e,t,"layers")){let o=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){r["orbits-back"]=o,r["orbits-front"]=o;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="objects"||i==="labels"||i==="metadata")&&(r[i]=o)}return r}function xe(e,t,r){if(e.length===0)throw new m(`Missing value for atlas field "${r}"`,t,1);let n=e.map(o=>o.value).filter(Boolean);if(n.length===0)throw new m(`Missing value for atlas field "${r}"`,t,e[0]?.column??1);return n}function en(e,t,r){let n=e.toLowerCase();if(n!=="topdown"&&n!=="isometric")throw new m(`Unknown projection "${e}"`,t,r);return n}function tn(e,t,r){let n=e.toLowerCase();if(n==="diagram"||n==="presentation"||n==="atlas-card"||n==="markdown")return n;throw new m(`Unknown render preset "${e}"`,t,r)}function Ia(e,t,r,n){let o=rn(e,t,r,n);if(o<=0)throw new m(`Field "${n}" must be greater than zero`,t,r);return o}function rn(e,t,r,n){let o=Number(e);if(!Number.isFinite(o))throw new m(`Invalid numeric value "${e}" for "${n}"`,t,r);return o}function xa(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ka(e,t,r,n,o){let i=[],a=0;for(;a<e.length;){let s=e[a],l=et(s.value);if(!l)throw new m(`Unknown field "${s.value}"`,t,s.column);l.version==="2.1"&&de(n,o,s.value,{line:t,column:s.column}),a++;let d=[];if(l.inlineMode==="single"){let c=e[a];c&&(d.push(c),a++)}else if(l.inlineMode==="pair")for(let c=0;c<2;c++){let f=e[a];if(!f)break;d.push(f),a++}else for(;a<e.length&&!ea.has(e[a].value);)d.push(e[a]),a++;if(d.length===0)throw new m(`Missing value for field "${s.value}"`,t,s.column);i.push({type:"field",key:s.value,values:d.map(c=>c.value),location:{line:t,column:s.column}})}return an(i,r),i}function Sa(e,t,r,n,o){if(e.length<2)throw new m("Invalid field line",t,e[0]?.column??1);let i=et(e[0].value);if(!i)throw new m(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&de(n,o,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return an([a],r),a}function nn(e,t,r){if(e.length<2)throw new m(r,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}function ja(e,t,r){let n=Oa(e.fields),o=Aa(e.objectType,n),i=Ta(e.objectType,n),a=Va(n.get("groups")?.[0]),s=Qr(n.get("epoch")?.[0]),l=Qr(n.get("referencePlane")?.[0]),d=n.has("tidalLock")?Ie(te(n.get("tidalLock")[0]),"tidalLock",n.get("tidalLock")[0].location):void 0,c=n.has("resonance")?Da(n.get("resonance")[0]):void 0,f=La(n),w=n.get("derive")?.map(x=>Fa(x)),b=n.get("validate")?.map(x=>({rule:te(x)})),I=n.has("locked")?[...new Set(n.get("locked").flatMap(x=>x.values))]:void 0,v=n.get("tolerance")?.map(x=>Pa(x)),T=Ma(e.typedBlockEntries),y=on(e.infoEntries,"info"),$={type:e.objectType,id:e.id,properties:i,placement:o,info:y};return a.length>0&&($.groups=a),s&&($.epoch=s),l&&($.referencePlane=l),d!==void 0&&($.tidalLock=d),c&&($.resonance=c),f&&($.renderHints=f),w?.length&&($.deriveRules=w),b?.length&&($.validationRules=b),I?.length&&($.lockedFields=I),v?.length&&($.tolerances=v),T&&Object.keys(T).length>0&&($.typedBlocks=T),t!=="2.1"&&($.groups||$.epoch||$.referencePlane||$.tidalLock!==void 0||$.resonance||$.renderHints||$.deriveRules?.length||$.validationRules?.length||$.lockedFields?.length||$.tolerances?.length||$.typedBlocks)&&de(t,r,e.id,e.location),$}function Oa(e){let t=new Map;for(let r of e){let n=et(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(!n.allowRepeat&&t.has(r.key))throw m.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=t.get(r.key)??[];o.push(r),t.set(r.key,o)}return t}function Aa(e,t){let r=t.get("orbit")?.[0],n=t.get("at")?.[0],o=t.get("surface")?.[0],i=t.get("free")?.[0];if([r,n,o,i].filter(Boolean).length>1){let s=r??n??o??i;throw m.fromLocation("Object has multiple placement modes",s?.location)}if(r)return{mode:"orbit",target:te(r),distance:De(t.get("distance")?.[0],"distance"),semiMajor:De(t.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ea(t.get("eccentricity")?.[0],"eccentricity"),period:De(t.get("period")?.[0],"period"),angle:De(t.get("angle")?.[0],"angle"),inclination:De(t.get("inclination")?.[0],"inclination"),phase:De(t.get("phase")?.[0],"phase")};if(n){let s=te(n);return{mode:"at",target:s,reference:Gr(s,n.location)}}if(o)return{mode:"surface",target:te(o)};if(i){let s=te(i),l=ir(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function Ta(e,t){let r={};for(let[n,o]of t.entries()){let i=o[0],a=et(n);!i||!a?.legacySchema||a.legacySchema.placement||(ar(n,e,i.location),r[n]=Xr(n,i.values,i.location))}return r}function on(e,t){let r={};for(let n of e){if(n.key in r)throw m.fromLocation(`Duplicate ${t} key "${n.key}"`,n.location);r[n.key]=n.value}return r}function Ma(e){let t={};for(let r of Object.keys(e)){let n=e[r];n?.length&&(t[r]=on(n,r))}return t}function La(e){let t={},r=e.get("renderLabel")?.[0],n=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return r&&(t.renderLabel=Ie(te(r),"renderLabel",r.location)),n&&(t.renderOrbit=Ie(te(n),"renderOrbit",n.location)),o&&(t.renderPriority=Lt(te(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function Da(e){if(e.values.length!==2)throw m.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw m.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Fa(e){if(e.values.length!==2)throw m.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Pa(e){if(e.values.length!==2)throw m.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],r=ir(t),n=Number(t);return{field:e.values[0],value:r??(Number.isFinite(n)?n:t)}}function Va(e){return e?[...new Set(e.values)]:[]}function Qr(e){return e&&e.values.join(" ").trim()||null}function De(e,t){return e?or(te(e),e.location,t):void 0}function Ea(e,t){return e?Lt(te(e),t,e.location):void 0}function te(e){return Je(e.values,e.key,e.location)}function et(e){return Pt.get(e)}function an(e,t){for(let r of e){let n=et(r.key);if(!n)throw m.fromLocation(`Unknown field "${r.key}"`,r.location);if(n.legacySchema){ar(r.key,t,r.location);continue}if((r.key==="renderLabel"||r.key==="renderOrbit"||r.key==="tidalLock")&&r.values.length!==1)throw m.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function de(e,t,r,n){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${r}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:n.line,column:n.column})}function Ca(e){let t=[...e],r=[],n=!1,o=!1,i=null,a=1,s=1;for(let l=0;l<t.length;l++){let d=t[l],c=t[l+1];if(o){if(d==="*"&&c==="/"){t[l]=" ",t[l+1]=" ",o=!1,i=null,l++,s+=2;continue}d!==`
2
- `&&d!=="\r"&&(t[l]=" "),d===`
3
- `?(a++,s=1):s++;continue}if(!n&&d==="/"&&c==="*"){r.push({kind:"block",line:a,column:s}),t[l]=" ",t[l+1]=" ",o=!0,i={line:a,column:s},l++,s+=2;continue}if(!n&&d==="#"&&!Ra(t,l)){r.push({kind:"line",line:a,column:s}),t[l]=" ";let f=l+1;for(;f<t.length&&t[f]!==`
4
- `&&t[f]!=="\r";)t[f]=" ",f++;s+=f-l,l=f-1;continue}d==='"'&&t[l-1]!=="\\"&&(n=!n),d===`
5
- `?(a++,s=1):s++}if(o)throw m.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:r}}function Ra(e,t){let r=t+1,n=0;for(;r<e.length&&/[0-9a-f]/i.test(e[r]??"");)r++,n++;if(![3,4,6,8].includes(n))return!1;let o=e[r];return o===void 0||o===" "||o===" "||o==="\r"||o===`
6
- `}var Ba=/^schema\s+2(?:\.0|\.1)?$/i,_a=/^schema\s+2\.1$/i,za=/^schema\s+2\.0-draft$/i;function sn(e){for(let t of Na(e).split(/\r?\n/)){let r=t.trim();if(r)return za.test(r)?"2.0-draft":_a.test(r)?"2.1":Ba.test(r)?"2.0":"1.0"}return"1.0"}function Na(e){let t=[...e],r=!1,n=!1;for(let o=0;o<t.length;o++){let i=t[o],a=t[o+1];if(n){if(i==="*"&&a==="/"){t[o]=" ",t[o+1]=" ",n=!1,o++;continue}i!==`
7
- `&&i!=="\r"&&(t[o]=" ");continue}if(!r&&i==="/"&&a==="*"){t[o]=" ",t[o+1]=" ",n=!0,o++;continue}if(!r&&i==="#"){t[o]=" ";let s=o+1;for(;s<t.length&&t[s]!==`
8
- `&&t[s]!=="\r";)t[s]=" ",s++;o=s-1;continue}i==='"'&&t[o-1]!=="\\"&&(r=!r)}return t.join("")}function ge(e){let t=ln(e);if(!t.ok||!t.value){let r=t.diagnostics[0];throw new m(r?.message??"Failed to load WorldOrbit source",r?.line,r?.column)}return t.value}function ln(e){let t=sn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Ua(e,t);let r;try{r=Ue(e)}catch(o){return{ok:!1,value:null,diagnostics:[$e(o,"parse")]}}let n;try{n=We(r)}catch(o){return{ok:!1,value:null,diagnostics:[$e(o,"normalize")]}}try{Ye(n)}catch(o){return{ok:!1,value:null,diagnostics:[$e(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ua(e,t){let r;try{r=sr(e)}catch(a){return{ok:!1,value:null,diagnostics:[$e(a,"parse","load.atlas.failed")]}}let n=[...r.diagnostics];if(n.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:n};let o;try{o=nr(r)}catch(a){return{ok:!1,value:null,diagnostics:[$e(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:r,draftDocument:r,diagnostics:n},diagnostics:n}}var be={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function lr(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function tt(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Se(e,t,r){return{...e,translateX:e.translateX+t,translateY:e.translateY+r}}function Vt(e,t){return{...e,rotationDeg:lr(e.rotationDeg+t)}}function Fe(e,t,r,n,o){if(!Number.isFinite(r)||r<=0)return t;let i=Oe(e),a=tt(t.scale*r,o);if(a===t.scale)return t;let s=a/t.scale,l=n.x-i.x,d=n.y-i.y;return{...t,scale:a,translateX:(1-s)*l+s*t.translateX,translateY:(1-s)*d+s*t.translateY}}function je(e,t,r){let n=Oe(e),o=Ha(e.contentBounds,n,t.rotationDeg),i=Math.max(e.width-r.fitPadding*2,1),a=Math.max(e.height-r.fitPadding*2,1),s=Math.max(o.width,1),l=Math.max(o.height,1),d=tt(Math.min(i/s,a/l),r),c=ce({x:e.contentBounds.centerX,y:e.contentBounds.centerY},n,t.rotationDeg);return{...t,scale:d,translateX:n.x-(n.x+(c.x-n.x)*d),translateY:n.y-(n.y+(c.y-n.y)*d)}}function Et(e,t,r,n){let o=e.objects.find(l=>l.objectId===r&&!l.hidden);if(!o)return t;let i=Oe(e),a=tt(Math.max(t.scale,1.8),n),s=ce({x:o.x,y:o.y},i,t.rotationDeg);return{...t,scale:a,translateX:i.x-(i.x+(s.x-i.x)*a),translateY:i.y-(i.y+(s.y-i.y)*a),selectedObjectId:r}}function Ct(e,t){let r=Oe(e);return`translate(${t.translateX} ${t.translateY}) translate(${r.x} ${r.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-r.x} ${-r.y})`}function Pe(e,t,r){let n=Oe(e),o={x:r.x-t.translateX,y:r.y-t.translateY},i={x:o.x-n.x,y:o.y-n.y},a={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},s=ce({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:n.x+s.x,y:n.y+s.y}}function Rt(e,t){let r=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(s=>Pe(e,t,s)),n=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),i=Math.max(...r.map(s=>s.x)),a=Math.max(...r.map(s=>s.y));return{minX:n,minY:o,maxX:i,maxY:a,width:i-n,height:a-o,centerX:n+(i-n)/2,centerY:o+(a-o)/2}}function Oe(e){return{x:e.width/2,y:e.height/2}}function Ha(e,t,r){let n=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(l=>ce(l,t,r)),o=Math.min(...n.map(l=>l.x)),i=Math.min(...n.map(l=>l.y)),a=Math.max(...n.map(l=>l.x)),s=Math.max(...n.map(l=>l.y));return{minX:o,minY:i,maxX:a,maxY:s,width:a-o,height:s-i,centerX:o+(a-o)/2,centerY:i+(s-i)/2}}var _t="worldorbit-camera-root";function ne(e,t={}){let r=ct(t.theme),n=ls(t.preset??e.renderPreset??void 0),o=ut({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,a=dt(e,t.filter??null),s=e.objects.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Bt(y.object)).sort((y,$)=>y.sortKey-$.sortKey),l=e.labels.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Bt(y.object)),d=Xa(s),c=o.orbits?Ga(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(y=>!y.hidden).filter(y=>a.has(y.objectId)).filter(y=>o.structures||!Bt(y.object)).map(y=>`<line class="wo-leader wo-leader-${y.mode}" x1="${y.x1}" y1="${y.y1}" x2="${y.x2}" y2="${y.y2}" data-render-id="${q(y.renderId)}" data-group-id="${re(y.groupId??"")}" />`).join(""):"",w=o.relations?e.relations.filter(y=>!y.hidden).filter(y=>a.has(y.fromObjectId)&&a.has(y.toObjectId)).map(y=>`<line class="wo-relation" x1="${y.x1}" y1="${y.y1}" x2="${y.x2}" y2="${y.y2}" data-render-id="${q(y.renderId)}" data-relation-id="${re(y.relationId)}" />`).join(""):"",b=o.objects?s.map(y=>Ka(y,t.selectedObjectId??null,r)).join(""):"",I=o.labels?l.map(y=>Za(e,y,t.selectedObjectId??null)).join(""):"",v=o.metadata?`<text class="wo-title" x="56" y="64">${q(e.title)}</text>
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[l]=" "),c===`
3
+ `?(a++,s=1):s++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:s}),t[l]=" ",t[l+1]=" ",o=!0,i={line:a,column:s},l++,s+=2;continue}if(!r&&c==="#"&&!is(t,l)){n.push({kind:"line",line:a,column:s}),t[l]=" ";let f=l+1;for(;f<t.length&&t[f]!==`
4
+ `&&t[f]!=="\r";)t[f]=" ",f++;s+=f-l,l=f-1;continue}c==='"'&&t[l-1]!=="\\"&&(r=!r),c===`
5
+ `?(a++,s=1):s++}if(o)throw p.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:n}}function is(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 o=e[n];return o===void 0||o===" "||o===" "||o==="\r"||o===`
6
+ `}var as=/^schema\s+2(?:\.0|\.1)?$/i,ss=/^schema\s+2\.1$/i,ls=/^schema\s+2\.0-draft$/i;function hr(e){for(let t of cs(e).split(/\r?\n/)){let n=t.trim();if(n)return ls.test(n)?"2.0-draft":ss.test(n)?"2.1":as.test(n)?"2.0":"1.0"}return"1.0"}function cs(e){let t=[...e],n=!1,r=!1;for(let o=0;o<t.length;o++){let i=t[o],a=t[o+1];if(r){if(i==="*"&&a==="/"){t[o]=" ",t[o+1]=" ",r=!1,o++;continue}i!==`
7
+ `&&i!=="\r"&&(t[o]=" ");continue}if(!n&&i==="/"&&a==="*"){t[o]=" ",t[o+1]=" ",r=!0,o++;continue}if(!n&&i==="#"){t[o]=" ";let s=o+1;for(;s<t.length&&t[s]!==`
8
+ `&&t[s]!=="\r";)t[s]=" ",s++;o=s-1;continue}i==='"'&&t[o-1]!=="\\"&&(n=!n)}return t.join("")}function ve(e){let t=gr(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 gr(e){let t=hr(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return us(e,t);let n;try{n=He(e)}catch(o){return{ok:!1,value:null,diagnostics:[ke(o,"parse")]}}let r;try{r=qe(n)}catch(o){return{ok:!1,value:null,diagnostics:[ke(o,"normalize")]}}try{Ge(r)}catch(o){return{ok:!1,value:null,diagnostics:[ke(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function us(e,t){let n;try{n=cn(e)}catch(a){return{ok:!1,value:null,diagnostics:[ke(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let o;try{o=on(n)}catch(a){return{ok:!1,value:null,diagnostics:[ke(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var $e={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function un(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function ot(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function je(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Vt(e,t){return{...e,rotationDeg:un(e.rotationDeg+t)}}function Ve(e,t,n,r,o){if(!Number.isFinite(n)||n<=0)return t;let i=Oe(e),a=ot(t.scale*n,o);if(a===t.scale)return t;let s=a/t.scale,l=r.x-i.x,c=r.y-i.y;return{...t,scale:a,translateX:(1-s)*l+s*t.translateX,translateY:(1-s)*c+s*t.translateY}}function Se(e,t,n){let r=Oe(e),o=ps(e.contentBounds,r,t.rotationDeg),i=Math.max(e.width-n.fitPadding*2,1),a=Math.max(e.height-n.fitPadding*2,1),s=Math.max(o.width,1),l=Math.max(o.height,1),c=ot(Math.min(i/s,a/l),n),u=pe({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:c,translateX:r.x-(r.x+(u.x-r.x)*c),translateY:r.y-(r.y+(u.y-r.y)*c)}}function Ct(e,t,n,r){let o=e.objects.find(l=>l.objectId===n&&!l.hidden);if(!o)return t;let i=Oe(e),a=ot(Math.max(t.scale,1.8),r),s=pe({x:o.x,y:o.y},i,t.rotationDeg);return{...t,scale:a,translateX:i.x-(i.x+(s.x-i.x)*a),translateY:i.y-(i.y+(s.y-i.y)*a),selectedObjectId:n}}function Rt(e,t){let n=Oe(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function Ce(e,t,n){let r=Oe(e),o={x:n.x-t.translateX,y:n.y-t.translateY},i={x:o.x-r.x,y:o.y-r.y},a={x:i.x/Math.max(t.scale,1e-4),y:i.y/Math.max(t.scale,1e-4)},s=pe({x:a.x,y:a.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+s.x,y:r.y+s.y}}function Bt(e,t){let n=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(s=>Ce(e,t,s)),r=Math.min(...n.map(s=>s.x)),o=Math.min(...n.map(s=>s.y)),i=Math.max(...n.map(s=>s.x)),a=Math.max(...n.map(s=>s.y));return{minX:r,minY:o,maxX:i,maxY:a,width:i-r,height:a-o,centerX:r+(i-r)/2,centerY:o+(a-o)/2}}function Oe(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(l=>pe(l,t,n)),o=Math.min(...r.map(l=>l.x)),i=Math.min(...r.map(l=>l.y)),a=Math.max(...r.map(l=>l.x)),s=Math.max(...r.map(l=>l.y));return{minX:o,minY:i,maxX:a,maxY:s,width:a-o,height:s-i,centerX:o+(a-o)/2,centerY:i+(s-i)/2}}var zt="worldorbit-camera-root";function ae(e,t={}){let n=ft(t.theme),r=Ts(t.preset??e.renderPreset??void 0),o=pt({...r.layers,...t.layers}),i=t.subtitle??e.subtitle,a=mt(e,t.filter??null),s=e.objects.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>o.structures||!_t(h.object)).sort((h,I)=>h.sortKey-I.sortKey),l=e.labels.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>o.structures||!_t(h.object)),c=bs(s),u=o.orbits?gs(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(h=>!h.hidden).filter(h=>a.has(h.objectId)).filter(h=>o.structures||!_t(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="${q(h.renderId)}" data-group-id="${K(h.groupId??"")}" />`).join(""):"",b=o.relations?e.relations.filter(h=>!h.hidden).filter(h=>a.has(h.fromObjectId)&&a.has(h.toObjectId)).map(h=>`<line class="wo-relation" x1="${h.x1}" y1="${h.y1}" x2="${h.x2}" y2="${h.y2}" data-render-id="${q(h.renderId)}" data-relation-id="${K(h.relationId)}" />`).join(""):"",w=o.events?e.events.filter(h=>!h.hidden).map(h=>ms(e,h,a,n)).join(""):"",$=o.objects?s.map(h=>ys(h,t.selectedObjectId??null,n)).join(""):"",v=o.labels?l.map(h=>ws(e,h,t.selectedObjectId??null)).join(""):"",j=o.metadata?`<text class="wo-title" x="56" y="64">${q(e.title)}</text>
9
9
  <text class="wo-subtitle" x="56" y="88">${q(i)}</text>
10
- <text class="wo-meta" x="56" y="${e.height-42}">${q(us(e))}</text>`:"",T=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
10
+ <text class="wo-meta" x="56" y="${e.height-42}">${q(Es(e))}</text>`:"",A=o.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
- ${o.guides?cs(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">
12
+ ${o.guides?Ms(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
13
  <title id="worldorbit-title">${q(e.title)}</title>
14
14
  <desc id="worldorbit-desc">A ${q(e.viewMode)} WorldOrbit render with ${s.length} visible objects.</desc>
15
15
  <defs>
16
16
  <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
17
- <stop offset="0%" stop-color="${r.backgroundStart}" />
18
- <stop offset="100%" stop-color="${r.backgroundEnd}" />
17
+ <stop offset="0%" stop-color="${n.backgroundStart}" />
18
+ <stop offset="100%" stop-color="${n.backgroundEnd}" />
19
19
  </linearGradient>
20
20
  <radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
21
- <stop offset="0%" stop-color="${r.starGlow}" stop-opacity="0.95" />
22
- <stop offset="100%" stop-color="${r.starCore}" stop-opacity="0" />
21
+ <stop offset="0%" stop-color="${n.starGlow}" stop-opacity="0.95" />
22
+ <stop offset="100%" stop-color="${n.starCore}" stop-opacity="0" />
23
23
  </radialGradient>
24
24
  <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
25
- <stop offset="0%" stop-color="${r.backgroundGlow}" />
25
+ <stop offset="0%" stop-color="${n.backgroundGlow}" />
26
26
  <stop offset="100%" stop-color="transparent" />
27
27
  </radialGradient>
28
- ${d}
28
+ ${c}
29
29
  </defs>
30
30
  <style>
31
31
  .wo-bg { fill: url(#wo-bg); }
32
32
  .wo-bg-glow { fill: url(#wo-bg-glow); }
33
- .wo-grid { fill: none; stroke: ${r.guide}; stroke-width: 1; }
34
- .wo-orbit { fill: none; stroke: ${r.orbit}; stroke-width: 1.5; }
33
+ .wo-grid { fill: none; stroke: ${n.guide}; stroke-width: 1; }
34
+ .wo-orbit { fill: none; stroke: ${n.orbit}; stroke-width: 1.5; }
35
35
  .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
36
36
  .wo-orbit-front { opacity: 0.9; }
37
- .wo-orbit-band { stroke: ${r.orbitBand}; stroke-linecap: round; }
38
- .wo-relation { stroke: ${r.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
39
- .wo-leader { stroke: ${r.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
40
- .wo-label { fill: ${r.ink}; font-family: ${r.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
41
- .wo-label-secondary { fill: ${r.muted}; font-family: ${r.fontFamily}; font-weight: 500; }
42
- .wo-title { fill: ${r.ink}; font: 700 24px ${r.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
43
- .wo-subtitle { fill: ${r.muted}; font: 500 12px ${r.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
44
- .wo-meta { fill: ${r.muted}; font: 500 11px ${r.fontFamily}; letter-spacing: 0.06em; }
37
+ .wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
38
+ .wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
39
+ .wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
40
+ .wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
41
+ .wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
42
+ .wo-leader { stroke: ${n.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
43
+ .wo-label { fill: ${n.ink}; font-family: ${n.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
44
+ .wo-label-secondary { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
45
+ .wo-title { fill: ${n.ink}; font: 700 24px ${n.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
46
+ .wo-subtitle { fill: ${n.muted}; font: 500 12px ${n.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
47
+ .wo-meta { fill: ${n.muted}; font: 500 11px ${n.fontFamily}; letter-spacing: 0.06em; }
45
48
  .wo-object { cursor: pointer; outline: none; }
46
49
  .wo-object:focus-visible .wo-selection-ring,
47
50
  .wo-object:hover .wo-selection-ring,
48
51
  .wo-object-selected .wo-selection-ring { display: block; }
49
- .wo-object-selected .wo-selection-ring { stroke: ${r.selected}; }
50
- .wo-object-label-selected .wo-label { fill: ${r.accent}; }
51
- .wo-object-label-selected .wo-label-secondary { fill: ${r.selected}; }
52
+ .wo-object-selected .wo-selection-ring { stroke: ${n.selected}; }
53
+ .wo-object-label-selected .wo-label { fill: ${n.accent}; }
54
+ .wo-object-label-selected .wo-label-secondary { fill: ${n.selected}; }
52
55
  .wo-chain-selected .wo-selection-ring,
53
56
  .wo-chain-hover .wo-selection-ring { display: block; }
54
57
  .wo-ancestor-selected .wo-selection-ring,
55
58
  .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
56
59
  .wo-chain-selected .wo-label,
57
- .wo-chain-hover .wo-label { fill: ${r.accent}; }
60
+ .wo-chain-hover .wo-label { fill: ${n.accent}; }
58
61
  .wo-ancestor-selected .wo-label,
59
- .wo-ancestor-hover .wo-label { fill: ${r.ink}; opacity: 0.82; }
62
+ .wo-ancestor-hover .wo-label { fill: ${n.ink}; opacity: 0.82; }
60
63
  .wo-orbit-related-selected,
61
- .wo-orbit-related-hover { stroke: ${r.accentStrong}; opacity: 1; }
64
+ .wo-orbit-related-hover { stroke: ${n.accentStrong}; opacity: 1; }
62
65
  .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
63
66
  .wo-object-image { pointer-events: none; }
64
67
  </style>
65
- ${T}
66
- ${v}
68
+ ${A}
69
+ ${j}
67
70
  <g data-worldorbit-world="true">
68
- <g data-worldorbit-camera-root="${_t}" id="${_t}">
71
+ <g data-worldorbit-camera-root="${zt}" id="${zt}">
69
72
  <g data-worldorbit-world-content="true">
70
- ${o.orbits?`<g data-layer-id="orbits-back">${c.back}</g>`:""}
73
+ ${o.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
71
74
  ${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
72
- ${o.relations?`<g data-layer-id="relations">${w}</g>`:""}
73
- ${o.objects?`<g data-layer-id="objects">${b}</g>`:""}
74
- ${o.orbits?`<g data-layer-id="orbits-front">${c.front}</g>`:""}
75
- ${o.labels?`<g data-layer-id="labels">${I}</g>`:""}
75
+ ${o.relations?`<g data-layer-id="relations">${b}</g>`:""}
76
+ ${o.events?`<g data-layer-id="events">${w}</g>`:""}
77
+ ${o.objects?`<g data-layer-id="objects">${$}</g>`:""}
78
+ ${o.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
79
+ ${o.labels?`<g data-layer-id="labels">${v}</g>`:""}
76
80
  </g>
77
81
  </g>
78
82
  </g>
79
- </svg>`}function dr(e,t={}){return ne(se(e,t),t)}function fn(e,t={}){let r=ge(e);return dr(r.document,qa(r,t))}function qa(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function Ga(e,t,r){let n=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(r||!Bt(a.object)))){let a=i.bandThickness??(i.band?10:1.5),s=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",l=`data-render-id="${q(i.renderId)}" data-orbit-object-id="${re(i.objectId)}" data-parent-id="${re(i.parentId)}" data-group-id="${re(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&n.push(`<path class="${s} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${l} />`),i.frontArcPath&&o.push(`<path class="${s} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${l} />`);continue}if(i.kind==="ellipse"){let d=i.rx??i.radius??0,c=i.ry??i.radius??0;o.push(`<ellipse class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${d}" ry="${c}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${a}" ${l} />`);continue}o.push(`<circle class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${l} />`)}return{back:n.join(""),front:o.join("")}}function Xa(e){return e.filter(t=>!!t.imageHref).map(t=>es(t)).join("")}function Ka(e,t,r){let{object:n,x:o,y:i,radius:a,visualRadius:s}=e,l=t===e.objectId?" wo-object-selected":"",d=n.properties.kind?` wo-kind-${String(n.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",c=rs(e,r),f=Qa(e),w=f?cn(n,o,i,a,c,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${n.type}${d}${l}" data-object-id="${q(e.objectId)}" data-parent-id="${re(e.parentId??"")}" data-group-id="${re(e.groupId??"")}" data-render-id="${q(e.renderId)}" tabindex="0" role="button" aria-label="${q(`${n.type} ${e.objectId}`)}">
83
+ </svg>`}function ms(e,t,n,r){let o=t.objectIds.filter(l=>n.has(l)).map(l=>e.objects.find(c=>c.objectId===l&&!c.hidden)).filter(Boolean);if(o.length===0)return"";let i=t.event.color||r.accent,a=t.event.label||t.event.id,s=o.map(l=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${l.x}" y2="${l.y}" stroke="${K(i)}" data-event-id="${K(t.eventId)}" data-object-id="${K(l.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${q(t.renderId)}" data-event-id="${K(t.eventId)}">
84
+ ${s}
85
+ <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${K(i)}" />
86
+ <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${q(a)}</text>
87
+ </g>`}function pn(e,t={}){return ae(ue(e,t),t)}function vr(e,t={}){let n=ve(e);return pn(n.document,hs(n,t))}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 gs(e,t,n){let r=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!_t(a.object)))){let a=i.bandThickness??(i.band?10:1.5),s=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",l=`data-render-id="${q(i.renderId)}" data-orbit-object-id="${K(i.objectId)}" data-parent-id="${K(i.parentId)}" data-group-id="${K(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&r.push(`<path class="${s} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${l} />`),i.frontArcPath&&o.push(`<path class="${s} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${l} />`);continue}if(i.kind==="ellipse"){let c=i.rx??i.radius??0,u=i.ry??i.radius??0;o.push(`<ellipse class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${c}" ry="${u}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${a}" ${l} />`);continue}o.push(`<circle class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${l} />`)}return{back:r.join(""),front:o.join("")}}function bs(e){return e.filter(t=>!!t.imageHref).map(t=>Is(t)).join("")}function ys(e,t,n){let{object:r,x:o,y:i,radius:a,visualRadius:s}=e,l=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=ks(e,n),f=$s(e),b=f?br(r,o,i,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${l}" data-object-id="${q(e.objectId)}" data-parent-id="${K(e.parentId??"")}" data-group-id="${K(e.groupId??"")}" data-render-id="${q(e.renderId)}" tabindex="0" role="button" aria-label="${q(`${r.type} ${e.objectId}`)}">
80
88
  <circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${s+8}" />
81
- ${Ja(e,c)}
82
- ${cn(n,o,i,a,c)}
89
+ ${vs(e,u)}
90
+ ${br(r,o,i,a,u)}
83
91
  ${f}
84
- ${w}
85
- </g>`}function Za(e,t,r){let n=r===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${n}" data-object-id="${q(t.objectId)}" data-group-id="${re(t.groupId??"")}" data-render-id="${q(t.renderId)}">
92
+ ${b}
93
+ </g>`}function ws(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${q(t.objectId)}" data-group-id="${K(t.groupId??"")}" data-render-id="${q(t.renderId)}">
86
94
  <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${q(t.label)}</text>
87
95
  <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${q(t.secondaryLabel)}</text>
88
- </g>`}function cn(e,t,r,n,o,i={}){let a=i.outlineOnly?"transparent":o.fill,s=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${r}" r="${n*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
89
- <circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-n*2} ${r+n*1.3} Q ${t-n*.7} ${r+n*.3} ${t-n*.45} ${r}" fill="none" stroke="${s}" stroke-width="${Math.max(2,n*.8)}" stroke-linecap="round" opacity="0.85" />
90
- <circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${mn(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let l=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?l==="black-hole"||l==="nebula"||l==="galaxy"||l==="dwarf-galaxy"?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${cr(t,r,n)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:l==="black-hole"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.4}" ry="${n*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
91
- <circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:l==="galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*2.6}" ry="${n}" fill="${o.halo??"none"}" stroke="none" />
92
- <ellipse cx="${t}" cy="${r}" rx="${n*1.5}" ry="${n*.42}" fill="${a}" stroke="${o.stroke}" stroke-width="1.2" />
93
- <circle cx="${t}" cy="${r}" r="${n*.28}" fill="${o.core??"#fff"}" stroke="none" />`:l==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${r}" rx="${n*1.6}" ry="${n*.55}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />
94
- <circle cx="${t}" cy="${r}" r="${n*.25}" fill="${o.core??"#fff"}" stroke="none" />`:l==="nebula"?`<circle cx="${t}" cy="${r}" r="${n*2.2}" fill="${o.halo??"none"}" stroke="none" />
95
- <circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${cr(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Ja(e,t){if(!t.atmosphere)return"";let{object:r,x:n,y:o,radius:i}=e;return r.type!=="planet"&&r.type!=="moon"&&r.type!=="asteroid"?"":`<circle cx="${n}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Qa(e){if(!e.imageHref)return"";let t=ts(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${re(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${re(pn(e))})" />`}function es(e){let{x:t,y:r,radius:n}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${r}" r="${n}" />`;break;case"structure":o=`<polygon points="${mn(t,r,n)}" />`;break;case"phenomenon":o=`<polygon points="${cr(t,r,n)}" />`;break;default:return""}return`<clipPath id="${re(pn(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function ts(e){let{object:t,x:r,y:n,radius:o}=e;switch(t.type){case"structure":return{x:r-o,y:n-o,width:o*2,height:o*2};case"phenomenon":return{x:r-o*1.2,y:n-o*1.2,width:o*2.4,height:o*2.4};default:return{x:r-o,y:n-o,width:o*2,height:o*2}}}function rs(e,t){let r=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),n=ns(e.object.type,r,t),o=e.fillColor&&fs(e.fillColor)?e.fillColor:n.fill,i=un(e.object.properties.albedo),a=un(e.object.properties.temperature),s=is(o,a,i,e.object.type),l=rt(s,"#ffffff",.4)??n.stroke,d=ss(e.object.properties.atmosphere),c=e.object.type==="star"?dn(rt(s,"#fff2cb",.4)??s,.82):void 0;return{fill:s,stroke:l,glow:c,atmosphere:d,tail:e.object.type==="comet"?dn(rt(s,"#ffffff",.5)??s,.72):void 0}}function ns(e,t,r){switch(e){case"star":return{fill:r.starCore,stroke:r.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:r.accentStrong,stroke:"#fff2ea"};case"phenomenon":return os(t)}}function os(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 is(e,t,r,n){let o=e;if(t!==null){let i=as(t,n);o=rt(o,i,n==="star"?.42:.2)??o}if(r!==null){let i=Math.min(Math.max(r,0),1);o=rt(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function as(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function ss(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 ls(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 un(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function pn(e){return`${e.renderId}-clip`}function mn(e,t,r){return`${e},${t-r} ${e+r},${t} ${e},${t+r} ${e-r},${t}`}function cr(e,t,r){return`${e},${t-r*1.2} ${e+r*.9},${t-r*.3} ${e+r*1.2},${t+r*.8} ${e},${t+r*1.2} ${e-r*1.1},${t+r*.3} ${e-r*.8},${t-r*.8}`}function cs(e,t){let r=Array.from({length:10},(o,i)=>{let a=90+i*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),n=Array.from({length:6},(o,i)=>{let a=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${r}${n}`}function us(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Bt(e){return e.type==="structure"||e.type==="phenomenon"}function rt(e,t,r){let n=ur(e),o=ur(t);if(!n||!o)return;let i=Math.min(Math.max(r,0),1);return ds({r:Math.round(n.r+(o.r-n.r)*i),g:Math.round(n.g+(o.g-n.g)*i),b:Math.round(n.b+(o.b-n.b)*i)})}function dn(e,t){let r=ur(e);return r?`rgba(${r.r}, ${r.g}, ${r.b}, ${t})`:e}function ur(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 ds(e){let t=r=>r.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function fs(e){return!!e.trim()}function q(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function re(e){return q(e)}var Ve=180,Ee=120,hn=10;function gn(e,t,r){let n=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},o=Math.min((Ve-hn*2)/Math.max(n.width,1),(Ee-hn*2)/Math.max(n.height,1)),i=(Ve-n.width*o)/2-n.minX*o,a=(Ee-n.height*o)/2-n.minY*o,s=Rt(e,t),l=r.map(d=>{let c=d.x*o+i,f=d.y*o+a,w=Math.max(1.4,Math.min(d.visualRadius*o,5.2)),b=d.fillColor??ps(d.object.type);return`<circle cx="${oe(c)}" cy="${oe(f)}" r="${oe(w)}" fill="${b}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Ve}px;height:${Ee}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;">
96
- <svg width="${Ve}" height="${Ee}" viewBox="0 0 ${Ve} ${Ee}" role="presentation" aria-hidden="true">
97
- <rect x="0.5" y="0.5" width="${Ve-1}" height="${Ee-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
98
- <rect x="${oe(n.minX*o+i)}" y="${oe(n.minY*o+a)}" width="${oe(n.width*o)}" height="${oe(n.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
96
+ </g>`}function br(e,t,n,r,o,i={}){let a=i.outlineOnly?"transparent":o.fill,s=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
97
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.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="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.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="${s}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
98
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Ir(t,n,r)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let l=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?l==="black-hole"||l==="nebula"||l==="galaxy"||l==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${dn(t,n,r)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:l==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
99
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:l==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${o.halo??"none"}" stroke="none" />
100
+ <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${o.stroke}" stroke-width="1.2" />
101
+ <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${o.core??"#fff"}" stroke="none" />`:l==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />
102
+ <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${o.core??"#fff"}" stroke="none" />`:l==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${o.halo??"none"}" stroke="none" />
103
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${dn(t,n,r)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function vs(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:o,radius:i}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function $s(e){if(!e.imageHref)return"";let t=xs(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($r(e))})" />`}function Is(e){let{x:t,y:n,radius:r}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":o=`<polygon points="${Ir(t,n,r)}" />`;break;case"phenomenon":o=`<polygon points="${dn(t,n,r)}" />`;break;default:return""}return`<clipPath id="${K($r(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function xs(e){let{object:t,x:n,y:r,radius:o}=e;switch(t.type){case"structure":return{x:n-o,y:r-o,width:o*2,height:o*2};case"phenomenon":return{x:n-o*1.2,y:r-o*1.2,width:o*2.4,height:o*2.4};default:return{x:n-o,y:r-o,width:o*2,height:o*2}}}function ks(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=js(e.object.type,n,t),o=e.fillColor&&Fs(e.fillColor)?e.fillColor:r.fill,i=yr(e.object.properties.albedo),a=yr(e.object.properties.temperature),s=Os(o,a,i,e.object.type),l=it(s,"#ffffff",.4)??r.stroke,c=Ls(e.object.properties.atmosphere),u=e.object.type==="star"?wr(it(s,"#fff2cb",.4)??s,.82):void 0;return{fill:s,stroke:l,glow:u,atmosphere:c,tail:e.object.type==="comet"?wr(it(s,"#ffffff",.5)??s,.72):void 0}}function js(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 Ss(t)}}function Ss(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 Os(e,t,n,r){let o=e;if(t!==null){let i=As(t,r);o=it(o,i,r==="star"?.42:.2)??o}if(n!==null){let i=Math.min(Math.max(n,0),1);o=it(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function As(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Ls(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 Ts(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 yr(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function $r(e){return`${e.renderId}-clip`}function Ir(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function dn(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 Ms(e,t){let n=Array.from({length:10},(o,i)=>{let a=90+i*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(o,i)=>{let a=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function Es(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function _t(e){return e.type==="structure"||e.type==="phenomenon"}function it(e,t,n){let r=fn(e),o=fn(t);if(!r||!o)return;let i=Math.min(Math.max(n,0),1);return Ds({r:Math.round(r.r+(o.r-r.r)*i),g:Math.round(r.g+(o.g-r.g)*i),b:Math.round(r.b+(o.b-r.b)*i)})}function wr(e,t){let n=fn(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function fn(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 Ds(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Fs(e){return!!e.trim()}function q(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function K(e){return q(e)}var Re=180,Be=120,xr=10;function kr(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},o=Math.min((Re-xr*2)/Math.max(r.width,1),(Be-xr*2)/Math.max(r.height,1)),i=(Re-r.width*o)/2-r.minX*o,a=(Be-r.height*o)/2-r.minY*o,s=Bt(e,t),l=n.map(c=>{let u=c.x*o+i,f=c.y*o+a,b=Math.max(1.4,Math.min(c.visualRadius*o,5.2)),w=c.fillColor??Ps(c.object.type);return`<circle cx="${se(u)}" cy="${se(f)}" r="${se(b)}" fill="${w}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Re}px;height:${Be}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="${Re}" height="${Be}" viewBox="0 0 ${Re} ${Be}" role="presentation" aria-hidden="true">
105
+ <rect x="0.5" y="0.5" width="${Re-1}" height="${Be-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
106
+ <rect x="${se(r.minX*o+i)}" y="${se(r.minY*o+a)}" width="${se(r.width*o)}" height="${se(r.height*o)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
99
107
  ${l}
100
- <rect x="${oe(s.minX*o+i)}" y="${oe(s.minY*o+a)}" width="${oe(s.width*o)}" height="${oe(s.height*o)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
108
+ <rect x="${se(s.minX*o+i)}" y="${se(s.minY*o+a)}" width="${se(s.width*o)}" height="${se(s.height*o)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
101
109
  </svg>
102
- </div>`}function ps(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 oe(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var ms=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function yn(e){return{objectId:e.objectId,title:e.objectId,typeLabel:ws(e.object.type),imageHref:e.renderObject.imageHref??null,description:bs(e),tags:gs(e.object.properties.tags),fields:hs(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function wn(e,t){let r=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${le(i)}</span>`).join("")}</div>`:"",n=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${le(i.label)}</dt><dd>${le(i.value)}</dd></div>`).join("")}</dl>`:"",o=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${le(e.objectId)}">
110
+ </div>`}function Ps(e){switch(e){case"star":return"#ffcc67";case"planet":return"#72b7ff";case"moon":return"#c7d7ea";case"belt":case"ring":return"#d9aa74";case"asteroid":return"#a7a5b8";case"comet":return"#9ce7ff";case"structure":return"#ff7f5f";case"phenomenon":return"#78ffd7"}}function se(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Vs=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function Sr(e){return{objectId:e.objectId,title:e.objectId,typeLabel:zs(e.object.type),imageHref:e.renderObject.imageHref??null,description:Bs(e),tags:Rs(e.object.properties.tags),fields:Cs(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function Or(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(i=>`<span class="wo-tooltip-tag">${fe(i)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(i=>`<div class="wo-tooltip-field"><dt>${fe(i.label)}</dt><dd>${fe(i.value)}</dd></div>`).join("")}</dl>`:"",o=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${fe(e.objectId)}">
103
111
  <div class="wo-tooltip-head">
104
- ${e.imageHref?`<img class="wo-tooltip-image" src="${$s(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${le(e.typeLabel.slice(0,1))}</div>`}
112
+ ${e.imageHref?`<img class="wo-tooltip-image" src="${Us(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${fe(e.typeLabel.slice(0,1))}</div>`}
105
113
  <div class="wo-tooltip-heading">
106
- <strong>${le(e.title)}</strong>
107
- <span>${le(e.typeLabel)}</span>
114
+ <strong>${fe(e.title)}</strong>
115
+ <span>${fe(e.typeLabel)}</span>
108
116
  </div>
109
117
  </div>
110
- ${e.description?`<p class="wo-tooltip-description">${le(e.description)}</p>`:""}
111
- ${r}
118
+ ${e.description?`<p class="wo-tooltip-description">${fe(e.description)}</p>`:""}
112
119
  ${n}
113
- ${o.length?`<p class="wo-tooltip-relations">${le(o.join(" - "))}</p>`:""}
114
- </article>`}function hs(e){let t=new Map;for(let n of ms){let o=e.object.properties[n];o!==void 0&&t.set(n,{key:n,label:vs(n),value:bn(o)})}let r=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),r?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${r.target}`}):r?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${r.target}`}):r?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:r.distance?`Free ${bn(r.distance)}`:`Free ${r.descriptor??"custom"}`}),[...t.values()]}function gs(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 r=e.group?.label?.trim();return r&&r!==e.objectId?r:null}function bn(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):ys(e)}function ys(e){return`${e.value}${e.unit??""}`}function ws(e){return e.charAt(0).toUpperCase()+e.slice(1)}function vs(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function le(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function $s(e){return le(e)}var Ce={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},vn="worldorbit-viewer-tooltip-style";function ye(e,t){if(Ss(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let n={minScale:t.minScale??Ce.minScale,maxScale:t.maxScale??Ce.maxScale,fitPadding:t.fitPadding??Ce.fitPadding},o={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??Ce.panStep,zoomStep:t.zoomStep??Ce.zoomStep,rotationStep:t.rotationStep??Ce.rotationStep},i={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:K(t.initialFilter),subtitle:t.subtitle},a=e.getAttribute("tabindex"),s=e.style.touchAction,l=e.style.position,d=Is(t),c=nt(d,i),f={...be},w=null,b=null,I=null,v=null,T=!1,y=null,$=null,x=0,B=!1,F=new Map,j=null,P=null,A=null,U=null,C=null,W=null;a===null&&(e.tabIndex=0),js(),e.classList.add("wo-viewer-container"),e.style.touchAction=o.touch?"none":s,e.style.position||(e.style.position="relative");let G=u=>{if(!o.pointer||B)return;u.preventDefault(),e.focus();let p=Dn(u.clientX,u.clientY),h=ot(Math.exp(-u.deltaY*.002),.6,1.6);R(Fe(c,f,h,p,n))},V=u=>{if(B)return;let p=u.pointerType==="touch";if(p&&!o.touch||!p&&!o.pointer||!p&&u.button!==0)return;e.focus(),e.setPointerCapture?.(u.pointerId);let h=st(u.clientX,u.clientY);if(p){F.set(u.pointerId,h),F.size===2?j=xn(c,f,F):F.size===1&&(x=0,T=!1);return}y=u.pointerId,$=h,x=0,T=!1},pe=u=>{if(B)return;if(u.pointerType==="touch"){if(!o.touch||!F.has(u.pointerId))return;let L=F.get(u.pointerId),Be=st(u.clientX,u.clientY);if(F.set(u.pointerId,Be),F.size===2){j||(j=xn(c,f,F));let ae=Sn(F),Te=ae.distance/Math.max(j.startDistance,1),Xt=Fe(c,j.startState,Te,j.startCenter,n),Kt=ae.center.x-j.startViewportCenter.x,Zt=ae.center.y-j.startViewportCenter.y;R(Se(Xt,Kt,Zt))}else if(F.size===1){let ae=Be.x-L.x,Te=Be.y-L.y;x+=Math.abs(ae)+Math.abs(Te),x>2&&(T=!0),R(Se(f,ae,Te))}return}if(!o.pointer||y!==u.pointerId||!$)return;let h=st(u.clientX,u.clientY),E=h.x-$.x,D=h.y-$.y;x+=Math.abs(E)+Math.abs(D),$=h,x>2&&(T=!0),R(Se(f,E,D))},Q=u=>{if(u.pointerType==="touch"){F.delete(u.pointerId),F.size<2&&(j=null);return}y===u.pointerId&&(y=null,$=null)},g=u=>{if(!o.selection||B)return;if(T){T=!1;return}let p=zt(u.target);ve(p),o.tooltipMode==="pinned"&&(A=p,ie())},O=u=>{let p=zt(u.target);Re(p)},H=()=>{Re(null)},we=u=>{let p=zt(u.target);p&&Re(p)},k=()=>{Re(null)},X=u=>{if(!o.keyboard||B)return;let p=zt(u.target);if((u.key==="Enter"||u.key===" ")&&p){u.preventDefault(),ve(p),o.tooltipMode==="pinned"&&(A=p,ie());return}switch(u.key){case"Escape":o.tooltipMode==="pinned"&&A&&(u.preventDefault(),A=null,ie());return;case"+":case"=":u.preventDefault(),S.zoomBy(o.zoomStep);return;case"-":u.preventDefault(),S.zoomBy(1/o.zoomStep);return;case"ArrowLeft":u.preventDefault(),S.panBy(-o.panStep,0);return;case"ArrowRight":u.preventDefault(),S.panBy(o.panStep,0);return;case"ArrowUp":u.preventDefault(),S.panBy(0,-o.panStep);return;case"ArrowDown":u.preventDefault(),S.panBy(0,o.panStep);return;case"[":u.preventDefault(),S.rotateBy(-o.rotationStep);return;case"]":u.preventDefault(),S.rotateBy(o.rotationStep);return;case"f":case"F":u.preventDefault(),S.fitToSystem();return;case"0":u.preventDefault(),S.resetView();return}};e.addEventListener("wheel",G,{passive:!1}),e.addEventListener("pointerdown",V),e.addEventListener("pointermove",pe),e.addEventListener("pointerup",Q),e.addEventListener("pointercancel",Q),e.addEventListener("click",g),e.addEventListener("mouseover",O),e.addEventListener("mouseleave",H),e.addEventListener("focusin",we),e.addEventListener("focusout",k),e.addEventListener("keydown",X);let S={setSource(u){d={kind:"source",value:u},c=nt(d,i),W=null,ee(!0)},setDocument(u){d={kind:"document",value:u},c=nt(d,i),W=null,ee(!0)},setScene(u){d={kind:"scene",value:u},c=u,W=null,ee(!0)},getScene(){return c},getRenderOptions(){return xs(i)},listViewpoints(){return c.viewpoints.slice()},getActiveViewpoint(){return Ht(W)},goToViewpoint(u){let p=Ht(u);if(!p)return!1;let h={},E=ht(p);if(p.preset!==null&&(h.preset=p.preset),d.kind!=="scene"&&p.projection!==c.projection&&(h.projection=p.projection),E&&(h.layers=E),W=p.id,Object.keys(h).length>0){let L=In(h);i=$n(i,h),d.kind!=="scene"&&L&&(c=nt(d,i)),ee(L)}qt(gt(p),!1,!1);let D=Fn(p);return R(D),ve(p.selectedObjectId??p.objectId??null,!1),t.onSelectionChange?.(Wt()),t.onSelectionDetailsChange?.(me(f.selectedObjectId)),Gt(),Ae(),!0},search(u,p=12){return ft(c,u,p)},getFilter(){return i.filter?{...i.filter}:null},setFilter(u){qt(u,!0,!0)},getVisibleObjects(){return Yt()},getFocusPath(u){return yr(u)},getObjectDetails(u){return me(u)},getSelectionDetails(){return me(f.selectedObjectId)},getTooltipDetails(){return C},getAtlasState(){return Ir(f,i,i.filter??null,W)},setAtlasState(u){let p=typeof u=="string"?mt(u):u;p.viewpointId&&S.goToViewpoint(p.viewpointId),S.setRenderOptions(p.renderOptions),qt(p.filter??null,!1,!1),R(at({...f,...p.viewerState})),ve(p.viewerState.selectedObjectId??null,!1),Gt(),t.onSelectionChange?.(Wt()),t.onSelectionDetailsChange?.(me(f.selectedObjectId)),Ae()},serializeAtlasState(){return pt(S.getAtlasState())},captureBookmark(u,p){return xr(u,p,S.getAtlasState())},applyBookmark(u){return typeof u=="string"?(S.setAtlasState(u),!0):(S.setAtlasState(u.atlasState),!0)},setRenderOptions(u){let p=In(u);i=$n(i,u),d.kind!=="scene"&&p&&(c=nt(d,i)),ee(p)},getState(){return{...f}},setState(u){R(at({...f,...u}))},zoomBy(u,p){R(Fe(c,f,u,p??{x:c.width/2,y:c.height/2},n))},panBy(u,p){R(Se(f,u,p))},rotateBy(u){R(Vt(f,u))},fitToSystem(){R(je(c,f,n))},focusObject(u){W=null,R(Et(c,f,u,n)),ve(u),o.tooltipMode==="pinned"&&(A=Y(u)?.objectId??null,ie())},pinTooltip(u){A=Y(u)?.objectId??null,ie()},resetView(){let u=je(c,{...be},n);W=null,R(u),ve(null),A=null,ie()},exportSvg(){return ne(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){B||(B=!0,e.removeEventListener("wheel",G),e.removeEventListener("pointerdown",V),e.removeEventListener("pointermove",pe),e.removeEventListener("pointerup",Q),e.removeEventListener("pointercancel",Q),e.removeEventListener("click",g),e.removeEventListener("mouseover",O),e.removeEventListener("mouseleave",H),e.removeEventListener("focusin",we),e.removeEventListener("focusout",k),e.removeEventListener("keydown",X),v?.remove(),v=null,I?.remove(),I=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=s,e.style.position=l,a===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",a))}};return ee(!0),t.initialViewpointId?S.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?S.focusObject(t.initialSelectionObjectId):Ae(),S;function ee(u){if(e.innerHTML=ne(c,{...i,filter:i.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),b=e.querySelector("#worldorbit-camera-root"),I=null,v=null,o.minimap&&(I=document.createElement("div"),I.dataset.worldorbitMinimapRoot="true",e.append(I)),o.tooltipMode!=="disabled"&&(v=document.createElement("div"),v.className="wo-viewer-tooltip-root",v.dataset.worldorbitTooltip="true",v.hidden=!0,v.addEventListener("click",_n),e.append(v)),!w||!b)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=u?je(c,{...be},n):at(f),ve(f.selectedObjectId&&Y(f.selectedObjectId)?f.selectedObjectId:null,!1),Re(P&&Y(P)?P:null,!1),A=A&&Y(A)?A:null,mr(),Pn(),Gt(),t.onViewChange?.({...f}),Ae()}function R(u){f=at(u),mr(),t.onViewChange?.({...f}),Ae()}function at(u){return{scale:ot(u.scale,n.minScale,n.maxScale),rotationDeg:kn(u.rotationDeg),translateX:Number.isFinite(u.translateX)?u.translateX:f.translateX,translateY:Number.isFinite(u.translateY)?u.translateY:f.translateY,selectedObjectId:u.selectedObjectId&&Y(u.selectedObjectId)?u.selectedObjectId:null}}function mr(){b&&(b.setAttribute("transform",Ct(c,f)),Vn(),ie())}function ve(u,p=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${it(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:u&&Y(u)?u:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${it(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),hr(),ie(),p&&(t.onSelectionChange?.(Wt()),t.onSelectionDetailsChange?.(me(f.selectedObjectId)),t.onViewChange?.({...f}),Ae())}function Re(u,p=!0){P===u&&p||(P=u&&Y(u)?u:null,hr(),ie(),p&&(t.onHoverChange?.(Y(P)),t.onHoverDetailsChange?.(me(P))))}function Wt(){return Y(f.selectedObjectId)}function Y(u){if(!u)return null;let p=br();return c.objects.find(h=>h.objectId===u&&!h.hidden&&p.has(h.objectId))??null}function me(u){let p=Y(u);return p?{objectId:p.objectId,object:p.object,renderObject:p,label:c.labels.find(h=>h.objectId===p.objectId&&!h.hidden)??null,group:c.groups.find(h=>h.renderId===p.groupId)??null,semanticGroups:c.semanticGroups.filter(h=>p.semanticGroupIds.includes(h.id)),orbit:c.orbitVisuals.find(h=>h.objectId===p.objectId&&!h.hidden)??null,relatedOrbits:c.orbitVisuals.filter(h=>!h.hidden&&(h.objectId===p.objectId||p.ancestorIds.includes(h.objectId)||p.childIds.includes(h.objectId))),relations:c.relations.filter(h=>!h.hidden&&(h.fromObjectId===p.objectId||h.toObjectId===p.objectId)),parent:Y(p.parentId),children:p.childIds.map(h=>Y(h)).filter(Boolean),ancestors:p.ancestorIds.map(h=>Y(h)).filter(Boolean),focusPath:yr(p.objectId)}:null}function hr(){for(let u of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))u.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");gr(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),gr(P,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function gr(u,p){let h=me(u);if(!h)return;let E=new Set([h.objectId,...h.renderObject.childIds,...h.renderObject.ancestorIds]);for(let D of E)for(let L of e.querySelectorAll(`[data-object-id="${it(D)}"]`))L.classList.add(p.objectClass);for(let D of h.ancestors)for(let L of e.querySelectorAll(`[data-object-id="${it(D.objectId)}"]`))L.classList.add(p.ancestorClass);for(let D of h.relatedOrbits)for(let L of e.querySelectorAll(`[data-orbit-object-id="${it(D.objectId)}"]`))L.classList.add(p.orbitClass)}function st(u,p){if(!w)return{x:c.width/2,y:c.height/2};let h=w.getBoundingClientRect();return!h.width||!h.height?{x:c.width/2,y:c.height/2}:{x:(u-h.left)/h.width*c.width,y:(p-h.top)/h.height*c.height}}function Dn(u,p){return Pe(c,f,st(u,p))}function br(){return dt(c,i.filter??null)}function Yt(){let u=br();return c.objects.filter(p=>!p.hidden&&u.has(p.objectId))}function yr(u){let p=c.objects.find(h=>h.objectId===u&&!h.hidden);return p?[...p.ancestorIds,p.objectId].map(h=>Y(h)).filter(Boolean):[]}function Ht(u){return c.viewpoints.find(p=>p.id===u)??null}function Fn(u){let p=kn(u.rotationDeg),h=u.scale!==null&&u.scale!==void 0?ot(u.scale,n.minScale,n.maxScale):null,E=u.objectId&&c.objects.find(L=>L.objectId===u.objectId&&!L.hidden);if(E)return wr({x:E.x,y:E.y},h??Math.max(1.8,be.scale),p,u.selectedObjectId??E.objectId);let D=je(c,{...be,rotationDeg:p},n);return h===null?{...D,rotationDeg:p,selectedObjectId:u.selectedObjectId??null}:wr({x:c.contentBounds.centerX,y:c.contentBounds.centerY},h,p,u.selectedObjectId??null)}function wr(u,p,h,E){let D={x:c.width/2,y:c.height/2},L=ce(u,D,h);return{scale:p,rotationDeg:h,translateX:D.x-(D.x+(L.x-D.x)*p),translateY:D.y-(D.y+(L.y-D.y)*p),selectedObjectId:E}}function qt(u,p,h){i={...i,filter:K(u)},h&&(W=null),ee(!1)}function Pn(){t.onFilterChange?.(i.filter??null,Yt())}function Gt(){t.onViewpointChange?.(Ht(W))}function Ae(){t.onAtlasStateChange?.(S.getAtlasState())}function Vn(){!o.minimap||!I||(I.innerHTML=gn(c,f,Yt()))}function ie(){if(o.tooltipMode==="disabled"||!v){lt(null);return}let u=En();if(!u){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),lt(null);return}let p=me(u.objectId);if(!p){v.hidden=!0,v.innerHTML="",v.removeAttribute("data-mode"),lt(null);return}let h=yn(p);U=u.objectId,v.hidden=!1,v.dataset.mode=u.mode,v.classList.toggle("is-pinned",u.mode==="pinned"),v.style.pointerEvents="auto",v.style.visibility="hidden",Cn(v,h,u.mode),Rn(v,p.renderObject),v.style.visibility="visible",lt(h)}function En(){return A&&Y(A)?{objectId:A,mode:"pinned"}:P&&Y(P)?{objectId:P,mode:"hover"}:null}function Cn(u,p,h){let E=t.tooltipRenderer?.(p,h);u.innerHTML="",typeof E=="string"?u.innerHTML=E:E instanceof HTMLElement?u.append(E):u.innerHTML=wn(p,h);let D=document.createElement("div");if(D.className="wo-tooltip-actions",h==="pinned"){let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="unpin",L.textContent="Unpin",D.append(L)}else{let L=document.createElement("button");L.type="button",L.className="wo-tooltip-action",L.dataset.tooltipAction="pin",L.dataset.objectId=p.objectId,L.textContent="Pin",D.append(L)}D.childElementCount>0&&u.append(D)}function Rn(u,p){if(!w)return;let h={x:p.anchorX??p.x,y:p.anchorY??p.y-Math.max(p.visualRadius,p.radius)},E=Bn(h),D=w.getBoundingClientRect(),L=e.getBoundingClientRect(),Be=D.left-L.left+E.x/Math.max(c.width,1)*D.width,ae=D.top-L.top+E.y/Math.max(c.height,1)*D.height,Te=Math.max(e.clientWidth-u.offsetWidth-12,12),Xt=Math.max(e.clientHeight-u.offsetHeight-12,12),Kt=ae>e.clientHeight*.48,Zt=ot(Be+18,12,Te),zn=ot(Kt?ae-u.offsetHeight-18:ae+18,12,Xt);u.style.left=`${Zt}px`,u.style.top=`${zn}px`}function Bn(u){let p={x:c.width/2,y:c.height/2},h=ce(u,p,f.rotationDeg);return{x:p.x+(h.x-p.x)*f.scale+f.translateX,y:p.y+(h.y-p.y)*f.scale+f.translateY}}function _n(u){let p=u.target?.closest("[data-tooltip-action]");if(p){switch(u.preventDefault(),u.stopPropagation(),p.dataset.tooltipAction){case"pin":A=p.dataset.objectId??U;break;case"unpin":A=null;break}ie()}}function lt(u){let p=C?.objectId!==u?.objectId||C?.description!==u?.description||C?.imageHref!==u?.imageHref;C=u,U=u?.objectId??null,p&&t.onTooltipChange?.(u)}}function Is(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 nt(e,t){switch(e.kind){case"scene":return e.value;case"document":return se(e.value,t);case"source":{let r=ge(e.value);return se(r.document,ks(r,t))}}}function xs(e){return{...e,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme}}function $n(e,t){return{...e,...t,filter:t.filter!==void 0?K(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function In(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.scaleModel!==void 0}function ks(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function xn(e,t,r){let{center:n,distance:o}=Sn(r);return{startState:{...t},startCenter:Pe(e,t,n),startViewportCenter:n,startDistance:o}}function Sn(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[r,n]=t;return{center:{x:(r.x+n.x)/2,y:(r.y+n.y)/2},distance:Math.hypot(n.x-r.x,n.y-r.y)}}function zt(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function Ss(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 ot(e,t,r){return Math.min(Math.max(e,t),r)}function kn(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function it(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function js(){if(typeof document>"u"||document.getElementById(vn))return;let e=document.createElement("style");e.id=vn,e.textContent=`
120
+ ${r}
121
+ ${o.length?`<p class="wo-tooltip-relations">${fe(o.join(" - "))}</p>`:""}
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("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}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=`
115
123
  .wo-viewer-tooltip-root {
116
124
  position: absolute;
117
125
  z-index: 12;
@@ -177,7 +185,7 @@
177
185
  padding: 6px 12px;
178
186
  font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
179
187
  }
180
- `,document.head.append(e)}var Os="[data-worldorbit-embed]";function fr(e){return encodeURIComponent(JSON.stringify(e))}function pr(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 jn(e,t,r={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:r.initialViewpointId,initialSelectionObjectId:r.initialSelectionObjectId,initialFilter:r.initialFilter??null,atlasState:r.atlasState??null,minimap:r.minimap}}}function On(e,t={}){let r={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},n=ne(e.scene,{theme:r.options?.theme,layers:r.options?.layers,filter:r.options?.initialFilter??null,selectedObjectId:r.options?.initialSelectionObjectId??null,subtitle:r.options?.subtitle,preset:r.options?.preset});return`<div class="${Nt(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Nt(r.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Nt(r.options?.initialViewpointId??"")}" data-worldorbit-payload="${Nt(fr(r))}">${n}</div>`}function An(e=document,t={}){let r=new Map,n=[...e.querySelectorAll(Os)];for(let o of n){let i=As(o),a=t.mode??i.mode,s=t.theme??i.options?.theme,l=t.layers??i.options?.layers,d=t.subtitle??i.options?.subtitle,c=t.preset??i.options?.preset??i.scene.renderPreset??void 0,f=t.viewer?.initialFilter??i.options?.initialFilter??null,w=t.viewer?.initialViewpointId??i.options?.initialViewpointId,b=t.viewer?.initialSelectionObjectId??i.options?.initialSelectionObjectId,I=t.viewer?.minimap??i.options?.minimap;if(a==="interactive"){let v=ye(o,{...t.viewer,scene:i.scene,width:t.width??i.scene.width,height:t.height??i.scene.height,padding:t.padding??i.scene.padding,preset:c,theme:s,layers:l,subtitle:d,initialFilter:f,initialViewpointId:w,initialSelectionObjectId:b,minimap:I});i.options?.atlasState&&v.setAtlasState(i.options.atlasState),r.set(o,v),t.onMount?.(v,o)}else o.innerHTML=ne(i.scene,{width:t.width??i.scene.width,height:t.height??i.scene.height,padding:t.padding??i.scene.padding,preset:c,theme:s,layers:l,filter:f,selectedObjectId:b??null,subtitle:d}),t.onMount?.(null,o);o.dataset.worldorbitMounted="true"}return{viewers:[...r.values()],destroy(){for(let[o,i]of r.entries())i.destroy(),o.removeAttribute("data-worldorbit-mounted");r.clear()}}}function As(e){let t=e.dataset.worldorbitPayload;if(!t)throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");return pr(t)}function Nt(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}var Tn="worldorbit-atlas-viewer-style";function Ut(e,t){if(typeof document>"u")throw new Error("Atlas viewer requires a browser environment.");Ms();let r={search:t.controls?.search??!0,typeFilter:t.controls?.typeFilter??!0,groupFilter:t.controls?.groupFilter??!0,viewpointSelect:t.controls?.viewpointSelect??!0,inspector:t.controls?.inspector??!0,bookmarks:t.controls?.bookmarks??!0};e.classList.add("wo-atlas-viewer"),e.innerHTML=Ts(r);let n=e.querySelector("[data-atlas-toolbar]"),o=e.querySelector("[data-atlas-search]"),i=e.querySelector("[data-atlas-type-filter]"),a=e.querySelector("[data-atlas-group-filter]"),s=e.querySelector("[data-atlas-viewpoint]"),l=e.querySelector("[data-atlas-bookmark]"),d=e.querySelector("[data-atlas-bookmarks]"),c=e.querySelector("[data-atlas-results]"),f=e.querySelector("[data-atlas-inspector]"),w=e.querySelector("[data-atlas-stage]");if(!w)throw new Error("Atlas viewer failed to initialize its stage container.");let b=K(t.initialFilter??null),I=t.initialQuery?.trim()??b?.query??"",v=t.initialObjectType??(b?.objectTypes?.length===1?b.objectTypes[0]:null),T=b?.groupIds?.[0]??null,y=[],$;$=ye(w,{...t,initialFilter:null,onSelectionChange(g){$&&V(),t.onSelectionChange?.(g)},onSelectionDetailsChange(g){$&&V(),t.onSelectionDetailsChange?.(g)},onFilterChange(g,O){$&&(A(g),G(),V()),t.onFilterChange?.(g,O)},onViewpointChange(g){$&&(W(),V()),t.onViewpointChange?.(g)},onAtlasStateChange(g){$&&V(),t.onAtlasStateChange?.(g)},onViewChange(g){$&&V(),t.onViewChange?.(g)}}),j(),U(),C(),A($.getFilter()),Q(),G(),V(),o?.addEventListener("input",()=>{I=o.value.trim(),j()}),i?.addEventListener("change",()=>{v=i.value||null,j()}),a?.addEventListener("change",()=>{T=a.value||null,j()}),s?.addEventListener("change",()=>{let g=x();if(!s.value){g.resetView(),j();return}g.goToViewpoint(s.value),V()}),l?.addEventListener("click",()=>{let g=x(),O=g.getActiveViewpoint()?.label??g.getSelectionDetails()?.objectId??`Bookmark ${y.length+1}`;y=[...y,g.captureBookmark(O,O)],Q(),V()}),d?.addEventListener("click",g=>{let O=g.target?.closest("[data-bookmark-id]");if(!O)return;let H=y.find(k=>k.id===O.dataset.bookmarkId);if(!H)return;let we=x();we.applyBookmark(H),A(we.getFilter()),G(),V()}),c?.addEventListener("click",g=>{let O=g.target?.closest("[data-object-id]");O&&(x().focusObject(O.dataset.objectId??""),V())});function x(){if(!$)throw new Error("Atlas viewer is not initialized.");return $}return{element:e,get viewer(){return x()},getViewer(){return x()},setSource(g){x().setSource(g),F()},setDocument(g){x().setDocument(g),F()},setScene(g){x().setScene(g),F()},getAtlasState(){return x().getAtlasState()},setAtlasState(g){let O=x();O.setAtlasState(g),A(O.getFilter()),G(),V()},getInspectorSnapshot(){return pe()},getSearchQuery(){return I},setSearchQuery(g){I=g.trim(),o&&(o.value=I),j()},getObjectTypeFilter(){return v},setObjectTypeFilter(g){v=g,i&&(i.value=g??""),j()},listSearchResults(g=6){return x().search(I,g)},listBookmarks(){return y.map(Mn)},captureBookmark(g,O){let H=x().captureBookmark(g,O);return y=[...y,H],Q(),V(),Mn(H)},applyBookmark(g){let O=x(),H=O.applyBookmark(g);return H&&(A(O.getFilter()),G(),V()),H},goToViewpoint(g){let O=x().goToViewpoint(g);return O&&V(),O},exportSvg(){return x().exportSvg()},destroy(){x().destroy(),e.innerHTML="",e.classList.remove("wo-atlas-viewer")}};function F(){U(),C(),j(),Q(),G(),V()}function j(){x().setFilter(P()),U(),G(),V()}function P(){return K({query:I||void 0,objectTypes:v?[v]:void 0,tags:b?.tags,groupIds:T?[T]:b?.groupIds,includeAncestors:b?.includeAncestors??!0})}function A(g){I=g?.query?.trim()??"",v=g?.objectTypes?.length===1?g.objectTypes[0]:null,T=g?.groupIds?.length===1?g.groupIds[0]:null,o&&document.activeElement!==o&&(o.value=I),i&&(i.value=v??""),a&&(a.value=T??"")}function U(){if(!s)return;let g=x(),O=g.getActiveViewpoint()?.id??"";s.innerHTML=['<option value="">Scene default</option>',...g.listViewpoints().map(H=>`<option value="${fe(H.id)}">${fe(H.label)}</option>`)].join(""),s.value=O}function C(){if(!a)return;let g=x();a.innerHTML=['<option value="">All groups</option>',...g.getScene().semanticGroups.map(O=>`<option value="${fe(O.id)}">${fe(O.label)}</option>`)].join(""),a.value=T??""}function W(){s&&(s.value=x().getActiveViewpoint()?.id??"")}function G(){if(!c)return;let g=x().search(I,6);c.innerHTML=g.map(O=>`<button type="button" class="wo-atlas-pill" data-object-id="${fe(O.objectId)}">${fe(O.objectId)} - ${fe(O.type)}</button>`).join("")}function V(){let g=pe();f&&(f.textContent=JSON.stringify(g,null,2)),t.onInspectorChange?.(g)}function pe(){let g=x();return{selection:g.getSelectionDetails(),activeViewpoint:g.getActiveViewpoint(),filter:g.getFilter(),atlasState:g.getAtlasState(),visibleObjectIds:g.getVisibleObjects().map(O=>O.objectId),scene:{title:g.getScene().title,projection:g.getScene().projection,renderPreset:g.getScene().renderPreset,groupCount:g.getScene().groups.length,semanticGroupCount:g.getScene().semanticGroups.length,relationCount:g.getScene().relations.length,viewpointCount:g.getScene().viewpoints.length}}}function Q(){d&&(d.innerHTML=y.map(g=>`<button type="button" class="wo-atlas-pill" data-bookmark-id="${fe(g.id)}">${fe(g.label)}</button>`).join(""))}}function Ts(e){let t=[e.search?`<label class="wo-atlas-field">
188
+ `,document.head.append(e)}var Xs="[data-worldorbit-embed]";function mn(e){return encodeURIComponent(JSON.stringify(e))}function hn(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 Fr(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 Pr(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=ae(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="${Ut(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${Ut(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${Ut(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${Ut(mn(n))}">${r}</div>`}function Vr(e=document,t={}){let n=new Map,r=[...e.querySelectorAll(Xs)];for(let o of r){let i=Ks(o),a=t.mode??i.mode,s=t.theme??i.options?.theme,l=t.layers??i.options?.layers,c=t.subtitle??i.options?.subtitle,u=t.preset??i.options?.preset??i.scene.renderPreset??void 0,f=t.viewer?.initialFilter??i.options?.initialFilter??null,b=t.viewer?.initialViewpointId??i.options?.initialViewpointId,w=t.viewer?.initialSelectionObjectId??i.options?.initialSelectionObjectId,$=t.viewer?.minimap??i.options?.minimap;if(a==="interactive"){let v=Ie(o,{...t.viewer,scene:i.scene,width:t.width??i.scene.width,height:t.height??i.scene.height,padding:t.padding??i.scene.padding,preset:u,theme:s,layers:l,subtitle:c,initialFilter:f,initialViewpointId:b,initialSelectionObjectId:w,minimap:$});i.options?.atlasState&&v.setAtlasState(i.options.atlasState),n.set(o,v),t.onMount?.(v,o)}else o.innerHTML=ae(i.scene,{width:t.width??i.scene.width,height:t.height??i.scene.height,padding:t.padding??i.scene.padding,preset:u,theme:s,layers:l,filter:f,selectedObjectId:w??null,subtitle:c}),t.onMount?.(null,o);o.dataset.worldorbitMounted="true"}return{viewers:[...n.values()],destroy(){for(let[o,i]of n.entries())i.destroy(),o.removeAttribute("data-worldorbit-mounted");n.clear()}}}function Ks(e){let t=e.dataset.worldorbitPayload;if(!t)throw new Error("WorldOrbit embed is missing data-worldorbit-payload.");return hn(t)}function Ut(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}var Cr="worldorbit-atlas-viewer-style";function Wt(e,t){if(typeof document>"u")throw new Error("Atlas viewer requires a browser environment.");Js();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=Zs(n);let r=e.querySelector("[data-atlas-toolbar]"),o=e.querySelector("[data-atlas-search]"),i=e.querySelector("[data-atlas-type-filter]"),a=e.querySelector("[data-atlas-group-filter]"),s=e.querySelector("[data-atlas-viewpoint]"),l=e.querySelector("[data-atlas-bookmark]"),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),$=t.initialQuery?.trim()??w?.query??"",v=t.initialObjectType??(w?.objectTypes?.length===1?w.objectTypes[0]:null),j=w?.groupIds?.[0]??null,A=[],h;h=Ie(b,{...t,initialFilter:null,onSelectionChange(y){h&&M(),t.onSelectionChange?.(y)},onSelectionDetailsChange(y){h&&M(),t.onSelectionDetailsChange?.(y)},onFilterChange(y,k){h&&(T(y),R(),M()),t.onFilterChange?.(y,k)},onViewpointChange(y){h&&(W(),M()),t.onViewpointChange?.(y)},onAtlasStateChange(y){h&&M(),t.onAtlasStateChange?.(y)},onViewChange(y){h&&M(),t.onViewChange?.(y)}}),D(),H(),F(),T(h.getFilter()),ee(),R(),M(),o?.addEventListener("input",()=>{$=o.value.trim(),D()}),i?.addEventListener("change",()=>{v=i.value||null,D()}),a?.addEventListener("change",()=>{j=a.value||null,D()}),s?.addEventListener("change",()=>{let y=I();if(!s.value){y.resetView(),D();return}y.goToViewpoint(s.value),M()}),l?.addEventListener("click",()=>{let y=I(),k=y.getActiveViewpoint()?.label??y.getSelectionDetails()?.objectId??`Bookmark ${A.length+1}`;A=[...A,y.captureBookmark(k,k)],ee(),M()}),c?.addEventListener("click",y=>{let k=y.target?.closest("[data-bookmark-id]");if(!k)return;let X=A.find(Ae=>Ae.id===k.dataset.bookmarkId);if(!X)return;let xe=I();xe.applyBookmark(X),T(xe.getFilter()),R(),M()}),u?.addEventListener("click",y=>{let k=y.target?.closest("[data-object-id]");k&&(I().focusObject(k.dataset.objectId??""),M())});function I(){if(!h)throw new Error("Atlas viewer is not initialized.");return h}return{element:e,get viewer(){return I()},getViewer(){return I()},setSource(y){I().setSource(y),C()},setDocument(y){I().setDocument(y),C()},setScene(y){I().setScene(y),C()},getAtlasState(){return I().getAtlasState()},setAtlasState(y){let k=I();k.setAtlasState(y),T(k.getFilter()),R(),M()},getInspectorSnapshot(){return Z()},getSearchQuery(){return $},setSearchQuery(y){$=y.trim(),o&&(o.value=$),D()},getObjectTypeFilter(){return v},setObjectTypeFilter(y){v=y,i&&(i.value=y??""),D()},listSearchResults(y=6){return I().search($,y)},listBookmarks(){return A.map(Rr)},captureBookmark(y,k){let X=I().captureBookmark(y,k);return A=[...A,X],ee(),M(),Rr(X)},applyBookmark(y){let k=I(),X=k.applyBookmark(y);return X&&(T(k.getFilter()),R(),M()),X},goToViewpoint(y){let k=I().goToViewpoint(y);return k&&M(),k},exportSvg(){return I().exportSvg()},destroy(){I().destroy(),e.innerHTML="",e.classList.remove("wo-atlas-viewer")}};function C(){H(),F(),D(),ee(),R(),M()}function D(){I().setFilter(z()),H(),R(),M()}function z(){return te({query:$||void 0,objectTypes:v?[v]:void 0,tags:w?.tags,groupIds:j?[j]:w?.groupIds,includeAncestors:w?.includeAncestors??!0})}function T(y){$=y?.query?.trim()??"",v=y?.objectTypes?.length===1?y.objectTypes[0]:null,j=y?.groupIds?.length===1?y.groupIds[0]:null,o&&document.activeElement!==o&&(o.value=$),i&&(i.value=v??""),a&&(a.value=j??"")}function H(){if(!s)return;let y=I(),k=y.getActiveViewpoint()?.id??"";s.innerHTML=['<option value="">Scene default</option>',...y.listViewpoints().map(X=>`<option value="${me(X.id)}">${me(X.label)}</option>`)].join(""),s.value=k}function F(){if(!a)return;let y=I();a.innerHTML=['<option value="">All groups</option>',...y.getScene().semanticGroups.map(k=>`<option value="${me(k.id)}">${me(k.label)}</option>`)].join(""),a.value=j??""}function W(){s&&(s.value=I().getActiveViewpoint()?.id??"")}function R(){if(!u)return;let y=I().search($,6);u.innerHTML=y.map(k=>`<button type="button" class="wo-atlas-pill" data-object-id="${me(k.objectId)}">${me(k.objectId)} - ${me(k.type)}</button>`).join("")}function M(){let y=Z();f&&(f.textContent=JSON.stringify(y,null,2)),t.onInspectorChange?.(y)}function Z(){let y=I();return{selection:y.getSelectionDetails(),activeViewpoint:y.getActiveViewpoint(),filter:y.getFilter(),atlasState:y.getAtlasState(),visibleObjectIds:y.getVisibleObjects().map(k=>k.objectId),scene:{title:y.getScene().title,projection:y.getScene().projection,renderPreset:y.getScene().renderPreset,groupCount:y.getScene().groups.length,semanticGroupCount:y.getScene().semanticGroups.length,relationCount:y.getScene().relations.length,eventCount:y.getScene().events.length,viewpointCount:y.getScene().viewpoints.length}}}function ee(){c&&(c.innerHTML=A.map(y=>`<button type="button" class="wo-atlas-pill" data-bookmark-id="${me(y.id)}">${me(y.label)}</button>`).join(""))}}function Zs(e){let t=[e.search?`<label class="wo-atlas-field">
181
189
  <span>Search</span>
182
190
  <input data-atlas-search type="text" placeholder="Search objects, tags, or types" />
183
191
  </label>`:"",e.typeFilter?`<label class="wo-atlas-field">
@@ -214,7 +222,7 @@
214
222
  <div class="wo-atlas-results" data-atlas-results></div>
215
223
  ${e.bookmarks?'<div class="wo-atlas-bookmarks" data-atlas-bookmarks></div>':""}
216
224
  </div>
217
- </section>`}function Ms(){if(document.getElementById(Tn))return;let e=document.createElement("style");e.id=Tn,e.textContent=`
225
+ </section>`}function Js(){if(document.getElementById(Cr))return;let e=document.createElement("style");e.id=Cr,e.textContent=`
218
226
  .wo-atlas-shell { display: grid; gap: 16px; min-width: 0; }
219
227
  .wo-atlas-toolbar { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; }
220
228
  .wo-atlas-workspace { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); }
@@ -248,4 +256,4 @@
248
256
  .wo-atlas-workspace { grid-template-columns: 1fr; }
249
257
  .wo-atlas-inspector { min-height: 220px; }
250
258
  }
251
- `,document.head.append(e)}function Mn(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 fe(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Ln(e="worldorbit-viewer"){if(typeof window>"u"||typeof customElements>"u"||customElements.get(e))return;class t extends HTMLElement{static get observedAttributes(){return["source","mode","theme"]}viewer=null;connectedCallback(){this.renderCurrent()}disconnectedCallback(){this.viewer?.destroy(),this.viewer=null}attributeChangedCallback(){this.isConnected&&this.renderCurrent()}renderCurrent(){this.viewer?.destroy(),this.viewer=null;let n=this.getAttribute("source")??this.textContent??"",o=this.getAttribute("mode")??"interactive";if(!n.trim()){this.innerHTML="";return}let i=Ls(n),a=se(i),s=this.getAttribute("theme")??void 0;if(o==="static"){this.innerHTML=ne(a,{theme:s});return}if(o==="atlas"){this.viewer=Ut(this,{scene:a,theme:s});return}this.viewer=ye(this,{scene:a,theme:s})}}customElements.define(e,t)}function Ls(e){return ge(e).document}return qn(Ds);})();
259
+ `,document.head.append(e)}function Rr(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 me(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function Br(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??"",o=this.getAttribute("mode")??"interactive";if(!r.trim()){this.innerHTML="";return}let i=Qs(r),a=ue(i),s=this.getAttribute("theme")??void 0;if(o==="static"){this.innerHTML=ae(a,{theme:s});return}if(o==="atlas"){this.viewer=Wt(this,{scene:a,theme:s});return}this.viewer=Ie(this,{scene:a,theme:s})}}customElements.define(e,t)}function Qs(e){return ve(e).document}return to(el);})();