spacemap 0.1.5 → 0.1.7

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.
package/index.d.ts CHANGED
@@ -369,6 +369,10 @@ export declare function dateToJD(date: Date): number;
369
369
  * renderer through the same effects a host's own store drives. */
370
370
  export declare function defaultSceneSettings(): SceneSettings;
371
371
 
372
+ /** Kilometres between two places at `date`. Null and rejection are those of
373
+ * {@link offsetKm}. */
374
+ export declare function distanceKm(from: Anchor, to: Anchor, date: Date): Promise<number | null>;
375
+
372
376
  /**
373
377
  * A Keplerian orbit, propagated from its epoch by the mean motion the elements
374
378
  * carry. Defined at every date, so an object on one is always drawn.
@@ -1032,7 +1036,7 @@ export declare interface LonLat {
1032
1036
 
1033
1037
  /** Every layer, in the order a switcher should offer them: the objects first,
1034
1038
  * then the chrome drawn around them. */
1035
- export declare const MAP_LAYERS: readonly ["planets", "dwarfPlanets", "moons", "asteroids", "comets", "spacecraft", "satellites", "debris", "orbits", "labels", "nomenclature", "stars"];
1039
+ export declare const MAP_LAYERS: readonly ["planets", "dwarfPlanets", "moons", "asteroids", "comets", "spacecraft", "satellites", "debris", "orbits", "labels", "halos", "nomenclature", "stars"];
1036
1040
 
