worldorbit 2.5.17 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +91 -18
  2. package/dist/browser/core/dist/atlas-edit.d.ts +11 -0
  3. package/dist/browser/core/dist/atlas-edit.js +347 -0
  4. package/dist/browser/core/dist/atlas-utils.d.ts +22 -0
  5. package/dist/browser/core/dist/atlas-utils.js +189 -0
  6. package/dist/browser/core/dist/atlas-validate.d.ts +2 -0
  7. package/dist/browser/core/dist/atlas-validate.js +488 -0
  8. package/dist/browser/core/dist/diagnostics.d.ts +10 -0
  9. package/dist/browser/core/dist/diagnostics.js +109 -0
  10. package/dist/browser/core/dist/draft-parse.d.ts +3 -0
  11. package/dist/browser/core/dist/draft-parse.js +1654 -0
  12. package/dist/browser/core/dist/draft.d.ts +21 -0
  13. package/dist/browser/core/dist/draft.js +482 -0
  14. package/dist/browser/core/dist/errors.d.ts +7 -0
  15. package/dist/browser/core/dist/errors.js +16 -0
  16. package/dist/browser/core/dist/format.d.ts +4 -0
  17. package/dist/browser/core/dist/format.js +613 -0
  18. package/dist/browser/core/dist/index.d.ts +29 -0
  19. package/dist/browser/core/dist/index.js +35 -6101
  20. package/dist/browser/core/dist/load.d.ts +4 -0
  21. package/dist/browser/core/dist/load.js +182 -0
  22. package/dist/browser/core/dist/markdown.d.ts +2 -0
  23. package/dist/browser/core/dist/markdown.js +37 -0
  24. package/dist/browser/core/dist/normalize.d.ts +2 -0
  25. package/dist/browser/core/dist/normalize.js +312 -0
  26. package/dist/browser/core/dist/parse.d.ts +2 -0
  27. package/dist/browser/core/dist/parse.js +133 -0
  28. package/dist/browser/core/dist/scene.d.ts +3 -0
  29. package/dist/browser/core/dist/scene.js +1901 -0
  30. package/dist/browser/core/dist/schema.d.ts +8 -0
  31. package/dist/browser/core/dist/schema.js +298 -0
  32. package/dist/browser/core/dist/spatial-scene.d.ts +3 -0
  33. package/dist/browser/core/dist/spatial-scene.js +420 -0
  34. package/dist/browser/core/dist/tokenize.d.ts +4 -0
  35. package/dist/browser/core/dist/tokenize.js +68 -0
  36. package/dist/browser/core/dist/types.d.ts +637 -0
  37. package/dist/browser/core/dist/types.js +1 -0
  38. package/dist/browser/core/dist/validate.d.ts +2 -0
  39. package/dist/browser/core/dist/validate.js +56 -0
  40. package/dist/browser/editor/dist/editor.d.ts +2 -0
  41. package/dist/browser/editor/dist/editor.js +3700 -0
  42. package/dist/browser/editor/dist/index.d.ts +2 -0
  43. package/dist/browser/editor/dist/index.js +1 -11702
  44. package/dist/browser/editor/dist/types.d.ts +59 -0
  45. package/dist/browser/editor/dist/types.js +1 -0
  46. package/dist/browser/markdown/dist/html.d.ts +3 -0
  47. package/dist/browser/markdown/dist/html.js +64 -0
  48. package/dist/browser/markdown/dist/index.d.ts +4 -0
  49. package/dist/browser/markdown/dist/index.js +3 -5766
  50. package/dist/browser/markdown/dist/rehype.d.ts +10 -0
  51. package/dist/browser/markdown/dist/rehype.js +49 -0
  52. package/dist/browser/markdown/dist/remark.d.ts +9 -0
  53. package/dist/browser/markdown/dist/remark.js +28 -0
  54. package/dist/browser/markdown/dist/types.d.ts +11 -0
  55. package/dist/browser/markdown/dist/types.js +1 -0
  56. package/dist/browser/viewer/dist/atlas-state.d.ts +12 -0
  57. package/dist/browser/viewer/dist/atlas-state.js +269 -0
  58. package/dist/browser/viewer/dist/atlas-viewer.d.ts +2 -0
  59. package/dist/browser/viewer/dist/atlas-viewer.js +495 -0
  60. package/dist/browser/viewer/dist/custom-element.d.ts +1 -0
  61. package/dist/browser/viewer/dist/custom-element.js +78 -0
  62. package/dist/browser/viewer/dist/embed.d.ts +24 -0
  63. package/dist/browser/viewer/dist/embed.js +172 -0
  64. package/dist/browser/viewer/dist/errors.d.ts +6 -0
  65. package/dist/browser/viewer/dist/errors.js +12 -0
  66. package/dist/browser/viewer/dist/index.d.ts +10 -0
  67. package/dist/browser/viewer/dist/index.js +9 -7901
  68. package/dist/browser/viewer/dist/minimap.d.ts +3 -0
  69. package/dist/browser/viewer/dist/minimap.js +63 -0
  70. package/dist/browser/viewer/dist/render.d.ts +6 -0
  71. package/dist/browser/viewer/dist/render.js +670 -0
  72. package/dist/browser/viewer/dist/runtime-3d.d.ts +19 -0
  73. package/dist/browser/viewer/dist/runtime-3d.js +494 -0
  74. package/dist/browser/viewer/dist/theme.d.ts +4 -0
  75. package/dist/browser/viewer/dist/theme.js +103 -0
  76. package/dist/browser/viewer/dist/tooltip.d.ts +3 -0
  77. package/dist/browser/viewer/dist/tooltip.js +198 -0
  78. package/dist/browser/viewer/dist/types.d.ts +292 -0
  79. package/dist/browser/viewer/dist/types.js +1 -0
  80. package/dist/browser/viewer/dist/vendor/three.module.js +53032 -0
  81. package/dist/browser/viewer/dist/viewer-state.d.ts +19 -0
  82. package/dist/browser/viewer/dist/viewer-state.js +162 -0
  83. package/dist/browser/viewer/dist/viewer.d.ts +2 -0
  84. package/dist/browser/viewer/dist/viewer.js +1662 -0
  85. package/dist/unpkg/core/dist/atlas-edit.d.ts +11 -0
  86. package/dist/unpkg/core/dist/atlas-edit.js +347 -0
  87. package/dist/unpkg/core/dist/atlas-utils.d.ts +22 -0
  88. package/dist/unpkg/core/dist/atlas-utils.js +189 -0
  89. package/dist/unpkg/core/dist/atlas-validate.d.ts +2 -0
  90. package/dist/unpkg/core/dist/atlas-validate.js +488 -0
  91. package/dist/unpkg/core/dist/diagnostics.d.ts +10 -0
  92. package/dist/unpkg/core/dist/diagnostics.js +109 -0
  93. package/dist/unpkg/core/dist/draft-parse.d.ts +3 -0
  94. package/dist/unpkg/core/dist/draft-parse.js +1654 -0
  95. package/dist/unpkg/core/dist/draft.d.ts +21 -0
  96. package/dist/unpkg/core/dist/draft.js +482 -0
  97. package/dist/unpkg/core/dist/errors.d.ts +7 -0
  98. package/dist/unpkg/core/dist/errors.js +16 -0
  99. package/dist/unpkg/core/dist/format.d.ts +4 -0
  100. package/dist/unpkg/core/dist/format.js +613 -0
  101. package/dist/unpkg/core/dist/index.d.ts +29 -0
  102. package/dist/unpkg/core/dist/index.js +35 -6173
  103. package/dist/unpkg/core/dist/load.d.ts +4 -0
  104. package/dist/unpkg/core/dist/load.js +182 -0
  105. package/dist/unpkg/core/dist/markdown.d.ts +2 -0
  106. package/dist/unpkg/core/dist/markdown.js +37 -0
  107. package/dist/unpkg/core/dist/normalize.d.ts +2 -0
  108. package/dist/unpkg/core/dist/normalize.js +312 -0
  109. package/dist/unpkg/core/dist/parse.d.ts +2 -0
  110. package/dist/unpkg/core/dist/parse.js +133 -0
  111. package/dist/unpkg/core/dist/scene.d.ts +3 -0
  112. package/dist/unpkg/core/dist/scene.js +1901 -0
  113. package/dist/unpkg/core/dist/schema.d.ts +8 -0
  114. package/dist/unpkg/core/dist/schema.js +298 -0
  115. package/dist/unpkg/core/dist/spatial-scene.d.ts +3 -0
  116. package/dist/unpkg/core/dist/spatial-scene.js +420 -0
  117. package/dist/unpkg/core/dist/tokenize.d.ts +4 -0
  118. package/dist/unpkg/core/dist/tokenize.js +68 -0
  119. package/dist/unpkg/core/dist/types.d.ts +637 -0
  120. package/dist/unpkg/core/dist/types.js +1 -0
  121. package/dist/unpkg/core/dist/validate.d.ts +2 -0
  122. package/dist/unpkg/core/dist/validate.js +56 -0
  123. package/dist/unpkg/editor/dist/editor.d.ts +2 -0
  124. package/dist/unpkg/editor/dist/editor.js +3700 -0
  125. package/dist/unpkg/editor/dist/index.d.ts +2 -0
  126. package/dist/unpkg/editor/dist/index.js +1 -11727
  127. package/dist/unpkg/editor/dist/types.d.ts +59 -0
  128. package/dist/unpkg/editor/dist/types.js +1 -0
  129. package/dist/unpkg/markdown/dist/html.d.ts +3 -0
  130. package/dist/unpkg/markdown/dist/html.js +64 -0
  131. package/dist/unpkg/markdown/dist/index.d.ts +4 -0
  132. package/dist/unpkg/markdown/dist/index.js +3 -5794
  133. package/dist/unpkg/markdown/dist/rehype.d.ts +10 -0
  134. package/dist/unpkg/markdown/dist/rehype.js +49 -0
  135. package/dist/unpkg/markdown/dist/remark.d.ts +9 -0
  136. package/dist/unpkg/markdown/dist/remark.js +28 -0
  137. package/dist/unpkg/markdown/dist/types.d.ts +11 -0
  138. package/dist/unpkg/markdown/dist/types.js +1 -0
  139. package/dist/unpkg/viewer/dist/atlas-state.d.ts +12 -0
  140. package/dist/unpkg/viewer/dist/atlas-state.js +269 -0
  141. package/dist/unpkg/viewer/dist/atlas-viewer.d.ts +2 -0
  142. package/dist/unpkg/viewer/dist/atlas-viewer.js +495 -0
  143. package/dist/unpkg/viewer/dist/custom-element.d.ts +1 -0
  144. package/dist/unpkg/viewer/dist/custom-element.js +78 -0
  145. package/dist/unpkg/viewer/dist/embed.d.ts +24 -0
  146. package/dist/unpkg/viewer/dist/embed.js +172 -0
  147. package/dist/unpkg/viewer/dist/errors.d.ts +6 -0
  148. package/dist/unpkg/viewer/dist/errors.js +12 -0
  149. package/dist/unpkg/viewer/dist/index.d.ts +10 -0
  150. package/dist/unpkg/viewer/dist/index.js +9 -7958
  151. package/dist/unpkg/viewer/dist/minimap.d.ts +3 -0
  152. package/dist/unpkg/viewer/dist/minimap.js +63 -0
  153. package/dist/unpkg/viewer/dist/render.d.ts +6 -0
  154. package/dist/unpkg/viewer/dist/render.js +670 -0
  155. package/dist/unpkg/viewer/dist/runtime-3d.d.ts +19 -0
  156. package/dist/unpkg/viewer/dist/runtime-3d.js +494 -0
  157. package/dist/unpkg/viewer/dist/theme.d.ts +4 -0
  158. package/dist/unpkg/viewer/dist/theme.js +103 -0
  159. package/dist/unpkg/viewer/dist/tooltip.d.ts +3 -0
  160. package/dist/unpkg/viewer/dist/tooltip.js +198 -0
  161. package/dist/unpkg/viewer/dist/types.d.ts +292 -0
  162. package/dist/unpkg/viewer/dist/types.js +1 -0
  163. package/dist/unpkg/viewer/dist/vendor/three.module.js +53032 -0
  164. package/dist/unpkg/viewer/dist/viewer-state.d.ts +19 -0
  165. package/dist/unpkg/viewer/dist/viewer-state.js +162 -0
  166. package/dist/unpkg/viewer/dist/viewer.d.ts +2 -0
  167. package/dist/unpkg/viewer/dist/viewer.js +1662 -0
  168. package/dist/unpkg/worldorbit-core.min.js +1 -12
  169. package/dist/unpkg/worldorbit-editor.min.js +1 -894
  170. package/dist/unpkg/worldorbit-markdown.min.js +1 -103
  171. package/dist/unpkg/worldorbit-viewer.min.js +1 -259
  172. package/dist/unpkg/worldorbit.js +2 -9243
  173. package/dist/unpkg/worldorbit.min.js +2 -263
  174. package/package.json +1 -1
  175. package/packages/core/dist/atlas-edit.js +1 -1
  176. package/packages/core/dist/atlas-validate.js +99 -10
  177. package/packages/core/dist/draft-parse.js +190 -15
  178. package/packages/core/dist/draft.js +50 -11
  179. package/packages/core/dist/format.js +36 -5
  180. package/packages/core/dist/index.d.ts +1 -0
  181. package/packages/core/dist/index.js +1 -0
  182. package/packages/core/dist/load.js +9 -2
  183. package/packages/core/dist/scene.js +158 -24
  184. package/packages/core/dist/spatial-scene.d.ts +3 -0
  185. package/packages/core/dist/spatial-scene.js +420 -0
  186. package/packages/core/dist/types.d.ts +124 -2
  187. package/packages/editor/dist/editor.js +130 -8
  188. package/packages/editor/dist/types.d.ts +4 -0
  189. package/packages/markdown/dist/html.js +10 -3
  190. package/packages/viewer/dist/atlas-state.js +8 -2
  191. package/packages/viewer/dist/atlas-viewer.js +20 -8
  192. package/packages/viewer/dist/custom-element.js +18 -4
  193. package/packages/viewer/dist/embed.d.ts +5 -1
  194. package/packages/viewer/dist/embed.js +58 -24
  195. package/packages/viewer/dist/errors.d.ts +6 -0
  196. package/packages/viewer/dist/errors.js +12 -0
  197. package/packages/viewer/dist/index.d.ts +1 -0
  198. package/packages/viewer/dist/index.js +1 -0
  199. package/packages/viewer/dist/runtime-3d.d.ts +19 -0
  200. package/packages/viewer/dist/runtime-3d.js +494 -0
  201. package/packages/viewer/dist/types.d.ts +25 -3
  202. package/packages/viewer/dist/vendor/three.module.js +53032 -0
  203. package/packages/viewer/dist/viewer.js +517 -41
