@dxos/react-ui-geo 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446

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 (36) hide show
  1. package/dist/lib/browser/index.mjs +55 -45
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +50 -40
  5. package/dist/lib/node/index.cjs.map +3 -3
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +55 -45
  8. package/dist/lib/node-esm/index.mjs.map +3 -3
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  11. package/dist/types/src/components/Map/Map.stories.d.ts +4 -5
  12. package/dist/types/src/components/Map/Map.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/Toolbar/Controls.d.ts.map +1 -1
  14. package/dist/types/src/hooks/context.d.ts.map +1 -1
  15. package/dist/types/src/hooks/useDrag.d.ts.map +1 -1
  16. package/dist/types/src/hooks/useGlobeZoomHandler.d.ts.map +1 -1
  17. package/dist/types/src/hooks/useMapZoomHandler.d.ts.map +1 -1
  18. package/dist/types/src/hooks/useSpinner.d.ts.map +1 -1
  19. package/dist/types/src/hooks/useTour.d.ts +1 -1
  20. package/dist/types/src/hooks/useTour.d.ts.map +1 -1
  21. package/dist/types/src/util/debug.d.ts.map +1 -1
  22. package/dist/types/src/util/inertia.d.ts +2 -1
  23. package/dist/types/src/util/inertia.d.ts.map +1 -1
  24. package/dist/types/src/util/path.d.ts.map +1 -1
  25. package/dist/types/src/util/render.d.ts.map +1 -1
  26. package/dist/types/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +11 -11
  28. package/src/components/Globe/Globe.stories.tsx +1 -1
  29. package/src/components/Globe/Globe.tsx +11 -20
  30. package/src/components/Map/Map.stories.tsx +5 -5
  31. package/src/hooks/useDrag.ts +3 -3
  32. package/src/hooks/useSpinner.ts +2 -2
  33. package/src/hooks/useTour.ts +13 -9
  34. package/src/util/inertia.ts +5 -4
  35. package/src/util/path.ts +5 -2
  36. package/src/util/render.ts +6 -5
