worldorbit 2.5.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 (113) hide show
  1. package/LICENSE.md +5 -0
  2. package/README.md +250 -0
  3. package/dist/browser/core/dist/index.js +4009 -0
  4. package/dist/browser/markdown/dist/index.js +3951 -0
  5. package/dist/browser/viewer/dist/index.js +5981 -0
  6. package/dist/constants.d.ts +8 -0
  7. package/dist/constants.js +84 -0
  8. package/dist/errors.d.ts +7 -0
  9. package/dist/errors.js +16 -0
  10. package/dist/index.d.ts +18 -0
  11. package/dist/index.js +25 -0
  12. package/dist/normalize.d.ts +2 -0
  13. package/dist/normalize.js +243 -0
  14. package/dist/parse.d.ts +2 -0
  15. package/dist/parse.js +126 -0
  16. package/dist/render.d.ts +6 -0
  17. package/dist/render.js +683 -0
  18. package/dist/tokenize.d.ts +4 -0
  19. package/dist/tokenize.js +68 -0
  20. package/dist/types.d.ts +208 -0
  21. package/dist/types.js +1 -0
  22. package/dist/unpkg/core/dist/index.js +4081 -0
  23. package/dist/unpkg/markdown/dist/index.js +3979 -0
  24. package/dist/unpkg/test.html +1 -0
  25. package/dist/unpkg/viewer/dist/index.js +6038 -0
  26. package/dist/unpkg/worldorbit-core.min.js +5 -0
  27. package/dist/unpkg/worldorbit-markdown.min.js +81 -0
  28. package/dist/unpkg/worldorbit-viewer.min.js +232 -0
  29. package/dist/unpkg/worldorbit.d.ts +2 -0
  30. package/dist/unpkg/worldorbit.js +2 -0
  31. package/dist/unpkg/worldorbit.min.js +236 -0
  32. package/dist/validate.d.ts +2 -0
  33. package/dist/validate.js +31 -0
  34. package/dist/viewer-state.d.ts +16 -0
  35. package/dist/viewer-state.js +130 -0
  36. package/dist/viewer.d.ts +2 -0
  37. package/dist/viewer.js +434 -0
  38. package/package.json +64 -0
  39. package/packages/core/README.md +13 -0
  40. package/packages/core/dist/atlas-edit.d.ts +11 -0
  41. package/packages/core/dist/atlas-edit.js +210 -0
  42. package/packages/core/dist/diagnostics.d.ts +10 -0
  43. package/packages/core/dist/diagnostics.js +109 -0
  44. package/packages/core/dist/draft-parse.d.ts +3 -0
  45. package/packages/core/dist/draft-parse.js +642 -0
  46. package/packages/core/dist/draft.d.ts +15 -0
  47. package/packages/core/dist/draft.js +343 -0
  48. package/packages/core/dist/errors.d.ts +7 -0
  49. package/packages/core/dist/errors.js +16 -0
  50. package/packages/core/dist/format.d.ts +4 -0
  51. package/packages/core/dist/format.js +364 -0
  52. package/packages/core/dist/index.d.ts +28 -0
  53. package/packages/core/dist/index.js +44 -0
  54. package/packages/core/dist/load.d.ts +4 -0
  55. package/packages/core/dist/load.js +130 -0
  56. package/packages/core/dist/markdown.d.ts +2 -0
  57. package/packages/core/dist/markdown.js +37 -0
  58. package/packages/core/dist/normalize.d.ts +2 -0
  59. package/packages/core/dist/normalize.js +304 -0
  60. package/packages/core/dist/parse.d.ts +2 -0
  61. package/packages/core/dist/parse.js +133 -0
  62. package/packages/core/dist/scene.d.ts +3 -0
  63. package/packages/core/dist/scene.js +1484 -0
  64. package/packages/core/dist/schema.d.ts +8 -0
  65. package/packages/core/dist/schema.js +298 -0
  66. package/packages/core/dist/tokenize.d.ts +4 -0
  67. package/packages/core/dist/tokenize.js +68 -0
  68. package/packages/core/dist/types.d.ts +382 -0
  69. package/packages/core/dist/types.js +1 -0
  70. package/packages/core/dist/validate.d.ts +2 -0
  71. package/packages/core/dist/validate.js +56 -0
  72. package/packages/editor/dist/editor.d.ts +2 -0
  73. package/packages/editor/dist/editor.js +2620 -0
  74. package/packages/editor/dist/index.d.ts +2 -0
  75. package/packages/editor/dist/index.js +1 -0
  76. package/packages/editor/dist/types.d.ts +53 -0
  77. package/packages/editor/dist/types.js +1 -0
  78. package/packages/markdown/README.md +9 -0
  79. package/packages/markdown/dist/html.d.ts +3 -0
  80. package/packages/markdown/dist/html.js +57 -0
  81. package/packages/markdown/dist/index.d.ts +4 -0
  82. package/packages/markdown/dist/index.js +3 -0
  83. package/packages/markdown/dist/rehype.d.ts +10 -0
  84. package/packages/markdown/dist/rehype.js +49 -0
  85. package/packages/markdown/dist/remark.d.ts +9 -0
  86. package/packages/markdown/dist/remark.js +28 -0
  87. package/packages/markdown/dist/types.d.ts +11 -0
  88. package/packages/markdown/dist/types.js +1 -0
  89. package/packages/viewer/README.md +12 -0
  90. package/packages/viewer/dist/atlas-state.d.ts +12 -0
  91. package/packages/viewer/dist/atlas-state.js +251 -0
  92. package/packages/viewer/dist/atlas-viewer.d.ts +2 -0
  93. package/packages/viewer/dist/atlas-viewer.js +448 -0
  94. package/packages/viewer/dist/custom-element.d.ts +1 -0
  95. package/packages/viewer/dist/custom-element.js +64 -0
  96. package/packages/viewer/dist/embed.d.ts +20 -0
  97. package/packages/viewer/dist/embed.js +138 -0
  98. package/packages/viewer/dist/index.d.ts +9 -0
  99. package/packages/viewer/dist/index.js +8 -0
  100. package/packages/viewer/dist/minimap.d.ts +3 -0
  101. package/packages/viewer/dist/minimap.js +63 -0
  102. package/packages/viewer/dist/render.d.ts +6 -0
  103. package/packages/viewer/dist/render.js +585 -0
  104. package/packages/viewer/dist/theme.d.ts +4 -0
  105. package/packages/viewer/dist/theme.js +98 -0
  106. package/packages/viewer/dist/tooltip.d.ts +3 -0
  107. package/packages/viewer/dist/tooltip.js +154 -0
  108. package/packages/viewer/dist/types.d.ts +256 -0
  109. package/packages/viewer/dist/types.js +1 -0
  110. package/packages/viewer/dist/viewer-state.d.ts +19 -0
  111. package/packages/viewer/dist/viewer-state.js +162 -0
  112. package/packages/viewer/dist/viewer.d.ts +2 -0
  113. package/packages/viewer/dist/viewer.js +1156 -0
