@dxos/react-ui-geo 0.7.5-labs.ff2ff30 → 0.7.5-main.6a330ac

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 (38) hide show
  1. package/dist/lib/browser/index.mjs +113 -48
  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 +111 -46
  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 +113 -48
  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 +5 -5
  11. package/dist/types/src/components/Globe/Globe.d.ts.map +1 -1
  12. package/dist/types/src/components/Globe/Globe.stories.d.ts +9 -10
  13. package/dist/types/src/components/Globe/Globe.stories.d.ts.map +1 -1
  14. package/dist/types/src/components/Map/Map.d.ts +7 -7
  15. package/dist/types/src/components/Map/Map.d.ts.map +1 -1
  16. package/dist/types/src/components/Map/Map.stories.d.ts +6 -2
  17. package/dist/types/src/components/Map/Map.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Toolbar/Controls.d.ts +2 -3
  19. package/dist/types/src/components/Toolbar/Controls.d.ts.map +1 -1
  20. package/dist/types/src/components/types.d.ts +2 -1
  21. package/dist/types/src/components/types.d.ts.map +1 -1
  22. package/dist/types/src/hooks/context.d.ts +2 -2
  23. package/dist/types/src/hooks/context.d.ts.map +1 -1
  24. package/dist/types/src/hooks/useTour.d.ts +8 -3
  25. package/dist/types/src/hooks/useTour.d.ts.map +1 -1
  26. package/dist/types/src/util/debug.d.ts.map +1 -1
  27. package/dist/types/src/util/render.d.ts +2 -2
  28. package/dist/types/src/util/render.d.ts.map +1 -1
  29. package/package.json +12 -10
  30. package/src/components/Globe/Globe.stories.tsx +8 -11
  31. package/src/components/Globe/Globe.tsx +56 -32
  32. package/src/components/Map/Map.stories.tsx +28 -6
  33. package/src/components/Map/Map.tsx +93 -82
  34. package/src/components/types.ts +2 -1
  35. package/src/hooks/useDrag.ts +1 -1
  36. package/src/hooks/useTour.ts +31 -19
  37. package/src/util/debug.ts +1 -0
  38. package/src/util/render.ts +18 -4
@@ -6,7 +6,7 @@ import {
6
6
  import * as d37 from "d3";
7
7
  import React3, { forwardRef, useEffect as useEffect4, useImperativeHandle, useMemo, useRef, useState as useState3 } from "react";
8
8
  import { useResizeDetector } from "react-resize-detector";
9
- import { useDynamicRef } from "@dxos/react-ui";
9
+ import { useDynamicRef, useThemeContext } from "@dxos/react-ui";
10
10
  import { mx } from "@dxos/react-ui-theme";
11
11
 
12
12
  // packages/ui/react-ui-geo/src/hooks/context.tsx
@@ -349,17 +349,22 @@ var createLayers = (topology, features, styles) => {
349
349
  }
350
350
  return layers;
351
351
  };