1037
1041
  export declare interface MapEvents {
1038
1042
  focuschange: (e: FocusChange) => void;
@@ -1198,6 +1202,13 @@ export declare type NoticeTopic = Notice['topic'];
1198
1202
  * ecliptic north pole. */
1199
1203
  export declare type OffsetKm = readonly [number, number, number];
1200
1204
 
1205
+ /**
1206
+ * From one place to another at `date`, in kilometres on ecliptic J2000 axes.
1207
+ * Null when either end is nowhere at that date. Rejects when the data does
1208
+ * not load.
1209
+ */
1210
+ export declare function offsetKm(from: Anchor, to: Anchor, date: Date): Promise<OffsetKm | null>;
1211
+
1201
1212
  export declare interface OrbitalElements {
1202
1213
  a: number;
1203
1214
  e: number;
@@ -2098,6 +2109,13 @@ export declare interface SpaceMapOptions {
2098
2109
  layers?: Partial<Record<MapLayerId, boolean>>;
2099
2110
  }
2100
2111
 
2112
+ /**
2113
+ * The place on `id` where the Sun is overhead at `date`, in the frame of a
2114
+ * surface anchor. Null for the Sun, and for a body that is nowhere at that
2115
+ * date. Rejects when the data does not load.
2116
+ */
2117
+ export declare function subsolarPoint(id: string, date: Date): Promise<LonLat | null>;
2118
+
2101
2119
  /** A place on (or above) the body's surface, turning with it. */
2102
2120
  export declare interface SurfaceAnchor {
2103
2121
  body: string;
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*! spacemap SDK — https://spacemap.co — Mozilla Public License 2.0. Bundles MIT and ISC libraries: THIRD_PARTY_NOTICES.txt in the spacemap npm package. */
2
- import { ACESFilmicToneMapping, AdditiveBlending, AmbientLight, ArrowHelper, BackSide, Box3, BufferAttribute, BufferGeometry, CanvasTexture, Color, CubeTexture, CustomBlending, DataTexture, DepthTexture, DirectionalLight, DoubleSide, Euler, Float32BufferAttribute, FloatType, FrontSide, Group, HalfFloatType, InstancedBufferAttribute, InstancedMesh, Line, LineBasicMaterial, LineLoop, LinearFilter, LinearMipmapLinearFilter, LinearSRGBColorSpace, MathUtils, Matrix4, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshStandardMaterial, NoBlending, NoColorSpace, NormalBlending, OneFactor, OneMinusSrcAlphaFactor, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, PlaneGeometry, PointLight, Points, PointsMaterial, Quaternion, RGBAFormat, RawShaderMaterial, Raycaster, RedFormat, RingGeometry, SRGBColorSpace, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapeUtils, SphereGeometry, Sprite, SpriteMaterial, TOUCH, Texture, TextureLoader, Uint16BufferAttribute, UnsignedByteType, Vector2, Vector3, Vector4, WebGLRenderTarget, WebGLRenderer } from "three";
2
+ import { ACESFilmicToneMapping, AdditiveBlending, AmbientLight, ArrowHelper, BackSide, Box3, BufferAttribute, BufferGeometry, CanvasTexture, Color, CubeTexture, CustomBlending, DataTexture, DepthTexture, DirectionalLight, DoubleSide, Euler, Float32BufferAttribute, FloatType, FrontSide, Group, HalfFloatType, InstancedBufferAttribute, InstancedMesh, Line, LineBasicMaterial, LineLoop, LinearFilter, LinearMipmapLinearFilter, LinearSRGBColorSpace, MathUtils, Matrix4, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshStandardMaterial, NoBlending, NoColorSpace, NormalBlending, OneFactor, OneMinusSrcAlphaFactor, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, PlaneGeometry, PointLight, Points, PointsMaterial, Quaternion, RGBAFormat, RawShaderMaterial, Raycaster, RedFormat, RingGeometry, SRGBColorSpace, Scene, ShaderChunk, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapeUtils, SphereGeometry, Sprite, SpriteMaterial, TOUCH, Texture, TextureLoader, Uint16BufferAttribute, UnsignedByteType, Vector2, Vector3, Vector4, WebGLRenderTarget, WebGLRenderer } from "three";
3
3
  import { OrbitControls } from "three/addons/controls/OrbitControls.js";
4
4
  import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js";
5
5
  import { RenderPass } from "three/addons/postprocessing/RenderPass.js";
@@ -6287,6 +6287,12 @@ var BodyIndex = class {
6287
6287
  findAsteroidZone(id) {
6288
6288
  for (const [zone, byId] of this.asteroidBodiesByZone) if (byId.has(id)) return zone;
6289
6289
  }
6290
+ elementRow(body) {
6291
+ const d = body.data;
6292
+ if (d.orbitalSource !== OrbitalSource.SPICE) return d;
6293
+ const zone = this.findAsteroidZone(d.id);
6294
+ return zone === void 0 ? void 0 : this.asteroidBodiesByZone.get(zone)?.get(d.id)?.data;
6295
+ }
6290
6296
  maxMoonA(parentId) {
6291
6297
  return this.moonMaxAByParent.get(parentId);
6292
6298
  }
@@ -6608,6 +6614,7 @@ var MAP_LAYERS = [
6608
6614
  "debris",
6609
6615
  "orbits",
6610
6616
  "labels",
6617
+ "halos",
6611
6618
  "nomenclature",
6612
6619
  "stars"
6613
6620
  ];
@@ -12101,6 +12108,26 @@ function isReversedDepth() {
12101
12108
  function ndcZVisible(z) {
12102
12109
  return reversed ? z >= 0 && z <= 1 : z >= -1 && z <= 1;
12103
12110
  }
12111
+ var LOG_DEPTH_FLOOR = -44;
12112
+ function installLogDepthChunks() {
12113
+ ShaderChunk.logdepthbuf_vertex = `
12114
+ #ifdef USE_LOGARITHMIC_DEPTH_BUFFER
12115
+ vFragDepth = gl_Position.w;
12116
+ vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );
12117
+ #endif
12118
+ `;
12119
+ ShaderChunk.logdepthbuf_fragment = `
12120
+ #if defined( USE_LOGARITHMIC_DEPTH_BUFFER )
12121
+ gl_FragDepth = vIsPerspective == 0.0
12122
+ ? gl_FragCoord.z
12123
+ : max( log2( vFragDepth ) - ${LOG_DEPTH_FLOOR.toFixed(1)}, 0.0 ) / ( 2.0 / logDepthBufFC - ${LOG_DEPTH_FLOOR.toFixed(1)} );
12124
+ #endif
12125
+ `;
12126
+ }
12127
+ function logDepthToEyeGlsl(depth, far) {
12128
+ const floor = LOG_DEPTH_FLOOR.toFixed(1);
12129
+ return `exp2(${depth} * (log2(${far} + 1.0) - ${floor}) + ${floor})`;
12130
+ }
12104
12131
 
12105
12132
  //#endregion
12106
12133
  //#region src/lib/scene/label/throttled-renderer.ts
@@ -12419,6 +12446,7 @@ var WebGLUnavailableError = class extends Error {
12419
12446
  function bootThree(canvas, labelContainer, ctx) {
12420
12447
  let renderer;
12421
12448
  const reversedDepth = probeClipControl();
12449
+ if (!reversedDepth) installLogDepthChunks();
12422
12450
  try {
12423
12451
  renderer = new WebGLRenderer(reversedDepth ? {
12424
12452
  canvas,
@@ -14255,11 +14283,9 @@ function refreshVisibleBodyLabelRects(bodyObjects, screenWidth, screenHeight, ca
14255
14283
  //#endregion
14256
14284
  //#region src/lib/scene/label/factory.ts
14257
14285
  var SPACECRAFT_ICON_D = "M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z";
14258
- var LANDED_PROBE_ICON_D = "M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z";
14259
14286
  var SPACECRAFT_GLYPH_D = {
14260
14287
  flying: SPACECRAFT_ICON_D,
14261
- landed: LANDED_PROBE_ICON_D,
14262
- crashed: LANDED_PROBE_ICON_D + "M15 9l-6 6M9 9l6 6"
14288
+ landed: "M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z"
14263
14289
  };
14264
14290
  function setSpacecraftGlyph(halo, glyph) {
14265
14291
  if (!halo) return;
@@ -15294,7 +15320,7 @@ var FRAGMENT_SHADER = `
15294
15320
  if (hitGeom && fwd > 1e-4) {
15295
15321
  float terrainW = uReversedDepth > 0.5
15296
15322
  ? uCameraNear * uCameraFar / (d * (uCameraFar - uCameraNear) + uCameraNear)
15297
- : exp2(d * log2(uCameraFar + 1.0)) - 1.0;
15323
+ : ${logDepthToEyeGlsl("d", "uCameraFar")};
15298
15324
  float tTerrain = terrainW * dLen / (uPlanetRadiusScene * fwd);
15299
15325
  if (tTerrain < tEnd) {
15300
15326
  tEnd = tTerrain;
@@ -16495,6 +16521,10 @@ function attachRingBundles(bodyId, systemId, rings, radii, bo, scene, maxTexture
16495
16521
  //#endregion
16496
16522
  //#region src/lib/scene/objects/surface/clouds.ts
16497
16523
  var CLOUD_RADIUS_OFFSET = 1.002;
16524
+ function cloudRadiusRatio(params, surfaceKm) {
16525
+ const deckKm = params?.referenceAltitudeKm ?? 0;
16526
+ return deckKm > 0 ? 1 + deckKm / surfaceKm : CLOUD_RADIUS_OFFSET;
16527
+ }
16498
16528
  var CLOUD_SWAP_MIN_INTERVAL_MS = 1e3;
16499
16529
  function cloudTextureUrl(id, tier, frame) {
16500
16530
  return versionedUrl(`/v1/textures/${id}/${tier}_${frame}.webp`, "textures");
@@ -16779,8 +16809,8 @@ var SIBLING_LAYERS = {
16779
16809
  async load(bo, meta, mesh, env) {
16780
16810
  const frame = cloudFrameForJd(env.currentJd, meta.frames, meta.coverage);
16781
16811
  if (!frame) return;
16782
- const deckRatio = bo.atmosphere ? bo.atmosphere.planetRadiusKm / bo.atmosphere.surfaceRadiusKm : 1;
16783
- const cloudRatio = deckRatio > 1 ? deckRatio : CLOUD_RADIUS_OFFSET;
16812
+ const cloudRatio = cloudRadiusRatio(bo.atmosphere?.params, bo.atmosphere?.surfaceRadiusKm ?? 1);
16813
+ const deckRatio = cloudRatio === 1.002 ? 1 : cloudRatio;
16784
16814
  const node = await loadCloudNode(mesh, bo.radiusScene, meta, frame, cloudRatio);
16785
16815
  if (!node) return;
16786
16816
  if (bo.clouds) {
@@ -21429,6 +21459,18 @@ function updatePositions(params) {
21429
21459
  ctx.bodies.hostRead.delete(id);
21430
21460
  return false;
21431
21461
  };
21462
+ const elementRowOffset = (body, parentPos) => {
21463
+ const row = ctx.bodies.elementRow(body);
21464
+ const rowParentPos = row && positionMap.get(row.parentId);
21465
+ if (!rowParentPos) return null;
21466
+ const offset = row.q != null ? parabolicToPositionJD(row, jd) : orbitalElementsToPositionJD(row, jd);
21467
+ if (!offset) return null;
21468
+ return [
21469
+ rowParentPos[0] - parentPos[0] + offset[0],
21470
+ rowParentPos[1] - parentPos[1] + offset[1],
21471
+ rowParentPos[2] - parentPos[2] + offset[2]
21472
+ ];
21473
+ };
21432
21474
  const computePosition = (body) => {
21433
21475
  if (computed.has(body.data.id)) return;
21434
21476
  computed.add(body.data.id);
@@ -21489,7 +21531,7 @@ function updatePositions(params) {
21489
21531
  let y;
21490
21532
  let z;
21491
21533
  if (isChebTracked) {
21492
- const chebOffset = ctx.chebStore.positionScene(d.id, jd);
21534
+ const chebOffset = ctx.chebStore.positionScene(d.id, jd) ?? elementRowOffset(body, parentPos);
21493
21535
  if (!chebOffset) {
21494
21536
  hide(true);
21495
21537
  const coverage = ctx.chebStore.zoneCoverage(d.id);
@@ -21535,11 +21577,11 @@ function updatePositions(params) {
21535
21577
  if (bo) {
21536
21578
  bo.outOfRange = false;
21537
21579
  const crashed = probeLanded.isDestroyed;
21538
- if (!bo.isLanded || bo.isCrashed !== crashed) {
21539
- setSpacecraftGlyph(bo.labelHalo, crashed ? "crashed" : "landed");
21580
+ if (!bo.isLanded) {
21581
+ setSpacecraftGlyph(bo.labelHalo, "landed");
21540
21582
  bo.isLanded = true;
21541
- bo.isCrashed = crashed;
21542
21583
  }
21584
+ bo.isCrashed = crashed;
21543
21585
  if (bo.model) bo.model.visible = !crashed;
21544
21586
  }
21545
21587
  body.position[0] = landedRender.x;
@@ -23489,10 +23531,7 @@ function rotateByQuaternion(q, x, y, z, out, at) {
23489
23531
  function bodyCentre(body, ctx, jd) {
23490
23532
  return placeForRead(body, jd, ctx) ? body.position : null;
23491
23533
  }
23492
- function resolveAnchor(anchor, ctx, jd) {
23493
- const body = ctx.getBody(anchor.body);
23494
- const centre = body && bodyCentre(body, ctx, jd);
23495
- if (!centre) return null;
23534
+ function placeAnchor(anchor, body, centre, jd) {
23496
23535
  const [cx, cy, cz] = centre;
23497
23536
  if (isSurface(anchor)) {
23498
23537
  const distance = kmToScene(effectiveRadiusKm(body.data) + (anchor.altitudeKm ?? 0));
@@ -23529,6 +23568,11 @@ function resolveAnchor(anchor, ctx, jd) {
23529
23568
  cz + oz
23530
23569
  ];
23531
23570
  }
23571
+ function resolveAnchor(anchor, ctx, jd) {
23572
+ const body = ctx.getBody(anchor.body);
23573
+ const centre = body && bodyCentre(body, ctx, jd);
23574
+ return centre ? placeAnchor(anchor, body, centre, jd) : null;
23575
+ }
23532
23576
  function anchorNormal(anchor, world, ctx, jd) {
23533
23577
  const body = ctx.getBody(anchor.body);
23534
23578
  const centre = body && bodyCentre(body, ctx, jd);
@@ -23802,6 +23846,7 @@ var SceneRenderer = class SceneRenderer {
23802
23846
  fpsSampleHead = 0;
23803
23847
  stashedSky = null;
23804
23848
  namesShown = true;
23849
+ halosShown = true;
23805
23850
  textureLoader = new TextureLoader();
23806
23851
  appearances = new BodyAppearances();
23807
23852
  shadowLight;
@@ -25050,6 +25095,11 @@ var SceneRenderer = class SceneRenderer {
25050
25095
  this.namesShown = names;
25051
25096
  this.labelContainer.classList.toggle("scene-overlay--no-names", !names);
25052
25097
  }
25098
+ const halos = this.ctx.layers.isVisible("halos");
25099
+ if (halos !== this.halosShown) {
25100
+ this.halosShown = halos;
25101
+ this.labelContainer.classList.toggle("scene-overlay--no-halos", !halos);
25102
+ }
25053
25103
  }
25054
25104
  setHaloDebugVisible(visible) {
25055
25105
  this.haloDebug.setVisible(visible);
@@ -27321,13 +27371,7 @@ function anchorDistanceKm(a, b, ctx, jd) {
27321
27371
  const offset = anchorOffsetKm(a, b, ctx, jd);
27322
27372
  return offset && Math.hypot(...offset);
27323
27373
  }
27324
- function subsolarPoint(id, ctx, jd) {
27325
- const body = ctx.getBody(id);
27326
- const sun = ctx.getBody(SUN_ID);
27327
- if (!body || !sun || body === sun) return null;
27328
- if (!body.orientation && !ctx.bodies.orientationRead.has(id)) return null;
27329
- const centre = bodyCentre(body, ctx, jd);
27330
- if (!centre) return null;
27374
+ function subsolarAt(body, centre, sun, jd) {
27331
27375
  const turn = body.orientation ? bodyQuaternion(body.orientation, jd, body.nutPrec).toArray() : [
27332
27376
  0,
27333
27377
  0,
@@ -27335,9 +27379,9 @@ function subsolarPoint(id, ctx, jd) {
27335
27379
  1
27336
27380
  ];
27337
27381
  const { latitude, longitude, distance } = cartesianToSpherical([
27338
- sun.position[0],
27339
- sun.position[1],
27340
- sun.position[2]
27382
+ sun[0],
27383
+ sun[1],
27384
+ sun[2]
27341
27385
  ], [
27342
27386
  centre[0],
27343
27387
  centre[1],
@@ -27348,6 +27392,14 @@ function subsolarPoint(id, ctx, jd) {
27348
27392
  lat: latitude
27349
27393
  } : null;
27350
27394
  }
27395
+ function subsolarPoint$1(id, ctx, jd) {
27396
+ const body = ctx.getBody(id);
27397
+ const sun = ctx.getBody(SUN_ID);
27398
+ if (!body || !sun || body === sun) return null;
27399
+ if (!body.orientation && !ctx.bodies.orientationRead.has(id)) return null;
27400
+ const centre = bodyCentre(body, ctx, jd);
27401
+ return centre && subsolarAt(body, centre, sun.position, jd);
27402
+ }
27351
27403
 
27352
27404
  //#endregion
27353
27405
  //#region src/lib/interaction/gesture.ts
@@ -27667,7 +27719,7 @@ var SpaceMap = class {
27667
27719
  return anchorOffsetKm(from, to, this.ctx, this.placedJd);
27668
27720
  }
27669
27721
  getSubsolarPoint(id) {
27670
- return subsolarPoint(id, this.ctx, this.placedJd);
27722
+ return subsolarPoint$1(id, this.ctx, this.placedJd);
27671
27723
  }
27672
27724
  load(targetId = this.initialView.id) {
27673
27725
  return this.ctx.load(jdToDate(this.clock.jd), targetId);
@@ -32216,6 +32268,158 @@ function kmToAu(km) {
32216
32268
  return km / AU_KM;
32217
32269
  }
32218
32270
 
32271
+ //#endregion
32272
+ //#region src/lib/scene/extensions/ephemeris.ts
32273
+ var chebyshev = null;
32274
+ var queue = Promise.resolve();
32275
+ function inTurn(read) {
32276
+ const turn = queue.then(read, read);
32277
+ queue = turn.catch(() => {});
32278
+ return turn;
32279
+ }
32280
+ async function open(date) {
32281
+ const jd = dateToJD(date);
32282
+ const metadata = await fetchMetadata();
32283
+ if (!chebyshev) {
32284
+ const params = chebyshevZoneParams(metadata);
32285
+ if (params.size > 0) chebyshev = new ChebyshevStore(params);
32286
+ }
32287
+ try {
32288
+ await chebyshev?.ensure(jd).done;
32289
+ } catch (error) {
32290
+ chebyshev = null;
32291
+ throw error;
32292
+ }
32293
+ return {
32294
+ jd,
32295
+ metadata,
32296
+ chebyshev
32297
+ };
32298
+ }
32299
+ function discovered(visibleFromDays, jd) {
32300
+ return !(visibleFromDays !== void 0 && jd - 2451545 < visibleFromDays);
32301
+ }
32302
+ async function moonRow(id, { jd, metadata }) {
32303
+ const zone = metadata.position.zones.moons;
32304
+ const zoom = zone && flatZoom(zone);
32305
+ if (!zoom) return null;
32306
+ const cols = await fetchElements("moons", null, 0, isChunkIndexed(zoom) ? String(chunkIndexForJd(zoom, jd)) : null);
32307
+ for (let i = 0; i < cols.rowCount; i++) if (rowId(cols, i) === id) return materializeBodyData(cols, i, /* @__PURE__ */ new Map(), "naif");
32308
+ return null;
32309
+ }
32310
+ function elementsOffset(data, jd) {
32311
+ if (!discovered(data.visibleFromDays, jd)) return null;
32312
+ if (jd < data.validityStart || jd > data.validityEnd) return null;
32313
+ if (data.satrec) return sgp4PositionScene(data.satrec, jd);
32314
+ if (data.q != null) return parabolicToPositionJD(data, jd);
32315
+ if (data.a === 0) return [
32316
+ 0,
32317
+ 0,
32318
+ 0
32319
+ ];
32320
+ return orbitalElementsToPositionJD(data, jd);
32321
+ }
32322
+ async function locate(id, at) {
32323
+ const { jd } = at;
32324
+ if (at.chebyshev?.has(id)) {
32325
+ const body = at.chebyshev.body(id, jd);
32326
+ if (body && !discovered(body.visibleFromDays, jd)) return null;
32327
+ const offset = body && chebyshevPositionScene(body, jd);
32328
+ if (offset) {
32329
+ const { radiusKm, objectType } = body;
32330
+ return {
32331
+ data: {
32332
+ radiusKm,
32333
+ objectType,
32334
+ orbitalSource: OrbitalSource.SPICE
32335
+ },
32336
+ parentId: `naif-${body.parentId}`,
32337
+ offset
32338
+ };
32339
+ }
32340
+ if (id.startsWith("naif-")) return null;
32341
+ }
32342
+ const data = (id.startsWith("naif-") ? await moonRow(id, at) : null) ?? bodyDataFromGlobal(id, await fetchObjectDetail(id, false));
32343
+ const offset = data && elementsOffset(data, jd);
32344
+ return offset ? {
32345
+ data,
32346
+ parentId: data.parentId,
32347
+ offset
32348
+ } : null;
32349
+ }
32350
+ async function place(id, at, above = /* @__PURE__ */ new Set()) {
32351
+ if (above.has(id)) return null;
32352
+ const own = await locate(id, at);
32353
+ if (!own) return null;
32354
+ if (own.parentId === "naif-0") return {
32355
+ data: own.data,
32356
+ centre: own.offset
32357
+ };
32358
+ const parent = await place(own.parentId, at, new Set(above).add(id));
32359
+ if (!parent) return null;
32360
+ const [x, y, z] = parent.centre;
32361
+ return {
32362
+ data: own.data,
32363
+ centre: [
32364
+ x + own.offset[0],
32365
+ y + own.offset[1],
32366
+ z + own.offset[2]
32367
+ ]
32368
+ };
32369
+ }
32370
+ async function spinOf(id) {
32371
+ const [detail] = await Promise.all([fetchObjectDetail(id, false), loadSystemsGlobal()]);
32372
+ const orientation = detail.global?.orientation;
32373
+ const sums = detail.global?.nut_prec;
32374
+ const naif = /^naif-(-?\d+)$/.exec(id);
32375
+ const angles = naif ? getNutPrecAngles(ownerIdFor(parseInt(naif[1], 10))) : void 0;
32376
+ return {
32377
+ orientation,
32378
+ nutPrec: sums && angles ? {
32379
+ ...sums,
32380
+ angles
32381
+ } : void 0
32382
+ };
32383
+ }
32384
+ async function resolve(anchor, at) {
32385
+ const placed = await place(anchor.body, at);
32386
+ if (!placed) return null;
32387
+ const spin = "latitude" in anchor ? await spinOf(anchor.body) : {};
32388
+ return placeAnchor(anchor, {
32389
+ data: placed.data,
32390
+ ...spin
32391
+ }, placed.centre, at.jd);
32392
+ }
32393
+ function offsetKm(from, to, date) {
32394
+ return inTurn(async () => {
32395
+ const at = await open(date);
32396
+ const a = await resolve(from, at);
32397
+ const b = a && await resolve(to, at);
32398
+ return a && b ? sceneToEcliptic([
32399
+ b[0] - a[0],
32400
+ b[1] - a[1],
32401
+ b[2] - a[2]
32402
+ ]) : null;
32403
+ });
32404
+ }
32405
+ async function distanceKm(from, to, date) {
32406
+ const offset = await offsetKm(from, to, date);
32407
+ return offset && Math.hypot(...offset);
32408
+ }
32409
+ function subsolarPoint(id, date) {
32410
+ return inTurn(async () => {
32411
+ if (id === "naif-10") return null;
32412
+ const at = await open(date);
32413
+ const body = await place(id, at);
32414
+ const sun = body && await place("naif-10", at);
32415
+ if (!body || !sun) return null;
32416
+ return subsolarAt({
32417
+ data: body.data,
32418
+ ...await spinOf(id)
32419
+ }, body.centre, sun.centre, at.jd);
32420
+ });
32421
+ }
32422
+
32219
32423
  //#endregion
32220
32424
  //#region src/lib/fetch/panoramas.ts
32221
32425
  var index = null;
@@ -32336,5 +32540,5 @@ function applyHost(options) {
32336
32540
  }
32337
32541
 
32338
32542
  //#endregion
32339
- export { AttributionControl, FlatAttributionControl, FlatMap, GestureHandler, MAP_LAYERS, PROJECTION_IDS, PanoramaAttributionControl, PanoramaView, SpaceMap, SystemMap, Viewport, bearingDeg, boxRing, circlePoints, configureHost, createFlatMap, createMap, createPanorama, createProjection, createSystemMap, dateToJD, defaultSceneSettings, elements, fetchPanoramaIndex, fetchPanoramas, findPanorama, fixed, graticule, groundDistanceM, isViewable, jdToDate, kmToAu, neighboursOf, panoramaAt, pathFor, planeBasis, projectionAspect, samples, smallCircle, tle };
32340
- (function(){if(typeof document==='undefined')return;var s=document.createElement('style');s.textContent=".scene-label{pointer-events:auto;cursor:pointer;-webkit-user-select:none;user-select:none;color:inherit;touch-action:none;z-index:1;width:32px;height:32px;text-decoration:none;display:block;position:relative;left:0}.scene-label__halo{border-radius:50%;width:100%;height:100%;transition:transform .1s}.scene-label__halo--spacecraft,.scene-label__halo--debris{overflow:visible}.scene-label__loader{box-sizing:border-box;pointer-events:none;border:2px solid #fff;border-color:#fff #fff #fff3 #fff3;border-radius:50%;width:32px;height:32px;margin:auto;animation:.9s linear infinite scene-label-loader-spin;position:fixed;inset:0}@keyframes scene-label-loader-spin{to{transform:rotate(360deg)}}.reduce-motion .scene-label__loader{animation-duration:.9s!important;animation-iteration-count:infinite!important}.scene-label__name{white-space:nowrap;pointer-events:auto;cursor:pointer;color:#fff;text-shadow:0 0 4px #000,0 0 4px #000;padding-left:8px;font-size:14px;font-weight:700;text-decoration:none;position:absolute;top:50%;left:32px;transform:translateY(-50%)}.scene-label__name--large{font-size:16px}.scene-label__annotations{top:28px;pointer-events:none;flex-direction:column;padding-inline-start:8px;display:flex;position:absolute;inset-inline-start:32px}.scene-label__annotation{opacity:0;white-space:nowrap;color:#fff9;text-shadow:0 0 3px #000,0 0 3px #000;transition:opacity .15s, display .15s allow-discrete;font-size:11px;line-height:1.3;display:none}.scene-label__annotation--visible{opacity:1;display:block}@starting-style{.scene-label__annotation--visible{opacity:0}}.scene-feature-label{color:#ffffffb3;white-space:nowrap;pointer-events:auto;cursor:pointer;-webkit-user-select:none;user-select:none;text-shadow:0 0 2px #000,0 0 2px #000;z-index:0;font-size:12px;transition:color .1s;left:0}.scene-feature-label:hover{color:#fff;text-shadow:0 0 3px #000,0 0 3px #000}.scene-feature-label--active{color:#fff;font-size:14px;font-weight:600}.scene-path-label{color:#fff;font:inherit;white-space:nowrap;text-align:start;text-shadow:0 0 4px #000,0 0 4px #000;pointer-events:auto;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:none;z-index:2;background:0 0;border:0;align-items:center;gap:8px;padding:0;line-height:1.15;display:flex;left:0}.scene-path-label--static{pointer-events:none;cursor:default}.scene-path-label__halo{border-radius:50%;flex-shrink:0;width:32px;height:32px;margin-inline-start:-16px;transition:transform .1s}.scene-path-label:hover .scene-path-label__halo{transform:scale(1.15)}.scene-path-label__text{flex-direction:column;gap:1px;display:flex}.scene-path-label__name{font-size:14px;font-weight:700}.scene-path-label__when{opacity:.8;font-variant-numeric:tabular-nums;font-size:12px}.scene-path-label--dim .scene-path-label__text{display:none}.scene-path-label--dim .scene-path-label__halo{transform:scale(.55)}.scene-path-label--dim:hover .scene-path-label__halo{transform:scale(.75)}.scene-path-label--step .scene-path-label__halo{background:0 0;border:0}.scene-path-label--step:hover .scene-path-label__halo{background:#ffffff1f}.scene-path-label--step .scene-path-label__name{font-size:12px;font-weight:600}.scene-path-label--step .scene-path-label__when{font-size:11px}.scene-path-label__hazard{font-size:11px;font-weight:700}.scene-path-label--lit{color:#fff}.scene-path-label--lit .scene-path-label__halo{transform:scale(1.15)}.scene-path-label--lit.scene-path-label--dim .scene-path-label__halo{transform:scale(.75)}.scene-path-label--faint .scene-path-label__text{display:none}.scene-path-label--faint .scene-path-label__halo{opacity:.45;transform:scale(.5)}.scene-path-label--faint:hover .scene-path-label__halo{opacity:1;transform:scale(.75)}.scene-overlay--no-names .scene-label__name,.scene-overlay--no-names .scene-label__annotations{display:none}.scene-hazard-label{white-space:nowrap;pointer-events:none;-webkit-user-select:none;user-select:none;text-shadow:0 0 4px #000,0 0 4px #000;margin-inline-start:16px;font-size:12px;font-weight:700;position:relative;left:0}.user-location-marker{pointer-events:none;background:#1a73e8;border:2px solid #fff;border-radius:50%;width:16px;height:16px;box-shadow:0 0 6px #0006}.sm-drawing-label{white-space:nowrap;color:#fff;text-shadow:0 0 4px #000,0 0 4px #000;-webkit-user-select:none;user-select:none;pointer-events:none;font:700 14px/1.2 system-ui,sans-serif}.sm-drawing-icon{-webkit-user-select:none;user-select:none;pointer-events:none;display:block}.sm-drawing--interactive{pointer-events:auto;cursor:pointer;touch-action:none}.sm-cooperative-hint{z-index:4;color:#fff;text-align:center;pointer-events:none;opacity:0;background:#0000008c;place-content:center;padding:16px;font:15px/1.4 system-ui,sans-serif;transition:opacity .2s;display:grid;position:absolute;inset:0}.sm-cooperative-hint--shown{opacity:1}@media (prefers-reduced-motion:reduce){.sm-cooperative-hint{transition:none}}.sm-ctrl{z-index:2;pointer-events:none;flex-direction:column;gap:6px;max-width:100%;padding:6px;display:flex;position:absolute}.sm-ctrl>*{pointer-events:auto}.sm-ctrl--top-left{align-items:flex-start;top:0;left:0}.sm-ctrl--top-right{align-items:flex-end;top:0;right:0}.sm-ctrl--bottom-left{align-items:flex-start;bottom:0;left:0}.sm-ctrl--bottom-right{align-items:flex-end;bottom:0;right:0}.sm-map{-webkit-user-select:none;user-select:none}:where(.sm-map){width:100%;height:100%;position:relative}.sm-map__canvas{pointer-events:auto;touch-action:none;width:100%;height:100%;display:block}.sm-map__canvas:focus-visible{outline:2px solid var(--ring,Highlight)}.sm-map .scene-overlay{pointer-events:none;z-index:0;position:absolute;inset:0}.sm-flat{touch-action:none;background:#05070e;width:100%;height:100%;position:relative;overflow:hidden}.sm-flat__raster,.sm-flat__vector,.sm-flat__markers{width:100%;height:100%;position:absolute;inset:0}.sm-flat__raster{display:block}.sm-flat__vector,.sm-flat__markers{pointer-events:none}.sm-flat--interactive{cursor:grab}.sm-flat--cooperative{touch-action:pan-x pan-y}.sm-flat--dragging{cursor:grabbing}.sm-flat__graticule{fill:none;stroke:#ffffff47;stroke-width:1px}.sm-flat__frame{fill:none;stroke:#ffffff73;stroke-width:1px}.sm-flat__feature-dot{fill:#fffc}.sm-flat__feature-label{fill:#ffffffd9;paint-order:stroke;stroke:#000000a6;stroke-width:2.5px;font:10px/1 system-ui,sans-serif}.sm-flat__marker-dot{background:#4ea3ff;border:2px solid #fff;border-radius:50%;width:10px;height:10px;box-shadow:0 0 0 1px #00000073}.sm-system-map{border-radius:var(--sm-system-map-radius,6px);background:var(--sm-system-map-background,#ffffff0d);width:100%;color:var(--sm-system-map-ink,#ffffff9e);position:relative;overflow:hidden}.sm-system-map--background{pointer-events:none;background:0 0;border-radius:0;height:100%}.sm-system-map__svg{touch-action:pan-y;width:100%;height:auto;display:block}.sm-system-map--background .sm-system-map__svg{height:100%}.sm-system-map__svg--near :is(a,.sm-system-map__button):not([data-near]){pointer-events:none}.sm-system-map__button{cursor:pointer}.sm-system-map__button:focus{outline:none}.sm-system-map__reference{opacity:.6}.sm-system-map__band--muted{color:var(--sm-system-map-ink,#ffffff9e)}.sm-system-map__band--sky{color:var(--sm-system-map-sky,oklch(74.6% .16 232.661/.7))}.sm-system-map__band--amber{color:var(--sm-system-map-amber,oklch(92.4% .12 95.746/.8))}.sm-system-map__band-label{font-weight:600}.sm-system-map__band-label--muted{fill:var(--sm-system-map-ink,#ffffff9e)}.sm-system-map__band-label--sky{fill:var(--sm-system-map-sky-label,oklch(74.6% .16 232.661))}.sm-system-map__band-label--amber{fill:var(--sm-system-map-amber-label,oklch(92.4% .12 95.746/.9))}.sm-system-map__tip{z-index:10;background:var(--sm-system-map-tip-background,#0a0c14e6);width:max-content;color:var(--sm-system-map-tip-ink,#fffffff2);white-space:nowrap;pointer-events:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1.33333;position:absolute;transform:translate(-50%);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.sm-system-map__tip[hidden]{display:none}.sm-system-map__tip-title{font-weight:500}.sm-system-map__tip-sub{color:var(--sm-system-map-ink,#ffffff9e)}.sm-ctrl:has(>.sm-attribution:only-child){padding:0}.sm-ctrl--top-left:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:0 0 var(--sm-attribution-radius) 0}.sm-ctrl--top-right:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:0 0 0 var(--sm-attribution-radius)}.sm-ctrl--bottom-left:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:0 var(--sm-attribution-radius) 0 0}.sm-ctrl--bottom-right:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:var(--sm-attribution-radius) 0 0 0}.sm-attribution{--sm-attribution-radius:3px;border-radius:var(--sm-attribution-radius);color:#ffffffbf;white-space:nowrap;background:#0006;align-items:center;gap:.5em;max-width:100%;padding:1px 6px;font:11px/1.45 system-ui,sans-serif;display:flex}.sm-attribution a{color:inherit;text-decoration:none}.sm-attribution a:hover{color:#fff;text-decoration:underline}.sm-attribution__home{font-weight:600}.sm-attribution__group{text-overflow:ellipsis;overflow:hidden}.sm-attribution__label{color:#ffffff80}\n/*$vite$:1*/";document.head.appendChild(s);})();
32543
+ export { AttributionControl, FlatAttributionControl, FlatMap, GestureHandler, MAP_LAYERS, PROJECTION_IDS, PanoramaAttributionControl, PanoramaView, SpaceMap, SystemMap, Viewport, bearingDeg, boxRing, circlePoints, configureHost, createFlatMap, createMap, createPanorama, createProjection, createSystemMap, dateToJD, defaultSceneSettings, distanceKm, elements, fetchPanoramaIndex, fetchPanoramas, findPanorama, fixed, graticule, groundDistanceM, isViewable, jdToDate, kmToAu, neighboursOf, offsetKm, panoramaAt, pathFor, planeBasis, projectionAspect, samples, smallCircle, subsolarPoint, tle };
32544
+ (function(){if(typeof document==='undefined')return;var s=document.createElement('style');s.textContent=".scene-label{pointer-events:auto;cursor:pointer;-webkit-user-select:none;user-select:none;color:inherit;touch-action:none;z-index:1;width:32px;height:32px;text-decoration:none;display:block;position:relative;left:0}.scene-label__halo{border-radius:50%;width:100%;height:100%;transition:transform .1s}.scene-label__halo--spacecraft,.scene-label__halo--debris{overflow:visible}.scene-label__loader{box-sizing:border-box;pointer-events:none;border:2px solid #fff;border-color:#fff #fff #fff3 #fff3;border-radius:50%;width:32px;height:32px;margin:auto;animation:.9s linear infinite scene-label-loader-spin;position:fixed;inset:0}@keyframes scene-label-loader-spin{to{transform:rotate(360deg)}}.reduce-motion .scene-label__loader{animation-duration:.9s!important;animation-iteration-count:infinite!important}.scene-label__name{white-space:nowrap;pointer-events:auto;cursor:pointer;color:#fff;text-shadow:0 0 4px #000,0 0 4px #000;padding-left:8px;font-size:14px;font-weight:700;text-decoration:none;position:absolute;top:50%;left:32px;transform:translateY(-50%)}.scene-label__name--large{font-size:16px}.scene-label__annotations{top:28px;pointer-events:none;flex-direction:column;padding-inline-start:8px;display:flex;position:absolute;inset-inline-start:32px}.scene-label__annotation{opacity:0;white-space:nowrap;color:#fff9;text-shadow:0 0 3px #000,0 0 3px #000;transition:opacity .15s, display .15s allow-discrete;font-size:11px;line-height:1.3;display:none}.scene-label__annotation--visible{opacity:1;display:block}@starting-style{.scene-label__annotation--visible{opacity:0}}.scene-feature-label{color:#ffffffb3;white-space:nowrap;pointer-events:auto;cursor:pointer;-webkit-user-select:none;user-select:none;text-shadow:0 0 2px #000,0 0 2px #000;z-index:0;font-size:12px;transition:color .1s;left:0}.scene-feature-label:hover{color:#fff;text-shadow:0 0 3px #000,0 0 3px #000}.scene-feature-label--active{color:#fff;font-size:14px;font-weight:600}.scene-path-label{color:#fff;font:inherit;white-space:nowrap;text-align:start;text-shadow:0 0 4px #000,0 0 4px #000;pointer-events:auto;cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:none;z-index:2;background:0 0;border:0;align-items:center;gap:8px;padding:0;line-height:1.15;display:flex;left:0}.scene-path-label--static{pointer-events:none;cursor:default}.scene-path-label__halo{border-radius:50%;flex-shrink:0;width:32px;height:32px;margin-inline-start:-16px;transition:transform .1s}.scene-path-label:hover .scene-path-label__halo{transform:scale(1.15)}.scene-path-label__text{flex-direction:column;gap:1px;display:flex}.scene-path-label__name{font-size:14px;font-weight:700}.scene-path-label__when{opacity:.8;font-variant-numeric:tabular-nums;font-size:12px}.scene-path-label--dim .scene-path-label__text{display:none}.scene-path-label--dim .scene-path-label__halo{transform:scale(.55)}.scene-path-label--dim:hover .scene-path-label__halo{transform:scale(.75)}.scene-path-label--step .scene-path-label__halo{background:0 0;border:0}.scene-path-label--step:hover .scene-path-label__halo{background:#ffffff1f}.scene-path-label--step .scene-path-label__name{font-size:12px;font-weight:600}.scene-path-label--step .scene-path-label__when{font-size:11px}.scene-path-label__hazard{font-size:11px;font-weight:700}.scene-path-label--lit{color:#fff}.scene-path-label--lit .scene-path-label__halo{transform:scale(1.15)}.scene-path-label--lit.scene-path-label--dim .scene-path-label__halo{transform:scale(.75)}.scene-path-label--faint .scene-path-label__text{display:none}.scene-path-label--faint .scene-path-label__halo{opacity:.45;transform:scale(.5)}.scene-path-label--faint:hover .scene-path-label__halo{opacity:1;transform:scale(.75)}.scene-overlay--no-names .scene-label__name,.scene-overlay--no-names .scene-label__annotations{display:none}.scene-overlay--no-halos .scene-label__halo{visibility:hidden}.scene-overlay--no-halos .scene-label{pointer-events:none}.scene-hazard-label{white-space:nowrap;pointer-events:none;-webkit-user-select:none;user-select:none;text-shadow:0 0 4px #000,0 0 4px #000;margin-inline-start:16px;font-size:12px;font-weight:700;position:relative;left:0}.user-location-marker{pointer-events:none;background:#1a73e8;border:2px solid #fff;border-radius:50%;width:16px;height:16px;box-shadow:0 0 6px #0006}.sm-drawing-label{white-space:nowrap;color:#fff;text-shadow:0 0 4px #000,0 0 4px #000;-webkit-user-select:none;user-select:none;pointer-events:none;font:700 14px/1.2 system-ui,sans-serif}.sm-drawing-icon{-webkit-user-select:none;user-select:none;pointer-events:none;display:block}.sm-drawing--interactive{pointer-events:auto;cursor:pointer;touch-action:none}.sm-cooperative-hint{z-index:4;color:#fff;text-align:center;pointer-events:none;opacity:0;background:#0000008c;place-content:center;padding:16px;font:15px/1.4 system-ui,sans-serif;transition:opacity .2s;display:grid;position:absolute;inset:0}.sm-cooperative-hint--shown{opacity:1}@media (prefers-reduced-motion:reduce){.sm-cooperative-hint{transition:none}}.sm-ctrl{z-index:2;pointer-events:none;flex-direction:column;gap:6px;max-width:100%;padding:6px;display:flex;position:absolute}.sm-ctrl>*{pointer-events:auto}.sm-ctrl--top-left{align-items:flex-start;top:0;left:0}.sm-ctrl--top-right{align-items:flex-end;top:0;right:0}.sm-ctrl--bottom-left{align-items:flex-start;bottom:0;left:0}.sm-ctrl--bottom-right{align-items:flex-end;bottom:0;right:0}.sm-map{-webkit-user-select:none;user-select:none}:where(.sm-map){width:100%;height:100%;position:relative}.sm-map__canvas{pointer-events:auto;touch-action:none;width:100%;height:100%;display:block}.sm-map__canvas:focus-visible{outline:2px solid var(--ring,Highlight)}.sm-map .scene-overlay{pointer-events:none;z-index:0;position:absolute;inset:0}.sm-flat{touch-action:none;background:#05070e;width:100%;height:100%;position:relative;overflow:hidden}.sm-flat__raster,.sm-flat__vector,.sm-flat__markers{width:100%;height:100%;position:absolute;inset:0}.sm-flat__raster{display:block}.sm-flat__vector,.sm-flat__markers{pointer-events:none}.sm-flat--interactive{cursor:grab}.sm-flat--cooperative{touch-action:pan-x pan-y}.sm-flat--dragging{cursor:grabbing}.sm-flat__graticule{fill:none;stroke:#ffffff47;stroke-width:1px}.sm-flat__frame{fill:none;stroke:#ffffff73;stroke-width:1px}.sm-flat__feature-dot{fill:#fffc}.sm-flat__feature-label{fill:#ffffffd9;paint-order:stroke;stroke:#000000a6;stroke-width:2.5px;font:10px/1 system-ui,sans-serif}.sm-flat__marker-dot{background:#4ea3ff;border:2px solid #fff;border-radius:50%;width:10px;height:10px;box-shadow:0 0 0 1px #00000073}.sm-system-map{border-radius:var(--sm-system-map-radius,6px);background:var(--sm-system-map-background,#ffffff0d);width:100%;color:var(--sm-system-map-ink,#ffffff9e);position:relative;overflow:hidden}.sm-system-map--background{pointer-events:none;background:0 0;border-radius:0;height:100%}.sm-system-map__svg{touch-action:pan-y;width:100%;height:auto;display:block}.sm-system-map--background .sm-system-map__svg{height:100%}.sm-system-map__svg--near :is(a,.sm-system-map__button):not([data-near]){pointer-events:none}.sm-system-map__button{cursor:pointer}.sm-system-map__button:focus{outline:none}.sm-system-map__reference{opacity:.6}.sm-system-map__band--muted{color:var(--sm-system-map-ink,#ffffff9e)}.sm-system-map__band--sky{color:var(--sm-system-map-sky,oklch(74.6% .16 232.661/.7))}.sm-system-map__band--amber{color:var(--sm-system-map-amber,oklch(92.4% .12 95.746/.8))}.sm-system-map__band-label{font-weight:600}.sm-system-map__band-label--muted{fill:var(--sm-system-map-ink,#ffffff9e)}.sm-system-map__band-label--sky{fill:var(--sm-system-map-sky-label,oklch(74.6% .16 232.661))}.sm-system-map__band-label--amber{fill:var(--sm-system-map-amber-label,oklch(92.4% .12 95.746/.9))}.sm-system-map__tip{z-index:10;background:var(--sm-system-map-tip-background,#0a0c14e6);width:max-content;color:var(--sm-system-map-tip-ink,#fffffff2);white-space:nowrap;pointer-events:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1.33333;position:absolute;transform:translate(-50%);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.sm-system-map__tip[hidden]{display:none}.sm-system-map__tip-title{font-weight:500}.sm-system-map__tip-sub{color:var(--sm-system-map-ink,#ffffff9e)}.sm-ctrl:has(>.sm-attribution:only-child){padding:0}.sm-ctrl--top-left:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:0 0 var(--sm-attribution-radius) 0}.sm-ctrl--top-right:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:0 0 0 var(--sm-attribution-radius)}.sm-ctrl--bottom-left:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:0 var(--sm-attribution-radius) 0 0}.sm-ctrl--bottom-right:has(>.sm-attribution:only-child)>.sm-attribution{border-radius:var(--sm-attribution-radius) 0 0 0}.sm-attribution{--sm-attribution-radius:3px;border-radius:var(--sm-attribution-radius);color:#ffffffbf;white-space:nowrap;background:#0006;align-items:center;gap:.5em;max-width:100%;padding:1px 6px;font:11px/1.45 system-ui,sans-serif;display:flex}.sm-attribution a{color:inherit;text-decoration:none}.sm-attribution a:hover{color:#fff;text-decoration:underline}.sm-attribution__home{font-weight:600}.sm-attribution__group{text-overflow:ellipsis;overflow:hidden}.sm-attribution__label{color:#ffffff80}\n/*$vite$:1*/";document.head.appendChild(s);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spacemap",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "The map of the Solar System from spacemap.co, on your website!",
5
5
  "keywords": ["solar system", "spacecraft", "orbits", "map", "three.js"],
6
6
  "homepage": "https://spacemap.co",