@@ -35,7 +35,7 @@ __export(node_exports, {
35
35
  closestPoint: () => closestPoint,
36
36
  controlPositions: () => controlPositions,
37
37
  createLayers: () => createLayers,
38
- geoCircle: () => geoCircle,
38
+ geoCircle: () => geoCircle2,
39
39
  geoInertiaDrag: () => geoInertiaDrag,
40
40
  geoLine: () => geoLine,
41
41
  geoPoint: () => geoPoint,
@@ -55,7 +55,7 @@ __export(node_exports, {
55
55
  });
56
56
  module.exports = __toCommonJS(node_exports);
57
57
  var import_chunk_LAICG6L2 = require("./chunk-LAICG6L2.cjs");
58
- var import_d3 = require("d3");
58
+ var d37 = __toESM(require("d3"));
59
59
  var import_react = __toESM(require("react"));
60
60
  var import_react_resize_detector = require("react-resize-detector");
61
61
  var import_react_ui = require("@dxos/react-ui");
@@ -63,20 +63,21 @@ var import_react_ui_theme = require("@dxos/react-ui-theme");
63
63
  var import_react2 = __toESM(require("react"));
64
64
  var import_debug = require("@dxos/debug");
65
65
  var import_react_ui2 = require("@dxos/react-ui");
66
- var import_d32 = require("d3");
66
+ var d34 = __toESM(require("d3"));
67
67
  var import_react3 = require("react");
68
- var import_d33 = require("d3");
68
+ var d3 = __toESM(require("d3"));
69
69
  var import_versor = __toESM(require("versor"));
70
- var import_d34 = require("d3");
71
- var import_d35 = require("d3");
72
- var import_topojson_client = require("topojson-client");
70
+ var d32 = __toESM(require("d3"));
71
+ var d33 = __toESM(require("d3"));
72
+ var topojson = __toESM(require("topojson-client"));
73
73
  var import_react4 = require("react");
74
74
  var import_react5 = require("react");
75
- var import_d36 = require("d3");
75
+ var d35 = __toESM(require("d3"));
76
76
  var import_react6 = require("react");
77
- var import_d37 = require("d3");
77
+ var d36 = __toESM(require("d3"));
78
78
  var import_react7 = require("react");
79
79
  var import_versor2 = __toESM(require("versor"));
80
+ var import_log = require("@dxos/log");
80
81
  var import_react8 = __toESM(require("react"));
81
82
  var import_react_ui3 = require("@dxos/react-ui");
82
83
  var import_leaflet = require("leaflet/dist/leaflet.css");
@@ -132,7 +133,7 @@ var geoInertiaDrag = (target, render, projection, options) => {
132
133
  if (target.node) {
133
134
  target = target.node();
134
135
  }
135
- target = (0, import_d33.select)(target);
136
+ target = d3.select(target);
136
137
  const inertia = geoInertiaDragHelper({
137
138
  projection,
138
139
  render: (rotation) => {
@@ -156,7 +157,7 @@ var geoInertiaDrag = (target, render, projection, options) => {
156
157
  time: options.time,
157
158
  hold: options.hold
158
159
  });
159
- target.call((0, import_d33.drag)().on("start", inertia.start).on("drag", inertia.move).on("end", inertia.end));
160
+ target.call(d3.drag().on("start", inertia.start).on("drag", inertia.move).on("end", inertia.end));
160
161
  return inertia;
161
162
  };
162
163
  var geoInertiaDragHelper = (opt) => {
@@ -217,7 +218,7 @@ function inertiaHelper(opt) {
217
218
  0,
218
219
  0
219
220
  ],
220
- timer: (0, import_d33.timer)(() => {
221
+ timer: d3.timer(() => {
221
222
  }),
222
223
  time: 0,
223
224
  t: 0,
@@ -308,7 +309,7 @@ var geoPoint = (point) => ({
308
309
  type: "Point",
309
310
  coordinates: geoToPosition(point)
310
311
  });
311
- var geoCircle = ({ lat, lng }, radius) => (0, import_d34.geoCircle)().radius(radius).center([
312
+ var geoCircle2 = ({ lat, lng }, radius) => d32.geoCircle().radius(radius).center([
312
313
  lng,
313
314
  lat
314
315
  ])();
@@ -358,7 +359,7 @@ var createLayers = (topology, features, styles) => {
358
359
  if (styles.graticule) {
359
360
  layers.push({
360
361
  styles: styles.graticule,
361
- path: (0, import_d35.geoGraticule)().step([
362
+ path: d33.geoGraticule().step([
362
363
  6,
363
364
  6
364
365
  ])()
@@ -368,13 +369,13 @@ var createLayers = (topology, features, styles) => {
368
369
  if (topology.objects.land && styles.land) {
369
370
  layers.push({
370
371
  styles: styles.land,
371
- path: (0, import_topojson_client.feature)(topology, topology.objects.land)
372
+ path: topojson.feature(topology, topology.objects.land)
372
373
  });
373
374
  }
374
375
  if (topology.objects.countries && styles.border) {
375
376
  layers.push({
376
377
  styles: styles.border,
377
- path: (0, import_topojson_client.mesh)(topology, topology.objects.countries, (a, b) => a !== b)
378
+ path: topojson.mesh(topology, topology.objects.countries, (a, b) => a !== b)
378
379
  });
379
380
  }
380
381
  if (topology.objects.dots && styles.dots) {
@@ -446,7 +447,7 @@ var useDrag = (controller, options = {}) => {
446
447
  if (!canvas || options.disabled) {
447
448
  return;
448
449
  }
449
- geoInertiaDrag((0, import_d32.select)(canvas), () => {
450
+ geoInertiaDrag(d34.select(canvas), () => {
450
451
  controller.setRotation(controller.projection.rotate());
451
452
  options.onUpdate?.({
452
453
  type: "move",
@@ -465,7 +466,7 @@ var useDrag = (controller, options = {}) => {
465
466
  })
466
467
  });
467
468
  return () => {
468
- cancelDrag((0, import_d32.select)(canvas));
469
+ cancelDrag(d34.select(canvas));
469
470
  };
470
471
  }, [
471
472
  controller,
@@ -514,7 +515,7 @@ var useMapZoomHandler = (controller) => {
514
515
  var useSpinner = (controller, options = {}) => {
515
516
  const [running, setRunning] = (0, import_react6.useState)(false);
516
517
  (0, import_react6.useEffect)(() => {
517
- let timer3;
518
+ let timer4;
518
519
  const start = () => {
519
520
  const delta = options.delta ?? [
520
521
  1e-3,
@@ -523,7 +524,7 @@ var useSpinner = (controller, options = {}) => {
523
524
  ];
524
525
  let t = 0;
525
526
  let lastRotation = controller.projection.rotate();
526
- timer3 = (0, import_d36.timer)((elapsed) => {
527
+ timer4 = d35.timer((elapsed) => {
527
528
  const dt = elapsed - t;
528
529
  t = elapsed;
529
530
  const rotation = [
@@ -536,9 +537,9 @@ var useSpinner = (controller, options = {}) => {
536
537
  });
537
538
  };
538
539
  const stop = () => {
539
- if (timer3) {
540
- timer3.stop();
541
- timer3 = void 0;
540
+ if (timer4) {
541
+ timer4.stop();
542
+ timer4 = void 0;
542
543
  }
543
544
  };
544
545
  if (controller && running) {
@@ -560,14 +561,15 @@ var useSpinner = (controller, options = {}) => {
560
561
  () => setRunning(false)
561
562
  ];
562
563
  };
564
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-geo/src/hooks/useTour.ts";
563
565
  var TRANSITION_NAME = "globe-tour";
564
566
  var defaultDuration = 1500;
565
567
  var useTour = (controller, points, options = {}) => {
566
- const selection = (0, import_react7.useMemo)(() => (0, import_d37.selection)(), []);
568
+ const selection2 = d36.selection();
567
569
  const [running, setRunning] = (0, import_react7.useState)(options.running ?? false);
568
570
  (0, import_react7.useEffect)(() => {
569
571
  if (!running) {
570
- selection.interrupt(TRANSITION_NAME);
572
+ selection2.interrupt(TRANSITION_NAME);
571
573
  return;
572
574
  }
573
575
  let t;
@@ -577,7 +579,7 @@ var useTour = (controller, points, options = {}) => {
577
579
  const context = canvas.getContext("2d", {
578
580
  alpha: false
579
581
  });
580
- const path = (0, import_d37.geoPath)(projection, context).pointRadius(2);
582
+ const path = d36.geoPath(projection, context).pointRadius(2);
581
583
  const tilt = options.tilt ?? 0;
582
584
  let last;
583
585
  try {
@@ -593,12 +595,12 @@ var useTour = (controller, points, options = {}) => {
593
595
  }
594
596
  const p1 = last ? geoToPosition(last) : void 0;
595
597
  const p2 = geoToPosition(next);
596
- const ip = (0, import_d37.geoInterpolate)(p1 || p2, p2);
597
- const distance = (0, import_d37.geoDistance)(p1 || p2, p2);
598
+ const ip = d36.geoInterpolate(p1 || p2, p2);
599
+ const distance = d36.geoDistance(p1 || p2, p2);
598
600
  const r1 = p1 ? positionToRotation(p1, tilt) : controller.projection.rotate();
599
601
  const r2 = positionToRotation(p2, tilt);
600
602
  const iv = import_versor2.default.interpolate(r1, r2);
601
- const transition2 = selection.transition(TRANSITION_NAME).duration(Math.max(options.duration ?? defaultDuration, distance * 2e3)).tween("render", () => (t2) => {
603
+ const transition2 = selection2.transition(TRANSITION_NAME).duration(Math.max(options.duration ?? defaultDuration, distance * 2e3)).tween("render", () => (t2) => {
602
604
  const t1 = Math.max(0, Math.min(1, t2 * 2 - 1));
603
605
  const t22 = Math.min(1, t2 * 2);
604
606
  context.save();
@@ -625,20 +627,28 @@ var useTour = (controller, points, options = {}) => {
625
627
  context.fill();
626
628
  }
627
629
  context.restore();
628
- projection.rotate(iv(t2));
629
- setRotation(projection.rotate());
630
+ if (options.autoRotate) {
631
+ projection.rotate(iv(t2));
632
+ setRotation(projection.rotate());
633
+ }
630
634
  });
631
635
  await transition2.end();
632
636
  last = next;
633
637
  }
634
638
  } catch (err) {
639
+ import_log.log.catch(err, void 0, {
640
+ F: __dxlog_file,
641
+ L: 112,
642
+ S: void 0,
643
+ C: (f, a) => f(...a)
644
+ });
635
645
  } finally {
636
646
  setRunning(false);
637
647
  }
638
648
  });
639
649
  return () => {
640
650
  clearTimeout(t);
641
- selection.interrupt(TRANSITION_NAME);
651
+ selection2.interrupt(TRANSITION_NAME);
642
652
  };
643
653
  }
644
654
  }, [
@@ -748,16 +758,16 @@ var defaultStyles = {
748
758
  }
749
759
  };
750
760
  var projectionMap = {
751
- orthographic: import_d3.geoOrthographic,
752
- mercator: import_d3.geoMercator,
753
- "transverse-mercator": import_d3.geoTransverseMercator
761
+ orthographic: d37.geoOrthographic,
762
+ mercator: d37.geoMercator,
763
+ "transverse-mercator": d37.geoTransverseMercator
754
764
  };
755
765
  var getProjection = (type = "orthographic") => {
756
766
  if (typeof type === "string") {
757
- const constructor = projectionMap[type] ?? import_d3.geoOrthographic;
767
+ const constructor = projectionMap[type] ?? d37.geoOrthographic;
758
768
  return constructor();
759
769
  }
760
- return type ?? (0, import_d3.geoOrthographic)();
770
+ return type ?? d37.geoOrthographic();
761
771
  };
762
772
  var GlobeRoot = ({ classNames, children, ...props }) => {
763
773
  const { ref, width, height } = (0, import_react_resize_detector.useResizeDetector)();
@@ -814,8 +824,8 @@ var GlobeCanvas = /* @__PURE__ */ (0, import_react.forwardRef)(({ projection: _p
814
824
  setCenter,
815
825
  setScale: (s) => {
816
826
  if (typeof s === "function") {
817
- const is = (0, import_d3.interpolateNumber)(scaleRef.current, s(scaleRef.current));
818
- (0, import_d3.transition)().ease(zooming.current ? import_d3.easeLinear : import_d3.easeSinOut).duration(200).tween("scale", () => (t) => setScale(is(t))).on("end", () => {
827
+ const is = d37.interpolateNumber(scaleRef.current, s(scaleRef.current));
828
+ d37.transition().ease(zooming.current ? d37.easeLinear : d37.easeSinOut).duration(200).tween("scale", () => (t) => setScale(is(t))).on("end", () => {
819
829
  zooming.current = false;
820
830
  });
821
831
  } else {
@@ -828,7 +838,7 @@ var GlobeCanvas = /* @__PURE__ */ (0, import_react.forwardRef)(({ projection: _p
828
838
  }, [
829
839
  canvas
830
840
  ]);
831
- const generator = (0, import_react.useMemo)(() => canvas && projection && (0, import_d3.geoPath)(projection, canvas.getContext("2d", {
841
+ const generator = (0, import_react.useMemo)(() => canvas && projection && d37.geoPath(projection, canvas.getContext("2d", {
832
842
  alpha: false
833
843
  })), [
834
844
  canvas,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Globe/Globe.tsx", "../../../src/hooks/context.tsx", "../../../src/hooks/useDrag.ts", "../../../src/util/debug.ts", "../../../src/util/inertia.ts", "../../../src/util/path.ts", "../../../src/util/render.ts", "../../../src/hooks/useGlobeZoomHandler.ts", "../../../src/hooks/useMapZoomHandler.ts", "../../../src/hooks/useSpinner.ts", "../../../src/hooks/useTour.ts", "../../../src/components/Toolbar/Controls.tsx", "../../../src/components/Map/Map.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2018 DXOS.org\n//\n\nimport {\n type GeoProjection,\n geoMercator,\n geoOrthographic,\n geoPath,\n geoTransverseMercator,\n interpolateNumber,\n transition,\n easeLinear,\n easeSinOut,\n} from 'd3';\nimport { type ControlPosition } from 'leaflet';\nimport React, {\n type PropsWithChildren,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { type Topology } from 'topojson-specification';\n\nimport { type ThemedClassName, type ThemeMode, useDynamicRef, useThemeContext } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport {\n GlobeContextProvider,\n type GlobeContextProviderProps,\n type GlobeContextType,\n useGlobeContext,\n} from '../../hooks';\nimport {\n type Features,\n type StyleSet,\n createLayers,\n geoToPosition,\n positionToRotation,\n renderLayers,\n timer,\n} from '../../util';\nimport { ZoomControls, ActionControls, type ControlProps, controlPositions } from '../Toolbar';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute\n */\nconst defaultStyles: Record<ThemeMode, StyleSet> = {\n light: {\n background: {\n fillStyle: '#EEE',\n },\n\n water: {\n fillStyle: '#555',\n },\n\n land: {\n fillStyle: '#999',\n },\n\n line: {\n strokeStyle: 'darkred',\n },\n\n point: {\n fillStyle: '#111111',\n strokeStyle: '#111111',\n strokeWidth: 1,\n pointRadius: 0.5,\n },\n },\n dark: {\n background: {\n fillStyle: '#111111',\n },\n\n water: {\n fillStyle: '#123E6A',\n },\n\n land: {\n fillStyle: '#032153',\n },\n\n line: {\n strokeStyle: '#111111',\n },\n\n point: {\n fillStyle: '#111111',\n strokeStyle: '#111111',\n strokeWidth: 1,\n pointRadius: 0.5,\n },\n },\n};\n\nexport type GlobeController = {\n canvas: HTMLCanvasElement;\n projection: GeoProjection;\n} & Pick<GlobeContextType, 'scale' | 'translation' | 'rotation' | 'setScale' | 'setTranslation' | 'setRotation'>;\n\nexport type ProjectionType = 'orthographic' | 'mercator' | 'transverse-mercator';\n\nconst projectionMap: Record<ProjectionType, () => GeoProjection> = {\n orthographic: geoOrthographic,\n mercator: geoMercator,\n 'transverse-mercator': geoTransverseMercator,\n};\n\nconst getProjection = (type: GlobeCanvasProps['projection'] = 'orthographic'): GeoProjection => {\n if (typeof type === 'string') {\n const constructor = projectionMap[type] ?? geoOrthographic;\n return constructor();\n }\n\n return type ?? geoOrthographic();\n};\n\n//\n// Root\n//\n\ntype GlobeRootProps = PropsWithChildren<ThemedClassName<GlobeContextProviderProps>>;\n\nconst GlobeRoot = ({ classNames, children, ...props }: GlobeRootProps) => {\n const { ref, width, height } = useResizeDetector<HTMLDivElement>();\n return (\n <div ref={ref} className={mx('relative flex grow overflow-hidden', classNames)}>\n <GlobeContextProvider size={{ width, height }} {...props}>\n {children}\n </GlobeContextProvider>\n </div>\n );\n};\n\n//\n// Canvas\n//\n\ntype GlobeCanvasProps = {\n projection?: ProjectionType | GeoProjection;\n topology?: Topology;\n features?: Features;\n styles?: StyleSet;\n};\n\n/**\n * Basic globe renderer.\n * https://github.com/topojson/world-atlas\n */\nconst GlobeCanvas = forwardRef<GlobeController, GlobeCanvasProps>(\n ({ projection: _projection, topology, features, styles: _styles }, forwardRef) => {\n const { themeMode } = useThemeContext();\n const styles = useMemo(() => _styles ?? defaultStyles[themeMode], [_styles, themeMode]);\n\n // Canvas.\n const [canvas, setCanvas] = useState<HTMLCanvasElement>(null);\n const canvasRef = (canvas: HTMLCanvasElement) => setCanvas(canvas);\n\n // Projection.\n const projection = useMemo(() => getProjection(_projection), [_projection]);\n\n // Layers.\n // TODO(burdon): Generate on the fly based on what is visible.\n const layers = useMemo(() => {\n return timer(() => createLayers(topology as Topology, features, styles));\n }, [topology, features, styles]);\n\n // State.\n const { size, center, scale, translation, rotation, setCenter, setScale, setTranslation, setRotation } =\n useGlobeContext();\n\n const scaleRef = useDynamicRef(scale);\n\n // Update rotation.\n useEffect(() => {\n if (center) {\n setScale(1);\n setRotation(positionToRotation(geoToPosition(center)));\n }\n }, [center]);\n\n // External controller.\n const zooming = useRef(false);\n useImperativeHandle<GlobeController, GlobeController>(\n forwardRef,\n () => {\n return {\n canvas,\n projection,\n center,\n get scale() {\n return scaleRef.current;\n },\n translation,\n rotation,\n setCenter,\n setScale: (s) => {\n if (typeof s === 'function') {\n const is = interpolateNumber(scaleRef.current, s(scaleRef.current));\n // Stop easing if already zooming.\n transition()\n .ease(zooming.current ? easeLinear : easeSinOut)\n .duration(200)\n .tween('scale', () => (t) => setScale(is(t)))\n .on('end', () => {\n zooming.current = false;\n });\n } else {\n setScale(s);\n }\n },\n setTranslation,\n setRotation,\n };\n },\n [canvas],\n );\n\n // https://d3js.org/d3-geo/path#geoPath\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext\n const generator = useMemo(\n () => canvas && projection && geoPath(projection, canvas.getContext('2d', { alpha: false })),\n [canvas, projection],\n );\n\n // Render on change.\n useEffect(() => {\n if (canvas && projection) {\n timer(() => {\n // https://d3js.org/d3-geo/projection\n projection\n .scale((Math.min(size.width, size.height) / 2) * scale)\n .translate([size.width / 2 + (translation?.x ?? 0), size.height / 2 + (translation?.y ?? 0)])\n .rotate(rotation ?? [0, 0, 0]);\n\n renderLayers(generator, layers, scale, styles);\n });\n }\n }, [generator, size, scale, translation, rotation, layers]);\n\n if (!size.width || !size.height) {\n return null;\n }\n\n return <canvas ref={canvasRef} width={size.width} height={size.height} />;\n },\n);\n\nconst GlobeDebug = ({ position = 'topleft' }: { position?: ControlPosition }) => {\n const { size, scale, translation, rotation } = useGlobeContext();\n return (\n <div\n className={mx(\n 'z-10 absolute w-96 p-2 overflow-hidden border border-green-700 rounded',\n controlPositions[position],\n )}\n >\n <pre className='font-mono text-xs text-green-700'>\n {JSON.stringify({ size, scale, translation, rotation }, null, 2)}\n </pre>\n </div>\n );\n};\n\nconst GlobePanel = ({\n position,\n classNames,\n children,\n}: ThemedClassName<PropsWithChildren & { position?: ControlPosition }>) => {\n return <div className={mx('z-10 absolute overflow-hidden', controlPositions[position], classNames)}>{children}</div>;\n};\n\nconst CustomControl = ({ position, children }: PropsWithChildren<{ position: ControlPosition }>) => {\n return <div className={mx('z-10 absolute overflow-hidden', controlPositions[position])}>{children}</div>;\n};\n\ntype GlobeControlProps = { position?: ControlPosition } & Pick<ControlProps, 'onAction'>;\n\nexport const Globe = {\n Root: GlobeRoot,\n Canvas: GlobeCanvas,\n Zoom: ({ onAction, position = 'bottomleft', ...props }: GlobeControlProps) => (\n <CustomControl position={position} {...props}>\n <ZoomControls onAction={onAction} />\n </CustomControl>\n ),\n Action: ({ onAction, position = 'bottomright', ...props }: GlobeControlProps) => (\n <CustomControl position={position} {...props}>\n <ActionControls onAction={onAction} />\n </CustomControl>\n ),\n Debug: GlobeDebug,\n Panel: GlobePanel,\n};\n\nexport type { GlobeRootProps, GlobeCanvasProps };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { createContext, type Dispatch, type PropsWithChildren, type SetStateAction, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { useControlledState } from '@dxos/react-ui';\n\nimport { type LatLng } from '../util';\n\n// TODO(burdon): Factor out common geometry types.\nexport type Size = { width: number; height: number };\nexport type Point = { x: number; y: number };\nexport type Vector = [number, number, number];\n\nexport type GlobeContextType = {\n size: Size;\n center: LatLng;\n scale: number;\n translation: Point;\n rotation: Vector;\n setCenter: Dispatch<SetStateAction<LatLng>>;\n setScale: Dispatch<SetStateAction<number>>;\n setTranslation: Dispatch<SetStateAction<Point>>;\n setRotation: Dispatch<SetStateAction<Vector>>;\n};\n\nconst GlobeContext = createContext<GlobeContextType>(undefined);\n\nexport type GlobeContextProviderProps = PropsWithChildren<\n Partial<Pick<GlobeContextType, 'size' | 'center' | 'scale' | 'translation' | 'rotation'>>\n>;\n\nexport const GlobeContextProvider = ({\n children,\n size,\n center: _center,\n scale: _scale,\n translation: _translation,\n rotation: _rotation,\n}: GlobeContextProviderProps) => {\n const [center, setCenter] = useControlledState(_center);\n const [scale, setScale] = useControlledState(_scale);\n const [translation, setTranslation] = useControlledState<Point>(_translation);\n const [rotation, setRotation] = useControlledState<Vector>(_rotation);\n\n return (\n <GlobeContext.Provider\n value={{ size, center, scale, translation, rotation, setCenter, setScale, setTranslation, setRotation }}\n >\n {children}\n </GlobeContext.Provider>\n );\n};\n\nexport const useGlobeContext = () => {\n return useContext(GlobeContext) ?? raise(new Error('Missing GlobeContext'));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { select } from 'd3';\nimport { useEffect } from 'react';\n\nimport { type GlobeController } from '../components';\nimport { geoInertiaDrag } from '../util';\n\nexport type GlobeDragEvent = {\n type: 'start' | 'move' | 'end';\n controller: GlobeController;\n};\n\nexport type DragOptions = {\n disabled?: boolean;\n duration?: number;\n xAxis?: boolean; // TODO(burdon): Generalize.\n onUpdate?: (event: GlobeDragEvent) => void;\n};\n\n/**\n * Allows user to drag globe.\n */\nexport const useDrag = (controller?: GlobeController | null, options: DragOptions = {}) => {\n useEffect(() => {\n const canvas = controller?.canvas;\n if (!canvas || options.disabled) {\n return;\n }\n\n geoInertiaDrag(\n select(canvas),\n () => {\n controller.setRotation(controller.projection.rotate());\n options.onUpdate?.({ type: 'move', controller });\n },\n controller.projection,\n {\n xAxis: options.xAxis,\n time: 3_000,\n start: () => options.onUpdate?.({ type: 'start', controller }),\n finish: () => options.onUpdate?.({ type: 'end', controller }),\n },\n );\n\n // TODO(burdon): Cancel drag timer.\n return () => {\n cancelDrag(select(canvas));\n };\n }, [controller, JSON.stringify(options)]);\n};\n\nconst cancelDrag = (node) => node.on('.drag', null);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nconst debug = false;\n\nexport const timer = <T = void>(cb: () => T): T => {\n const start = Date.now();\n const data = cb();\n const t = Date.now() - start / 1_000;\n if (debug) {\n // eslint-disable-next-line no-console\n console.log({ t, data });\n }\n\n return data;\n};\n", "//\n// Copyright 2017 Philippe Rivière\n// Copyright 2024 DXOS.org\n// https://github.com/Fil/d3-inertia\n//\n\nimport { select, drag, timer } from 'd3';\nimport versor from 'versor';\n\nexport const restrictAxis =\n (axis: boolean[]) =>\n (original: number[], current: number[]): number[] =>\n current.map((d, i) => (axis[i] ? d : original[i]));\n\n/**\n * Applies a drag handler to the specified target element.\n */\n// TODO(burdon): Define type.\nexport const geoInertiaDrag = (target, render, projection, options) => {\n if (!options) {\n options = {};\n }\n\n // Target can be an element, a selector, a function, or a selection\n // but in case of a selection we make sure to reselect it with d3-selection.\n if (target.node) {\n target = target.node();\n }\n target = select(target);\n\n // Complete params: (projection, render, startDrag, dragging, endDrag).\n const inertia = geoInertiaDragHelper({\n projection,\n render: (rotation) => {\n projection.rotate(rotation);\n render && render();\n },\n axis: restrictAxis(options.xAxis ? [true, false, false] : [true, true, true]),\n start: options.start,\n move: options.move,\n end: options.end,\n stop: options.stop,\n finish: options.finish,\n time: options.time,\n hold: options.hold,\n });\n\n target.call(drag().on('start', inertia.start).on('drag', inertia.move).on('end', inertia.end));\n return inertia;\n};\n\n/**\n * A versor is a compact way to describe a rotation in 3D space.\n * It consists of four components [𝑤,x,y,z], where:\n * 𝑤 is a scalar representing the angle of rotation.\n * x, y, z are the vector components, representing the axis of rotation.\n */\nconst geoInertiaDragHelper = (opt) => {\n const projection = opt.projection;\n\n let v0; // Mouse position in Cartesian coordinates at start of drag gesture.\n let r0; // Projection rotation as Euler angles at start.\n let q0; // Projection rotation as versor at start.\n let v10; // Mouse position in Cartesian coordinates just before end of drag gesture.\n let v11; // Mouse position in Cartesian coordinates at end.\n let q10; // Projection rotation as versor at end.\n\n const inertia = inertiaHelper({\n axis: opt.axis,\n\n start: () => {\n v0 = versor.cartesian(projection.invert(inertia.position));\n r0 = projection.rotate();\n q0 = versor(r0);\n opt.start && opt.start();\n },\n\n move: () => {\n const inv = projection.rotate(r0).invert(inertia.position);\n if (isNaN(inv[0])) {\n return;\n }\n const v1 = versor.cartesian(inv);\n const q1 = versor.multiply(q0, versor.delta(v0, v1));\n const r1 = versor.rotation(q1);\n const r2 = opt.axis(r0, r1);\n opt.render(r2);\n opt.move && opt.move();\n },\n\n end: () => {\n // Velocity.\n v10 = versor.cartesian(projection.invert(inertia.position.map((d, i) => d - inertia.velocity[i] / 1_000)));\n q10 = versor(projection.rotate());\n v11 = versor.cartesian(projection.invert(inertia.position));\n opt.end && opt.end();\n },\n\n stop: opt.stop,\n\n finish: opt.finish,\n\n render: (t) => {\n const r1 = versor.rotation(versor.multiply(q10, versor.delta(v10, v11, t * 1_000)));\n const r2 = opt.axis(r0, r1);\n opt.render && opt.render(r2);\n },\n\n time: opt.time,\n });\n\n return inertia;\n};\n\nfunction inertiaHelper(opt) {\n const A = opt.time || 5_000; // Reference time in ms.\n const limit = 1.0001;\n const B = -Math.log(1 - 1 / limit);\n const inertia = {\n position: [0, 0],\n velocity: [0, 0], // Velocity in pixels/s.\n timer: timer(() => {}),\n time: 0,\n t: 0,\n\n start: function (ev) {\n const position = [ev.x, ev.y];\n inertia.position = position;\n inertia.velocity = [0, 0];\n inertia.timer.stop();\n this.classList.remove('inertia');\n this.classList.add('dragging');\n opt.start && opt.start.call(this, position);\n },\n\n move: function (ev) {\n const position = [ev.x, ev.y];\n const time = performance.now();\n const deltaTime = time - inertia.time;\n const decay = 1 - Math.exp(-deltaTime / 1_000);\n inertia.velocity = inertia.velocity.map((d, i) => {\n const deltaPos = position[i] - inertia.position[i];\n const deltaTime = time - inertia.time;\n return (1_000 * (1 - decay) * deltaPos) / deltaTime + d * decay;\n });\n\n // Clamp velocity axis.\n inertia.velocity = opt.axis([0, 0], inertia.velocity);\n\n inertia.time = time;\n inertia.position = position;\n opt.move && opt.move.call(this, position);\n },\n\n end: function (ev) {\n this.classList.remove('dragging', 'inertia');\n\n const v = inertia.velocity;\n if (v[0] * v[0] + v[1] * v[1] < 100) {\n inertia.timer.stop();\n return opt.stop && opt.stop();\n }\n\n const time = performance.now();\n const deltaTime = time - inertia.time;\n\n if (opt.hold === undefined) {\n opt.hold = 100;\n } // Default flick->drag threshold time (0 disables inertia).\n\n if (deltaTime >= opt.hold) {\n inertia.timer.stop();\n return opt.stop && opt.stop();\n }\n\n this.classList.add('inertia');\n opt.end && opt.end();\n\n const self = this;\n inertia.timer.restart((e) => {\n inertia.t = limit * (1 - Math.exp((-B * e) / A));\n opt.render && opt.render(inertia.t);\n if (inertia.t > 1) {\n inertia.timer.stop();\n self.classList.remove('inertia');\n inertia.velocity = [0, 0];\n inertia.t = 1;\n opt.finish && opt.finish();\n }\n });\n },\n };\n\n inertia.timer.stop();\n return inertia;\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { type GeoGeometryObjects, geoCircle as d3GeoCircle } from 'd3';\nimport { type Point, type Polygon, type Position } from 'geojson';\n\nimport type { Vector } from '../hooks';\n\nexport type LatLng = { lat: number; lng: number };\n\nexport const positionToRotation = ([lng, lat]: [number, number], tilt = 0): Vector => [-lng, tilt - lat, 0];\n\nexport const geoToPosition = ({ lat, lng }: LatLng): [number, number] => [lng, lat];\n\nexport const geoPoint = (point: LatLng): Point => ({ type: 'Point', coordinates: geoToPosition(point) });\n\n// https://github.com/d3/d3-geo#geoCircle\nexport const geoCircle = ({ lat, lng }: LatLng, radius: number): Polygon =>\n d3GeoCircle().radius(radius).center([lng, lat])();\n\nexport const geoLine = (p1: LatLng, p2: LatLng): GeoGeometryObjects => ({\n type: 'LineString',\n coordinates: [\n [p1.lng, p1.lat],\n [p2.lng, p2.lat],\n ],\n});\n\nexport const closestPoint = (points: Position[], target: Position): Position | null => {\n if (points.length === 0) {\n return target;\n }\n\n let closestPoint = points[0];\n let minDistance = getDistance(points[0], target);\n\n for (const point of points) {\n const distance = getDistance(point, target);\n if (distance < minDistance) {\n minDistance = distance;\n closestPoint = point;\n }\n }\n\n return closestPoint;\n};\n\nexport const getDistance = (point1: Position, point2: Position): number => {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return Math.sqrt(dx * dx + dy * dy);\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { type GeoPath, type GeoPermissibleObjects, geoGraticule } from 'd3';\nimport { feature, mesh } from 'topojson-client';\nimport { type Topology } from 'topojson-specification';\n\nimport { type LatLng, geoLine, geoPoint } from './path';\n\nexport type Styles = Record<string, any>;\n\nexport type Style =\n | 'background'\n | 'water'\n | 'graticule'\n | 'land'\n | 'border'\n | 'dots'\n | 'point'\n | 'line'\n | 'cursor'\n | 'arc';\n\nexport type StyleSet = Partial<Record<Style, Styles>>;\n\nexport type Features = {\n points?: LatLng[];\n lines?: { source: LatLng; target: LatLng }[];\n};\n\nexport type Layer = {\n styles: Styles;\n path: GeoPermissibleObjects;\n};\n\n/**\n * Create rendering layers.\n */\nexport const createLayers = (topology: Topology, features: Features, styles: StyleSet): Layer[] => {\n const layers: Layer[] = [];\n\n if (styles.water) {\n layers.push({\n styles: styles.water,\n path: {\n type: 'Sphere',\n },\n });\n }\n\n if (styles.graticule) {\n layers.push({\n styles: styles.graticule,\n path: geoGraticule().step([6, 6])(),\n });\n }\n\n //\n // Topology.\n //\n\n if (topology) {\n if (topology.objects.land && styles.land) {\n layers.push({\n styles: styles.land,\n path: feature(topology, topology.objects.land),\n });\n }\n\n if (topology.objects.countries && styles.border) {\n layers.push({\n styles: styles.border,\n path: mesh(topology, topology.objects.countries, (a: any, b: any) => a !== b),\n });\n }\n\n if (topology.objects.dots && styles.dots) {\n layers.push({\n styles: styles.dots,\n path: topology.objects.dots as any, // TODO(burdon): Type.\n });\n }\n }\n\n //\n // Features.\n //\n\n if (features) {\n const { points, lines } = features;\n\n if (points && styles.point) {\n layers.push({\n styles: styles.point,\n path: {\n type: 'GeometryCollection',\n geometries: points.map((point) => geoPoint(point)),\n },\n });\n }\n\n if (lines && styles.line) {\n layers.push({\n styles: styles.line,\n path: {\n type: 'GeometryCollection',\n geometries: lines.map(({ source, target }) => geoLine(source, target)),\n },\n });\n }\n }\n\n return layers;\n};\n\n/**\n * Render layers created above.\n */\nexport const renderLayers = (generator: GeoPath, layers: Layer[] = [], scale: number, styles: StyleSet) => {\n const context: CanvasRenderingContext2D = generator.context();\n const {\n canvas: { width, height },\n } = context;\n context.reset();\n\n // Clear background.\n if (styles.background) {\n context.fillStyle = styles.background.fillStyle;\n context.fillRect(0, 0, width, height);\n } else {\n context.clearRect(0, 0, width, height);\n }\n\n // Render features.\n // https://github.com/d3/d3-geo#_path\n layers.forEach(({ path, styles }) => {\n context.save();\n let fill = false;\n let stroke = false;\n if (styles) {\n Object.entries(styles).forEach(([key, value]) => {\n if (key === 'pointRadius') {\n generator.pointRadius(value * scale);\n } else {\n context[key] = value;\n fill ||= key === 'fillStyle';\n stroke ||= key === 'strokeStyle';\n }\n });\n }\n\n context.beginPath();\n\n generator(path);\n fill && context.fill();\n stroke && context.stroke();\n context.restore();\n });\n\n return context;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { type GlobeController, type ControlProps } from '../components';\n\nexport const useGlobeZoomHandler = (controller: GlobeController | null | undefined): ControlProps['onAction'] => {\n return useCallback<ControlProps['onAction']>(\n (event) => {\n if (!controller) {\n return;\n }\n\n switch (event) {\n case 'zoom-in': {\n controller.setScale((scale) => scale * 1.1);\n break;\n }\n case 'zoom-out': {\n controller.setScale((scale) => scale * 0.9);\n break;\n }\n }\n },\n [controller],\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { type MapController, type ControlProps } from '../components';\n\nexport const useMapZoomHandler = (controller: MapController | null | undefined): ControlProps['onAction'] => {\n return useCallback<ControlProps['onAction']>(\n (event) => {\n if (!controller) {\n return;\n }\n\n switch (event) {\n case 'zoom-in': {\n controller.setZoom((scale) => scale + 1);\n break;\n }\n case 'zoom-out': {\n controller.setZoom((scale) => scale - 1);\n break;\n }\n }\n },\n [controller],\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { timer as d3Timer } from 'd3';\nimport { type Timer } from 'd3';\nimport { useEffect, useState } from 'react';\n\nimport { type Vector } from './context';\nimport { type GlobeController } from '../components';\n\nexport type SpinnerOptions = {\n disabled?: boolean;\n delta?: Vector;\n};\n\n/**\n * Rotates globe.\n */\nexport const useSpinner = (controller?: GlobeController | null, options: SpinnerOptions = {}) => {\n const [running, setRunning] = useState(false);\n useEffect(() => {\n let timer: Timer | undefined;\n\n const start = () => {\n const delta: Vector = options.delta ?? [0.001, 0, 0];\n\n let t = 0;\n let lastRotation = controller.projection.rotate();\n timer = d3Timer((elapsed) => {\n const dt = elapsed - t;\n t = elapsed;\n\n const rotation: Vector = [\n lastRotation[0] + delta[0] * dt,\n lastRotation[1] + delta[1] * dt,\n lastRotation[2] + delta[2] * dt,\n ];\n\n lastRotation = rotation;\n controller.setRotation(rotation);\n });\n };\n\n const stop = () => {\n if (timer) {\n timer.stop();\n timer = undefined;\n }\n };\n\n if (controller && running) {\n start();\n } else {\n stop();\n }\n\n return () => stop();\n }, [controller, running]);\n\n return [\n () => {\n if (!options.disabled) {\n setRunning(true);\n }\n },\n () => setRunning(false),\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { geoPath, geoInterpolate, geoDistance, selection as d3Selection } from 'd3';\nimport { type SetStateAction, type Dispatch, useEffect, useState, useMemo } from 'react';\nimport versor from 'versor';\n\nimport type { GlobeController } from '../components';\nimport { geoToPosition, type LatLng, positionToRotation, type StyleSet } from '../util';\n\nconst TRANSITION_NAME = 'globe-tour';\n\nconst defaultDuration = 1_500;\n\nexport type TourOptions = {\n running?: boolean;\n disabled?: boolean;\n duration?: number;\n loop?: boolean;\n tilt?: number;\n autoRotate?: boolean;\n styles?: StyleSet;\n};\n\n/**\n * Iterates between points.\n * Inspired by: https://observablehq.com/@mbostock/top-100-cities\n */\nexport const useTour = (\n controller?: GlobeController | null,\n points?: LatLng[],\n options: TourOptions = {},\n): [boolean, Dispatch<SetStateAction<boolean>>] => {\n const selection = useMemo(() => d3Selection(), []);\n const [running, setRunning] = useState(options.running ?? false);\n useEffect(() => {\n if (!running) {\n selection.interrupt(TRANSITION_NAME);\n return;\n }\n\n let t: ReturnType<typeof setTimeout>;\n if (controller && running) {\n t = setTimeout(async () => {\n const { canvas, projection, setRotation } = controller;\n const context = canvas.getContext('2d', { alpha: false });\n const path = geoPath(projection, context).pointRadius(2);\n\n const tilt = options.tilt ?? 0;\n let last: LatLng;\n try {\n const p = [...points];\n if (options.loop) {\n p.push(p[0]);\n }\n\n for (const next of p) {\n if (!running) {\n break;\n }\n\n // Points.\n const p1 = last ? geoToPosition(last) : undefined;\n const p2 = geoToPosition(next);\n const ip = geoInterpolate(p1 || p2, p2);\n const distance = geoDistance(p1 || p2, p2);\n\n // Rotation.\n const r1 = p1 ? positionToRotation(p1, tilt) : controller.projection.rotate();\n const r2 = positionToRotation(p2, tilt);\n const iv = versor.interpolate(r1, r2);\n\n const transition = selection\n .transition(TRANSITION_NAME)\n .duration(Math.max(options.duration ?? defaultDuration, distance * 2_000))\n .tween('render', () => (t) => {\n const t1 = Math.max(0, Math.min(1, t * 2 - 1));\n const t2 = Math.min(1, t * 2);\n\n context.save();\n {\n context.beginPath();\n context.strokeStyle = options?.styles?.arc?.strokeStyle ?? 'yellow';\n context.lineWidth = (options?.styles?.arc?.lineWidth ?? 1.5) * (controller?.scale ?? 1);\n context.setLineDash(options?.styles?.arc?.lineDash ?? []);\n path({ type: 'LineString', coordinates: [ip(t1), ip(t2)] });\n context.stroke();\n\n context.beginPath();\n context.fillStyle = options?.styles?.cursor?.fillStyle ?? 'orange';\n path.pointRadius((options?.styles?.cursor?.pointRadius ?? 2) * (controller?.scale ?? 1));\n path({ type: 'Point', coordinates: ip(t2) });\n context.fill();\n }\n context.restore();\n\n // TODO(burdon): This has to come after rendering above. Add to features to correct order?\n projection.rotate(iv(t));\n setRotation(projection.rotate());\n });\n\n // Throws if interrupted.\n await transition.end();\n last = next;\n }\n } catch (err) {\n // Ignore.\n } finally {\n setRunning(false);\n }\n });\n\n return () => {\n clearTimeout(t);\n selection.interrupt(TRANSITION_NAME);\n };\n }\n }, [controller, running, JSON.stringify(options)]);\n\n return [running, setRunning];\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ControlPosition } from 'leaflet';\nimport React from 'react';\n\nimport { IconButton, type ThemedClassName, Toolbar } from '@dxos/react-ui';\n\nexport type ControlAction = 'toggle' | 'start' | 'zoom-in' | 'zoom-out';\n\nexport type ControlProps = ThemedClassName<{\n onAction?: (action: ControlAction) => void;\n}>;\n\nexport const controlPositions: Record<ControlPosition, string> = {\n topleft: 'top-2 left-2',\n topright: 'top-2 right-2',\n bottomleft: 'bottom-2 left-2',\n bottomright: 'bottom-2 right-2',\n};\n\nexport const ZoomControls = ({ classNames, onAction }: ControlProps) => {\n return (\n <Toolbar.Root classNames={['gap-1', classNames]}>\n <IconButton\n //\n icon='ph--plus--regular'\n label='zoom in'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('zoom-in')}\n />\n <IconButton\n //\n icon='ph--minus--regular'\n label='zoom out'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('zoom-out')}\n />\n </Toolbar.Root>\n );\n};\n\nexport const ActionControls = ({ classNames, onAction }: ControlProps) => {\n return (\n <Toolbar.Root classNames={['gap-1', classNames]}>\n <IconButton\n //\n icon='ph--play--regular'\n label='start'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('start')}\n />\n <IconButton\n //\n icon='ph--globe-hemisphere-west--regular'\n label='toggle'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('toggle')}\n />\n </Toolbar.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// eslint-disable-next-line no-restricted-imports\nimport 'leaflet/dist/leaflet.css';\n\nimport L, { Control, DomEvent, DomUtil, latLngBounds, type ControlPosition, type LatLngExpression } from 'leaflet';\nimport React, { forwardRef, useEffect, useImperativeHandle, type PropsWithChildren } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport type { MapContainerProps } from 'react-leaflet';\nimport { MapContainer, Marker, Popup, TileLayer, useMap } from 'react-leaflet';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { debounce } from '@dxos/async';\nimport { ThemeProvider, Tooltip, type ThemedClassName } from '@dxos/react-ui';\nimport { defaultTx, mx } from '@dxos/react-ui-theme';\n\nimport { ActionControls, controlPositions, ZoomControls, type ControlProps } from '../Toolbar';\nimport { type MapCanvasProps } from '../types';\n\n// TODO(burdon): Explore plugins: https://www.npmjs.com/search?q=keywords%3Areact-leaflet-v4\n// TODO(burdon): react-leaflet v5 is not compatible with react 18.\n\nconst defaults = {\n // TODO(burdon): Guess location.\n center: { lat: 51, lng: 0 } as L.LatLngExpression,\n zoom: 4,\n};\n\n//\n// Root\n//\n\ntype MapRootProps = ThemedClassName<MapContainerProps>;\n\n// https://react-leaflet.js.org/docs/api-map\nconst MapRoot = ({ classNames, center = defaults.center, zoom = defaults.zoom, ...props }: MapRootProps) => {\n return (\n <MapContainer\n className={mx('relative flex w-full h-full grow bg-baseSurface', classNames)}\n attributionControl={false}\n // TODO(burdon): Only if attention.\n scrollWheelZoom={true}\n zoomControl={false}\n center={center}\n zoom={zoom}\n {...props}\n />\n );\n};\n\n//\n// Control\n//\n\n// TODO(burdon): Normalize with Globe.\ntype MapController = {\n setCenter: (center: LatLngExpression, zoom?: number) => void;\n setZoom: (cb: (zoom: number) => number) => void;\n};\n\nconst MapCanvas = forwardRef<MapController, MapCanvasProps>(({ markers, center, zoom, onChange }, forwardedRef) => {\n const { ref, width, height } = useResizeDetector({ refreshRate: 200 });\n const map = useMap();\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n setCenter: (center: LatLngExpression, zoom?: number) => {\n map.setView(center, zoom);\n },\n setZoom: (cb) => {\n map.setZoom(cb(map.getZoom()));\n },\n }),\n [map],\n );\n\n // Resize.\n useEffect(() => {\n if (width && height) {\n map.invalidateSize();\n }\n }, [width, height]);\n\n // Position.\n useEffect(() => {\n if (center) {\n map.setView(center, zoom);\n } else if (zoom !== undefined) {\n map.setZoom(zoom);\n }\n }, [center, zoom]);\n\n // Events.\n useEffect(() => {\n const handler = debounce(() => {\n onChange?.({ center: map.getCenter(), zoom: map.getZoom() });\n }, 100);\n map.on('move', handler);\n map.on('zoom', handler);\n return () => {\n map.off('move', handler);\n map.off('zoom', handler);\n };\n }, [map, onChange]);\n\n // Set the viewport around the markers, or show the whole world map if `markers` is empty.\n useEffect(() => {\n if (markers.length > 0) {\n const bounds = latLngBounds(markers.map((marker) => marker.location));\n map.fitBounds(bounds);\n } else {\n map.setView(defaults.center, defaults.zoom);\n }\n }, [markers]);\n\n return (\n <div ref={ref} className='flex w-full h-full overflow-hidden bg-baseSurface'>\n {/* Map tiles. */}\n <TileLayer\n className='dark:filter dark:grayscale dark:invert'\n url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'\n />\n\n {/* Markers. */}\n {markers?.map(({ id, title, location: { lat, lng } }) => {\n return (\n <Marker\n key={id}\n position={{ lat, lng }}\n icon={\n // TODO(burdon): Create custom icon from bundled assets.\n new L.Icon({\n iconUrl: 'https://dxos.network/marker-icon.png',\n iconRetinaUrl: 'https://dxos.network/marker-icon-2x.png',\n shadowUrl: 'https://dxos.network/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41],\n })\n }\n >\n {title && <Popup>{title}</Popup>}\n </Marker>\n );\n })}\n </div>\n );\n});\n\n//\n// Controls\n// Integrates with Leaflet custom controls.\n//\n\nconst CustomControl = ({\n position,\n children,\n}: PropsWithChildren<{\n position: ControlPosition;\n}>) => {\n const map = useMap();\n\n useEffect(() => {\n const control = new Control({ position });\n control.onAdd = () => {\n const container = DomUtil.create('div', mx('!m-0', controlPositions[position]));\n DomEvent.disableClickPropagation(container);\n DomEvent.disableScrollPropagation(container);\n\n const root = createRoot(container);\n root.render(\n <ThemeProvider tx={defaultTx}>\n <Tooltip.Provider>{children}</Tooltip.Provider>\n </ThemeProvider>,\n );\n\n return container;\n };\n\n control.addTo(map);\n return () => {\n control.remove();\n };\n }, [map, position, children]);\n\n return null;\n};\n\ntype MapControlProps = { position?: ControlPosition } & Pick<ControlProps, 'onAction'>;\n\n//\n// Map\n//\n\nexport const Map = {\n Root: MapRoot,\n Canvas: MapCanvas,\n Zoom: ({ onAction, position = 'bottomleft', ...props }: MapControlProps) => (\n <CustomControl position={position} {...props}>\n <ZoomControls onAction={onAction} />\n </CustomControl>\n ),\n Action: ({ onAction, position = 'bottomright', ...props }: MapControlProps) => (\n <CustomControl position={position} {...props}>\n <ActionControls onAction={onAction} />\n </CustomControl>\n ),\n};\n\nexport { type MapCanvasProps, type MapController };\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "import_react_ui", "import_d3", "import_versor", "import_leaflet", "import_react_resize_detector", "import_react_ui_theme", "GlobeContext", "createContext", "undefined", "GlobeContextProvider", "children", "size", "center", "_center", "scale", "_scale", "translation", "_translation", "rotation", "_rotation", "setCenter", "useControlledState", "setScale", "setTranslation", "setRotation", "React", "Provider", "value", "useGlobeContext", "useContext", "raise", "Error", "debug", "timer", "cb", "start", "Date", "now", "data", "t", "console", "log", "restrictAxis", "axis", "original", "current", "map", "d", "i", "geoInertiaDrag", "target", "render", "projection", "options", "node", "select", "inertia", "geoInertiaDragHelper", "rotate", "xAxis", "move", "end", "stop", "finish", "time", "hold", "call", "drag", "on", "opt", "v0", "r0", "q0", "v10", "v11", "q10", "inertiaHelper", "versor", "cartesian", "invert", "position", "inv", "isNaN", "v1", "q1", "multiply", "delta", "r1", "r2", "velocity", "A", "limit", "B", "Math", "ev", "x", "y", "classList", "remove", "add", "performance", "deltaTime", "decay", "exp", "deltaPos", "v", "self", "restart", "e", "positionToRotation", "lng", "lat", "tilt", "geoToPosition", "geoPoint", "point", "type", "coordinates", "geoCircle", "radius", "d3GeoCircle", "geoLine", "p1", "p2", "closestPoint", "points", "length", "minDistance", "getDistance", "distance", "point1", "point2", "dx", "dy", "sqrt", "createLayers", "topology", "features", "styles", "layers", "water", "push", "path", "graticule", "geoGraticule", "step", "objects", "land", "feature", "countries", "border", "mesh", "a", "b", "dots", "lines", "geometries", "line", "source", "renderLayers", "generator", "context", "canvas", "width", "height", "reset", "background", "fillStyle", "fillRect", "clearRect", "forEach", "save", "fill", "stroke", "Object", "entries", "key", "pointRadius", "beginPath", "restore", "useDrag", "controller", "useEffect", "disabled", "onUpdate", "cancelDrag", "JSON", "stringify", "useGlobeZoomHandler", "useCallback", "event", "useMapZoomHandler", "setZoom", "useSpinner", "running", "setRunning", "useState", "lastRotation", "d3Timer", "elapsed", "dt", "TRANSITION_NAME", "defaultDuration", "useTour", "selection", "useMemo", "d3Selection", "interrupt", "setTimeout", "getContext", "alpha", "geoPath", "last", "p", "loop", "next", "ip", "geoInterpolate", "geoDistance", "iv", "interpolate", "transition", "duration", "max", "tween", "t1", "min", "t2", "strokeStyle", "arc", "lineWidth", "setLineDash", "lineDash", "cursor", "err", "clearTimeout", "controlPositions", "topleft", "topright", "bottomleft", "bottomright", "ZoomControls", "classNames", "onAction", "Toolbar", "Root", "IconButton", "icon", "label", "iconOnly", "onClick", "ActionControls", "defaultStyles", "light", "strokeWidth", "dark", "projectionMap", "orthographic", "geoOrthographic", "mercator", "geoMercator", "geoTransverseMercator", "getProjection", "constructor", "GlobeRoot", "props", "ref", "useResizeDetector", "div", "className", "mx", "GlobeCanvas", "forwardRef", "_projection", "_styles", "themeMode", "useThemeContext", "setCanvas", "canvasRef", "scaleRef", "useDynamicRef", "zooming", "useRef", "useImperativeHandle", "s", "is", "interpolateNumber", "ease", "easeLinear", "easeSinOut", "translate", "GlobeDebug", "pre", "GlobePanel", "CustomControl", "Globe", "Canvas", "Zoom", "Action", "Debug", "Panel", "defaults", "zoom", "MapRoot", "MapContainer", "attributionControl", "scrollWheelZoom", "zoomControl", "MapCanvas", "markers", "onChange", "forwardedRef", "refreshRate", "useMap", "setView", "getZoom", "invalidateSize", "handler", "debounce", "getCenter", "off", "bounds", "latLngBounds", "marker", "location", "fitBounds", "TileLayer", "url", "id", "title", "Marker", "L", "Icon", "iconUrl", "iconRetinaUrl", "shadowUrl", "iconSize", "iconAnchor", "popupAnchor", "shadowSize", "Popup", "control", "Control", "onAdd", "container", "DomUtil", "create", "DomEvent", "disableClickPropagation", "disableScrollPropagation", "root", "createRoot", "ThemeProvider", "tx", "defaultTx", "Tooltip", "addTo", "Map"]
4
+ "sourcesContent": ["//\n// Copyright 2018 DXOS.org\n//\n\nimport * as d3 from 'd3';\nimport { type GeoProjection } from 'd3';\nimport { type ControlPosition } from 'leaflet';\nimport React, {\n type PropsWithChildren,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { type Topology } from 'topojson-specification';\n\nimport { type ThemedClassName, type ThemeMode, useDynamicRef, useThemeContext } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport {\n GlobeContextProvider,\n type GlobeContextProviderProps,\n type GlobeContextType,\n useGlobeContext,\n} from '../../hooks';\nimport {\n type Features,\n type StyleSet,\n createLayers,\n geoToPosition,\n positionToRotation,\n renderLayers,\n timer,\n} from '../../util';\nimport { ZoomControls, ActionControls, type ControlProps, controlPositions } from '../Toolbar';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute\n */\nconst defaultStyles: Record<ThemeMode, StyleSet> = {\n light: {\n background: {\n fillStyle: '#EEE',\n },\n\n water: {\n fillStyle: '#555',\n },\n\n land: {\n fillStyle: '#999',\n },\n\n line: {\n strokeStyle: 'darkred',\n },\n\n point: {\n fillStyle: '#111111',\n strokeStyle: '#111111',\n strokeWidth: 1,\n pointRadius: 0.5,\n },\n },\n dark: {\n background: {\n fillStyle: '#111111',\n },\n\n water: {\n fillStyle: '#123E6A',\n },\n\n land: {\n fillStyle: '#032153',\n },\n\n line: {\n strokeStyle: '#111111',\n },\n\n point: {\n fillStyle: '#111111',\n strokeStyle: '#111111',\n strokeWidth: 1,\n pointRadius: 0.5,\n },\n },\n};\n\nexport type GlobeController = {\n canvas: HTMLCanvasElement;\n projection: GeoProjection;\n} & Pick<GlobeContextType, 'scale' | 'translation' | 'rotation' | 'setScale' | 'setTranslation' | 'setRotation'>;\n\nexport type ProjectionType = 'orthographic' | 'mercator' | 'transverse-mercator';\n\nconst projectionMap: Record<ProjectionType, () => GeoProjection> = {\n orthographic: d3.geoOrthographic,\n mercator: d3.geoMercator,\n 'transverse-mercator': d3.geoTransverseMercator,\n};\n\nconst getProjection = (type: GlobeCanvasProps['projection'] = 'orthographic'): GeoProjection => {\n if (typeof type === 'string') {\n const constructor = projectionMap[type] ?? d3.geoOrthographic;\n return constructor();\n }\n\n return type ?? d3.geoOrthographic();\n};\n\n//\n// Root\n//\n\ntype GlobeRootProps = PropsWithChildren<ThemedClassName<GlobeContextProviderProps>>;\n\nconst GlobeRoot = ({ classNames, children, ...props }: GlobeRootProps) => {\n const { ref, width, height } = useResizeDetector<HTMLDivElement>();\n return (\n <div ref={ref} className={mx('relative flex grow overflow-hidden', classNames)}>\n <GlobeContextProvider size={{ width, height }} {...props}>\n {children}\n </GlobeContextProvider>\n </div>\n );\n};\n\n//\n// Canvas\n//\n\ntype GlobeCanvasProps = {\n projection?: ProjectionType | GeoProjection;\n topology?: Topology;\n features?: Features;\n styles?: StyleSet;\n};\n\n/**\n * Basic globe renderer.\n * https://github.com/topojson/world-atlas\n */\nconst GlobeCanvas = forwardRef<GlobeController, GlobeCanvasProps>(\n ({ projection: _projection, topology, features, styles: _styles }, forwardRef) => {\n const { themeMode } = useThemeContext();\n const styles = useMemo(() => _styles ?? defaultStyles[themeMode], [_styles, themeMode]);\n\n // Canvas.\n const [canvas, setCanvas] = useState<HTMLCanvasElement>(null);\n const canvasRef = (canvas: HTMLCanvasElement) => setCanvas(canvas);\n\n // Projection.\n const projection = useMemo(() => getProjection(_projection), [_projection]);\n\n // Layers.\n // TODO(burdon): Generate on the fly based on what is visible.\n const layers = useMemo(() => {\n return timer(() => createLayers(topology as Topology, features, styles));\n }, [topology, features, styles]);\n\n // State.\n const { size, center, scale, translation, rotation, setCenter, setScale, setTranslation, setRotation } =\n useGlobeContext();\n\n const scaleRef = useDynamicRef(scale);\n\n // Update rotation.\n useEffect(() => {\n if (center) {\n setScale(1);\n setRotation(positionToRotation(geoToPosition(center)));\n }\n }, [center]);\n\n // External controller.\n const zooming = useRef(false);\n useImperativeHandle<GlobeController, GlobeController>(\n forwardRef,\n () => {\n return {\n canvas,\n projection,\n center,\n get scale() {\n return scaleRef.current;\n },\n translation,\n rotation,\n setCenter,\n setScale: (s) => {\n if (typeof s === 'function') {\n const is = d3.interpolateNumber(scaleRef.current, s(scaleRef.current));\n // Stop easing if already zooming.\n d3.transition()\n .ease(zooming.current ? d3.easeLinear : d3.easeSinOut)\n .duration(200)\n .tween('scale', () => (t) => setScale(is(t)))\n .on('end', () => {\n zooming.current = false;\n });\n } else {\n setScale(s);\n }\n },\n setTranslation,\n setRotation,\n };\n },\n [canvas],\n );\n\n // https://d3js.org/d3-geo/path#geoPath\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext\n const generator = useMemo(\n () => canvas && projection && d3.geoPath(projection, canvas.getContext('2d', { alpha: false })),\n [canvas, projection],\n );\n\n // Render on change.\n useEffect(() => {\n if (canvas && projection) {\n timer(() => {\n // https://d3js.org/d3-geo/projection\n projection\n .scale((Math.min(size.width, size.height) / 2) * scale)\n .translate([size.width / 2 + (translation?.x ?? 0), size.height / 2 + (translation?.y ?? 0)])\n .rotate(rotation ?? [0, 0, 0]);\n\n renderLayers(generator, layers, scale, styles);\n });\n }\n }, [generator, size, scale, translation, rotation, layers]);\n\n if (!size.width || !size.height) {\n return null;\n }\n\n return <canvas ref={canvasRef} width={size.width} height={size.height} />;\n },\n);\n\nconst GlobeDebug = ({ position = 'topleft' }: { position?: ControlPosition }) => {\n const { size, scale, translation, rotation } = useGlobeContext();\n return (\n <div\n className={mx(\n 'z-10 absolute w-96 p-2 overflow-hidden border border-green-700 rounded',\n controlPositions[position],\n )}\n >\n <pre className='font-mono text-xs text-green-700'>\n {JSON.stringify({ size, scale, translation, rotation }, null, 2)}\n </pre>\n </div>\n );\n};\n\nconst GlobePanel = ({\n position,\n classNames,\n children,\n}: ThemedClassName<PropsWithChildren & { position?: ControlPosition }>) => {\n return <div className={mx('z-10 absolute overflow-hidden', controlPositions[position], classNames)}>{children}</div>;\n};\n\nconst CustomControl = ({ position, children }: PropsWithChildren<{ position: ControlPosition }>) => {\n return <div className={mx('z-10 absolute overflow-hidden', controlPositions[position])}>{children}</div>;\n};\n\ntype GlobeControlProps = { position?: ControlPosition } & Pick<ControlProps, 'onAction'>;\n\nexport const Globe = {\n Root: GlobeRoot,\n Canvas: GlobeCanvas,\n Zoom: ({ onAction, position = 'bottomleft', ...props }: GlobeControlProps) => (\n <CustomControl position={position} {...props}>\n <ZoomControls onAction={onAction} />\n </CustomControl>\n ),\n Action: ({ onAction, position = 'bottomright', ...props }: GlobeControlProps) => (\n <CustomControl position={position} {...props}>\n <ActionControls onAction={onAction} />\n </CustomControl>\n ),\n Debug: GlobeDebug,\n Panel: GlobePanel,\n};\n\nexport type { GlobeRootProps, GlobeCanvasProps };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { createContext, type Dispatch, type PropsWithChildren, type SetStateAction, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { useControlledState } from '@dxos/react-ui';\n\nimport { type LatLng } from '../util';\n\n// TODO(burdon): Factor out common geometry types.\nexport type Size = { width: number; height: number };\nexport type Point = { x: number; y: number };\nexport type Vector = [number, number, number];\n\nexport type GlobeContextType = {\n size: Size;\n center: LatLng;\n scale: number;\n translation: Point;\n rotation: Vector;\n setCenter: Dispatch<SetStateAction<LatLng>>;\n setScale: Dispatch<SetStateAction<number>>;\n setTranslation: Dispatch<SetStateAction<Point>>;\n setRotation: Dispatch<SetStateAction<Vector>>;\n};\n\nconst GlobeContext = createContext<GlobeContextType>(undefined);\n\nexport type GlobeContextProviderProps = PropsWithChildren<\n Partial<Pick<GlobeContextType, 'size' | 'center' | 'scale' | 'translation' | 'rotation'>>\n>;\n\nexport const GlobeContextProvider = ({\n children,\n size,\n center: _center,\n scale: _scale,\n translation: _translation,\n rotation: _rotation,\n}: GlobeContextProviderProps) => {\n const [center, setCenter] = useControlledState(_center);\n const [scale, setScale] = useControlledState(_scale);\n const [translation, setTranslation] = useControlledState<Point>(_translation);\n const [rotation, setRotation] = useControlledState<Vector>(_rotation);\n\n return (\n <GlobeContext.Provider\n value={{ size, center, scale, translation, rotation, setCenter, setScale, setTranslation, setRotation }}\n >\n {children}\n </GlobeContext.Provider>\n );\n};\n\nexport const useGlobeContext = () => {\n return useContext(GlobeContext) ?? raise(new Error('Missing GlobeContext'));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as d3 from 'd3';\nimport { useEffect } from 'react';\n\nimport { type GlobeController } from '../components';\nimport { geoInertiaDrag } from '../util';\n\nexport type GlobeDragEvent = {\n type: 'start' | 'move' | 'end';\n controller: GlobeController;\n};\n\nexport type DragOptions = {\n disabled?: boolean;\n duration?: number;\n xAxis?: boolean; // TODO(burdon): Generalize.\n onUpdate?: (event: GlobeDragEvent) => void;\n};\n\n/**\n * Allows user to drag globe.\n */\nexport const useDrag = (controller?: GlobeController | null, options: DragOptions = {}) => {\n useEffect(() => {\n const canvas = controller?.canvas;\n if (!canvas || options.disabled) {\n return;\n }\n\n geoInertiaDrag(\n d3.select(canvas),\n () => {\n controller.setRotation(controller.projection.rotate());\n options.onUpdate?.({ type: 'move', controller });\n },\n controller.projection,\n {\n xAxis: options.xAxis,\n time: 3_000,\n start: () => options.onUpdate?.({ type: 'start', controller }),\n finish: () => options.onUpdate?.({ type: 'end', controller }),\n },\n );\n\n // TODO(burdon): Cancel drag timer.\n return () => {\n cancelDrag(d3.select(canvas));\n };\n }, [controller, JSON.stringify(options)]);\n};\n\nconst cancelDrag = (node) => node.on('.drag', null);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nconst debug = false;\n\nexport const timer = <T = void>(cb: () => T): T => {\n const start = Date.now();\n const data = cb();\n const t = Date.now() - start / 1_000;\n if (debug) {\n // eslint-disable-next-line no-console\n console.log({ t, data });\n }\n\n return data;\n};\n", "//\n// Copyright 2017 Philippe Rivière\n// Copyright 2024 DXOS.org\n// https://github.com/Fil/d3-inertia\n//\n\nimport * as d3 from 'd3';\nimport versor from 'versor';\n\nexport const restrictAxis =\n (axis: boolean[]) =>\n (original: number[], current: number[]): number[] =>\n current.map((d, i) => (axis[i] ? d : original[i]));\n\n/**\n * Applies a drag handler to the specified target element.\n */\n// TODO(burdon): Define type.\nexport const geoInertiaDrag = (target, render, projection, options) => {\n if (!options) {\n options = {};\n }\n\n // Target can be an element, a selector, a function, or a selection\n // but in case of a selection we make sure to reselect it with d3-selection.\n if (target.node) {\n target = target.node();\n }\n target = d3.select(target);\n\n // Complete params: (projection, render, startDrag, dragging, endDrag).\n const inertia = geoInertiaDragHelper({\n projection,\n render: (rotation) => {\n projection.rotate(rotation);\n render && render();\n },\n axis: restrictAxis(options.xAxis ? [true, false, false] : [true, true, true]),\n start: options.start,\n move: options.move,\n end: options.end,\n stop: options.stop,\n finish: options.finish,\n time: options.time,\n hold: options.hold,\n });\n\n target.call(d3.drag().on('start', inertia.start).on('drag', inertia.move).on('end', inertia.end));\n return inertia;\n};\n\n/**\n * A versor is a compact way to describe a rotation in 3D space.\n * It consists of four components [𝑤,x,y,z], where:\n * 𝑤 is a scalar representing the angle of rotation.\n * x, y, z are the vector components, representing the axis of rotation.\n */\nconst geoInertiaDragHelper = (opt) => {\n const projection = opt.projection;\n\n let v0; // Mouse position in Cartesian coordinates at start of drag gesture.\n let r0; // Projection rotation as Euler angles at start.\n let q0; // Projection rotation as versor at start.\n let v10; // Mouse position in Cartesian coordinates just before end of drag gesture.\n let v11; // Mouse position in Cartesian coordinates at end.\n let q10; // Projection rotation as versor at end.\n\n const inertia = inertiaHelper({\n axis: opt.axis,\n\n start: () => {\n v0 = versor.cartesian(projection.invert(inertia.position));\n r0 = projection.rotate();\n q0 = versor(r0);\n opt.start && opt.start();\n },\n\n move: () => {\n const inv = projection.rotate(r0).invert(inertia.position);\n if (isNaN(inv[0])) {\n return;\n }\n const v1 = versor.cartesian(inv);\n const q1 = versor.multiply(q0, versor.delta(v0, v1));\n const r1 = versor.rotation(q1);\n const r2 = opt.axis(r0, r1);\n opt.render(r2);\n opt.move && opt.move();\n },\n\n end: () => {\n // Velocity.\n v10 = versor.cartesian(projection.invert(inertia.position.map((d, i) => d - inertia.velocity[i] / 1_000)));\n q10 = versor(projection.rotate());\n v11 = versor.cartesian(projection.invert(inertia.position));\n opt.end && opt.end();\n },\n\n stop: opt.stop,\n\n finish: opt.finish,\n\n render: (t) => {\n const r1 = versor.rotation(versor.multiply(q10, versor.delta(v10, v11, t * 1_000)));\n const r2 = opt.axis(r0, r1);\n opt.render && opt.render(r2);\n },\n\n time: opt.time,\n });\n\n return inertia;\n};\n\nfunction inertiaHelper(opt) {\n const A = opt.time || 5_000; // Reference time in ms.\n const limit = 1.0001;\n const B = -Math.log(1 - 1 / limit);\n const inertia = {\n position: [0, 0],\n velocity: [0, 0], // Velocity in pixels/s.\n timer: d3.timer(() => {}),\n time: 0,\n t: 0,\n\n start: function (ev) {\n const position = [ev.x, ev.y];\n inertia.position = position;\n inertia.velocity = [0, 0];\n inertia.timer.stop();\n this.classList.remove('inertia');\n this.classList.add('dragging');\n opt.start && opt.start.call(this, position);\n },\n\n move: function (ev) {\n const position = [ev.x, ev.y];\n\n const time = performance.now();\n const deltaTime = time - inertia.time;\n const decay = 1 - Math.exp(-deltaTime / 1_000);\n inertia.velocity = inertia.velocity.map((d, i) => {\n const deltaPos = position[i] - inertia.position[i];\n const deltaTime = time - inertia.time;\n return (1_000 * (1 - decay) * deltaPos) / deltaTime + d * decay;\n });\n\n // Clamp velocity axis.\n inertia.velocity = opt.axis([0, 0], inertia.velocity);\n\n inertia.time = time;\n inertia.position = position;\n opt.move && opt.move.call(this, position);\n },\n\n end: function (ev) {\n this.classList.remove('dragging', 'inertia');\n\n const v = inertia.velocity;\n if (v[0] * v[0] + v[1] * v[1] < 100) {\n inertia.timer.stop();\n return opt.stop && opt.stop();\n }\n\n const time = performance.now();\n const deltaTime = time - inertia.time;\n\n if (opt.hold === undefined) {\n opt.hold = 100;\n } // Default flick->drag threshold time (0 disables inertia).\n\n if (deltaTime >= opt.hold) {\n inertia.timer.stop();\n return opt.stop && opt.stop();\n }\n\n this.classList.add('inertia');\n opt.end && opt.end();\n\n const self = this;\n inertia.timer.restart((e) => {\n inertia.t = limit * (1 - Math.exp((-B * e) / A));\n opt.render && opt.render(inertia.t);\n if (inertia.t > 1) {\n inertia.timer.stop();\n self.classList.remove('inertia');\n inertia.velocity = [0, 0];\n inertia.t = 1;\n opt.finish && opt.finish();\n }\n });\n },\n };\n\n inertia.timer.stop();\n return inertia;\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport * as d3 from 'd3';\nimport { type GeoGeometryObjects } from 'd3';\nimport { type Point, type Polygon, type Position } from 'geojson';\n\nimport type { Vector } from '../hooks';\n\nexport type LatLng = { lat: number; lng: number };\n\n// TODO(burdon): Clean-up.\n\nexport const positionToRotation = ([lng, lat]: [number, number], tilt = 0): Vector => [-lng, tilt - lat, 0];\n\nexport const geoToPosition = ({ lat, lng }: LatLng): [number, number] => [lng, lat];\n\nexport const geoPoint = (point: LatLng): Point => ({ type: 'Point', coordinates: geoToPosition(point) });\n\n// https://github.com/d3/d3-geo#geoCircle\nexport const geoCircle = ({ lat, lng }: LatLng, radius: number): Polygon =>\n d3.geoCircle().radius(radius).center([lng, lat])();\n\nexport const geoLine = (p1: LatLng, p2: LatLng): GeoGeometryObjects => ({\n type: 'LineString',\n coordinates: [\n [p1.lng, p1.lat],\n [p2.lng, p2.lat],\n ],\n});\n\nexport const closestPoint = (points: Position[], target: Position): Position | null => {\n if (points.length === 0) {\n return target;\n }\n\n let closestPoint = points[0];\n let minDistance = getDistance(points[0], target);\n\n for (const point of points) {\n const distance = getDistance(point, target);\n if (distance < minDistance) {\n minDistance = distance;\n closestPoint = point;\n }\n }\n\n return closestPoint;\n};\n\nexport const getDistance = (point1: Position, point2: Position): number => {\n const dx = point1[0] - point2[0];\n const dy = point1[1] - point2[1];\n return Math.sqrt(dx * dx + dy * dy);\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport * as d3 from 'd3';\nimport { type GeoPath, type GeoPermissibleObjects } from 'd3';\nimport * as topojson from 'topojson-client';\nimport { type Topology } from 'topojson-specification';\n\nimport { type LatLng, geoLine, geoPoint } from './path';\n\nexport type Styles = Record<string, any>;\n\nexport type Style =\n | 'background'\n | 'water'\n | 'graticule'\n | 'land'\n | 'border'\n | 'dots'\n | 'point'\n | 'line'\n | 'cursor'\n | 'arc';\n\nexport type StyleSet = Partial<Record<Style, Styles>>;\n\nexport type Features = {\n points?: LatLng[];\n lines?: { source: LatLng; target: LatLng }[];\n};\n\nexport type Layer = {\n styles: Styles;\n path: GeoPermissibleObjects;\n};\n\n/**\n * Create rendering layers.\n */\nexport const createLayers = (topology: Topology, features: Features, styles: StyleSet): Layer[] => {\n const layers: Layer[] = [];\n\n if (styles.water) {\n layers.push({\n styles: styles.water,\n path: {\n type: 'Sphere',\n },\n });\n }\n\n if (styles.graticule) {\n layers.push({\n styles: styles.graticule,\n path: d3.geoGraticule().step([6, 6])(),\n });\n }\n\n //\n // Topology.\n //\n\n if (topology) {\n if (topology.objects.land && styles.land) {\n layers.push({\n styles: styles.land,\n path: topojson.feature(topology, topology.objects.land),\n });\n }\n\n if (topology.objects.countries && styles.border) {\n layers.push({\n styles: styles.border,\n path: topojson.mesh(topology, topology.objects.countries, (a: any, b: any) => a !== b),\n });\n }\n\n if (topology.objects.dots && styles.dots) {\n layers.push({\n styles: styles.dots,\n path: topology.objects.dots as any, // TODO(burdon): Type.\n });\n }\n }\n\n //\n // Features.\n //\n\n if (features) {\n const { points, lines } = features;\n\n if (points && styles.point) {\n layers.push({\n styles: styles.point,\n path: {\n type: 'GeometryCollection',\n geometries: points.map((point) => geoPoint(point)),\n },\n });\n }\n\n if (lines && styles.line) {\n layers.push({\n styles: styles.line,\n path: {\n type: 'GeometryCollection',\n geometries: lines.map(({ source, target }) => geoLine(source, target)),\n },\n });\n }\n }\n\n return layers;\n};\n\n/**\n * Render layers created above.\n */\nexport const renderLayers = (generator: GeoPath, layers: Layer[] = [], scale: number, styles: StyleSet) => {\n const context: CanvasRenderingContext2D = generator.context();\n const {\n canvas: { width, height },\n } = context;\n context.reset();\n\n // Clear background.\n if (styles.background) {\n context.fillStyle = styles.background.fillStyle;\n context.fillRect(0, 0, width, height);\n } else {\n context.clearRect(0, 0, width, height);\n }\n\n // Render features.\n // https://github.com/d3/d3-geo#_path\n layers.forEach(({ path, styles }) => {\n context.save();\n let fill = false;\n let stroke = false;\n if (styles) {\n Object.entries(styles).forEach(([key, value]) => {\n if (key === 'pointRadius') {\n generator.pointRadius(value * scale);\n } else {\n context[key] = value;\n fill ||= key === 'fillStyle';\n stroke ||= key === 'strokeStyle';\n }\n });\n }\n\n context.beginPath();\n\n generator(path);\n fill && context.fill();\n stroke && context.stroke();\n context.restore();\n });\n\n return context;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { type GlobeController, type ControlProps } from '../components';\n\nexport const useGlobeZoomHandler = (controller: GlobeController | null | undefined): ControlProps['onAction'] => {\n return useCallback<ControlProps['onAction']>(\n (event) => {\n if (!controller) {\n return;\n }\n\n switch (event) {\n case 'zoom-in': {\n controller.setScale((scale) => scale * 1.1);\n break;\n }\n case 'zoom-out': {\n controller.setScale((scale) => scale * 0.9);\n break;\n }\n }\n },\n [controller],\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { type MapController, type ControlProps } from '../components';\n\nexport const useMapZoomHandler = (controller: MapController | null | undefined): ControlProps['onAction'] => {\n return useCallback<ControlProps['onAction']>(\n (event) => {\n if (!controller) {\n return;\n }\n\n switch (event) {\n case 'zoom-in': {\n controller.setZoom((scale) => scale + 1);\n break;\n }\n case 'zoom-out': {\n controller.setZoom((scale) => scale - 1);\n break;\n }\n }\n },\n [controller],\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as d3 from 'd3';\nimport { type Timer } from 'd3';\nimport { useEffect, useState } from 'react';\n\nimport { type Vector } from './context';\nimport { type GlobeController } from '../components';\n\nexport type SpinnerOptions = {\n disabled?: boolean;\n delta?: Vector;\n};\n\n/**\n * Rotates globe.\n */\nexport const useSpinner = (controller?: GlobeController | null, options: SpinnerOptions = {}) => {\n const [running, setRunning] = useState(false);\n useEffect(() => {\n let timer: Timer | undefined;\n\n const start = () => {\n const delta: Vector = options.delta ?? [0.001, 0, 0];\n\n let t = 0;\n let lastRotation = controller.projection.rotate();\n timer = d3.timer((elapsed) => {\n const dt = elapsed - t;\n t = elapsed;\n\n const rotation: Vector = [\n lastRotation[0] + delta[0] * dt,\n lastRotation[1] + delta[1] * dt,\n lastRotation[2] + delta[2] * dt,\n ];\n\n lastRotation = rotation;\n controller.setRotation(rotation);\n });\n };\n\n const stop = () => {\n if (timer) {\n timer.stop();\n timer = undefined;\n }\n };\n\n if (controller && running) {\n start();\n } else {\n stop();\n }\n\n return () => stop();\n }, [controller, running]);\n\n return [\n () => {\n if (!options.disabled) {\n setRunning(true);\n }\n },\n () => setRunning(false),\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as d3 from 'd3';\nimport { type Dispatch, type SetStateAction, useEffect, useState } from 'react';\nimport versor from 'versor';\n\nimport { log } from '@dxos/log';\n\nimport type { GlobeController } from '../components';\nimport { geoToPosition, type LatLng, positionToRotation, type StyleSet } from '../util';\n\nconst TRANSITION_NAME = 'globe-tour';\n\nconst defaultDuration = 1_500;\n\nexport type TourOptions = {\n running?: boolean;\n disabled?: boolean;\n duration?: number;\n loop?: boolean;\n tilt?: number;\n autoRotate?: boolean;\n styles?: StyleSet;\n};\n\n/**\n * Iterates between points.\n * Inspired by: https://observablehq.com/@mbostock/top-100-cities\n */\nexport const useTour = (\n controller?: GlobeController | null,\n points?: LatLng[],\n options: TourOptions = {},\n): [boolean, Dispatch<SetStateAction<boolean>>] => {\n const selection = d3.selection();\n const [running, setRunning] = useState(options.running ?? false);\n useEffect(() => {\n if (!running) {\n selection.interrupt(TRANSITION_NAME);\n return;\n }\n\n let t: ReturnType<typeof setTimeout>;\n if (controller && running) {\n t = setTimeout(async () => {\n const { canvas, projection, setRotation } = controller;\n const context = canvas.getContext('2d', { alpha: false });\n const path = d3.geoPath(projection, context).pointRadius(2);\n\n const tilt = options.tilt ?? 0;\n let last: LatLng;\n try {\n const p = [...points];\n if (options.loop) {\n p.push(p[0]);\n }\n\n for (const next of p) {\n if (!running) {\n break;\n }\n\n // Points.\n const p1 = last ? geoToPosition(last) : undefined;\n const p2 = geoToPosition(next);\n const ip = d3.geoInterpolate(p1 || p2, p2);\n const distance = d3.geoDistance(p1 || p2, p2);\n\n // Rotation.\n const r1 = p1 ? positionToRotation(p1, tilt) : controller.projection.rotate();\n const r2 = positionToRotation(p2, tilt);\n const iv = versor.interpolate(r1, r2);\n\n const transition = selection\n .transition(TRANSITION_NAME)\n .duration(Math.max(options.duration ?? defaultDuration, distance * 2_000))\n .tween('render', () => (t) => {\n const t1 = Math.max(0, Math.min(1, t * 2 - 1));\n const t2 = Math.min(1, t * 2);\n\n context.save();\n {\n context.beginPath();\n context.strokeStyle = options?.styles?.arc?.strokeStyle ?? 'yellow';\n context.lineWidth = (options?.styles?.arc?.lineWidth ?? 1.5) * (controller?.scale ?? 1);\n context.setLineDash(options?.styles?.arc?.lineDash ?? []);\n path({ type: 'LineString', coordinates: [ip(t1), ip(t2)] });\n context.stroke();\n\n context.beginPath();\n context.fillStyle = options?.styles?.cursor?.fillStyle ?? 'orange';\n path.pointRadius((options?.styles?.cursor?.pointRadius ?? 2) * (controller?.scale ?? 1));\n path({ type: 'Point', coordinates: ip(t2) });\n context.fill();\n }\n context.restore();\n\n // TODO(burdon): This has to come after rendering above. Add to features to correct order?\n if (options.autoRotate) {\n projection.rotate(iv(t));\n setRotation(projection.rotate());\n }\n });\n\n // Throws if interrupted.\n await transition.end();\n last = next;\n }\n } catch (err) {\n log.catch(err);\n } finally {\n setRunning(false);\n }\n });\n\n return () => {\n clearTimeout(t);\n selection.interrupt(TRANSITION_NAME);\n };\n }\n }, [controller, running, JSON.stringify(options)]);\n\n return [running, setRunning];\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ControlPosition } from 'leaflet';\nimport React from 'react';\n\nimport { IconButton, type ThemedClassName, Toolbar } from '@dxos/react-ui';\n\nexport type ControlAction = 'toggle' | 'start' | 'zoom-in' | 'zoom-out';\n\nexport type ControlProps = ThemedClassName<{\n onAction?: (action: ControlAction) => void;\n}>;\n\nexport const controlPositions: Record<ControlPosition, string> = {\n topleft: 'top-2 left-2',\n topright: 'top-2 right-2',\n bottomleft: 'bottom-2 left-2',\n bottomright: 'bottom-2 right-2',\n};\n\nexport const ZoomControls = ({ classNames, onAction }: ControlProps) => {\n return (\n <Toolbar.Root classNames={['gap-1', classNames]}>\n <IconButton\n //\n icon='ph--plus--regular'\n label='zoom in'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('zoom-in')}\n />\n <IconButton\n //\n icon='ph--minus--regular'\n label='zoom out'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('zoom-out')}\n />\n </Toolbar.Root>\n );\n};\n\nexport const ActionControls = ({ classNames, onAction }: ControlProps) => {\n return (\n <Toolbar.Root classNames={['gap-1', classNames]}>\n <IconButton\n //\n icon='ph--play--regular'\n label='start'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('start')}\n />\n <IconButton\n //\n icon='ph--globe-hemisphere-west--regular'\n label='toggle'\n iconOnly\n size={5}\n classNames='px-0 aspect-square'\n onClick={() => onAction?.('toggle')}\n />\n </Toolbar.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// eslint-disable-next-line no-restricted-imports\nimport 'leaflet/dist/leaflet.css';\n\nimport L, { Control, DomEvent, DomUtil, latLngBounds, type ControlPosition, type LatLngExpression } from 'leaflet';\nimport React, { forwardRef, useEffect, useImperativeHandle, type PropsWithChildren } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport type { MapContainerProps } from 'react-leaflet';\nimport { MapContainer, Marker, Popup, TileLayer, useMap } from 'react-leaflet';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { debounce } from '@dxos/async';\nimport { ThemeProvider, Tooltip, type ThemedClassName } from '@dxos/react-ui';\nimport { defaultTx, mx } from '@dxos/react-ui-theme';\n\nimport { ActionControls, controlPositions, ZoomControls, type ControlProps } from '../Toolbar';\nimport { type MapCanvasProps } from '../types';\n\n// TODO(burdon): Explore plugins: https://www.npmjs.com/search?q=keywords%3Areact-leaflet-v4\n// TODO(burdon): react-leaflet v5 is not compatible with react 18.\n\nconst defaults = {\n // TODO(burdon): Guess location.\n center: { lat: 51, lng: 0 } as L.LatLngExpression,\n zoom: 4,\n};\n\n//\n// Root\n//\n\ntype MapRootProps = ThemedClassName<MapContainerProps>;\n\n// https://react-leaflet.js.org/docs/api-map\nconst MapRoot = ({ classNames, center = defaults.center, zoom = defaults.zoom, ...props }: MapRootProps) => {\n return (\n <MapContainer\n className={mx('relative flex w-full h-full grow bg-baseSurface', classNames)}\n attributionControl={false}\n // TODO(burdon): Only if attention.\n scrollWheelZoom={true}\n zoomControl={false}\n center={center}\n zoom={zoom}\n {...props}\n />\n );\n};\n\n//\n// Control\n//\n\n// TODO(burdon): Normalize with Globe.\ntype MapController = {\n setCenter: (center: LatLngExpression, zoom?: number) => void;\n setZoom: (cb: (zoom: number) => number) => void;\n};\n\nconst MapCanvas = forwardRef<MapController, MapCanvasProps>(({ markers, center, zoom, onChange }, forwardedRef) => {\n const { ref, width, height } = useResizeDetector({ refreshRate: 200 });\n const map = useMap();\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n setCenter: (center: LatLngExpression, zoom?: number) => {\n map.setView(center, zoom);\n },\n setZoom: (cb) => {\n map.setZoom(cb(map.getZoom()));\n },\n }),\n [map],\n );\n\n // Resize.\n useEffect(() => {\n if (width && height) {\n map.invalidateSize();\n }\n }, [width, height]);\n\n // Position.\n useEffect(() => {\n if (center) {\n map.setView(center, zoom);\n } else if (zoom !== undefined) {\n map.setZoom(zoom);\n }\n }, [center, zoom]);\n\n // Events.\n useEffect(() => {\n const handler = debounce(() => {\n onChange?.({ center: map.getCenter(), zoom: map.getZoom() });\n }, 100);\n map.on('move', handler);\n map.on('zoom', handler);\n return () => {\n map.off('move', handler);\n map.off('zoom', handler);\n };\n }, [map, onChange]);\n\n // Set the viewport around the markers, or show the whole world map if `markers` is empty.\n useEffect(() => {\n if (markers.length > 0) {\n const bounds = latLngBounds(markers.map((marker) => marker.location));\n map.fitBounds(bounds);\n } else {\n map.setView(defaults.center, defaults.zoom);\n }\n }, [markers]);\n\n return (\n <div ref={ref} className='flex w-full h-full overflow-hidden bg-baseSurface'>\n {/* Map tiles. */}\n <TileLayer\n className='dark:filter dark:grayscale dark:invert'\n url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'\n />\n\n {/* Markers. */}\n {markers?.map(({ id, title, location: { lat, lng } }) => {\n return (\n <Marker\n key={id}\n position={{ lat, lng }}\n icon={\n // TODO(burdon): Create custom icon from bundled assets.\n new L.Icon({\n iconUrl: 'https://dxos.network/marker-icon.png',\n iconRetinaUrl: 'https://dxos.network/marker-icon-2x.png',\n shadowUrl: 'https://dxos.network/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41],\n })\n }\n >\n {title && <Popup>{title}</Popup>}\n </Marker>\n );\n })}\n </div>\n );\n});\n\n//\n// Controls\n// Integrates with Leaflet custom controls.\n//\n\nconst CustomControl = ({\n position,\n children,\n}: PropsWithChildren<{\n position: ControlPosition;\n}>) => {\n const map = useMap();\n\n useEffect(() => {\n const control = new Control({ position });\n control.onAdd = () => {\n const container = DomUtil.create('div', mx('!m-0', controlPositions[position]));\n DomEvent.disableClickPropagation(container);\n DomEvent.disableScrollPropagation(container);\n\n const root = createRoot(container);\n root.render(\n <ThemeProvider tx={defaultTx}>\n <Tooltip.Provider>{children}</Tooltip.Provider>\n </ThemeProvider>,\n );\n\n return container;\n };\n\n control.addTo(map);\n return () => {\n control.remove();\n };\n }, [map, position, children]);\n\n return null;\n};\n\ntype MapControlProps = { position?: ControlPosition } & Pick<ControlProps, 'onAction'>;\n\n//\n// Map\n//\n\nexport const Map = {\n Root: MapRoot,\n Canvas: MapCanvas,\n Zoom: ({ onAction, position = 'bottomleft', ...props }: MapControlProps) => (\n <CustomControl position={position} {...props}>\n <ZoomControls onAction={onAction} />\n </CustomControl>\n ),\n Action: ({ onAction, position = 'bottomright', ...props }: MapControlProps) => (\n <CustomControl position={position} {...props}>\n <ActionControls onAction={onAction} />\n </CustomControl>\n ),\n};\n\nexport { type MapCanvasProps, type MapController };\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_react_ui", "import_versor", "import_leaflet", "import_react_resize_detector", "import_react_ui_theme", "GlobeContext", "createContext", "undefined", "GlobeContextProvider", "children", "size", "center", "_center", "scale", "_scale", "translation", "_translation", "rotation", "_rotation", "setCenter", "useControlledState", "setScale", "setTranslation", "setRotation", "React", "Provider", "value", "useGlobeContext", "useContext", "raise", "Error", "debug", "timer", "cb", "start", "Date", "now", "data", "t", "console", "log", "restrictAxis", "axis", "original", "current", "map", "d", "i", "geoInertiaDrag", "target", "render", "projection", "options", "node", "select", "inertia", "geoInertiaDragHelper", "rotate", "xAxis", "move", "end", "stop", "finish", "time", "hold", "call", "drag", "on", "opt", "v0", "r0", "q0", "v10", "v11", "q10", "inertiaHelper", "versor", "cartesian", "invert", "position", "inv", "isNaN", "v1", "q1", "multiply", "delta", "r1", "r2", "velocity", "A", "limit", "B", "Math", "ev", "x", "y", "classList", "remove", "add", "performance", "deltaTime", "decay", "exp", "deltaPos", "v", "self", "restart", "e", "positionToRotation", "lng", "lat", "tilt", "geoToPosition", "geoPoint", "point", "type", "coordinates", "geoCircle", "radius", "geoLine", "p1", "p2", "closestPoint", "points", "length", "minDistance", "getDistance", "distance", "point1", "point2", "dx", "dy", "sqrt", "createLayers", "topology", "features", "styles", "layers", "water", "push", "path", "graticule", "geoGraticule", "step", "objects", "land", "feature", "countries", "border", "mesh", "a", "b", "dots", "lines", "geometries", "line", "source", "renderLayers", "generator", "context", "canvas", "width", "height", "reset", "background", "fillStyle", "fillRect", "clearRect", "forEach", "save", "fill", "stroke", "Object", "entries", "key", "pointRadius", "beginPath", "restore", "useDrag", "controller", "useEffect", "disabled", "onUpdate", "cancelDrag", "JSON", "stringify", "useGlobeZoomHandler", "useCallback", "event", "useMapZoomHandler", "setZoom", "useSpinner", "running", "setRunning", "useState", "lastRotation", "elapsed", "dt", "TRANSITION_NAME", "defaultDuration", "useTour", "selection", "interrupt", "setTimeout", "getContext", "alpha", "geoPath", "last", "p", "loop", "next", "ip", "geoInterpolate", "geoDistance", "iv", "interpolate", "transition", "duration", "max", "tween", "t1", "min", "t2", "strokeStyle", "arc", "lineWidth", "setLineDash", "lineDash", "cursor", "autoRotate", "err", "catch", "clearTimeout", "controlPositions", "topleft", "topright", "bottomleft", "bottomright", "ZoomControls", "classNames", "onAction", "Toolbar", "Root", "IconButton", "icon", "label", "iconOnly", "onClick", "ActionControls", "defaultStyles", "light", "strokeWidth", "dark", "projectionMap", "orthographic", "geoOrthographic", "mercator", "geoMercator", "geoTransverseMercator", "getProjection", "constructor", "GlobeRoot", "props", "ref", "useResizeDetector", "div", "className", "mx", "GlobeCanvas", "forwardRef", "_projection", "_styles", "themeMode", "useThemeContext", "useMemo", "setCanvas", "canvasRef", "scaleRef", "useDynamicRef", "zooming", "useRef", "useImperativeHandle", "s", "is", "interpolateNumber", "ease", "easeLinear", "easeSinOut", "translate", "GlobeDebug", "pre", "GlobePanel", "CustomControl", "Globe", "Canvas", "Zoom", "Action", "Debug", "Panel", "defaults", "zoom", "MapRoot", "MapContainer", "attributionControl", "scrollWheelZoom", "zoomControl", "MapCanvas", "markers", "onChange", "forwardedRef", "refreshRate", "useMap", "setView", "getZoom", "invalidateSize", "handler", "debounce", "getCenter", "off", "bounds", "latLngBounds", "marker", "location", "fitBounds", "TileLayer", "url", "id", "title", "Marker", "L", "Icon", "iconUrl", "iconRetinaUrl", "shadowUrl", "iconSize", "iconAnchor", "popupAnchor", "shadowSize", "Popup", "control", "Control", "onAdd", "container", "DomUtil", "create", "DomEvent", "disableClickPropagation", "disableScrollPropagation", "root", "createRoot", "ThemeProvider", "tx", "defaultTx", "Tooltip", "addTo", "Map"]
7
7
  }