352
- var renderLayers = (generator, layers = [], scale) => {
352
+ var renderLayers = (generator, layers = [], scale, styles) => {
353
353
  const context = generator.context();
354
354
  const { canvas: { width, height } } = context;
355
355
  context.reset();
356
- context.clearRect(0, 0, width, height);
357
- layers.forEach(({ path, styles }) => {
356
+ if (styles.background) {
357
+ context.fillStyle = styles.background.fillStyle;
358
+ context.fillRect(0, 0, width, height);
359
+ } else {
360
+ context.clearRect(0, 0, width, height);
361
+ }
362
+ layers.forEach(({ path, styles: styles2 }) => {
358
363
  context.save();
359
364
  let fill = false;
360
365
  let stroke = false;
361
- if (styles) {
362
- Object.entries(styles).forEach(([key, value]) => {
366
+ if (styles2) {
367
+ Object.entries(styles2).forEach(([key, value]) => {
363
368
  if (key === "pointRadius") {
364
369
  generator.pointRadius(value * scale);
365
370
  } else {
@@ -408,7 +413,7 @@ var useDrag = (controller, options = {}) => {
408
413
  };
409
414
  }, [
410
415
  controller,
411
- options
416
+ JSON.stringify(options)
412
417
  ]);
413
418
  };
414
419
  var cancelDrag = (node) => node.on(".drag", null);
@@ -514,11 +519,13 @@ var useSpinner = (controller, options = {}) => {
514
519
  import * as d36 from "d3";
515
520
  import { useEffect as useEffect3, useState as useState2 } from "react";
516
521
  import versor2 from "versor";
522
+ import { log } from "@dxos/log";
523
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-geo/src/hooks/useTour.ts";
517
524
  var TRANSITION_NAME = "globe-tour";
518
525
  var defaultDuration = 1500;
519
- var useTour = (controller, features, options = {}) => {
526
+ var useTour = (controller, points, options = {}) => {
520
527
  const selection2 = d36.selection();
521
- const [running, setRunning] = useState2(false);
528
+ const [running, setRunning] = useState2(options.running ?? false);
522
529
  useEffect3(() => {
523
530
  if (!running) {
524
531
  selection2.interrupt(TRANSITION_NAME);
@@ -532,10 +539,16 @@ var useTour = (controller, features, options = {}) => {
532
539
  alpha: false
533
540
  });
534
541
  const path = d36.geoPath(projection, context).pointRadius(2);
535
- const tilt = 0;
542
+ const tilt = options.tilt ?? 0;
536
543
  let last;
537
544
  try {
538
- for (const next of features.points) {
545
+ const p = [
546
+ ...points
547
+ ];
548
+ if (options.loop) {
549
+ p.push(p[0]);
550
+ }
551
+ for (const next of p) {
539
552
  if (!running) {
540
553
  break;
541
554
  }
@@ -573,13 +586,22 @@ var useTour = (controller, features, options = {}) => {
573
586
  context.fill();
574
587
  }
575
588
  context.restore();
576
- projection.rotate(iv(t2));
577
- setRotation(projection.rotate());
589
+ if (options.autoRotate) {
590
+ projection.rotate(iv(t2));
591
+ setRotation(projection.rotate());
592
+ }
578
593
  });
579
594
  await transition2.end();
580
595
  last = next;
581
596
  }
582
597
  } catch (err) {
598
+ log.catch(err, void 0, {
599
+ F: __dxlog_file,
600
+ L: 112,
601
+ S: void 0,
602
+ C: (f, a) => f(...a)
603
+ });
604
+ } finally {
583
605
  setRunning(false);
584
606
  }
585
607
  });
@@ -590,15 +612,12 @@ var useTour = (controller, features, options = {}) => {
590
612
  }
591
613
  }, [
592
614
  controller,
593
- running
615
+ running,
616
+ JSON.stringify(options)
594
617
  ]);
595
618
  return [
596
- () => {
597
- if (!options.disabled) {
598
- setRunning(true);
599
- }
600
- },
601
- () => setRunning(false)
619
+ running,
620
+ setRunning
602
621
  ];
603
622
  };
604
623
 
@@ -662,28 +681,45 @@ var ActionControls = ({ classNames, onAction }) => {
662
681
 
663
682
  // packages/ui/react-ui-geo/src/components/Globe/Globe.tsx
664
683
  var defaultStyles = {
665
- background: {
666
- fillStyle: "#111111"
667
- },
668
- water: {
669
- fillStyle: "#123E6A"
670
- },
671
- hex: {
672
- strokeStyle: "green",
673
- fillStyle: "gray",
674
- pointRadius: 1
675
- },
676
- land: {
677
- fillStyle: "#032153"
678
- },
679
- line: {
680
- strokeStyle: "#111111"
684
+ light: {
685
+ background: {
686
+ fillStyle: "#EEE"
687
+ },
688
+ water: {
689
+ fillStyle: "#555"
690
+ },
691
+ land: {
692
+ fillStyle: "#999"
693
+ },
694
+ line: {
695
+ strokeStyle: "darkred"
696
+ },
697
+ point: {
698
+ fillStyle: "#111111",
699
+ strokeStyle: "#111111",
700
+ strokeWidth: 1,
701
+ pointRadius: 0.5
702
+ }
681
703
  },
682
- point: {
683
- fillStyle: "#111111",
684
- strokeStyle: "#111111",
685
- strokeWidth: 1,
686
- pointRadius: 0.5
704
+ dark: {
705
+ background: {
706
+ fillStyle: "#111111"
707
+ },
708
+ water: {
709
+ fillStyle: "#123E6A"
710
+ },
711
+ land: {
712
+ fillStyle: "#032153"
713
+ },
714
+ line: {
715
+ strokeStyle: "#111111"
716
+ },
717
+ point: {
718
+ fillStyle: "#111111",
719
+ strokeStyle: "#111111",
720
+ strokeWidth: 1,
721
+ pointRadius: 0.5
722
+ }
687
723
  }
688
724
  };
689
725
  var projectionMap = {
@@ -711,7 +747,12 @@ var GlobeRoot = ({ classNames, children, ...props }) => {
711
747
  ...props
712
748
  }, children));
713
749
  };
714
- var GlobeCanvas = /* @__PURE__ */ forwardRef(({ projection: _projection, topology, features, styles = defaultStyles }, forwardRef3) => {
750
+ var GlobeCanvas = /* @__PURE__ */ forwardRef(({ projection: _projection, topology, features, styles: _styles }, forwardRef3) => {
751
+ const { themeMode } = useThemeContext();
752
+ const styles = useMemo(() => _styles ?? defaultStyles[themeMode], [
753
+ _styles,
754
+ themeMode
755
+ ]);
715
756
  const [canvas, setCanvas] = useState3(null);
716
757
  const canvasRef = (canvas2) => setCanvas(canvas2);
717
758
  const projection = useMemo(() => getProjection(_projection), [
@@ -779,7 +820,7 @@ var GlobeCanvas = /* @__PURE__ */ forwardRef(({ projection: _projection, topolog
779
820
  0,
780
821
  0
781
822
  ]);
782
- renderLayers(generator, layers, scale);
823
+ renderLayers(generator, layers, scale, styles);
783
824
  });
784
825
  }
785
826
  }, [
@@ -843,13 +884,13 @@ var Globe = {
843
884
 
844
885
  // packages/ui/react-ui-geo/src/components/Map/Map.tsx
845
886
  import "leaflet/dist/leaflet.css";
846
- import { Control, DomEvent, DomUtil, latLngBounds } from "leaflet";
887
+ import L, { Control, DomEvent, DomUtil, latLngBounds } from "leaflet";
847
888
  import React4, { forwardRef as forwardRef2, useEffect as useEffect5, useImperativeHandle as useImperativeHandle2 } from "react";
848
889
  import { createRoot } from "react-dom/client";
849
890
  import { MapContainer, Marker, Popup, TileLayer, useMap } from "react-leaflet";
850
891
  import { useResizeDetector as useResizeDetector2 } from "react-resize-detector";
851
892
  import { debounce } from "@dxos/async";
852
- import { Tooltip, ThemeProvider } from "@dxos/react-ui";
893
+ import { ThemeProvider, Tooltip } from "@dxos/react-ui";
853
894
  import { defaultTx, mx as mx2 } from "@dxos/react-ui-theme";
854
895
  var defaults = {
855
896
  // TODO(burdon): Guess location.
@@ -871,7 +912,7 @@ var MapRoot = ({ classNames, center = defaults.center, zoom = defaults.zoom, ...
871
912
  ...props
872
913
  });
873
914
  };
874
- var MapCanvas = /* @__PURE__ */ forwardRef2(({ markers = [], center, zoom, onChange }, forwardedRef) => {
915
+ var MapCanvas = /* @__PURE__ */ forwardRef2(({ markers, center, zoom, onChange }, forwardedRef) => {
875
916
  const { ref, width, height } = useResizeDetector2({
876
917
  refreshRate: 200
877
918
  });
@@ -937,13 +978,37 @@ var MapCanvas = /* @__PURE__ */ forwardRef2(({ markers = [], center, zoom, onCha
937
978
  }, /* @__PURE__ */ React4.createElement(TileLayer, {
938
979
  className: "dark:filter dark:grayscale dark:invert",
939
980
  url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
940
- }), markers.map(({ id, title, location: { lat, lng } }) => {
981
+ }), markers?.map(({ id, title, location: { lat, lng } }) => {
941
982
  return /* @__PURE__ */ React4.createElement(Marker, {
942
983
  key: id,
943
984
  position: {
944
985
  lat,
945
986
  lng
946
- }
987
+ },
988
+ icon: (
989
+ // TODO(burdon): Create custom icon from bundled assets.
990
+ new L.Icon({
991
+ iconUrl: "https://dxos.network/marker-icon.png",
992
+ iconRetinaUrl: "https://dxos.network/marker-icon-2x.png",
993
+ shadowUrl: "https://dxos.network/marker-shadow.png",
994
+ iconSize: [
995
+ 25,
996
+ 41
997
+ ],
998
+ iconAnchor: [
999
+ 12,
1000
+ 41
1001
+ ],
1002
+ popupAnchor: [
1003
+ 1,
1004
+ -34
1005
+ ],
1006
+ shadowSize: [
1007
+ 41,
1008
+ 41
1009
+ ]
1010
+ })
1011
+ )
947
1012
  }, title && /* @__PURE__ */ React4.createElement(Popup, null, title));
948
1013
  }));
949
1014
  });
@@ -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 * 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, useDynamicRef } 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 Styles,\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// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute\nconst defaultStyles: Styles = {\n background: {\n fillStyle: '#111111',\n },\n\n water: {\n fillStyle: '#123E6A',\n },\n\n hex: {\n strokeStyle: 'green',\n fillStyle: 'gray',\n pointRadius: 1,\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\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 = defaultStyles }, forwardRef) => {\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);\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, 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 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 = 'water' | 'graticule' | 'land' | 'border' | 'dots' | 'point' | 'line' | 'cursor' | '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) => {\n const context: CanvasRenderingContext2D = generator.context();\n const {\n canvas: { width, height },\n } = context;\n context.reset();\n\n // TODO(burdon): Option.\n // Clear background.\n context.clearRect(0, 0, width, height);\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 { useEffect, useState } from 'react';\nimport versor from 'versor';\n\nimport type { GlobeController } from '../components';\nimport { type Features, geoToPosition, type LatLng, positionToRotation, type StyleSet } from '../util';\n\nconst TRANSITION_NAME = 'globe-tour';\n\nconst defaultDuration = 1_500;\n\nexport type TourOptions = {\n disabled?: boolean;\n styles?: StyleSet;\n duration?: number;\n};\n\n/**\n * Iterates between points.\n * Inspired by: https://observablehq.com/@mbostock/top-100-cities\n */\nexport const useTour = (controller?: GlobeController | null, features?: Features, options: TourOptions = {}) => {\n const selection = d3.selection();\n const [running, setRunning] = useState(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 = 0;\n let last: LatLng;\n try {\n for (const next of features.points) {\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 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 setRunning(false);\n }\n });\n\n return () => {\n clearTimeout(t);\n selection.interrupt(TRANSITION_NAME);\n };\n }\n }, [controller, running]);\n\n return [\n () => {\n if (!options.disabled) {\n setRunning(true);\n }\n },\n () => setRunning(false),\n ];\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 type L from 'leaflet';\nimport { type ControlPosition, Control, DomEvent, DomUtil, type LatLngExpression, latLngBounds } from 'leaflet';\nimport React, { forwardRef, type PropsWithChildren, useEffect, useImperativeHandle } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { MapContainer, Marker, Popup, TileLayer, useMap } from 'react-leaflet';\nimport { type MapContainerProps } from 'react-leaflet/lib/MapContainer';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { debounce } from '@dxos/async';\nimport { Tooltip, ThemeProvider, 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>(\n ({ 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 {/* TODO(burdon): Marker icon doesn't load on mobile? */}\n {markers.map(({ id, title, location: { lat, lng } }) => {\n return (\n <Marker key={id} position={{ lat, lng }}>\n {title && <Popup>{title}</Popup>}\n </Marker>\n );\n })}\n </div>\n );\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": ["d3", "React", "forwardRef", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "useResizeDetector", "useDynamicRef", "mx", "React", "createContext", "useContext", "raise", "useControlledState", "GlobeContext", "createContext", "undefined", "GlobeContextProvider", "children", "size", "center", "_center", "scale", "_scale", "translation", "_translation", "rotation", "_rotation", "setCenter", "useControlledState", "setScale", "setTranslation", "setRotation", "Provider", "value", "useGlobeContext", "useContext", "raise", "Error", "d3", "useEffect", "debug", "timer", "cb", "start", "Date", "now", "data", "t", "console", "log", "d3", "versor", "restrictAxis", "axis", "original", "current", "map", "d", "i", "geoInertiaDrag", "target", "render", "projection", "options", "node", "select", "inertia", "geoInertiaDragHelper", "rotation", "rotate", "xAxis", "start", "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", "t", "A", "limit", "B", "Math", "log", "timer", "ev", "x", "y", "classList", "remove", "add", "performance", "now", "deltaTime", "decay", "exp", "deltaPos", "v", "undefined", "self", "restart", "e", "d3", "positionToRotation", "lng", "lat", "tilt", "geoToPosition", "geoPoint", "point", "type", "coordinates", "geoCircle", "radius", "center", "geoLine", "p1", "p2", "closestPoint", "points", "target", "length", "minDistance", "getDistance", "distance", "point1", "point2", "dx", "dy", "Math", "sqrt", "d3", "topojson", "createLayers", "topology", "features", "styles", "layers", "water", "push", "path", "type", "graticule", "geoGraticule", "step", "objects", "land", "feature", "countries", "border", "mesh", "a", "b", "dots", "points", "lines", "point", "geometries", "map", "geoPoint", "line", "source", "target", "geoLine", "renderLayers", "generator", "scale", "context", "canvas", "width", "height", "reset", "clearRect", "forEach", "save", "fill", "stroke", "Object", "entries", "key", "value", "pointRadius", "beginPath", "restore", "useDrag", "controller", "options", "useEffect", "canvas", "disabled", "geoInertiaDrag", "select", "setRotation", "projection", "rotate", "onUpdate", "type", "xAxis", "time", "start", "finish", "cancelDrag", "node", "on", "useCallback", "useGlobeZoomHandler", "controller", "useCallback", "event", "setScale", "scale", "useCallback", "useMapZoomHandler", "controller", "useCallback", "event", "setZoom", "scale", "d3", "useEffect", "useState", "useSpinner", "controller", "options", "running", "setRunning", "useState", "useEffect", "timer", "start", "delta", "t", "lastRotation", "projection", "rotate", "elapsed", "dt", "rotation", "setRotation", "stop", "undefined", "disabled", "d3", "useEffect", "useState", "versor", "TRANSITION_NAME", "defaultDuration", "useTour", "controller", "features", "options", "selection", "running", "setRunning", "useState", "useEffect", "interrupt", "t", "setTimeout", "canvas", "projection", "setRotation", "context", "getContext", "alpha", "path", "geoPath", "pointRadius", "tilt", "last", "next", "points", "p1", "geoToPosition", "undefined", "p2", "ip", "geoInterpolate", "distance", "geoDistance", "r1", "positionToRotation", "rotate", "r2", "iv", "versor", "interpolate", "transition", "duration", "Math", "max", "tween", "t1", "min", "t2", "save", "beginPath", "strokeStyle", "styles", "arc", "lineWidth", "scale", "setLineDash", "lineDash", "type", "coordinates", "stroke", "fillStyle", "cursor", "fill", "restore", "end", "err", "clearTimeout", "disabled", "React", "IconButton", "Toolbar", "controlPositions", "topleft", "topright", "bottomleft", "bottomright", "ZoomControls", "classNames", "onAction", "React", "Toolbar", "Root", "IconButton", "icon", "label", "iconOnly", "size", "onClick", "ActionControls", "defaultStyles", "background", "fillStyle", "water", "hex", "strokeStyle", "pointRadius", "land", "line", "point", "strokeWidth", "projectionMap", "orthographic", "geoOrthographic", "mercator", "geoMercator", "geoTransverseMercator", "getProjection", "type", "constructor", "GlobeRoot", "classNames", "children", "props", "ref", "width", "height", "useResizeDetector", "React", "div", "className", "mx", "GlobeContextProvider", "size", "GlobeCanvas", "forwardRef", "projection", "_projection", "topology", "features", "styles", "canvas", "setCanvas", "useState", "canvasRef", "useMemo", "layers", "timer", "createLayers", "center", "scale", "translation", "rotation", "setCenter", "setScale", "setTranslation", "setRotation", "useGlobeContext", "scaleRef", "useDynamicRef", "useEffect", "positionToRotation", "geoToPosition", "zooming", "useRef", "useImperativeHandle", "current", "s", "is", "interpolateNumber", "d3", "transition", "ease", "easeLinear", "easeSinOut", "duration", "tween", "t", "on", "generator", "geoPath", "getContext", "alpha", "Math", "min", "translate", "x", "y", "rotate", "renderLayers", "GlobeDebug", "position", "controlPositions", "pre", "JSON", "stringify", "GlobePanel", "CustomControl", "Globe", "Root", "Canvas", "Zoom", "onAction", "ZoomControls", "Action", "ActionControls", "Debug", "Panel", "Control", "DomEvent", "DomUtil", "latLngBounds", "React", "forwardRef", "useEffect", "useImperativeHandle", "createRoot", "MapContainer", "Marker", "Popup", "TileLayer", "useMap", "useResizeDetector", "debounce", "Tooltip", "ThemeProvider", "defaultTx", "mx", "defaults", "center", "lat", "lng", "zoom", "MapRoot", "classNames", "props", "React", "MapContainer", "className", "mx", "attributionControl", "scrollWheelZoom", "zoomControl", "MapCanvas", "forwardRef", "markers", "onChange", "forwardedRef", "ref", "width", "height", "useResizeDetector", "refreshRate", "map", "useMap", "useImperativeHandle", "setCenter", "setView", "setZoom", "cb", "getZoom", "useEffect", "invalidateSize", "undefined", "handler", "debounce", "getCenter", "on", "off", "length", "bounds", "latLngBounds", "marker", "location", "fitBounds", "div", "TileLayer", "url", "id", "title", "Marker", "key", "position", "Popup", "CustomControl", "children", "control", "Control", "onAdd", "container", "DomUtil", "create", "controlPositions", "DomEvent", "disableClickPropagation", "disableScrollPropagation", "root", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "Tooltip", "Provider", "addTo", "remove", "Map", "Root", "Canvas", "Zoom", "onAction", "ZoomControls", "Action", "ActionControls"]
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": ["d3", "React", "forwardRef", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "useResizeDetector", "useDynamicRef", "useThemeContext", "mx", "React", "createContext", "useContext", "raise", "useControlledState", "GlobeContext", "createContext", "undefined", "GlobeContextProvider", "children", "size", "center", "_center", "scale", "_scale", "translation", "_translation", "rotation", "_rotation", "setCenter", "useControlledState", "setScale", "setTranslation", "setRotation", "Provider", "value", "useGlobeContext", "useContext", "raise", "Error", "d3", "useEffect", "debug", "timer", "cb", "start", "Date", "now", "data", "t", "console", "log", "d3", "versor", "restrictAxis", "axis", "original", "current", "map", "d", "i", "geoInertiaDrag", "target", "render", "projection", "options", "node", "select", "inertia", "geoInertiaDragHelper", "rotation", "rotate", "xAxis", "start", "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", "t", "A", "limit", "B", "Math", "log", "timer", "ev", "x", "y", "classList", "remove", "add", "performance", "now", "deltaTime", "decay", "exp", "deltaPos", "v", "undefined", "self", "restart", "e", "d3", "positionToRotation", "lng", "lat", "tilt", "geoToPosition", "geoPoint", "point", "type", "coordinates", "geoCircle", "radius", "center", "geoLine", "p1", "p2", "closestPoint", "points", "target", "length", "minDistance", "getDistance", "distance", "point1", "point2", "dx", "dy", "Math", "sqrt", "d3", "topojson", "createLayers", "topology", "features", "styles", "layers", "water", "push", "path", "type", "graticule", "geoGraticule", "step", "objects", "land", "feature", "countries", "border", "mesh", "a", "b", "dots", "points", "lines", "point", "geometries", "map", "geoPoint", "line", "source", "target", "geoLine", "renderLayers", "generator", "scale", "context", "canvas", "width", "height", "reset", "background", "fillStyle", "fillRect", "clearRect", "forEach", "save", "fill", "stroke", "Object", "entries", "key", "value", "pointRadius", "beginPath", "restore", "useDrag", "controller", "options", "useEffect", "canvas", "disabled", "geoInertiaDrag", "select", "setRotation", "projection", "rotate", "onUpdate", "type", "xAxis", "time", "start", "finish", "cancelDrag", "JSON", "stringify", "node", "on", "useCallback", "useGlobeZoomHandler", "controller", "useCallback", "event", "setScale", "scale", "useCallback", "useMapZoomHandler", "controller", "useCallback", "event", "setZoom", "scale", "d3", "useEffect", "useState", "useSpinner", "controller", "options", "running", "setRunning", "useState", "useEffect", "timer", "start", "delta", "t", "lastRotation", "projection", "rotate", "elapsed", "dt", "rotation", "setRotation", "stop", "undefined", "disabled", "d3", "useEffect", "useState", "versor", "log", "TRANSITION_NAME", "defaultDuration", "useTour", "controller", "points", "options", "selection", "running", "setRunning", "useState", "useEffect", "interrupt", "t", "setTimeout", "canvas", "projection", "setRotation", "context", "getContext", "alpha", "path", "geoPath", "pointRadius", "tilt", "last", "p", "loop", "push", "next", "p1", "geoToPosition", "undefined", "p2", "ip", "geoInterpolate", "distance", "geoDistance", "r1", "positionToRotation", "rotate", "r2", "iv", "versor", "interpolate", "transition", "duration", "Math", "max", "tween", "t1", "min", "t2", "save", "beginPath", "strokeStyle", "styles", "arc", "lineWidth", "scale", "setLineDash", "lineDash", "type", "coordinates", "stroke", "fillStyle", "cursor", "fill", "restore", "autoRotate", "end", "err", "log", "catch", "clearTimeout", "JSON", "stringify", "React", "IconButton", "Toolbar", "controlPositions", "topleft", "topright", "bottomleft", "bottomright", "ZoomControls", "classNames", "onAction", "React", "Toolbar", "Root", "IconButton", "icon", "label", "iconOnly", "size", "onClick", "ActionControls", "defaultStyles", "light", "background", "fillStyle", "water", "land", "line", "strokeStyle", "point", "strokeWidth", "pointRadius", "dark", "projectionMap", "orthographic", "geoOrthographic", "mercator", "geoMercator", "geoTransverseMercator", "getProjection", "type", "constructor", "GlobeRoot", "classNames", "children", "props", "ref", "width", "height", "useResizeDetector", "React", "div", "className", "mx", "GlobeContextProvider", "size", "GlobeCanvas", "forwardRef", "projection", "_projection", "topology", "features", "styles", "_styles", "themeMode", "useThemeContext", "useMemo", "canvas", "setCanvas", "useState", "canvasRef", "layers", "timer", "createLayers", "center", "scale", "translation", "rotation", "setCenter", "setScale", "setTranslation", "setRotation", "useGlobeContext", "scaleRef", "useDynamicRef", "useEffect", "positionToRotation", "geoToPosition", "zooming", "useRef", "useImperativeHandle", "current", "s", "is", "interpolateNumber", "d3", "transition", "ease", "easeLinear", "easeSinOut", "duration", "tween", "t", "on", "generator", "geoPath", "getContext", "alpha", "Math", "min", "translate", "x", "y", "rotate", "renderLayers", "GlobeDebug", "position", "controlPositions", "pre", "JSON", "stringify", "GlobePanel", "CustomControl", "Globe", "Root", "Canvas", "Zoom", "onAction", "ZoomControls", "Action", "ActionControls", "Debug", "Panel", "L", "Control", "DomEvent", "DomUtil", "latLngBounds", "React", "forwardRef", "useEffect", "useImperativeHandle", "createRoot", "MapContainer", "Marker", "Popup", "TileLayer", "useMap", "useResizeDetector", "debounce", "ThemeProvider", "Tooltip", "defaultTx", "mx", "defaults", "center", "lat", "lng", "zoom", "MapRoot", "classNames", "props", "React", "MapContainer", "className", "mx", "attributionControl", "scrollWheelZoom", "zoomControl", "MapCanvas", "forwardRef", "markers", "onChange", "forwardedRef", "ref", "width", "height", "useResizeDetector", "refreshRate", "map", "useMap", "useImperativeHandle", "setCenter", "setView", "setZoom", "cb", "getZoom", "useEffect", "invalidateSize", "undefined", "handler", "debounce", "getCenter", "on", "off", "length", "bounds", "latLngBounds", "marker", "location", "fitBounds", "div", "TileLayer", "url", "id", "title", "Marker", "key", "position", "icon", "L", "Icon", "iconUrl", "iconRetinaUrl", "shadowUrl", "iconSize", "iconAnchor", "popupAnchor", "shadowSize", "Popup", "CustomControl", "children", "control", "Control", "onAdd", "container", "DomUtil", "create", "controlPositions", "DomEvent", "disableClickPropagation", "disableScrollPropagation", "root", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "Tooltip", "Provider", "addTo", "remove", "Map", "Root", "Canvas", "Zoom", "onAction", "ZoomControls", "Action", "ActionControls"]
7
7
  }