worldorbit 3.2.1 → 3.2.2

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 (81) hide show
  1. package/dist/browser/obsidian-plugin/dist/diagnostics.d.ts +3 -0
  2. package/dist/browser/obsidian-plugin/dist/diagnostics.js +23 -0
  3. package/dist/browser/obsidian-plugin/dist/examples.d.ts +3 -0
  4. package/dist/browser/obsidian-plugin/dist/examples.js +77 -0
  5. package/dist/browser/obsidian-plugin/dist/index.d.ts +9 -0
  6. package/dist/browser/obsidian-plugin/dist/index.js +8 -0
  7. package/dist/browser/obsidian-plugin/dist/main.d.ts +2 -0
  8. package/dist/browser/obsidian-plugin/dist/main.js +2 -0
  9. package/dist/browser/obsidian-plugin/dist/navigation.d.ts +6 -0
  10. package/dist/browser/obsidian-plugin/dist/navigation.js +44 -0
  11. package/dist/browser/obsidian-plugin/dist/plugin.d.ts +8 -0
  12. package/dist/browser/obsidian-plugin/dist/plugin.js +508 -0
  13. package/dist/browser/obsidian-plugin/dist/positions.d.ts +7 -0
  14. package/dist/browser/obsidian-plugin/dist/positions.js +14 -0
  15. package/dist/browser/obsidian-plugin/dist/settings.d.ts +2 -0
  16. package/dist/browser/obsidian-plugin/dist/settings.js +5 -0
  17. package/dist/browser/obsidian-plugin/dist/theme.d.ts +2 -0
  18. package/dist/browser/obsidian-plugin/dist/theme.js +31 -0
  19. package/dist/browser/obsidian-plugin/dist/types.d.ts +42 -0
  20. package/dist/browser/obsidian-plugin/dist/types.js +1 -0
  21. package/dist/browser/obsidian-plugin/dist/viewer-host.d.ts +14 -0
  22. package/dist/browser/obsidian-plugin/dist/viewer-host.js +110 -0
  23. package/dist/browser/viewer/dist/index.d.ts +1 -0
  24. package/dist/browser/viewer/dist/index.js +1 -0
  25. package/dist/browser/viewer/dist/interactive-2d.d.ts +21 -0
  26. package/dist/browser/viewer/dist/interactive-2d.js +201 -0
  27. package/dist/browser/viewer/dist/render.d.ts +1 -1
  28. package/dist/browser/viewer/dist/render.js +2 -1
  29. package/dist/browser/viewer/dist/viewer-state.d.ts +1 -1
  30. package/dist/browser/viewer/dist/viewer-state.js +1 -1
  31. package/dist/obsidian-plugin/LICENSE +21 -0
  32. package/dist/obsidian-plugin/README.md +124 -0
  33. package/dist/obsidian-plugin/main.js +108 -0
  34. package/dist/obsidian-plugin/manifest.json +9 -0
  35. package/dist/obsidian-plugin/obsidian_scsh_1.png +0 -0
  36. package/dist/obsidian-plugin/obsidian_scsh_2.png +0 -0
  37. package/dist/obsidian-plugin/styles.css +164 -0
  38. package/dist/unpkg/obsidian-plugin/dist/diagnostics.d.ts +3 -0
  39. package/dist/unpkg/obsidian-plugin/dist/diagnostics.js +23 -0
  40. package/dist/unpkg/obsidian-plugin/dist/examples.d.ts +3 -0
  41. package/dist/unpkg/obsidian-plugin/dist/examples.js +77 -0
  42. package/dist/unpkg/obsidian-plugin/dist/index.d.ts +9 -0
  43. package/dist/unpkg/obsidian-plugin/dist/index.js +8 -0
  44. package/dist/unpkg/obsidian-plugin/dist/main.d.ts +2 -0
  45. package/dist/unpkg/obsidian-plugin/dist/main.js +2 -0
  46. package/dist/unpkg/obsidian-plugin/dist/navigation.d.ts +6 -0
  47. package/dist/unpkg/obsidian-plugin/dist/navigation.js +44 -0
  48. package/dist/unpkg/obsidian-plugin/dist/plugin.d.ts +8 -0
  49. package/dist/unpkg/obsidian-plugin/dist/plugin.js +508 -0
  50. package/dist/unpkg/obsidian-plugin/dist/positions.d.ts +7 -0
  51. package/dist/unpkg/obsidian-plugin/dist/positions.js +14 -0
  52. package/dist/unpkg/obsidian-plugin/dist/settings.d.ts +2 -0
  53. package/dist/unpkg/obsidian-plugin/dist/settings.js +5 -0
  54. package/dist/unpkg/obsidian-plugin/dist/theme.d.ts +2 -0
  55. package/dist/unpkg/obsidian-plugin/dist/theme.js +31 -0
  56. package/dist/unpkg/obsidian-plugin/dist/types.d.ts +42 -0
  57. package/dist/unpkg/obsidian-plugin/dist/types.js +1 -0
  58. package/dist/unpkg/obsidian-plugin/dist/viewer-host.d.ts +14 -0
  59. package/dist/unpkg/obsidian-plugin/dist/viewer-host.js +110 -0
  60. package/dist/unpkg/viewer/dist/index.d.ts +1 -0
  61. package/dist/unpkg/viewer/dist/index.js +1 -0
  62. package/dist/unpkg/viewer/dist/interactive-2d.d.ts +21 -0
  63. package/dist/unpkg/viewer/dist/interactive-2d.js +201 -0
  64. package/dist/unpkg/viewer/dist/render.d.ts +1 -1
  65. package/dist/unpkg/viewer/dist/render.js +2 -1
  66. package/dist/unpkg/viewer/dist/viewer-state.d.ts +1 -1
  67. package/dist/unpkg/viewer/dist/viewer-state.js +1 -1
  68. package/dist/unpkg/worldorbit-editor.min.js +56 -56
  69. package/dist/unpkg/worldorbit-markdown.min.js +15 -15
  70. package/dist/unpkg/worldorbit-viewer.min.js +207 -207
  71. package/dist/unpkg/worldorbit.js +200 -0
  72. package/dist/unpkg/worldorbit.min.js +210 -210
  73. package/package.json +18 -1
  74. package/packages/viewer/dist/index.d.ts +1 -0
  75. package/packages/viewer/dist/index.js +1 -0
  76. package/packages/viewer/dist/interactive-2d.d.ts +21 -0
  77. package/packages/viewer/dist/interactive-2d.js +201 -0
  78. package/packages/viewer/dist/render.d.ts +1 -1
  79. package/packages/viewer/dist/render.js +2 -1
  80. package/packages/viewer/dist/viewer-state.d.ts +1 -1
  81. package/packages/viewer/dist/viewer-state.js +1 -1