@@ -1,103 +1 @@
1
- "use strict";var WorldOrbitMarkdown=(()=>{var Ue=Object.defineProperty;var In=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var kn=Object.prototype.hasOwnProperty;var jn=(e,t)=>{for(var n in t)Ue(e,n,{get:t[n],enumerable:!0})},Sn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xn(t))!kn.call(e,o)&&o!==n&&Ue(e,o,{get:()=>t[o],enumerable:!(r=In(t,o))||r.enumerable});return e};var On=e=>Sn(Ue({},"__esModule",{value:!0}),e);var ka={};jn(ka,{rehypeWorldOrbit:()=>mn,remarkWorldOrbit:()=>fn,renderWorldOrbitBlock:()=>ae,renderWorldOrbitError:()=>ct});var u=class e extends Error{line;column;constructor(t,n,r){let o=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${o}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var se=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],F=se.filter(e=>e!=="system"),An=["star","planet","moon","asteroid","comet","structure","phenomenon"],ft=["structure","phenomenon"],Y=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Ln=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function y(e,t){return{key:e,...t}}var xe=new Set(se),pt=new Map([y("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Y}),y("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"distance"}),y("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"distance"}),y("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Y}),y("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"duration"}),y("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"angle"}),y("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"angle"}),y("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Y,unitFamily:"angle"}),y("at",{kind:"string",placement:!0,arity:"single",objectTypes:ft}),y("surface",{kind:"string",placement:!0,arity:"single",objectTypes:ft}),y("free",{kind:"string",placement:!0,arity:"single",objectTypes:Ln}),y("kind",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("class",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("culture",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:se}),y("color",{kind:"string",placement:!1,arity:"single",objectTypes:se}),y("image",{kind:"string",placement:!1,arity:"single",objectTypes:An}),y("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:se}),y("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"radius"}),y("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"mass"}),y("density",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),y("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),y("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),y("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:F}),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:F}),y("source",{kind:"string",placement:!1,arity:"single",objectTypes:F}),y("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"duration"})].map(e=>[e.key,e])),Tn=new Set(pt.keys());function E(e){return pt.get(e)}function mt(e){return Tn.has(e)}function ht(e,t){return e.objectTypes.includes(t)}function ke(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function le(e,t={}){let n=[],r=t.columnOffset??0,o="",i=null,a=!1,l=!1,s=null,c=()=>{i!==null&&(n.push({value:o,column:i,quoted:a}),o="",i=null,a=!1)};for(let d=0;d<e.length;d++){let f=e[d],m=r+d+1;if(l&&f==="\\"){let h=e[d+1];if(h==='"'||h==="\\"){o+=h,d++;continue}}if(f==='"'){l?l=!1:(i===null&&(i=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(f)){c();continue}i===null&&(i=m),o+=f}if(l)throw new u("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function je(e){return e.match(/^\s*/)?.[0].length??0}function ce(e){let t=e.split(/\r?\n/),n=[],r=null,o=!1,i=null;for(let a=0;a<t.length;a++){let l=t[a],s=a+1;if(!l.trim())continue;let c=je(l),d=le(l.slice(c),{line:s,columnOffset:c});if(d.length!==0){if(c===0){o=!1,i=null;let f=Mn(d,s);n.push(f),r=f;continue}if(!r)throw new u("Indented line without parent object",s,c+1);if(d.length===1&&d[0].value==="info"){o=!0,i=c;continue}o&&c<=(i??0)&&(o=!1),o?r.infoEntries.push(Fn(d,s)):r.blockFields.push(Dn(d,s))}}return{type:"document",objects:n}}function Mn(e,t){if(e.length<2)throw new u("Invalid object declaration",t,e[0]?.column??1);let[n,r,...o]=e;if(!xe.has(n.value))throw new u(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:En(o,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function En(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r],i=E(o.value);if(!i)throw new u(`Unknown field "${o.value}"`,t,o.column);r++;let a=[];if(i.arity==="multiple")for(;r<e.length&&!mt(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new u(`Missing value for field "${o.value}"`,t,o.column);n.push({type:"field",key:o.value,values:a.map(l=>l.value),location:{line:t,column:o.column}})}return n}function Dn(e,t){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);if(!E(e[0].value))throw new u(`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 Fn(e,t){if(e.length<2)throw new u("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 gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Pn=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Vn=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ue(e){let t=null,n=[];for(let r of e.objects){let o=Cn(r);if(r.objectType==="system"){if(t)throw u.fromLocation("Only one system object is allowed",r.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Cn(e){let t=[...e.inlineFields,...e.blockFields];Rn(e.objectType,t);let n=Bn(t),r=_n(e.objectType,n),o=zn(n),i=Wn(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof o.title=="string"?o.title:null,description:null,epoch:null,referencePlane:null,properties:o,info:i}:{type:e.objectType,id:e.name,properties:o,placement:r,info:i}}function Rn(e,t){for(let n of t){let r=E(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ht(r,e))throw u.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Bn(e){let t=new Map;for(let n of e){if(t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function _n(e,t){let n=t.has("orbit"),r=t.has("at"),o=t.has("surface"),i=t.has("free"),a=[n,r,o,i].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw u.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw u.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Se(t,"orbit"),distance:ne(t,"distance"),semiMajor:ne(t,"semiMajor"),eccentricity:qn(t,"eccentricity"),period:ne(t,"period"),angle:ne(t,"angle"),inclination:ne(t,"inclination"),phase:ne(t,"phase")};if(r){let l=Oe(t,"at"),s=Se(t,"at");return{mode:"at",target:s,reference:Yn(s,l.location)}}if(o)return{mode:"surface",target:Se(t,"surface")};if(i){let l=Se(t,"free"),s=Hn(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function zn(e){let t={};for(let[n,r]of e.entries()){let o=E(n);if(!(!o||o.placement))switch(o.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Gn(r);break;case"number":t[n]=yt(re(r),n,r.location);break;case"unit":t[n]=bt(re(r),r.location,n);break;case"string":t[n]=Nn(n,r);break}}return t}function Nn(e,t){let n=t.values.join(" ").trim();return e==="image"&&Un(n,t.location),n}function Un(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Vn);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Wn(e){let t={};for(let n of e){if(n.key in t)throw u.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 u.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 u.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 bt(e,t,n){let r=e.match(gt);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=E(n);if(i?.unitFamily&&!ke(i.unitFamily,o.unit))throw u.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function Hn(e){let t=e.match(gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ne(e,t){if(!e.has(t))return;let n=Oe(e,t);return bt(re(n),n.location,t)}function qn(e,t){if(!e.has(t))return;let n=Oe(e,t);return yt(re(n),t,n.location)}function yt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Gn(e){let t=re(e).toLowerCase(),n=Pn.get(t);if(n===void 0)throw u.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Oe(e,t){let n=e.get(t);if(!n)throw new u(`Missing value for key "${t}"`);return n}function Se(e,t){return re(Oe(e,t))}function re(e){if(e.values.length!==1)throw u.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Xn=new Set(["star","planet","moon","asteroid","comet"]);function de(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new u(`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 u(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let o=n.get(r.placement.target);if(!o||!Xn.has(o.type))throw new u(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Kn(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Zn(r,r.placement.reference,t))}}function Kn(e,t,n){if(!n.has(t.primary))throw new u(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new u(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Zn(e,t,n){if(!n.has(t.objectId))throw new u(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Q(e,t,n=`${t}.failed`){return e instanceof u?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var fe=1495978707e-1,Jn=6371,Qn=71492,er=695700,tr=63241.077,nr=206264.806,rr=206264806,kt=.68,or=.2,jt=28;function H(e,t={}){let n=sr(t),r=n.width,o=n.height,i=n.padding,a=ar(e),l=cr(e,t.projection),s=ur(a,t.scaleModel),c=fr(a),d=e.system?.id??null,f=t.activeEventId??null,m=ir(e.objects,e.events??[],f),h=new Map(m.map(g=>[g.id,g])),b=Zr(m,h),v=new Map,x=[],k=[],p=[],I=[],V=[],K=new Map,C=new Map;for(let g of m){let D=g.placement;if(!D){p.push(g);continue}if(D.mode==="orbit"){$t(C,D.target,g);continue}if(D.mode==="surface"){$t(K,D.target,g);continue}if(D.mode==="at"){V.push(g);continue}I.push(g)}let U=I.length>0?r*.42:r/2,W=o/2,B={orbitChildren:C,surfaceChildren:K,objectMap:h,spacingFactor:c,projection:l,scaleModel:s},A=p.find(g=>g.type==="star")??p[0]??null;A&&We(A,U,W,0,v,x,k,B);let Z=p.filter(g=>g.id!==A?.id);if(Z.length>0){let g=Math.min(r,o)*.28*c*s.orbitDistanceMultiplier;Z.forEach((D,j)=>{let Ne=ge(j,Z.length,-Math.PI/2),J=be(Ne,g,l,1);We(D,U+J.x,W+J.y,0,v,x,k,B)})}I.forEach((g,D)=>{let j=r-i-140-ro(g.placement?.mode==="free"?g.placement.distance:void 0,s),Ne=Math.max(76,(o-i*2-180)/Math.max(1,I.length)*c)*s.freePlacementMultiplier,J=i+92+D*Ne;v.set(g.id,{object:g,x:j,y:J,radius:Me(g,0,s),sortKey:De(j,J,0)}),k.push({object:g,groupId:b.groupIds.get(g.id)??null,x1:j-60,y1:J,x2:j-18,y2:J,mode:"free"}),Le(g,v,x,k,B,1)}),V.forEach((g,D)=>{if(v.has(g.id)||!g.placement||g.placement.mode!=="at")return;let j=Xr(g.placement.reference,v,h,D,V.length,r,o,i,B);v.set(g.id,{object:g,x:j.x,y:j.y,radius:Me(g,2,s),sortKey:De(j.x,j.y,2),anchorX:j.anchorX,anchorY:j.anchorY}),j.anchorX!==void 0&&j.anchorY!==void 0&&k.push({object:g,groupId:b.groupIds.get(g.id)??null,x1:j.anchorX,y1:j.anchorY,x2:j.x,y2:j.y,mode:"at"}),Le(g,v,x,k,B,2)});let M=[...v.values()].map(g=>pr(g,s,b)),_=x.map(g=>mr(g,b.groupIds.get(g.object.id)??null)),N=k.map(g=>hr(g)),Ie=gr(M,r,o,s.labelMultiplier),ut=kr(e,M),dt=jr(e.events??[],M,f),bn=$r(_,ut,dt,N,M,Ie),yn=Ir(M,_,N,Ie,b,s.labelMultiplier),wn=xr(e,M),vn=Sr(e,l,n.preset,b,h),$n=_r(r,o,M,_,N,Ie,s.labelMultiplier);return{width:r,height:o,padding:i,renderPreset:n.preset,projection:l,scaleModel:s,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${It(l)} view - ${It(a)} layout`,systemId:d,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:$n,layers:bn,groups:yn,semanticGroups:wn,viewpoints:vn,events:dt,activeEventId:f,objects:M,orbitVisuals:_,relations:ut,leaders:N,labels:Ie}}function ir(e,t,n){let r=e.map(a=>structuredClone(a));if(!n)return r;let o=t.find(a=>a.id===n);if(!o)return r;let i=new Map(r.map(a=>[a.id,a]));for(let a of o.positions){let l=i.get(a.objectId);l&&(l.placement=a.placement?structuredClone(a.placement):null,a.inner?l.properties.inner={...a.inner}:delete l.properties.inner,a.outer?l.properties.outer={...a.outer}:delete l.properties.outer)}return r}function ar(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 sr(e){let t=lr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function lr(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 cr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function ur(e,t){return{...dr(e),...t}}function dr(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 fr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function pr(e,t,n){let{object:r,x:o,y:i,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,d=r.renderHints?.renderPriority??0;return{renderId:oe(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:o,y:i,radius:a,visualRadius:no(r,a,t),sortKey:l+d*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:io(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function mr(e,t){return{renderId:`${oe(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function hr(e){return{renderId:`${oe(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function gr(e,t,n,r){let o=[],i=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(br);for(let s of l){let c=yr(s,a,i,t,n,r)??Ot(s,St(s,a.get(s.parentId??"")??null,n),0,r);i.push(Dt(s,c,r)),o.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return o}function br(e,t){let n=wt(e)-wt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function wt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function yr(e,t,n,r,o,i){for(let a of wr(e,t,r,o)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=Ot(e,a,s,i),d=Dt(e,c,i);if(!n.some(f=>eo(f,d)))return c}}return null}function wr(e,t,n,r){let o=e.parentId?t.get(e.parentId)??null:null,i=St(e,o,r),a=i==="below"?"above":"below",l=vr(e,o,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,i,s,a]:[i,l,a,s]}function St(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function vr(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function Ot(e,t,n,r){let o=14*r;switch(t){case"above":{let i=e.y-(e.radius+18*r+n*o);return{x:e.x,labelY:i,secondaryY:i-16*r,textAnchor:"middle",direction:t}}case"below":{let i=e.y+e.radius+18*r+n*o;return{x:e.x,labelY:i,secondaryY:i+16*r,textAnchor:"middle",direction:t}}case"left":{let i=e.x-(e.visualRadius+16*r+n*o),a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let i=e.x+e.visualRadius+16*r+n*o,a=e.y-4*r;return{x:i,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function $r(e,t,n,r,o,i){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Ir(e,t,n,r,o,i){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let d=o.groupRoots.get(s)??null,f={renderId:s,rootObjectId:d,label:d??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:he(0,0,0,0)};return a.set(s,f),f};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Jr(s,e,t,n,r,i);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function xr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function kr(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let o=n.get(r.from),i=n.get(r.to);return{renderId:`${oe(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:o?.x??0,y1:o?.y??0,x2:i?.x??0,y2:i?.y??0,hidden:r.hidden||!o||!i||o.hidden||i.hidden}}).sort((r,o)=>r.relation.id.localeCompare(o.relation.id))}function jr(e,t,n){let r=new Map(t.map(o=>[o.objectId,o]));return e.map(o=>{let i=[...new Set([...o.targetObjectId?[o.targetObjectId]:[],...o.participantObjectIds])],a=i.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,d)=>c+d.x,0)/a.length:0,s=a.length>0?a.reduce((c,d)=>c+d.y,0)/a.length:0;return{renderId:`${oe(o.id)}-event`,eventId:o.id,event:o,objectIds:i,participantIds:[...o.participantObjectIds],targetObjectId:o.targetObjectId,x:l,y:s,hidden:o.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&o.id!==n}}).sort((o,i)=>o.event.id.localeCompare(i.event.id))}function Sr(e,t,n,r,o){let i=Or(e,t,n),a=new Map;for(let[c,d]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[f,m,...h]=c.split(".");if(f!=="viewpoint"||!m||h.length===0)continue;let b=Cr(m);if(!b)continue;let v=h.join(".").toLowerCase(),x=a.get(b)??{id:b};Ar(x,v,d,e,t,n,r,o),a.set(b,x)}let l=[...a.values()].map(c=>Lr(c,t,n,o)).filter(Boolean),s=l.findIndex(c=>c.id===i.id);return s>=0?l.splice(s,1,{...i,...l[s],layers:{...i.layers,...l[s].layers},filter:l[s].filter??i.filter,generated:!1}):l.unshift(i),l.sort((c,d)=>c.id==="overview"?-1:d.id==="overview"?1:c.label.localeCompare(d.label))}function Or(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Ar(e,t,n,r,o,i,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=me(s);return;case"projection":case"view":e.projection=Mr(s)??o;return;case"preset":e.preset=Er(s)??i;return;case"rotation":case"angle":e.rotationDeg=At(s)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=Dr(s);return;case"layers":e.layers=Fr(s);return;case"query":e.filter={...e.filter??Ae(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ae(),objectTypes:Pr(s)};return;case"tags":e.filter={...e.filter??Ae(),tags:me(s)};return;case"groups":e.filter={...e.filter??Ae(),groupIds:Vr(s,r,a,l)};return}}function Lr(e,t,n,r){let o=e.focus&&r.has(e.focus)?e.focus:null,i=e.select&&r.has(e.select)?e.select:o,a=Tr(e.filter),l=e.label?.trim()||Rr(e.id);return{id:e.id,label:l,summary:e.summary?.trim()||Br(l,o,a),objectId:o,selectedObjectId:i,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Ae(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Tr(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 Mr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function Er(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function At(e){let t=Number(e);return Number.isFinite(t)?t:null}function Dr(e){let t=At(e);return t!==null&&t>0?t:null}function Fr(e){let t={};for(let n of me(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),o=n.replace(/^[-!]+/,"").toLowerCase();if(o==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(o==="background"||o==="guides"||o==="orbits-back"||o==="orbits-front"||o==="relations"||o==="events"||o==="objects"||o==="labels"||o==="metadata")&&(t[o]=r)}return t}function Pr(e){return me(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Vr(e,t,n,r){return me(e).map(o=>t.schemaVersion==="2.1"||t.groups.some(i=>i.id===o)||o.startsWith("wo-")&&o.endsWith("-group")?o:n.groupIds.has(o)?n.groupIds.get(o)??pe(o):(r.has(o),pe(o)))}function me(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Cr(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Rr(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Br(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 _r(e,t,n,r,o,i,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),d=Math.max(d,h)};for(let m of r)m.hidden||Lt(m,f);for(let m of o)m.hidden||(f(m.x1,m.y1),f(m.x2,m.y2));for(let m of n)m.hidden||Tt(m,f);for(let m of i)m.hidden||Mt(m,f,a);return!Number.isFinite(l)||!Number.isFinite(s)?he(0,0,e,t):he(l,s,c,d)}function Lt(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,o=e.ry??e.radius??0,i=Pt(e.cx,e.cy,r,o,e.rotationDeg,0,Math.PI*2,jt*2);for(let a of i)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function he(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Tt(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 Mt(e,t,n){let r=Ft(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function We(e,t,n,r,o,i,a,l){o.has(e.id)||(o.set(e.id,{object:e,x:t,y:n,radius:Me(e,r,l.scaleModel),sortKey:De(t,n,r)}),Le(e,o,i,a,l,r+1))}function Le(e,t,n,r,o,i){let a=t.get(e.id);if(!a)return;let l=[...o.orbitChildren.get(e.id)??[]].sort(zr),s=Nr(l,a.radius,o.spacingFactor,o.scaleModel),c=Yr(l,s);l.forEach((f,m)=>{let h=Ur(f,m,l.length,a,s,c[m]??s.innerPx,o);n.push({object:f,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),We(f,h.objectX,h.objectY,i,t,n,r,o)});let d=[...o.surfaceChildren.get(e.id)??[]];d.forEach((f,m)=>{let h=ge(m,d.length,-Math.PI/3),b=28*o.spacingFactor,v=be(h,a.radius,o.projection,o.projection==="isometric"?.9:1),x=be(h,a.radius+b,o.projection,o.projection==="isometric"?.9:1),k=a.x+v.x,p=a.y+v.y,I=a.x+x.x,V=a.y+x.y;t.set(f.id,{object:f,x:I,y:V,radius:Me(f,i+1,o.scaleModel),sortKey:De(I,V,i+1),anchorX:k,anchorY:p}),r.push({object:f,groupId:o.objectMap.has(f.id)?pe(Qr(f,o.objectMap)):null,x1:k,y1:p,x2:I,y2:V,mode:"surface"}),Le(f,t,n,r,o,i+1)})}function zr(e,t){let n=Te(e),r=Te(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 Nr(e,t,n,r){let o=e.map(f=>Te(f)),i=o.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(i.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42};let s=Math.min(...i),c=Math.max(...i),d=c-s;return{metrics:o,minMetric:s,maxMetric:c,metricSpread:d,innerPx:a,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:l*.42}}function Ur(e,t,n,r,o,i,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let W=o.innerPx+t*o.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:W,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-W}}let c=S(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),d=i,f=Math.max(d*Math.sqrt(1-c*c),d*.18),m=He(l.inclination)??0,h=a.projection==="isometric"?Math.max(or,Math.cos(qe(m)))*kt:1,b=Math.max(f*h,d*.14),v=He(l.angle)??0,x=d*c,k=Ct(-x,0,v),p=r.x+k.x,I=r.y+k.y,V=qr(l.phase,t,n),K=Vt(p,I,d,b,v,V),C=a.projection==="topdown"&&c<=1e-4&&Math.abs(v)<=1e-4,U=s?Gr(e,d,o,a.scaleModel):void 0;return{kind:C?"circle":"ellipse",cx:C?r.x:p,cy:C?r.y:I,radius:C?d:void 0,rx:C?void 0:d,ry:C?void 0:b,rotationDeg:v,band:s,bandThickness:U,frontArcPath:a.projection==="isometric"||s?vt(p,I,d,b,v,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?vt(p,I,d,b,v,Math.PI,Math.PI*2):void 0,objectX:K.x,objectY:K.y}}function Wr(e,t){return t.innerPx+t.stepPx*Hr(Math.max(e,0)+1)}function Yr(e,t){let n=[];return e.forEach((r,o)=>{let i=Te(r),a=t.innerPx+o*t.stepPx,l=i===null?a:Wr(i,t),s=o===0?t.innerPx:(n[o-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Te(e){return!e.placement||e.placement.mode!=="orbit"?null:Ee(e.placement.semiMajor??e.placement.distance??null)}function Hr(e){return Math.log(e)/Math.log(2)}function qr(e,t,n){let r=e?He(e):null;return r!==null?qe(r-90):ge(t,n,-Math.PI/2)}function Gr(e,t,n,r){let o=Ee(Ye(e.properties.inner)),i=Ee(Ye(e.properties.outer));if(o!==null&&i!==null){let l=Math.abs(i-o);if(n.metricSpread>0)return S(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(o,i),1e-4);return S(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Xr(e,t,n,r,o,i,a,l,s){if(e.kind==="lagrange")return Kr(e,t,n,i,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let d=ge(r,o,Math.PI/5),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=be(d,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let d=ge(r,o,Math.PI/6),f=(c.radius+36)*s.scaleModel.labelMultiplier,m=be(d,f,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:i-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Kr(e,t,n,r,o){let i=e.secondary?t.get(e.primary):to(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!i||!a)return{x:r*.7,y:o*.25};let l=a.x-i.x,s=a.y-i.y,c=Math.hypot(l,s)||1,d=l/c,f=s/c,m=-f,h=d,b=S(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-d*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+d*b,y:a.y+f*b,anchorX:a.x,anchorY:a.y};case"L3":return{x:i.x-d*b,y:i.y-f*b,anchorX:i.x,anchorY:i.y};case"L4":return{x:a.x+(d*.5-m*.8660254)*b,y:a.y+(f*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(d*.5+m*.8660254)*b,y:a.y+(f*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function Zr(e,t){let n=new Map,r=new Map;for(let c of e){let d=Et(c,t);if(n.set(c.id,d),d){let f=r.get(d);f?f.push(c.id):r.set(d,[c.id])}r.has(c.id)||r.set(c.id,[])}let o=new Map,i=new Map,a=new Map,l=c=>{let d=o.get(c);if(d)return d;let f=new Set,m=[],h=n.get(c)??null;for(;h&&!f.has(h);)m.push(h),f.add(h),h=n.get(h)??null;return o.set(c,m),m},s=c=>{let d=a.get(i.get(c)??"");if(d)return d;let f=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&f&&(h=s(f)),h};for(let c of e){l(c.id);let d=s(c.id),f=pe(d);i.set(c.id,f),a.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:o,groupIds:i,groupRoots:a}}function Et(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 Jr(e,t,n,r,o,i){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,d=(f,m)=>{a=Math.min(a,f),l=Math.min(l,m),s=Math.max(s,f),c=Math.max(c,m)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Tt(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Lt(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of o)!f.hidden&&e.labelIds.includes(f.objectId)&&Mt(f,d,i);return!Number.isFinite(a)||!Number.isFinite(l)?he(0,0,0,0):he(a,l,s,c)}function Qr(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let o=Et(n,t);if(!o)break;let i=t.get(o);if(!i)break;n=i}return n.id}function Dt(e,t,n){return Ft(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Ft(e,t,n,r,o,i,a,l){let s=ao(i,a,l),c=s*2,d=o==="above"?18:12,f=o==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function eo(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function to(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Me(e,t,n){let r=oo(e.properties.radius,n);if(r!==null)return r;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*o,n.minBodyRadius,n.maxBodyRadius)}}function no(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 Ee(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/fe;case"m":return e.value/1e3/fe;case"ly":return e.value*tr;case"pc":return e.value*nr;case"kpc":return e.value*rr;case"re":return e.value*Jn/fe;case"rj":return e.value*Qn/fe;case"sol":return e.value*er/fe;default:return e.value}}function ro(e,t){let n=Ee(e??null);return n===null||n<=0?0:S(n*96*t.freePlacementMultiplier,0,420)}function oo(e,t){let n=Ye(e);if(!n)return null;let r;switch(n.unit){case"sol":r=S(n.value*22,14,40);break;case"re":r=S(n.value*10,6,18);break;case"km":r=S(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=S(n.value*4,4,20);break}return S(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Ye(e){return!e||typeof e!="object"||!("value"in e)?null:e}function He(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ge(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function vt(e,t,n,r,o,i,a){let l=Pt(e,t,n,r,o,i,a,jt);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${xt(s.x)} ${xt(s.y)}`).join(" ")}function Pt(e,t,n,r,o,i,a,l){let s=[];for(let c=0;c<=l;c+=1){let d=i+(a-i)*c/l;s.push(Vt(e,t,n,r,o,d))}return s}function Vt(e,t,n,r,o,i){let a=n*Math.cos(i),l=r*Math.sin(i),s=Ct(a,l,o);return{x:e+s.x,y:t+s.y}}function Ct(e,t,n){let r=qe(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function be(e,t,n,r){let o=n==="isometric"?kt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*o}}function De(e,t,n){return t*1e3+e+n*.01}function S(e,t,n){return Math.min(Math.max(e,t),n)}function $t(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function oe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function pe(e){return`${oe(e)}-group`}function io(e){return typeof e=="string"&&e.trim()?e:void 0}function ao(e,t,n){let r=e.length*4.6*n+18,o=t.length*3.9*n+18;return Math.max(r,o,24)}function It(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function qe(e){return e*Math.PI/180}function xt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function Ge(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:po(e.system),info:mo(e.system)}:null,r=e.objects.map(so);return uo(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(lo),objects:r}}function so(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:fo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function lo(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(co)}}function co(e){return{objectId:e.objectId,placement:Rt(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Rt(e){return e?structuredClone(e):null}function uo(e,t,n){if(!n)return;let r=t.find(i=>i.id===n);if(!r)return;let o=new Map(e.map(i=>[i.id,i]));for(let i of r.positions){let a=o.get(i.objectId);a&&(a.placement=Rt(i.placement),i.inner?a.properties.inner={...i.inner}:delete a.properties.inner,i.outer?a.properties.outer={...i.outer}:delete a.properties.outer)}}function fo(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 po(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function mo(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let o=ho(n.layers);o&&(t[`${r}.layers`]=o),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function ho(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let o of["background","guides","relations","events","objects","labels","metadata"])e[o]!==void 0&&t.push(e[o]?o:`-${o}`);return t.join(" ")}var Bt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,yo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),wo=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ie(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function we(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Xe(e,t,n){let r=e.match(Bt);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let o={value:Number(r[1]),unit:r[2]??null};if(n){let i=E(n);if(i?.unitFamily&&!ke(i.unitFamily,o.unit))throw u.fromLocation(`Unit "${o.unit??"none"}" is not valid for "${n}"`,t)}return o}function Ke(e){let t=e.match(Bt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Fe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function q(e,t,n){let r=yo.get(e.toLowerCase());if(r===void 0)throw u.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function _t(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.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 u.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 vo(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(wo);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function zt(e,t,n){let r=E(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw u.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return q(ye(t,e,n),e,n);case"number":return Fe(ye(t,e,n),e,n);case"unit":return Xe(ye(t,e,n),n,e);case"string":{let o=t.join(" ").trim();return e==="image"&&vo(o,n),o}}}function Ze(e,t,n){let r=E(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw u.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function ye(e,t,n){if(e.length!==1)throw u.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Ut=new Set(["star","planet","moon","asteroid","comet"]),$o=332946.0487,Io=1047.3486,Pe=1495978707e-1,xo=6371,ko=695700,jo=63241.077,So=206264.806,Oo=206264806;function Ve(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),o=new Set(e.groups.map(l=>l.id)),i=new Set(e.events.map(l=>l.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let d=a.get(c);d?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${d}.`)):a.set(c,l)}for(let l of e.relations)Ao(l,r,n);for(let l of e.system?.viewpoints??[])Lo(l.filter,l.events??[],o,i,t,n,l.id);for(let l of e.objects)To(l,e.system,r,o,n);for(let l of e.events)Mo(l,r,n);return n}function Ao(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Lo(e,t,n,r,o,i,a){if(o==="2.1"){if(e)for(let l of e.groupIds)n.has(l)||i.push(T("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.groups`));for(let l of t)r.has(l)||i.push(T("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${a}".`,void 0,`viewpoint.${a}.events`))}}function To(e,t,n,r,o){let i=e.placement,a=i?.mode==="orbit"?i:null,l=i?.mode==="orbit"?n.get(i.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||o.push(T("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(a&&(n.has(a.target)||o.push(w("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&o.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&o.push(T("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(T("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!Wt(l?.properties.mass)&&o.push(T("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),i?.mode==="surface"){let s=n.get(i.target);s?Ut.has(s.type)||o.push(w("validate.surface.target.invalid",`Surface target "${i.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(w("validate.surface.target.unknown",`Unknown placement target "${i.target}" on "${e.id}".`,e.id,"surface"))}if(i?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&o.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Do(e,n,o)||o.push(w("validate.at.target.unknown",`Unknown at-reference target "${i.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&o.push(T("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){o.push(T("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=Nt(e,l);if(c===null){o.push(T("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||o.push(Co("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Vo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){o.push(T("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=Yt(a?.period),d=Nt(e,l);if(c===null||d===null)continue;let f=Po(e,"period");Math.abs(c-d)>f&&o.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Mo(e,t,n){let r=`event.${e.id}`,o=new Set;e.kind.trim()||n.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let i=new Set;for(let l of e.participantObjectIds){if(o.add(l),i.has(l)){n.push(T("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${r}.participants`));continue}i.add(l),t.has(l)||n.push(w("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(T("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(T("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&n.push(T("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let a=new Set;for(let l of e.positions){let s=`${r}.pose.${l.objectId}`;if(a.has(l.objectId)){n.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,s));continue}a.add(l.objectId);let c=t.get(l.objectId);if(!c){n.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,s));continue}o.has(l.objectId)||n.push(T("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,s)),Eo(l,c,t,n,s,e.id)}}function Eo(e,t,n,r,o,i){let a=e.placement;if(!a){r.push(w("validate.event.pose.placement.required",`Event "${i}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(a.mode==="orbit"){n.has(a.target)||r.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.orbit`)),a.distance&&a.semiMajor&&r.push(w("validate.event.pose.orbit.distanceConflict",`Event "${i}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`));return}if(a.mode==="surface"){let l=n.get(a.target);l?Ut.has(l.type)||r.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${i}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):r.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${i}:${e.objectId}".`,void 0,`${o}.at`));let l=a.reference;l.kind==="named"&&!n.has(l.name)?r.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="anchor"&&!n.has(l.objectId)?r.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="lagrange"&&(n.has(l.primary)?l.secondary&&!n.has(l.secondary)&&r.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)):r.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${i}:${e.objectId}".`,void 0,`${o}.at`)))}}function Do(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(w("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Nt(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Fo(n.semiMajor??n.distance),o=Wt(t?.properties.mass);return r===null||o===null||o<=0?null:Math.sqrt(r**3/o)*365.25}function Fo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Pe;case"m":return e.value/(Pe*1e3);case"ly":return e.value*jo;case"pc":return e.value*So;case"kpc":return e.value*Oo;case"re":return e.value*xo/Pe;case"sol":return e.value*ko/Pe;default:return null}}function Wt(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/$o;case"mj":return t.value/Io;default:return null}}function Yt(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Po(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Yt(n)??0:0}function Vo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function T(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Co(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ro=new Set(["climate","habitability","settlement"]),Ce=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=E(e);t&&Ce.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Ce.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Bo=new Set(Ce.keys()),_o=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function Je(e){return zo(e)}function zo(e,t){let n=Si(e),r=n.source.split(/\r?\n/),o=[],i=!1,a="2.0",l=null,s=null,c=[],d=[],f=[],m=[],h=new Map,b=!1,v=!1,x=new Set,k=new Set,p=new Set,I=new Set,V=new Set;for(let A=0;A<r.length;A++){let Z=r[A],M=A+1;if(!Z.trim())continue;let _=je(Z),N=le(Z.slice(_),{line:M,columnOffset:_});if(N.length!==0){if(!i){a=No(N,M),i=!0,n.comments.length>0&&a!=="2.1"&&o.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(_===0){s=Uo(N,M,a,o,l,c,d,f,m,h,x,k,p,I,V,{sawDefaults:b,sawAtlas:v}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(v=!0);continue}if(!s)throw new u("Indented line without parent atlas section",M,_+1);Zo(s,_,N,M)}}if(!i)throw new u('Missing required atlas schema header "schema 2.0"');let K=c.map(A=>hi(A,a,o)),C=m.map(A=>gi(A,h.get(A.id)??[])),U=t??(a==="2.0-draft"?"2.0":a),W={format:"worldorbit",sourceVersion:"1.0",system:l,groups:d,relations:f,events:C,objects:K,diagnostics:o};if(U==="2.0-draft"){let A={...W,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...Ve(A,a)),A}let B={...W,version:U,schemaVersion:U};return a==="2.0-draft"&&B.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),B.diagnostics.push(...Ve(B,a)),B}function No(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new u('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Uo(e,t,n,r,o,i,a,l,s,c,d,f,m,h,b,v){switch(e[0]?.value.toLowerCase()){case"system":if(o)throw new u('Atlas section "system" may only appear once',t,e[0].column);return Wo(e,t,n,r);case"defaults":if(!o)throw new u('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(v.sawDefaults)throw new u('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:o,seenFields:new Set};case"atlas":if(!o)throw new u('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(v.sawAtlas)throw new u('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:o,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!o)throw new u('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Yo(e,t,o,d,n,r);case"annotation":if(!o)throw new u('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Ho(e,t,o,f);case"group":return P(n,r,"group",{line:t,column:e[0].column}),qo(e,t,a,m);case"relation":return P(n,r,"relation",{line:t,column:e[0].column}),Go(e,t,l,h);case"event":return P(n,r,"event",{line:t,column:e[0].column}),Xo(e,t,s,c,b,n,r);case"object":return Ko(e,t,n,r,i);default:throw new u(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Wo(e,t,n,r){if(e.length!==2)throw new u("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Yo(e,t,n,r,o,i){if(e.length!==2)throw new u("Invalid viewpoint declaration",t,e[0]?.column??1);let a=ie(e[1].value);if(!a)throw new u("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new u(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:we(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:o,diagnostics:i,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function Ho(e,t,n,r){if(e.length!==2)throw new u("Invalid annotation declaration",t,e[0]?.column??1);let o=ie(e[1].value);if(!o)throw new u("Annotation id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate annotation id "${o}"`,t,e[1].column);let i={id:o,label:we(o),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(i),r.add(o),{kind:"annotation",annotation:i,seenFields:new Set}}function qo(e,t,n,r){if(e.length!==2)throw new u("Invalid group declaration",t,e[0]?.column??1);let o=ie(e[1].value);if(!o)throw new u("Group id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate group id "${o}"`,t,e[1].column);let i={id:o,label:we(o),summary:"",color:null,tags:[],hidden:!1};return n.push(i),r.add(o),{kind:"group",group:i,seenFields:new Set}}function Go(e,t,n,r){if(e.length!==2)throw new u("Invalid relation declaration",t,e[0]?.column??1);let o=ie(e[1].value);if(!o)throw new u("Relation id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate relation id "${o}"`,t,e[1].column);let i={id:o,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(i),r.add(o),{kind:"relation",relation:i,seenFields:new Set}}function Xo(e,t,n,r,o,i,a){if(e.length!==2)throw new u("Invalid event declaration",t,e[0]?.column??1);let l=ie(e[1].value);if(!l)throw new u("Event id must not be empty",t,e[1].column);if(o.has(l))throw new u(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:we(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),o.add(l),{kind:"event",event:s,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Ko(e,t,n,r,o){if(e.length<3)throw new u("Invalid atlas object declaration",t,e[0]?.column??1);let i=e[1],a=e[2],l=i.value;if(!xe.has(l)||l==="system")throw new u(`Unknown object type "${i.value}"`,t,i.column);let s={objectType:l,id:a.value,fields:pi(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:i.column}};return o.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Zo(e,t,n,r){switch(e.kind){case"system":Jo(e,n,r);return;case"defaults":Qo(e,n,r);return;case"atlas":ei(e,t,n,r);return;case"viewpoint":ti(e,t,n,r);return;case"annotation":ri(e,n,r);return;case"group":oi(e,n,r);return;case"relation":ii(e,n,r);return;case"event":ai(e,t,n,r);return;case"object":li(e,t,n,r);return}}function Jo(e,t,n){let r=X(t,e.seenFields,n),o=$(t,n);switch(r){case"title":e.system.title=o;return;case"description":P(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=o;return;case"epoch":P(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=o;return;case"referenceplane":P(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=o;return;default:throw new u(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Qo(e,t,n){let r=X(t,e.seenFields,n),o=$(t,n);switch(r){case"view":e.system.defaults.view=qt(o,n,t[0].column);return;case"scale":e.system.defaults.scale=o;return;case"units":e.system.defaults.units=o;return;case"preset":e.system.defaults.preset=Gt(o,n,t[0].column);return;case"theme":e.system.defaults.theme=o;return;default:throw new u(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ei(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let o=Kt(n,r,"Invalid atlas metadata entry");if(o.key in e.system.atlasMetadata)throw new u(`Duplicate atlas metadata key "${o.key}"`,r,n[0].column);e.system.atlasMetadata[o.key]=o.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new u(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ti(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){ni(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new u('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let o=X(n,e.seenFields,r),i=$(n,r);switch(o){case"label":e.viewpoint.label=i;return;case"summary":e.viewpoint.summary=i;return;case"focus":e.viewpoint.focusObjectId=i;return;case"select":e.viewpoint.selectedObjectId=i;return;case"projection":e.viewpoint.projection=qt(i,r,n[0].column);return;case"preset":e.viewpoint.preset=Gt(i,r,n[0].column);return;case"zoom":e.viewpoint.zoom=di(i,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Xt(i,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=ui(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":P(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=z(n.slice(1),r,"events");return;default:throw new u(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function ni(e,t,n){let r=X(t,e.seenFilterFields,n),o=e.viewpoint.filter??fi();switch(r){case"query":o.query=$(t,n);break;case"objecttypes":o.objectTypes=ci(t.slice(1),n);break;case"tags":o.tags=z(t.slice(1),n,"tags");break;case"groups":o.groupIds=z(t.slice(1),n,"groups");break;default:throw new u(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=o}function ri(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=z(t.slice(1),n,"tags");return;default:throw new u(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function oi(e,t,n){switch(X(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ii(e,t,n){switch(X(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=z(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function ai(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){e.activePose.fields.push(si(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new u(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let i=n[1].value;if(!i.trim())throw new u("Event pose object id must not be empty",r,n[1].column);let a={objectId:i,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new u('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(X(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=z(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"tags":e.event.tags=z(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=q($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new u(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function si(e,t,n){if(e.length<2)throw new u("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!_o.has(r))throw new u(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new u(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(o=>o.value),location:{line:t,column:e[0].column}}}function li(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let o=n[0].value.toLowerCase();if(o==="info"||Ro.has(o)){o!=="info"&&P(e.sourceSchemaVersion,e.diagnostics,o,{line:r,column:n[0].column}),e.activeBlock=o,e.blockIndent=t;return}}if(e.activeBlock){let o=Kt(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(o.key))throw new u(`Duplicate info key "${o.key}"`,r,n[0].column);e.seenInfoKeys.add(o.key),e.objectNode.infoEntries.push(o);return}let i=e.activeBlock,a=e.seenTypedBlockKeys[i]??(e.seenTypedBlockKeys[i]=new Set);if(a.has(o.key))throw new u(`Duplicate ${i} key "${o.key}"`,r,n[0].column);a.add(o.key),(e.objectNode.typedBlockEntries[i]??(e.objectNode.typedBlockEntries[i]=[])).push(o);return}e.objectNode.fields.push(mi(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function X(e,t,n){if(e.length<2)throw new u("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new u(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new u("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ci(e,t){return z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ui(e,t,n,r){let o={};for(let i of z(e,t,"layers")){let a=!i.startsWith("-")&&!i.startsWith("!"),l=i.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){o["orbits-back"]=a,o["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&P(n,r,"layers.events",{line:t,column:e[0]?.column??1}),o[l]=a)}return o}function z(e,t,n){if(e.length===0)throw new u(`Missing value for atlas field "${n}"`,t,1);let r=e.map(o=>o.value).filter(Boolean);if(r.length===0)throw new u(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function qt(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new u(`Unknown projection "${e}"`,t,n);return r}function Gt(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new u(`Unknown render preset "${e}"`,t,n)}function di(e,t,n,r){let o=Xt(e,t,n,r);if(o<=0)throw new u(`Field "${r}" must be greater than zero`,t,n);return o}function Xt(e,t,n,r){let o=Number(e);if(!Number.isFinite(o))throw new u(`Invalid numeric value "${e}" for "${r}"`,t,n);return o}function fi(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function pi(e,t,n,r,o){let i=[],a=0;for(;a<e.length;){let l=e[a],s=ve(l.value);if(!s)throw new u(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&P(r,o,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let d=e[a];d&&(c.push(d),a++)}else if(s.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[a];if(!f)break;c.push(f),a++}else for(;a<e.length&&!Bo.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new u(`Missing value for field "${l.value}"`,t,l.column);i.push({type:"field",key:l.value,values:c.map(d=>d.value),location:{line:t,column:l.column}})}return en(i,n),i}function mi(e,t,n,r,o){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);let i=ve(e[0].value);if(!i)throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);i.version==="2.1"&&P(r,o,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return en([a],n),a}function Kt(e,t,n){if(e.length<2)throw new u(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function hi(e,t,n){let r=Zt(e.fields),o=Jt(r),i=yi(e.objectType,r),a=ki(r.get("groups")?.[0]),l=Ht(r.get("epoch")?.[0]),s=Ht(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?q(R(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?$i(r.get("resonance")[0]):void 0,f=vi(r),m=r.get("derive")?.map(I=>Ii(I)),h=r.get("validate")?.map(I=>({rule:R(I)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,v=r.get("tolerance")?.map(I=>xi(I)),x=wi(e.typedBlockEntries),k=Qt(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:i,placement:o,info:k};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),d&&(p.resonance=d),f&&(p.renderHints=f),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),b?.length&&(p.lockedFields=b),v?.length&&(p.tolerances=v),x&&Object.keys(x).length>0&&(p.typedBlocks=x),t!=="2.1"&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&P(t,n,e.id,e.location),p}function gi(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>bi(n))}}function bi(e){let t=Zt(e.fields),n=Jt(t);return{objectId:e.objectId,placement:n,inner:G(t.get("inner")?.[0],"inner"),outer:G(t.get("outer")?.[0],"outer")}}function Zt(e){let t=new Map;for(let n of e){let r=ve(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);let o=t.get(n.key)??[];o.push(n),t.set(n.key,o)}return t}function Jt(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],o=e.get("free")?.[0];if([t,n,r,o].filter(Boolean).length>1){let a=t??n??r??o;throw u.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:R(t),distance:G(e.get("distance")?.[0],"distance"),semiMajor:G(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ji(e.get("eccentricity")?.[0],"eccentricity"),period:G(e.get("period")?.[0],"period"),angle:G(e.get("angle")?.[0],"angle"),inclination:G(e.get("inclination")?.[0],"inclination"),phase:G(e.get("phase")?.[0],"phase")};if(n){let a=R(n);return{mode:"at",target:a,reference:_t(a,n.location)}}if(r)return{mode:"surface",target:R(r)};if(o){let a=R(o),l=Ke(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function yi(e,t){let n={};for(let[r,o]of t.entries()){let i=o[0],a=ve(r);!i||!a?.legacySchema||a.legacySchema.placement||(Ze(r,e,i.location),n[r]=zt(r,i.values,i.location))}return n}function Qt(e,t){let n={};for(let r of e){if(r.key in n)throw u.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function wi(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Qt(r,n))}return t}function vi(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],o=e.get("renderPriority")?.[0];return n&&(t.renderLabel=q(R(n),"renderLabel",n.location)),r&&(t.renderOrbit=q(R(r),"renderOrbit",r.location)),o&&(t.renderPriority=Fe(R(o),"renderPriority",o.location)),Object.keys(t).length>0?t:void 0}function $i(e){if(e.values.length!==2)throw u.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw u.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ii(e){if(e.values.length!==2)throw u.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function xi(e){if(e.values.length!==2)throw u.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Ke(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ki(e){return e?[...new Set(e.values)]:[]}function Ht(e){return e&&e.values.join(" ").trim()||null}function G(e,t){return e?Xe(R(e),e.location,t):void 0}function ji(e,t){return e?Fe(R(e),t,e.location):void 0}function R(e){return ye(e.values,e.key,e.location)}function ve(e){return Ce.get(e)}function en(e,t){for(let n of e){let r=ve(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Ze(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function P(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Si(e){let t=[...e],n=[],r=!1,o=!1,i=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],d=t[s+1];if(o){if(c==="*"&&d==="/"){t[s]=" ",t[s+1]=" ",o=!1,i=null,s++,l+=2;continue}c!==`
2
- `&&c!=="\r"&&(t[s]=" "),c===`
3
- `?(a++,l=1):l++;continue}if(!r&&c==="/"&&d==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",o=!0,i={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!Oi(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
4
- `&&t[f]!=="\r";)t[f]=" ",f++;l+=f-s,s=f-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
5
- `?(a++,l=1):l++}if(o)throw u.fromLocation("Unclosed block comment",i??void 0);return{source:t.join(""),comments:n}}function Oi(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let o=e[n];return o===void 0||o===" "||o===" "||o==="\r"||o===`
6
- `}var Ai=/^schema\s+2(?:\.0|\.1)?$/i,Li=/^schema\s+2\.1$/i,Ti=/^schema\s+2\.0-draft$/i;function tn(e){for(let t of Mi(e).split(/\r?\n/)){let n=t.trim();if(n)return Ti.test(n)?"2.0-draft":Li.test(n)?"2.1":Ai.test(n)?"2.0":"1.0"}return"1.0"}function Mi(e){let t=[...e],n=!1,r=!1;for(let o=0;o<t.length;o++){let i=t[o],a=t[o+1];if(r){if(i==="*"&&a==="/"){t[o]=" ",t[o+1]=" ",r=!1,o++;continue}i!==`
7
- `&&i!=="\r"&&(t[o]=" ");continue}if(!n&&i==="/"&&a==="*"){t[o]=" ",t[o+1]=" ",r=!0,o++;continue}if(!n&&i==="#"){t[o]=" ";let l=o+1;for(;l<t.length&&t[l]!==`
8
- `&&t[l]!=="\r";)t[l]=" ",l++;o=l-1;continue}i==='"'&&t[o-1]!=="\\"&&(n=!n)}return t.join("")}function ee(e){let t=nn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new u(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function nn(e){let t=tn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return Ei(e,t);let n;try{n=ce(e)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"parse")]}}let r;try{r=ue(n)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"normalize")]}}try{de(r)}catch(o){return{ok:!1,value:null,diagnostics:[Q(o,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ei(e,t){let n;try{n=Je(e)}catch(a){return{ok:!1,value:null,diagnostics:[Q(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let o;try{o=Ge(n)}catch(a){return{ok:!1,value:null,diagnostics:[Q(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:o,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Pi={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},Re={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Qe(e){return e?typeof e=="string"?Re[e]??Re.atlas:{...Re.atlas,...e}:Re.atlas}function et(e){return{...Pi,...e}}function Be(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:tt(e.objectTypes??[]),tags:tt((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:tt((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return Vi(t)?t:null}function Vi(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function nt(e,t){let n=Be(t),r=new Set;for(let o of e.objects)if(!o.hidden&&Ci(o,n)&&(r.add(o.objectId),n?.includeAncestors!==!1))for(let i of o.ancestorIds)r.add(i);return n?r:new Set(e.objects.filter(o=>!o.hidden).map(o=>o.objectId))}function Ci(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(o=>e.semanticGroupIds.includes(o)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=Ri(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(o=>n.includes(o)))return!1}return!0}function Ri(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(o=>Array.isArray(o)?o:typeof o=="object"&&o&&"value"in o?[String(o.value),String(o.unit??"")]:[String(o)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function tt(e){return[...new Set(e)]}var rt="worldorbit-camera-root";function te(e,t={}){let n=Qe(t.theme),r=ea(t.preset??e.renderPreset??void 0),o=et({...r.layers,...t.layers}),i=t.subtitle??e.subtitle,a=nt(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>o.structures||!_e(p.object)).sort((p,I)=>p.sortKey-I.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>o.structures||!_e(p.object)),c=zi(l),d=o.orbits?_i(e,a,o.structures):{back:"",front:""},f=o.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>o.structures||!_e(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-group-id="${L(p.groupId??"")}" />`).join(""):"",m=o.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-relation-id="${L(p.relationId)}" />`).join(""):"",h=o.events?e.events.filter(p=>!p.hidden).map(p=>Bi(e,p,a,n)).join(""):"",b=o.objects?l.map(p=>Ni(p,t.selectedObjectId??null,n)).join(""):"",v=o.labels?s.map(p=>Ui(e,p,t.selectedObjectId??null)).join(""):"",x=o.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
9
- <text class="wo-subtitle" x="56" y="88">${O(i)}</text>
10
- <text class="wo-meta" x="56" y="${e.height-42}">${O(na(e))}</text>`:"",k=o.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
11
- <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
12
- ${o.guides?ta(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
13
- <title id="worldorbit-title">${O(e.title)}</title>
14
- <desc id="worldorbit-desc">A ${O(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
15
- <defs>
16
- <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
17
- <stop offset="0%" stop-color="${n.backgroundStart}" />
18
- <stop offset="100%" stop-color="${n.backgroundEnd}" />
19
- </linearGradient>
20
- <radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
21
- <stop offset="0%" stop-color="${n.starGlow}" stop-opacity="0.95" />
22
- <stop offset="100%" stop-color="${n.starCore}" stop-opacity="0" />
23
- </radialGradient>
24
- <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
25
- <stop offset="0%" stop-color="${n.backgroundGlow}" />
26
- <stop offset="100%" stop-color="transparent" />
27
- </radialGradient>
28
- ${c}
29
- </defs>
30
- <style>
31
- .wo-bg { fill: url(#wo-bg); }
32
- .wo-bg-glow { fill: url(#wo-bg-glow); }
33
- .wo-grid { fill: none; stroke: ${n.guide}; stroke-width: 1; }
34
- .wo-orbit { fill: none; stroke: ${n.orbit}; stroke-width: 1.5; }
35
- .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
36
- .wo-orbit-front { opacity: 0.9; }
37
- .wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
38
- .wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
39
- .wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
40
- .wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
41
- .wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
42
- .wo-leader { stroke: ${n.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
43
- .wo-label { fill: ${n.ink}; font-family: ${n.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
44
- .wo-label-secondary { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
45
- .wo-title { fill: ${n.ink}; font: 700 24px ${n.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
46
- .wo-subtitle { fill: ${n.muted}; font: 500 12px ${n.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
47
- .wo-meta { fill: ${n.muted}; font: 500 11px ${n.fontFamily}; letter-spacing: 0.06em; }
48
- .wo-object { cursor: pointer; outline: none; }
49
- .wo-object:focus-visible .wo-selection-ring,
50
- .wo-object:hover .wo-selection-ring,
51
- .wo-object-selected .wo-selection-ring { display: block; }
52
- .wo-object-selected .wo-selection-ring { stroke: ${n.selected}; }
53
- .wo-object-label-selected .wo-label { fill: ${n.accent}; }
54
- .wo-object-label-selected .wo-label-secondary { fill: ${n.selected}; }
55
- .wo-chain-selected .wo-selection-ring,
56
- .wo-chain-hover .wo-selection-ring { display: block; }
57
- .wo-ancestor-selected .wo-selection-ring,
58
- .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
59
- .wo-chain-selected .wo-label,
60
- .wo-chain-hover .wo-label { fill: ${n.accent}; }
61
- .wo-ancestor-selected .wo-label,
62
- .wo-ancestor-hover .wo-label { fill: ${n.ink}; opacity: 0.82; }
63
- .wo-orbit-related-selected,
64
- .wo-orbit-related-hover { stroke: ${n.accentStrong}; opacity: 1; }
65
- .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
66
- .wo-object-image { pointer-events: none; }
67
- </style>
68
- ${k}
69
- ${x}
70
- <g data-worldorbit-world="true">
71
- <g data-worldorbit-camera-root="${rt}" id="${rt}">
72
- <g data-worldorbit-world-content="true">
73
- ${o.orbits?`<g data-layer-id="orbits-back">${d.back}</g>`:""}
74
- ${o.guides?`<g data-layer-id="guides">${f}</g>`:""}
75
- ${o.relations?`<g data-layer-id="relations">${m}</g>`:""}
76
- ${o.events?`<g data-layer-id="events">${h}</g>`:""}
77
- ${o.objects?`<g data-layer-id="objects">${b}</g>`:""}
78
- ${o.orbits?`<g data-layer-id="orbits-front">${d.front}</g>`:""}
79
- ${o.labels?`<g data-layer-id="labels">${v}</g>`:""}
80
- </g>
81
- </g>
82
- </g>
83
- </svg>`}function Bi(e,t,n,r){let o=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(o.length===0)return"";let i=t.event.color||r.accent,a=t.event.label||t.event.id,l=o.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${L(i)}" data-event-id="${L(t.eventId)}" data-object-id="${L(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${O(t.renderId)}" data-event-id="${L(t.eventId)}">
84
- ${l}
85
- <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${L(i)}" />
86
- <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${O(a)}</text>
87
- </g>`}function _i(e,t,n){let r=[],o=[];for(let i of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!_e(a.object)))){let a=i.bandThickness??(i.band?10:1.5),l=i.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${O(i.renderId)}" data-orbit-object-id="${L(i.objectId)}" data-parent-id="${L(i.parentId)}" data-group-id="${L(i.groupId??"")}"`;if(i.backArcPath||i.frontArcPath){i.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${i.backArcPath}" stroke-width="${a}" ${s} />`),i.frontArcPath&&o.push(`<path class="${l} wo-orbit-front" d="${i.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(i.kind==="ellipse"){let c=i.rx??i.radius??0,d=i.ry??i.radius??0;o.push(`<ellipse class="${l} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" rx="${c}" ry="${d}" transform="rotate(${i.rotationDeg} ${i.cx} ${i.cy})" stroke-width="${a}" ${s} />`);continue}o.push(`<circle class="${l} wo-orbit-front" cx="${i.cx}" cy="${i.cy}" r="${i.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:o.join("")}}function zi(e){return e.filter(t=>!!t.imageHref).map(t=>Hi(t)).join("")}function Ni(e,t,n){let{object:r,x:o,y:i,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",d=Gi(e,n),f=Yi(e),m=f?on(r,o,i,a,d,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${O(e.objectId)}" data-parent-id="${L(e.parentId??"")}" data-group-id="${L(e.groupId??"")}" data-render-id="${O(e.renderId)}" tabindex="0" role="button" aria-label="${O(`${r.type} ${e.objectId}`)}">
88
- <circle class="wo-selection-ring" cx="${o}" cy="${i}" r="${l+8}" />
89
- ${Wi(e,d)}
90
- ${on(r,o,i,a,d)}
91
- ${f}
92
- ${m}
93
- </g>`}function Ui(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",o=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${O(t.objectId)}" data-group-id="${L(t.groupId??"")}" data-render-id="${O(t.renderId)}">
94
- <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*o}">${O(t.label)}</text>
95
- <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*o}">${O(t.secondaryLabel)}</text>
96
- </g>`}function on(e,t,n,r,o,i={}){let a=i.outlineOnly?"transparent":o.fill,l=o.tail??o.fill;switch(e.type){case"star":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${o.glow??"url(#wo-star-glow)"}" opacity="0.84" />
97
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="${i.outlineOnly?1.5:1.4}" />`;case"comet":return i.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
98
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${cn(t,n,r)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return i.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:`<polygon points="${ot(t,n,r)}" fill="transparent" stroke="${o.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${o.accentRing??o.stroke}" stroke-width="3.5" />
99
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${o.halo??"none"}" stroke="none" />
100
- <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${o.stroke}" stroke-width="1.2" />
101
- <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${o.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />
102
- <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${o.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${o.halo??"none"}" stroke="none" />
103
- <circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${o.stroke}" stroke-width="1" />`:`<polygon points="${ot(t,n,r)}" fill="${a}" stroke="${o.stroke}" stroke-width="1.4" />`}}}function Wi(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:o,radius:i}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${o}" r="${i+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Yi(e){if(!e.imageHref)return"";let t=qi(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${L(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${L(ln(e))})" />`}function Hi(e){let{x:t,y:n,radius:r}=e,o="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":o=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":o=`<polygon points="${cn(t,n,r)}" />`;break;case"phenomenon":o=`<polygon points="${ot(t,n,r)}" />`;break;default:return""}return`<clipPath id="${L(ln(e))}" clipPathUnits="userSpaceOnUse">${o}</clipPath>`}function qi(e){let{object:t,x:n,y:r,radius:o}=e;switch(t.type){case"structure":return{x:n-o,y:r-o,width:o*2,height:o*2};case"phenomenon":return{x:n-o*1.2,y:r-o*1.2,width:o*2.4,height:o*2.4};default:return{x:n-o,y:r-o,width:o*2,height:o*2}}}function Gi(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Xi(e.object.type,n,t),o=e.fillColor&&oa(e.fillColor)?e.fillColor:r.fill,i=an(e.object.properties.albedo),a=an(e.object.properties.temperature),l=Zi(o,a,i,e.object.type),s=$e(l,"#ffffff",.4)??r.stroke,c=Qi(e.object.properties.atmosphere),d=e.object.type==="star"?sn($e(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:d,atmosphere:c,tail:e.object.type==="comet"?sn($e(l,"#ffffff",.5)??l,.72):void 0}}function Xi(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ki(t)}}function Ki(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function Zi(e,t,n,r){let o=e;if(t!==null){let i=Ji(t,r);o=$e(o,i,r==="star"?.42:.2)??o}if(n!==null){let i=Math.min(Math.max(n,0),1);o=$e(o,i>=.5?"#ffffff":"#0f1520",Math.abs(i-.5)*.7)??o}return o}function Ji(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Qi(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 ea(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 an(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function ln(e){return`${e.renderId}-clip`}function cn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function ot(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function ta(e,t){let n=Array.from({length:10},(o,i)=>{let a=90+i*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(o,i)=>{let a=150+i*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function na(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function _e(e){return e.type==="structure"||e.type==="phenomenon"}function $e(e,t,n){let r=it(e),o=it(t);if(!r||!o)return;let i=Math.min(Math.max(n,0),1);return ra({r:Math.round(r.r+(o.r-r.r)*i),g:Math.round(r.g+(o.g-r.g)*i),b:Math.round(r.b+(o.b-r.b)*i)})}function sn(e,t){let n=it(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function it(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function ra(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function oa(e){return!!e.trim()}function O(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function L(e){return O(e)}function un(e){return encodeURIComponent(JSON.stringify(e))}function st(e,t,n={}){return{version:"2.0",mode:t,scene:e,options:{initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function lt(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=te(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${ze(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${ze(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${ze(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${ze(un(n))}">${r}</div>`}function ze(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ae(e,t={}){try{let n=ee(e),r=H(n.document,$a(n,t));return(t.mode??"static")==="interactive"?lt(st(r,"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="${va(t.className??"worldorbit-block worldorbit-static")}">${te(r,t)}</figure>`}catch(n){if(t.strict)throw n;return ct(n instanceof Error?n.message:String(n))}}function ct(e){return`<pre class="worldorbit-error">WorldOrbit error: ${dn(e)}</pre>`}function dn(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function va(e){return dn(e).replaceAll('"',"&quot;")}function $a(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function fn(e={}){return function(n){pn(n,(r,o,i)=>{!i||o===-1||r.type!=="code"||!Ia(r.lang)||(i.children[o]={type:"html",value:ae(r.value??"",e)})})}}function pn(e,t,n=null){let r=e.children??[];for(let o=0;o<r.length;o+=1){let i=r[o];t(i,o,e),pn(i,t,e)}n||t(e,-1,null)}function Ia(e){return(e??"").trim().toLowerCase()==="worldorbit"}function mn(e={}){return function(n){hn(n,(r,o,i)=>{if(!i||o===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!xa(a.properties?.className).includes("language-worldorbit"))return;let s=gn(a);i.children[o]={type:"raw",value:ae(s,e)}})}}function hn(e,t,n=null){let r=e.children??[];for(let o=0;o<r.length;o+=1){let i=r[o];t(i,o,e),hn(i,t,e)}n||t(e,-1,null)}function xa(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function gn(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>gn(t)).join("")}return On(ka);})();
1
+ export * from "./markdown/dist/index.js";