@@ -0,0 +1,5 @@
1
+ "use strict";var WorldOrbitCore=(()=>{var ke=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Xt=Object.prototype.hasOwnProperty;var Ht=(e,t)=>{for(var n in t)ke(e,n,{get:t[n],enumerable:!0})},Zt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Kt(t))!Xt.call(e,i)&&i!==n&&ke(e,i,{get:()=>t[i],enumerable:!(r=Gt(t,i))||r.enumerable});return e};var Jt=e=>Zt(ke({},"__esModule",{value:!0}),e);var bi={};Ht(bi,{WORLDORBIT_FIELD_KEYS:()=>Je,WORLDORBIT_FIELD_SCHEMAS:()=>Me,WORLDORBIT_OBJECT_TYPES:()=>G,WorldOrbitError:()=>d,cloneAtlasDocument:()=>xe,createDiagnostic:()=>rt,createEmptyAtlasDocument:()=>Ve,detectWorldOrbitSchemaVersion:()=>Xe,diagnosticFromError:()=>$,extractWorldOrbitBlocks:()=>Wt,formatAtlasDocument:()=>Ne,formatDocument:()=>Ie,formatDraftDocument:()=>Re,getAtlasDocumentNode:()=>Ue,getFieldSchema:()=>S,isKnownFieldKey:()=>K,listAtlasDocumentPaths:()=>Et,load:()=>hi,loadWorldOrbitSource:()=>Oe,loadWorldOrbitSourceWithDiagnostics:()=>He,materializeAtlasDocument:()=>_,materializeDraftDocument:()=>vt,normalizeDocument:()=>A,normalizeWithDiagnostics:()=>it,parse:()=>Ct,parseSafe:()=>yi,parseWithDiagnostics:()=>ce,parseWorldOrbit:()=>P,parseWorldOrbitAtlas:()=>je,parseWorldOrbitDraft:()=>kt,removeAtlasDocumentNode:()=>Nt,render:()=>mi,renderDocumentToScene:()=>B,resolveAtlasDiagnosticPath:()=>Ge,resolveAtlasDiagnostics:()=>Ye,rotatePoint:()=>ft,stringify:()=>gi,supportsObjectType:()=>Se,tokenizeLine:()=>Qe,tokenizeLineDetailed:()=>z,unitFamilyAllowsUnit:()=>Ae,updateAtlasDocumentNode:()=>Pt,upgradeDocumentToDraftV2:()=>we,upgradeDocumentToV2:()=>Q,upsertAtlasDocumentNode:()=>qe,validateAtlasDocumentWithDiagnostics:()=>Rt,validateDocument:()=>M,validateDocumentWithDiagnostics:()=>le});var d=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 Y=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],k=Y.filter(e=>e!=="system"),Qt=["star","planet","moon","asteroid","comet","structure","phenomenon"],Ze=["structure","phenomenon"],E=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],en=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function y(e,t){return{key:e,...t}}var G=new Set(Y),Me=new Map([y("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:E}),y("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:E,unitFamily:"distance"}),y("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:E,unitFamily:"distance"}),y("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:E}),y("period",{kind:"unit",placement:!0,arity:"single",objectTypes:E,unitFamily:"duration"}),y("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:E,unitFamily:"angle"}),y("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:E,unitFamily:"angle"}),y("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:E,unitFamily:"angle"}),y("at",{kind:"string",placement:!0,arity:"single",objectTypes:Ze}),y("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Ze}),y("free",{kind:"string",placement:!0,arity:"single",objectTypes:en}),y("kind",{kind:"string",placement:!1,arity:"single",objectTypes:k}),y("class",{kind:"string",placement:!1,arity:"single",objectTypes:k}),y("culture",{kind:"string",placement:!1,arity:"single",objectTypes:k}),y("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Y}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:Y}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:Qt}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Y}),y("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:k,unitFamily:"radius"}),y("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:k,unitFamily:"mass"}),y("density",{kind:"unit",placement:!1,arity:"single",objectTypes:k,unitFamily:"generic"}),y("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:k,unitFamily:"generic"}),y("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:k,unitFamily:"generic"}),y("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:k}),y("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),y("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("on",{kind:"string",placement:!1,arity:"single",objectTypes:k}),y("source",{kind:"string",placement:!1,arity:"single",objectTypes:k}),y("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:k,unitFamily:"duration"})].map(e=>[e.key,e])),Je=new Set(Me.keys());function S(e){return Me.get(e)}function K(e){return Je.has(e)}function Se(e,t){return e.objectTypes.includes(t)}function Ae(e,t){switch(e){case"distance":return t===null||["au","km","re","sol"].includes(t);case"radius":return t===null||["km","re","sol"].includes(t);case"mass":return t===null||["me","sol"].includes(t);case"duration":return t===null||["h","d","y"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Qe(e){return z(e).map(t=>t.value)}function z(e,t={}){let n=[],r=t.columnOffset??0,i="",s=null,o=!1,a=!1,c=null,l=()=>{s!==null&&(n.push({value:i,column:s,quoted:o}),i="",s=null,o=!1)};for(let u=0;u<e.length;u++){let f=e[u],p=r+u+1;if(a&&f==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(f==='"'){a?a=!1:(s===null&&(s=p),o=!0,c=p,a=!0);continue}if(!a&&/\s/.test(f)){l();continue}s===null&&(s=p),i+=f}if(a)throw new d("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function oe(e){return e.match(/^\s*/)?.[0].length??0}function P(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,s=null;for(let o=0;o<t.length;o++){let a=t[o],c=o+1;if(!a.trim())continue;let l=oe(a),u=z(a.slice(l),{line:c,columnOffset:l});if(u.length!==0){if(l===0){i=!1,s=null;let f=tn(u,c);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",c,l+1);if(u.length===1&&u[0].value==="info"){i=!0,s=l;continue}i&&l<=(s??0)&&(i=!1),i?r.infoEntries.push(on(u,c)):r.blockFields.push(rn(u,c))}}return{type:"document",objects:n}}function tn(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!G.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:nn(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function nn(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=S(i.value);if(!s)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(s.arity==="multiple")for(;r<e.length&&!K(e[r].value);)o.push(e[r]),r++;else{let a=e[r];a&&(o.push(a),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(a=>a.value),location:{line:t,column:i.column}})}return n}function rn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!S(e[0].value))throw new d(`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 on(e,t){if(e.length<2)throw new d("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 et=/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/,sn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),an=/^[A-Za-z][A-Za-z0-9+.-]*:/;function A(e){let t=null,n=[];for(let r of e.objects){let i=cn(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",system:t,objects:n}}function cn(e){let t=[...e.inlineFields,...e.blockFields];ln(e.objectType,t);let n=un(t),r=dn(e.objectType,n),i=fn(n),s=hn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,properties:i,info:s}:{type:e.objectType,id:e.name,properties:i,placement:r,info:s}}function ln(e,t){for(let n of t){let r=S(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Se(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function un(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function dn(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),s=t.has("free"),o=[n,r,i,s].filter(Boolean).length;if(o>1){let a=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",a?.location)}if(e==="system"&&o>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:se(t,"orbit"),distance:W(t,"distance"),semiMajor:W(t,"semiMajor"),eccentricity:bn(t,"eccentricity"),period:W(t,"period"),angle:W(t,"angle"),inclination:W(t,"inclination"),phase:W(t,"phase")};if(r){let a=ae(t,"at"),c=se(t,"at");return{mode:"at",target:c,reference:yn(c,a.location)}}if(i)return{mode:"surface",target:se(t,"surface")};if(s){let a=se(t,"free"),c=gn(a);return{mode:"free",distance:c??void 0,descriptor:c?void 0:a}}return null}function fn(e){let t={};for(let[n,r]of e.entries()){let i=S(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=wn(r);break;case"number":t[n]=nt(C(r),n,r.location);break;case"unit":t[n]=tt(C(r),r.location,n);break;case"string":t[n]=pn(n,r);break}}return t}function pn(e,t){let n=t.values.join(" ").trim();return e==="image"&&mn(n,t.location),n}function mn(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(an);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function hn(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function yn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.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 d.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 tt(e,t,n){let r=e.match(et);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=S(n);if(s?.unitFamily&&!Ae(s.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function gn(e){let t=e.match(et);return t?{value:Number(t[1]),unit:t[2]??null}:null}function W(e,t){if(!e.has(t))return;let n=ae(e,t);return tt(C(n),n.location,t)}function bn(e,t){if(!e.has(t))return;let n=ae(e,t);return nt(C(n),t,n.location)}function nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function wn(e){let t=C(e).toLowerCase(),n=sn.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function ae(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function se(e,t){return C(ae(e,t))}function C(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var In=new Set(["star","planet","moon","asteroid","comet"]);function M(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`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 d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!In.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&jn(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&vn(r,r.placement.reference,t))}}function jn(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function vn(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function rt(e){return{...e}}function $(e,t,n=`${t}.failed`){return e instanceof d?{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)}}function ce(e){let t;try{t=P(e)}catch(r){return{ok:!1,value:null,diagnostics:[$(r,"parse")]}}let n;try{n=A(t)}catch(r){return{ok:!1,value:null,diagnostics:[$(r,"normalize")]}}try{M(n)}catch(r){return{ok:!1,value:null,diagnostics:[$(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function it(e){try{return{ok:!0,value:A(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[$(t,"normalize")]}}}function le(e){try{return M(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[$(t,"validate")]}}}var Fe=1495978707e-1,xn=6371,On=695700,ut=.68,$n=.2,dt=28;function B(e,t={}){let n=Dn(t),r=n.width,i=n.height,s=n.padding,o=Tn(e),a=Mn(e,t.projection),c=Sn(o,t.scaleModel),l=Fn(o),u=e.system?.id??null,f=new Map(e.objects.map(m=>[m.id,m])),p=cr(e.objects,f),h=new Map,g=[],b=[],x=[],j=[],v=[],T=new Map,U=new Map;for(let m of e.objects){let D=m.placement;if(!D){x.push(m);continue}if(D.mode==="orbit"){at(U,D.target,m);continue}if(D.mode==="surface"){at(T,D.target,m);continue}if(D.mode==="at"){v.push(m);continue}j.push(m)}let F=j.length>0?r*.42:r/2,te=i/2,L={orbitChildren:U,surfaceChildren:T,objectMap:f,spacingFactor:l,projection:a,scaleModel:c},$e=x.find(m=>m.type==="star")??x[0]??null;$e&&Le($e,F,te,0,h,g,b,L);let Te=x.filter(m=>m.id!==$e?.id);if(Te.length>0){let m=Math.min(r,i)*.28*l*c.orbitDistanceMultiplier;Te.forEach((D,w)=>{let De=Z(w,Te.length,-Math.PI/2),R=J(De,m,a,1);Le(D,F+R.x,te+R.y,0,h,g,b,L)})}j.forEach((m,D)=>{let w=r-s-140-mr(m.placement?.mode==="free"?m.placement.distance:void 0,c),De=Math.max(76,(i-s*2-180)/Math.max(1,j.length)*l)*c.freePlacementMultiplier,R=s+92+D*De;h.set(m.id,{object:m,x:w,y:R,radius:pe(m,0,c),sortKey:he(w,R,0)}),b.push({object:m,groupId:p.groupIds.get(m.id)??null,x1:w-60,y1:R,x2:w-18,y2:R,mode:"free"}),de(m,h,g,b,L,1)}),v.forEach((m,D)=>{if(h.has(m.id)||!m.placement||m.placement.mode!=="at")return;let w=sr(m.placement.reference,h,f,D,v.length,r,i,s,L);h.set(m.id,{object:m,x:w.x,y:w.y,radius:pe(m,2,c),sortKey:he(w.x,w.y,2),anchorX:w.anchorX,anchorY:w.anchorY}),w.anchorX!==void 0&&w.anchorY!==void 0&&b.push({object:m,groupId:p.groupIds.get(m.id)??null,x1:w.anchorX,y1:w.anchorY,x2:w.x,y2:w.y,mode:"at"}),de(m,h,g,b,L,2)});let q=[...h.values()].map(m=>Ln(m,c,p)),ne=g.map(m=>En(m,p.groupIds.get(m.object.id)??null)),re=b.map(m=>Pn(m)),ie=Nn(q,i,c.labelMultiplier),Vt=Rn(ne,re,q,ie),Ut=zn(q,ne,re,ie,p),qt=Bn(e,a,n.preset,p,f),Yt=Qn(r,i,q,ne,re,ie);return{width:r,height:i,padding:s,renderPreset:n.preset,projection:a,scaleModel:c,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${ct(a)} view - ${ct(o)} layout`,systemId:u,viewMode:a,layoutPreset:o,metadata:{format:e.format,version:e.version,view:a,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Yt,layers:Vt,groups:Ut,viewpoints:qt,objects:q,orbitVisuals:ne,leaders:re,labels:ie}}function ft(e,t,n){let r=be(n),i=Math.cos(r),s=Math.sin(r),o=e.x-t.x,a=e.y-t.y;return{x:t.x+o*i-a*s,y:t.y+o*s+a*i}}function Tn(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 Dn(e){let t=kn(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function kn(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 Mn(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Sn(e,t){return{...An(e),...t}}function An(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Fn(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ln(e,t,n){let{object:r,x:i,y:s,radius:o,sortKey:a,anchorX:c,anchorY:l}=e;return{renderId:ge(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,x:i,y:s,radius:o,visualRadius:pr(r,o,t),sortKey:a,anchorX:c,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:yr(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function En(e,t){return{renderId:`${ge(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0}}function Pn(e){return{renderId:`${ge(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Nn(e,t,n){let r=[],i=[],s=[...e].filter(o=>!o.hidden).sort((o,a)=>o.sortKey-a.sortKey);for(let o of s){let a=o.y>t*.62?-1:1,c=gr(o,n),l=o.y+a*(o.radius+18*n),u=l+a*(16*n),f=ot(o.x,l,u,c,a),p=0;for(;i.some(h=>dr(h,f))&&p<10;)l+=a*14*n,u+=a*14*n,f=ot(o.x,l,u,c,a),p+=1;i.push(f),r.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,label:o.label,secondaryLabel:o.secondaryLabel,x:o.x,y:l,secondaryY:u,textAnchor:"middle",direction:a<0?"above":"below",hidden:o.hidden})}return r}function Rn(e,t,n,r){let i=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),s=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:i},{id:"orbits-front",renderIds:s},{id:"objects",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function zn(e,t,n,r,i){let s=new Map,o=a=>{if(!a)return null;let c=s.get(a);if(c)return c;let l=i.groupRoots.get(a)??null,u={renderId:a,rootObjectId:l,label:l??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:H(0,0,0,0)};return s.set(a,u),u};for(let a of e){let c=o(a.groupId);c&&!a.hidden&&c.objectIds.push(a.objectId)}for(let a of t){let c=o(a.groupId);c&&!a.hidden&&c.orbitIds.push(a.objectId)}for(let a of n){let c=o(a.groupId);c&&!a.hidden&&c.leaderIds.push(a.objectId)}for(let a of r){let c=o(a.groupId);c&&!a.hidden&&c.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=lr(a,e,t,n,r);return[...s.values()].sort((a,c)=>a.label.localeCompare(c.label))}function Bn(e,t,n,r,i){let s=_n(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...h]=l.split(".");if(f!=="viewpoint"||!p||h.length===0)continue;let g=Hn(p);if(!g)continue;let b=h.join(".").toLowerCase(),x=o.get(g)??{id:g};Wn(x,b,u,t,n,r,i),o.set(g,x)}let a=[...o.values()].map(l=>Cn(l,t,n,i)).filter(Boolean),c=a.findIndex(l=>l.id===s.id);return c>=0?a.splice(c,1,{...s,...a[c],layers:{...s.layers,...a[c].layers},filter:a[c].filter??s.filter,generated:!1}):a.unshift(s),a.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function _n(e,t,n){return{id:"overview",label:e.system?.properties.title?`${String(e.system.properties.title)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Wn(e,t,n,r,i,s,o){let a=n.trim();switch(t){case"label":case"title":a&&(e.label=a);return;case"summary":case"description":a&&(e.summary=a);return;case"focus":case"object":a&&(e.focus=a);return;case"select":case"selection":a&&(e.select=a);return;case"projection":case"view":e.projection=Un(a)??r;return;case"preset":e.preset=qn(a)??i;return;case"rotation":case"angle":e.rotationDeg=pt(a)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Yn(a);return;case"layers":e.layers=Gn(a);return;case"query":e.filter={...e.filter??ue(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??ue(),objectTypes:Kn(a)};return;case"tags":e.filter={...e.filter??ue(),tags:ye(a)};return;case"groups":e.filter={...e.filter??ue(),groupIds:Xn(a,s,o)};return}}function Cn(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,s=e.select&&r.has(e.select)?e.select:i,o=Vn(e.filter),a=e.label?.trim()||Zn(e.id);return{id:e.id,label:a,summary:e.summary?.trim()||Jn(a,i,o),objectId:i,selectedObjectId:s,projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function ue(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Vn(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 Un(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function qn(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function pt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Yn(e){let t=pt(e);return t!==null&&t>0?t:null}function Gn(e){let t={};for(let n of ye(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==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Kn(e){return ye(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Xn(e,t,n){return ye(e).map(r=>r.startsWith("wo-")&&r.endsWith("-group")?r:t.groupIds.has(r)?t.groupIds.get(r)??X(r):(n.has(r),X(r)))}function ye(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Hn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Zn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Jn(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 Qn(e,t,n,r,i,s){let o=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,p)=>{o=Math.min(o,f),a=Math.min(a,p),c=Math.max(c,f),l=Math.max(l,p)};for(let f of r)f.hidden||mt(f,u);for(let f of i)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of n)f.hidden||ht(f,u);for(let f of s)f.hidden||yt(f,u);return!Number.isFinite(o)||!Number.isFinite(a)?H(0,0,e,t):H(o,a,c,l)}function mt(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,s=bt(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,dt*2);for(let o of s)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function H(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 ht(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 yt(e,t){let r=br(e.label,e.secondaryLabel,1);t(e.x-r,e.y-18),t(e.x+r,e.y+8),t(e.x-r,e.secondaryY-14),t(e.x+r,e.secondaryY+8)}function Le(e,t,n,r,i,s,o,a){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:pe(e,r,a.scaleModel),sortKey:he(t,n,r)}),de(e,i,s,o,a,r+1))}function de(e,t,n,r,i,s){let o=t.get(e.id);if(!o)return;let a=[...i.orbitChildren.get(e.id)??[]].sort(er),c=tr(a,o.radius,i.spacingFactor,i.scaleModel);a.forEach((u,f)=>{let p=nr(u,f,a.length,o,c,i);n.push({object:u,parentId:e.id,kind:p.kind,cx:p.cx,cy:p.cy,radius:p.radius,rx:p.rx,ry:p.ry,rotationDeg:p.rotationDeg,band:p.band,bandThickness:p.bandThickness,frontArcPath:p.frontArcPath,backArcPath:p.backArcPath}),Le(u,p.objectX,p.objectY,s,t,n,r,i)});let l=[...i.surfaceChildren.get(e.id)??[]];l.forEach((u,f)=>{let p=Z(f,l.length,-Math.PI/3),h=28*i.spacingFactor,g=J(p,o.radius,i.projection,i.projection==="isometric"?.9:1),b=J(p,o.radius+h,i.projection,i.projection==="isometric"?.9:1),x=o.x+g.x,j=o.y+g.y,v=o.x+b.x,T=o.y+b.y;t.set(u.id,{object:u,x:v,y:T,radius:pe(u,s+1,i.scaleModel),sortKey:he(v,T,s+1),anchorX:x,anchorY:j}),r.push({object:u,groupId:i.objectMap.has(u.id)?X(ur(u,i.objectMap)):null,x1:x,y1:j,x2:v,y2:T,mode:"surface"}),de(u,t,n,r,i,s+1)})}function er(e,t){let n=fe(e),r=fe(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 tr(e,t,n,r){let i=e.map(f=>fe(f)),s=i.filter(f=>f!==null),o=t+56*n*r.orbitDistanceMultiplier,a=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(s.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:o,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a)};let c=Math.min(...s),l=Math.max(...s),u=l-c;return{metrics:i,minMetric:c,maxMetric:l,metricSpread:u,innerPx:o,stepPx:a,pixelSpread:Math.max(a*Math.max(e.length-1,1),a)}}function nr(e,t,n,r,i,s){let o=e.placement,a=e.type==="belt"||e.type==="ring";if(!o||o.mode!=="orbit"){let L=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:L,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-L}}let c=I(typeof o.eccentricity=="number"?o.eccentricity:0,0,.92),l=rr(e,t,i),u=Math.max(l*Math.sqrt(1-c*c),l*.18),f=Pe(o.inclination)??0,p=s.projection==="isometric"?Math.max($n,Math.cos(be(f)))*ut:1,h=Math.max(u*p,l*.14),g=Pe(o.angle)??0,b=l*c,x=It(-b,0,g),j=r.x+x.x,v=r.y+x.y,T=ir(o.phase,t,n),U=wt(j,v,l,h,g,T),F=s.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,te=a?or(e,l,i,s.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:j,cy:F?r.y:v,radius:F?l:void 0,rx:F?void 0:l,ry:F?void 0:h,rotationDeg:g,band:a,bandThickness:te,frontArcPath:s.projection==="isometric"||a?st(j,v,l,h,g,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?st(j,v,l,h,g,Math.PI,Math.PI*2):void 0,objectX:U.x,objectY:U.y}}function rr(e,t,n){let r=fe(e);return r===null?n.innerPx+t*n.stepPx:n.metricSpread>0?n.innerPx+(r-n.minMetric)/n.metricSpread*n.pixelSpread:n.innerPx+Math.log10(r+1)*n.stepPx}function fe(e){return!e.placement||e.placement.mode!=="orbit"?null:me(e.placement.semiMajor??e.placement.distance??null)}function ir(e,t,n){let r=e?Pe(e):null;return r!==null?be(r-90):Z(t,n,-Math.PI/2)}function or(e,t,n,r){let i=me(Ee(e.properties.inner)),s=me(Ee(e.properties.outer));if(i!==null&&s!==null){let a=Math.abs(s-i);if(n.metricSpread>0)return I(a/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(i,s),1e-4);return I(a/c*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function sr(e,t,n,r,i,s,o,a,c){if(e.kind==="lagrange")return ar(e,t,n,s,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=Z(r,i,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=J(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=Z(r,i,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=J(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:s-a-170,y:o-a-86-r*58*c.scaleModel.freePlacementMultiplier}}function ar(e,t,n,r,i){let s=e.secondary?t.get(e.primary):fr(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!s||!o)return{x:r*.7,y:i*.25};let a=o.x-s.x,c=o.y-s.y,l=Math.hypot(a,c)||1,u=a/l,f=c/l,p=-f,h=u,g=I(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-f*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+f*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:s.x-u*g,y:s.y-f*g,anchorX:s.x,anchorY:s.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*g,y:o.y+(f*.5-h*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(f*.5+h*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function cr(e,t){let n=new Map,r=new Map;for(let l of e){let u=gt(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,s=new Map,o=new Map,a=l=>{let u=i.get(l);if(u)return u;let f=new Set,p=[],h=n.get(l)??null;for(;h&&!f.has(h);)p.push(h),f.add(h),h=n.get(h)??null;return i.set(l,p),p},c=l=>{let u=o.get(s.get(l)??"");if(u)return u;let f=n.get(l)??null,p=t.get(l),h=l;return p?.placement&&p.placement.mode!=="free"&&f&&(h=c(f)),h};for(let l of e){a(l.id);let u=c(l.id),f=X(u);s.set(l.id,f),o.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:s,groupRoots:o}}function gt(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 lr(e,t,n,r,i){let s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=(u,f)=>{s=Math.min(s,u),o=Math.min(o,f),a=Math.max(a,u),c=Math.max(c,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&ht(u,l);for(let u of n)!u.hidden&&e.orbitIds.includes(u.objectId)&&mt(u,l);for(let u of r)!u.hidden&&e.leaderIds.includes(u.objectId)&&(l(u.x1,u.y1),l(u.x2,u.y2));for(let u of i)!u.hidden&&e.labelIds.includes(u.objectId)&&yt(u,l);return!Number.isFinite(s)||!Number.isFinite(o)?H(0,0,0,0):H(s,o,a,c)}function ur(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=gt(n,t);if(!i)break;let s=t.get(i);if(!s)break;n=s}return n.id}function ot(e,t,n,r,i){return{left:e-r,right:e+r,top:Math.min(t,n)-(i<0?18:12),bottom:Math.max(t,n)+(i<0?8:12)}}function dr(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function fr(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function pe(e,t,n){let r=hr(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return I((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return I(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return I(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return I(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return I(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return I(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return I(8*i,n.minBodyRadius,n.maxBodyRadius)}}function pr(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 me(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Fe;case"re":return e.value*xn/Fe;case"sol":return e.value*On/Fe;default:return e.value}}function mr(e,t){let n=me(e??null);return n===null||n<=0?0:I(n*96*t.freePlacementMultiplier,0,420)}function hr(e,t){let n=Ee(e);if(!n)return null;let r;switch(n.unit){case"sol":r=I(n.value*22,14,40);break;case"re":r=I(n.value*10,6,18);break;case"km":r=I(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=I(n.value*4,4,20);break}return I(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Ee(e){return!e||typeof e!="object"||!("value"in e)?null:e}function Pe(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Z(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function st(e,t,n,r,i,s,o){let a=bt(e,t,n,r,i,s,o,dt);return a.length===0?"":a.map((c,l)=>`${l===0?"M":"L"} ${lt(c.x)} ${lt(c.y)}`).join(" ")}function bt(e,t,n,r,i,s,o,a){let c=[];for(let l=0;l<=a;l+=1){let u=s+(o-s)*l/a;c.push(wt(e,t,n,r,i,u))}return c}function wt(e,t,n,r,i,s){let o=n*Math.cos(s),a=r*Math.sin(s),c=It(o,a,i);return{x:e+c.x,y:t+c.y}}function It(e,t,n){let r=be(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function J(e,t,n,r){let i=n==="isometric"?ut*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function he(e,t,n){return t*1e3+e+n*.01}function I(e,t,n){return Math.min(Math.max(e,t),n)}function at(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ge(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function X(e){return`${ge(e)}-group`}function yr(e){return typeof e=="string"&&e.trim()?e:void 0}function gr(e,t){let n=e.label.length*4.6*t+18,r=e.secondaryLabel.length*3.9*t+18;return Math.max(n,r,e.visualRadius+18)}function br(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 ct(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function be(e){return e*Math.PI/180}function lt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function Q(e,t={}){let n=B(e,t),r=[],i=jr(e,r),s=vr(e,r),o=Ir(e,n.renderPreset??t.preset??null,n.projection),a=e.system?wr(e,o,i,s,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(c=>!c.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",sourceVersion:e.version,system:a,objects:e.objects.map(xt),diagnostics:r}}function we(e,t={}){return Sr(Q(e,t))}function _(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:Dr(e.system),info:kr(e.system)}:null,objects:e.objects.map(xt)}}function vt(e){return _(e)}function wr(e,t,n,r,i,s){let o=B(e,{preset:s??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:typeof e.system?.properties.title=="string"?e.system.properties.title:null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(xr),annotations:r}}function Ir(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function jr(e,t){let n={};for(let[i,s]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=s);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function vr(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,s,...o]=r.split(".");if(!s||o.length===0)continue;let a=jt(s);if(!a)continue;let c=n.get(a)??{id:a};switch(o.join(".").toLowerCase()){case"label":c.label=i;break;case"target":case"object":c.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":c.body=i;break;case"tags":c.tags=$r(i);break}n.set(a,c)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let s=jt(`${r.id}-notes`);n.has(s)||(n.set(s,{id:s,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${s}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Tr(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function xr(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function xt(e){return{...e,properties:Or(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Or(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 $r(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function jt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Tr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Dr(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),t}function kr(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=Mr(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(" ")??"")}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 Mr(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","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Sr(e){return{...e,version:"2.0-draft"}}var Ot=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Ie(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.0-draft"){if(n==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"?{...e,version:"2.0-draft"}:we(e);return Re(c)}let a=e.version==="2.0"?e:e.version==="2.0-draft"?{...e,version:"2.0"}:Q(e);return Ne(a)}let i=[],s=e;s.system&&i.push(...Ar(s.system));let o=[...s.objects].sort(_e);for(let a of o)i.length>0&&i.push(""),i.push(...Fr(a));return i.join(`
2
+ `)}function Ne(e){let t=["schema 2.0",""];e.system&&t.push(...Tt(e.system));let n=[...e.objects].sort(_e);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Dt(r))}),t.join(`
3
+ `)}function Re(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Tt(t.system));let r=[...t.objects].sort(_e);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,s)=>{s>0&&n.push(""),n.push(...Dt(i))}),n.join(`
4
+ `)}function Ar(e){return ze("system",e.id,e.properties,null,e.info)}function Tt(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${O(e.title)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${O(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${O(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${O(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[s])=>i.localeCompare(s)))t.push(` ${n} ${O(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Pr(n));for(let n of e.annotations)t.push(""),t.push(...Nr(n));return t}function Fr(e){return ze(e.type,e.id,e.properties,e.placement,e.info)}function Dt(e){return ze(`object ${e.type}`,e.id,e.properties,e.placement,e.info)}function ze(e,t,n,r,i){let s=[`${e} ${t}`],o=[...Lr(r),...Er(n)];for(let c of o)s.push(` ${c}`);let a=Object.entries(i).sort(([c],[l])=>c.localeCompare(l));if(a.length>0){o.length>0&&s.push(""),s.push(" info");for(let[c,l]of a)s.push(` ${c} ${O(l)}`)}return s}function Lr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...V("distance",e.distance),...V("semiMajor",e.semiMajor),...zr("eccentricity",e.eccentricity),...V("period",e.period),...V("angle",e.angle),...V("inclination",e.inclination),...V("phase",e.phase)];case"at":return[`at ${Br(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Be(e.distance):e.descriptor??""}`.trim()]}}function Er(e){return Object.keys(e).sort(Wr).map(t=>`${t} ${Rr(e[t])}`)}function Pr(e){let t=[`viewpoint ${e.id}`,` label ${O(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${O(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=_r(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${O(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(O).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Nr(e){let t=[`annotation ${e.id}`,` label ${O(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${O(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(O).join(" ")}`),t}function Rr(e){return Array.isArray(e)?e.map(t=>O(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?O(e):Be(e)}function Be(e){return`${e.value}${e.unit??""}`}function V(e,t){return t?[`${e} ${Be(t)}`]:[]}function zr(e,t){return t===void 0?[]:[`${e} ${t}`]}function Br(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function _r(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","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Wr(e,t){let n=Ot.indexOf(e),r=Ot.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function _e(e,t){let n=$t(e.type),r=$t(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function $t(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function O(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function je(e){return Mt(e,"2.0")}function kt(e){return Mt(e,"2.0-draft")}function Mt(e,t){let n=e.split(/\r?\n/),r=!1,i="2.0",s=null,o=null,a=[],c=!1,l=!1,u=new Set,f=new Set;for(let b=0;b<n.length;b++){let x=n[b],j=b+1;if(!x.trim())continue;let v=oe(x),T=z(x.slice(v),{line:j,columnOffset:v});if(T.length!==0){if(!r){i=Cr(T,j),r=!0;continue}if(v===0){o=Vr(T,j,s,a,u,f,{sawDefaults:c,sawAtlas:l}),o.kind==="system"?s=o.system:o.kind==="defaults"?c=!0:o.kind==="atlas"&&(l=!0);continue}if(!o)throw new d("Indented line without parent atlas section",j,v+1);Kr(o,v,T,j)}}if(!r)throw new d('Missing required atlas schema header "schema 2.0"');let h=A({type:"document",objects:a}).objects;return M({format:"worldorbit",version:"1.0",system:null,objects:h}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:s,objects:h,diagnostics:i==="2.0-draft"&&t==="2.0"?[{code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}]:[]}}function Cr(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||e[1].value.toLowerCase()!=="2.0-draft"&&e[1].value.toLowerCase()!=="2.0")throw new d('Expected atlas header "schema 2.0" or legacy "schema 2.0-draft"',t,e[0]?.column??1);return e[1].value.toLowerCase()==="2.0-draft"?"2.0-draft":"2.0"}function Vr(e,t,n,r,i,s,o){switch(e[0]?.value.toLowerCase()){case"system":if(n)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Ur(e,t);case"defaults":if(!n)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(o.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:n,seenFields:new Set};case"atlas":if(!n)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(o.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:n,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!n)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return qr(e,t,n,i);case"annotation":if(!n)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Yr(e,t,n,s);case"object":return Gr(e,t,r);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Ur(e,t){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},seenFields:new Set}}function qr(e,t,n,r){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let i=Ft(e[1].value);if(!i)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate viewpoint id "${i}"`,t,e[1].column);let s={id:i,label:Lt(i),summary:"",focusObjectId:null,selectedObjectId:null,projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(s),r.add(i),{kind:"viewpoint",viewpoint:s,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Yr(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=Ft(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let s={id:i,label:Lt(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(s),r.add(i),{kind:"annotation",annotation:s,seenFields:new Set}}function Gr(e,t,n){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let r=e[1],i=e[2],s=r.value;if(!G.has(s)||s==="system")throw new d(`Unknown object type "${r.value}"`,t,r.column);let o={type:"object",objectType:s,name:i.value,inlineFields:ai(e.slice(3),t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}};return n.push(o),{kind:"object",objectNode:o,inInfoBlock:!1,infoIndent:null}}function Kr(e,t,n,r){switch(e.kind){case"system":Xr(e,n,r);return;case"defaults":Hr(e,n,r);return;case"atlas":Zr(e,t,n,r);return;case"viewpoint":Jr(e,t,n,r);return;case"annotation":ei(e,n,r);return;case"object":ti(e,t,n,r);return}}function Xr(e,t,n){if(ee(t,e.seenFields,n)!=="title")throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column);e.system.title=N(t,n)}function Hr(e,t,n){let r=ee(t,e.seenFields,n),i=N(t,n);switch(r){case"view":e.system.defaults.view=St(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=At(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Zr(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){if(n.length<2)throw new d("Invalid atlas metadata entry",r,n[0]?.column??1);let i=n[0].value;if(i in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i}"`,r,n[0].column);e.system.atlasMetadata[i]=N(n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Jr(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Qr(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=ee(n,e.seenFields,r),s=N(n,r);switch(i){case"label":e.viewpoint.label=s;return;case"summary":e.viewpoint.summary=s;return;case"focus":e.viewpoint.focusObjectId=s;return;case"select":e.viewpoint.selectedObjectId=s;return;case"projection":e.viewpoint.projection=St(s,r,n[0].column);return;case"preset":e.viewpoint.preset=At(s,r,n[0].column);return;case"zoom":e.viewpoint.zoom=ii(s,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=oi(s,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=ri(n.slice(1),r);return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Qr(e,t,n){let r=ee(t,e.seenFilterFields,n),i=e.viewpoint.filter??si();switch(r){case"query":i.query=N(t,n);break;case"objecttypes":i.objectTypes=ni(t.slice(1),n);break;case"tags":i.tags=We(t.slice(1),n,"tags");break;case"groups":i.groupIds=We(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ei(e,t,n){switch(ee(t,e.seenFields,n)){case"label":e.annotation.label=N(t,n);return;case"target":e.annotation.targetObjectId=N(t,n);return;case"body":e.annotation.body=N(t,n);return;case"tags":e.annotation.tags=We(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function ti(e,t,n,r){if(n.length===1&&n[0].value==="info"){e.inInfoBlock=!0,e.infoIndent=t;return}if(e.inInfoBlock&&t<=(e.infoIndent??0)&&(e.inInfoBlock=!1,e.infoIndent=null),e.inInfoBlock){e.objectNode.infoEntries.push(li(n,r));return}e.objectNode.blockFields.push(ci(n,r))}function ee(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function N(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ni(e,t){if(e.length===0)throw new d("Missing value for atlas field",t);return e.map(n=>{let r=n.value;if(r!=="star"&&r!=="planet"&&r!=="moon"&&r!=="belt"&&r!=="asteroid"&&r!=="comet"&&r!=="ring"&&r!=="structure"&&r!=="phenomenon")throw new d(`Unknown viewpoint object type "${n.value}"`,t,n.column);return r})}function We(e,t,n){if(e.length===0)throw new d(`Missing value for field "${n}"`,t);return e.map(r=>r.value)}function ri(e,t){if(e.length===0)throw new d('Missing value for field "layers"',t);let n={};for(let r of e){let i=!r.value.startsWith("-")&&!r.value.startsWith("!"),s=r.value.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){n["orbits-back"]=i,n["orbits-front"]=i;continue}if(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="objects"||s==="labels"||s==="metadata"){n[s]=i;continue}throw new d(`Unknown layer token "${r.value}"`,t,r.column)}return n}function St(e,t,n){let r=e.toLowerCase();if(r==="topdown"||r==="isometric")return r;throw new d(`Unknown projection "${e}"`,t,n)}function At(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function ii(e,t,n,r){let i=Number(e);if(!Number.isFinite(i)||i<=0)throw new d(`Field "${r}" expects a positive number`,t,n);return i}function oi(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Field "${r}" expects a finite number`,t,n);return i}function si(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ai(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=S(i.value);if(!s)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(s.arity==="multiple")for(;r<e.length&&!K(e[r].value);)o.push(e[r]),r++;else{let a=e[r];a&&(o.push(a),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(a=>a.value),location:{line:t,column:i.column}})}return n}function ci(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!S(e[0].value))throw new d(`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 li(e,t){if(e.length<2)throw new d("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}}}function Ft(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Lt(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ve(e="WorldOrbit"){return{format:"worldorbit",version:"2.0",sourceVersion:"1.0",system:{type:"system",id:e,title:e,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},objects:[],diagnostics:[]}}function xe(e){return structuredClone(e)}function Et(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(ve))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ve))t.push({kind:"annotation",id:n.id})}for(let n of[...e.objects].sort(ve))t.push({kind:"object",id:n.id});return t}function Ue(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"object":return t.id?zt(e,t.id):null;case"viewpoint":return t.id?Bt(e.system,t.id):null;case"annotation":return t.id?_t(e.system,t.id):null}}function qe(e,t,n){let r=xe(e),i=Ke(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return Ce(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return Ce(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return Ce(i.annotations,n),r}}function Pt(e,t,n){return qe(e,t,n(Ue(e,t)))}function Nt(e,t){let n=xe(e),r=Ke(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;default:return n}}function Ye(e,t){return t.map(n=>({diagnostic:n,path:Ge(e,n)}))}function Ge(e,t){if(t.objectId&&zt(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&Bt(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&_t(e.system,n[1]))return{kind:"annotation",id:n[1]}}return t.field&&t.field in Ke(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Rt(e){let t=_(e),n=le(t);return Ye(e,n.diagnostics)}function Ke(e){return e.system||(e.system=Ve().system),e.system}function zt(e,t){return e.objects.find(n=>n.id===t)??null}function Bt(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function _t(e,t){return e?.annotations.find(n=>n.id===t)??null}function Ce(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ve);return}e[n]=t}function ve(e,t){return e.id.localeCompare(t.id)}var ui=/^schema\s+2(?:\.0)?$/i,di=/^schema\s+2\.0-draft$/i;function Xe(e){for(let t of e.split(/\r?\n/)){let n=t.trim();if(n)return di.test(n)?"2.0-draft":ui.test(n)?"2.0":"1.0"}return"1.0"}function Oe(e){let t=He(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function He(e){let t=Xe(e);if(t==="2.0"||t==="2.0-draft")return fi(e,t);let n;try{n=P(e)}catch(i){return{ok:!1,value:null,diagnostics:[$(i,"parse")]}}let r;try{r=A(n)}catch(i){return{ok:!1,value:null,diagnostics:[$(i,"normalize")]}}try{M(r)}catch(i){return{ok:!1,value:null,diagnostics:[$(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function fi(e,t){let n;try{n=je(e)}catch(s){return{ok:!1,value:null,diagnostics:[$(s,"parse","load.atlas.failed")]}}let r;try{r=_(n)}catch(s){return{ok:!1,value:null,diagnostics:[$(s,"normalize","load.atlas.materialize.failed")]}}try{M(r)}catch(s){return{ok:!1,value:null,diagnostics:[$(s,"validate","load.atlas.validate.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:r,atlasDocument:n,draftDocument:n,diagnostics:[...n.diagnostics]},diagnostics:[...n.diagnostics]}}var pi=/^```worldorbit(?:\s+(.*))?\s*$/;function Wt(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,s=0,o=[];return t.forEach((a,c)=>{let l=c+1;if(!r){let u=a.match(pi);u&&(r=!0,i=u[1]??null,s=l,o=[]);return}if(a.trim()==="```"){n.push({source:o.join(`
5
+ `),info:i,startLine:s,endLine:l}),r=!1,i=null,s=0,o=[];return}o.push(a)}),n}function Ct(e){let t=P(e),n=A(t);return M(n),{ast:t,document:n}}function mi(e){let t=Ct(e);return{...t,scene:B(t.document)}}function hi(e){return Oe(e)}function yi(e){return ce(e)}function gi(e,t={}){return Ie(e,t)}return Jt(bi);})();
@@ -0,0 +1,81 @@
1
+ "use strict";var WorldOrbitMarkdown=(()=>{var ke=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var Bt=Object.prototype.hasOwnProperty;var Rt=(e,t)=>{for(var r in t)ke(e,r,{get:t[r],enumerable:!0})},zt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Pt(t))!Bt.call(e,o)&&o!==r&&ke(e,o,{get:()=>t[o],enumerable:!(n=Ct(t,o))||n.enumerable});return e};var Nt=e=>zt(ke({},"__esModule",{value:!0}),e);var Vo={};Rt(Vo,{rehypeWorldOrbit:()=>Mt,remarkWorldOrbit:()=>Ot,renderWorldOrbitBlock:()=>_,renderWorldOrbitError:()=>_e});var d=class e extends Error{line;column;constructor(t,r,n){let o=r===void 0?"":` (line ${r}${n===void 0?"":`, column ${n}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=r,this.column=n}static fromLocation(t,r){return new e(t,r?.line,r?.column)}};var q=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],O=q.filter(e=>e!=="system"),Wt=["star","planet","moon","asteroid","comet","structure","phenomenon"],Ye=["structure","phenomenon"],L=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],_t=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function y(e,t){return{key:e,...t}}var ie=new Set(q),Ue=new Map([y("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:L}),y("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:L,unitFamily:"distance"}),y("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:L,unitFamily:"distance"}),y("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:L}),y("period",{kind:"unit",placement:!0,arity:"single",objectTypes:L,unitFamily:"duration"}),y("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:L,unitFamily:"angle"}),y("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:L,unitFamily:"angle"}),y("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:L,unitFamily:"angle"}),y("at",{kind:"string",placement:!0,arity:"single",objectTypes:Ye}),y("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Ye}),y("free",{kind:"string",placement:!0,arity:"single",objectTypes:_t}),y("kind",{kind:"string",placement:!1,arity:"single",objectTypes:O}),y("class",{kind:"string",placement:!1,arity:"single",objectTypes:O}),y("culture",{kind:"string",placement:!1,arity:"single",objectTypes:O}),y("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:q}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:q}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:Wt}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:q}),y("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:O,unitFamily:"radius"}),y("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:O,unitFamily:"mass"}),y("density",{kind:"unit",placement:!1,arity:"single",objectTypes:O,unitFamily:"generic"}),y("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:O,unitFamily:"generic"}),y("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:O,unitFamily:"generic"}),y("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:O}),y("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),y("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),y("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),y("on",{kind:"string",placement:!1,arity:"single",objectTypes:O}),y("source",{kind:"string",placement:!1,arity:"single",objectTypes:O}),y("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:O,unitFamily:"duration"})].map(e=>[e.key,e])),Yt=new Set(Ue.keys());function T(e){return Ue.get(e)}function ae(e){return Yt.has(e)}function qe(e,t){return e.objectTypes.includes(t)}function Xe(e,t){switch(e){case"distance":return t===null||["au","km","re","sol"].includes(t);case"radius":return t===null||["km","re","sol"].includes(t);case"mass":return t===null||["me","sol"].includes(t);case"duration":return t===null||["h","d","y"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function X(e,t={}){let r=[],n=t.columnOffset??0,o="",i=null,a=!1,s=!1,c=null,l=()=>{i!==null&&(r.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let u=0;u<e.length;u++){let f=e[u],p=n+u+1;if(s&&f==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){o+=h,u++;continue}}if(f==='"'){s?s=!1:(i===null&&(i=p),a=!0,c=p,s=!0);continue}if(!s&&/\s/.test(f)){l();continue}i===null&&(i=p),o+=f}if(s)throw new d("Unclosed quote in line",t.line,c??n+e.length);return l(),r}function se(e){return e.match(/^\s*/)?.[0].length??0}function H(e){let t=e.split(/\r?\n/),r=[],n=null,o=!1,i=null;for(let a=0;a<t.length;a++){let s=t[a],c=a+1;if(!s.trim())continue;let l=se(s),u=X(s.slice(l),{line:c,columnOffset:l});if(u.length!==0){if(l===0){o=!1,i=null;let f=Ut(u,c);r.push(f),n=f;continue}if(!n)throw new d("Indented line without parent object",c,l+1);if(u.length===1&&u[0].value==="info"){o=!0,i=l;continue}o&&l<=(i??0)&&(o=!1),o?n.infoEntries.push(Ht(u,c)):n.blockFields.push(Xt(u,c))}}return{type:"document",objects:r}}function Ut(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[r,n,...o]=e;if(!ie.has(r.value))throw new d(`Unknown object type "${r.value}"`,t,r.column);return{type:"object",objectType:r.value,name:n.value,inlineFields:qt(o,t),blockFields:[],infoEntries:[],location:{line:t,column:r.column}}}function qt(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=T(o.value);if(!i)throw new d(`Unknown field "${o.value}"`,t,o.column);n++;let a=[];if(i.arity==="multiple")for(;n<e.length&&!ae(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new d(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return r}function Xt(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!T(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Ht(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}var He=/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/,Gt=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Kt=/^[A-Za-z][A-Za-z0-9+.-]*:/;function B(e){let t=null,r=[];for(let n of e.objects){let o=Jt(n);if(n.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",n.location);t=o}else r.push(o)}return{format:"worldorbit",version:"1.0",system:t,objects:r}}function Jt(e){let t=[...e.inlineFields,...e.blockFields];Zt(e.objectType,t);let r=Qt(t),n=er(e.objectType,r),o=tr(r),i=or(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:n,info:i}}function Zt(e,t){for(let r of t){let n=T(r.key);if(!n)throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!qe(n,e))throw d.fromLocation(`Field "${r.key}" is not valid on "${e}"`,r.location);if(n.arity==="single"&&r.values.length!==1)throw d.fromLocation(`Field "${r.key}" expects exactly one value`,r.location)}}function Qt(e){let t=new Map;for(let r of e){if(t.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);t.set(r.key,r)}return t}function er(e,t){let r=t.has("orbit"),n=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[r,n,o,i].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(r)return{mode:"orbit",target:le(t,"orbit"),distance:N(t,"distance"),semiMajor:N(t,"semiMajor"),eccentricity:sr(t,"eccentricity"),period:N(t,"period"),angle:N(t,"angle"),inclination:N(t,"inclination"),phase:N(t,"phase")};if(n){let s=ce(t,"at"),c=le(t,"at");return{mode:"at",target:c,reference:ir(c,s.location)}}if(o)return{mode:"surface",target:le(t,"surface")};if(i){let s=le(t,"free"),c=ar(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function tr(e){let t={};for(let[r,n]of e.entries()){let o=T(r);if(!(!o||o.placement))switch(o.kind){case"list":t[r]=n.values;break;case"boolean":t[r]=lr(n);break;case"number":t[r]=Ke(W(n),r,n.location);break;case"unit":t[r]=Ge(W(n),n.location,r);break;case"string":t[r]=rr(r,n);break}}return t}function rr(e,t){let r=t.values.join(" ").trim();return e==="image"&&nr(r,t.location),r}function nr(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let r=e.match(Kt);if(!r)return;let n=r[0].slice(0,-1).toLowerCase();if(n!=="http"&&n!=="https")throw d.fromLocation(`Field "image" does not support the "${n}" scheme`,t)}function or(e){let t={};for(let r of e){if(r.key in t)throw d.fromLocation(`Duplicate info key "${r.key}"`,r.location);t[r.key]=r.value}return t}function ir(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let r=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:r[2],point:r[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let o=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return o?{kind:"anchor",objectId:o[1],anchor:o[2]}:{kind:"named",name:e}}function Ge(e,t,r){let n=e.match(He);if(!n)throw d.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(n[1]),unit:n[2]??null};if(r){let i=T(r);if(i?.unitFamily&&!Xe(i.unitFamily,o.unit))throw d.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${r}"`,t)}return o}function ar(e){let t=e.match(He);return t?{value:Number(t[1]),unit:t[2]??null}:null}function N(e,t){if(!e.has(t))return;let r=ce(e,t);return Ge(W(r),r.location,t)}function sr(e,t){if(!e.has(t))return;let r=ce(e,t);return Ke(W(r),t,r.location)}function Ke(e,t,r){let n=Number(e);if(!Number.isFinite(n))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,r);return n}function lr(e){let t=W(e).toLowerCase(),r=Gt.get(t);if(r===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return r}function ce(e,t){let r=e.get(t);if(!r)throw new d(`Missing value for key "${t}"`);return r}function le(e,t){return W(ce(e,t))}function W(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var cr=new Set(["star","planet","moon","asteroid","comet"]);function V(e){let t=new Set,r=new Map;for(let n of e.objects){if(t.has(n.id))throw new d(`Duplicate object id "${n.id}"`);t.add(n.id),r.set(n.id,n)}for(let n of e.objects)if(n.placement){if((n.placement.mode==="orbit"||n.placement.mode==="surface")&&!t.has(n.placement.target))throw new d(`Unknown placement target "${n.placement.target}" on "${n.id}"`);if(n.placement.mode==="surface"){let o=r.get(n.placement.target);if(!o||!cr.has(o.type))throw new d(`Surface target "${n.placement.target}" on "${n.id}" is not surface-capable`)}n.placement.mode==="at"&&(n.placement.reference.kind==="lagrange"&&ur(n,n.placement.reference,t),n.placement.reference.kind==="anchor"&&dr(n,n.placement.reference,t))}}function ur(e,t,r){if(!r.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!r.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function dr(e,t,r){if(!r.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function F(e,t,r=`${t}.failed`){return e instanceof d?{code:r,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:r,severity:"error",source:t,message:e.message}:{code:r,severity:"error",source:t,message:String(e)}}var Oe=1495978707e-1,fr=6371,pr=695700,rt=.68,mr=.2,nt=28;function E(e,t={}){let r=br(t),n=r.width,o=r.height,i=r.padding,a=hr(e),s=yr(e,t.projection),c=wr(a,t.scaleModel),l=Ir(a),u=e.system?.id??null,f=new Map(e.objects.map(b=>[b.id,b])),p=Jr(e.objects,f),h=new Map,g=[],w=[],m=[],x=[],j=[],S=new Map,Y=new Map;for(let b of e.objects){let k=b.placement;if(!k){m.push(b);continue}if(k.mode==="orbit"){Qe(Y,k.target,b);continue}if(k.mode==="surface"){Qe(S,k.target,b);continue}if(k.mode==="at"){j.push(b);continue}x.push(b)}let A=x.length>0?n*.42:n/2,te=o/2,D={orbitChildren:Y,surfaceChildren:S,objectMap:f,spacingFactor:l,projection:s,scaleModel:c},je=m.find(b=>b.type==="star")??m[0]??null;je&&Te(je,A,te,0,h,g,w,D);let $e=m.filter(b=>b.id!==je?.id);if($e.length>0){let b=Math.min(n,o)*.28*l*c.orbitDistanceMultiplier;$e.forEach((k,I)=>{let Se=J(I,$e.length,-Math.PI/2),P=Z(Se,b,s,1);Te(k,A+P.x,te+P.y,0,h,g,w,D)})}x.forEach((b,k)=>{let I=n-i-140-nn(b.placement?.mode==="free"?b.placement.distance:void 0,c),Se=Math.max(76,(o-i*2-180)/Math.max(1,x.length)*l)*c.freePlacementMultiplier,P=i+92+k*Se;h.set(b.id,{object:b,x:I,y:P,radius:pe(b,0,c),sortKey:he(I,P,0)}),w.push({object:b,groupId:p.groupIds.get(b.id)??null,x1:I-60,y1:P,x2:I-18,y2:P,mode:"free"}),de(b,h,g,w,D,1)}),j.forEach((b,k)=>{if(h.has(b.id)||!b.placement||b.placement.mode!=="at")return;let I=Gr(b.placement.reference,h,f,k,j.length,n,o,i,D);h.set(b.id,{object:b,x:I.x,y:I.y,radius:pe(b,2,c),sortKey:he(I.x,I.y,2),anchorX:I.anchorX,anchorY:I.anchorY}),I.anchorX!==void 0&&I.anchorY!==void 0&&w.push({object:b,groupId:p.groupIds.get(b.id)??null,x1:I.anchorX,y1:I.anchorY,x2:I.x,y2:I.y,mode:"at"}),de(b,h,g,w,D,2)});let U=[...h.values()].map(b=>vr(b,c,p)),re=g.map(b=>jr(b,p.groupIds.get(b.object.id)??null)),ne=w.map(b=>$r(b)),oe=Sr(U,o,c.labelMultiplier),Lt=kr(re,ne,U,oe),Vt=Or(U,re,ne,oe,p),Ft=Tr(e,s,r.preset,p,f),Et=Wr(n,o,U,re,ne,oe);return{width:n,height:o,padding:i,renderPreset:r.preset,projection:s,scaleModel:c,title:String(e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${et(s)} view - ${et(a)} layout`,systemId:u,viewMode:s,layoutPreset:a,metadata:{format:e.format,version:e.version,view:s,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:r.preset??"custom"},contentBounds:Et,layers:Lt,groups:Vt,viewpoints:Ft,objects:U,orbitVisuals:re,leaders:ne,labels:oe}}function hr(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 br(e){let t=gr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function gr(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 yr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function wr(e,t){return{...xr(e),...t}}function xr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Ir(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function vr(e,t,r){let{object:n,x:o,y:i,radius:a,sortKey:s,anchorX:c,anchorY:l}=e;return{renderId:ge(n.id),objectId:n.id,object:n,parentId:r.parentIds.get(n.id)??null,ancestorIds:r.ancestorIds.get(n.id)??[],childIds:r.childIds.get(n.id)??[],groupId:r.groupIds.get(n.id)??null,x:o,y:i,radius:a,visualRadius:rn(n,a,t),sortKey:s,anchorX:c,anchorY:l,label:n.id,secondaryLabel:n.type==="structure"?String(n.properties.kind??n.type):n.type,fillColor:an(n.properties.color),imageHref:typeof n.properties.image=="string"&&n.properties.image.trim()?n.properties.image:void 0,hidden:n.properties.hidden===!0}}function jr(e,t){return{renderId:`${ge(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0}}function $r(e){return{renderId:`${ge(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Sr(e,t,r){let n=[],o=[],i=[...e].filter(a=>!a.hidden).sort((a,s)=>a.sortKey-s.sortKey);for(let a of i){let s=a.y>t*.62?-1:1,c=sn(a,r),l=a.y+s*(a.radius+18*r),u=l+s*(16*r),f=Je(a.x,l,u,c,s),p=0;for(;o.some(h=>en(h,f))&&p<10;)l+=s*14*r,u+=s*14*r,f=Je(a.x,l,u,c,s),p+=1;o.push(f),n.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,label:a.label,secondaryLabel:a.secondaryLabel,x:a.x,y:l,secondaryY:u,textAnchor:"middle",direction:s<0?"above":"below",hidden:a.hidden})}return n}function kr(e,t,r,n){let o=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),i=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:o},{id:"orbits-front",renderIds:i},{id:"objects",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Or(e,t,r,n,o){let i=new Map,a=s=>{if(!s)return null;let c=i.get(s);if(c)return c;let l=o.groupRoots.get(s)??null,u={renderId:s,rootObjectId:l,label:l??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:K(0,0,0,0)};return i.set(s,u),u};for(let s of e){let c=a(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=a(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of r){let c=a(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of n){let c=a(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of i.values())s.contentBounds=Zr(s,e,t,r,n);return[...i.values()].sort((s,c)=>s.label.localeCompare(c.label))}function Tr(e,t,r,n,o){let i=Mr(e,t,r),a=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...h]=l.split(".");if(f!=="viewpoint"||!p||h.length===0)continue;let g=Rr(p);if(!g)continue;let w=h.join(".").toLowerCase(),m=a.get(g)??{id:g};Ar(m,w,u,t,r,n,o),a.set(g,m)}let s=[...a.values()].map(l=>Dr(l,t,r,o)).filter(Boolean),c=s.findIndex(l=>l.id===i.id);return c>=0?s.splice(c,1,{...i,...s[c],layers:{...i.layers,...s[c].layers},filter:s[c].filter??i.filter,generated:!1}):s.unshift(i),s.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Mr(e,t,r){return{id:"overview",label:e.system?.properties.title?`${String(e.system.properties.title)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,projection:t,preset:r,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Ar(e,t,r,n,o,i,a){let s=r.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"projection":case"view":e.projection=Vr(s)??n;return;case"preset":e.preset=Fr(s)??o;return;case"rotation":case"angle":e.rotationDeg=ot(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Er(s);return;case"layers":e.layers=Cr(s);return;case"query":e.filter={...e.filter??ue(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??ue(),objectTypes:Pr(s)};return;case"tags":e.filter={...e.filter??ue(),tags:be(s)};return;case"groups":e.filter={...e.filter??ue(),groupIds:Br(s,i,a)};return}}function Dr(e,t,r,n){let o=e.focus&&n.has(e.focus)?e.focus:null,i=e.select&&n.has(e.select)?e.select:o,a=Lr(e.filter),s=e.label?.trim()||zr(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||Nr(s,o,a),objectId:o,selectedObjectId:i,projection:e.projection??t,preset:e.preset??r,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function ue(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Lr(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 Vr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Fr(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ot(e){let t=Number(e);return Number.isFinite(t)?t:null}function Er(e){let t=ot(e);return t!==null&&t>0?t:null}function Cr(e){let t={};for(let r of be(e)){let n=!r.startsWith("-")&&!r.startsWith("!"),o=r.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=n,t["orbits-front"]=n;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=n)}return t}function Pr(e){return be(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Br(e,t,r){return be(e).map(n=>n.startsWith("wo-")&&n.endsWith("-group")?n:t.groupIds.has(n)?t.groupIds.get(n)??G(n):(r.has(n),G(n)))}function be(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Rr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function zr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Nr(e,t,r){let n=[e];return t&&n.push(`focus ${t}`),r?.objectTypes.length&&n.push(r.objectTypes.join("/")),r?.tags.length&&n.push(`tags ${r.tags.join(", ")}`),r?.query&&n.push(`query "${r.query}"`),n.join(" - ")}function Wr(e,t,r,n,o,i){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,p)=>{a=Math.min(a,f),s=Math.min(s,p),c=Math.max(c,f),l=Math.max(l,p)};for(let f of n)f.hidden||it(f,u);for(let f of o)f.hidden||(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of r)f.hidden||at(f,u);for(let f of i)f.hidden||st(f,u);return!Number.isFinite(a)||!Number.isFinite(s)?K(0,0,e,t):K(a,s,c,l)}function it(e,t){let r=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-r,e.cy-e.radius-r),t(e.cx+e.radius+r,e.cy+e.radius+r);return}let n=e.rx??e.radius??0,o=e.ry??e.radius??0,i=ct(e.cx,e.cy,n,o,e.rotationDeg,0,Math.PI*2,nt*2);for(let a of i)t(a.x-r,a.y-r),t(a.x+r,a.y+r)}function K(e,t,r,n){return{minX:e,minY:t,maxX:r,maxY:n,width:r-e,height:n-t,centerX:e+(r-e)/2,centerY:t+(n-t)/2}}function at(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 st(e,t){let n=ln(e.label,e.secondaryLabel,1);t(e.x-n,e.y-18),t(e.x+n,e.y+8),t(e.x-n,e.secondaryY-14),t(e.x+n,e.secondaryY+8)}function Te(e,t,r,n,o,i,a,s){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:r,radius:pe(e,n,s.scaleModel),sortKey:he(t,r,n)}),de(e,o,i,a,s,n+1))}function de(e,t,r,n,o,i){let a=t.get(e.id);if(!a)return;let s=[...o.orbitChildren.get(e.id)??[]].sort(_r),c=Yr(s,a.radius,o.spacingFactor,o.scaleModel);s.forEach((u,f)=>{let p=Ur(u,f,s.length,a,c,o);r.push({object:u,parentId:e.id,kind:p.kind,cx:p.cx,cy:p.cy,radius:p.radius,rx:p.rx,ry:p.ry,rotationDeg:p.rotationDeg,band:p.band,bandThickness:p.bandThickness,frontArcPath:p.frontArcPath,backArcPath:p.backArcPath}),Te(u,p.objectX,p.objectY,i,t,r,n,o)});let l=[...o.surfaceChildren.get(e.id)??[]];l.forEach((u,f)=>{let p=J(f,l.length,-Math.PI/3),h=28*o.spacingFactor,g=Z(p,a.radius,o.projection,o.projection==="isometric"?.9:1),w=Z(p,a.radius+h,o.projection,o.projection==="isometric"?.9:1),m=a.x+g.x,x=a.y+g.y,j=a.x+w.x,S=a.y+w.y;t.set(u.id,{object:u,x:j,y:S,radius:pe(u,i+1,o.scaleModel),sortKey:he(j,S,i+1),anchorX:m,anchorY:x}),n.push({object:u,groupId:o.objectMap.has(u.id)?G(Qr(u,o.objectMap)):null,x1:m,y1:x,x2:j,y2:S,mode:"surface"}),de(u,t,r,n,o,i+1)})}function _r(e,t){let r=fe(e),n=fe(t);return r!==null&&n!==null&&r!==n?r-n:r!==null&&n===null?-1:r===null&&n!==null?1:e.id.localeCompare(t.id)}function Yr(e,t,r,n){let o=e.map(f=>fe(f)),i=o.filter(f=>f!==null),a=t+56*r*n.orbitDistanceMultiplier,s=(e.length>2?54:64)*r*n.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s)};let c=Math.min(...i),l=Math.max(...i),u=l-c;return{metrics:o,minMetric:c,maxMetric:l,metricSpread:u,innerPx:a,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s)}}function Ur(e,t,r,n,o,i){let a=e.placement,s=e.type==="belt"||e.type==="ring";if(!a||a.mode!=="orbit"){let D=o.innerPx+t*o.stepPx;return{kind:"circle",cx:n.x,cy:n.y,radius:D,rotationDeg:0,band:s,bandThickness:s?12*i.scaleModel.ringThicknessMultiplier:void 0,objectX:n.x,objectY:n.y-D}}let c=v(typeof a.eccentricity=="number"?a.eccentricity:0,0,.92),l=qr(e,t,o),u=Math.max(l*Math.sqrt(1-c*c),l*.18),f=Ae(a.inclination)??0,p=i.projection==="isometric"?Math.max(mr,Math.cos(De(f)))*rt:1,h=Math.max(u*p,l*.14),g=Ae(a.angle)??0,w=l*c,m=dt(-w,0,g),x=n.x+m.x,j=n.y+m.y,S=Xr(a.phase,t,r),Y=ut(x,j,l,h,g,S),A=i.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,te=s?Hr(e,l,o,i.scaleModel):void 0;return{kind:A?"circle":"ellipse",cx:A?n.x:x,cy:A?n.y:j,radius:A?l:void 0,rx:A?void 0:l,ry:A?void 0:h,rotationDeg:g,band:s,bandThickness:te,frontArcPath:i.projection==="isometric"||s?Ze(x,j,l,h,g,0,Math.PI):void 0,backArcPath:i.projection==="isometric"||s?Ze(x,j,l,h,g,Math.PI,Math.PI*2):void 0,objectX:Y.x,objectY:Y.y}}function qr(e,t,r){let n=fe(e);return n===null?r.innerPx+t*r.stepPx:r.metricSpread>0?r.innerPx+(n-r.minMetric)/r.metricSpread*r.pixelSpread:r.innerPx+Math.log10(n+1)*r.stepPx}function fe(e){return!e.placement||e.placement.mode!=="orbit"?null:me(e.placement.semiMajor??e.placement.distance??null)}function Xr(e,t,r){let n=e?Ae(e):null;return n!==null?De(n-90):J(t,r,-Math.PI/2)}function Hr(e,t,r,n){let o=me(Me(e.properties.inner)),i=me(Me(e.properties.outer));if(o!==null&&i!==null){let s=Math.abs(i-o);if(r.metricSpread>0)return v(s/r.metricSpread*r.pixelSpread*n.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(o,i),1e-4);return v(s/c*t*.75*n.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*n.ringThicknessMultiplier}function Gr(e,t,r,n,o,i,a,s,c){if(e.kind==="lagrange")return Kr(e,t,r,i,a);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=J(n,o,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=Z(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=J(n,o,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=Z(u,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:i-s-170,y:a-s-86-n*58*c.scaleModel.freePlacementMultiplier}}function Kr(e,t,r,n,o){let i=e.secondary?t.get(e.primary):tn(e.primary,t,r),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:n*.7,y:o*.25};let s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c)||1,u=s/l,f=c/l,p=-f,h=u,g=v(l*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*g,y:a.y-f*g,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*g,y:a.y+f*g,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-u*g,y:i.y-f*g,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(u*.5-p*.8660254)*g,y:a.y+(f*.5-h*.8660254)*g,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+p*.8660254)*g,y:a.y+(f*.5+h*.8660254)*g,anchorX:a.x,anchorY:a.y}}}function Jr(e,t){let r=new Map,n=new Map;for(let l of e){let u=lt(l,t);if(r.set(l.id,u),u){let f=n.get(u);f?f.push(l.id):n.set(u,[l.id])}n.has(l.id)||n.set(l.id,[])}let o=new Map,i=new Map,a=new Map,s=l=>{let u=o.get(l);if(u)return u;let f=new Set,p=[],h=r.get(l)??null;for(;h&&!f.has(h);)p.push(h),f.add(h),h=r.get(h)??null;return o.set(l,p),p},c=l=>{let u=a.get(i.get(l)??"");if(u)return u;let f=r.get(l)??null,p=t.get(l),h=l;return p?.placement&&p.placement.mode!=="free"&&f&&(h=c(f)),h};for(let l of e){s(l.id);let u=c(l.id),f=G(u);i.set(l.id,f),a.set(f,u)}return{parentIds:r,childIds:n,ancestorIds:o,groupIds:i,groupRoots:a}}function lt(e,t){let r=e.placement;if(!r)return null;switch(r.mode){case"orbit":case"surface":return t.has(r.target)?r.target:null;case"at":switch(r.reference.kind){case"anchor":return t.has(r.reference.objectId)?r.reference.objectId:null;case"named":return t.has(r.reference.name)?r.reference.name:null;case"lagrange":return r.reference.secondary&&t.has(r.reference.secondary)?r.reference.secondary:t.has(r.reference.primary)?r.reference.primary:null}case"free":return null}}function Zr(e,t,r,n,o){let i=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=(u,f)=>{i=Math.min(i,u),a=Math.min(a,f),s=Math.max(s,u),c=Math.max(c,f)};for(let u of t)!u.hidden&&e.objectIds.includes(u.objectId)&&at(u,l);for(let u of r)!u.hidden&&e.orbitIds.includes(u.objectId)&&it(u,l);for(let u of n)!u.hidden&&e.leaderIds.includes(u.objectId)&&(l(u.x1,u.y1),l(u.x2,u.y2));for(let u of o)!u.hidden&&e.labelIds.includes(u.objectId)&&st(u,l);return!Number.isFinite(i)||!Number.isFinite(a)?K(0,0,0,0):K(i,a,s,c)}function Qr(e,t){let r=e,n=new Set;for(;r.placement&&r.placement.mode!=="free"&&!n.has(r.id);){n.add(r.id);let o=lt(r,t);if(!o)break;let i=t.get(o);if(!i)break;r=i}return r.id}function Je(e,t,r,n,o){return{left:e-n,right:e+n,top:Math.min(t,r)-(o<0?18:12),bottom:Math.max(t,r)+(o<0?8:12)}}function en(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function tn(e,t,r){let n=r.get(e);return!n?.placement||n.placement.mode!=="orbit"?t.get(e):t.get(n.placement.target)}function pe(e,t,r){let n=on(e.properties.radius,r);if(n!==null)return n;let o=r.bodyRadiusMultiplier;switch(e.type){case"star":return v((t===0?28:20)*o,r.minBodyRadius,r.maxBodyRadius);case"planet":return v(12*o,r.minBodyRadius,r.maxBodyRadius);case"moon":return v(7*o,r.minBodyRadius,r.maxBodyRadius);case"belt":return v(5*o,r.minBodyRadius,r.maxBodyRadius);case"asteroid":return v(5*o,r.minBodyRadius,r.maxBodyRadius);case"comet":return v(6*o,r.minBodyRadius,r.maxBodyRadius);case"ring":return v(5*o,r.minBodyRadius,r.maxBodyRadius);case"structure":return v(6*o,r.minBodyRadius,r.maxBodyRadius);case"phenomenon":return v(8*o,r.minBodyRadius,r.maxBodyRadius)}}function rn(e,t,r){let n=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+n,r.maxBodyRadius+10)}}function me(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Oe;case"re":return e.value*fr/Oe;case"sol":return e.value*pr/Oe;default:return e.value}}function nn(e,t){let r=me(e??null);return r===null||r<=0?0:v(r*96*t.freePlacementMultiplier,0,420)}function on(e,t){let r=Me(e);if(!r)return null;let n;switch(r.unit){case"sol":n=v(r.value*22,14,40);break;case"re":n=v(r.value*10,6,18);break;case"km":n=v(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:n=v(r.value*4,4,20);break}return v(n*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Me(e){return!e||typeof e!="object"||!("value"in e)?null:e}function Ae(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function J(e,t,r){return t<=1?r:r+e*Math.PI*2/t}function Ze(e,t,r,n,o,i,a){let s=ct(e,t,r,n,o,i,a,nt);return s.length===0?"":s.map((c,l)=>`${l===0?"M":"L"} ${tt(c.x)} ${tt(c.y)}`).join(" ")}function ct(e,t,r,n,o,i,a,s){let c=[];for(let l=0;l<=s;l+=1){let u=i+(a-i)*l/s;c.push(ut(e,t,r,n,o,u))}return c}function ut(e,t,r,n,o,i){let a=r*Math.cos(i),s=n*Math.sin(i),c=dt(a,s,o);return{x:e+c.x,y:t+c.y}}function dt(e,t,r){let n=De(r);return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}function Z(e,t,r,n){let o=r==="isometric"?rt*n:n;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function he(e,t,r){return t*1e3+e+r*.01}function v(e,t,r){return Math.min(Math.max(e,t),r)}function Qe(e,t,r){let n=e.get(t);n?n.push(r):e.set(t,[r])}function ge(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function G(e){return`${ge(e)}-group`}function an(e){return typeof e=="string"&&e.trim()?e:void 0}function sn(e,t){let r=e.label.length*4.6*t+18,n=e.secondaryLabel.length*3.9*t+18;return Math.max(r,n,e.visualRadius+18)}function ln(e,t,r){let n=e.length*4.6*r+18,o=t.length*3.9*r+18;return Math.max(n,o,24)}function et(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function De(e){return e*Math.PI/180}function tt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ye(e){return{format:"worldorbit",version:"1.0",system:e.system?{type:"system",id:e.system.id,properties:dn(e.system),info:fn(e.system)}:null,objects:e.objects.map(cn)}}function cn(e){return{...e,properties:un(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function un(e){let t={};for(let[r,n]of Object.entries(e)){if(Array.isArray(n)){t[r]=[...n];continue}if(n&&typeof n=="object"&&"value"in n){t[r]={value:n.value,unit:n.unit};continue}t[r]=n}return t}function dn(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),t}function fn(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let r of e.viewpoints){let n=`viewpoint.${r.id}`;t[`${n}.label`]=r.label,r.summary&&(t[`${n}.summary`]=r.summary),r.focusObjectId&&(t[`${n}.focus`]=r.focusObjectId),r.selectedObjectId&&(t[`${n}.select`]=r.selectedObjectId),r.projection&&(t[`${n}.projection`]=r.projection),r.preset&&(t[`${n}.preset`]=r.preset),r.zoom!==null&&(t[`${n}.zoom`]=String(r.zoom)),r.rotationDeg!==0&&(t[`${n}.rotation`]=String(r.rotationDeg));let o=pn(r.layers);o&&(t[`${n}.layers`]=o),r.filter?.query&&(t[`${n}.query`]=r.filter.query),(r.filter?.objectTypes.length??0)>0&&(t[`${n}.types`]=r.filter?.objectTypes.join(" ")??""),(r.filter?.tags.length??0)>0&&(t[`${n}.tags`]=r.filter?.tags.join(" ")??""),(r.filter?.groupIds.length??0)>0&&(t[`${n}.groups`]=r.filter?.groupIds.join(" ")??"")}for(let r of e.annotations){let n=`annotation.${r.id}`;t[`${n}.label`]=r.label,r.targetObjectId&&(t[`${n}.target`]=r.targetObjectId),t[`${n}.body`]=r.body,r.tags.length>0&&(t[`${n}.tags`]=r.tags.join(" ")),r.sourceObjectId&&(t[`${n}.source`]=r.sourceObjectId)}return t}function pn(e){let t=[],r=e["orbits-front"],n=e["orbits-back"];(r!==void 0||n!==void 0)&&t.push(r!==!1||n!==!1?"orbits":"-orbits");for(let o of["background","guides","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}function Ve(e){return bn(e,"2.0")}function bn(e,t){let r=e.split(/\r?\n/),n=!1,o="2.0",i=null,a=null,s=[],c=!1,l=!1,u=new Set,f=new Set;for(let w=0;w<r.length;w++){let m=r[w],x=w+1;if(!m.trim())continue;let j=se(m),S=X(m.slice(j),{line:x,columnOffset:j});if(S.length!==0){if(!n){o=gn(S,x),n=!0;continue}if(j===0){a=yn(S,x,i,s,u,f,{sawDefaults:c,sawAtlas:l}),a.kind==="system"?i=a.system:a.kind==="defaults"?c=!0:a.kind==="atlas"&&(l=!0);continue}if(!a)throw new d("Indented line without parent atlas section",x,j+1);jn(a,j,S,x)}}if(!n)throw new d('Missing required atlas schema header "schema 2.0"');let h=B({type:"document",objects:s}).objects;return V({format:"worldorbit",version:"1.0",system:null,objects:h}),{format:"worldorbit",version:t,sourceVersion:"1.0",system:i,objects:h,diagnostics:o==="2.0-draft"&&t==="2.0"?[{code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}]:[]}}function gn(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||e[1].value.toLowerCase()!=="2.0-draft"&&e[1].value.toLowerCase()!=="2.0")throw new d('Expected atlas header "schema 2.0" or legacy "schema 2.0-draft"',t,e[0]?.column??1);return e[1].value.toLowerCase()==="2.0-draft"?"2.0-draft":"2.0"}function yn(e,t,r,n,o,i,a){switch(e[0]?.value.toLowerCase()){case"system":if(r)throw new d('Atlas section "system" may only appear once',t,e[0].column);return wn(e,t);case"defaults":if(!r)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(a.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:r,seenFields:new Set};case"atlas":if(!r)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(a.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:r,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!r)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return xn(e,t,r,o);case"annotation":if(!r)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return In(e,t,r,i);case"object":return vn(e,t,n);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function wn(e,t){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},seenFields:new Set}}function xn(e,t,r,n){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let o=mt(e[1].value);if(!o)throw new d("Viewpoint id must not be empty",t,e[1].column);if(n.has(o))throw new d(`Duplicate viewpoint id "${o}"`,t,e[1].column);let i={id:o,label:ht(o),summary:"",focusObjectId:null,selectedObjectId:null,projection:r.defaults.view,preset:r.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return r.viewpoints.push(i),n.add(o),{kind:"viewpoint",viewpoint:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function In(e,t,r,n){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let o=mt(e[1].value);if(!o)throw new d("Annotation id must not be empty",t,e[1].column);if(n.has(o))throw new d(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:ht(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return r.annotations.push(i),n.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function vn(e,t,r){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let n=e[1],o=e[2],i=n.value;if(!ie.has(i)||i==="system")throw new d(`Unknown object type "${n.value}"`,t,n.column);let a={type:"object",objectType:i,name:o.value,inlineFields:Cn(e.slice(3),t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}};return r.push(a),{kind:"object",objectNode:a,inInfoBlock:!1,infoIndent:null}}function jn(e,t,r,n){switch(e.kind){case"system":$n(e,r,n);return;case"defaults":Sn(e,r,n);return;case"atlas":kn(e,t,r,n);return;case"viewpoint":On(e,t,r,n);return;case"annotation":Mn(e,r,n);return;case"object":An(e,t,r,n);return}}function $n(e,t,r){if(Q(t,e.seenFields,r)!=="title")throw new d(`Unknown system atlas field "${t[0].value}"`,r,t[0].column);e.system.title=C(t,r)}function Sn(e,t,r){let n=Q(t,e.seenFields,r),o=C(t,r);switch(n){case"view":e.system.defaults.view=ft(o,r,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=pt(o,r,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,r,t[0].column)}}function kn(e,t,r,n){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){if(r.length<2)throw new d("Invalid atlas metadata entry",n,r[0]?.column??1);let o=r[0].value;if(o in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${o}"`,n,r[0].column);e.system.atlasMetadata[o]=C(r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${r[0].value}"`,n,r[0].column)}function On(e,t,r,n){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Tn(e,r,n);return}if(r.length===1&&r[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',n,r[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=Q(r,e.seenFields,n),i=C(r,n);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=ft(i,n,r[0].column);return;case"preset":e.viewpoint.preset=pt(i,n,r[0].column);return;case"zoom":e.viewpoint.zoom=Vn(i,n,r[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Fn(i,n,r[0].column,"rotation");return;case"layers":e.viewpoint.layers=Ln(r.slice(1),n);return;default:throw new d(`Unknown viewpoint field "${r[0].value}"`,n,r[0].column)}}function Tn(e,t,r){let n=Q(t,e.seenFilterFields,r),o=e.viewpoint.filter??En();switch(n){case"query":o.query=C(t,r);break;case"objecttypes":o.objectTypes=Dn(t.slice(1),r);break;case"tags":o.tags=Le(t.slice(1),r,"tags");break;case"groups":o.groupIds=Le(t.slice(1),r,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,r,t[0].column)}e.viewpoint.filter=o}function Mn(e,t,r){switch(Q(t,e.seenFields,r)){case"label":e.annotation.label=C(t,r);return;case"target":e.annotation.targetObjectId=C(t,r);return;case"body":e.annotation.body=C(t,r);return;case"tags":e.annotation.tags=Le(t.slice(1),r,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,r,t[0].column)}}function An(e,t,r,n){if(r.length===1&&r[0].value==="info"){e.inInfoBlock=!0,e.infoIndent=t;return}if(e.inInfoBlock&&t<=(e.infoIndent??0)&&(e.inInfoBlock=!1,e.infoIndent=null),e.inInfoBlock){e.objectNode.infoEntries.push(Bn(r,n));return}e.objectNode.blockFields.push(Pn(r,n))}function Q(e,t,r){if(e.length<2)throw new d("Invalid atlas field line",r,e[0]?.column??1);let n=e[0].value.toLowerCase();if(t.has(n))throw new d(`Duplicate atlas field "${e[0].value}"`,r,e[0].column);return t.add(n),n}function C(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(r=>r.value).join(" ").trim()}function Dn(e,t){if(e.length===0)throw new d("Missing value for atlas field",t);return e.map(r=>{let n=r.value;if(n!=="star"&&n!=="planet"&&n!=="moon"&&n!=="belt"&&n!=="asteroid"&&n!=="comet"&&n!=="ring"&&n!=="structure"&&n!=="phenomenon")throw new d(`Unknown viewpoint object type "${r.value}"`,t,r.column);return n})}function Le(e,t,r){if(e.length===0)throw new d(`Missing value for field "${r}"`,t);return e.map(n=>n.value)}function Ln(e,t){if(e.length===0)throw new d('Missing value for field "layers"',t);let r={};for(let n of e){let o=!n.value.startsWith("-")&&!n.value.startsWith("!"),i=n.value.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){r["orbits-back"]=o,r["orbits-front"]=o;continue}if(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="objects"||i==="labels"||i==="metadata"){r[i]=o;continue}throw new d(`Unknown layer token "${n.value}"`,t,n.column)}return r}function ft(e,t,r){let n=e.toLowerCase();if(n==="topdown"||n==="isometric")return n;throw new d(`Unknown projection "${e}"`,t,r)}function pt(e,t,r){let n=e.toLowerCase();if(n==="diagram"||n==="presentation"||n==="atlas-card"||n==="markdown")return n;throw new d(`Unknown render preset "${e}"`,t,r)}function Vn(e,t,r,n){let o=Number(e);if(!Number.isFinite(o)||o<=0)throw new d(`Field "${n}" expects a positive number`,t,r);return o}function Fn(e,t,r,n){let o=Number(e);if(!Number.isFinite(o))throw new d(`Field "${n}" expects a finite number`,t,r);return o}function En(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Cn(e,t){let r=[],n=0;for(;n<e.length;){let o=e[n],i=T(o.value);if(!i)throw new d(`Unknown field "${o.value}"`,t,o.column);n++;let a=[];if(i.arity==="multiple")for(;n<e.length&&!ae(e[n].value);)a.push(e[n]),n++;else{let s=e[n];s&&(a.push(s),n++)}if(a.length===0)throw new d(`Missing value for field "${o.value}"`,t,o.column);r.push({type:"field",key:o.value,values:a.map(s=>s.value),location:{line:t,column:o.column}})}return r}function Pn(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!T(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(r=>r.value),location:{line:t,column:e[0].column}}}function Bn(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function mt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ht(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}var zn=/^schema\s+2(?:\.0)?$/i,Nn=/^schema\s+2\.0-draft$/i;function bt(e){for(let t of e.split(/\r?\n/)){let r=t.trim();if(r)return Nn.test(r)?"2.0-draft":zn.test(r)?"2.0":"1.0"}return"1.0"}function R(e){let t=gt(e);if(!t.ok||!t.value){let r=t.diagnostics[0];throw new d(r?.message??"Failed to load WorldOrbit source",r?.line,r?.column)}return t.value}function gt(e){let t=bt(e);if(t==="2.0"||t==="2.0-draft")return Wn(e,t);let r;try{r=H(e)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"parse")]}}let n;try{n=B(r)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"normalize")]}}try{V(n)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:r,document:n,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Wn(e,t){let r;try{r=Ve(e)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"parse","load.atlas.failed")]}}let n;try{n=ye(r)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"normalize","load.atlas.materialize.failed")]}}try{V(n)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"validate","load.atlas.validate.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:n,atlasDocument:r,draftDocument:r,diagnostics:[...r.diagnostics]},diagnostics:[...r.diagnostics]}}var Un={background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},we={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Fe(e){return e?typeof e=="string"?we[e]??we.atlas:{...we.atlas,...e}:we.atlas}function Ee(e){return{...Un,...e}}function xe(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Ce(e.objectTypes??[]),tags:Ce((e.tags??[]).map(r=>r.trim()).filter(Boolean)),groupIds:Ce((e.groupIds??[]).map(r=>r.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return qn(t)?t:null}function qn(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Pe(e,t){let r=xe(t),n=new Set;for(let o of e.objects)if(!o.hidden&&Xn(o,r)&&(n.add(o.objectId),r?.includeAncestors!==!1))for(let i of o.ancestorIds)n.add(i);return r?n:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function Xn(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type)||t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId)))return!1;if(t.tags?.length){let r=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[];if(!t.tags.every(n=>r.includes(n)))return!1}if(t.query?.trim()){let r=Hn(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>r.includes(o)))return!1}return!0}function Hn(e,t){let r=Object.values(e.info),n=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...n,...r].join(" ")}function Ce(e){return[...new Set(e)]}var Be="worldorbit-camera-root";function z(e,t={}){let r=Fe(t.theme),n=lo(t.preset??e.renderPreset??void 0),o=Ee({...n.layers,...t.layers}),i=t.subtitle??e.subtitle,a=Pe(e,t.filter??null),s=e.objects.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>o.structures||!Ie(m.object)).sort((m,x)=>m.sortKey-x.sortKey),c=e.labels.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>o.structures||!Ie(m.object)),l=Kn(s),u=o.orbits?Gn(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>o.structures||!Ie(m.object)).map(m=>`<line class="wo-leader wo-leader-${m.mode}" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${$(m.renderId)}" data-group-id="${M(m.groupId??"")}" />`).join(""):"",p=o.objects?s.map(m=>Jn(m,t.selectedObjectId??null,r)).join(""):"",h=o.labels?c.map(m=>Zn(e,m,t.selectedObjectId??null)).join(""):"",g=o.metadata?`<text class="wo-title" x="56" y="64">${$(e.title)}</text>
2
+ <text class="wo-subtitle" x="56" y="88">${$(i)}</text>
3
+ <text class="wo-meta" x="56" y="${e.height-42}">${$(uo(e))}</text>`:"",w=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
4
+ <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
5
+ ${o.guides?co(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">
6
+ <title id="worldorbit-title">${$(e.title)}</title>
7
+ <desc id="worldorbit-desc">A ${$(e.viewMode)} WorldOrbit render with ${s.length} visible objects.</desc>
8
+ <defs>
9
+ <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
10
+ <stop offset="0%" stop-color="${r.backgroundStart}" />
11
+ <stop offset="100%" stop-color="${r.backgroundEnd}" />
12
+ </linearGradient>
13
+ <radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
14
+ <stop offset="0%" stop-color="${r.starGlow}" stop-opacity="0.95" />
15
+ <stop offset="100%" stop-color="${r.starCore}" stop-opacity="0" />
16
+ </radialGradient>
17
+ <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
18
+ <stop offset="0%" stop-color="${r.backgroundGlow}" />
19
+ <stop offset="100%" stop-color="transparent" />
20
+ </radialGradient>
21
+ ${l}
22
+ </defs>
23
+ <style>
24
+ .wo-bg { fill: url(#wo-bg); }
25
+ .wo-bg-glow { fill: url(#wo-bg-glow); }
26
+ .wo-grid { fill: none; stroke: ${r.guide}; stroke-width: 1; }
27
+ .wo-orbit { fill: none; stroke: ${r.orbit}; stroke-width: 1.5; }
28
+ .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
29
+ .wo-orbit-front { opacity: 0.9; }
30
+ .wo-orbit-band { stroke: ${r.orbitBand}; stroke-linecap: round; }
31
+ .wo-leader { stroke: ${r.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
32
+ .wo-label { fill: ${r.ink}; font-family: ${r.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
33
+ .wo-label-secondary { fill: ${r.muted}; font-family: ${r.fontFamily}; font-weight: 500; }
34
+ .wo-title { fill: ${r.ink}; font: 700 24px ${r.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
35
+ .wo-subtitle { fill: ${r.muted}; font: 500 12px ${r.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
36
+ .wo-meta { fill: ${r.muted}; font: 500 11px ${r.fontFamily}; letter-spacing: 0.06em; }
37
+ .wo-object { cursor: pointer; outline: none; }
38
+ .wo-object:focus-visible .wo-selection-ring,
39
+ .wo-object:hover .wo-selection-ring,
40
+ .wo-object-selected .wo-selection-ring { display: block; }
41
+ .wo-object-selected .wo-selection-ring { stroke: ${r.selected}; }
42
+ .wo-object-label-selected .wo-label { fill: ${r.accent}; }
43
+ .wo-object-label-selected .wo-label-secondary { fill: ${r.selected}; }
44
+ .wo-chain-selected .wo-selection-ring,
45
+ .wo-chain-hover .wo-selection-ring { display: block; }
46
+ .wo-ancestor-selected .wo-selection-ring,
47
+ .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
48
+ .wo-chain-selected .wo-label,
49
+ .wo-chain-hover .wo-label { fill: ${r.accent}; }
50
+ .wo-ancestor-selected .wo-label,
51
+ .wo-ancestor-hover .wo-label { fill: ${r.ink}; opacity: 0.82; }
52
+ .wo-orbit-related-selected,
53
+ .wo-orbit-related-hover { stroke: ${r.accentStrong}; opacity: 1; }
54
+ .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
55
+ .wo-object-image { pointer-events: none; }
56
+ </style>
57
+ ${w}
58
+ ${g}
59
+ <g data-worldorbit-world="true">
60
+ <g data-worldorbit-camera-root="${Be}" id="${Be}">
61
+ <g data-worldorbit-world-content="true">
62
+ ${o.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
63
+ ${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
64
+ ${o.objects?`<g data-layer-id="objects">${p}</g>`:""}
65
+ ${o.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
66
+ ${o.labels?`<g data-layer-id="labels">${h}</g>`:""}
67
+ </g>
68
+ </g>
69
+ </g>
70
+ </svg>`}function Gn(e,t,r){let n=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(r||!Ie(a.object)))){let a=i.bandThickness??(i.band?10:1.5),s=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",c=`data-render-id="${$(i.renderId)}" data-orbit-object-id="${M(i.objectId)}" data-parent-id="${M(i.parentId)}" data-group-id="${M(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&n.push(`<path class="${s} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${c} />`),i.frontArcPath&&o.push(`<path class="${s} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${c} />`);continue}if(i.kind==="ellipse"){let l=i.rx??i.radius??0,u=i.ry??i.radius??0;o.push(`<ellipse class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${l}" ry="${u}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${a}" ${c} />`);continue}o.push(`<circle class="${s} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${c} />`)}return{back:n.join(""),front:o.join("")}}function Kn(e){return e.filter(t=>!!t.imageHref).map(t=>to(t)).join("")}function Jn(e,t,r){let{object:n,x:o,y:i,radius:a,visualRadius:s}=e,c=t===e.objectId?" wo-object-selected":"",l=no(e,r),u=eo(e),f=u?wt(n,o,i,a,l,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${n.type}${c}" data-object-id="${$(e.objectId)}" data-parent-id="${M(e.parentId??"")}" data-group-id="${M(e.groupId??"")}" data-render-id="${$(e.renderId)}" tabindex="0" role="button" aria-label="${$(`${n.type} ${e.objectId}`)}">
71
+ <circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${s+8}" />
72
+ ${Qn(e,l)}
73
+ ${wt(n,o,i,a,l)}
74
+ ${u}
75
+ ${f}
76
+ </g>`}function Zn(e,t,r){let n=r===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${n}" data-object-id="${$(t.objectId)}" data-group-id="${M(t.groupId??"")}" data-render-id="${$(t.renderId)}">
77
+ <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${$(t.label)}</text>
78
+ <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${$(t.secondaryLabel)}</text>
79
+ </g>`}function wt(e,t,r,n,o,i={}){let a=i.outlineOnly?"transparent":o.fill,s=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${r}" r="${n*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
80
+ <circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${r}" r="${n}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-n*2} ${r+n*1.3} Q ${t-n*.7} ${r+n*.3} ${t-n*.45} ${r}" fill="none" stroke="${s}" stroke-width="${Math.max(2,n*.8)}" stroke-linecap="round" opacity="0.85" />
81
+ <circle cx="${t}" cy="${r}" r="${n}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${jt(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":return`<polygon points="${$t(t,r,n)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}function Qn(e,t){if(!t.atmosphere)return"";let{object:r,x:n,y:o,radius:i}=e;return r.type!=="planet"&&r.type!=="moon"&&r.type!=="asteroid"?"":`<circle cx="${n}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function eo(e){if(!e.imageHref)return"";let t=ro(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${M(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${M(vt(e))})" />`}function to(e){let{x:t,y:r,radius:n}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${r}" r="${n}" />`;break;case"structure":o=`<polygon points="${jt(t,r,n)}" />`;break;case"phenomenon":o=`<polygon points="${$t(t,r,n)}" />`;break;default:return""}return`<clipPath id="${M(vt(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function ro(e){let{object:t,x:r,y:n,radius:o}=e;switch(t.type){case"structure":return{x:r-o,y:n-o,width:o*2,height:o*2};case"phenomenon":return{x:r-o*1.2,y:n-o*1.2,width:o*2.4,height:o*2.4};default:return{x:r-o,y:n-o,width:o*2,height:o*2}}}function no(e,t){let r=oo(e.object.type,t),n=e.fillColor&&po(e.fillColor)?e.fillColor:r.fill,o=xt(e.object.properties.albedo),i=xt(e.object.properties.temperature),a=io(n,i,o,e.object.type),s=ee(a,"#ffffff",.4)??r.stroke,c=so(e.object.properties.atmosphere),l=e.object.type==="star"?It(ee(a,"#fff2cb",.4)??a,.82):void 0;return{fill:a,stroke:s,glow:l,atmosphere:c,tail:e.object.type==="comet"?It(ee(a,"#ffffff",.5)??a,.72):void 0}}function oo(e,t){switch(e){case"star":return{fill:t.starCore,stroke:t.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:t.accentStrong,stroke:"#fff2ea"};case"phenomenon":return{fill:"#78ffd7",stroke:"#e9fff7"}}}function io(e,t,r,n){let o=e;if(t!==null){let i=ao(t,n);o=ee(o,i,n==="star"?.42:.2)??o}if(r!==null){let i=Math.min(Math.max(r,0),1);o=ee(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function ao(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function so(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 lo(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 xt(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function vt(e){return`${e.renderId}-clip`}function jt(e,t,r){return`${e},${t-r} ${e+r},${t} ${e},${t+r} ${e-r},${t}`}function $t(e,t,r){return`${e},${t-r*1.2} ${e+r*.9},${t-r*.3} ${e+r*1.2},${t+r*.8} ${e},${t+r*1.2} ${e-r*1.1},${t+r*.3} ${e-r*.8},${t-r*.8}`}function co(e,t){let r=Array.from({length:10},(o,i)=>{let a=90+i*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),n=Array.from({length:6},(o,i)=>{let a=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${r}${n}`}function uo(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Ie(e){return e.type==="structure"||e.type==="phenomenon"}function ee(e,t,r){let n=Re(e),o=Re(t);if(!n||!o)return;let i=Math.min(Math.max(r,0),1);return fo({r:Math.round(n.r+(o.r-n.r)*i),g:Math.round(n.g+(o.g-n.g)*i),b:Math.round(n.b+(o.b-n.b)*i)})}function It(e,t){let r=Re(e);return r?`rgba(${r.r}, ${r.g}, ${r.b}, ${t})`:e}function Re(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 fo(e){let t=r=>r.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function po(e){return!!e.trim()}function $(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function M(e){return $(e)}function St(e){return encodeURIComponent(JSON.stringify(e))}function Ne(e,t,r={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:r.initialViewpointId,initialSelectionObjectId:r.initialSelectionObjectId,initialFilter:r.initialFilter??null,atlasState:r.atlasState??null,minimap:r.minimap}}}function We(e,t={}){let r={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},n=z(e.scene,{theme:r.options?.theme,layers:r.options?.layers,filter:r.options?.initialFilter??null,selectedObjectId:r.options?.initialSelectionObjectId??null,subtitle:r.options?.subtitle,preset:r.options?.preset});return`<div class="${ve(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${ve(r.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${ve(r.options?.initialViewpointId??"")}" data-worldorbit-payload="${ve(St(r))}">${n}</div>`}function ve(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function _(e,t={}){try{let r=R(e),n=E(r.document,Ao(r,t));return(t.mode??"static")==="interactive"?We(Ne(n,"interactive",{initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}):`<figure class="${Mo(t.className??"worldorbit-block worldorbit-static")}">${z(n,t)}</figure>`}catch(r){if(t.strict)throw r;return _e(r instanceof Error?r.message:String(r))}}function _e(e){return`<pre class="worldorbit-error">WorldOrbit error: ${kt(e)}</pre>`}function kt(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function Mo(e){return kt(e).replaceAll('"',"&quot;")}function Ao(e,t){let r=e.atlasDocument??e.draftDocument;return t.preset||!r?.system?.defaults.preset?t:{...t,preset:r.system.defaults.preset}}function Ot(e={}){return function(r){Tt(r,(n,o,i)=>{!i||o===-1||n.type!=="code"||!Do(n.lang)||(i.children[o]={type:"html",value:_(n.value??"",e)})})}}function Tt(e,t,r=null){let n=e.children??[];for(let o=0;o<n.length;o+=1){let i=n[o];t(i,o,e),Tt(i,t,e)}r||t(e,-1,null)}function Do(e){return(e??"").trim().toLowerCase()==="worldorbit"}function Mt(e={}){return function(r){At(r,(n,o,i)=>{if(!i||o===-1||n.type!=="element"||n.tagName!=="pre")return;let a=n.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!Lo(a.properties?.className).includes("language-worldorbit"))return;let c=Dt(a);i.children[o]={type:"raw",value:_(c,e)}})}}function At(e,t,r=null){let n=e.children??[];for(let o=0;o<n.length;o+=1){let i=n[o];t(i,o,e),At(i,t,e)}r||t(e,-1,null)}function Lo(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function Dt(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>Dt(t)).join("")}return Nt(Vo);})();