worldorbit 2.6.0 → 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 (196) hide show
  1. package/README.md +12 -5
  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 -6542
  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 -12250
  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 -6179
  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 -8334
  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 -6614
  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 -12275
  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 -6207
  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 -8391
  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 -904
  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 -9704
  173. package/dist/unpkg/worldorbit.min.js +2 -263
  174. package/package.json +1 -1
  175. package/packages/core/dist/index.d.ts +1 -0
  176. package/packages/core/dist/index.js +1 -0
  177. package/packages/core/dist/spatial-scene.d.ts +3 -0
  178. package/packages/core/dist/spatial-scene.js +420 -0
  179. package/packages/core/dist/types.d.ts +105 -0
  180. package/packages/editor/dist/editor.js +25 -4
  181. package/packages/editor/dist/types.d.ts +4 -0
  182. package/packages/markdown/dist/html.js +10 -3
  183. package/packages/viewer/dist/atlas-state.js +3 -0
  184. package/packages/viewer/dist/atlas-viewer.js +1 -0
  185. package/packages/viewer/dist/custom-element.js +18 -4
  186. package/packages/viewer/dist/embed.d.ts +5 -1
  187. package/packages/viewer/dist/embed.js +58 -24
  188. package/packages/viewer/dist/errors.d.ts +6 -0
  189. package/packages/viewer/dist/errors.js +12 -0
  190. package/packages/viewer/dist/index.d.ts +1 -0
  191. package/packages/viewer/dist/index.js +1 -0
  192. package/packages/viewer/dist/runtime-3d.d.ts +19 -0
  193. package/packages/viewer/dist/runtime-3d.js +494 -0
  194. package/packages/viewer/dist/types.d.ts +21 -2
  195. package/packages/viewer/dist/vendor/three.module.js +53032 -0
  196. package/packages/viewer/dist/viewer.js +501 -41