@@ -0,0 +1,108 @@
1
+ "use strict";var tt=Object.defineProperty;var tr=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var rr=Object.prototype.hasOwnProperty;var ir=(e,t)=>{for(var n in t)tt(e,n,{get:t[n],enumerable:!0})},or=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of nr(t))!rr.call(e,i)&&i!==n&&tt(e,i,{get:()=>t[i],enumerable:!(r=tr(t,i))||r.enumerable});return e};var ar=e=>or(tt({},"__esModule",{value:!0}),e);var Za={};ir(Za,{default:()=>Ka});module.exports=ar(Za);var E=require("obsidian");var f=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var ue=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],_=ue.filter(e=>e!=="system"),sr=["star","planet","moon","asteroid","comet","structure","phenomenon"],At=["structure","phenomenon"],K=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],lr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function I(e,t){return{key:e,...t}}var Ee=new Set(ue),Dt=new Map([I("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:K}),I("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"distance"}),I("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"distance"}),I("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:K}),I("period",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"duration"}),I("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),I("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),I("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),I("at",{kind:"string",placement:!0,arity:"single",objectTypes:At}),I("surface",{kind:"string",placement:!0,arity:"single",objectTypes:At}),I("free",{kind:"string",placement:!0,arity:"single",objectTypes:lr}),I("kind",{kind:"string",placement:!1,arity:"single",objectTypes:_}),I("class",{kind:"string",placement:!1,arity:"single",objectTypes:_}),I("culture",{kind:"string",placement:!1,arity:"single",objectTypes:_}),I("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ue}),I("color",{kind:"string",placement:!1,arity:"single",objectTypes:ue}),I("image",{kind:"string",placement:!1,arity:"single",objectTypes:sr}),I("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ue}),I("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:_,unitFamily:"radius"}),I("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:_,unitFamily:"mass"}),I("density",{kind:"unit",placement:!1,arity:"single",objectTypes:_,unitFamily:"generic"}),I("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:_,unitFamily:"generic"}),I("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:_,unitFamily:"generic"}),I("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:_}),I("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),I("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("on",{kind:"string",placement:!1,arity:"single",objectTypes:_}),I("source",{kind:"string",placement:!1,arity:"single",objectTypes:_}),I("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:_,unitFamily:"duration"})].map(e=>[e.key,e])),cr=new Set(Dt.keys());function R(e){return Dt.get(e)}function Ft(e){return cr.has(e)}function Rt(e,t){return e.objectTypes.includes(t)}function Me(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}}var Ct=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,ur=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),dr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function nt(e){let t=null,n=[],r=e.theme?fr(e.theme):null;for(let i of e.objects){let o=mr(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],objects:n}}function fr(e){let t={};for(let n of e.blocks){let r=Vt(n.fields);t[n.target]=pr(r)}return{preset:e.preset,styles:t}}function pr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function mr(e){let t=[...e.inlineFields,...e.blockFields];hr(e.objectType,t);let n=Vt(t),r=gr(e.objectType,n),i=br(n),o=vr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function hr(e,t){for(let n of t){let r=R(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Rt(r,e))throw f.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Vt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function gr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Pe(t,"orbit"),distance:ie(t,"distance"),semiMajor:ie(t,"semiMajor"),eccentricity:xr(t,"eccentricity"),period:ie(t,"period"),angle:ie(t,"angle"),inclination:ie(t,"inclination"),phase:ie(t,"phase")};if(r){let l=Te(t,"at"),s=Pe(t,"at");return{mode:"at",target:s,reference:$r(s,l.location)}}if(i)return{mode:"surface",target:Pe(t,"surface")};if(o){let l=Pe(t,"free"),s=Ir(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function br(e){let t={};for(let[n,r]of e.entries()){let i=R(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=kr(r);break;case"number":t[n]=zt(oe(r),n,r.location);break;case"unit":t[n]=_t(oe(r),r.location,n);break;case"string":t[n]=yr(n,r);break}}return t}function yr(e,t){let n=t.values.join(" ").trim();return e==="image"&&wr(n,t.location),n}function wr(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(dr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function vr(e){let t={};for(let n of e){if(n.key in t)throw f.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function $r(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function _t(e,t,n){let r=e.match(Ct);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=R(n);if(o?.unitFamily&&!Me(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Ir(e){let t=e.match(Ct);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ie(e,t){if(!e.has(t))return;let n=Te(e,t);return _t(oe(n),n.location,t)}function xr(e,t){if(!e.has(t))return;let n=Te(e,t);return zt(oe(n),t,n.location)}function zt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function kr(e){let t=oe(e).toLowerCase(),n=ur.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Te(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function Pe(e,t){return oe(Te(e,t))}function oe(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}function Le(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let d=e[u],m=r+u+1;if(l&&d==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(d==='"'){l?l=!1:(o===null&&(o=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(d)){c();continue}o===null&&(o=m),i+=d}if(l)throw new f("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Ae(e){return e.match(/^\s*/)?.[0].length??0}function rt(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,l=null,s=null,c=null,u=null;for(let d=0;d<t.length;d++){let m=t[d],h=d+1;if(!m.trim())continue;let b=Ae(m),g=Le(m.slice(b),{line:h,columnOffset:b});if(g.length!==0){if(b===0){if(o=!1,a=!1,l=null,s=null,c=null,u=null,g.length>=1&&g[0].value==="theme"){a=!0,s=0,r={type:"theme",preset:g.length>=2?g[1].value:null,blocks:[],location:{line:h,column:g[0].column}};continue}let $=Sr(g,h);n.push($),i=$;continue}if(a){if(g.length>=2&&g[0].value==="preset"&&(!c||b<=c)){r&&(r.preset=g[1].value);continue}u&&c!==null&&b>c?u.fields.push(Er(g,h)):(c=b,u={type:"theme-block",target:g[0].value,fields:[],location:{line:h,column:g[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",h,b+1);if(g.length===1&&g[0].value==="info"){o=!0,l=b;continue}o&&b<=(l??0)&&(o=!1),o?i.infoEntries.push(Mr(g,h)):i.blockFields.push(jr(g,h))}}return{type:"document",theme:r,objects:n}}function Sr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Ee.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Or(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Or(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=R(i.value);if(!o)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Ft(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function jr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!R(e[0].value))throw new f(`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 Er(e,t){if(e.length<2)throw new f("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Mr(e,t){if(e.length<2)throw new f("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 Pr=new Set(["star","planet","moon","asteroid","comet"]);function it(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`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 f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Pr.has(i.type))throw new f(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Tr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Lr(r,r.placement.reference,t))}}function Tr(e,t,n){if(!n.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Lr(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function ae(e,t,n=`${t}.failed`){return e instanceof f?{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 de=1495978707e-1,Ar=6371,Dr=71492,Fr=695700,Rr=63241.077,Cr=206264.806,Vr=206264806,Gt=.68,_r=.2,qt=28;function Be(e,t={}){let n=Nr(t),r=n.width,i=n.height,o=n.padding,a=Br(e),l=Ur(e,t.projection),s=ut(t.camera??null),c=ct(l,s),u=Xr(a),d=Gr(a,t.scaleModel,t.bodyScaleMode),m=e.system?.id??null,h=t.activeEventId??null,b=zr(e.objects,e.events??[],h),g=Kr(b,r,i,o,u,d),$=new Map(b.map(y=>[y.id,y])),P=Ai(b,$),p=new Map,x=[],T=[],C=[],L=[],B=[],w=new Map,j=new Map;for(let y of b){let V=y.placement;if(!V){C.push(y);continue}if(V.mode==="orbit"){Ut(j,V.target,y);continue}if(V.mode==="surface"){Ut(w,V.target,y);continue}if(V.mode==="at"){B.push(y);continue}L.push(y)}let k=L.length>0?r*.42:r/2,Y=i/2,N={orbitChildren:j,surfaceChildren:w,objectMap:$,spacingFactor:u,projection:c,scaleModel:d,sceneMetricScale:g},H=C.find(y=>y.type==="star")??C[0]??null;H&&at(H,k,Y,0,p,x,T,N);let q=C.filter(y=>y.id!==H?.id);if(q.length>0){let y=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;q.forEach((V,A)=>{let et=ge(A,q.length,-Math.PI/2),ne=be(et,y,c,1);at(V,k+ne.x,Y+ne.y,0,p,x,T,N)})}L.forEach((y,V)=>{let A=r-o-140-_i(y.placement?.mode==="free"?y.placement.distance:void 0,d,g),et=Math.max(76,(i-o*2-180)/Math.max(1,L.length)*u)*d.freePlacementMultiplier,ne=o+92+V*et;p.set(y.id,{object:y,x:A,y:ne,radius:Ve(y,0,d,g),sortKey:ze(A,ne,0)}),T.push({object:y,groupId:P.groupIds.get(y.id)??null,x1:A-60,y1:ne,x2:A-18,y2:ne,mode:"free"}),Re(y,p,x,T,N,1)}),B.forEach((y,V)=>{if(p.has(y.id)||!y.placement||y.placement.mode!=="at")return;let A=Ti(y.placement.reference,p,$,V,B.length,r,i,o,N);p.set(y.id,{object:y,x:A.x,y:A.y,radius:Ve(y,2,d,g),sortKey:ze(A.x,A.y,2),anchorX:A.anchorX,anchorY:A.anchorY}),A.anchorX!==void 0&&A.anchorY!==void 0&&T.push({object:y,groupId:P.groupIds.get(y.id)??null,x1:A.anchorX,y1:A.anchorY,x2:A.x,y2:A.y,mode:"at"}),Re(y,p,x,T,N,2)});let X=[...p.values()].map(y=>Zr(y,d,P)),Se=x.map(y=>Jr(y,P.groupIds.get(y.object.id)??null)),Oe=T.map(y=>Qr(y)),je=ei(X,r,i,d.labelMultiplier),Tt=li(e,X),Lt=ci(e.events??[],X,h),Kn=oi(Se,Tt,Lt,Oe,X,je),Zn=ai(X,Se,Oe,je,P,d.labelMultiplier),Jn=si(e,X),Qn=ui(e,l,n.preset,P,$),er=Ii(r,i,X,Se,Oe,je,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Hr(l,c,a,s),systemId:m,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:er,layers:Kn,groups:Zn,semanticGroups:Jn,viewpoints:Qn,events:Lt,activeEventId:h,objects:X,orbitVisuals:Se,relations:Tt,leaders:Oe,labels:je}}function lt(e,t,n){let r=Ne(n),i=Math.cos(r),o=Math.sin(r),a=e.x-t.x,l=e.y-t.y;return{x:t.x+a*i-l*o,y:t.y+a*o+l*i}}function zr(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function Br(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 Nr(e){let t=Wr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Wr(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 Ur(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return Zt(n)??"topdown"}function ct(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function ut(e){if(!e)return null;let t={azimuth:ot(e.azimuth),elevation:ot(e.elevation),roll:ot(e.roll),distance:Yr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ot(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Yr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Hr(e,t,n,r){let i=[`${Yt(e)} view`,`${Yt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function Gr(e,t,n){return{...qr(e),...n?{bodyScaleMode:n}:{},...t}}function qr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function Xr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Kr(e,t,n,r,i,o){let a=[],l=[];for(let h of e){let b=Bi(h);b!==null&&b>0&&l.push(b);let g=h.placement;if(g){if(g.mode==="orbit"){let $=Z(g.semiMajor??g.distance??null);$!==null&&$>0&&a.push($);continue}if(g.mode==="free"){let $=Z(g.distance??null);$!==null&&$>0&&a.push($)}}}let s=Math.max(...a,0),c=Math.max(...l,0),u=Math.max(s,c*6,0),d=u+Math.max(Math.sqrt(u),c*2,s>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*o.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function Zr(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:se(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:a,visualRadius:Vi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ni(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Jr(e,t){return{renderId:`${se(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 Qr(e){return{renderId:`${se(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 ei(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(ti);for(let s of l){let c=ni(s,a,o,t,n,r)??Kt(s,Xt(s,a.get(s.parentId??"")??null,n),0,r);o.push(nn(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function ti(e,t){let n=Bt(e)-Bt(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 Bt(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 ni(e,t,n,r,i,o){for(let a of ri(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=Kt(e,a,s,o),u=nn(e,c,o);if(!n.some(d=>Ri(d,u)))return c}}return null}function ri(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=Xt(e,i,r),a=o==="below"?"above":"below",l=ii(e,i,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,o,s,a]:[o,l,a,s]}function Xt(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 ii(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 Kt(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function oi(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function ai(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:he(0,0,0,0)};return a.set(s,d),d};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Di(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function si(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 li(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${se(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ci(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${se(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function ui(e,t,n,r,i){let o=di(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[d,m,...h]=c.split(".");if(d!=="viewpoint"||!m||h.length===0)continue;let b=wi(m);if(!b)continue;let g=h.join(".").toLowerCase(),$=a.get(b)??{id:b};fi($,g,u,e,t,n,r,i),a.set(b,$)}let l=[...a.values()].map(c=>pi(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function di(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=ut(null),a=ct(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function fi(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=me(s);return;case"projection":case"view":e.projection=Zt(s)??i;return;case"preset":e.preset=hi(s)??o;return;case"rotation":case"angle":e.rotationDeg=fe(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Fe(),azimuth:fe(s)};return;case"camera.elevation":e.camera={...e.camera??Fe(),elevation:fe(s)};return;case"camera.roll":e.camera={...e.camera??Fe(),roll:fe(s)};return;case"camera.distance":e.camera={...e.camera??Fe(),distance:Nt(s)};return;case"zoom":case"scale":e.scale=Nt(s);return;case"layers":e.layers=gi(s);return;case"query":e.filter={...e.filter??De(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??De(),objectTypes:bi(s)};return;case"tags":e.filter={...e.filter??De(),tags:me(s)};return;case"groups":e.filter={...e.filter??De(),groupIds:yi(s,r,a,l)};return}}function pi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=mi(e.filter),l=e.label?.trim()||vi(e.id),s=e.projection??t,c=ut(e.camera??null),u=ct(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||$i(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function De(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Fe(){return{azimuth:null,elevation:null,roll:null,distance:null}}function mi(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 Zt(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function hi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function fe(e){let t=Number(e);return Number.isFinite(t)?t:null}function Nt(e){let t=fe(e);return t!==null&&t>0?t:null}function gi(e){let t={};for(let n of me(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function bi(e){return me(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function yi(e,t,n,r){return me(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??pe(i):(r.has(i),pe(i)))}function me(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function wi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function vi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function $i(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 Ii(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),u=Math.max(u,h)};for(let m of r)m.hidden||Jt(m,d);for(let m of i)m.hidden||(d(m.x1,m.y1),d(m.x2,m.y2));for(let m of n)m.hidden||Qt(m,d);for(let m of o)m.hidden||en(m,d,a);return!Number.isFinite(l)||!Number.isFinite(s)?he(0,0,e,t):he(l,s,c,u)}function Jt(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=on(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,qt*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function he(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 Qt(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 en(e,t,n){let r=rn(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 at(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ve(e,r,l.scaleModel,l.sceneMetricScale),sortKey:ze(t,n,r)}),Re(e,i,o,a,l,r+1))}function Re(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(xi),s=ki(l,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=ji(l,s);l.forEach((d,m)=>{let h=Si(d,m,l.length,a,s,c[m]??s.innerPx,i);n.push({object:d,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),at(d,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,m)=>{let h=ge(m,u.length,-Math.PI/3),b=28*i.spacingFactor,g=be(h,a.radius,i.projection,i.projection==="isometric"?.9:1),$=be(h,a.radius+b,i.projection,i.projection==="isometric"?.9:1),P=a.x+g.x,p=a.y+g.y,x=a.x+$.x,T=a.y+$.y;t.set(d.id,{object:d,x,y:T,radius:Ve(d,o+1,i.scaleModel,i.sceneMetricScale),sortKey:ze(x,T,o+1),anchorX:P,anchorY:p}),r.push({object:d,groupId:i.objectMap.has(d.id)?pe(Fi(d,i.objectMap)):null,x1:P,y1:p,x2:x,y2:T,mode:"surface"}),Re(d,t,n,r,i,o+1)})}function xi(e,t){let n=Ce(e),r=Ce(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 ki(e,t,n,r,i){let o=e.map(h=>Ce(h)),a=o.filter(h=>h!==null),l=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(l*1.2,24*n),c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),d=Math.max(...a),m=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:m,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric}}function Si(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let w=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:w,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-w}}let c=M(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,d=Math.max(u*Math.sqrt(1-c*c),u*.18),m=st(l.inclination)??0,h=a.projection==="isometric"?Math.max(_r,Math.cos(Ne(m)))*Gt:1,b=Math.max(d*h,u*.14),g=st(l.angle)??0,$=u*c,P=sn(-$,0,g),p=r.x+P.x,x=r.y+P.y,T=Mi(l.phase,t,n),C=an(p,x,u,b,g,T),L=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,B=s?Pi(e,u,i,a.scaleModel):void 0;return{kind:L?"circle":"ellipse",cx:L?r.x:p,cy:L?r.y:x,radius:L?u:void 0,rx:L?void 0:u,ry:L?void 0:b,rotationDeg:g,band:s,bandThickness:B,frontArcPath:a.projection==="isometric"||s?Wt(p,x,u,b,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Wt(p,x,u,b,g,Math.PI,Math.PI*2):void 0,objectX:C.x,objectY:C.y}}function Oi(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Ei(Math.max(e,0)+1)}function ji(e,t){let n=[];return e.forEach((r,i)=>{let o=Ce(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Oi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Ce(e){return!e.placement||e.placement.mode!=="orbit"?null:Z(e.placement.semiMajor??e.placement.distance??null)}function Ei(e){return Math.log(e)/Math.log(2)}function Mi(e,t,n){let r=e?st(e):null;return r!==null?Ne(r-90):ge(t,n,-Math.PI/2)}function Pi(e,t,n,r){let i=Z(_e(e.properties.inner)),o=Z(_e(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.pixelsPerMetric!==null){let c=l*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(c*r.ringThicknessMultiplier,1):M(Math.max(c*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return M(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return M(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ti(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Li(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=ge(r,i,Math.PI/5),d=(c.radius+36)*s.scaleModel.labelMultiplier,m=be(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=ge(r,i,Math.PI/6),d=(c.radius+36)*s.scaleModel.labelMultiplier,m=be(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Li(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Ci(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,d=s/c,m=-d,h=u,b=M(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*b,y:a.y-d*b,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*b,y:a.y+d*b,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*b,y:o.y-d*b,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*b,y:a.y+(d*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*b,y:a.y+(d*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function Ai(e,t){let n=new Map,r=new Map;for(let c of e){let u=tn(c,t);if(n.set(c.id,u),u){let d=r.get(u);d?d.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let d=new Set,m=[],h=n.get(c)??null;for(;h&&!d.has(h);)m.push(h),d.add(h),h=n.get(h)??null;return i.set(c,m),m},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let d=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&d&&(h=s(d)),h};for(let c of e){l(c.id);let u=s(c.id),d=pe(u);o.set(c.id,d),a.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function tn(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 Di(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(d,m)=>{a=Math.min(a,d),l=Math.min(l,m),s=Math.max(s,d),c=Math.max(c,m)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&Qt(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&Jt(d,u);for(let d of r)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&en(d,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?he(0,0,0,0):he(a,l,s,c)}function Fi(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=tn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function nn(e,t,n){return rn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function rn(e,t,n,r,i,o,a,l){let s=Wi(o,a,l),c=s*2,u=i==="above"?18:12,d=i==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function Ri(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ci(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ve(e,t,n,r){let i=zi(e.properties.radius,n,r);if(i!==null)return i;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*o,n.minBodyRadius,n.maxBodyRadius)}}function Vi(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 Z(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/de;case"m":return e.value/1e3/de;case"ly":return e.value*Rr;case"pc":return e.value*Cr;case"kpc":return e.value*Vr;case"re":return e.value*Ar/de;case"rj":return e.value*Dr/de;case"sol":return e.value*Fr/de;default:return e.value}}function _i(e,t,n){let r=Z(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):M(i,0,420)}return M(r*96*t.freePlacementMultiplier,0,420)}function zi(e,t,n){let r=_e(e);if(!r)return null;let i=Z(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):M(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(r.unit){case"sol":o=M(r.value*22,14,40);break;case"re":o=M(r.value*10,6,18);break;case"km":o=M(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:o=M(r.value*4,4,20);break}return M(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Bi(e){return Z(_e(e.properties.radius))}function _e(e){return!e||typeof e!="object"||!("value"in e)?null:e}function st(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ge(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Wt(e,t,n,r,i,o,a){let l=on(e,t,n,r,i,o,a,qt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Ht(s.x)} ${Ht(s.y)}`).join(" ")}function on(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(an(e,t,n,r,i,u))}return s}function an(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=sn(a,l,i);return{x:e+s.x,y:t+s.y}}function sn(e,t,n){let r=Ne(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function be(e,t,n,r){let i=n==="isometric"?Gt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function ze(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function Ut(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function se(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function pe(e){return`${se(e)}-group`}function Ni(e){return typeof e=="string"&&e.trim()?e:void 0}function Wi(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Yt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ne(e){return e*Math.PI/180}function Ht(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ln(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:Xi(e.system),info:Ki(e.system)}:null,r=e.objects.map(Ui);return Gi(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Yi),objects:r}}function Ui(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:qi(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Yi(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Hi)}}function Hi(e){return{objectId:e.objectId,placement:cn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function cn(e){return e?structuredClone(e):null}function Gi(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=cn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function qi(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 Xi(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 Ki(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=Zi(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Zi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var un=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ji=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Qi=/^[A-Za-z][A-Za-z0-9+.-]*:/;function le(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function we(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function dt(e,t,n){let r=e.match(un);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=R(n);if(o?.unitFamily&&!Me(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function ft(e){let t=e.match(un);return t?{value:Number(t[1]),unit:t[2]??null}:null}function We(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function J(e,t,n){let r=Ji.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function dn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function eo(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Qi);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function fn(e,t,n){let r=R(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return J(ye(t,e,n),e,n);case"number":return We(ye(t,e,n),e,n);case"unit":return dt(ye(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&eo(i,n),i}}}function pt(e,t,n){let r=R(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function ye(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var mn=new Set(["star","planet","moon","asteroid","comet"]),to=332946.0487,no=1047.3486,Ue=1495978707e-1,ro=6371,io=695700,oo=63241.077,ao=206264.806,so=206264806;function ht(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(v("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)lo(l,r,n);for(let l of e.system?.viewpoints??[])co(l,i,o,t,n,r);for(let l of e.objects)uo(l,e.system,r,i,n);for(let l of e.events)fo(l,e.system,r,n);return n}function lo(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function co(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(a)for(let l of a.groupIds)t.has(l)||i.push(O("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(O("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}go(e.projection,i,`viewpoint.${e.id}.projection`,e.id),bo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function uo(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(O("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(O("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(O("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(v("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(O("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(O("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!gt(l?.properties.mass)&&i.push(O("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?mn.has(s.type)||i.push(v("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(v("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(v("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),mo(e,n,i)||i.push(v("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(O("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(O("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=pn(e,l);if(c===null){i.push(O("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(mt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${$o(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(O("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=hn(a?.period),u=pn(e,l);if(c===null||u===null)continue;let d=vo(e,"period");Math.abs(c-u)>d&&i.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function fo(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(O("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(O("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(O("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(v("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(O("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(O("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(O("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let d=n.get(c.objectId);if(!d){r.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(O("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),po(c,d,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(O("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function po(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(v("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(v("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!yo(r,t,n,e)&&o.push(O("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!wo(r,t,n,e)&&o.push(O("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!gt(i.get(s.target)?.properties.mass)&&o.push(O("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?mn.has(c.type)||o.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(v("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function mo(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(v("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(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function pn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=ho(n.semiMajor??n.distance),i=gt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function ho(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ue;case"m":return e.value/(Ue*1e3);case"ly":return e.value*oo;case"pc":return e.value*ao;case"kpc":return e.value*so;case"re":return e.value*ro/Ue;case"sol":return e.value*io/Ue;default:return null}}function gt(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/to;case"mj":return t.value/no;default:return null}}function hn(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 go(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(v("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function bo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[d,m]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])m!==null&&(!Number.isFinite(m)||d==="distance"&&m<=0)&&r.push(v("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(O("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(O("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(mt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(O("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(mt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function yo(e,t,n,r){return Q(r?.epoch)??Q(n?.epoch)??Q(t.epoch)??Q(e?.epoch)??null}function wo(e,t,n,r){return Q(r?.referencePlane)??Q(n?.referencePlane)??Q(t.referencePlane)??Q(e?.referencePlane)??null}function Q(e){return typeof e=="string"&&e.trim()?e.trim():null}function vo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?hn(n)??0:0}function $o(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function O(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function mt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Io=new Set(["climate","habitability","settlement"]),He=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=R(e);t&&He.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}])He.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var xo=new Set(He.keys()),bn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function yn(e){return ko(e)}function ko(e,t){let n=ua(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],d=[],m=[],h=new Map,b=!1,g=!1,$=new Set,P=new Set,p=new Set,x=new Set,T=new Set;for(let k=0;k<r.length;k++){let Y=r[k],N=k+1;if(!Y.trim())continue;let H=Ae(Y),q=Le(Y.slice(H),{line:N,columnOffset:H});if(q.length!==0){if(!o){a=So(q,N),o=!0,n.comments.length>0&&Ge(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(H===0){s=Oo(q,N,a,i,l,c,u,d,m,h,$,P,p,x,T,{sawDefaults:b,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new f("Indented line without parent atlas section",N,H+1);Do(s,H,q,N)}}if(!o)throw new f('Missing required atlas schema header "schema 2.0"');let C=c.map(k=>Qo(k,a,i)),L=m.map(k=>ea(k,h.get(k.id)??[])),B=t??(a==="2.0-draft"?"2.0":a),w={format:"worldorbit",sourceVersion:"1.0",theme:null,system:l,groups:u,relations:d,events:L,objects:C,diagnostics:i};if(B==="2.0-draft"){let k={...w,version:"2.0-draft",schemaVersion:"2.0-draft"};return k.diagnostics.push(...ht(k,a)),k}let j={...w,version:B,schemaVersion:B};return a==="2.0-draft"&&j.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),j.diagnostics.push(...ht(j,a)),j}function So(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Oo(e,t,n,r,i,o,a,l,s,c,u,d,m,h,b,g){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return jo(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(g.sawDefaults)throw new f('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(g.sawAtlas)throw new f('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Eo(e,t,i,u,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Mo(e,t,i,d);case"group":return z(n,r,"group",{line:t,column:e[0].column}),Po(e,t,a,m);case"relation":return z(n,r,"relation",{line:t,column:e[0].column}),To(e,t,l,h);case"event":return z(n,r,"event",{line:t,column:e[0].column}),Lo(e,t,s,c,b,n,r);case"object":return Ao(e,t,n,r,o);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function jo(e,t,n,r){if(e.length!==2)throw new f("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 Eo(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let a=le(e[1].value);if(!a)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:we(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Mo(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:we(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Po(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:we(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function To(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function Lo(e,t,n,r,i,o,a){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let l=le(e[1].value);if(!l)throw new f("Event id must not be empty",t,e[1].column);if(i.has(l))throw new f(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:we(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Ao(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!Ee.has(l)||l==="system")throw new f(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:Zo(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Do(e,t,n,r){switch(e.kind){case"system":Fo(e,n,r);return;case"defaults":Ro(e,n,r);return;case"atlas":Co(e,t,n,r);return;case"viewpoint":Vo(e,t,n,r);return;case"annotation":Bo(e,n,r);return;case"group":No(e,n,r);return;case"relation":Wo(e,n,r);return;case"event":Uo(e,t,n,r);return;case"object":Ho(e,t,n,r);return}}function Fo(e,t,n){let r=G(t,e.seenFields,n),i=S(t,n);switch(r){case"title":e.system.title=i;return;case"description":z(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":z(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":z(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Ro(e,t,n){let r=G(t,e.seenFields,n),i=S(t,n);switch(r){case"view":vn(i)&&re(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=wn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=$n(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Co(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=In(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new f(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new f(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Vo(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){_o(e,n,r);return}if(e.inFilter){zo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(re(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??yt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=G(n,e.seenFields,r),o=S(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":vn(o)&&re(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=wn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=$n(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=bt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=te(o,r,n[0].column,"rotation");return;case"camera":re(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Ko(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=qo(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":z(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=U(n.slice(1),r,"events");return;default:throw new f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function _o(e,t,n){let r=G(t,e.seenCameraFields,n),i=S(t,n),o=e.viewpoint.camera??yt();switch(r){case"azimuth":o.azimuth=te(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=te(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=te(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=bt(i,n,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function zo(e,t,n){let r=G(t,e.seenFilterFields,n),i=e.viewpoint.filter??Xo();switch(r){case"query":i.query=S(t,n);break;case"objecttypes":i.objectTypes=Go(t.slice(1),n);break;case"tags":i.tags=U(t.slice(1),n,"tags");break;case"groups":i.groupIds=U(t.slice(1),n,"groups");break;default:throw new f(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function Bo(e,t,n){switch(G(t,e.seenFields,n)){case"label":e.annotation.label=S(t,n);return;case"target":e.annotation.targetObjectId=S(t,n);return;case"body":e.annotation.body=S(t,n);return;case"tags":e.annotation.tags=U(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function No(e,t,n){switch(G(t,e.seenFields,n)){case"label":e.group.label=S(t,n);return;case"summary":e.group.summary=S(t,n);return;case"color":e.group.color=S(t,n);return;case"tags":e.group.tags=U(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=J(S(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Wo(e,t,n){switch(G(t,e.seenFields,n)){case"from":e.relation.from=S(t,n);return;case"to":e.relation.to=S(t,n);return;case"kind":e.relation.kind=S(t,n);return;case"label":e.relation.label=S(t,n);return;case"summary":e.relation.summary=S(t,n);return;case"tags":e.relation.tags=U(t.slice(1),n,"tags");return;case"color":e.relation.color=S(t,n);return;case"hidden":e.relation.hidden=J(S(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Uo(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&re(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Yo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new f('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(G(n,e.seenFields,r)){case"kind":e.event.kind=S(n,r);return;case"label":e.event.label=S(n,r);return;case"summary":e.event.summary=S(n,r);return;case"target":e.event.targetObjectId=S(n,r);return;case"participants":e.event.participantObjectIds=U(n.slice(1),r,"participants");return;case"timing":e.event.timing=S(n,r);return;case"visibility":e.event.visibility=S(n,r);return;case"epoch":re(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=S(n,r);return;case"referenceplane":re(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=S(n,r);return;case"tags":e.event.tags=U(n.slice(1),r,"tags");return;case"color":e.event.color=S(n,r);return;case"hidden":e.event.hidden=J(S(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Yo(e,t,n){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!bn.has(r))throw new f(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new f(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function Ho(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Io.has(i)){i!=="info"&&z(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=In(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new f(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new f(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(Jo(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function G(e,t,n){if(e.length<2)throw new f("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new f(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function S(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Go(e,t){return U(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function qo(e,t,n,r){let i={};for(let o of U(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&z(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function U(e,t,n){if(e.length===0)throw new f(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new f(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function wn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new f(`Unknown projection "${e}"`,t,n);return r}function vn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function $n(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new f(`Unknown render preset "${e}"`,t,n)}function bt(e,t,n,r){let i=te(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function te(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function Xo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function yt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ko(e,t,n){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:yt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new f(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=te(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=te(c,t,a.column,"camera.elevation");break;case"roll":r.roll=te(c,t,a.column,"camera.roll");break;case"distance":r.distance=bt(c,t,a.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function Zo(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=ve(l.value);if(!s)throw new f(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&z(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[a];if(!d)break;c.push(d),a++}else for(;a<e.length&&!xo.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new f(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return On(o,n),o}function Jo(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let o=ve(e[0].value);if(!o)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&z(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return On([a],n),a}function In(e,t,n){if(e.length<2)throw new f(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 Qo(e,t,n){let r=xn(e.fields),i=kn(r),o=na(e.objectType,r),a=la(r.get("groups")?.[0]),l=Ye(r.get("epoch")?.[0]),s=Ye(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?J(W(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?oa(r.get("resonance")[0]):void 0,d=ia(r),m=r.get("derive")?.map(x=>aa(x)),h=r.get("validate")?.map(x=>({rule:W(x)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(x=>x.values))]:void 0,g=r.get("tolerance")?.map(x=>sa(x)),$=ra(e.typedBlockEntries),P=Sn(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:P};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),u&&(p.resonance=u),d&&(p.renderHints=d),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),b?.length&&(p.lockedFields=b),g?.length&&(p.tolerances=g),$&&Object.keys($).length>0&&(p.typedBlocks=$),Ge(t,"2.1")&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&z(t,n,e.id,e.location),p}function ea(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ta(n))}}function ta(e){let t=xn(e.fields,"event-pose"),n=kn(t);return{objectId:e.objectId,placement:n,inner:ee(t.get("inner")?.[0],"inner"),outer:ee(t.get("outer")?.[0],"outer"),epoch:Ye(t.get("epoch")?.[0]),referencePlane:Ye(t.get("referencePlane")?.[0])}}function xn(e,t="object"){let n=new Map;for(let r of e){let i=ve(r.key);if(!i&&!bn.has(r.key))throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function kn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw f.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:W(t),distance:ee(e.get("distance")?.[0],"distance"),semiMajor:ee(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ca(e.get("eccentricity")?.[0],"eccentricity"),period:ee(e.get("period")?.[0],"period"),angle:ee(e.get("angle")?.[0],"angle"),inclination:ee(e.get("inclination")?.[0],"inclination"),phase:ee(e.get("phase")?.[0],"phase")};if(n){let a=W(n);return{mode:"at",target:a,reference:dn(a,n.location)}}if(r)return{mode:"surface",target:W(r)};if(i){let a=W(i),l=ft(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function na(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=ve(r);!o||!a?.legacySchema||a.legacySchema.placement||(pt(r,e,o.location),n[r]=fn(r,o.values,o.location))}return n}function Sn(e,t){let n={};for(let r of e){if(r.key in n)throw f.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ra(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Sn(r,n))}return t}function ia(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=J(W(n),"renderLabel",n.location)),r&&(t.renderOrbit=J(W(r),"renderOrbit",r.location)),i&&(t.renderPriority=We(W(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function oa(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function aa(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function sa(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=ft(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function la(e){return e?[...new Set(e.values)]:[]}function Ye(e){return e&&e.values.join(" ").trim()||null}function ee(e,t){return e?dt(W(e),e.location,t):void 0}function ca(e,t){return e?We(W(e),t,e.location):void 0}function W(e){return ye(e.values,e.key,e.location)}function ve(e){return He.get(e)}function On(e,t){for(let n of e){let r=ve(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){pt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function z(e,t,n,r){Ge(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 re(e,t,n,r){Ge(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Ge(e,t){return gn(e)<gn(t)}function gn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;default:return 5}}function ua(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
2
+ `&&c!=="\r"&&(t[s]=" "),c===`
3
+ `?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!da(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let d=s+1;for(;d<t.length&&t[d]!==`
4
+ `&&t[d]!=="\r";)t[d]=" ",d++;l+=d-s,s=d-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
5
+ `?(a++,l=1):l++}if(i)throw f.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function da(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
6
+ `}var fa=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,pa=/^schema\s+2\.1$/i,ma=/^schema\s+2\.5$/i,ha=/^schema\s+2\.6$/i,ga=/^schema\s+2\.0-draft$/i;function ba(e){for(let t of ya(e).split(/\r?\n/)){let n=t.trim();if(n)return ga.test(n)?"2.0-draft":pa.test(n)?"2.1":ma.test(n)?"2.5":ha.test(n)?"2.6":fa.test(n)?"2.0":"1.0"}return"1.0"}function ya(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
7
+ `&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let l=i+1;for(;l<t.length&&t[l]!==`
8
+ `&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function jn(e){let t=ba(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return wa(e,t);let n;try{n=rt(e)}catch(i){return{ok:!1,value:null,diagnostics:[ae(i,"parse")]}}let r;try{r=nt(n)}catch(i){return{ok:!1,value:null,diagnostics:[ae(i,"normalize")]}}try{it(r)}catch(i){return{ok:!1,value:null,diagnostics:[ae(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function wa(e,t){let n;try{n=yn(e)}catch(a){return{ok:!1,value:null,diagnostics:[ae(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=ln(n)}catch(a){return{ok:!1,value:null,diagnostics:[ae(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}function En(e){return e.line?e.column?`Line ${e.line}, Column ${e.column}`:`Line ${e.line}`:"No position"}function qe(e){let t=e.filter(r=>r.severity==="error").length,n=e.filter(r=>r.severity==="warning").length;return!t&&!n?"Ready":t&&n?`${t} error${t===1?"":"s"}, ${n} warning${n===1?"":"s"}`:t?`${t} error${t===1?"":"s"}`:`${n} warning${n===1?"":"s"}`}var Mn="WorldOrbit Quick Start";function Pn(){return["```worldorbit","schema 2.5","","system Sol",' title "Solar System"'," referencePlane ecliptic","","defaults"," view orthographic"," preset atlas-card","","group inner-system",' label "Inner System"',"","object star Sun"," mass 1sol","","object planet Mercury"," orbit Sun"," semiMajor 0.39au"," color #b7b1a7"," groups inner-system","","object planet Venus"," orbit Sun"," semiMajor 0.72au"," color #d9b37a"," groups inner-system","","object planet Earth"," orbit Sun"," semiMajor 1au"," color #6fa8ff"," atmosphere nitrogen-oxygen"," groups inner-system","","object moon Luna"," orbit Earth"," distance 384400km","","object planet Mars"," orbit Sun"," semiMajor 1.52au"," color #d97c52"," groups inner-system","```"].join(`
9
+ `)}var $e=require("obsidian");function Tn(e){let n=e.text.split(/\r?\n/).findIndex(r=>/^\s*(```+|~~~+)\s*worldorbit(?:\s+.*)?$/i.test(r));return e.lineStart+(n>=0?n+1:1)}function Ln(e,t){return!t.line||t.line<1?null:{line:e+t.line-1,ch:Math.max((t.column??1)-1,0)}}function An(e,t){if(!e.sourcePath)return null;let n=e.getSectionInfo(t);return n?{sourcePath:e.sourcePath,contentStartLine:Tn(n)}:null}async function Dn(e,t,n,r){let i=Ln(n,r);if(!i)return!1;let o=e.vault.getAbstractFileByPath(t);if(!(o instanceof $e.TFile))return!1;let a=e.workspace.getMostRecentLeaf()??e.workspace.getLeaf(!0);await a.openFile(o);let l=a.view instanceof $e.MarkdownView?a.view:e.workspace.getActiveViewOfType($e.MarkdownView);return l?(l.editor.setCursor(i),l.editor.focus(),!0):!1}var wt={embeddedInteraction:"locked",showWarnings:!1,showFullscreenButton:!0};function va(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:vt(e.objectTypes??[]),tags:vt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:vt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return $a(t)?t:null}function $a(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Fn(e,t){let n=va(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Ia(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ia(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=xa(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function xa(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function vt(e){return[...new Set(e)]}var ka={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Xe={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",spaceFog:"#07131d",starfield:"rgba(226, 239, 255, 0.9)",starfieldDim:"rgba(164, 194, 228, 0.45)",objectSpecular:"#f5f8ff",orbitOpacity:.34,orbitBandOpacity:.24,selectionHalo:"rgba(255, 214, 139, 0.9)",atmosphere:"rgba(143, 202, 255, 0.4)",cometTail:"rgba(193, 243, 255, 0.7)",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",spaceFog:"#071723",starfield:"rgba(220, 255, 245, 0.9)",starfieldDim:"rgba(124, 212, 195, 0.42)",objectSpecular:"#ecfffb",orbitOpacity:.3,orbitBandOpacity:.22,selectionHalo:"rgba(120, 255, 215, 0.85)",atmosphere:"rgba(120, 255, 215, 0.32)",cometTail:"rgba(181, 255, 236, 0.68)",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",spaceFog:"#1c0d12",starfield:"rgba(255, 232, 214, 0.88)",starfieldDim:"rgba(255, 176, 138, 0.38)",objectSpecular:"#fff0e6",orbitOpacity:.3,orbitBandOpacity:.24,selectionHalo:"rgba(255, 178, 125, 0.85)",atmosphere:"rgba(255, 190, 140, 0.26)",cometTail:"rgba(255, 214, 173, 0.62)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Ie(e){return e?typeof e=="string"?Xe[e]??Xe.atlas:{...Xe.atlas,...e}:Xe.atlas}function Rn(e){return{...ka,...e}}var Ze="worldorbit-camera-root";function ke(e,t={}){let n=Ie(t.theme),r=za(t.preset??e.renderPreset??void 0),i=Rn({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Fn(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!Ke(p.object)).sort((p,x)=>p.sortKey-x.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!Ke(p.object)),c=ja(l),u=i.orbits?Oa(e,a,i.structures):{back:"",front:""},d=i.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!Ke(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${D(p.renderId)}" data-group-id="${F(p.groupId??"")}" />`).join(""):"",m=i.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${D(p.renderId)}" data-relation-id="${F(p.relationId)}" />`).join(""):"",h=i.events?e.events.filter(p=>!p.hidden).map(p=>Sa(e,p,a,n)).join(""):"",b=i.objects?l.map(p=>Ea(p,t.selectedObjectId??null,n)).join(""):"",g=i.labels?s.map(p=>Ma(e,p,t.selectedObjectId??null)).join(""):"",$=i.metadata?`<text class="wo-title" x="56" y="64">${D(e.title)}</text>
10
+ <text class="wo-subtitle" x="56" y="88">${D(o)}</text>
11
+ <text class="wo-meta" x="56" y="${e.height-42}">${D(Na(e))}</text>`:"",P=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
12
+ <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
13
+ ${i.guides?Ba(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">
14
+ <title id="worldorbit-title">${D(e.title)}</title>
15
+ <desc id="worldorbit-desc">A ${D(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
16
+ <defs>
17
+ <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
18
+ <stop offset="0%" stop-color="${n.backgroundStart}" />
19
+ <stop offset="100%" stop-color="${n.backgroundEnd}" />
20
+ </linearGradient>
21
+ <radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
22
+ <stop offset="0%" stop-color="${n.starGlow}" stop-opacity="0.95" />
23
+ <stop offset="100%" stop-color="${n.starCore}" stop-opacity="0" />
24
+ </radialGradient>
25
+ <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
26
+ <stop offset="0%" stop-color="${n.backgroundGlow}" />
27
+ <stop offset="100%" stop-color="transparent" />
28
+ </radialGradient>
29
+ ${c}
30
+ </defs>
31
+ <style>
32
+ .wo-bg { fill: url(#wo-bg); }
33
+ .wo-bg-glow { fill: url(#wo-bg-glow); }
34
+ .wo-grid { fill: none; stroke: ${n.guide}; stroke-width: 1; }
35
+ .wo-orbit { fill: none; stroke: ${n.orbit}; stroke-width: 1.5; }
36
+ .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
37
+ .wo-orbit-front { opacity: 0.9; }
38
+ .wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
39
+ .wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
40
+ .wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
41
+ .wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
42
+ .wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
43
+ .wo-leader { stroke: ${n.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
44
+ .wo-label { fill: ${n.ink}; font-family: ${n.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
45
+ .wo-label-secondary { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
46
+ .wo-title { fill: ${n.ink}; font: 700 24px ${n.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
47
+ .wo-subtitle { fill: ${n.muted}; font: 500 12px ${n.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
48
+ .wo-meta { fill: ${n.muted}; font: 500 11px ${n.fontFamily}; letter-spacing: 0.06em; }
49
+ .wo-object { cursor: pointer; outline: none; }
50
+ .wo-object:focus-visible .wo-selection-ring,
51
+ .wo-object:hover .wo-selection-ring,
52
+ .wo-object-selected .wo-selection-ring { display: block; }
53
+ .wo-object-selected .wo-selection-ring { stroke: ${n.selected}; }
54
+ .wo-object-label-selected .wo-label { fill: ${n.accent}; }
55
+ .wo-object-label-selected .wo-label-secondary { fill: ${n.selected}; }
56
+ .wo-chain-selected .wo-selection-ring,
57
+ .wo-chain-hover .wo-selection-ring { display: block; }
58
+ .wo-ancestor-selected .wo-selection-ring,
59
+ .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
60
+ .wo-chain-selected .wo-label,
61
+ .wo-chain-hover .wo-label { fill: ${n.accent}; }
62
+ .wo-ancestor-selected .wo-label,
63
+ .wo-ancestor-hover .wo-label { fill: ${n.ink}; opacity: 0.82; }
64
+ .wo-orbit-related-selected,
65
+ .wo-orbit-related-hover { stroke: ${n.accentStrong}; opacity: 1; }
66
+ .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
67
+ .wo-object-image { pointer-events: none; }
68
+ </style>
69
+ ${P}
70
+ ${$}
71
+ <g data-worldorbit-world="true">
72
+ <g data-worldorbit-camera-root="${Ze}" id="${Ze}">
73
+ <g data-worldorbit-world-content="true">
74
+ ${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
75
+ ${i.guides?`<g data-layer-id="guides">${d}</g>`:""}
76
+ ${i.relations?`<g data-layer-id="relations">${m}</g>`:""}
77
+ ${i.events?`<g data-layer-id="events">${h}</g>`:""}
78
+ ${i.objects?`<g data-layer-id="objects">${b}</g>`:""}
79
+ ${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
80
+ ${i.labels?`<g data-layer-id="labels">${g}</g>`:""}
81
+ </g>
82
+ </g>
83
+ </g>
84
+ </svg>`}function Sa(e,t,n,r){let i=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,a=t.event.label||t.event.id,l=i.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${F(o)}" data-event-id="${F(t.eventId)}" data-object-id="${F(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${D(t.renderId)}" data-event-id="${F(t.eventId)}">
85
+ ${l}
86
+ <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${F(o)}" />
87
+ <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${D(a)}</text>
88
+ </g>`}function Oa(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!Ke(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${D(o.renderId)}" data-orbit-object-id="${F(o.objectId)}" data-parent-id="${F(o.parentId)}" data-group-id="${F(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function ja(e){return e.filter(t=>!!t.imageHref).map(t=>La(t)).join("")}function Ea(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=Da(e,n),d=Ta(e),m=d?Cn(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${D(e.objectId)}" data-parent-id="${F(e.parentId??"")}" data-group-id="${F(e.groupId??"")}" data-render-id="${D(e.renderId)}" tabindex="0" role="button" aria-label="${D(`${r.type} ${e.objectId}`)}">
89
+ <circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
90
+ ${Pa(e,u)}
91
+ ${Cn(r,i,o,a,u)}
92
+ ${d}
93
+ ${m}
94
+ </g>`}function Ma(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${D(t.objectId)}" data-group-id="${F(t.groupId??"")}" data-render-id="${D(t.renderId)}">
95
+ <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${D(t.label)}</text>
96
+ <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${D(t.secondaryLabel)}</text>
97
+ </g>`}function Cn(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
98
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
99
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Bn(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${$t(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
100
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
101
+ <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
102
+ <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
103
+ <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
104
+ <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${$t(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function Pa(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Ta(e){if(!e.imageHref)return"";let t=Aa(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${F(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${F(zn(e))})" />`}function La(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Bn(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${$t(t,n,r)}" />`;break;default:return""}return`<clipPath id="${F(zn(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Aa(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function Da(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Fa(e.object.type,n,t),i=e.fillColor&&Ua(e.fillColor)?e.fillColor:r.fill,o=Vn(e.object.properties.albedo),a=Vn(e.object.properties.temperature),l=Ca(i,a,o,e.object.type),s=xe(l,"#ffffff",.4)??r.stroke,c=_a(e.object.properties.atmosphere),u=e.object.type==="star"?_n(xe(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?_n(xe(l,"#ffffff",.5)??l,.72):void 0}}function Fa(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 Ra(t)}}function Ra(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 Ca(e,t,n,r){let i=e;if(t!==null){let o=Va(t,r);i=xe(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=xe(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function Va(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function _a(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 za(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 Vn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function zn(e){return`${e.renderId}-clip`}function Bn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function $t(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 Ba(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function Na(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Ke(e){return e.type==="structure"||e.type==="phenomenon"}function xe(e,t,n){let r=It(e),i=It(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return Wa({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function _n(e,t){let n=It(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function It(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 Wa(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function Ua(e){return!!e.trim()}function D(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function F(e){return D(e)}var Nn={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function Wn(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Un(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Yn(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=kt(e),a=Wn(t.scale*n,i);if(a===t.scale)return t;let l=a/t.scale,s=r.x-o.x,c=r.y-o.y;return{...t,scale:a,translateX:(1-l)*s+l*t.translateX,translateY:(1-l)*c+l*t.translateY}}function xt(e,t,n){let r=kt(e),i=Ya(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),a=Math.max(e.height-n.fitPadding*2,1),l=Math.max(i.width,1),s=Math.max(i.height,1),c=Wn(Math.min(o/l,a/s),n),u=lt({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 Hn(e,t){let n=kt(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function kt(e){return{x:e.width/2,y:e.height/2}}function Ya(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(s=>lt(s,t,n)),i=Math.min(...r.map(s=>s.x)),o=Math.min(...r.map(s=>s.y)),a=Math.max(...r.map(s=>s.x)),l=Math.max(...r.map(s=>s.y));return{minX:i,minY:o,maxX:a,maxY:l,width:a-i,height:l-o,centerX:i+(a-i)/2,centerY:o+(l-o)/2}}var St={minScale:.2,maxScale:8,fitPadding:48};function Gn(e,t,n={}){let r={minScale:n.minScale??St.minScale,maxScale:n.maxScale??St.maxScale,fitPadding:n.fitPadding??St.fitPadding},i={pointer:n.pointer??!0,touch:n.touch??!0,selection:n.selection??!0},o={width:n.width,height:n.height,padding:n.padding,preset:n.preset,theme:n.theme,layers:n.layers,subtitle:n.subtitle,pointer:i.pointer,touch:i.touch,selection:i.selection,minScale:r.minScale,maxScale:r.maxScale,fitPadding:r.fitPadding},a=xt(t,Nn,r),l=null,s=null,c=!1,u=null,d=null,m=0,h=e.getAttribute("tabindex"),b=e.style.touchAction;h===null&&(e.tabIndex=0),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":b;let g=w=>{if(!i.pointer||c||!l)return;w.preventDefault(),e.focus();let j=B(w.clientX,w.clientY),k=Ha(Math.exp(-w.deltaY*.002),.6,1.6);L(Yn(t,a,k,j,r))},$=w=>{if(c)return;let j=w.pointerType==="touch";j&&!i.touch||!j&&!i.pointer||!j&&w.button!==0||(u=w.pointerId,d={x:w.clientX,y:w.clientY},m=0,e.setPointerCapture?.(w.pointerId),e.focus())},P=w=>{if(c||u!==w.pointerId||!d)return;let j=l?.getBoundingClientRect();if(!j||j.width<=0||j.height<=0)return;let k=w.clientX-d.x,Y=w.clientY-d.y;d={x:w.clientX,y:w.clientY},m+=Math.hypot(k,Y),L(Un(a,k*(t.width/j.width),Y*(t.height/j.height)))},p=w=>{u===w.pointerId&&(u=null,d=null,e.releasePointerCapture?.(w.pointerId))},x=w=>{if(c||!i.selection||m>6)return;let j=w.target?.closest(".wo-object[data-object-id]");j&&(L({...a,selectedObjectId:j.dataset.objectId??null}),T())};return e.addEventListener("wheel",g,{passive:!1}),e.addEventListener("pointerdown",$),e.addEventListener("pointermove",P),e.addEventListener("pointerup",p),e.addEventListener("pointercancel",p),e.addEventListener("click",x),T(),{getState(){return{...a}},setState(w){L({...a,...w}),"selectedObjectId"in w&&T()},setRenderOptions(w){o={...o,...w},T()},fitToSystem(){L(xt(t,a,r))},destroy(){c||(c=!0,e.removeEventListener("wheel",g),e.removeEventListener("pointerdown",$),e.removeEventListener("pointermove",P),e.removeEventListener("pointerup",p),e.removeEventListener("pointercancel",p),e.removeEventListener("click",x),h===null&&e.removeAttribute("tabindex"),e.style.touchAction=b,e.replaceChildren(),l=null,s=null)}};function T(){c||(e.innerHTML=ke(t,{width:o.width,height:o.height,padding:o.padding,preset:o.preset,theme:o.theme,layers:o.layers,subtitle:o.subtitle,selectedObjectId:a.selectedObjectId}),l=e.querySelector("svg"),s=e.querySelector(`[data-worldorbit-camera-root="${Ze}"]`),C())}function C(){s?.setAttribute("transform",Hn(t,a))}function L(w){a=w,C()}function B(w,j){let k=l?.getBoundingClientRect();return!k||k.width<=0||k.height<=0?{x:t.width/2,y:t.height/2}:{x:(w-k.left)/k.width*t.width,y:(j-k.top)/k.height*t.height}}}function Ha(e,t,n){return Math.min(Math.max(e,t),n)}function Je(){return{...Ie("atlas"),name:"obsidian",backgroundStart:"var(--background-primary, #10131a)",backgroundEnd:"var(--background-secondary, #171b24)",backgroundGlow:"var(--interactive-accent-hover, rgba(143, 202, 255, 0.18))",panel:"var(--background-secondary-alt, rgba(10, 16, 24, 0.92))",panelLine:"var(--background-modifier-border, rgba(168, 207, 242, 0.2))",relation:"var(--text-accent-hover, rgba(240, 180, 100, 0.42))",orbit:"var(--text-faint, rgba(163, 209, 255, 0.24))",guide:"var(--background-modifier-border-hover, rgba(255, 255, 255, 0.08))",leader:"var(--text-muted, rgba(225, 238, 255, 0.4))",ink:"var(--text-normal, #e8f0ff)",muted:"var(--text-muted, rgba(232, 240, 255, 0.7))",accent:"var(--interactive-accent, #f0b464)",accentStrong:"var(--text-accent-hover, #ff7f5f)",selected:"var(--color-cyan, rgba(255, 214, 139, 0.92))",starCore:"var(--color-yellow, #ffcc67)",starStroke:"var(--text-normal, rgba(255, 245, 203, 0.85))",starGlow:"var(--color-orange, #ffe8a3)",objectSpecular:"var(--text-normal, #f5f8ff)",selectionHalo:"var(--interactive-accent, rgba(255, 214, 139, 0.9))",atmosphere:"var(--color-cyan, rgba(143, 202, 255, 0.4))",cometTail:"var(--color-cyan, rgba(193, 243, 255, 0.7))",fontFamily:'var(--font-interface, "Segoe UI", sans-serif)',displayFont:'var(--font-text, var(--font-interface, "Segoe UI", sans-serif))'}}var ce=class{options;viewer=null;state;constructor(t){this.options={...t,createViewer:t.createViewer??Ga,renderStatic:t.renderStatic??qa},this.state={interactive:t.interactive,destroyed:!1}}getState(){return{...this.state}}mount(){this.state.destroyed||this.renderCurrent()}setInteractive(t){this.state.destroyed||this.state.interactive===t||(this.state.interactive=t,this.renderCurrent())}resize(){if(!this.state.destroyed){if(this.viewer){let t=Ot(this.options.container,this.options.scene);this.viewer.setRenderOptions(t);return}this.renderCurrent()}}destroy(){this.state.destroyed||(this.state.destroyed=!0,this.destroyViewer(),Xn(this.options.container))}renderCurrent(){if(this.destroyViewer(),Xn(this.options.container),this.state.interactive){let n=Ot(this.options.container,this.options.scene);this.viewer=this.options.createViewer(this.options.container,{scene:this.options.scene,theme:this.options.theme,pointer:this.options.enablePointer,touch:this.options.enableTouch,...n});return}let t=Ot(this.options.container,this.options.scene);this.options.container.innerHTML=this.options.renderStatic(this.options.scene,{theme:this.options.theme,...t})}destroyViewer(){this.viewer?.destroy(),this.viewer=null}};function Ga(e,t){return Gn(e,t.scene,{theme:t.theme,pointer:t.pointer,touch:t.touch,selection:!0,width:t.width,height:t.height})}function qa(e,t){return ke(e,{theme:t.theme,width:t.width,height:t.height})}function Ot(e,t){let n=e.getBoundingClientRect(),r=qn(e.clientWidth||n.width)??t.width,i=qn(e.clientHeight||n.height)??Math.max(Math.round(r*(t.height/Math.max(t.width,1))),280);return{width:r,height:i}}function qn(e){return Number.isFinite(e)&&e>0?Math.round(e):void 0}function Xn(e){if(typeof e.empty=="function"){e.empty();return}e.replaceChildren()}var Qe=class extends E.Plugin{settings=wt;async onload(){await this.loadSettings(),this.registerMarkdownCodeBlockProcessor("worldorbit",(t,n,r)=>{let i=new jt(this.app,this,t,n,r);r.addChild(i)}),this.addCommand({id:"insert-solar-system-example",name:"Insert Solar System Example",editorCheckCallback:(t,n)=>(t||Xa(n),!0)}),this.addSettingTab(new Pt(this.app,this))}async loadSettings(){let t=await this.loadData();this.settings={...wt,...t}}async saveSettings(){await this.saveData(this.settings)}},jt=class extends E.MarkdownRenderChild{app;plugin;source;context;navigationContext=null;embeddedView=null;resizeObserver=null;intersectionObserver=null;pendingFrameId=null;cleanupComponent=new E.Component;rootEl;toolbarEl;statusEl;actionsEl;hostEl;diagnosticsEl;renderState="idle";loadedSource=null;scene=null;diagnostics=[];constructor(t,n,r,i,o){super(i),this.app=t,this.plugin=n,this.source=r,this.context=o}onload(){this.renderShell()}onunload(){this.renderState="destroyed",this.cancelPendingRender(),this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.resizeObserver?.disconnect(),this.resizeObserver=null,this.destroyEmbeddedView(),this.cleanupComponent.unload(),this.rootEl?.detach()}renderShell(){if(this.containerEl.empty(),this.navigationContext=An(this.context,this.containerEl),this.rootEl=this.containerEl.createDiv({cls:"worldorbit-obsidian-block"}),this.toolbarEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-toolbar"}),this.statusEl=this.toolbarEl.createSpan({cls:"worldorbit-obsidian-status",text:"Preparing WorldOrbit block..."}),this.actionsEl=this.toolbarEl.createDiv({cls:"worldorbit-obsidian-actions"}),this.hostEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-host is-locked"}),this.diagnosticsEl=this.rootEl.createDiv({cls:"worldorbit-obsidian-diagnostics"}),this.attachResizeObserver(),!this.source.trim()){this.statusEl.setText("Empty WorldOrbit block"),this.renderState="idle",this.renderActions(),this.renderEmptyState();return}this.statusEl.setText("Preview will render when this block becomes visible."),this.renderPlaceholder(),this.renderActions(),this.scheduleLazyRender()}scheduleLazyRender(){if(this.intersectionObserver?.disconnect(),typeof IntersectionObserver>"u"){this.queueRender();return}this.intersectionObserver=new IntersectionObserver(t=>{t.some(n=>n.isIntersecting)&&(this.intersectionObserver?.disconnect(),this.intersectionObserver=null,this.queueRender())}),this.intersectionObserver.observe(this.rootEl)}queueRender(){this.renderState!=="idle"||this.pendingFrameId!==null||(this.renderState="queued",this.statusEl.setText("Preparing preview..."),this.pendingFrameId=window.requestAnimationFrame(()=>{this.pendingFrameId=null,this.ensureRendered()}))}ensureRendered(){if(this.renderState==="destroyed"||this.scene||this.loadedSource)return;let t=jn(this.source);if(this.loadedSource=t.ok?t.value:null,this.diagnostics=this.filterDiagnostics(t.diagnostics),this.diagnosticsEl.empty(),!t.ok||!t.value){this.renderState="rendered-static",this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"WorldOrbit could not be rendered. Check the diagnostics below."}),this.renderDiagnostics(this.diagnostics,!0),this.renderActions();return}this.scene=Be(t.value.document),this.mountStaticScene(),this.renderDiagnostics(this.diagnostics,!1),this.renderActions(),this.plugin.settings.embeddedInteraction==="enabled"&&!E.Platform.isMobile?this.mountInteractiveIfNeeded():(this.renderState="rendered-static",this.statusEl.setText(this.diagnostics.length?qe(this.diagnostics):"Rendered"))}renderActions(){if(this.actionsEl.empty(),this.createIconButton("Help","help-circle",()=>{new Mt(this.app).open()}),!this.source.trim()||(this.plugin.settings.showFullscreenButton&&this.createToolbarButton("Open fullscreen",!1,()=>{this.openFullscreen()}),!this.scene))return;let t=this.renderState==="interactive-mounted";this.createToolbarButton(t?"Lock interaction":"Activate interaction",!t,()=>{if(t){this.mountStaticScene(),this.renderState="rendered-static",this.hostEl.toggleClass("is-locked",!0),this.statusEl.setText(this.diagnostics.length?qe(this.diagnostics):"Rendered"),this.renderActions();return}this.mountInteractiveIfNeeded()})}renderPlaceholder(){this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"Preview loads when the block becomes visible. Use fullscreen to render immediately."})}renderEmptyState(){this.destroyEmbeddedView(),this.hostEl.empty(),this.hostEl.createDiv({cls:"worldorbit-obsidian-empty",text:"Type or paste a WorldOrbit document to start. Use the help button or the example command for a ready-made block."}),this.hostEl.createEl("pre",{cls:"worldorbit-obsidian-example",text:["schema 2.5","","system Sol","","object star Sun","","object planet Earth"," orbit Sun"," semiMajor 1au"].join(`
105
+ `)}).setAttr("aria-label","WorldOrbit quick start example")}mountStaticScene(){this.scene&&(this.hostEl.empty(),this.embeddedView?.destroy(),this.embeddedView=new ce({container:this.hostEl,scene:this.scene,theme:Je(),interactive:!1,enablePointer:!0,enableTouch:!0}),this.embeddedView.mount(),this.hostEl.toggleClass("is-locked",!0))}mountInteractiveIfNeeded(){this.scene||this.ensureRendered(),this.scene&&(this.embeddedView?this.embeddedView.setInteractive(!0):(this.embeddedView=new ce({container:this.hostEl,scene:this.scene,theme:Je(),interactive:!0,enablePointer:!0,enableTouch:!0}),this.embeddedView.mount()),this.renderState="interactive-mounted",this.hostEl.toggleClass("is-locked",!1),this.statusEl.setText("Interactive preview active"),this.renderActions())}renderDiagnostics(t,n){if(this.diagnosticsEl.empty(),!t.length){this.diagnosticsEl.detach();return}this.diagnosticsEl.parentElement||this.rootEl.appendChild(this.diagnosticsEl);for(let r of t){let i=this.diagnosticsEl.createDiv({cls:"worldorbit-obsidian-diagnostic"});i.dataset.severity=r.severity;let o=i.createDiv({cls:"worldorbit-obsidian-diagnostic-meta"});o.createSpan({cls:"worldorbit-obsidian-diagnostic-badge",text:r.severity}),o.createSpan({text:r.source}),o.createSpan({text:En(r)}),i.createDiv({cls:"worldorbit-obsidian-diagnostic-message",text:r.message});let a=!!(this.navigationContext&&r.line);if(a){let s=i.createDiv({cls:"worldorbit-obsidian-diagnostic-actions"}).createEl("button",{cls:"worldorbit-obsidian-button",text:"Go to error"});s.disabled=!a,this.cleanupComponent.registerDomEvent(s,"click",()=>{this.handleDiagnosticNavigation(r)})}}n&&this.statusEl.setText(qe(t))}async openFullscreen(){if(this.scene||this.ensureRendered(),!this.scene){new E.Notice("WorldOrbit: this block could not be rendered.");return}new Et(this.app,this.scene).open()}filterDiagnostics(t){return this.plugin.settings.showWarnings?t:t.filter(n=>n.source!=="validate")}async handleDiagnosticNavigation(t){if(!this.navigationContext){new E.Notice("WorldOrbit: no editor position is available for this block.");return}await Dn(this.app,this.navigationContext.sourcePath,this.navigationContext.contentStartLine,t)||new E.Notice("WorldOrbit: could not focus the diagnostic location.")}attachResizeObserver(){this.resizeObserver?.disconnect(),!(typeof ResizeObserver>"u")&&(this.resizeObserver=new ResizeObserver(()=>{this.embeddedView?.resize()}),this.resizeObserver.observe(this.hostEl))}cancelPendingRender(){this.pendingFrameId!==null&&(window.cancelAnimationFrame(this.pendingFrameId),this.pendingFrameId=null)}destroyEmbeddedView(){this.embeddedView?.destroy(),this.embeddedView=null}createToolbarButton(t,n,r){let i=this.actionsEl.createEl("button",{cls:`worldorbit-obsidian-button${n?" mod-cta":""}`,text:t});return this.cleanupComponent.registerDomEvent(i,"click",r),i}createIconButton(t,n,r){let i=this.actionsEl.createEl("button",{cls:"worldorbit-obsidian-button worldorbit-obsidian-icon-button",attr:{"aria-label":t,title:t}});return(0,E.setIcon)(i,n),this.cleanupComponent.registerDomEvent(i,"click",r),i}},Et=class extends E.Modal{scene;embeddedView=null;constructor(t,n){super(t),this.scene=n}onOpen(){this.modalEl.addClass("worldorbit-obsidian-modal"),this.setTitle("WorldOrbit");let t=this.contentEl.createDiv({cls:"worldorbit-obsidian-modal-host"});this.embeddedView=new ce({container:t,scene:this.scene,theme:Je(),interactive:!0,enablePointer:!0,enableTouch:!0}),this.embeddedView.mount()}onClose(){this.embeddedView?.destroy(),this.embeddedView=null,this.contentEl.empty()}},Mt=class extends E.Modal{constructor(t){super(t)}onOpen(){this.setTitle(Mn),this.contentEl.empty();let t=this.contentEl.createDiv({cls:"worldorbit-obsidian-help"});t.createEl("p",{text:"Paste a fenced worldorbit block into a note to start rendering immediately."}),t.createEl("pre",{cls:"worldorbit-obsidian-example",text:["```worldorbit","schema 2.5","","system Sol","","object star Sun","","object planet Earth"," orbit Sun"," semiMajor 1au","```"].join(`
106
+ `)});let n=t.createEl("ul");for(let r of["`object planet NAME` creates a body","`orbit TARGET` places it around another object","`semiMajor 1au` or `distance 384400km` controls orbit size","`color #6fa8ff`, `radius`, `mass`, and `kind` add detail","Locked mode keeps note scrolling safe until you activate interaction"])n.createEl("li",{text:r})}onClose(){this.contentEl.empty()}},Pt=class extends E.PluginSettingTab{plugin;constructor(t,n){super(t,n),this.plugin=n}display(){let{containerEl:t}=this;t.empty(),new E.Setting(t).setName("Embedded interaction").setDesc("Choose whether embedded previews start locked or immediately interactive. Locked mode keeps note scrolling safe until you explicitly activate pan and zoom.").addDropdown(n=>n.addOption("locked","Locked by default").addOption("enabled","Interactive by default").setValue(this.plugin.settings.embeddedInteraction).onChange(async r=>{this.plugin.settings.embeddedInteraction=r,await this.plugin.saveSettings()})),new E.Setting(t).setName("Show validator diagnostics").setDesc("Display diagnostics produced by the validation phase under rendered WorldOrbit blocks.").addToggle(n=>n.setValue(this.plugin.settings.showWarnings).onChange(async r=>{this.plugin.settings.showWarnings=r,await this.plugin.saveSettings()})),new E.Setting(t).setName("Show fullscreen button").setDesc("Offer a larger interactive view for code blocks on small screens.").addToggle(n=>n.setValue(this.plugin.settings.showFullscreenButton).onChange(async r=>{this.plugin.settings.showFullscreenButton=r,await this.plugin.saveSettings()}))}};function Xa(e){let t=Pn(),n=e.getCursor(),r=e.lineCount(),i=n.line>0,o=n.line<r-1,a=`${i?`
107
+ `:""}${t}${o?`
108
+ `:""}`;e.replaceRange(a,n)}var Ka=Qe;
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "worldorbit",
3
+ "name": "WorldOrbit",
4
+ "version": "3.2.1",
5
+ "minAppVersion": "1.5.0",
6
+ "description": "Render WorldOrbit code blocks in Obsidian with diagnostics and interactive 2D previews.",
7
+ "author": "Hanjo Winter",
8
+ "isDesktopOnly": false
9
+ }