@@ -1,904 +1 @@
1
- "use strict";var WorldOrbitEditor=(()=>{var br=Object.defineProperty;var fa=Object.getOwnPropertyDescriptor;var ma=Object.getOwnPropertyNames;var ha=Object.prototype.hasOwnProperty;var ga=(e,t)=>{for(var n in t)br(e,n,{get:t[n],enumerable:!0})},ba=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ma(t))!ha.call(e,i)&&i!==n&&br(e,i,{get:()=>t[i],enumerable:!(r=fa(t,i))||r.enumerable});return e};var ya=e=>ba(br({},"__esModule",{value:!0}),e);var Bu={};ga(Bu,{createWorldOrbitEditor:()=>Jo});var b=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var Zt=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Oe=Zt.filter(e=>e!=="system"),wa=["star","planet","moon","asteroid","comet","structure","phenomenon"],ci=["structure","phenomenon"],it=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],va=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function _(e,t){return{key:e,...t}}var Vn=new Set(Zt),li=new Map([_("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:it}),_("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"distance"}),_("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"distance"}),_("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:it}),_("period",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"duration"}),_("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:it,unitFamily:"angle"}),_("at",{kind:"string",placement:!0,arity:"single",objectTypes:ci}),_("surface",{kind:"string",placement:!0,arity:"single",objectTypes:ci}),_("free",{kind:"string",placement:!0,arity:"single",objectTypes:va}),_("kind",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("class",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("culture",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Zt}),_("color",{kind:"string",placement:!1,arity:"single",objectTypes:Zt}),_("image",{kind:"string",placement:!1,arity:"single",objectTypes:wa}),_("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Zt}),_("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"radius"}),_("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"mass"}),_("density",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"generic"}),_("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:Oe}),_("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),_("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),_("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),_("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),_("on",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("source",{kind:"string",placement:!1,arity:"single",objectTypes:Oe}),_("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:Oe,unitFamily:"duration"})].map(e=>[e.key,e])),$a=new Set(li.keys());function Ie(e){return li.get(e)}function di(e){return $a.has(e)}function ui(e,t){return e.objectTypes.includes(t)}function Rn(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 Jt(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,s=!1,c=!1,a=null,l=()=>{o!==null&&(n.push({value:i,column:o,quoted:s}),i="",o=null,s=!1)};for(let d=0;d<e.length;d++){let f=e[d],w=r+d+1;if(c&&f==="\\"){let I=e[d+1];if(I==='"'||I==="\\"){i+=I,d++;continue}}if(f==='"'){c?c=!1:(o===null&&(o=w),s=!0,a=w,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}o===null&&(o=w),i+=f}if(c)throw new b("Unclosed quote in line",t.line,a??r+e.length);return l(),n}function zn(e){return e.match(/^\s*/)?.[0].length??0}function Qt(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,o=null;for(let s=0;s<t.length;s++){let c=t[s],a=s+1;if(!c.trim())continue;let l=zn(c),d=Jt(c.slice(l),{line:a,columnOffset:l});if(d.length!==0){if(l===0){i=!1,o=null;let f=xa(d,a);n.push(f),r=f;continue}if(!r)throw new b("Indented line without parent object",a,l+1);if(d.length===1&&d[0].value==="info"){i=!0,o=l;continue}i&&l<=(o??0)&&(i=!1),i?r.infoEntries.push(ka(d,a)):r.blockFields.push(ja(d,a))}}return{type:"document",objects:n}}function xa(e,t){if(e.length<2)throw new b("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Vn.has(n.value))throw new b(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Ia(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Ia(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=Ie(i.value);if(!o)throw new b(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(o.arity==="multiple")for(;r<e.length&&!di(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new b(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(c=>c.value),location:{line:t,column:i.column}})}return n}function ja(e,t){if(e.length<2)throw new b("Invalid field line",t,e[0]?.column??1);if(!Ie(e[0].value))throw new b(`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 ka(e,t){if(e.length<2)throw new b("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 pi=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Sa=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Oa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function en(e){let t=null,n=[];for(let r of e.objects){let i=Ea(r);if(r.objectType==="system"){if(t)throw b.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Ea(e){let t=[...e.inlineFields,...e.blockFields];Ma(e.objectType,t);let n=Da(t),r=Pa(e.objectType,n),i=Aa(n),o=Ca(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Ma(e,t){for(let n of t){let r=Ie(n.key);if(!r)throw b.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ui(r,e))throw b.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw b.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Da(e){let t=new Map;for(let n of e){if(t.has(n.key))throw b.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Pa(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),s=[n,r,i,o].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw b.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw b.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:_n(t,"orbit"),distance:Mt(t,"distance"),semiMajor:Mt(t,"semiMajor"),eccentricity:Ra(t,"eccentricity"),period:Mt(t,"period"),angle:Mt(t,"angle"),inclination:Mt(t,"inclination"),phase:Mt(t,"phase")};if(r){let c=Bn(t,"at"),a=_n(t,"at");return{mode:"at",target:a,reference:Fa(a,c.location)}}if(i)return{mode:"surface",target:_n(t,"surface")};if(o){let c=_n(t,"free"),a=Va(c);return{mode:"free",distance:a??void 0,descriptor:a?void 0:c}}return null}function Aa(e){let t={};for(let[n,r]of e.entries()){let i=Ie(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=za(r);break;case"number":t[n]=mi(Dt(r),n,r.location);break;case"unit":t[n]=fi(Dt(r),r.location,n);break;case"string":t[n]=La(n,r);break}}return t}function La(e,t){let n=t.values.join(" ").trim();return e==="image"&&Ta(n,t.location),n}function Ta(e,t){if(!e)throw b.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw b.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Oa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw b.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Ca(e){let t={};for(let n of e){if(n.key in t)throw b.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Fa(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.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 b.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function fi(e,t,n){let r=e.match(pi);if(!r)throw b.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=Ie(n);if(o?.unitFamily&&!Rn(o.unitFamily,i.unit))throw b.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Va(e){let t=e.match(pi);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Mt(e,t){if(!e.has(t))return;let n=Bn(e,t);return fi(Dt(n),n.location,t)}function Ra(e,t){if(!e.has(t))return;let n=Bn(e,t);return mi(Dt(n),t,n.location)}function mi(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw b.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function za(e){let t=Dt(e).toLowerCase(),n=Sa.get(t);if(n===void 0)throw b.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Bn(e,t){let n=e.get(t);if(!n)throw new b(`Missing value for key "${t}"`);return n}function _n(e,t){return Dt(Bn(e,t))}function Dt(e){if(e.values.length!==1)throw b.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var _a=new Set(["star","planet","moon","asteroid","comet"]);function tn(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new b(`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 b(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!_a.has(i.type))throw new b(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Ba(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Na(r,r.placement.reference,t))}}function Ba(e,t,n){if(!n.has(t.primary))throw new b(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new b(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Na(e,t,n){if(!n.has(t.objectId))throw new b(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function $t(e,t,n=`${t}.failed`){return e instanceof b?{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 nn=1495978707e-1,Ua=6371,Wa=71492,Ya=695700,Ha=63241.077,qa=206264.806,Ga=206264806,$i=.68,Xa=.2,xi=28;function Ee(e,t={}){let n=Ja(t),r=n.width,i=n.height,o=n.padding,s=Za(e),c=es(e,t.projection),a=Ir(t.camera??null),l=xr(c,a),d=rs(s,t.scaleModel),f=os(s),w=e.system?.id??null,I=t.activeEventId??null,S=Ka(e.objects,e.events??[],I),k=new Map(S.map(O=>[O.id,O])),C=Ns(S,k),Y=new Map,v=[],P=[],ne=[],X=[],Q=[],re=new Map,U=new Map;for(let O of S){let fe=O.placement;if(!fe){ne.push(O);continue}if(fe.mode==="orbit"){yi(U,fe.target,O);continue}if(fe.mode==="surface"){yi(re,fe.target,O);continue}if(fe.mode==="at"){Q.push(O);continue}X.push(O)}let be=X.length>0?r*.42:r/2,ee=i/2,te={orbitChildren:U,surfaceChildren:re,objectMap:k,spacingFactor:f,projection:l,scaleModel:d},q=ne.find(O=>O.type==="star")??ne[0]??null;q&&wr(q,be,ee,0,Y,v,P,te);let we=ne.filter(O=>O.id!==q?.id);if(we.length>0){let O=Math.min(r,i)*.28*f*d.orbitDistanceMultiplier;we.forEach((fe,W)=>{let ie=cn(W,we.length,-Math.PI/2),$e=ln(ie,O,l,1);wr(fe,be+$e.x,ee+$e.y,0,Y,v,P,te)})}X.forEach((O,fe)=>{let W=r-o-140-Gs(O.placement?.mode==="free"?O.placement.distance:void 0,d),ie=Math.max(76,(i-o*2-180)/Math.max(1,X.length)*f)*d.freePlacementMultiplier,$e=o+92+fe*ie;Y.set(O.id,{object:O,x:W,y:$e,radius:Hn(O,0,d),sortKey:Gn(W,$e,0)}),P.push({object:O,groupId:C.groupIds.get(O.id)??null,x1:W-60,y1:$e,x2:W-18,y2:$e,mode:"free"}),Wn(O,Y,v,P,te,1)}),Q.forEach((O,fe)=>{if(Y.has(O.id)||!O.placement||O.placement.mode!=="at")return;let W=_s(O.placement.reference,Y,k,fe,Q.length,r,i,o,te);Y.set(O.id,{object:O,x:W.x,y:W.y,radius:Hn(O,2,d),sortKey:Gn(W.x,W.y,2),anchorX:W.anchorX,anchorY:W.anchorY}),W.anchorX!==void 0&&W.anchorY!==void 0&&P.push({object:O,groupId:C.groupIds.get(O.id)??null,x1:W.anchorX,y1:W.anchorY,x2:W.x,y2:W.y,mode:"at"}),Wn(O,Y,v,P,te,2)});let le=[...Y.values()].map(O=>as(O,d,C)),De=v.map(O=>ss(O,C.groupIds.get(O.object.id)??null)),We=P.map(O=>cs(O)),D=ls(le,r,i,d.labelMultiplier),oe=bs(e,le),Ze=ys(e.events??[],le,I),bt=ms(De,oe,Ze,We,le,D),T=hs(le,De,We,D,C,d.labelMultiplier),R=gs(e,le),ye=ws(e,c,n.preset,C,k),de=Ps(r,i,le,De,We,D,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:c,renderProjection:l,camera:a,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ns(c,l,s,a),systemId:w,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...a?.azimuth!==null?{"camera.azimuth":String(a?.azimuth)}:{},...a?.elevation!==null?{"camera.elevation":String(a?.elevation)}:{},...a?.roll!==null?{"camera.roll":String(a?.roll)}:{},...a?.distance!==null?{"camera.distance":String(a?.distance)}:{}},contentBounds:de,layers:bt,groups:T,semanticGroups:R,viewpoints:ye,events:Ze,activeEventId:I,objects:le,orbitVisuals:De,relations:oe,leaders:We,labels:D}}function ve(e,t,n){let r=Xn(n),i=Math.cos(r),o=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*i-c*o,y:t.y+s*o+c*i}}function Ka(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let o=new Map(r.map(c=>[c.id,c])),s=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of s){let a=o.get(c);a&&(i.epoch&&(a.epoch=i.epoch),i.referencePlane&&(a.referencePlane=i.referencePlane))}for(let c of i.positions){let a=o.get(c.objectId);a&&(c.placement&&(a.placement=structuredClone(c.placement)),c.inner&&(a.properties.inner={...c.inner}),c.outer&&(a.properties.outer={...c.outer}),c.epoch&&(a.epoch=c.epoch),c.referencePlane&&(a.referencePlane=c.referencePlane))}return r}function Za(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 Ja(e){let t=Qa(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Qa(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 es(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return ki(n)??"topdown"}function xr(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function Ir(e){if(!e)return null;let t={azimuth:yr(e.azimuth),elevation:yr(e.elevation),roll:yr(e.roll),distance:ts(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function yr(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ts(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ns(e,t,n,r){let i=[`${wi(e)} view`,`${wi(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function rs(e,t){return{...is(e),...t}}function is(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 os(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function as(e,t,n){let{object:r,x:i,y:o,radius:s,sortKey:c,anchorX:a,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:Pt(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:s,visualRadius:qs(r,s,t),sortKey:c+d*.001,anchorX:a,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Ks(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ss(e,t){return{renderId:`${Pt(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 cs(e){return{renderId:`${Pt(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 ls(e,t,n,r){let i=[],o=[],s=new Map(e.map(a=>[a.objectId,a])),c=[...e].filter(a=>!a.hidden&&a.object.renderHints?.renderLabel!==!1).sort(ds);for(let a of c){let l=us(a,s,o,t,n,r)??ji(a,Ii(a,s.get(a.parentId??"")??null,n),0,r);o.push(Di(a,l,r)),i.push({renderId:`${a.renderId}-label`,objectId:a.objectId,object:a.object,groupId:a.groupId,semanticGroupIds:[...a.semanticGroupIds],label:a.label,secondaryLabel:a.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:a.hidden})}return i}function ds(e,t){let n=hi(e)-hi(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 hi(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 us(e,t,n,r,i,o){for(let s of ps(e,t,r,i)){let c=s==="left"||s==="right"?4:6;for(let a=0;a<=c;a+=1){let l=ji(e,s,a,o),d=Di(e,l,o);if(!n.some(f=>Ys(f,d)))return l}}return null}function ps(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=Ii(e,i,r),s=o==="below"?"above":"below",c=fs(e,i,n),a=c==="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"?[c,o,a,s]:[o,c,s,a]}function Ii(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 fs(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 ji(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),s=e.y-4*r;return{x:o,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,s=e.y-4*r;return{x:o,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function ms(e,t,n,r,i,o){let s=e.filter(a=>!a.hidden&&!!a.backArcPath).map(a=>a.renderId),c=e.filter(a=>!a.hidden).map(a=>a.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"events",renderIds:n.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"objects",renderIds:i.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"labels",renderIds:o.filter(a=>!a.hidden).map(a=>a.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function hs(e,t,n,r,i,o){let s=new Map,c=a=>{if(!a)return null;let l=s.get(a);if(l)return l;let d=i.groupRoots.get(a)??null,f={renderId:a,rootObjectId:d,label:d??a,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:sn(0,0,0,0)};return s.set(a,f),f};for(let a of e){let l=c(a.groupId);l&&!a.hidden&&l.objectIds.push(a.objectId)}for(let a of t){let l=c(a.groupId);l&&!a.hidden&&l.orbitIds.push(a.objectId)}for(let a of n){let l=c(a.groupId);l&&!a.hidden&&l.leaderIds.push(a.objectId)}for(let a of r){let l=c(a.groupId);l&&!a.hidden&&l.labelIds.push(a.objectId)}for(let a of s.values())a.contentBounds=Us(a,e,t,n,r,o);return[...s.values()].sort((a,l)=>a.label.localeCompare(l.label))}function gs(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 bs(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${Pt(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ys(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],s=o.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,d)=>l+d.x,0)/s.length:0,a=s.length>0?s.reduce((l,d)=>l+d.y,0)/s.length:0;return{renderId:`${Pt(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:a,hidden:i.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function ws(e,t,n,r,i){let o=vs(e,t,n),s=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,w,...I]=l.split(".");if(f!=="viewpoint"||!w||I.length===0)continue;let S=Es(w);if(!S)continue;let k=I.join(".").toLowerCase(),C=s.get(S)??{id:S};$s(C,k,d,e,t,n,r,i),s.set(S,C)}let c=[...s.values()].map(l=>xs(l,t,n,i)).filter(Boolean),a=c.findIndex(l=>l.id===o.id);return a>=0?c.splice(a,1,{...o,...c[a],layers:{...o.layers,...c[a].layers},filter:c[a].filter??o.filter,generated:!1}):c.unshift(o),c.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function vs(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=Ir(null),s=xr(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:s,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function $s(e,t,n,r,i,o,s,c){let a=n.trim();switch(t){case"label":case"title":a&&(e.label=a);return;case"summary":case"description":a&&(e.summary=a);return;case"focus":case"object":a&&(e.focus=a);return;case"select":case"selection":a&&(e.select=a);return;case"events":e.eventIds=an(a);return;case"projection":case"view":e.projection=ki(a)??i;return;case"preset":e.preset=js(a)??o;return;case"rotation":case"angle":e.rotationDeg=rn(a)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Un(),azimuth:rn(a)};return;case"camera.elevation":e.camera={...e.camera??Un(),elevation:rn(a)};return;case"camera.roll":e.camera={...e.camera??Un(),roll:rn(a)};return;case"camera.distance":e.camera={...e.camera??Un(),distance:gi(a)};return;case"zoom":case"scale":e.scale=gi(a);return;case"layers":e.layers=ks(a);return;case"query":e.filter={...e.filter??Nn(),query:a||null};return;case"types":case"objecttypes":e.filter={...e.filter??Nn(),objectTypes:Ss(a)};return;case"tags":e.filter={...e.filter??Nn(),tags:an(a)};return;case"groups":e.filter={...e.filter??Nn(),groupIds:Os(a,r,s,c)};return}}function xs(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,s=Is(e.filter),c=e.label?.trim()||Ms(e.id),a=e.projection??t,l=Ir(e.camera??null),d=xr(a,l);return{id:e.id,label:c,summary:e.summary?.trim()||Ds(c,i,s),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:a,renderProjection:d,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function Nn(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Un(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Is(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 ki(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function js(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function rn(e){let t=Number(e);return Number.isFinite(t)?t:null}function gi(e){let t=rn(e);return t!==null&&t>0?t:null}function ks(e){let t={};for(let n of an(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Ss(e){return an(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Os(e,t,n,r){return an(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??on(i):(r.has(i),on(i)))}function an(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Es(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ms(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ds(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 Ps(e,t,n,r,i,o,s){let c=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(w,I)=>{c=Math.min(c,w),a=Math.min(a,I),l=Math.max(l,w),d=Math.max(d,I)};for(let w of r)w.hidden||Si(w,f);for(let w of i)w.hidden||(f(w.x1,w.y1),f(w.x2,w.y2));for(let w of n)w.hidden||Oi(w,f);for(let w of o)w.hidden||Ei(w,f,s);return!Number.isFinite(c)||!Number.isFinite(a)?sn(0,0,e,t):sn(c,a,l,d)}function Si(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=Ai(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,xi*2);for(let s of o)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function sn(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 Oi(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 Ei(e,t,n){let r=Pi(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 wr(e,t,n,r,i,o,s,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Hn(e,r,c.scaleModel),sortKey:Gn(t,n,r)}),Wn(e,i,o,s,c,r+1))}function Wn(e,t,n,r,i,o){let s=t.get(e.id);if(!s)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(As),a=Ls(c,s.radius,i.spacingFactor,i.scaleModel),l=Fs(c,a);c.forEach((f,w)=>{let I=Ts(f,w,c.length,s,a,l[w]??a.innerPx,i);n.push({object:f,parentId:e.id,kind:I.kind,cx:I.cx,cy:I.cy,radius:I.radius,rx:I.rx,ry:I.ry,rotationDeg:I.rotationDeg,band:I.band,bandThickness:I.bandThickness,frontArcPath:I.frontArcPath,backArcPath:I.backArcPath}),wr(f,I.objectX,I.objectY,o,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,w)=>{let I=cn(w,d.length,-Math.PI/3),S=28*i.spacingFactor,k=ln(I,s.radius,i.projection,i.projection==="isometric"?.9:1),C=ln(I,s.radius+S,i.projection,i.projection==="isometric"?.9:1),Y=s.x+k.x,v=s.y+k.y,P=s.x+C.x,ne=s.y+C.y;t.set(f.id,{object:f,x:P,y:ne,radius:Hn(f,o+1,i.scaleModel),sortKey:Gn(P,ne,o+1),anchorX:Y,anchorY:v}),r.push({object:f,groupId:i.objectMap.has(f.id)?on(Ws(f,i.objectMap)):null,x1:Y,y1:v,x2:P,y2:ne,mode:"surface"}),Wn(f,t,n,r,i,o+1)})}function As(e,t){let n=Yn(e),r=Yn(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 Ls(e,t,n,r){let i=e.map(f=>Yn(f)),o=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let a=Math.min(...o),l=Math.max(...o),d=l-a;return{metrics:i,minMetric:a,maxMetric:l,metricSpread:d,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function Ts(e,t,n,r,i,o,s){let c=e.placement,a=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let U=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:U,rotationDeg:0,band:a,bandThickness:a?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-U}}let l=ce(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),d=o,f=Math.max(d*Math.sqrt(1-l*l),d*.18),w=$r(c.inclination)??0,I=s.projection==="isometric"?Math.max(Xa,Math.cos(Xn(w)))*$i:1,S=Math.max(f*I,d*.14),k=$r(c.angle)??0,C=d*l,Y=Ti(-C,0,k),v=r.x+Y.x,P=r.y+Y.y,ne=Rs(c.phase,t,n),X=Li(v,P,d,S,k,ne),Q=s.projection==="topdown"&&l<=1e-4&&Math.abs(k)<=1e-4,re=a?zs(e,d,i,s.scaleModel):void 0;return{kind:Q?"circle":"ellipse",cx:Q?r.x:v,cy:Q?r.y:P,radius:Q?d:void 0,rx:Q?void 0:d,ry:Q?void 0:S,rotationDeg:k,band:a,bandThickness:re,frontArcPath:s.projection==="isometric"||a?bi(v,P,d,S,k,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||a?bi(v,P,d,S,k,Math.PI,Math.PI*2):void 0,objectX:X.x,objectY:X.y}}function Cs(e,t){return t.innerPx+t.stepPx*Vs(Math.max(e,0)+1)}function Fs(e,t){let n=[];return e.forEach((r,i)=>{let o=Yn(r),s=t.innerPx+i*t.stepPx,c=o===null?s:Cs(o,t),a=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,a))}),n}function Yn(e){return!e.placement||e.placement.mode!=="orbit"?null:qn(e.placement.semiMajor??e.placement.distance??null)}function Vs(e){return Math.log(e)/Math.log(2)}function Rs(e,t,n){let r=e?$r(e):null;return r!==null?Xn(r-90):cn(t,n,-Math.PI/2)}function zs(e,t,n,r){let i=qn(vr(e.properties.inner)),o=qn(vr(e.properties.outer));if(i!==null&&o!==null){let c=Math.abs(o-i);if(n.metricSpread>0)return ce(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let a=Math.max(Math.max(i,o),1e-4);return ce(c/a*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function _s(e,t,n,r,i,o,s,c,a){if(e.kind==="lagrange")return Bs(e,t,n,o,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=cn(r,i,Math.PI/5),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=ln(d,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=cn(r,i,Math.PI/6),f=(l.radius+36)*a.scaleModel.labelMultiplier,w=ln(d,f,a.projection,a.projection==="isometric"?.92:1);return{x:l.x+w.x,y:l.y+w.y,anchorX:l.x,anchorY:l.y}}}return{x:o-c-170,y:s-c-86-r*58*a.scaleModel.freePlacementMultiplier}}function Bs(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Hs(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!o||!s)return{x:r*.7,y:i*.25};let c=s.x-o.x,a=s.y-o.y,l=Math.hypot(c,a)||1,d=c/l,f=a/l,w=-f,I=d,S=ce(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-d*S,y:s.y-f*S,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+d*S,y:s.y+f*S,anchorX:s.x,anchorY:s.y};case"L3":return{x:o.x-d*S,y:o.y-f*S,anchorX:o.x,anchorY:o.y};case"L4":return{x:s.x+(d*.5-w*.8660254)*S,y:s.y+(f*.5-I*.8660254)*S,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(d*.5+w*.8660254)*S,y:s.y+(f*.5+I*.8660254)*S,anchorX:s.x,anchorY:s.y}}}function Ns(e,t){let n=new Map,r=new Map;for(let l of e){let d=Mi(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,o=new Map,s=new Map,c=l=>{let d=i.get(l);if(d)return d;let f=new Set,w=[],I=n.get(l)??null;for(;I&&!f.has(I);)w.push(I),f.add(I),I=n.get(I)??null;return i.set(l,w),w},a=l=>{let d=s.get(o.get(l)??"");if(d)return d;let f=n.get(l)??null,w=t.get(l),I=l;return w?.placement&&w.placement.mode!=="free"&&f&&(I=a(f)),I};for(let l of e){c(l.id);let d=a(l.id),f=on(d);o.set(l.id,f),s.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:s}}function Mi(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 Us(e,t,n,r,i,o){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,w)=>{s=Math.min(s,f),c=Math.min(c,w),a=Math.max(a,f),l=Math.max(l,w)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Oi(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Si(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 i)!f.hidden&&e.labelIds.includes(f.objectId)&&Ei(f,d,o);return!Number.isFinite(s)||!Number.isFinite(c)?sn(0,0,0,0):sn(s,c,a,l)}function Ws(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Mi(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function Di(e,t,n){return Pi(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Pi(e,t,n,r,i,o,s,c){let a=Zs(o,s,c),l=a*2,d=i==="above"?18:12,f=i==="above"?8:12,w=e-a,I=e+a;return r==="start"?(w=e,I=e+l):r==="end"&&(w=e-l,I=e),{left:w,right:I,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function Ys(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Hs(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Hn(e,t,n){let r=Xs(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return ce((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return ce(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return ce(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return ce(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return ce(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return ce(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return ce(8*i,n.minBodyRadius,n.maxBodyRadius)}}function qs(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 qn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/nn;case"m":return e.value/1e3/nn;case"ly":return e.value*Ha;case"pc":return e.value*qa;case"kpc":return e.value*Ga;case"re":return e.value*Ua/nn;case"rj":return e.value*Wa/nn;case"sol":return e.value*Ya/nn;default:return e.value}}function Gs(e,t){let n=qn(e??null);return n===null||n<=0?0:ce(n*96*t.freePlacementMultiplier,0,420)}function Xs(e,t){let n=vr(e);if(!n)return null;let r;switch(n.unit){case"sol":r=ce(n.value*22,14,40);break;case"re":r=ce(n.value*10,6,18);break;case"km":r=ce(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=ce(n.value*4,4,20);break}return ce(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function vr(e){return!e||typeof e!="object"||!("value"in e)?null:e}function $r(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function cn(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function bi(e,t,n,r,i,o,s){let c=Ai(e,t,n,r,i,o,s,xi);return c.length===0?"":c.map((a,l)=>`${l===0?"M":"L"} ${vi(a.x)} ${vi(a.y)}`).join(" ")}function Ai(e,t,n,r,i,o,s,c){let a=[];for(let l=0;l<=c;l+=1){let d=o+(s-o)*l/c;a.push(Li(e,t,n,r,i,d))}return a}function Li(e,t,n,r,i,o){let s=n*Math.cos(o),c=r*Math.sin(o),a=Ti(s,c,i);return{x:e+a.x,y:t+a.y}}function Ti(e,t,n){let r=Xn(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ln(e,t,n,r){let i=n==="isometric"?$i*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Gn(e,t,n){return t*1e3+e+n*.01}function ce(e,t,n){return Math.min(Math.max(e,t),n)}function yi(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function Pt(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function on(e){return`${Pt(e)}-group`}function Ks(e){return typeof e=="string"&&e.trim()?e:void 0}function Zs(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function wi(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Xn(e){return e*Math.PI/180}function vi(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function xt(e,t={}){let n=Ee(e,t),r=[],i=ec(e,r),o=tc(e,r),s=Qs(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Js(e,s,i,o,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(a=>!a.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(a=>!a.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Fi),diagnostics:r}}function jr(e,t={}){return pc(xt(e,t))}function dn(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:lc(e.system),info:dc(e.system)}:null,r=e.objects.map(Fi);return oc(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(rc),objects:r}}function Js(e,t,n,r,i,o){let s=Ee(e,{preset:o??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(nc),annotations:r}}function Qs(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function ec(e,t){let n={};for(let[i,o]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=o);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function tc(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,o,...s]=r.split(".");if(!o||s.length===0)continue;let c=Ci(o);if(!c)continue;let a=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":a.label=i;break;case"target":case"object":a.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":a.body=i;break;case"tags":a.tags=sc(i);break}n.set(c,a)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let o=Ci(`${r.id}-notes`);n.has(o)||(n.set(o,{id:o,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${o}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??cc(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function nc(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Fi(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:ac(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function rc(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ic)}}function ic(e){return{objectId:e.objectId,placement:Vi(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Vi(e){return e?structuredClone(e):null}function oc(e,t,n){if(!n)return;let r=t.find(s=>s.id===n);if(!r)return;let i=new Map(e.map(s=>[s.id,s])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(s=>s.objectId)]);for(let s of o){let c=i.get(s);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let s of r.positions){let c=i.get(s.objectId);c&&(s.placement&&(c.placement=Vi(s.placement)),s.inner&&(c.properties.inner={...s.inner}),s.outer&&(c.properties.outer={...s.outer}),s.epoch&&(c.epoch=s.epoch),s.referencePlane&&(c.referencePlane=s.referencePlane))}}function ac(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 sc(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ci(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function cc(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function lc(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 dc(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=uc(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function uc(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function pc(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Ri=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Kn(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.0-draft"){if(n==="2.0-draft"){let a=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:jr(e);return _i(a)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:xt(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&c.version!==n?kr({...c,version:n,schemaVersion:n}):kr(c)}let i=[],o=e;o.system&&i.push(...fc(o.system));let s=[...o.objects].sort(Er);for(let c of s)i.length>0&&i.push(""),i.push(...hc(c));return i.join(`
2
- `)}function kr(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Bi(e.system));for(let r of[...e.groups].sort(At))t.push(""),t.push(...Yi(r));for(let r of[...e.relations].sort(At))t.push(""),t.push(...Hi(r));for(let r of[...e.events].sort(At))t.push(""),t.push(...qi(r));let n=[...e.objects].sort(Er);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Ni(r))}),t.join(`
3
- `)}function _i(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Bi(t.system));for(let i of[...t.groups].sort(At))n.push(""),n.push(...Yi(i));for(let i of[...t.relations].sort(At))n.push(""),n.push(...Hi(i));for(let i of[...t.events].sort(At))n.push(""),n.push(...qi(i));let r=[...t.objects].sort(Er);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,o)=>{o>0&&n.push(""),n.push(...Ni(i))}),n.join(`
4
- `)}function fc(e){return mc("system",e.id,e.properties,null,e.info)}function mc(e,t,n,r,i){let o=[`${e} ${t}`],s=[...Sr(r),...Wi(n)];for(let a of s)o.push(` ${a}`);let c=Object.entries(i).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){s.length>0&&o.push(""),o.push(" info");for(let[a,l]of c)o.push(` ${a} ${A(l)}`)}return o}function Bi(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${A(e.title)}`),e.description&&t.push(` description ${A(e.description)}`),e.epoch&&t.push(` epoch ${A(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${A(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${A(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${A(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${A(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[o])=>i.localeCompare(o)))t.push(` ${n} ${A(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...bc(n));for(let n of e.annotations)t.push(""),t.push(...yc(n));return t}function hc(e){return Ui(e.type,e.id,e)}function Ni(e){return Ui(`object ${e.type}`,e.id,e)}function Ui(e,t,n){let r=[`${e} ${t}`],i=[...Sr(n.placement),...Wi(n.properties),...gc(n)];for(let s of i)r.push(` ${s}`);let o=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(o.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,c]of o)r.push(` ${s} ${A(c)}`)}for(let s of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[s]??{}).sort(([a],[l])=>a.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${s}`);for(let[a,l]of c)r.push(` ${a} ${A(l)}`)}}return r}function Sr(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...ot("distance",e.distance),...ot("semiMajor",e.semiMajor),...$c("eccentricity",e.eccentricity),...ot("period",e.period),...ot("angle",e.angle),...ot("inclination",e.inclination),...ot("phase",e.phase)];case"at":return[`at ${xc(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Or(e.distance):e.descriptor??""}`.trim()]}}function Wi(e){return Object.keys(e).sort(jc).map(t=>`${t} ${Gi(e[t])}`)}function gc(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${A(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${A(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Gi(n.value)}`);return t}function bc(e){let t=[`viewpoint ${e.id}`,` label ${A(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&vc(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=Ic(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${A(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(A).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function yc(e){let t=[`annotation ${e.id}`,` label ${A(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${A(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),t}function Yi(e){let t=[`group ${e.id}`,` label ${A(e.label)}`];return e.summary&&t.push(` summary ${A(e.summary)}`),e.color&&t.push(` color ${A(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Hi(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${A(e.from)}`),e.to&&t.push(` to ${A(e.to)}`),e.kind&&t.push(` kind ${A(e.kind)}`),e.label&&t.push(` label ${A(e.label)}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.color&&t.push(` color ${A(e.color)}`),e.hidden&&t.push(" hidden true"),t}function qi(e){let t=[`event ${e.id}`,` kind ${A(e.kind)}`];if(e.label&&t.push(` label ${A(e.label)}`),e.summary&&t.push(` summary ${A(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${A(e.timing)}`),e.visibility&&t.push(` visibility ${A(e.visibility)}`),e.epoch&&t.push(` epoch ${A(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${A(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(A).join(" ")}`),e.color&&t.push(` color ${A(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(kc)){t.push(` pose ${n.objectId}`);for(let r of wc(n))t.push(` ${r}`)}}return t}function wc(e){return[...Sr(e.placement),...e.epoch?[`epoch ${A(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${A(e.referencePlane)}`]:[],...ot("inner",e.inner),...ot("outer",e.outer)]}function vc(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Gi(e){return Array.isArray(e)?e.map(t=>A(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?A(e):Or(e)}function Or(e){return`${e.value}${e.unit??""}`}function ot(e,t){return t?[`${e} ${Or(t)}`]:[]}function $c(e,t){return t===void 0?[]:[`${e} ${t}`]}function xc(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Ic(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function jc(e,t){let n=Ri.indexOf(e),r=Ri.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Er(e,t){let n=zi(e.type),r=zi(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function At(e,t){return e.id.localeCompare(t.id)}function kc(e,t){return e.objectId.localeCompare(t.objectId)}function zi(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function A(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Xi=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Sc=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Oc=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Lt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function pn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Mr(e,t,n){let r=e.match(Xi);if(!r)throw b.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=Ie(n);if(o?.unitFamily&&!Rn(o.unitFamily,i.unit))throw b.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dr(e){let t=e.match(Xi);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Zn(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw b.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function at(e,t,n){let r=Sc.get(e.toLowerCase());if(r===void 0)throw b.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Ki(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw b.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 b.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ec(e,t){if(!e)throw b.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw b.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Oc);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw b.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Zi(e,t,n){let r=Ie(e);if(!r)throw b.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw b.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return at(un(t,e,n),e,n);case"number":return Zn(un(t,e,n),e,n);case"unit":return Mr(un(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Ec(i,n),i}}}function Pr(e,t,n){let r=Ie(e);if(!r)throw b.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw b.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function un(e,t,n){if(e.length!==1)throw b.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Qi=new Set(["star","planet","moon","asteroid","comet"]),Mc=332946.0487,Dc=1047.3486,Jn=1495978707e-1,Pc=6371,Ac=695700,Lc=63241.077,Tc=206264.806,Cc=206264806;function fn(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),o=new Set(e.events.map(c=>c.id));e.system||n.push(V("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,a]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of a){let d=s.get(l);d?n.push(V("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${d}.`)):s.set(l,c)}for(let c of e.relations)Fc(c,r,n);for(let c of e.system?.viewpoints??[])Vc(c,i,o,t,n,r);for(let c of e.objects)Rc(c,e.system,r,i,n);for(let c of e.events)zc(c,e.system,r,n);return n}function Fc(e,t,n){e.from?t.has(e.from)||n.push(V("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(V("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(V("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(V("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(V("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Vc(e,t,n,r,i,o){let s=e.filter;if(r==="2.1"||r==="2.5"){if(s)for(let c of s.groupIds)t.has(c)||i.push(G("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(G("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Uc(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Wc(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,s,o)}function Rc(e,t,n,r,i){let o=e.placement,s=o?.mode==="orbit"?o:null,c=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let a of e.groups)r.has(a)||i.push(G("validate.group.unknown",`Unknown group "${a}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(G("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(G("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),s&&(n.has(s.target)||i.push(V("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(V("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(G("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(G("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!Lr(c?.properties.mass)&&i.push(G("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let a=n.get(o.target);a?Qi.has(a.type)||i.push(V("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(V("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(V("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Bc(e,n,i)||i.push(V("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let a=n.get(e.resonance.targetObjectId);a?(e.placement?.mode!=="orbit"||a.placement?.mode!=="orbit"||e.placement.target!==a.placement.target)&&i.push(G("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(V("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let a of e.deriveRules??[]){if(a.field!=="period"||a.strategy!=="kepler"){i.push(G("validate.derive.unsupported",`Unsupported derive rule "${a.field} ${a.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ji(e,c);if(l===null){i.push(G("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Ar("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Gc(l)}.`,e.id,"derive"))}for(let a of e.validationRules??[]){if(a.rule!=="kepler"){i.push(G("validate.rule.unsupported",`Unsupported validation rule "${a.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=eo(s?.period),d=Ji(e,c);if(l===null||d===null)continue;let f=qc(e,"period");Math.abs(l-d)>f&&i.push(V("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function zc(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(V("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(G("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(G("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(V("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(V("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let s=new Set;for(let l of e.participantObjectIds){if(o.add(l),s.has(l)){r.push(G("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}s.add(l),n.has(l)||r.push(V("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(G("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(G("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(G("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let d=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(V("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,d));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(V("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,d));continue}o.has(l.objectId)||r.push(G("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),_c(l,f,e,t,n,r,d,e.id)}let a=[...o].filter(l=>!c.has(l));e.positions.length>0&&a.length>0&&r.push(G("validate.event.positions.partial",`Event "${e.id}" leaves ${a.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function _c(e,t,n,r,i,o,s,c){let a=e.placement;if(!a){o.push(V("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(a.mode==="orbit"){i.has(a.target)||o.push(V("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.orbit`)),a.distance&&a.semiMajor&&o.push(V("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),a.phase&&!Yc(r,t,n,e)&&o.push(G("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),a.inclination&&!Hc(r,t,n,e)&&o.push(G("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),a.period&&!Lr(i.get(a.target)?.properties.mass)&&o.push(G("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(a.mode==="surface"){let l=i.get(a.target);l?Qi.has(l.type)||o.push(V("validate.event.pose.surface.target.invalid",`Event surface target "${a.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):o.push(V("validate.event.pose.surface.target.unknown",`Unknown event surface target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.surface`));return}if(a.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(V("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${s}.at`));let l=a.reference;l.kind==="named"&&!i.has(l.name)?o.push(V("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${a.target}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?o.push(V("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&o.push(V("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):o.push(V("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)))}}function Bc(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(V("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(V("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(V("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ji(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Nc(n.semiMajor??n.distance),i=Lr(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Nc(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Jn;case"m":return e.value/(Jn*1e3);case"ly":return e.value*Lc;case"pc":return e.value*Tc;case"kpc":return e.value*Cc;case"re":return e.value*Pc/Jn;case"sol":return e.value*Ac/Jn;default:return null}}function Lr(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/Mc;case"mj":return t.value/Dc;default:return null}}function eo(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 Uc(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(V("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Wc(e,t,n,r,i,o,s,c,a){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,w]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])w!==null&&(!Number.isFinite(w)||f==="distance"&&w<=0)&&r.push(V("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(w)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(G("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(G("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push(Ar("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(G("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),o!==null&&a.has(o)||s!==null&&a.has(s)||c||r.push(Ar("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function Yc(e,t,n,r){return st(r?.epoch)??st(n?.epoch)??st(t.epoch)??st(e?.epoch)??null}function Hc(e,t,n,r){return st(r?.referencePlane)??st(n?.referencePlane)??st(t.referencePlane)??st(e?.referencePlane)??null}function st(e){return typeof e=="string"&&e.trim()?e.trim():null}function qc(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?eo(n)??0:0}function Gc(e){return`${Math.round(e*100)/100}d`}function V(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function G(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ar(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Xc=new Set(["climate","habitability","settlement"]),er=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=Ie(e);t&&er.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}])er.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Kc=new Set(er.keys()),no=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function Tr(e){return Zc(e)}function Zc(e,t){let n=Vl(e),r=n.source.split(/\r?\n/),i=[],o=!1,s="2.0",c=null,a=null,l=[],d=[],f=[],w=[],I=new Map,S=!1,k=!1,C=new Set,Y=new Set,v=new Set,P=new Set,ne=new Set;for(let ee=0;ee<r.length;ee++){let te=r[ee],q=ee+1;if(!te.trim())continue;let we=zn(te),le=Jt(te.slice(we),{line:q,columnOffset:we});if(le.length!==0){if(!o){s=Jc(le,q),o=!0,n.comments.length>0&&tr(s,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(we===0){a=Qc(le,q,s,i,c,l,d,f,w,I,C,Y,v,P,ne,{sawDefaults:S,sawAtlas:k}),a.kind==="system"?c=a.system:a.kind==="defaults"?S=!0:a.kind==="atlas"&&(k=!0);continue}if(!a)throw new b("Indented line without parent atlas section",q,we+1);sl(a,we,le,q)}}if(!o)throw new b('Missing required atlas schema header "schema 2.0"');let X=l.map(ee=>Sl(ee,s,i)),Q=w.map(ee=>Ol(ee,I.get(ee.id)??[])),re=t??(s==="2.0-draft"?"2.0":s),U={format:"worldorbit",sourceVersion:"1.0",system:c,groups:d,relations:f,events:Q,objects:X,diagnostics:i};if(re==="2.0-draft"){let ee={...U,version:"2.0-draft",schemaVersion:"2.0-draft"};return ee.diagnostics.push(...fn(ee,s)),ee}let be={...U,version:re,schemaVersion:re};return s==="2.0-draft"&&be.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".'}),be.diagnostics.push(...fn(be,s)),be}function Jc(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new b('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Qc(e,t,n,r,i,o,s,c,a,l,d,f,w,I,S,k){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new b('Atlas section "system" may only appear once',t,e[0].column);return el(e,t,n,r);case"defaults":if(!i)throw new b('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(k.sawDefaults)throw new b('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new b('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(k.sawAtlas)throw new b('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new b('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return tl(e,t,i,d,n,r);case"annotation":if(!i)throw new b('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return nl(e,t,i,f);case"group":return Me(n,r,"group",{line:t,column:e[0].column}),rl(e,t,s,w);case"relation":return Me(n,r,"relation",{line:t,column:e[0].column}),il(e,t,c,I);case"event":return Me(n,r,"event",{line:t,column:e[0].column}),ol(e,t,a,l,S,n,r);case"object":return al(e,t,n,r,o);default:throw new b(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function el(e,t,n,r){if(e.length!==2)throw new b("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 tl(e,t,n,r,i,o){if(e.length!==2)throw new b("Invalid viewpoint declaration",t,e[0]?.column??1);let s=Lt(e[1].value);if(!s)throw new b("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new b(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:pn(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function nl(e,t,n,r){if(e.length!==2)throw new b("Invalid annotation declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:pn(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function rl(e,t,n,r){if(e.length!==2)throw new b("Invalid group declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Group id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:pn(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function il(e,t,n,r){if(e.length!==2)throw new b("Invalid relation declaration",t,e[0]?.column??1);let i=Lt(e[1].value);if(!i)throw new b("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new b(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function ol(e,t,n,r,i,o,s){if(e.length!==2)throw new b("Invalid event declaration",t,e[0]?.column??1);let c=Lt(e[1].value);if(!c)throw new b("Event id must not be empty",t,e[1].column);if(i.has(c))throw new b(`Duplicate event id "${c}"`,t,e[1].column);let a={id:c,kind:"",label:pn(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(a),r.set(c,l),i.add(c),{kind:"event",event:a,sourceSchemaVersion:o,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function al(e,t,n,r,i){if(e.length<3)throw new b("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],s=e[2],c=o.value;if(!Vn.has(c)||c==="system")throw new b(`Unknown object type "${o.value}"`,t,o.column);let a={objectType:c,id:s.value,fields:jl(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(a),{kind:"object",objectNode:a,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function sl(e,t,n,r){switch(e.kind){case"system":cl(e,n,r);return;case"defaults":ll(e,n,r);return;case"atlas":dl(e,t,n,r);return;case"viewpoint":ul(e,t,n,r);return;case"annotation":ml(e,n,r);return;case"group":hl(e,n,r);return;case"relation":gl(e,n,r);return;case"event":bl(e,t,n,r);return;case"object":wl(e,t,n,r);return}}function cl(e,t,n){let r=He(t,e.seenFields,n),i=H(t,n);switch(r){case"title":e.system.title=i;return;case"description":Me(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":Me(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":Me(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new b(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ll(e,t,n){let r=He(t,e.seenFields,n),i=H(t,n);switch(r){case"view":io(i)&&It(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=ro(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=oo(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new b(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function dl(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=ao(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new b(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new b(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function ul(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){pl(e,n,r);return}if(e.inFilter){fl(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(It(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new b('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Fr();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new b('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=He(n,e.seenFields,r),o=H(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":io(o)&&It(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=ro(o,r,n[0].column);return;case"preset":e.viewpoint.preset=oo(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Cr(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=lt(o,r,n[0].column,"rotation");return;case"camera":It(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Il(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=$l(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":Me(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=Re(n.slice(1),r,"events");return;default:throw new b(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function pl(e,t,n){let r=He(t,e.seenCameraFields,n),i=H(t,n),o=e.viewpoint.camera??Fr();switch(r){case"azimuth":o.azimuth=lt(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=lt(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=lt(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=Cr(i,n,t[0].column,"camera.distance");break;default:throw new b(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function fl(e,t,n){let r=He(t,e.seenFilterFields,n),i=e.viewpoint.filter??xl();switch(r){case"query":i.query=H(t,n);break;case"objecttypes":i.objectTypes=vl(t.slice(1),n);break;case"tags":i.tags=Re(t.slice(1),n,"tags");break;case"groups":i.groupIds=Re(t.slice(1),n,"groups");break;default:throw new b(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ml(e,t,n){switch(He(t,e.seenFields,n)){case"label":e.annotation.label=H(t,n);return;case"target":e.annotation.targetObjectId=H(t,n);return;case"body":e.annotation.body=H(t,n);return;case"tags":e.annotation.tags=Re(t.slice(1),n,"tags");return;default:throw new b(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function hl(e,t,n){switch(He(t,e.seenFields,n)){case"label":e.group.label=H(t,n);return;case"summary":e.group.summary=H(t,n);return;case"color":e.group.color=H(t,n);return;case"tags":e.group.tags=Re(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=at(H(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new b(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function gl(e,t,n){switch(He(t,e.seenFields,n)){case"from":e.relation.from=H(t,n);return;case"to":e.relation.to=H(t,n);return;case"kind":e.relation.kind=H(t,n);return;case"label":e.relation.label=H(t,n);return;case"summary":e.relation.summary=H(t,n);return;case"tags":e.relation.tags=Re(t.slice(1),n,"tags");return;case"color":e.relation.color=H(t,n);return;case"hidden":e.relation.hidden=at(H(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new b(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function bl(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&It(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(yl(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new b(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new b("Event pose object id must not be empty",r,n[1].column);let s={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(s),e.activePose=s,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new b('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(He(n,e.seenFields,r)){case"kind":e.event.kind=H(n,r);return;case"label":e.event.label=H(n,r);return;case"summary":e.event.summary=H(n,r);return;case"target":e.event.targetObjectId=H(n,r);return;case"participants":e.event.participantObjectIds=Re(n.slice(1),r,"participants");return;case"timing":e.event.timing=H(n,r);return;case"visibility":e.event.visibility=H(n,r);return;case"epoch":It(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=H(n,r);return;case"referenceplane":It(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=H(n,r);return;case"tags":e.event.tags=Re(n.slice(1),r,"tags");return;case"color":e.event.color=H(n,r);return;case"hidden":e.event.hidden=at(H(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new b(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function yl(e,t,n){if(e.length<2)throw new b("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!no.has(r))throw new b(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new b(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function wl(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Xc.has(i)){i!=="info"&&Me(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=ao(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new b(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,s=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(s.has(i.key))throw new b(`Duplicate ${o} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(kl(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function He(e,t,n){if(e.length<2)throw new b("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new b(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function H(e,t){if(e.length<2)throw new b("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function vl(e,t){return Re(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function $l(e,t,n,r){let i={};for(let o of Re(e,t,"layers")){let s=!o.startsWith("-")&&!o.startsWith("!"),c=o.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=s,i["orbits-front"]=s;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&Me(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=s)}return i}function Re(e,t,n){if(e.length===0)throw new b(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new b(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ro(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new b(`Unknown projection "${e}"`,t,n);return r}function io(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function oo(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new b(`Unknown render preset "${e}"`,t,n)}function Cr(e,t,n,r){let i=lt(e,t,n,r);if(i<=0)throw new b(`Field "${r}" must be greater than zero`,t,n);return i}function lt(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new b(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function xl(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Fr(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Il(e,t,n){if(e.length===0||e.length%2!==0)throw new b('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Fr(),i=new Set;for(let o=0;o<e.length;o+=2){let s=e[o],c=e[o+1],a=s.value.toLowerCase();if(i.has(a))throw new b(`Duplicate viewpoint camera field "${s.value}"`,t,s.column);i.add(a);let l=c.value;switch(a){case"azimuth":r.azimuth=lt(l,t,s.column,"camera.azimuth");break;case"elevation":r.elevation=lt(l,t,s.column,"camera.elevation");break;case"roll":r.roll=lt(l,t,s.column,"camera.roll");break;case"distance":r.distance=Cr(l,t,s.column,"camera.distance");break;default:throw new b(`Unknown viewpoint camera field "${s.value}"`,t,s.column)}}return r}function jl(e,t,n,r,i){let o=[],s=0;for(;s<e.length;){let c=e[s],a=mn(c.value);if(!a)throw new b(`Unknown field "${c.value}"`,t,c.column);a.version==="2.1"&&Me(r,i,c.value,{line:t,column:c.column}),s++;let l=[];if(a.inlineMode==="single"){let d=e[s];d&&(l.push(d),s++)}else if(a.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!Kc.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new b(`Missing value for field "${c.value}"`,t,c.column);o.push({type:"field",key:c.value,values:l.map(d=>d.value),location:{line:t,column:c.column}})}return uo(o,n),o}function kl(e,t,n,r,i){if(e.length<2)throw new b("Invalid field line",t,e[0]?.column??1);let o=mn(e[0].value);if(!o)throw new b(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&Me(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return uo([s],n),s}function ao(e,t,n){if(e.length<2)throw new b(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 Sl(e,t,n){let r=so(e.fields),i=co(r),o=Ml(e.objectType,r),s=Cl(r.get("groups")?.[0]),c=Qn(r.get("epoch")?.[0]),a=Qn(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?at(Le(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?Al(r.get("resonance")[0]):void 0,f=Pl(r),w=r.get("derive")?.map(P=>Ll(P)),I=r.get("validate")?.map(P=>({rule:Le(P)})),S=r.has("locked")?[...new Set(r.get("locked").flatMap(P=>P.values))]:void 0,k=r.get("tolerance")?.map(P=>Tl(P)),C=Dl(e.typedBlockEntries),Y=lo(e.infoEntries,"info"),v={type:e.objectType,id:e.id,properties:o,placement:i,info:Y};return s.length>0&&(v.groups=s),c&&(v.epoch=c),a&&(v.referencePlane=a),l!==void 0&&(v.tidalLock=l),d&&(v.resonance=d),f&&(v.renderHints=f),w?.length&&(v.deriveRules=w),I?.length&&(v.validationRules=I),S?.length&&(v.lockedFields=S),k?.length&&(v.tolerances=k),C&&Object.keys(C).length>0&&(v.typedBlocks=C),tr(t,"2.1")&&(v.groups||v.epoch||v.referencePlane||v.tidalLock!==void 0||v.resonance||v.renderHints||v.deriveRules?.length||v.validationRules?.length||v.lockedFields?.length||v.tolerances?.length||v.typedBlocks)&&Me(t,n,e.id,e.location),v}function Ol(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>El(n))}}function El(e){let t=so(e.fields,"event-pose"),n=co(t);return{objectId:e.objectId,placement:n,inner:ct(t.get("inner")?.[0],"inner"),outer:ct(t.get("outer")?.[0],"outer"),epoch:Qn(t.get("epoch")?.[0]),referencePlane:Qn(t.get("referencePlane")?.[0])}}function so(e,t="object"){let n=new Map;for(let r of e){let i=mn(r.key);if(!i&&!no.has(r.key))throw b.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw b.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function co(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let s=t??n??r??i;throw b.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:Le(t),distance:ct(e.get("distance")?.[0],"distance"),semiMajor:ct(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Fl(e.get("eccentricity")?.[0],"eccentricity"),period:ct(e.get("period")?.[0],"period"),angle:ct(e.get("angle")?.[0],"angle"),inclination:ct(e.get("inclination")?.[0],"inclination"),phase:ct(e.get("phase")?.[0],"phase")};if(n){let s=Le(n);return{mode:"at",target:s,reference:Ki(s,n.location)}}if(r)return{mode:"surface",target:Le(r)};if(i){let s=Le(i),c=Dr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function Ml(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],s=mn(r);!o||!s?.legacySchema||s.legacySchema.placement||(Pr(r,e,o.location),n[r]=Zi(r,o.values,o.location))}return n}function lo(e,t){let n={};for(let r of e){if(r.key in n)throw b.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Dl(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=lo(r,n))}return t}function Pl(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=at(Le(n),"renderLabel",n.location)),r&&(t.renderOrbit=at(Le(r),"renderOrbit",r.location)),i&&(t.renderPriority=Zn(Le(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Al(e){if(e.values.length!==2)throw b.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw b.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ll(e){if(e.values.length!==2)throw b.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Tl(e){if(e.values.length!==2)throw b.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Dr(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Cl(e){return e?[...new Set(e.values)]:[]}function Qn(e){return e&&e.values.join(" ").trim()||null}function ct(e,t){return e?Mr(Le(e),e.location,t):void 0}function Fl(e,t){return e?Zn(Le(e),t,e.location):void 0}function Le(e){return un(e.values,e.key,e.location)}function mn(e){return er.get(e)}function uo(e,t){for(let n of e){let r=mn(n.key);if(!r)throw b.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Pr(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw b.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Me(e,t,n,r){tr(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 It(e,t,n,r){tr(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function tr(e,t){return to(e)<to(t)}function to(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Vl(e){let t=[...e],n=[],r=!1,i=!1,o=null,s=1,c=1;for(let a=0;a<t.length;a++){let l=t[a],d=t[a+1];if(i){if(l==="*"&&d==="/"){t[a]=" ",t[a+1]=" ",i=!1,o=null,a++,c+=2;continue}l!==`
5
- `&&l!=="\r"&&(t[a]=" "),l===`
6
- `?(s++,c=1):c++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:s,column:c}),t[a]=" ",t[a+1]=" ",i=!0,o={line:s,column:c},a++,c+=2;continue}if(!r&&l==="#"&&!Rl(t,a)){n.push({kind:"line",line:s,column:c}),t[a]=" ";let f=a+1;for(;f<t.length&&t[f]!==`
7
- `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-a,a=f-1;continue}l==='"'&&t[a-1]!=="\\"&&(r=!r),l===`
8
- `?(s++,c=1):c++}if(i)throw b.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function Rl(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
- `}function nr(e="WorldOrbit",t="2.5"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function N(e){return structuredClone(e)}function Vr(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?ho(e,t.id):null;case"event":return t.id?rr(e,t.id):null;case"event-pose":return t.id&&t.key?bo(e,t.id,t.key):null;case"object":return t.id?mo(e,t.id):null;case"viewpoint":return t.id?yo(e.system,t.id):null;case"annotation":return t.id?wo(e.system,t.id):null;case"relation":return t.id?go(e,t.id):null}}function Rr(e,t){let n=N(e),r=fo(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=rr(n,t.id);i&&(i.positions=i.positions.filter(o=>o.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function hn(e,t){return t.map(n=>({diagnostic:n,path:po(e,n)}))}function po(e,t){if(t.objectId&&mo(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&ho(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&yo(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&wo(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&go(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&rr(e,n[1]))return n[2]==="pose"&&n[3]&&bo(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in fo(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function zr(e){let t=[...e.diagnostics,...fn(e,e.version)];return hn(e,t)}function fo(e){return e.system||(e.system=nr().system),e.system}function mo(e,t){return e.objects.find(n=>n.id===t)??null}function ho(e,t){return e.groups.find(n=>n.id===t)??null}function go(e,t){return e.relations.find(n=>n.id===t)??null}function rr(e,t){return e.events.find(n=>n.id===t)??null}function bo(e,t,n){return rr(e,t)?.positions.find(r=>r.objectId===n)??null}function yo(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function wo(e,t){return e?.annotations.find(n=>n.id===t)??null}var zl=/^schema\s+2(?:\.0|\.1|\.5)?$/i,_l=/^schema\s+2\.1$/i,Bl=/^schema\s+2\.5$/i,Nl=/^schema\s+2\.0-draft$/i;function vo(e){for(let t of Ul(e).split(/\r?\n/)){let n=t.trim();if(n)return Nl.test(n)?"2.0-draft":_l.test(n)?"2.1":Bl.test(n)?"2.5":zl.test(n)?"2.0":"1.0"}return"1.0"}function Ul(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],s=t[i+1];if(r){if(o==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
10
- `&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&s==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
- `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function dt(e){let t=gn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new b(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function gn(e){let t=vo(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Wl(e,t);let n;try{n=Qt(e)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"parse")]}}let r;try{r=en(n)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"normalize")]}}try{tn(r)}catch(i){return{ok:!1,value:null,diagnostics:[$t(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Wl(e,t){let n;try{n=Tr(e)}catch(s){return{ok:!1,value:null,diagnostics:[$t(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=dn(n)}catch(s){return{ok:!1,value:null,diagnostics:[$t(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Hl={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},ir={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 _r(e){return e?typeof e=="string"?ir[e]??ir.atlas:{...ir.atlas,...e}:ir.atlas}function Br(e){return{...Hl,...e}}function ze(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Nr(e.objectTypes??[]),tags:Nr((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Nr((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return ql(t)?t:null}function ql(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function or(e,t){let n=ze(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Gl(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Ur(e,t,n=12){let r=t.trim().toLowerCase();return r?e.objects.filter(i=>!i.hidden).map(i=>({object:i,score:Xl(i,r)})).filter(i=>i.score>0).sort((i,o)=>o.score-i.score||i.object.label.localeCompare(o.object.label)).slice(0,n).map(i=>$o(i.object,i.score)):e.objects.filter(i=>!i.hidden).slice().sort((i,o)=>i.label.localeCompare(o.label)).slice(0,n).map(i=>$o(i,1))}function xo(e,t,n,r){return{version:"2.5",viewpointId:r,activeEventId:t.activeEventId??null,viewerState:{...e},renderOptions:{preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,layers:t.layers?{...t.layers}:void 0,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,activeEventId:t.activeEventId??null},filter:ze(n)}}function Wr(e){return encodeURIComponent(JSON.stringify(e))}function Yr(e){let t=JSON.parse(decodeURIComponent(e));return{version:t.version==="2.0"?"2.0":"2.5",viewpointId:t.viewpointId??null,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null,viewerState:{scale:t.viewerState?.scale??1,rotationDeg:t.viewerState?.rotationDeg??0,translateX:t.viewerState?.translateX??0,translateY:t.viewerState?.translateY??0,selectedObjectId:t.viewerState?.selectedObjectId??null},renderOptions:{preset:t.renderOptions?.preset,projection:t.renderOptions?.projection,camera:t.renderOptions?.camera?{...t.renderOptions.camera}:null,layers:t.renderOptions?.layers?{...t.renderOptions.layers}:void 0,scaleModel:t.renderOptions?.scaleModel?{...t.renderOptions.scaleModel}:void 0,activeEventId:t.activeEventId??t.renderOptions?.activeEventId??null},filter:ze(t.filter??null)}}function Io(e,t,n){let r=e.trim()||"bookmark";return{id:r.toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"bookmark",label:t?.trim()||r,atlasState:{...n,viewerState:{...n.viewerState},renderOptions:{...n.renderOptions,camera:n.renderOptions.camera?{...n.renderOptions.camera}:null,layers:n.renderOptions.layers?{...n.renderOptions.layers}:void 0,scaleModel:n.renderOptions.scaleModel?{...n.renderOptions.scaleModel}:void 0,activeEventId:n.renderOptions.activeEventId??null},filter:n.filter?{...n.filter}:null}}}function Hr(e){if(!(!e||!(Object.keys(e.layers).length>0)))return{background:e.layers.background,guides:e.layers.guides,relations:e.layers.relations,events:e.layers.events,orbits:e.layers["orbits-front"]===void 0&&e.layers["orbits-back"]===void 0?void 0:e.layers["orbits-front"]!==!1||e.layers["orbits-back"]!==!1,objects:e.layers.objects,labels:e.layers.labels,metadata:e.layers.metadata}}function qr(e){return e?.filter?ze({query:e.filter.query??void 0,objectTypes:e.filter.objectTypes,tags:e.filter.tags,groupIds:e.filter.groupIds,includeAncestors:!0}):null}function $o(e,t){return{objectId:e.objectId,label:e.label,type:e.object.type,score:t,groupId:e.groupId,parentId:e.parentId,tags:Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(n=>typeof n=="string"):[]}}function Gl(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=jo(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function Xl(e,t){let n=e.objectId.toLowerCase(),r=e.label.toLowerCase(),i=jo(e.object,e.label).toLowerCase(),o=0;return n===t||r===t?o+=120:n.startsWith(t)||r.startsWith(t)?o+=96:(n.includes(t)||r.includes(t))&&(o+=72),t.split(/\s+/).filter(Boolean).every(a=>i.includes(a))&&(o+=32),e.object.type===t&&(o+=24),(Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(a=>typeof a=="string"):[]).some(a=>a.toLowerCase()===t)&&(o+=18),o}function jo(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function Nr(e){return[...new Set(e)]}var jt={scale:1,rotationDeg:0,translateX:0,translateY:0,selectedObjectId:null};function ko(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function ar(e,t){return Math.min(Math.max(e,t.minScale),t.maxScale)}function Tt(e,t,n){return{...e,translateX:e.translateX+t,translateY:e.translateY+n}}function Gr(e,t){return{...e,rotationDeg:ko(e.rotationDeg+t)}}function bn(e,t,n,r,i){if(!Number.isFinite(n)||n<=0)return t;let o=Ft(e),s=ar(t.scale*n,i);if(s===t.scale)return t;let c=s/t.scale,a=r.x-o.x,l=r.y-o.y;return{...t,scale:s,translateX:(1-c)*a+c*t.translateX,translateY:(1-c)*l+c*t.translateY}}function Ct(e,t,n){let r=Ft(e),i=Kl(e.contentBounds,r,t.rotationDeg),o=Math.max(e.width-n.fitPadding*2,1),s=Math.max(e.height-n.fitPadding*2,1),c=Math.max(i.width,1),a=Math.max(i.height,1),l=ar(Math.min(o/c,s/a),n),d=ve({x:e.contentBounds.centerX,y:e.contentBounds.centerY},r,t.rotationDeg);return{...t,scale:l,translateX:r.x-(r.x+(d.x-r.x)*l),translateY:r.y-(r.y+(d.y-r.y)*l)}}function Xr(e,t,n,r){let i=e.objects.find(a=>a.objectId===n&&!a.hidden);if(!i)return t;let o=Ft(e),s=ar(Math.max(t.scale,1.8),r),c=ve({x:i.x,y:i.y},o,t.rotationDeg);return{...t,scale:s,translateX:o.x-(o.x+(c.x-o.x)*s),translateY:o.y-(o.y+(c.y-o.y)*s),selectedObjectId:n}}function Kr(e,t){let n=Ft(e);return`translate(${t.translateX} ${t.translateY}) translate(${n.x} ${n.y}) rotate(${t.rotationDeg}) scale(${t.scale}) translate(${-n.x} ${-n.y})`}function kt(e,t,n){let r=Ft(e),i={x:n.x-t.translateX,y:n.y-t.translateY},o={x:i.x-r.x,y:i.y-r.y},s={x:o.x/Math.max(t.scale,1e-4),y:o.y/Math.max(t.scale,1e-4)},c=ve({x:s.x,y:s.y},{x:0,y:0},-t.rotationDeg);return{x:r.x+c.x,y:r.y+c.y}}function yn(e,t){let n=[{x:0,y:0},{x:e.width,y:0},{x:e.width,y:e.height},{x:0,y:e.height}].map(c=>kt(e,t,c)),r=Math.min(...n.map(c=>c.x)),i=Math.min(...n.map(c=>c.y)),o=Math.max(...n.map(c=>c.x)),s=Math.max(...n.map(c=>c.y));return{minX:r,minY:i,maxX:o,maxY:s,width:o-r,height:s-i,centerX:r+(o-r)/2,centerY:i+(s-i)/2}}function Ft(e){return{x:e.width/2,y:e.height/2}}function Kl(e,t,n){let r=[{x:e.minX,y:e.minY},{x:e.maxX,y:e.minY},{x:e.maxX,y:e.maxY},{x:e.minX,y:e.maxY}].map(a=>ve(a,t,n)),i=Math.min(...r.map(a=>a.x)),o=Math.min(...r.map(a=>a.y)),s=Math.max(...r.map(a=>a.x)),c=Math.max(...r.map(a=>a.y));return{minX:i,minY:o,maxX:s,maxY:c,width:s-i,height:c-o,centerX:i+(s-i)/2,centerY:o+(c-o)/2}}var Zr="worldorbit-camera-root";function qe(e,t={}){let n=_r(t.theme),r=pd(t.preset??e.renderPreset??void 0),i=Br({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,s=or(e,t.filter??null),c=e.objects.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)).sort((v,P)=>v.sortKey-P.sortKey),a=e.labels.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)),l=Ql(c),d=i.orbits?Jl(e,s,i.structures):{back:"",front:""},f=i.guides?e.leaders.filter(v=>!v.hidden).filter(v=>s.has(v.objectId)).filter(v=>i.structures||!sr(v.object)).map(v=>`<line class="wo-leader wo-leader-${v.mode}" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${ue(v.renderId)}" data-group-id="${he(v.groupId??"")}" />`).join(""):"",w=i.relations?e.relations.filter(v=>!v.hidden).filter(v=>s.has(v.fromObjectId)&&s.has(v.toObjectId)).map(v=>`<line class="wo-relation" x1="${v.x1}" y1="${v.y1}" x2="${v.x2}" y2="${v.y2}" data-render-id="${ue(v.renderId)}" data-relation-id="${he(v.relationId)}" />`).join(""):"",I=i.events?e.events.filter(v=>!v.hidden).map(v=>Zl(e,v,s,n)).join(""):"",S=i.objects?c.map(v=>ed(v,t.selectedObjectId??null,n)).join(""):"",k=i.labels?a.map(v=>td(e,v,t.selectedObjectId??null)).join(""):"",C=i.metadata?`<text class="wo-title" x="56" y="64">${ue(e.title)}</text>
12
- <text class="wo-subtitle" x="56" y="88">${ue(o)}</text>
13
- <text class="wo-meta" x="56" y="${e.height-42}">${ue(md(e))}</text>`:"",Y=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
14
- <rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
15
- ${i.guides?fd(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">
16
- <title id="worldorbit-title">${ue(e.title)}</title>
17
- <desc id="worldorbit-desc">A ${ue(e.viewMode)} WorldOrbit render with ${c.length} visible objects.</desc>
18
- <defs>
19
- <linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
20
- <stop offset="0%" stop-color="${n.backgroundStart}" />
21
- <stop offset="100%" stop-color="${n.backgroundEnd}" />
22
- </linearGradient>
23
- <radialGradient id="wo-star-glow" cx="50%" cy="50%" r="50%">
24
- <stop offset="0%" stop-color="${n.starGlow}" stop-opacity="0.95" />
25
- <stop offset="100%" stop-color="${n.starCore}" stop-opacity="0" />
26
- </radialGradient>
27
- <radialGradient id="wo-bg-glow" cx="20%" cy="10%" r="90%">
28
- <stop offset="0%" stop-color="${n.backgroundGlow}" />
29
- <stop offset="100%" stop-color="transparent" />
30
- </radialGradient>
31
- ${l}
32
- </defs>
33
- <style>
34
- .wo-bg { fill: url(#wo-bg); }
35
- .wo-bg-glow { fill: url(#wo-bg-glow); }
36
- .wo-grid { fill: none; stroke: ${n.guide}; stroke-width: 1; }
37
- .wo-orbit { fill: none; stroke: ${n.orbit}; stroke-width: 1.5; }
38
- .wo-orbit-back { opacity: 0.38; stroke-dasharray: 8 6; }
39
- .wo-orbit-front { opacity: 0.9; }
40
- .wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
41
- .wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
42
- .wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
43
- .wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
44
- .wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
45
- .wo-leader { stroke: ${n.leader}; stroke-width: 1.5; stroke-dasharray: 6 5; }
46
- .wo-label { fill: ${n.ink}; font-family: ${n.fontFamily}; font-weight: 600; letter-spacing: 0.02em; }
47
- .wo-label-secondary { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
48
- .wo-title { fill: ${n.ink}; font: 700 24px ${n.displayFont}; letter-spacing: 0.06em; text-transform: uppercase; }
49
- .wo-subtitle { fill: ${n.muted}; font: 500 12px ${n.fontFamily}; letter-spacing: 0.14em; text-transform: uppercase; }
50
- .wo-meta { fill: ${n.muted}; font: 500 11px ${n.fontFamily}; letter-spacing: 0.06em; }
51
- .wo-object { cursor: pointer; outline: none; }
52
- .wo-object:focus-visible .wo-selection-ring,
53
- .wo-object:hover .wo-selection-ring,
54
- .wo-object-selected .wo-selection-ring { display: block; }
55
- .wo-object-selected .wo-selection-ring { stroke: ${n.selected}; }
56
- .wo-object-label-selected .wo-label { fill: ${n.accent}; }
57
- .wo-object-label-selected .wo-label-secondary { fill: ${n.selected}; }
58
- .wo-chain-selected .wo-selection-ring,
59
- .wo-chain-hover .wo-selection-ring { display: block; }
60
- .wo-ancestor-selected .wo-selection-ring,
61
- .wo-ancestor-hover .wo-selection-ring { display: block; opacity: 0.66; }
62
- .wo-chain-selected .wo-label,
63
- .wo-chain-hover .wo-label { fill: ${n.accent}; }
64
- .wo-ancestor-selected .wo-label,
65
- .wo-ancestor-hover .wo-label { fill: ${n.ink}; opacity: 0.82; }
66
- .wo-orbit-related-selected,
67
- .wo-orbit-related-hover { stroke: ${n.accentStrong}; opacity: 1; }
68
- .wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
69
- .wo-object-image { pointer-events: none; }
70
- </style>
71
- ${Y}
72
- ${C}
73
- <g data-worldorbit-world="true">
74
- <g data-worldorbit-camera-root="${Zr}" id="${Zr}">
75
- <g data-worldorbit-world-content="true">
76
- ${i.orbits?`<g data-layer-id="orbits-back">${d.back}</g>`:""}
77
- ${i.guides?`<g data-layer-id="guides">${f}</g>`:""}
78
- ${i.relations?`<g data-layer-id="relations">${w}</g>`:""}
79
- ${i.events?`<g data-layer-id="events">${I}</g>`:""}
80
- ${i.objects?`<g data-layer-id="objects">${S}</g>`:""}
81
- ${i.orbits?`<g data-layer-id="orbits-front">${d.front}</g>`:""}
82
- ${i.labels?`<g data-layer-id="labels">${k}</g>`:""}
83
- </g>
84
- </g>
85
- </g>
86
- </svg>`}function Zl(e,t,n,r){let i=t.objectIds.filter(a=>n.has(a)).map(a=>e.objects.find(l=>l.objectId===a&&!l.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,s=t.event.label||t.event.id,c=i.map(a=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${a.x}" y2="${a.y}" stroke="${he(o)}" data-event-id="${he(t.eventId)}" data-object-id="${he(a.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${ue(t.renderId)}" data-event-id="${he(t.eventId)}">
87
- ${c}
88
- <circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${he(o)}" />
89
- <text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${ue(s)}</text>
90
- </g>`}function Jl(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(s=>!s.hidden&&t.has(s.objectId)&&(n||!sr(s.object)))){let s=o.bandThickness??(o.band?10:1.5),c=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",a=`data-render-id="${ue(o.renderId)}" data-orbit-object-id="${he(o.objectId)}" data-parent-id="${he(o.parentId)}" data-group-id="${he(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${c} wo-orbit-back" d="${o.backArcPath}" stroke-width="${s}" ${a} />`),o.frontArcPath&&i.push(`<path class="${c} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${s}" ${a} />`);continue}if(o.kind==="ellipse"){let l=o.rx??o.radius??0,d=o.ry??o.radius??0;i.push(`<ellipse class="${c} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${l}" ry="${d}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${s}" ${a} />`);continue}i.push(`<circle class="${c} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${s}" ${a} />`)}return{back:r.join(""),front:i.join("")}}function Ql(e){return e.filter(t=>!!t.imageHref).map(t=>id(t)).join("")}function ed(e,t,n){let{object:r,x:i,y:o,radius:s,visualRadius:c}=e,a=t===e.objectId?" wo-object-selected":"",l=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",d=ad(e,n),f=rd(e),w=f?So(r,i,o,s,d,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${l}${a}" data-object-id="${ue(e.objectId)}" data-parent-id="${he(e.parentId??"")}" data-group-id="${he(e.groupId??"")}" data-render-id="${ue(e.renderId)}" tabindex="0" role="button" aria-label="${ue(`${r.type} ${e.objectId}`)}">
91
- <circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${c+8}" />
92
- ${nd(e,d)}
93
- ${So(r,i,o,s,d)}
94
- ${f}
95
- ${w}
96
- </g>`}function td(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${ue(t.objectId)}" data-group-id="${he(t.groupId??"")}" data-render-id="${ue(t.renderId)}">
97
- <text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${ue(t.label)}</text>
98
- <text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${ue(t.secondaryLabel)}</text>
99
- </g>`}function So(e,t,n,r,i,o={}){let s=o.outlineOnly?"transparent":i.fill,c=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
100
- <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${c}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
101
- <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Do(t,n,r)}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let a=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?a==="black-hole"||a==="nebula"||a==="galaxy"||a==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Jr(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:a==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
102
- <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="2" />`:a==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
103
- <ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${s}" stroke="${i.stroke}" stroke-width="1.2" />
104
- <circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:a==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${s}" stroke="${i.stroke}" stroke-width="1" />
105
- <circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:a==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
106
- <circle cx="${t}" cy="${n}" r="${r}" fill="${s}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Jr(t,n,r)}" fill="${s}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function nd(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function rd(e){if(!e.imageHref)return"";let t=od(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${he(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${he(Mo(e))})" />`}function id(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Do(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${Jr(t,n,r)}" />`;break;default:return""}return`<clipPath id="${he(Mo(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function od(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function ad(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=sd(e.object.type,n,t),i=e.fillColor&&gd(e.fillColor)?e.fillColor:r.fill,o=Oo(e.object.properties.albedo),s=Oo(e.object.properties.temperature),c=ld(i,s,o,e.object.type),a=wn(c,"#ffffff",.4)??r.stroke,l=ud(e.object.properties.atmosphere),d=e.object.type==="star"?Eo(wn(c,"#fff2cb",.4)??c,.82):void 0;return{fill:c,stroke:a,glow:d,atmosphere:l,tail:e.object.type==="comet"?Eo(wn(c,"#ffffff",.5)??c,.72):void 0}}function sd(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 cd(t)}}function cd(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 ld(e,t,n,r){let i=e;if(t!==null){let o=dd(t,r);i=wn(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=wn(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function dd(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function ud(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 pd(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 Oo(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Mo(e){return`${e.renderId}-clip`}function Do(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Jr(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 fd(e,t){let n=Array.from({length:10},(i,o)=>{let s=90+o*((e-180)/9);return`<line class="wo-grid" x1="${s}" y1="120" x2="${s}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let s=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${s}" x2="${e-56}" y2="${s}" />`}).join("");return`${n}${r}`}function md(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function sr(e){return e.type==="structure"||e.type==="phenomenon"}function wn(e,t,n){let r=Qr(e),i=Qr(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return hd({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Eo(e,t){let n=Qr(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Qr(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 hd(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function gd(e){return!!e.trim()}function ue(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function he(e){return ue(e)}var Vt=180,Rt=120,Po=10;function Ao(e,t,n){let r=e.contentBounds.width>0&&e.contentBounds.height>0?e.contentBounds:{minX:0,minY:0,maxX:e.width,maxY:e.height,width:e.width,height:e.height,centerX:e.width/2,centerY:e.height/2},i=Math.min((Vt-Po*2)/Math.max(r.width,1),(Rt-Po*2)/Math.max(r.height,1)),o=(Vt-r.width*i)/2-r.minX*i,s=(Rt-r.height*i)/2-r.minY*i,c=yn(e,t),a=n.map(l=>{let d=l.x*i+o,f=l.y*i+s,w=Math.max(1.4,Math.min(l.visualRadius*i,5.2)),I=l.fillColor??bd(l.object.type);return`<circle cx="${Te(d)}" cy="${Te(f)}" r="${Te(w)}" fill="${I}" fill-opacity="0.92" />`}).join("");return`<div data-worldorbit-minimap="true" style="position:absolute;right:16px;bottom:16px;width:${Vt}px;height:${Rt}px;padding:8px;border-radius:16px;background:rgba(5, 14, 22, 0.78);border:1px solid rgba(179, 216, 255, 0.16);box-shadow:0 14px 28px rgba(0, 0, 0, 0.24);backdrop-filter:blur(8px);pointer-events:none;">
107
- <svg width="${Vt}" height="${Rt}" viewBox="0 0 ${Vt} ${Rt}" role="presentation" aria-hidden="true">
108
- <rect x="0.5" y="0.5" width="${Vt-1}" height="${Rt-1}" rx="12" ry="12" fill="rgba(7, 17, 27, 0.85)" stroke="rgba(179, 216, 255, 0.18)" />
109
- <rect x="${Te(r.minX*i+o)}" y="${Te(r.minY*i+s)}" width="${Te(r.width*i)}" height="${Te(r.height*i)}" rx="10" ry="10" fill="rgba(163, 209, 255, 0.04)" stroke="rgba(163, 209, 255, 0.16)" />
110
- ${a}
111
- <rect x="${Te(c.minX*i+o)}" y="${Te(c.minY*i+s)}" width="${Te(c.width*i)}" height="${Te(c.height*i)}" rx="8" ry="8" fill="rgba(255, 180, 100, 0.09)" stroke="rgba(255, 180, 100, 0.88)" stroke-width="1.4" />
112
- </svg>
113
- </div>`}function bd(e){switch(e){case"star":return"#ffcc67";case"planet":return"#72b7ff";case"moon":return"#c7d7ea";case"belt":case"ring":return"#d9aa74";case"asteroid":return"#a7a5b8";case"comet":return"#9ce7ff";case"structure":return"#ff7f5f";case"phenomenon":return"#78ffd7"}}function Te(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var yd=["radius","temperature","atmosphere","period","semiMajor","distance","eccentricity","angle","inclination","phase","albedo","mass","density","gravity"];function To(e){return{objectId:e.objectId,title:e.objectId,typeLabel:Id(e.object.type),imageHref:e.renderObject.imageHref??null,description:$d(e),tags:vd(e.object.properties.tags),fields:wd(e),parentLabel:e.parent?.objectId??null,orbitLabel:e.orbit?.parentId??null,details:e}}function Co(e,t){let n=e.tags.length?`<div class="wo-tooltip-tags">${e.tags.map(o=>`<span class="wo-tooltip-tag">${_e(o)}</span>`).join("")}</div>`:"",r=e.fields.length?`<dl class="wo-tooltip-fields">${e.fields.map(o=>`<div class="wo-tooltip-field"><dt>${_e(o.label)}</dt><dd>${_e(o.value)}</dd></div>`).join("")}</dl>`:"",i=[e.parentLabel?`Parent: ${e.parentLabel}`:null,e.orbitLabel?`Orbit: ${e.orbitLabel}`:null,t==="pinned"?"Pinned tooltip":"Hover tooltip"].filter(Boolean);return`<article class="wo-tooltip-card" data-tooltip-object-id="${_e(e.objectId)}">
114
- <div class="wo-tooltip-head">
115
- ${e.imageHref?`<img class="wo-tooltip-image" src="${kd(e.imageHref)}" alt="" />`:`<div class="wo-tooltip-image wo-tooltip-image-placeholder">${_e(e.typeLabel.slice(0,1))}</div>`}
116
- <div class="wo-tooltip-heading">
117
- <strong>${_e(e.title)}</strong>
118
- <span>${_e(e.typeLabel)}</span>
119
- </div>
120
- </div>
121
- ${e.description?`<p class="wo-tooltip-description">${_e(e.description)}</p>`:""}
122
- ${n}
123
- ${r}
124
- ${i.length?`<p class="wo-tooltip-relations">${_e(i.join(" - "))}</p>`:""}
125
- </article>`}function wd(e){let t=new Map;for(let r of yd){let i=e.object.properties[r];i!==void 0&&t.set(r,{key:r,label:jd(r),value:Lo(i)})}let n=e.object.placement;return e.object.groups?.length&&t.set("groups",{key:"groups",label:"Groups",value:e.object.groups.join(", ")}),e.object.epoch&&t.set("epoch",{key:"epoch",label:"Epoch",value:e.object.epoch}),e.object.referencePlane&&t.set("referencePlane",{key:"referencePlane",label:"Reference Plane",value:e.object.referencePlane}),e.object.tidalLock!==void 0&&t.set("tidalLock",{key:"tidalLock",label:"Tidal Lock",value:e.object.tidalLock?"true":"false"}),e.object.resonance&&t.set("resonance",{key:"resonance",label:"Resonance",value:`${e.object.resonance.targetObjectId} ${e.object.resonance.ratio}`}),e.relatedEvents.length>0&&t.set("events",{key:"events",label:"Events",value:e.relatedEvents.map(r=>r.event.label||r.event.id).join(", ")}),n?.mode==="at"?t.set("placement",{key:"placement",label:"Placement",value:`At ${n.target}`}):n?.mode==="surface"?t.set("placement",{key:"placement",label:"Placement",value:`Surface ${n.target}`}):n?.mode==="free"&&t.set("placement",{key:"placement",label:"Placement",value:n.distance?`Free ${Lo(n.distance)}`:`Free ${n.descriptor??"custom"}`}),[...t.values()]}function vd(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function $d(e){let t=e.object.info.description?.trim();if(t)return t;let n=e.group?.label?.trim();return n&&n!==e.objectId?n:null}function Lo(e){return typeof e=="string"?e:typeof e=="number"?String(e):typeof e=="boolean"?e?"true":"false":Array.isArray(e)?e.join(", "):xd(e)}function xd(e){return`${e.value}${e.unit??""}`}function Id(e){return e.charAt(0).toUpperCase()+e.slice(1)}function jd(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").replace(/^./,t=>t.toUpperCase())}function _e(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function kd(e){return _e(e)}var zt={minScale:.2,maxScale:8,fitPadding:48,panStep:40,zoomStep:1.2,rotationStep:15},Fo="worldorbit-viewer-tooltip-style";function _t(e,t){if(Md(e),+!!t.source+ +!!t.document+ +!!t.scene!==1)throw new Error('Interactive viewer requires exactly one of "source", "document", or "scene".');let r={minScale:t.minScale??zt.minScale,maxScale:t.maxScale??zt.maxScale,fitPadding:t.fitPadding??zt.fitPadding},i={keyboard:t.keyboard??!0,pointer:t.pointer??!0,touch:t.touch??!0,selection:t.selection??!0,tooltipMode:t.tooltipMode??"hover",minimap:t.minimap??!1,panStep:t.panStep??zt.panStep,zoomStep:t.zoomStep??zt.zoomStep,rotationStep:t.rotationStep??zt.rotationStep},o={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera?{...t.camera}:null,scaleModel:t.scaleModel?{...t.scaleModel}:void 0,theme:t.theme,layers:t.layers,filter:ze(t.initialFilter),subtitle:t.subtitle},s=e.getAttribute("tabindex"),c=e.style.touchAction,a=e.style.position,l=Sd(t),d=vn(l,o),f={...jt},w=null,I=null,S=null,k=null,C=!1,Y=null,v=null,P=0,ne=!1,X=new Map,Q=null,re=null,U=null,be=null,ee=null,te=null;s===null&&(e.tabIndex=0),Dd(),e.classList.add("wo-viewer-container"),e.style.touchAction=i.touch?"none":c,e.style.position||(e.style.position="relative");let q=m=>{if(!i.pointer||ne)return;m.preventDefault(),e.focus();let y=xe(m.clientX,m.clientY),$=$n(Math.exp(-m.deltaY*.002),.6,1.6);de(bn(d,f,$,y,r))},we=m=>{if(ne)return;let y=m.pointerType==="touch";if(y&&!i.touch||!y&&!i.pointer||!y&&m.button!==0)return;e.focus(),e.setPointerCapture?.(m.pointerId);let $=Ce(m.clientX,m.clientY);if(y){X.set(m.pointerId,$),X.size===2?Q=zo(d,f,X):X.size===1&&(P=0,C=!1);return}Y=m.pointerId,v=$,P=0,C=!1},le=m=>{if(ne)return;if(m.pointerType==="touch"){if(!i.touch||!X.has(m.pointerId))return;let F=X.get(m.pointerId),Ve=Ce(m.clientX,m.clientY);if(X.set(m.pointerId,Ve),X.size===2){Q||(Q=zo(d,f,X));let Se=Bo(X),nt=Se.distance/Math.max(Q.startDistance,1),Ht=bn(d,Q.startState,nt,Q.startCenter,r),qt=Se.center.x-Q.startViewportCenter.x,Gt=Se.center.y-Q.startViewportCenter.y;de(Tt(Ht,qt,Gt))}else if(X.size===1){let Se=Ve.x-F.x,nt=Ve.y-F.y;P+=Math.abs(Se)+Math.abs(nt),P>2&&(C=!0),de(Tt(f,Se,nt))}return}if(!i.pointer||Y!==m.pointerId||!v)return;let $=Ce(m.clientX,m.clientY),Z=$.x-v.x,z=$.y-v.y;P+=Math.abs(Z)+Math.abs(z),v=$,P>2&&(C=!0),de(Tt(f,Z,z))},De=m=>{if(m.pointerType==="touch"){X.delete(m.pointerId),X.size<2&&(Q=null);return}Y===m.pointerId&&(Y=null,v=null)},We=m=>{if(!i.selection||ne)return;if(C){C=!1;return}let y=cr(m.target);W(y),i.tooltipMode==="pinned"&&(U=y,ke())},D=m=>{let y=cr(m.target);ie(y)},oe=()=>{ie(null)},Ze=m=>{let y=cr(m.target);y&&ie(y)},bt=()=>{ie(null)},T=m=>{if(!i.keyboard||ne)return;let y=cr(m.target);if((m.key==="Enter"||m.key===" ")&&y){m.preventDefault(),W(y),i.tooltipMode==="pinned"&&(U=y,ke());return}switch(m.key){case"Escape":i.tooltipMode==="pinned"&&U&&(m.preventDefault(),U=null,ke());return;case"+":case"=":m.preventDefault(),R.zoomBy(i.zoomStep);return;case"-":m.preventDefault(),R.zoomBy(1/i.zoomStep);return;case"ArrowLeft":m.preventDefault(),R.panBy(-i.panStep,0);return;case"ArrowRight":m.preventDefault(),R.panBy(i.panStep,0);return;case"ArrowUp":m.preventDefault(),R.panBy(0,-i.panStep);return;case"ArrowDown":m.preventDefault(),R.panBy(0,i.panStep);return;case"[":m.preventDefault(),R.rotateBy(-i.rotationStep);return;case"]":m.preventDefault(),R.rotateBy(i.rotationStep);return;case"f":case"F":m.preventDefault(),R.fitToSystem();return;case"0":m.preventDefault(),R.resetView();return}};e.addEventListener("wheel",q,{passive:!1}),e.addEventListener("pointerdown",we),e.addEventListener("pointermove",le),e.addEventListener("pointerup",De),e.addEventListener("pointercancel",De),e.addEventListener("click",We),e.addEventListener("mouseover",D),e.addEventListener("mouseleave",oe),e.addEventListener("focusin",Ze),e.addEventListener("focusout",bt),e.addEventListener("keydown",T);let R={setSource(m){l={kind:"source",value:m},d=vn(l,o),te=null,ye(!0)},setDocument(m){l={kind:"document",value:m},d=vn(l,o),te=null,ye(!0)},setScene(m){l={kind:"scene",value:m},d=m,te=null,ye(!0)},getScene(){return d},getRenderOptions(){return Od(o)},listViewpoints(){return d.viewpoints.slice()},getActiveViewpoint(){return et(te)},goToViewpoint(m){let y=et(m);if(!y)return!1;let $={},Z=Hr(y);if(y.preset!==null&&($.preset=y.preset),l.kind!=="scene"&&y.projection!==d.projection&&($.projection=y.projection),y.camera?$.camera={...y.camera}:o.camera&&($.camera=null),Z&&($.layers=Z),te=y.id,Object.keys($).length>0){let F=Ro($);o=Vo(o,$),l.kind!=="scene"&&F&&(d=vn(l,o)),ye(F)}tt(qr(y),!1,!1);let z=Ut(y);return de(z),W(y.selectedObjectId??y.objectId??null,!1),t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Wt(),Pe(),!0},getActiveEventId(){return o.activeEventId??null},setActiveEvent(m){R.setRenderOptions({activeEventId:m})},search(m,y=12){return Ur(d,m,y)},getFilter(){return o.filter?{...o.filter}:null},setFilter(m){tt(m,!0,!0)},getVisibleObjects(){return Fe()},getFocusPath(m){return Qe(m)},getObjectDetails(m){return K(m)},getSelectionDetails(){return K(f.selectedObjectId)},getTooltipDetails(){return ee},getAtlasState(){return xo(f,o,o.filter??null,te)},setAtlasState(m){let y=typeof m=="string"?Yr(m):m;y.viewpointId&&R.goToViewpoint(y.viewpointId),R.setRenderOptions(y.renderOptions),tt(y.filter??null,!1,!1),de(O({...f,...y.viewerState})),W(y.viewerState.selectedObjectId??null,!1),Wt(),t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),Pe()},serializeAtlasState(){return Wr(R.getAtlasState())},captureBookmark(m,y){return Io(m,y,R.getAtlasState())},applyBookmark(m){return typeof m=="string"?(R.setAtlasState(m),!0):(R.setAtlasState(m.atlasState),!0)},setRenderOptions(m){let y=Ro(m);o=Vo(o,m),l.kind!=="scene"&&y&&(d=vn(l,o)),ye(y)},getState(){return{...f}},setState(m){de(O({...f,...m}))},zoomBy(m,y){de(bn(d,f,m,y??{x:d.width/2,y:d.height/2},r))},panBy(m,y){de(Tt(f,m,y))},rotateBy(m){de(Gr(f,m))},fitToSystem(){de(Ct(d,f,r))},focusObject(m){te=null,de(Xr(d,f,m,r)),W(m),i.tooltipMode==="pinned"&&(U=ae(m)?.objectId??null,ke())},pinTooltip(m){U=ae(m)?.objectId??null,ke()},resetView(){let m=Ct(d,{...jt},r);te=null,de(m),W(null),U=null,ke()},exportSvg(){return qe(d,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId})},destroy(){ne||(ne=!0,e.removeEventListener("wheel",q),e.removeEventListener("pointerdown",we),e.removeEventListener("pointermove",le),e.removeEventListener("pointerup",De),e.removeEventListener("pointercancel",De),e.removeEventListener("click",We),e.removeEventListener("mouseover",D),e.removeEventListener("mouseleave",oe),e.removeEventListener("focusin",Ze),e.removeEventListener("focusout",bt),e.removeEventListener("keydown",T),k?.remove(),k=null,S?.remove(),S=null,e.classList.remove("wo-viewer-container"),e.style.touchAction=c,e.style.position=a,s===null?e.removeAttribute("tabindex"):e.setAttribute("tabindex",s))}};return ye(!0),t.initialViewpointId?R.goToViewpoint(t.initialViewpointId):t.initialSelectionObjectId?R.focusObject(t.initialSelectionObjectId):Pe(),R;function ye(m){if(e.innerHTML=qe(d,{...o,filter:o.filter??null,selectedObjectId:f.selectedObjectId}),w=e.querySelector('[data-worldorbit-svg="true"]'),I=e.querySelector("#worldorbit-camera-root"),S=null,k=null,i.minimap&&(S=document.createElement("div"),S.dataset.worldorbitMinimapRoot="true",e.append(S)),i.tooltipMode!=="disabled"&&(k=document.createElement("div"),k.className="wo-viewer-tooltip-root",k.dataset.worldorbitTooltip="true",k.hidden=!0,k.addEventListener("click",Tn),e.append(k)),!w||!I)throw new Error("Interactive viewer could not locate the rendered SVG camera root.");f=m?Ct(d,{...jt},r):O(f),W(f.selectedObjectId&&ae(f.selectedObjectId)?f.selectedObjectId:null,!1),ie(re&&ae(re)?re:null,!1),U=U&&ae(U)?U:null,fe(),Et(),Wt(),t.onViewChange?.({...f}),Pe()}function de(m){f=O(m),fe(),t.onViewChange?.({...f}),Pe()}function O(m){return{scale:$n(m.scale,r.minScale,r.maxScale),rotationDeg:_o(m.rotationDeg),translateX:Number.isFinite(m.translateX)?m.translateX:f.translateX,translateY:Number.isFinite(m.translateY)?m.translateY:f.translateY,selectedObjectId:m.selectedObjectId&&ae(m.selectedObjectId)?m.selectedObjectId:null}}function fe(){I&&(I.setAttribute("transform",Kr(d,f)),Yt(),ke())}function W(m,y=!0){f.selectedObjectId&&e.querySelector(`[data-object-id="${xn(f.selectedObjectId)}"]`)?.classList.remove("wo-object-selected"),f={...f,selectedObjectId:m&&ae(m)?m:null},f.selectedObjectId&&e.querySelector(`[data-object-id="${xn(f.selectedObjectId)}"]`)?.classList.add("wo-object-selected"),yt(),ke(),y&&(t.onSelectionChange?.($e()),t.onSelectionDetailsChange?.(K(f.selectedObjectId)),t.onViewChange?.({...f}),Pe())}function ie(m,y=!0){re===m&&y||(re=m&&ae(m)?m:null,yt(),ke(),y&&(t.onHoverChange?.(ae(re)),t.onHoverDetailsChange?.(K(re))))}function $e(){return ae(f.selectedObjectId)}function ae(m){if(!m)return null;let y=wt();return d.objects.find($=>$.objectId===m&&!$.hidden&&y.has($.objectId))??null}function K(m){let y=ae(m);return y?{objectId:y.objectId,object:y.object,renderObject:y,label:d.labels.find($=>$.objectId===y.objectId&&!$.hidden)??null,group:d.groups.find($=>$.renderId===y.groupId)??null,semanticGroups:d.semanticGroups.filter($=>y.semanticGroupIds.includes($.id)),orbit:d.orbitVisuals.find($=>$.objectId===y.objectId&&!$.hidden)??null,relatedOrbits:d.orbitVisuals.filter($=>!$.hidden&&($.objectId===y.objectId||y.ancestorIds.includes($.objectId)||y.childIds.includes($.objectId))),relations:d.relations.filter($=>!$.hidden&&($.fromObjectId===y.objectId||$.toObjectId===y.objectId)),relatedEvents:d.events.filter($=>!$.hidden&&($.targetObjectId===y.objectId||$.objectIds.includes(y.objectId))),parent:ae(y.parentId),children:y.childIds.map($=>ae($)).filter(Boolean),ancestors:y.ancestorIds.map($=>ae($)).filter(Boolean),focusPath:Qe(y.objectId)}:null}function yt(){for(let m of e.querySelectorAll(".wo-chain-selected, .wo-chain-hover, .wo-ancestor-selected, .wo-ancestor-hover, .wo-orbit-related-selected, .wo-orbit-related-hover"))m.classList.remove("wo-chain-selected","wo-chain-hover","wo-ancestor-selected","wo-ancestor-hover","wo-orbit-related-selected","wo-orbit-related-hover");Je(f.selectedObjectId,{objectClass:"wo-chain-selected",ancestorClass:"wo-ancestor-selected",orbitClass:"wo-orbit-related-selected"}),Je(re,{objectClass:"wo-chain-hover",ancestorClass:"wo-ancestor-hover",orbitClass:"wo-orbit-related-hover"})}function Je(m,y){let $=K(m);if(!$)return;let Z=new Set([$.objectId,...$.renderObject.childIds,...$.renderObject.ancestorIds]);for(let z of Z)for(let F of e.querySelectorAll(`[data-object-id="${xn(z)}"]`))F.classList.add(y.objectClass);for(let z of $.ancestors)for(let F of e.querySelectorAll(`[data-object-id="${xn(z.objectId)}"]`))F.classList.add(y.ancestorClass);for(let z of $.relatedOrbits)for(let F of e.querySelectorAll(`[data-orbit-object-id="${xn(z.objectId)}"]`))F.classList.add(y.orbitClass)}function Ce(m,y){if(!w)return{x:d.width/2,y:d.height/2};let $=w.getBoundingClientRect();return!$.width||!$.height?{x:d.width/2,y:d.height/2}:{x:(m-$.left)/$.width*d.width,y:(y-$.top)/$.height*d.height}}function xe(m,y){return kt(d,f,Ce(m,y))}function wt(){return or(d,o.filter??null)}function Fe(){let m=wt();return d.objects.filter(y=>!y.hidden&&m.has(y.objectId))}function Qe(m){let y=d.objects.find($=>$.objectId===m&&!$.hidden);return y?[...y.ancestorIds,y.objectId].map($=>ae($)).filter(Boolean):[]}function et(m){return d.viewpoints.find(y=>y.id===m)??null}function Ut(m){let y=_o(m.rotationDeg),$=m.scale!==null&&m.scale!==void 0?$n(m.scale,r.minScale,r.maxScale):null,Z=m.objectId&&d.objects.find(F=>F.objectId===m.objectId&&!F.hidden);if(Z)return Ot({x:Z.x,y:Z.y},$??Math.max(1.8,jt.scale),y,m.selectedObjectId??Z.objectId);let z=Ct(d,{...jt,rotationDeg:y},r);return $===null?{...z,rotationDeg:y,selectedObjectId:m.selectedObjectId??null}:Ot({x:d.contentBounds.centerX,y:d.contentBounds.centerY},$,y,m.selectedObjectId??null)}function Ot(m,y,$,Z){let z={x:d.width/2,y:d.height/2},F=ve(m,z,$);return{scale:y,rotationDeg:$,translateX:z.x-(z.x+(F.x-z.x)*y),translateY:z.y-(z.y+(F.y-z.y)*y),selectedObjectId:Z}}function tt(m,y,$){o={...o,filter:ze(m)},$&&(te=null),ye(!1)}function Et(){t.onFilterChange?.(o.filter??null,Fe())}function Wt(){t.onViewpointChange?.(et(te))}function Pe(){t.onAtlasStateChange?.(R.getAtlasState())}function Yt(){!i.minimap||!S||(S.innerHTML=Ao(d,f,Fe()))}function ke(){if(i.tooltipMode==="disabled"||!k){vt(null);return}let m=Ye();if(!m){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),vt(null);return}let y=K(m.objectId);if(!y){k.hidden=!0,k.innerHTML="",k.removeAttribute("data-mode"),vt(null);return}let $=To(y);be=m.objectId,k.hidden=!1,k.dataset.mode=m.mode,k.classList.toggle("is-pinned",m.mode==="pinned"),k.style.pointerEvents="auto",k.style.visibility="hidden",Pn(k,$,m.mode),An(k,y.renderObject),k.style.visibility="visible",vt($)}function Ye(){return U&&ae(U)?{objectId:U,mode:"pinned"}:re&&ae(re)?{objectId:re,mode:"hover"}:null}function Pn(m,y,$){let Z=t.tooltipRenderer?.(y,$);m.innerHTML="",typeof Z=="string"?m.innerHTML=Z:Z instanceof HTMLElement?m.append(Z):m.innerHTML=Co(y,$);let z=document.createElement("div");if(z.className="wo-tooltip-actions",$==="pinned"){let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="unpin",F.textContent="Unpin",z.append(F)}else{let F=document.createElement("button");F.type="button",F.className="wo-tooltip-action",F.dataset.tooltipAction="pin",F.dataset.objectId=y.objectId,F.textContent="Pin",z.append(F)}z.childElementCount>0&&m.append(z)}function An(m,y){if(!w)return;let $={x:y.anchorX??y.x,y:y.anchorY??y.y-Math.max(y.visualRadius,y.radius)},Z=Ln($),z=w.getBoundingClientRect(),F=e.getBoundingClientRect(),Ve=z.left-F.left+Z.x/Math.max(d.width,1)*z.width,Se=z.top-F.top+Z.y/Math.max(d.height,1)*z.height,nt=Math.max(e.clientWidth-m.offsetWidth-12,12),Ht=Math.max(e.clientHeight-m.offsetHeight-12,12),qt=Se>e.clientHeight*.48,Gt=$n(Ve+18,12,nt),hr=$n(qt?Se-m.offsetHeight-18:Se+18,12,Ht);m.style.left=`${Gt}px`,m.style.top=`${hr}px`}function Ln(m){let y={x:d.width/2,y:d.height/2},$=ve(m,y,f.rotationDeg);return{x:y.x+($.x-y.x)*f.scale+f.translateX,y:y.y+($.y-y.y)*f.scale+f.translateY}}function Tn(m){let y=m.target?.closest("[data-tooltip-action]");if(y){switch(m.preventDefault(),m.stopPropagation(),y.dataset.tooltipAction){case"pin":U=y.dataset.objectId??be;break;case"unpin":U=null;break}ke()}}function vt(m){let y=ee?.objectId!==m?.objectId||ee?.description!==m?.description||ee?.imageHref!==m?.imageHref;ee=m,be=m?.objectId??null,y&&t.onTooltipChange?.(m)}}function Sd(e){if(e.scene)return{kind:"scene",value:e.scene};if(e.document)return{kind:"document",value:e.document};if(e.source)return{kind:"source",value:e.source};throw new Error("Interactive viewer requires an initial render input.")}function vn(e,t){switch(e.kind){case"scene":return e.value;case"document":return Ee(e.value,t);case"source":{let n=dt(e.value);return Ee(n.document,Ed(n,t))}}}function Od(e){return{...e,camera:e.camera?{...e.camera}:null,filter:e.filter?{...e.filter}:void 0,scaleModel:e.scaleModel?{...e.scaleModel}:void 0,layers:e.layers?{...e.layers}:void 0,theme:e.theme&&typeof e.theme=="object"?{...e.theme}:e.theme,activeEventId:e.activeEventId??null}}function Vo(e,t){return{...e,...t,camera:t.camera!==void 0?t.camera?{...t.camera}:null:e.camera?{...e.camera}:null,filter:t.filter!==void 0?ze(t.filter):e.filter?{...e.filter}:void 0,scaleModel:t.scaleModel?{...e.scaleModel??{},...t.scaleModel}:e.scaleModel?{...e.scaleModel}:void 0,layers:t.layers?{...e.layers??{},...t.layers}:e.layers?{...e.layers}:void 0,theme:t.theme&&typeof t.theme=="object"?{...t.theme}:t.theme??e.theme}}function Ro(e){return e.width!==void 0||e.height!==void 0||e.padding!==void 0||e.preset!==void 0||e.projection!==void 0||e.camera!==void 0||e.scaleModel!==void 0||e.activeEventId!==void 0}function Ed(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function zo(e,t,n){let{center:r,distance:i}=Bo(n);return{startState:{...t},startCenter:kt(e,t,r),startViewportCenter:r,startDistance:i}}function Bo(e){let t=[...e.values()];if(t.length<2)return{center:t[0]??{x:0,y:0},distance:1};let[n,r]=t;return{center:{x:(n.x+r.x)/2,y:(n.y+r.y)/2},distance:Math.hypot(r.x-n.x,r.y-n.y)}}function cr(e){return e instanceof Element?e.closest("[data-object-id]")?.dataset.objectId??null:null}function Md(e){if(typeof window>"u"||typeof document>"u")throw new Error("createInteractiveViewer can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("Interactive viewer requires an HTMLElement container.")}function $n(e,t,n){return Math.min(Math.max(e,t),n)}function _o(e){let t=e%360;return t>180&&(t-=360),t<=-180&&(t+=360),t}function xn(e){return typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/["\\]/g,"\\$&")}function Dd(){if(typeof document>"u"||document.getElementById(Fo))return;let e=document.createElement("style");e.id=Fo,e.textContent=`
126
- .wo-viewer-tooltip-root {
127
- position: absolute;
128
- z-index: 12;
129
- min-width: 220px;
130
- max-width: min(320px, calc(100% - 24px));
131
- padding: 14px;
132
- border-radius: 18px;
133
- border: 1px solid rgba(255,255,255,0.1);
134
- background: rgba(7, 16, 25, 0.92);
135
- box-shadow: 0 18px 32px rgba(0,0,0,0.28);
136
- color: #edf6ff;
137
- backdrop-filter: blur(12px);
138
- font: 500 13px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
139
- }
140
- .wo-viewer-tooltip-root[data-mode="hover"] { pointer-events: auto; }
141
- .wo-viewer-tooltip-root[data-mode="pinned"] { pointer-events: auto; }
142
- .wo-tooltip-card { display: grid; gap: 10px; }
143
- .wo-tooltip-head { display: grid; grid-template-columns: 52px minmax(0, 1fr); gap: 12px; align-items: center; }
144
- .wo-tooltip-heading { display: grid; gap: 3px; }
145
- .wo-tooltip-heading strong { font: 700 16px/1.2 "Segoe UI Variable Display", "Segoe UI", sans-serif; }
146
- .wo-tooltip-heading span, .wo-tooltip-relations { color: rgba(237, 246, 255, 0.7); }
147
- .wo-tooltip-image {
148
- width: 52px;
149
- height: 52px;
150
- object-fit: cover;
151
- border-radius: 14px;
152
- border: 1px solid rgba(255,255,255,0.12);
153
- background: rgba(255,255,255,0.06);
154
- }
155
- .wo-tooltip-image-placeholder {
156
- display: grid;
157
- place-items: center;
158
- font: 700 18px/1 "Segoe UI Variable Display", "Segoe UI", sans-serif;
159
- color: #ffce8a;
160
- }
161
- .wo-tooltip-description { margin: 0; }
162
- .wo-tooltip-tags { display: flex; flex-wrap: wrap; gap: 6px; }
163
- .wo-tooltip-tag {
164
- padding: 3px 8px;
165
- border-radius: 999px;
166
- background: rgba(255,255,255,0.08);
167
- color: #ffdda9;
168
- font: 600 11px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
169
- text-transform: uppercase;
170
- letter-spacing: 0.06em;
171
- }
172
- .wo-tooltip-fields { display: grid; gap: 6px; margin: 0; }
173
- .wo-tooltip-field {
174
- display: grid;
175
- grid-template-columns: minmax(0, 1fr) auto;
176
- gap: 12px;
177
- align-items: baseline;
178
- }
179
- .wo-tooltip-field dt { color: rgba(237, 246, 255, 0.68); }
180
- .wo-tooltip-field dd { margin: 0; font-weight: 600; text-align: right; }
181
- .wo-tooltip-actions { display: flex; justify-content: flex-end; margin-top: 10px; }
182
- .wo-tooltip-action {
183
- border: 1px solid rgba(240, 180, 100, 0.24);
184
- border-radius: 999px;
185
- background: rgba(240, 180, 100, 0.12);
186
- color: #edf6ff;
187
- cursor: pointer;
188
- padding: 6px 12px;
189
- font: 600 12px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
190
- }
191
- `,document.head.append(e)}function No(e){return encodeURIComponent(JSON.stringify(e))}function ei(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 ti(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=qe(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="${lr(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${e.mode}" data-worldorbit-preset="${lr(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${lr(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${lr(No(n))}">${r}</div>`}function lr(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function In(e,t={}){try{let n=dt(e),r=Ee(n.document,Ld(n,t));return(t.mode??"static")==="interactive"?ti(ei(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="${Ad(t.className??"worldorbit-block worldorbit-static")}">${qe(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Uo(n instanceof Error?n.message:String(n))}}function Uo(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Wo(e)}</pre>`}function Wo(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function Ad(e){return Wo(e).replaceAll('"',"&quot;")}function Ld(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}var Yo="worldorbit-editor-style",Td=120,Cd=16,Fd=96,Nt=1495978707e-1,Ko=6371,Zo=695700,ri=new Set(["placement","target","reference","distance","semiMajor","eccentricity","period","angle","inclination","phase","descriptor"]),Vd=new Set(["star","planet","moon","asteroid","comet"]),oi=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Rd=["kind","class","culture","color","image","atmosphere","on","source"],zd=["radius","mass","density","gravity","temperature","inner","outer","cycle"],_d=["albedo"],Bd={"defaults-view":{description:"Sets the default camera projection for the atlas.",references:["Topdown = map-like","Isometric = angled overview","Orthographic/Perspective = 3D-ready semantic views"]},"defaults-scale":{description:"Chooses the overall spacing/style preset used by the renderer.",references:["diagram = tighter","presentation = roomier"]},"defaults-units":{description:"Stores a document-wide note about the unit style you want to use.",references:["Example: metric","Example: lore-standard"]},"viewpoint-projection":{description:"Overrides the projection for this saved viewpoint.",references:["Topdown = flat orbital map","Isometric = angled scene","Orthographic/Perspective = stored with current 2D fallback"]},"viewpoint-zoom":{description:"Controls how closely this viewpoint frames the system.",references:["1 = scene fit","2+ = close-up"]},"viewpoint-rotation":{description:"Legacy 2D screen rotation. This is separate from the Schema 2.5 camera block.",references:["90deg = quarter turn","Use camera.azimuth for semantic view direction"]},"viewpoint-camera-azimuth":{description:"Horizontal camera direction in degrees for Schema 2.5 viewpoints.",references:["0 = forward/default","90 = quarter orbit around the scene"]},"viewpoint-camera-elevation":{description:"Vertical camera tilt in degrees for 3D-ready viewpoints.",references:["0 = level","30 = gentle look down"]},"viewpoint-camera-roll":{description:"Rolls the camera around its forward axis.",references:["0 = upright","15 = slight bank"]},"viewpoint-camera-distance":{description:"Semantic camera distance for perspective viewpoints.",references:["4 = close","12 = wide framing"]},"viewpoint-events":{description:"Lists event IDs that this viewpoint should feature in its detail panel.",references:["solar-eclipse-naar","transit-window conjunction"]},"event-kind":{description:"Short semantic event type for tooling and viewer overlays.",references:["solar-eclipse","lunar-eclipse","transit"]},"event-target":{description:"Primary object this event is centered on.",references:["Naar","Seyra"]},"event-participants":{description:"Objects that participate in the event snapshot or description.",references:["Iyath Naar Seyra","Naar Seyra Orun"]},"event-timing":{description:"Free-text timing note for the event.",references:['"Every late bloom season"','"At local midyear"']},"event-visibility":{description:"Notes where or how the event is visible.",references:['"Visible from Naar"','"Southern hemisphere only"']},"event-epoch":{description:"Optional event-wide epoch that event poses inherit unless they override it.",references:['"JY-0001.0"','"Naar bloom cycle year 18"']},"event-referencePlane":{description:"Optional event-wide reference plane for all poses in this snapshot.",references:["ecliptic","naar-equatorial"]},"event-viewpoints":{description:"Viewpoint IDs that should list this event prominently.",references:["naar-system","overview inner-system"]},"placement-target":{description:"Names the body or reference this object is attached to.",references:["orbit Primary","surface Homeworld","at Naar:L4"]},"placement-free":{description:"Stores a free-placement offset or a descriptive label for loose placement.",references:["8au = far from the star",'"outer system" = descriptive note']},"placement-distance":{description:"Mean orbit distance from the target body.",references:["1 au = Earth-Sun distance","384400km = Earth-Moon distance"]},"placement-semiMajor":{description:"Semi-major axis of an orbit, used for elliptical orbits.",references:["1 au = Earth-Sun distance","Use this instead of distance when orbit shape matters"]},"placement-eccentricity":{description:"Controls how stretched the orbit is. Lower is rounder.",references:["0 = circular orbit","0.1 = mildly elliptical"]},"placement-period":{description:"How long one orbit takes.",references:["1 y = one Earth year","27.3d = Moon around Earth"]},"placement-angle":{description:"Rotates the orbit ellipse within the scene.",references:["0deg = default orientation","90deg = quarter turn"]},"placement-inclination":{description:"Tilts the orbit relative to the main orbital plane.",references:["0deg = same plane","5deg = slight tilt"]},"placement-phase":{description:"Starting position of the object along its orbit.",references:["0deg = start position","180deg = opposite side"]},"pose-epoch":{description:"Overrides the effective epoch for this pose only.",references:['"JY-0001.0"',"Falls back to event, object, then system"]},"pose-referencePlane":{description:"Overrides the effective reference plane for this pose only.",references:["naar-equatorial","Falls back to event, object, then system"]},"prop-radius":{description:"Visual body size or real-world-inspired radius value.",references:["1re = Earth radius","1sol = Sun radius"]},"prop-mass":{description:"Optional mass value for the body.",references:["1me = Earth mass","1sol = Sun mass"]},"prop-gravity":{description:"Surface gravity or a custom gravity marker.",references:["1g = Earth-like gravity","0.16g = Moon-like gravity"]},"prop-temperature":{description:"Typical temperature or narrative temperature marker.",references:["288K = Earth-like average","1200K = very hot world"]},"prop-atmosphere":{description:"Short atmosphere descriptor for the object.",references:['"nitrogen-oxygen"','"methane haze"']},"prop-inner":{description:"Inner edge for a belt, ring, or broad phenomenon.",references:["120000km = ring inner edge","2au = belt starts here"]},"prop-outer":{description:"Outer edge for a belt, ring, or broad phenomenon.",references:["190000km = ring outer edge","3au = belt ends here"]}};function Jo(e,t={}){zu(e),_u();let n=Nd(t),r=n.atlasDocument,i=n.source,o=i,s=i,c=n.diagnostics,a=r.objects[0]?{kind:"object",id:r.objects[0].id}:{kind:"system"},l=[],d=[],f=null,w=!1,I=!1,S=!1,k=null,C=null,Y="",v="",P=new Map,ne=t.showTextPane??!0,X=t.showInspector??!0,Q=t.showPreview??!0,re=t.shortcuts??!0;e.classList.add("wo-editor"),e.dataset.woShowInspector=String(X),e.dataset.woShowTextPane=String(ne),e.dataset.woShowPreview=String(Q),e.innerHTML=Ud();let U=je(e,"[data-editor-toolbar]"),be=je(e,"[data-editor-outline]"),ee=je(e,"[data-editor-stage-shell]"),te=je(e,"[data-editor-stage]"),q=je(e,"[data-editor-overlay]"),we=je(e,"[data-editor-diagnostics]"),le=je(e,"[data-editor-source-diagnostics]"),De=je(e,"[data-editor-status]"),We=je(e,"[data-editor-live]"),D=je(e,"[data-editor-inspector]"),oe=je(e,"[data-editor-source]"),Ze=je(e,"[data-editor-preview-visual]"),bt=je(e,"[data-editor-preview-markup]"),T=null;T=_t(te,{source:i,width:t.viewerWidth??1120,height:t.viewerHeight??680,preset:r.system?.defaults.preset??"atlas-card",projection:"document",minimap:!0,tooltipMode:"hover",onSelectionChange(u){let p=a?ni(a):null;if(w||!u){w||(a?.kind==="event-pose"&&a.id?xe({kind:"event",id:a.id},!1,!0):a?.kind==="object"?xe(p?{kind:"event",id:p}:null,!1,!0):a?.kind==="event"&&a.id&&xe({kind:"event",id:a.id},!1,!0));return}if(p&&na(r,p,u.objectId)){xe({kind:"event-pose",id:p,key:u.objectId},!1,!0);return}xe({kind:"object",id:u.objectId},!1,!0)},onViewChange(){Pe()}}),U.addEventListener("click",Pn),be.addEventListener("click",An),q.addEventListener("pointerdown",z),D?.addEventListener("click",Ln),D?.addEventListener("input",Tn),D?.addEventListener("change",vt),oe?.addEventListener("input",y),oe?.addEventListener("change",$),oe?.addEventListener("blur",$),e.addEventListener("keydown",Z),window.addEventListener("pointermove",F),window.addEventListener("pointerup",Ve),window.addEventListener("pointercancel",Ve);let R={setSource(u){yt(u,!1)&&(de(),Qe())},setAtlasDocument(u){K(u,!1,a,!1),de(),Qe()},getSource(){return i},getAtlasDocument(){return N(r)},getDiagnostics(){return c.map(pr)},getSelection(){return a?{path:{...a}}:null},isDirty(){return S},markSaved(){$e(!0)},selectPath(u){xe(u,!0,!0)},canUndo(){return l.length>0},canRedo(){return d.length>0},undo(){let u=l.pop();return u?(d.unshift(ye()),ae(u),!0):!1},redo(){let u=d.shift();return u?(l.push(ye()),ae(u),!0):!1},addObject(u="planet"){let p=Sn(u,r.objects.map(j=>j.id)),h=cu(u,p,r),g=lu(r,h);return K(g,!0,{kind:"object",id:p}),p},addEvent(){let u=Sn("event",r.events.map(g=>g.id)),p={id:u,kind:"",label:On(u),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},h=N(r);return h.events.push(p),h.events.sort(Go),K(h,!0,{kind:"event",id:u}),u},addViewpoint(){let u=Sn("viewpoint",r.system?.viewpoints.map(g=>g.id)??[]),p={id:u,label:On(u),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:r.system?.defaults.view??"topdown",preset:r.system?.defaults.preset??null,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null},h=N(r);return h.system?.viewpoints.push(p),h.system?.viewpoints.sort((g,j)=>g.id.localeCompare(j.id)),K(h,!0,{kind:"viewpoint",id:u}),u},addAnnotation(){let u=Sn("annotation",r.system?.annotations.map(g=>g.id)??[]),p={id:u,label:On(u),targetObjectId:null,body:"",tags:[],sourceObjectId:null},h=N(r);return h.system?.annotations.push(p),h.system?.annotations.sort((g,j)=>g.id.localeCompare(j.id)),K(h,!0,{kind:"annotation",id:u}),u},addMetadata(u,p){let h=u?.trim()||Sn("metadata",Object.keys(r.system?.atlasMetadata??{})),g=N(r);return g.system&&(g.system.atlasMetadata[h]=p??""),K(g,!0,{kind:"metadata",key:h}),h},removeSelection(){if(!a||a.kind==="system"||a.kind==="defaults")return!1;let u=pu(r,a);return K(u,!0,{kind:"system"}),!0},exportSvg(){return T.exportSvg()},exportEmbedMarkup(){return qo(W(),r)},destroy(){I||(I=!0,U.removeEventListener("click",Pn),be.removeEventListener("click",An),q.removeEventListener("pointerdown",z),D?.removeEventListener("click",Ln),D?.removeEventListener("input",Tn),D?.removeEventListener("change",vt),oe?.removeEventListener("input",y),oe?.removeEventListener("change",$),oe?.removeEventListener("blur",$),e.removeEventListener("keydown",Z),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",Ve),window.removeEventListener("pointercancel",Ve),O(),fe(),T.destroy(),e.innerHTML="",e.classList.remove("wo-editor"))}};return Fe(!0),ie(!0),R;function ye(){return{atlasDocument:N(r),selection:a?{...a}:null,source:i}}function de(){l.length=0,d.length=0,Qe()}function O(){k!==null&&(window.clearTimeout(k),k=null)}function fe(){C!==null&&(window.clearTimeout(C),C=null)}function W(){return f?.changed?mt(r):i}function ie(u=!1){let p=o!==s||i!==s||f?.changed===!0;!u&&p===S||(S=p,Xt(),t.onDirtyChange?.(S))}function $e(u=!1){o=i,Et(),s=i,ie(u)}function ae(u){O(),r=N(u.atlasDocument),i=u.source,o=i,c=ht(r),a=wt(u.selection),Je({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),xe(a,!1,!1),Fe(),ie(),Ce()}function K(u,p,h,g=!1){p&&(l.push(ye()),d.length=0),O(),r=N(u),i=mt(r),g||(o=i),c=ht(r),a=wt(h),Je({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),xe(a,!1,!1),Fe(),ie(),Ce()}function yt(u,p){o=u,oe&&oe.value!==u&&(oe.value=u);let h=gn(u);if(!h.ok||!h.value)return c=h.diagnostics.map(E=>({diagnostic:E,path:null})),Ut(),Ot(),et(),tt(),Xt(),Cn(),ie(),t.onDiagnosticsChange?.(c.map(pr)),!1;let g=h.value.atlasDocument??xt(h.value.document),j=hn(g,h.diagnostics);return p&&(l.push(ye()),d.length=0,o=mt(g)),r=N(g),i=mt(r),c=ea(j,ht(r)),a=wt(a),Je({preserveCamera:a?.kind!=="viewpoint",applyViewpointSelection:a?.kind==="viewpoint"}),Fe(),ie(),Ce(),!0}function Je(u={}){if(!T)return;let p=T.getState(),h=T.getRenderOptions(),g=r.system?.defaults.preset??"atlas-card",j=a?ni(a):null;w=!0,(h.preset!==g||h.projection!=="document"||(h.activeEventId??null)!==j)&&T.setRenderOptions({preset:g,projection:"document",activeEventId:j}),T.setDocument(dn(r)),u.applyViewpointSelection&&a?.kind==="viewpoint"&&a.id?T.goToViewpoint(a.id):u.preserveCamera!==!1?T.setState({...p,selectedObjectId:a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null}):a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key&&T.focusObject(a.key),w=!1}function Ce(){let u={source:i,atlasDocument:N(r),diagnostics:c.map(pr),selection:a?{path:{...a}}:null};t.onDiagnosticsChange?.(u.diagnostics),t.onSelectionChange?.(u.selection),t.onChange?.(u)}function xe(u,p,h=!0){a=wt(u),p&&(w=!0,T.setRenderOptions({activeEventId:a?ni(a):null}),a?.kind==="object"&&a.id?T.focusObject(a.id):a?.kind==="event-pose"&&a.key?T.focusObject(a.key):a?.kind==="viewpoint"&&a.id&&T.goToViewpoint(a.id),w=!1),Qe(),et(),D?.contains(document.activeElement)||tt(),Pe(),Xt(),Cn(),h&&t.onSelectionChange?.(a?{path:{...a}}:null)}function wt(u){if(!u)return null;let p=Vr(r,u);return p==null?u.kind==="system"||u.kind==="defaults"?u:null:u}function Fe(u=!1){Qe(),et(),Ut(),Ot(),D?.contains(document.activeElement)||tt(),Et(),Wt(u),Pe(),Xt(),Cn()}function Qe(){let u=U.querySelector("[data-editor-add-object-type]")?.value??"planet";U.innerHTML=`
192
- <div class="wo-editor-toolbar-group">
193
- <select data-editor-add-object-type>
194
- ${oi.map(p=>`<option value="${L(p)}"${p===u?" selected":""}>${L(On(p))}</option>`).join("")}
195
- </select>
196
- <button type="button" data-editor-action="add-object">Add object</button>
197
- <button type="button" data-editor-action="add-event">Add event</button>
198
- <button type="button" data-editor-action="add-viewpoint">Add viewpoint</button>
199
- <button type="button" data-editor-action="add-annotation">Add annotation</button>
200
- <button type="button" data-editor-action="add-metadata">Add metadata</button>
201
- </div>
202
- <div class="wo-editor-toolbar-group">
203
- <button type="button" data-editor-action="remove"${!a||a.kind==="system"||a.kind==="defaults"?" disabled":""}>Remove</button>
204
- <button type="button" data-editor-action="undo"${l.length===0?" disabled":""}>Undo</button>
205
- <button type="button" data-editor-action="redo"${d.length===0?" disabled":""}>Redo</button>
206
- <button type="button" data-editor-action="format">Format source</button>
207
- </div>
208
- `}function et(){let u=Ke(a),p=xu(c),h=Object.entries(r.system?.atlasMetadata??{}).sort(([g],[j])=>g.localeCompare(j));be.innerHTML=`
209
- <div class="wo-editor-outline-section">
210
- <h3>Atlas</h3>
211
- ${Xe({kind:"system"},"System",u,p)}
212
- ${Xe({kind:"defaults"},"Defaults",u,p)}
213
- </div>
214
- <div class="wo-editor-outline-section">
215
- <h3>Metadata</h3>
216
- ${h.length>0?h.map(([g])=>Xe({kind:"metadata",key:g},g,u,p)).join(""):'<p class="wo-editor-empty">No atlas metadata yet.</p>'}
217
- </div>
218
- <div class="wo-editor-outline-section">
219
- <h3>Viewpoints</h3>
220
- ${(r.system?.viewpoints.length??0)>0?r.system?.viewpoints.map(g=>Xe({kind:"viewpoint",id:g.id},g.label,u,p)).join(""):'<p class="wo-editor-empty">No viewpoints yet.</p>'}
221
- </div>
222
- <div class="wo-editor-outline-section">
223
- <h3>Annotations</h3>
224
- ${(r.system?.annotations.length??0)>0?r.system?.annotations.map(g=>Xe({kind:"annotation",id:g.id},g.label,u,p)).join(""):'<p class="wo-editor-empty">No annotations yet.</p>'}
225
- </div>
226
- <div class="wo-editor-outline-section">
227
- <h3>Events</h3>
228
- ${r.events.length>0?r.events.map(g=>Gd(g,u,p)).join(""):'<p class="wo-editor-empty">No events yet.</p>'}
229
- </div>
230
- <div class="wo-editor-outline-section">
231
- <h3>Objects</h3>
232
- ${r.objects.length>0?r.objects.map(g=>Xe({kind:"object",id:g.id},`${g.id} - ${g.type}`,u,p)).join(""):'<p class="wo-editor-empty">No objects yet.</p>'}
233
- </div>
234
- `}function Ut(){we.innerHTML=c.length===0?'<p class="wo-editor-empty">No diagnostics.</p>':c.map(u=>{let p=u.path?ur(u.path):"Source",h=Ho(u);return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(u.diagnostic.severity)}">
235
- <strong>${L(u.diagnostic.severity.toUpperCase())}</strong>
236
- <span>${L(p)}${h?` \xB7 ${L(h)}`:""}</span>
237
- <p>${L(u.diagnostic.message)}</p>
238
- </article>`}).join("")}function Ot(){let u=c.filter(p=>!p.path||p.diagnostic.line!==void 0);le.innerHTML=u.length===0?'<p class="wo-editor-empty">No source diagnostics.</p>':u.map(p=>{let h=Ho(p)??"Source";return`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(p.diagnostic.severity)}">
239
- <strong>${L(p.diagnostic.severity.toUpperCase())}</strong>
240
- <span>${L(h)}</span>
241
- <p>${L(p.diagnostic.message)}</p>
242
- </article>`}).join("")}function tt(){if(!D)return;Yd(D,P);let u={selection:a?{path:{...a}}:null,system:r.system,viewpoints:r.system?.viewpoints??[],events:r.events,objects:r.objects};if(!a){D.innerHTML='<p class="wo-editor-empty">Select an atlas node or object to edit it.</p>';return}let p=pa(a,c);switch(a.kind){case"system":D.innerHTML=p+Xd(u),ut(D,P),rt(a,c);return;case"defaults":D.innerHTML=p+Kd(u),ut(D,P),rt(a,c);return;case"metadata":D.innerHTML=p+Zd(u,a.key??""),ut(D,P),rt(a,c);return;case"viewpoint":D.innerHTML=p+Jd(u,a.id??""),ut(D,P),rt(a,c);return;case"event":D.innerHTML=p+Qd(u,a.id??""),ut(D,P),rt(a,c);return;case"event-pose":D.innerHTML=p+eu(u,a.id??"",a.key??""),ut(D,P),rt(a,c);return;case"annotation":D.innerHTML=p+tu(u,a.id??""),ut(D,P),rt(a,c);return;case"object":D.innerHTML=p+nu(u,a.id??""),ut(D,P),rt(a,c);return}}function Et(){oe&&oe.value!==o&&(oe.value=o)}function Wt(u=!1){if(u){si();return}ai()}function Pe(){if(!T)return;q.innerHTML="";let u=a?.kind==="object"?a.id??null:a?.kind==="event-pose"?a.key??null:null;if(!u)return;let p=T.getObjectDetails(u);if(!p)return;if(Yt(p.renderObject.x,p.renderObject.y,p.renderObject.objectId),p.parent&&Yt(p.parent.x,p.parent.y,`Parent: ${p.parent.objectId}`,!0),p.renderObject.anchorX!==void 0&&p.renderObject.anchorY!==void 0&&Yt(p.renderObject.anchorX,p.renderObject.anchorY,"Anchor",!0),p.object.placement?.mode==="orbit"&&p.orbit){let g=Ye({x:p.renderObject.x,y:p.renderObject.y});q.append(kn("orbit-phase",p.objectId,g,"Phase"));let j=ke(p);q.append(kn("orbit-radius",p.objectId,j,"Size"))}if(p.object.placement?.mode==="at"){q.append(kn("at-reference",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Reference"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag to an object center or nearby Lagrange point.",q.append(g)}if(p.object.placement?.mode==="surface"){q.append(kn("surface-target",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Surface"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag onto another surface-capable body.",q.append(g)}if(p.object.placement?.mode==="free"){q.append(kn("free-distance",p.objectId,Ye({x:p.renderObject.x,y:p.renderObject.y}),"Offset"));let g=document.createElement("div");g.className="wo-editor-hint wo-editor-hint-note",g.textContent="Drag horizontally to change free offset.",q.append(g)}let h=ua(a,c).slice(0,3);if(h.length>0){let g=document.createElement("div");g.className="wo-editor-overlay-diagnostics",g.setAttribute("role","status"),g.setAttribute("aria-live","polite"),g.innerHTML=h.map(j=>`<article class="wo-editor-overlay-diagnostic wo-editor-overlay-diagnostic-${L(j.diagnostic.severity)}">
243
- <strong>${L(j.diagnostic.severity.toUpperCase())}</strong>
244
- <p>${L(j.diagnostic.message)}</p>
245
- </article>`).join(""),q.append(g)}}function Yt(u,p,h,g=!1){let j=Ye({x:u,y:p}),E=document.createElement("div");E.className=`wo-editor-hint${g?" is-subtle":""}`,E.style.left=`${j.x}px`,E.style.top=`${j.y}px`,E.textContent=h,q.append(E)}function ke(u){let p=u.orbit;if(!p)return Ye({x:u.renderObject.x,y:u.renderObject.y});let h={x:p.cx+(p.kind==="circle"?p.radius??0:p.rx??0),y:p.cy},g=ve(h,{x:p.cx,y:p.cy},p.rotationDeg);return Ye(g)}function Ye(u){let p=T.getScene(),h=T.getState(),g={x:p.width/2,y:p.height/2},j=ve(u,g,h.rotationDeg),E={x:g.x+(j.x-g.x)*h.scale+h.translateX,y:g.y+(j.y-g.y)*h.scale+h.translateY},B=te.querySelector("svg");if(!B)return E;let J=B.getBoundingClientRect(),se=ee.getBoundingClientRect();return{x:J.left-se.left+E.x/Math.max(p.width,1)*J.width,y:J.top-se.top+E.y/Math.max(p.height,1)*J.height}}function Pn(u){let p=u.target?.closest("[data-editor-action]");if(p)switch(p.dataset.editorAction){case"add-object":{let h=U.querySelector("[data-editor-add-object-type]")?.value;R.addObject(h??"planet");return}case"add-viewpoint":R.addViewpoint();return;case"add-event":R.addEvent();return;case"add-annotation":R.addAnnotation();return;case"add-metadata":R.addMetadata();return;case"remove":R.removeSelection();return;case"undo":R.undo();return;case"redo":R.redo();return;case"format":O(),o=i,Et(),ie();return}}function An(u){let p=u.target?.closest("[data-path-kind]");p&&xe({kind:p.dataset.pathKind,id:p.dataset.pathId||void 0,key:p.dataset.pathKey||void 0},!0,!0)}function Ln(u){let p=u.target?.closest("[data-path-kind]");if(p){xe({kind:p.dataset.pathKind,id:p.dataset.pathId||void 0,key:p.dataset.pathKey||void 0},!0,!0);return}let h=u.target?.closest("[data-editor-action]");if(h&&h.dataset.editorAction==="add-event-pose"){let g=h.dataset.editorEventId||(a?.kind==="event"||a?.kind==="event-pose"?a.id??"":"");if(!g)return;let j=Su(r,g),E=j.events.find(J=>J.id===g),B=E?.positions.at(-1)??E?.positions[0];K(j,!0,B?{kind:"event-pose",id:g,key:B.objectId}:{kind:"event",id:g});return}}function Tn(){m(!1)}function vt(){m(!0)}function m(u){if(!(!a||!D))switch(a.kind){case"system":K(Ht(),u,a,!1);return;case"defaults":K(qt(),u,a,!1);return;case"metadata":K(Gt(a.key??""),u,a,!1);return;case"viewpoint":K(hr(a.id??""),u,a,!1);return;case"event":K(oa(a.id??""),u,a,!1);return;case"event-pose":K(aa(a.id??"",a.key??""),u,a,!1);return;case"annotation":K(sa(a.id??""),u,a,!1);return;case"object":K(ca(a.id??""),u,a,!1);return}}function y(){o=oe?.value??"",ie(),O(),k=window.setTimeout(()=>{k=null,yt(o,!1)},Td)}function $(){O(),yt(oe?.value??"",!0)&&Et()}function Z(u){if(u.key==="Escape"&&f){u.preventDefault(),Se();return}if(!re||u.defaultPrevented||da(u))return;let p=(u.ctrlKey||u.metaKey)&&!u.shiftKey&&u.key.toLowerCase()==="z",h=(u.ctrlKey||u.metaKey)&&(u.shiftKey&&u.key.toLowerCase()==="z"||u.key.toLowerCase()==="y");if(p){u.preventDefault(),R.undo();return}h&&(u.preventDefault(),R.redo())}function z(u){let p=u.target?.closest("[data-handle-kind]");if(!p)return;let h=p.dataset.objectId,g=p.dataset.handleKind;if(!h||!["orbit-phase","orbit-radius","at-reference","surface-target","free-distance"].includes(g))return;if(O(),o!==i&&!yt(o,!0)){u.preventDefault();return}let j=T?.getObjectDetails(h)??null;f={kind:g,objectId:h,pointerId:u.pointerId,path:a?{...a}:{kind:"object",id:h},startedFrom:ye(),changed:!1,orbitRadiusContext:g==="orbit-radius"&&j?bu(r,T.getScene(),j):null},p.setPointerCapture?.(u.pointerId),u.preventDefault()}function F(u){if(!f||f.pointerId!==u.pointerId||!a||Ke(a)!==Ke(f.path))return;let p=T.getObjectDetails(f.objectId);if(!p)return;let h=nt(u.clientX,u.clientY),g=r;switch(f.kind){case"orbit-phase":p.object.placement?.mode==="orbit"&&p.orbit&&(g=fu(r,f.path,f.objectId,p,h));break;case"orbit-radius":p.object.placement?.mode==="orbit"&&p.orbit&&(g=mu(r,f.path,f.objectId,p,h,f.orbitRadiusContext??null));break;case"at-reference":p.object.placement?.mode==="at"&&(g=hu(r,f.path,f.objectId,T.getScene(),h));break;case"surface-target":p.object.placement?.mode==="surface"&&(g=gu(r,f.path,f.objectId,T.getScene(),h));break;case"free-distance":p.object.placement?.mode==="free"&&(g=yu(r,f.path,f.objectId,T.getScene(),p,h));break}g!==r&&(f.changed=!0,r=N(g),c=ht(r),Je({preserveCamera:!0,applyViewpointSelection:!1}),Ut(),Ot(),et(),tt(),Pe(),Xt(),Cn(),ai(),ie())}function Ve(u){if(!f||f.pointerId!==u.pointerId)return;let p=f;if(!f.changed){f=null;return}l.push(f.startedFrom),d.length=0,i=mt(r),o=i,f=null,Fe(),p.kind==="orbit-radius"&&la(p.objectId),ie(),Ce()}function Se(){if(!f)return;let u=f.startedFrom;f=null,r=N(u.atlasDocument),i=u.source,o=i,c=ht(r),xe(u.selection,!1,!1),Je({preserveCamera:!0,applyViewpointSelection:a?.kind==="viewpoint"}),Fe(),ie(),Ce()}function nt(u,p){let h=te.querySelector("svg"),g=T.getScene();if(!h)return{x:g.width/2,y:g.height/2};let j=h.getBoundingClientRect(),E={x:(u-j.left)/Math.max(j.width,1)*g.width,y:(p-j.top)/Math.max(j.height,1)*g.height};return kt(g,T.getState(),E)}function Ht(){let u=N(r),p=D?.querySelector("form[data-editor-form='system']");return!p||!u.system||(u.system.id=ge(p,"system-id")||u.system.id,u.system.title=M(p,"system-title")),u}function qt(){let u=N(r),p=D?.querySelector("form[data-editor-form='defaults']");return!p||!u.system||(u.system.defaults.view=ge(p,"defaults-view")||"topdown",u.system.defaults.scale=M(p,"defaults-scale"),u.system.defaults.units=M(p,"defaults-units"),u.system.defaults.preset=M(p,"defaults-preset")??null,u.system.defaults.theme=M(p,"defaults-theme")),u}function Gt(u){let p=N(r),h=D?.querySelector("form[data-editor-form='metadata']");if(!h||!p.system)return p;let g=ge(h,"metadata-key")||u,j=M(h,"metadata-value")??"";return g!==u?(delete p.system.atlasMetadata[u],p.system.atlasMetadata[g]=j,a={kind:"metadata",key:g},p):(p.system.atlasMetadata[u]=j,p)}function hr(u){let p=N(r),h=D?.querySelector("form[data-editor-form='viewpoint']"),g=p.system?.viewpoints.find(B=>B.id===u);if(!h||!g||!p.system)return p;let j=ge(h,"viewpoint-id")||g.id,E={...g,id:j,label:ge(h,"viewpoint-label")||g.label,summary:M(h,"viewpoint-summary")??"",focusObjectId:M(h,"viewpoint-focus"),selectedObjectId:M(h,"viewpoint-select"),projection:ge(h,"viewpoint-projection")||g.projection,preset:M(h,"viewpoint-preset")??null,zoom:gt(M(h,"viewpoint-zoom")),rotationDeg:gt(M(h,"viewpoint-rotation"))??0,camera:au(h),layers:{background:Be(h,"layer-background"),guides:Be(h,"layer-guides"),"orbits-back":Be(h,"layer-orbits-back"),"orbits-front":Be(h,"layer-orbits-front"),events:Be(h,"layer-events"),objects:Be(h,"layer-objects"),labels:Be(h,"layer-labels"),metadata:Be(h,"layer-metadata")},events:Ge(M(h,"viewpoint-events")),filter:{query:M(h,"filter-query"),objectTypes:su(M(h,"filter-object-types")),tags:Ge(M(h,"filter-tags")),groupIds:Ge(M(h,"filter-groups"))}};return p.system.viewpoints=p.system.viewpoints.filter(B=>B.id!==g.id).concat(E).sort((B,J)=>B.id.localeCompare(J.id)),g.id!==E.id&&(a={kind:"viewpoint",id:E.id}),p}function oa(u){let p=N(r),h=D?.querySelector("form[data-editor-form='event']"),g=p.events.find(B=>B.id===u);if(!h||!g)return p;let j=ge(h,"event-id")||g.id,E={...g,id:j,kind:ge(h,"event-kind"),label:ge(h,"event-label")||g.label,summary:M(h,"event-summary"),targetObjectId:M(h,"event-target"),participantObjectIds:Ge(M(h,"event-participants")),timing:M(h,"event-timing"),visibility:M(h,"event-visibility"),epoch:M(h,"event-epoch"),referencePlane:M(h,"event-referencePlane"),tags:Ge(M(h,"event-tags")),color:M(h,"event-color"),hidden:Be(h,"event-hidden")};return p.events=p.events.filter(B=>B.id!==g.id).concat(E).sort(Go),Eu(p,g.id,E.id,Ge(M(h,"event-viewpoints"))),g.id!==E.id&&(a={kind:"event",id:E.id}),p}function aa(u,p){let h=N(r),g=D?.querySelector("form[data-editor-form='event-pose']"),j=h.events.find(Ae=>Ae.id===u),E=j?.positions.find(Ae=>Ae.objectId===p);if(!g||!j||!E)return h;let J={objectId:ge(g,"pose-object-id")||E.objectId,placement:iu(g,E),epoch:M(g,"pose-epoch"),referencePlane:M(g,"pose-referencePlane")},se=Ue(M(g,"prop-inner")),Fn=Ue(M(g,"prop-outer"));return se&&(J.inner=se),Fn&&(J.outer=Fn),j.positions=j.positions.filter(Ae=>Ae.objectId!==E.objectId).concat(J).sort(mr),j.targetObjectId!==J.objectId&&!j.participantObjectIds.includes(J.objectId)&&(j.participantObjectIds.push(J.objectId),j.participantObjectIds.sort((Ae,Kt)=>Ae.localeCompare(Kt))),E.objectId!==J.objectId&&(a={kind:"event-pose",id:u,key:J.objectId}),h}function sa(u){let p=N(r),h=D?.querySelector("form[data-editor-form='annotation']"),g=p.system?.annotations.find(B=>B.id===u);if(!h||!g||!p.system)return p;let j=ge(h,"annotation-id")||g.id,E={...g,id:j,label:ge(h,"annotation-label")||g.label,targetObjectId:M(h,"annotation-target"),body:M(h,"annotation-body")??"",tags:Ge(M(h,"annotation-tags")),sourceObjectId:M(h,"annotation-source")};return p.system.annotations=p.system.annotations.filter(B=>B.id!==g.id).concat(E).sort((B,J)=>B.id.localeCompare(J.id)),g.id!==E.id&&(a={kind:"annotation",id:E.id}),p}function ca(u){let p=N(r),h=D?.querySelector("form[data-editor-form='object']"),g=p.objects.find(se=>se.id===u);if(!h||!g)return p;let j=ge(h,"object-id")||g.id,E={...g,id:j,type:ge(h,"object-type")||g.type,properties:{...g.properties},info:{...g.info},placement:ru(h,g)};for(let se of Rd)dr(E.properties,se,M(h,`prop-${se}`));for(let se of zd)dr(E.properties,se,ou(M(h,`prop-${se}`)));for(let se of _d)dr(E.properties,se,gt(M(h,`prop-${se}`)));dr(E.properties,"tags",Ge(M(h,"prop-tags"))),E.properties.hidden=Be(h,"prop-hidden");let B=M(h,"info-description");B?E.info.description=B:delete E.info.description;let J=du(p,g.id,E);return g.id!==E.id&&(a={kind:"object",id:E.id}),J}function Xt(){let u=c.filter(g=>g.diagnostic.severity==="error").length,p=c.filter(g=>g.diagnostic.severity==="warning").length,h=a?ur(a):"Nothing selected";De.innerHTML=`
246
- <span class="wo-editor-status-pill${S?" is-dirty":" is-clean"}">${S?"Unsaved changes":"Saved"}</span>
247
- <span class="wo-editor-status-pill">Schema ${L(r.version)}</span>
248
- <span class="wo-editor-status-pill${u>0?" is-error":p>0?" is-warning":""}">${u} errors \xB7 ${p} warnings</span>
249
- <span class="wo-editor-status-pill">${L(h)}</span>
250
- `}function Cn(){let u=c.filter(h=>h.diagnostic.severity==="error").length,p=c.filter(h=>h.diagnostic.severity==="warning").length;We.textContent=`${S?"Unsaved changes.":"Saved."} ${u} errors, ${p} warnings. ${a?ur(a):"Nothing selected"}.`}function ai(){C===null&&(C=window.setTimeout(()=>{C=null,si()},Cd))}function si(){if(!T)return;let u=T.exportSvg();Ze&&u!==Y&&(Ze.innerHTML=u,Y=u);let p=qo(W(),r);bt&&p!==v&&(bt.textContent=p,v=p)}function la(u){if(!T)return;let p=T.getObjectDetails(u);if(!p)return;let h=yn(T.getScene(),T.getState()),g=36/Math.max(T.getState().scale,.001),j=p.renderObject;(j.x<h.minX+g||j.x>h.maxX-g||j.y<h.minY+g||j.y>h.maxY-g)&&T.fitToSystem()}function da(u){let p=u.target;if(!p)return!1;let h=p.tagName.toLowerCase();return p.isContentEditable||h==="input"||h==="textarea"||h==="select"}function gr(u,p){if(!u)return[];let h=Ke(u);return p.filter(g=>{let j=Ke(g.path);return j&&j===h?!0:u.kind==="object"&&g.diagnostic.objectId===u.id})}function ua(u,p){return gr(u,p).filter(h=>{let g=h.diagnostic.field??"";return ri.has(g)||h.diagnostic.message.toLowerCase().includes("placement")||h.diagnostic.message.toLowerCase().includes("orbit")||h.diagnostic.message.toLowerCase().includes("surface")||h.diagnostic.message.toLowerCase().includes("lagrange")||h.diagnostic.message.toLowerCase().includes("anchor")})}function pa(u,p){let h=gr(u,p);return h.length===0?"":`<div class="wo-editor-inspector-summary">
251
- ${h.slice(0,4).map(g=>`<article class="wo-editor-diagnostic wo-editor-diagnostic-${L(g.diagnostic.severity)}">
252
- <strong>${L(g.diagnostic.severity.toUpperCase())}</strong>
253
- <span>${L(g.diagnostic.field??ur(u))}</span>
254
- <p>${L(g.diagnostic.message)}</p>
255
- </article>`).join("")}
256
- </div>`}function rt(u,p){if(!D||!u)return;let h=gr(u,p),g=new Map;for(let j of h)for(let E of Iu(u,j.diagnostic.field)){let B=g.get(E)??[];B.push(j),g.set(E,B)}for(let[j,E]of g){let B=D.querySelector(`[name="${CSS.escape(j)}"]`),J=B?.closest(".wo-editor-field, .wo-editor-checkbox");if(!B||!J)continue;let se=E.some(Kt=>Kt.diagnostic.severity==="error"),Fn=E.some(Kt=>Kt.diagnostic.severity==="warning");J.classList.add(se?"has-error":"has-warning"),B.setAttribute("aria-invalid",se?"true":"false");let Ae=document.createElement("div");Ae.className=`wo-editor-field-note${se?" is-error":Fn?" is-warning":""}`,Ae.textContent=E[0]?.diagnostic.message??"",J.append(Ae)}}}function Nd(e){if(e.atlasDocument){let n=N(e.atlasDocument);return{atlasDocument:n,source:mt(n),diagnostics:ht(n)}}if(e.source){let n=gn(e.source);if(n.ok&&n.value){let r=n.value.atlasDocument??xt(n.value.document);return{atlasDocument:r,source:mt(r),diagnostics:ea(hn(r,n.diagnostics),ht(r))}}}let t=nr("WorldOrbit");return{atlasDocument:t,source:mt(t),diagnostics:ht(t)}}function mt(e){return Kn(e,{schema:e.version})}function Ud(){let e=qd();return`<section class="wo-editor-shell">
257
- <div class="wo-editor-toolbar" data-editor-toolbar></div>
258
- <div class="wo-editor-status" data-editor-status role="status" aria-live="polite"></div>
259
- <div class="wo-editor-main">
260
- <aside class="wo-editor-sidebar" data-editor-pane="sidebar">
261
- <div class="wo-editor-panel">${jn("Atlas","atlas",'<div class="wo-editor-outline" data-editor-outline></div>')}</div>
262
- <div class="wo-editor-panel">${jn("Diagnostics","diagnostics",'<div class="wo-editor-diagnostics" data-editor-diagnostics></div>')}</div>
263
- </aside>
264
- <div class="wo-editor-stage-panel">
265
- <div class="wo-editor-stage-shell" data-editor-stage-shell>
266
- <div class="wo-editor-stage" data-editor-stage></div>
267
- <div class="wo-editor-overlay" data-editor-overlay></div>
268
- </div>
269
- <div class="wo-editor-panel" data-editor-pane="preview">
270
- ${jn("Preview","preview",`<div class="wo-editor-preview">
271
- <div class="wo-editor-preview-card">
272
- <h3>Static SVG</h3>
273
- <div class="wo-editor-preview-visual" data-editor-preview-visual></div>
274
- </div>
275
- <div class="wo-editor-preview-card">
276
- <h3>Embed Markup</h3>
277
- <pre class="wo-editor-preview-markup" data-editor-preview-markup></pre>
278
- </div>
279
- </div>`,e)}
280
- </div>
281
- </div>
282
- <aside class="wo-editor-panel wo-editor-inspector" data-editor-pane="inspector">
283
- ${jn("Inspector","inspector","<div data-editor-inspector></div>")}
284
- </aside>
285
- </div>
286
- <div class="wo-editor-panel wo-editor-text-panel" data-editor-pane="text">
287
- ${jn("Source","source",`<textarea
288
- class="wo-editor-source"
289
- data-editor-source
290
- spellcheck="false"
291
- aria-describedby="worldorbit-editor-source-diagnostics"
292
- ></textarea>
293
- <div
294
- class="wo-editor-source-diagnostics"
295
- id="worldorbit-editor-source-diagnostics"
296
- data-editor-source-diagnostics
297
- aria-live="polite"
298
- ></div>`)}
299
- </div>
300
- <div class="wo-editor-live-region" data-editor-live aria-live="polite" aria-atomic="true"></div>
301
- </section>`}function jn(e,t,n,r=!0){return`<details class="wo-editor-panel-section" data-editor-panel-section="${L(t)}"${r?" open":""}>
302
- <summary><span>${L(e)}</span></summary>
303
- <div class="wo-editor-panel-section-body">${n}</div>
304
- </details>`}function pe(e,t,n,r,i=!1){let o=Hd(e,t);return`<details class="wo-editor-inspector-section" data-editor-form-section="${L(t)}" data-editor-form-id="${L(e)}" data-editor-section-state="${L(o)}"${i?" open":""}>
305
- <summary><span>${L(n)}</span></summary>
306
- <div class="wo-editor-inspector-section-body">${r}</div>
307
- </details>`}function fr(e,t){return`<span class="wo-editor-field-label">${L(e)}${Wd(t)}</span>`}function Wd(e){let t=Bd[e];return t?`<details class="wo-editor-field-help">
308
- <summary aria-label="Explain ${ia(e)}">?</summary>
309
- <div class="wo-editor-field-help-card">
310
- <p>${L(t.description)}</p>
311
- ${(t.references?.length??0)>0?`<div class="wo-editor-field-help-chips">${(t.references??[]).map(n=>`<span>${L(n)}</span>`).join("")}</div>`:""}
312
- </div>
313
- </details>`:""}function Yd(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;r&&t.set(r,n.open)}}function ut(e,t){for(let n of e.querySelectorAll("[data-editor-section-state]")){let r=n.dataset.editorSectionState;!r||!t.has(r)||(n.open=t.get(r)===!0)}}function Hd(e,t){return`${e}:${t}`}function qd(){return typeof window>"u"?!0:typeof window.matchMedia=="function"?!window.matchMedia("(max-width: 1280px)").matches:window.innerWidth>1280}function Xe(e,t,n,r){let i=Ke(e),o=i?r.get(i):null,s=o&&(o.errors>0||o.warnings>0)?`<span class="wo-editor-outline-badge${o.errors>0?" is-error":" is-warning"}">${o.errors>0?o.errors:o.warnings}</span>`:"";return`<button type="button" class="wo-editor-outline-item${i===n?" is-active":""}" data-path-kind="${L(e.kind)}"${e.id?` data-path-id="${L(e.id)}"`:""}${e.key?` data-path-key="${L(e.key)}"`:""}><span>${L(t)}</span>${s}</button>`}function Gd(e,t,n){return`<div class="wo-editor-outline-group">
314
- ${Xe({kind:"event",id:e.id},e.label||e.id,t,n)}
315
- ${e.positions.length>0?`<div class="wo-editor-outline-children">${[...e.positions].sort(mr).map(r=>Xe({kind:"event-pose",id:e.id,key:r.objectId},r.objectId,t,n)).join("")}</div>`:""}
316
- </div>`}function Xd(e){return`<form class="wo-editor-form" data-editor-form="system">
317
- <h2>System</h2>
318
- ${pe("system","basics","Basics",`${x("System ID","system-id",e.system?.id??"")}
319
- ${x("Title","system-title",e.system?.title??"")}`,!0)}
320
- </form>`}function Kd(e){let t=e.system?.defaults;return`<form class="wo-editor-form" data-editor-form="defaults">
321
- <h2>Defaults</h2>
322
- ${pe("defaults","basics","Basics",`${St("Projection","defaults-view",[["topdown","Topdown"],["isometric","Isometric"],["orthographic","Orthographic"],["perspective","Perspective"]],t?.view??"topdown")}
323
- ${x("Scale preset","defaults-scale",t?.scale??"")}
324
- ${x("Units","defaults-units",t?.units??"")}
325
- ${St("Render preset","defaults-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],t?.preset??"")}
326
- ${x("Theme","defaults-theme",t?.theme??"")}`,!0)}
327
- </form>`}function Zd(e,t){let n=e.system?.atlasMetadata[t]??"";return`<form class="wo-editor-form" data-editor-form="metadata">
328
- <h2>Metadata</h2>
329
- ${pe("metadata","entry","Entry",`${x("Key","metadata-key",t)}
330
- ${Mn("Value","metadata-value",n)}`,!0)}
331
- </form>`}function Jd(e,t){let n=e.viewpoints.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="viewpoint">
332
- <h2>Viewpoint</h2>
333
- ${pe("viewpoint","basics","Basics",`${x("ID","viewpoint-id",n.id)}
334
- ${x("Label","viewpoint-label",n.label)}
335
- ${Mn("Summary","viewpoint-summary",n.summary)}
336
- ${x("Focus object","viewpoint-focus",n.focusObjectId??"")}
337
- ${x("Selected object","viewpoint-select",n.selectedObjectId??"")}
338
- ${St("Projection","viewpoint-projection",[["topdown","Topdown"],["isometric","Isometric"],["orthographic","Orthographic"],["perspective","Perspective"]],n.projection)}
339
- ${St("Preset","viewpoint-preset",[["","Document default"],["diagram","Diagram"],["presentation","Presentation"],["atlas-card","Atlas Card"],["markdown","Markdown"]],n.preset??"")}
340
- ${x("Zoom","viewpoint-zoom",n.zoom===null?"":String(n.zoom))}
341
- ${x("Rotation","viewpoint-rotation",String(n.rotationDeg))}`,!0)}
342
- ${pe("viewpoint","camera","Camera",`${x("Azimuth","viewpoint-camera-azimuth",n.camera?.azimuth===null||n.camera?.azimuth===void 0?"":String(n.camera.azimuth))}
343
- ${x("Elevation","viewpoint-camera-elevation",n.camera?.elevation===null||n.camera?.elevation===void 0?"":String(n.camera.elevation))}
344
- ${x("Roll","viewpoint-camera-roll",n.camera?.roll===null||n.camera?.roll===void 0?"":String(n.camera.roll))}
345
- ${x("Distance","viewpoint-camera-distance",n.camera?.distance===null||n.camera?.distance===void 0?"":String(n.camera.distance))}
346
- <p class="wo-editor-inline-note">Rotation stays a 2D screen-rotation hint. The camera block stores Schema 2.5 view direction and framing.</p>`)}
347
- ${pe("viewpoint","layers","Layers",`<fieldset class="wo-editor-fieldset">
348
- <legend>Layers</legend>
349
- ${Ne("Background","layer-background",n.layers.background!==!1)}
350
- ${Ne("Guides","layer-guides",n.layers.guides!==!1)}
351
- ${Ne("Orbits back","layer-orbits-back",n.layers["orbits-back"]!==!1)}
352
- ${Ne("Orbits front","layer-orbits-front",n.layers["orbits-front"]!==!1)}
353
- ${Ne("Events","layer-events",n.layers.events!==!1)}
354
- ${Ne("Objects","layer-objects",n.layers.objects!==!1)}
355
- ${Ne("Labels","layer-labels",n.layers.labels!==!1)}
356
- ${Ne("Metadata","layer-metadata",n.layers.metadata!==!1)}
357
- </fieldset>`)}
358
- ${pe("viewpoint","filter","Filter",`${x("Filter query","filter-query",n.filter?.query??"")}
359
- ${x("Filter object types","filter-object-types",n.filter?.objectTypes.join(" ")??"")}
360
- ${x("Filter tags","filter-tags",n.filter?.tags.join(" ")??"")}
361
- ${x("Filter groups","filter-groups",n.filter?.groupIds.join(" ")??"")}
362
- ${x("Events","viewpoint-events",n.events.join(" "))}`)}
363
- </form>`:'<p class="wo-editor-empty">Viewpoint not found.</p>'}function Qd(e,t){let n=e.events.find(i=>i.id===t);if(!n)return'<p class="wo-editor-empty">Event not found.</p>';let r=e.viewpoints.filter(i=>i.events.includes(n.id)).map(i=>i.id).join(" ");return`<form class="wo-editor-form" data-editor-form="event">
364
- <h2>Event</h2>
365
- ${pe("event","basics","Basics",`${x("ID","event-id",n.id)}
366
- ${x("Kind","event-kind",n.kind)}
367
- ${x("Label","event-label",n.label)}
368
- ${Mn("Summary","event-summary",n.summary??"")}
369
- ${x("Target object","event-target",n.targetObjectId??"")}
370
- ${x("Participants","event-participants",n.participantObjectIds.join(" "))}
371
- ${x("Timing","event-timing",n.timing??"")}
372
- ${x("Visibility","event-visibility",n.visibility??"")}
373
- ${x("Epoch","event-epoch",n.epoch??"")}
374
- ${x("Reference plane","event-referencePlane",n.referencePlane??"")}
375
- ${x("Tags","event-tags",n.tags.join(" "))}
376
- ${x("Color","event-color",n.color??"")}
377
- ${Ne("Hidden","event-hidden",n.hidden===!0)}`,!0)}
378
- ${pe("event","viewpoints","Viewpoints",`${x("Viewpoints","event-viewpoints",r)}`)}
379
- ${pe("event","positions","Positions",`${n.positions.length>0?`<div class="wo-editor-inline-list">${n.positions.map(i=>Xe({kind:"event-pose",id:n.id,key:i.objectId},i.objectId,null,new Map)).join("")}</div>`:'<p class="wo-editor-empty">No event poses yet.</p>'}
380
- <div class="wo-editor-inline-actions">
381
- <button type="button" data-editor-action="add-event-pose" data-editor-event-id="${L(n.id)}">Add pose</button>
382
- </div>`)}
383
- </form>`}function eu(e,t,n){let r=e.events.find(a=>a.id===t),i=r?.positions.find(a=>a.objectId===n);if(!r||!i)return'<p class="wo-editor-empty">Event pose not found.</p>';let o=i.placement?.mode??"",s=i.placement?.mode==="orbit"||i.placement?.mode==="surface"||i.placement?.mode==="at"?i.placement.target:"",c=i.placement?.mode==="free"?i.placement.distance?me(i.placement.distance):i.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="event-pose">
384
- <h2>Event Pose</h2>
385
- <p class="wo-editor-inline-note">Event <strong>${L(r.label||r.id)}</strong></p>
386
- ${pe("event-pose","identity","Identity",`${x("Object","pose-object-id",i.objectId)}
387
- <div class="wo-editor-inline-actions">
388
- <button type="button" data-path-kind="event" data-path-id="${L(r.id)}">Select event</button>
389
- </div>`,!0)}
390
- ${pe("event-pose","placement","Placement",`${St("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],o)}
391
- ${x("Placement target","placement-target",s)}
392
- ${x("Free value","placement-free",c)}
393
- ${x("Distance","placement-distance",i.placement?.mode==="orbit"&&i.placement.distance?me(i.placement.distance):"")}
394
- ${x("Semi-major","placement-semiMajor",i.placement?.mode==="orbit"&&i.placement.semiMajor?me(i.placement.semiMajor):"")}
395
- ${x("Eccentricity","placement-eccentricity",i.placement?.mode==="orbit"&&i.placement.eccentricity!==void 0?String(i.placement.eccentricity):"")}
396
- ${x("Period","placement-period",i.placement?.mode==="orbit"&&i.placement.period?me(i.placement.period):"")}
397
- ${x("Angle","placement-angle",i.placement?.mode==="orbit"&&i.placement.angle?me(i.placement.angle):"")}
398
- ${x("Inclination","placement-inclination",i.placement?.mode==="orbit"&&i.placement.inclination?me(i.placement.inclination):"")}
399
- ${x("Phase","placement-phase",i.placement?.mode==="orbit"&&i.placement.phase?me(i.placement.phase):"")}
400
- ${x("Inner","prop-inner",i.inner?me(i.inner):"")}
401
- ${x("Outer","prop-outer",i.outer?me(i.outer):"")}`,!0)}
402
- ${pe("event-pose","context","Context",`${x("Epoch","pose-epoch",i.epoch??"")}
403
- ${x("Reference plane","pose-referencePlane",i.referencePlane??"")}
404
- <p class="wo-editor-inline-note">Falls back to event, then object, then system context when left empty.</p>`)}
405
- </form>`}function tu(e,t){let n=e.system?.annotations.find(r=>r.id===t);return n?`<form class="wo-editor-form" data-editor-form="annotation">
406
- <h2>Annotation</h2>
407
- ${pe("annotation","entry","Entry",`${x("ID","annotation-id",n.id)}
408
- ${x("Label","annotation-label",n.label)}
409
- ${x("Target object","annotation-target",n.targetObjectId??"")}
410
- ${x("Source object","annotation-source",n.sourceObjectId??"")}
411
- ${Mn("Body","annotation-body",n.body)}
412
- ${x("Tags","annotation-tags",n.tags.join(" "))}`,!0)}
413
- </form>`:'<p class="wo-editor-empty">Annotation not found.</p>'}function nu(e,t){let n=e.objects.find(s=>s.id===t);if(!n)return'<p class="wo-editor-empty">Object not found.</p>';let r=n.placement?.mode??"",i=n.placement?.mode==="orbit"||n.placement?.mode==="surface"||n.placement?.mode==="at"?n.placement.target:"",o=n.placement?.mode==="free"?n.placement.distance?me(n.placement.distance):n.placement.descriptor??"":"";return`<form class="wo-editor-form" data-editor-form="object">
414
- <h2>Object</h2>
415
- ${pe("object","identity","Identity",`${x("ID","object-id",n.id)}
416
- ${St("Type","object-type",oi.map(s=>[s,On(s)]),n.type)}`,!0)}
417
- ${pe("object","placement","Placement",`${St("Placement mode","placement-mode",[["","None"],["orbit","Orbit"],["at","At"],["surface","Surface"],["free","Free"]],r)}
418
- ${x("Placement target","placement-target",i)}
419
- ${x("Free value","placement-free",o)}
420
- ${x("Distance","placement-distance",n.placement?.mode==="orbit"&&n.placement.distance?me(n.placement.distance):"")}
421
- ${x("Semi-major","placement-semiMajor",n.placement?.mode==="orbit"&&n.placement.semiMajor?me(n.placement.semiMajor):"")}
422
- ${x("Eccentricity","placement-eccentricity",n.placement?.mode==="orbit"&&n.placement.eccentricity!==void 0?String(n.placement.eccentricity):"")}
423
- ${x("Period","placement-period",n.placement?.mode==="orbit"&&n.placement.period?me(n.placement.period):"")}
424
- ${x("Angle","placement-angle",n.placement?.mode==="orbit"&&n.placement.angle?me(n.placement.angle):"")}
425
- ${x("Inclination","placement-inclination",n.placement?.mode==="orbit"&&n.placement.inclination?me(n.placement.inclination):"")}
426
- ${x("Phase","placement-phase",n.placement?.mode==="orbit"&&n.placement.phase?me(n.placement.phase):"")}`,!0)}
427
- ${pe("object","properties","Properties",`<fieldset class="wo-editor-fieldset">
428
- <legend>Properties</legend>
429
- ${x("Kind","prop-kind",pt(n.properties.kind))}
430
- ${x("Class","prop-class",pt(n.properties.class))}
431
- ${x("Culture","prop-culture",pt(n.properties.culture))}
432
- ${x("Tags","prop-tags",Mu(n.properties.tags))}
433
- ${x("Color","prop-color",pt(n.properties.color))}
434
- ${x("Image","prop-image",pt(n.properties.image))}
435
- ${Ne("Hidden","prop-hidden",n.properties.hidden===!0)}
436
- ${x("Radius","prop-radius",ft(n.properties.radius))}
437
- ${x("Mass","prop-mass",ft(n.properties.mass))}
438
- ${x("Density","prop-density",ft(n.properties.density))}
439
- ${x("Gravity","prop-gravity",ft(n.properties.gravity))}
440
- ${x("Temperature","prop-temperature",ft(n.properties.temperature))}
441
- ${x("Albedo","prop-albedo",Du(n.properties.albedo))}
442
- ${x("Atmosphere","prop-atmosphere",pt(n.properties.atmosphere))}
443
- ${x("Inner","prop-inner",ft(n.properties.inner))}
444
- ${x("Outer","prop-outer",ft(n.properties.outer))}
445
- ${x("On","prop-on",pt(n.properties.on))}
446
- ${x("Source","prop-source",pt(n.properties.source))}
447
- ${x("Cycle","prop-cycle",ft(n.properties.cycle))}
448
- </fieldset>`)}
449
- ${pe("object","info","Info",`${Mn("Description","info-description",n.info.description??"")}`)}
450
- </form>`}function x(e,t,n){return`<label class="wo-editor-field">${fr(e,t)}<input name="${L(t)}" value="${ia(n)}" /></label>`}function Mn(e,t,n){return`<label class="wo-editor-field">${fr(e,t)}<textarea name="${L(t)}">${L(n)}</textarea></label>`}function St(e,t,n,r){return`<label class="wo-editor-field">${fr(e,t)}<select name="${L(t)}">${n.map(([i,o])=>`<option value="${L(i)}"${i===r?" selected":""}>${L(o)}</option>`).join("")}</select></label>`}function Ne(e,t,n){return`<label class="wo-editor-checkbox"><input type="checkbox" name="${L(t)}"${n?" checked":""} />${fr(e,t)}</label>`}function kn(e,t,n,r){let i=document.createElement("button");return i.type="button",i.className="wo-editor-handle",i.dataset.handleKind=e,i.dataset.objectId=t,i.style.left=`${n.x}px`,i.style.top=`${n.y}px`,i.textContent=r,i}function ge(e,t){return e.elements.namedItem(t)?.value.trim()??""}function M(e,t){let n=ge(e,t);return n||null}function Be(e,t){return e.elements.namedItem(t)?.checked??!1}function ru(e,t){return Qo(e,t.placement,t.id)}function iu(e,t){return Qo(e,t.placement,t.objectId)}function Qo(e,t,n){let r=ge(e,"placement-mode"),i=M(e,"placement-target");switch(r){case"orbit":return{mode:r,target:i??(t?.mode==="orbit"?t.target:n),distance:Ue(M(e,"placement-distance")),semiMajor:Ue(M(e,"placement-semiMajor")),eccentricity:gt(M(e,"placement-eccentricity"))??void 0,period:Ue(M(e,"placement-period")),angle:Ue(M(e,"placement-angle")),inclination:Ue(M(e,"placement-inclination")),phase:Ue(M(e,"placement-phase"))};case"at":return{mode:r,target:i??n,reference:En(i??n)};case"surface":return{mode:r,target:i??n};case"free":{let o=M(e,"placement-free"),s=Ue(o);return{mode:r,distance:s??void 0,descriptor:s?void 0:o??void 0}}default:return null}}function dr(e,t,n){let r=Array.isArray(n)&&n.length===0;if(n==null||r||n===""){delete e[t];return}e[t]=n}function ou(e){return e?Ue(e)??e:null}function Ue(e){if(!e)return;let t=e.match(/^(-?\d+(?:\.\d+)?)(au|km|re|sol|me|d|y|h|deg)?$/);if(t)return{value:Number(t[1]),unit:t[2]??null}}function gt(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function au(e){let t={azimuth:gt(M(e,"viewpoint-camera-azimuth")),elevation:gt(M(e,"viewpoint-camera-elevation")),roll:gt(M(e,"viewpoint-camera-roll")),distance:gt(M(e,"viewpoint-camera-distance"))};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function su(e){return Ge(e).filter(n=>oi.includes(n))}function Ge(e){return e?.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)??[]}function cu(e,t,n){let r=n.objects.find(i=>i.type==="star")?.id??n.objects[0]?.id??t;return{type:e,id:t,properties:{},placement:e==="structure"||e==="phenomenon"?{mode:"at",target:`${r}:L4`,reference:En(`${r}:L4`)}:{mode:"orbit",target:r,distance:{value:1,unit:"au"}},info:{}}}function lu(e,t){let n=N(e);return n.objects=n.objects.filter(r=>r.id!==t.id).concat(t).sort(ta),n}function du(e,t,n){let r=N(e);return r.objects=r.objects.filter(i=>i.id!==t).concat(n).sort(ta),t!==n.id&&uu(r,t,n.id),r}function uu(e,t,n){for(let r of e.objects)if(r.id!==n&&(r.placement?.mode==="orbit"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="surface"&&r.placement.target===t&&(r.placement.target=n),r.placement?.mode==="at")){let i=r.placement.reference;i.kind==="anchor"&&i.objectId===t&&(i.objectId=n),i.kind==="lagrange"&&(i.primary===t&&(i.primary=n),i.secondary===t&&(i.secondary=n)),r.placement.target=ii(i)}for(let r of e.system?.viewpoints??[])r.focusObjectId===t&&(r.focusObjectId=n),r.selectedObjectId===t&&(r.selectedObjectId=n);for(let r of e.system?.annotations??[])r.targetObjectId===t&&(r.targetObjectId=n),r.sourceObjectId===t&&(r.sourceObjectId=n);for(let r of e.events){r.targetObjectId===t&&(r.targetObjectId=n),r.participantObjectIds=r.participantObjectIds.map(i=>i===t?n:i);for(let i of r.positions)if(i.objectId===t&&(i.objectId=n),i.placement?.mode==="orbit"&&i.placement.target===t&&(i.placement.target=n),i.placement?.mode==="surface"&&i.placement.target===t&&(i.placement.target=n),i.placement?.mode==="at"){let o=i.placement.reference;o.kind==="anchor"&&o.objectId===t&&(o.objectId=n),o.kind==="lagrange"&&(o.primary===t&&(o.primary=n),o.secondary===t&&(o.secondary=n)),i.placement.target=ii(o)}r.positions.sort(mr)}}function pu(e,t){let n=Rr(e,t);if(t.kind==="event"&&t.id){for(let r of n.system?.viewpoints??[])r.events=r.events.filter(i=>i!==t.id);return n}if(t.kind!=="object"||!t.id)return n;for(let r of n.objects)if(r.placement?.mode==="orbit"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="surface"&&r.placement.target===t.id&&(r.placement=null),r.placement?.mode==="at"){let i=r.placement.reference;(i.kind==="anchor"&&i.objectId===t.id||i.kind==="lagrange"&&(i.primary===t.id||i.secondary===t.id))&&(r.placement=null)}for(let r of n.system?.viewpoints??[])r.focusObjectId===t.id&&(r.focusObjectId=null),r.selectedObjectId===t.id&&(r.selectedObjectId=null);for(let r of n.system?.annotations??[])r.targetObjectId===t.id&&(r.targetObjectId=null),r.sourceObjectId===t.id&&(r.sourceObjectId=null);for(let r of n.events){r.targetObjectId===t.id&&(r.targetObjectId=null),r.participantObjectIds=r.participantObjectIds.filter(i=>i!==t.id),r.positions=r.positions.filter(i=>i.objectId!==t.id);for(let i of r.positions)if(i.placement?.mode==="orbit"&&i.placement.target===t.id&&(i.placement=null),i.placement?.mode==="surface"&&i.placement.target===t.id&&(i.placement=null),i.placement?.mode==="at"){let o=i.placement.reference;(o.kind==="anchor"&&o.objectId===t.id||o.kind==="lagrange"&&(o.primary===t.id||o.secondary===t.id))&&(i.placement=null)}}return n}function Dn(e,t,n){if(t.kind==="event-pose"&&t.id&&t.key){let i=na(e,t.id,t.key);return i?.placement?{placement:i.placement}:null}let r=ku(e,n);return r?.placement?{placement:r.placement}:null}function fu(e,t,n,r,i){let o=r.orbit;if(!o||r.object.placement?.mode!=="orbit")return e;let s=ve(i,{x:o.cx,y:o.cy},-o.rotationDeg),c=o.kind==="circle"?o.radius??1:o.rx??1,a=o.kind==="circle"?o.radius??1:o.ry??1,l=Math.atan2((s.y-o.cy)/Math.max(a,1),(s.x-o.cx)/Math.max(c,1)),d=Au(l*180/Math.PI),f=N(e),w=Dn(f,t,n);return!w||w.placement.mode!=="orbit"?e:(w.placement.phase={value:Bt(d,2),unit:"deg"},f)}function mu(e,t,n,r,i,o){let s=r.orbit;if(!s||r.object.placement?.mode!=="orbit"||!o)return e;let c=ve(i,{x:s.cx,y:s.cy},-s.rotationDeg),a=Math.max(Math.abs(c.x-s.cx),24),l=Math.max(a-o.radiusOffsetPx,o.innerPx),d=Fu(l,o.innerPx,o.stepPx),f=N(e),w=Dn(f,t,n);if(!w||w.placement.mode!=="orbit")return e;let I=w.placement.semiMajor??w.placement.distance??{value:1,unit:"au"},S=ra(Math.max(d,0),o.preferredUnit??I.unit);return w.placement.semiMajor?w.placement.semiMajor=S:w.placement.distance=S,f}function hu(e,t,n,r,i){let o=vu(r,n,i);if(!o)return e;let s=N(e),c=Dn(s,t,n);return!c||c.placement.mode!=="at"?e:(c.placement.reference=o.reference,c.placement.target=ii(o.reference),s)}function gu(e,t,n,r,i){let o=wu(r,n,i,a=>Vd.has(a.object.type));if(!o)return e;let s=N(e),c=Dn(s,t,n);return!c||c.placement.mode!=="surface"?e:(c.placement.target=o.objectId,s)}function bu(e,t,n){if(n.object.placement?.mode!=="orbit"||!n.orbit||!n.parent)return null;let r=n.object.placement.target,i=t.objects.filter(w=>w.object.placement?.mode==="orbit"&&w.object.placement.target===r&&!w.hidden).length,o=Vu(t.layoutPreset),s=(i>2?54:64)*o*t.scaleModel.orbitDistanceMultiplier,c=n.parent.radius+56*o*t.scaleModel.orbitDistanceMultiplier,a=n.object.placement.semiMajor??n.object.placement.distance??null,l=Tu(a),d=n.orbit.kind==="circle"?n.orbit.radius??1:n.orbit.rx??1,f=Cu(l??0,c,s);return{innerPx:c,stepPx:s,radiusOffsetPx:d-f,preferredUnit:a?.unit??null}}function yu(e,t,n,r,i,o){if(i.object.placement?.mode!=="free")return e;let s=r.width-r.padding-140,c=Math.max(0,s-o.x),a=N(e),l=Dn(a,t,n);if(!l||l.placement.mode!=="free")return e;let d=Lu(l.placement.distance?.unit??null),f=c/Math.max(Fd*r.scaleModel.freePlacementMultiplier,1);return f<.01?(l.placement.distance=void 0,l.placement.descriptor||delete l.placement.descriptor,a):(l.placement.distance=ra(f,d),delete l.placement.descriptor,a)}function wu(e,t,n,r=()=>!0){let i=null,o=Number.POSITIVE_INFINITY;for(let s of e.objects){if(s.hidden||s.objectId===t||!r(s))continue;let c=Math.hypot(n.x-s.x,n.y-s.y);c<o&&(i=s,o=c)}return o<=140?i:null}function vu(e,t,n){let r=null;for(let c of e.objects){if(c.hidden||c.objectId===t)continue;let a=Math.hypot(n.x-c.x,n.y-c.y),l=Math.max(c.visualRadius+16,28);a<=l&&(!r||a<r.distance)&&(r={reference:En(c.objectId),x:c.x,y:c.y,distance:a})}if(r)return{reference:r.reference,x:r.x,y:r.y};let i=[];for(let c of e.objects)c.hidden||c.objectId===t||i.push({reference:En(c.objectId),x:c.x,y:c.y});for(let c of e.orbitVisuals){if(c.hidden||c.objectId===t)continue;let a=e.objects.find(d=>d.objectId===c.parentId&&!d.hidden),l=e.objects.find(d=>d.objectId===c.objectId&&!d.hidden);if(!(!a||!l))for(let d of["L1","L2","L3","L4","L5"]){let f=$u(a,l,d);i.push({reference:En(`${c.objectId}:${d}`),x:f.x,y:f.y})}}let o=null,s=Number.POSITIVE_INFINITY;for(let c of i){let a=Math.hypot(n.x-c.x,n.y-c.y);a<s&&(o=c,s=a)}return s<=140?o:null}function $u(e,t,n){let r=t.x-e.x,i=t.y-e.y,o=Math.hypot(r,i)||1,s=r/o,c=i/o,a=-c,l=s,d=Pu(o*.25,24,68);switch(n){case"L1":return{x:t.x-s*d,y:t.y-c*d};case"L2":return{x:t.x+s*d,y:t.y+c*d};case"L3":return{x:e.x-s*d,y:e.y-c*d};case"L4":return{x:t.x+(s*.5-a*.8660254)*d,y:t.y+(c*.5-l*.8660254)*d};case"L5":return{x:t.x+(s*.5+a*.8660254)*d,y:t.y+(c*.5+l*.8660254)*d}}}function En(e){let t=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(t)return{kind:"lagrange",primary:t[1],secondary:t[2],point:t[3]};let n=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:null,point:n[2]};let r=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return r?{kind:"anchor",objectId:r[1],anchor:r[2]}:{kind:"named",name:e}}function ii(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function ht(e){return zr(e)}function ea(e,t){let n=new Set,r=[];for(let i of[...e,...t]){let o=`${i.diagnostic.code}:${i.diagnostic.message}:${Ke(i.path)}`;n.has(o)||(n.add(o),r.push(pr(i)))}return r}function xu(e){let t=new Map;for(let n of e){let r=Ke(n.path)??(n.diagnostic.objectId?Ke({kind:"object",id:n.diagnostic.objectId}):null);if(!r)continue;let i=t.get(r)??{errors:0,warnings:0};n.diagnostic.severity==="error"?i.errors+=1:n.diagnostic.severity==="warning"&&(i.warnings+=1),t.set(r,i)}return t}function Ho(e){return e.diagnostic.line!==void 0&&e.diagnostic.column!==void 0?`Line ${e.diagnostic.line}:${e.diagnostic.column}`:e.diagnostic.line!==void 0?`Line ${e.diagnostic.line}`:null}function Iu(e,t){if(!t)return[];switch(e.kind){case"system":return t==="id"?["system-id"]:t==="title"?["system-title"]:[];case"defaults":switch(t){case"view":return["defaults-view"];case"scale":return["defaults-scale"];case"units":return["defaults-units"];case"preset":return["defaults-preset"];case"theme":return["defaults-theme"];default:return[]}case"metadata":return t==="key"?["metadata-key"]:["metadata-value"];case"group":switch(t){case"id":return["group-id"];case"label":return["group-label"];case"summary":return["group-summary"];case"color":return["group-color"];case"tags":return["group-tags"];case"hidden":return["group-hidden"];default:return[]}case"viewpoint":switch(t){case"id":return["viewpoint-id"];case"label":return["viewpoint-label"];case"summary":return["viewpoint-summary"];case"focusObjectId":return["viewpoint-focus"];case"selectedObjectId":return["viewpoint-select"];case"projection":return["viewpoint-projection"];case"preset":return["viewpoint-preset"];case"zoom":return["viewpoint-zoom"];case"rotationDeg":return["viewpoint-rotation"];case"camera":return["viewpoint-camera-azimuth","viewpoint-camera-elevation","viewpoint-camera-roll","viewpoint-camera-distance"];case"camera.azimuth":return["viewpoint-camera-azimuth"];case"camera.elevation":return["viewpoint-camera-elevation"];case"camera.roll":return["viewpoint-camera-roll"];case"camera.distance":return["viewpoint-camera-distance"];case"events":return["viewpoint-events"];default:return[]}case"event":switch(t){case"id":return["event-id"];case"kind":return["event-kind"];case"label":return["event-label"];case"summary":return["event-summary"];case"targetObjectId":case"target":return["event-target"];case"participantObjectIds":case"participants":return["event-participants"];case"timing":return["event-timing"];case"visibility":return["event-visibility"];case"epoch":return["event-epoch"];case"referencePlane":return["event-referencePlane"];case"tags":return["event-tags"];case"color":return["event-color"];case"hidden":return["event-hidden"];default:return[]}case"event-pose":return t==="objectId"?["pose-object-id"]:t==="placement"?["placement-mode"]:t==="reference"||t==="target"?["placement-target"]:t==="descriptor"?["placement-free"]:ri.has(t)?[`placement-${t}`]:t==="inner"||t==="outer"?[`prop-${t}`]:t==="epoch"?["pose-epoch"]:t==="referencePlane"?["pose-referencePlane"]:[];case"annotation":switch(t){case"id":return["annotation-id"];case"label":return["annotation-label"];case"targetObjectId":return["annotation-target"];case"sourceObjectId":return["annotation-source"];case"body":return["annotation-body"];case"tags":return["annotation-tags"];default:return[]}case"relation":switch(t){case"id":return["relation-id"];case"from":return["relation-from"];case"to":return["relation-to"];case"kind":return["relation-kind"];case"label":return["relation-label"];case"summary":return["relation-summary"];case"tags":return["relation-tags"];case"color":return["relation-color"];case"hidden":return["relation-hidden"];default:return[]}case"object":return t==="id"?["object-id"]:t==="type"?["object-type"]:t==="placement"?["placement-mode"]:t==="description"?["info-description"]:t==="reference"?["placement-target"]:t==="descriptor"?["placement-free"]:t==="target"?["placement-target"]:ri.has(t)?[`placement-${t}`]:[`prop-${t}`]}}function qo(e,t){return In(e,{mode:"interactive",preset:t.system?.defaults.preset??"atlas-card",projection:t.system?.defaults.view??"topdown"})}function ur(e){switch(e.kind){case"system":return"System";case"defaults":return"Defaults";case"metadata":return`Metadata: ${e.key??""}`;case"group":return`Group: ${e.id??""}`;case"event":return`Event: ${e.id??""}`;case"event-pose":return`Event Pose: ${e.id??""} / ${e.key??""}`;case"object":return`Object: ${e.id??""}`;case"viewpoint":return`Viewpoint: ${e.id??""}`;case"annotation":return`Annotation: ${e.id??""}`;case"relation":return`Relation: ${e.id??""}`}}function Ke(e){return e?`${e.kind}:${e.id??""}:${e.key??""}`:null}function ni(e){return e&&(e.kind==="event"||e.kind==="event-pose")?e.id??null:null}function ta(e,t){return e.id.localeCompare(t.id)}function Go(e,t){return e.id.localeCompare(t.id)}function mr(e,t){return e.objectId.localeCompare(t.objectId)}function ju(e,t){return e.events.find(n=>n.id===t)??null}function na(e,t,n){return ju(e,t)?.positions.find(r=>r.objectId===n)??null}function ku(e,t){return e.objects.find(n=>n.id===t)??null}function Su(e,t){let n=N(e),r=n.events.find(o=>o.id===t);if(!r)return e;let i=n.objects.find(o=>!r.positions.some(s=>s.objectId===o.id))??n.objects[0];return i?(r.targetObjectId!==i.id&&!r.participantObjectIds.includes(i.id)&&(r.participantObjectIds.push(i.id),r.participantObjectIds.sort((o,s)=>o.localeCompare(s))),r.positions.push(Ou(i)),r.positions.sort(mr),n):e}function Ou(e){return{objectId:e.id,placement:e.placement?structuredClone(e.placement):null,inner:Xo(e.properties.inner),outer:Xo(e.properties.outer)}}function Eu(e,t,n,r){let i=new Set(r);for(let o of e.system?.viewpoints??[]){let s=new Set(o.events);s.delete(t),s.delete(n),i.has(o.id)&&s.add(n),o.events=[...s].sort((c,a)=>c.localeCompare(a))}}function Sn(e,t){let n=e.trim()||"item",r=1,i=n;for(;t.includes(i);)r+=1,i=`${n}-${r}`;return i}function On(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function pr(e){return{diagnostic:{...e.diagnostic},path:e.path?{...e.path}:null}}function pt(e){return typeof e=="string"?e:""}function Mu(e){return Array.isArray(e)?e.join(" "):""}function ft(e){return e&&typeof e=="object"&&"value"in e?me(e):""}function Xo(e){return e&&typeof e=="object"&&"value"in e?e:void 0}function Du(e){return typeof e=="number"?String(e):""}function me(e){return`${e.value}${e.unit??""}`}function Bt(e,t){let n=10**t;return Math.round(e*n)/n}function Pu(e,t,n){return Math.min(Math.max(e,t),n)}function Au(e){let t=e%360;return t<0&&(t+=360),t}function Lu(e){switch(e){case"au":case"km":case"re":case"sol":case null:return e;default:return null}}function Tu(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Nt;case"re":return e.value*Ko/Nt;case"sol":return e.value*Zo/Nt;default:return e.value}}function ra(e,t){switch(t){case"km":return{value:Bt(e*Nt,0),unit:t};case"re":return{value:Bt(e*Nt/Ko,3),unit:t};case"sol":return{value:Bt(e*Nt/Zo,4),unit:t};case"au":return{value:Bt(e,3),unit:t};default:return{value:Bt(e,2),unit:null}}}function Cu(e,t,n){return t+n*Ru(Math.max(e,0)+1)}function Fu(e,t,n){return e<=t?0:Math.pow(2,(e-t)/Math.max(n,1e-4))-1}function Vu(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Ru(e){return Math.log(e)/Math.log(2)}function L(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function ia(e){return L(e)}function zu(e){if(typeof window>"u"||typeof document>"u")throw new Error("createWorldOrbitEditor can only run in a browser environment.");if(!(e instanceof HTMLElement))throw new Error("WorldOrbit editor requires an HTMLElement container.")}function je(e,t){let n=e.querySelector(t);if(!n)throw new Error(`WorldOrbit editor failed to initialize selector "${t}".`);return n}function _u(){if(document.getElementById(Yo))return;let e=document.createElement("style");e.id=Yo,e.textContent=`
451
- .wo-editor {
452
- --wo-editor-sidebar-width: 280px;
453
- --wo-editor-inspector-width: 360px;
454
- --wo-editor-source-height: 280px;
455
- }
456
- .wo-editor-shell { display: grid; gap: 16px; min-width: 0; }
457
- .wo-editor-toolbar { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; min-width: 0; }
458
- .wo-editor-toolbar-group { display: flex; gap: 10px; flex-wrap: wrap; min-width: 0; }
459
- .wo-editor-toolbar button, .wo-editor-toolbar select {
460
- border: 1px solid rgba(240, 180, 100, 0.2);
461
- border-radius: 999px;
462
- background: rgba(240, 180, 100, 0.08);
463
- color: #edf6ff;
464
- font: 600 13px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
465
- padding: 10px 14px;
466
- }
467
- .wo-editor button:focus-visible,
468
- .wo-editor select:focus-visible,
469
- .wo-editor input:focus-visible,
470
- .wo-editor textarea:focus-visible {
471
- outline: 2px solid rgba(255, 214, 138, 0.95);
472
- outline-offset: 2px;
473
- }
474
- .wo-editor-toolbar button:disabled { opacity: 0.45; cursor: not-allowed; }
475
- .wo-editor-status {
476
- display: flex;
477
- flex-wrap: wrap;
478
- gap: 10px;
479
- min-width: 0;
480
- }
481
- .wo-editor-status-pill {
482
- border: 1px solid rgba(255,255,255,0.08);
483
- border-radius: 999px;
484
- background: rgba(255,255,255,0.04);
485
- color: #edf6ff;
486
- font: 600 12px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
487
- padding: 8px 12px;
488
- }
489
- .wo-editor-status-pill.is-clean { border-color: rgba(120, 255, 195, 0.22); color: #c7ffe5; }
490
- .wo-editor-status-pill.is-dirty { border-color: rgba(240, 180, 100, 0.28); color: #ffd58a; }
491
- .wo-editor-status-pill.is-warning { border-color: rgba(240, 180, 100, 0.28); color: #ffd58a; }
492
- .wo-editor-status-pill.is-error { border-color: rgba(255, 120, 120, 0.3); color: #ffb2b2; }
493
- .wo-editor-main {
494
- display: grid;
495
- grid-template-columns:
496
- minmax(220px, var(--wo-editor-sidebar-width))
497
- minmax(0, 1fr)
498
- minmax(280px, var(--wo-editor-inspector-width));
499
- gap: 16px;
500
- min-width: 0;
501
- align-items: start;
502
- }
503
- .wo-editor-sidebar, .wo-editor-stage-panel, .wo-editor-preview { display: grid; gap: 16px; min-width: 0; }
504
- .wo-editor-panel {
505
- border-radius: 24px;
506
- border: 1px solid rgba(255,255,255,0.08);
507
- background: rgba(7, 16, 25, 0.72);
508
- padding: 18px;
509
- min-width: 0;
510
- }
511
- .wo-editor-panel h2 {
512
- margin: 0 0 14px;
513
- color: #edf6ff;
514
- font: 700 14px/1.2 "Segoe UI Variable Display", "Segoe UI", sans-serif;
515
- text-transform: uppercase;
516
- letter-spacing: 0.08em;
517
- }
518
- .wo-editor-panel h3 {
519
- margin: 0 0 12px;
520
- color: rgba(237, 246, 255, 0.82);
521
- font: 700 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
522
- text-transform: uppercase;
523
- letter-spacing: 0.08em;
524
- }
525
- .wo-editor-panel-section,
526
- .wo-editor-inspector-section {
527
- min-width: 0;
528
- }
529
- .wo-editor-panel-section > summary,
530
- .wo-editor-inspector-section > summary {
531
- display: flex;
532
- align-items: center;
533
- justify-content: space-between;
534
- gap: 10px;
535
- cursor: pointer;
536
- list-style: none;
537
- color: #edf6ff;
538
- font: 700 14px/1.2 "Segoe UI Variable Display", "Segoe UI", sans-serif;
539
- text-transform: uppercase;
540
- letter-spacing: 0.08em;
541
- }
542
- .wo-editor-inspector-section > summary {
543
- font: 700 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
544
- color: rgba(237, 246, 255, 0.9);
545
- }
546
- .wo-editor-panel-section > summary::-webkit-details-marker,
547
- .wo-editor-inspector-section > summary::-webkit-details-marker,
548
- .wo-editor-field-help > summary::-webkit-details-marker {
549
- display: none;
550
- }
551
- .wo-editor-panel-section > summary::after,
552
- .wo-editor-inspector-section > summary::after {
553
- content: "\u25BE";
554
- color: rgba(240, 180, 100, 0.86);
555
- font-size: 12px;
556
- transition: transform 0.18s ease;
557
- }
558
- .wo-editor-panel-section:not([open]) > summary::after,
559
- .wo-editor-inspector-section:not([open]) > summary::after {
560
- transform: rotate(-90deg);
561
- }
562
- .wo-editor-panel-section-body {
563
- display: grid;
564
- gap: 16px;
565
- margin-top: 14px;
566
- min-width: 0;
567
- }
568
- .wo-editor-inspector-section-body {
569
- display: grid;
570
- gap: 12px;
571
- margin-top: 12px;
572
- min-width: 0;
573
- }
574
- .wo-editor[data-wo-show-inspector="false"] [data-editor-pane="inspector"] { display: none; }
575
- .wo-editor[data-wo-show-text-pane="false"] [data-editor-pane="text"] { display: none; }
576
- .wo-editor[data-wo-show-preview="false"] [data-editor-pane="preview"] { display: none; }
577
- .wo-editor-stage-shell {
578
- position: relative;
579
- min-width: 0;
580
- border-radius: 26px;
581
- overflow: hidden;
582
- border: 1px solid rgba(255,255,255,0.08);
583
- background: rgba(8, 17, 28, 0.9);
584
- }
585
- .wo-editor-stage { min-height: 620px; min-width: 0; }
586
- .wo-editor-overlay { position: absolute; inset: 0; pointer-events: none; }
587
- .wo-editor-overlay > * { pointer-events: auto; }
588
- .wo-editor-handle {
589
- position: absolute;
590
- transform: translate(-50%, -50%);
591
- border: 0;
592
- border-radius: 999px;
593
- background: rgba(255, 214, 138, 0.92);
594
- color: #071019;
595
- cursor: grab;
596
- font: 700 11px/1 "Segoe UI Variable", "Segoe UI", sans-serif;
597
- padding: 8px 10px;
598
- box-shadow: 0 10px 24px rgba(0,0,0,0.24);
599
- }
600
- .wo-editor-hint {
601
- position: absolute;
602
- transform: translate(-50%, -50%);
603
- padding: 4px 8px;
604
- border-radius: 999px;
605
- background: rgba(18, 39, 58, 0.84);
606
- color: #edf6ff;
607
- font: 600 11px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
608
- white-space: nowrap;
609
- box-shadow: 0 6px 18px rgba(0,0,0,0.22);
610
- }
611
- .wo-editor-hint.is-subtle { background: rgba(18, 39, 58, 0.64); color: rgba(237, 246, 255, 0.78); }
612
- .wo-editor-hint-note { left: 16px; top: 16px; transform: none; }
613
- .wo-editor-overlay-diagnostics {
614
- position: absolute;
615
- right: 16px;
616
- top: 16px;
617
- display: grid;
618
- gap: 8px;
619
- max-width: min(320px, calc(100% - 32px));
620
- }
621
- .wo-editor-overlay-diagnostic {
622
- border-radius: 14px;
623
- padding: 10px 12px;
624
- background: rgba(10, 20, 32, 0.92);
625
- box-shadow: 0 12px 30px rgba(0,0,0,0.28);
626
- }
627
- .wo-editor-overlay-diagnostic strong {
628
- display: block;
629
- margin-bottom: 4px;
630
- font: 700 11px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
631
- letter-spacing: 0.08em;
632
- text-transform: uppercase;
633
- }
634
- .wo-editor-overlay-diagnostic p {
635
- margin: 0;
636
- color: #edf6ff;
637
- font: 500 12px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
638
- }
639
- .wo-editor-overlay-diagnostic-error { border: 1px solid rgba(255, 120, 120, 0.28); }
640
- .wo-editor-overlay-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.24); }
641
- .wo-editor-outline { display: grid; gap: 14px; }
642
- .wo-editor-outline-section { display: grid; gap: 8px; }
643
- .wo-editor-outline-group { display: grid; gap: 6px; }
644
- .wo-editor-outline-children {
645
- display: grid;
646
- gap: 6px;
647
- padding-left: 16px;
648
- }
649
- .wo-editor-outline-section h3 {
650
- margin: 0;
651
- color: rgba(237,246,255,0.68);
652
- font: 600 11px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
653
- text-transform: uppercase;
654
- letter-spacing: 0.08em;
655
- }
656
- .wo-editor-outline-item {
657
- border: 1px solid transparent;
658
- border-radius: 16px;
659
- background: rgba(255,255,255,0.04);
660
- color: #edf6ff;
661
- cursor: pointer;
662
- font: 500 13px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
663
- padding: 10px 12px;
664
- text-align: left;
665
- display: flex;
666
- align-items: center;
667
- justify-content: space-between;
668
- gap: 10px;
669
- }
670
- .wo-editor-outline-item.is-active {
671
- border-color: rgba(255, 214, 138, 0.34);
672
- background: rgba(255, 214, 138, 0.12);
673
- color: #ffdda9;
674
- }
675
- .wo-editor-outline-badge {
676
- min-width: 22px;
677
- border-radius: 999px;
678
- background: rgba(240, 180, 100, 0.16);
679
- color: #ffd58a;
680
- font: 700 11px/1 "Segoe UI Variable", "Segoe UI", sans-serif;
681
- padding: 5px 7px;
682
- text-align: center;
683
- }
684
- .wo-editor-outline-badge.is-error {
685
- background: rgba(255, 120, 120, 0.18);
686
- color: #ffb2b2;
687
- }
688
- .wo-editor-inline-list { display: grid; gap: 8px; }
689
- .wo-editor-inline-actions {
690
- display: flex;
691
- flex-wrap: wrap;
692
- gap: 10px;
693
- margin-top: 12px;
694
- }
695
- .wo-editor-inline-actions button {
696
- border: 1px solid rgba(255,255,255,0.14);
697
- border-radius: 999px;
698
- background: rgba(255,255,255,0.06);
699
- color: #edf6ff;
700
- cursor: pointer;
701
- font: 600 12px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
702
- padding: 8px 12px;
703
- }
704
- .wo-editor-inline-note {
705
- margin: 0 0 12px;
706
- color: rgba(237,246,255,0.72);
707
- font: 500 12px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
708
- }
709
- .wo-editor-diagnostics { display: grid; gap: 10px; }
710
- .wo-editor-diagnostic {
711
- display: grid;
712
- gap: 4px;
713
- border-radius: 16px;
714
- padding: 12px;
715
- background: rgba(255,255,255,0.04);
716
- color: #edf6ff;
717
- font: 500 12px/1.45 "Segoe UI Variable", "Segoe UI", sans-serif;
718
- }
719
- .wo-editor-diagnostic strong { font-size: 11px; letter-spacing: 0.08em; }
720
- .wo-editor-diagnostic p { margin: 0; color: rgba(237,246,255,0.82); }
721
- .wo-editor-diagnostic-warning { border: 1px solid rgba(240, 180, 100, 0.22); }
722
- .wo-editor-diagnostic-error { border: 1px solid rgba(255, 120, 120, 0.24); }
723
- .wo-editor-inspector-summary {
724
- display: grid;
725
- gap: 10px;
726
- margin-bottom: 14px;
727
- }
728
- .wo-editor-form { display: grid; gap: 12px; min-width: 0; }
729
- .wo-editor-inspector-section {
730
- border: 1px solid rgba(255,255,255,0.08);
731
- border-radius: 18px;
732
- padding: 14px;
733
- background: rgba(255,255,255,0.02);
734
- }
735
- .wo-editor-field { display: grid; gap: 6px; }
736
- .wo-editor-field-label,
737
- .wo-editor-fieldset legend {
738
- display: flex;
739
- align-items: center;
740
- justify-content: space-between;
741
- gap: 10px;
742
- }
743
- .wo-editor-field-label,
744
- .wo-editor-checkbox .wo-editor-field-label,
745
- .wo-editor-fieldset legend {
746
- color: rgba(237,246,255,0.72);
747
- font: 600 11px/1.2 "Segoe UI Variable", "Segoe UI", sans-serif;
748
- text-transform: uppercase;
749
- letter-spacing: 0.08em;
750
- }
751
- .wo-editor-field input, .wo-editor-field select, .wo-editor-field textarea, .wo-editor-source {
752
- width: 100%;
753
- min-width: 0;
754
- border: 1px solid rgba(255,255,255,0.08);
755
- border-radius: 14px;
756
- background: rgba(12, 26, 39, 0.84);
757
- color: #edf6ff;
758
- font: 500 13px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
759
- padding: 10px 12px;
760
- box-sizing: border-box;
761
- }
762
- .wo-editor-field.has-error input,
763
- .wo-editor-field.has-error select,
764
- .wo-editor-field.has-error textarea,
765
- .wo-editor-checkbox.has-error {
766
- border-color: rgba(255, 120, 120, 0.44);
767
- }
768
- .wo-editor-field.has-warning input,
769
- .wo-editor-field.has-warning select,
770
- .wo-editor-field.has-warning textarea,
771
- .wo-editor-checkbox.has-warning {
772
- border-color: rgba(240, 180, 100, 0.42);
773
- }
774
- .wo-editor-field textarea, .wo-editor-source { min-height: 110px; resize: vertical; }
775
- .wo-editor-source {
776
- min-height: var(--wo-editor-source-height);
777
- font-family: "Cascadia Code", "Consolas", monospace;
778
- white-space: pre;
779
- overflow: auto;
780
- }
781
- .wo-editor-field-note {
782
- color: rgba(237,246,255,0.72);
783
- font: 500 12px/1.45 "Segoe UI Variable", "Segoe UI", sans-serif;
784
- }
785
- .wo-editor-field-note.is-error { color: #ffb2b2; }
786
- .wo-editor-field-note.is-warning { color: #ffd58a; }
787
- .wo-editor-fieldset {
788
- display: grid;
789
- gap: 10px;
790
- border: 1px solid rgba(255,255,255,0.08);
791
- border-radius: 18px;
792
- padding: 14px;
793
- min-width: 0;
794
- }
795
- .wo-editor-checkbox {
796
- display: flex;
797
- gap: 10px;
798
- align-items: flex-start;
799
- color: #edf6ff;
800
- font: 500 13px/1.4 "Segoe UI Variable", "Segoe UI", sans-serif;
801
- }
802
- .wo-editor-checkbox input {
803
- margin-top: 2px;
804
- }
805
- .wo-editor-field-help {
806
- position: relative;
807
- flex: 0 0 auto;
808
- }
809
- .wo-editor-field-help > summary {
810
- display: inline-flex;
811
- align-items: center;
812
- justify-content: center;
813
- width: 20px;
814
- height: 20px;
815
- border-radius: 999px;
816
- border: 1px solid rgba(240, 180, 100, 0.28);
817
- background: rgba(240, 180, 100, 0.12);
818
- color: #ffdda9;
819
- cursor: pointer;
820
- font: 700 11px/1 "Segoe UI Variable", "Segoe UI", sans-serif;
821
- list-style: none;
822
- }
823
- .wo-editor-field-help-card {
824
- display: grid;
825
- gap: 8px;
826
- margin-top: 8px;
827
- padding: 10px 12px;
828
- border-radius: 14px;
829
- border: 1px solid rgba(240, 180, 100, 0.2);
830
- background: rgba(12, 26, 39, 0.92);
831
- color: rgba(237, 246, 255, 0.86);
832
- text-transform: none;
833
- letter-spacing: normal;
834
- font: 500 12px/1.45 "Segoe UI Variable", "Segoe UI", sans-serif;
835
- }
836
- .wo-editor-field-help-card p {
837
- margin: 0;
838
- }
839
- .wo-editor-field-help-chips {
840
- display: flex;
841
- flex-wrap: wrap;
842
- gap: 6px;
843
- }
844
- .wo-editor-field-help-chips span {
845
- border-radius: 999px;
846
- padding: 4px 8px;
847
- background: rgba(255,255,255,0.06);
848
- color: #edf6ff;
849
- font: 600 11px/1.3 "Segoe UI Variable", "Segoe UI", sans-serif;
850
- text-transform: none;
851
- letter-spacing: normal;
852
- }
853
- .wo-editor-preview { grid-template-columns: repeat(2, minmax(0, 1fr)); }
854
- .wo-editor-preview-card {
855
- border-radius: 18px;
856
- border: 1px solid rgba(255,255,255,0.08);
857
- background: rgba(255,255,255,0.03);
858
- padding: 14px;
859
- min-width: 0;
860
- }
861
- .wo-editor-preview-visual {
862
- min-height: 240px;
863
- overflow: auto;
864
- }
865
- .wo-editor-preview-markup {
866
- margin: 0;
867
- min-height: 240px;
868
- white-space: pre-wrap;
869
- overflow-wrap: anywhere;
870
- color: #edf6ff;
871
- font: 12px/1.5 "Cascadia Code", "Consolas", monospace;
872
- }
873
- .wo-editor-source-diagnostics {
874
- display: grid;
875
- gap: 10px;
876
- margin-top: 14px;
877
- }
878
- .wo-editor-empty {
879
- margin: 0;
880
- color: rgba(237,246,255,0.68);
881
- font: 500 12px/1.5 "Segoe UI Variable", "Segoe UI", sans-serif;
882
- }
883
- .wo-editor-live-region {
884
- position: absolute;
885
- width: 1px;
886
- height: 1px;
887
- padding: 0;
888
- margin: -1px;
889
- overflow: hidden;
890
- clip: rect(0, 0, 0, 0);
891
- white-space: nowrap;
892
- border: 0;
893
- }
894
- @media (max-width: 1280px) {
895
- .wo-editor-main { grid-template-columns: minmax(220px, 260px) minmax(0, 1fr); }
896
- .wo-editor-inspector { grid-column: 1 / -1; }
897
- .wo-editor-preview { grid-template-columns: 1fr; }
898
- }
899
- @media (max-width: 960px) {
900
- .wo-editor-main { grid-template-columns: 1fr; }
901
- .wo-editor-stage { min-height: 440px; }
902
- .wo-editor-status { flex-direction: column; }
903
- }
904
- `,document.head.append(e)}return ya(Bu);})();
1
+ export * from "./editor/dist/index.js";