@dxos/react-ui-geo 0.7.5-staging.2ff1350 → 0.7.5-staging.e6154f3

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.
@@ -413,7 +413,7 @@ var useDrag = (controller, options = {}) => {
413
413
  };
414
414
  }, [
415
415
  controller,
416
- options
416
+ JSON.stringify(options)
417
417
  ]);
418
418
  };
419
419
  var cancelDrag = (node) => node.on(".drag", null);
@@ -519,11 +519,13 @@ var useSpinner = (controller, options = {}) => {
519
519
  import * as d36 from "d3";
520
520
  import { useEffect as useEffect3, useState as useState2 } from "react";
521
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";
522
524
  var TRANSITION_NAME = "globe-tour";
523
525
  var defaultDuration = 1500;
524
- var useTour = (controller, features, options = {}) => {
526
+ var useTour = (controller, points, options = {}) => {
525
527
  const selection2 = d36.selection();
526
- const [running, setRunning] = useState2(false);
528
+ const [running, setRunning] = useState2(options.running ?? false);
527
529
  useEffect3(() => {
528
530
  if (!running) {
529
531
  selection2.interrupt(TRANSITION_NAME);
@@ -537,10 +539,16 @@ var useTour = (controller, features, options = {}) => {
537
539
  alpha: false
538
540
  });
539
541
  const path = d36.geoPath(projection, context).pointRadius(2);
540
- const tilt = 0;
542
+ const tilt = options.tilt ?? 0;
541
543
  let last;
542
544
  try {
543
- 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) {
544
552
  if (!running) {
545
553
  break;
546
554
  }
@@ -578,13 +586,22 @@ var useTour = (controller, features, options = {}) => {
578
586
  context.fill();
579
587
  }
580
588
  context.restore();
581
- projection.rotate(iv(t2));
582
- setRotation(projection.rotate());
589
+ if (options.autoRotate) {
590
+ projection.rotate(iv(t2));
591
+ setRotation(projection.rotate());
592
+ }
583
593
  });
584
594
  await transition2.end();
585
595
  last = next;
586
596
  }
587
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 {
588
605
  setRunning(false);
589
606
  }
590
607
  });
@@ -595,15 +612,12 @@ var useTour = (controller, features, options = {}) => {
595
612
  }
596
613
  }, [
597
614
  controller,
598
- running
615
+ running,
616
+ JSON.stringify(options)
599
617
  ]);
600
618
  return [
601
- () => {
602
- if (!options.disabled) {
603
- setRunning(true);
604
- }
605
- },
606
- () => setRunning(false)
619
+ running,
620
+ setRunning
607
621
  ];
608
622
  };
609
623
 
@@ -870,14 +884,13 @@ var Globe = {
870
884
 
871
885
  // packages/ui/react-ui-geo/src/components/Map/Map.tsx
872
886
  import "leaflet/dist/leaflet.css";
873
- import L from "leaflet";
874
- import { Control, DomEvent, DomUtil, latLngBounds } from "leaflet";
887
+ import L, { Control, DomEvent, DomUtil, latLngBounds } from "leaflet";
875
888
  import React4, { forwardRef as forwardRef2, useEffect as useEffect5, useImperativeHandle as useImperativeHandle2 } from "react";
876
889
  import { createRoot } from "react-dom/client";
877
890
  import { MapContainer, Marker, Popup, TileLayer, useMap } from "react-leaflet";
878
891
  import { useResizeDetector as useResizeDetector2 } from "react-resize-detector";
879
892
  import { debounce } from "@dxos/async";
880
- import { Tooltip, ThemeProvider } from "@dxos/react-ui";
893
+ import { ThemeProvider, Tooltip } from "@dxos/react-ui";
881
894
  import { defaultTx, mx as mx2 } from "@dxos/react-ui-theme";
882
895
  var defaults = {
883
896
  // TODO(burdon): Guess location.
@@ -899,7 +912,7 @@ var MapRoot = ({ classNames, center = defaults.center, zoom = defaults.zoom, ...
899
912
  ...props
900
913
  });
901
914
  };
902
- var MapCanvas = /* @__PURE__ */ forwardRef2(({ markers = [], center, zoom, onChange }, forwardedRef) => {
915
+ var MapCanvas = /* @__PURE__ */ forwardRef2(({ markers, center, zoom, onChange }, forwardedRef) => {
903
916
  const { ref, width, height } = useResizeDetector2({
904
917
  refreshRate: 200
905
918
  });
@@ -965,7 +978,7 @@ var MapCanvas = /* @__PURE__ */ forwardRef2(({ markers = [], center, zoom, onCha
965
978
  }, /* @__PURE__ */ React4.createElement(TileLayer, {
966
979
  className: "dark:filter dark:grayscale dark:invert",
967
980
  url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
968
- }), markers.map(({ id, title, location: { lat, lng } }) => {
981
+ }), markers?.map(({ id, title, location: { lat, lng } }) => {
969
982
  return /* @__PURE__ */ React4.createElement(Marker, {
970
983
  key: id,
971
984
  position: {
@@ -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, 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, 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 { 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 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 {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//\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", "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", "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", "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", "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"]
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": ";;;;;AAIA,YAAYA,SAAQ;AAGpB,OAAOC,UAELC,YACAC,aAAAA,YACAC,qBACAC,SACAC,QACAC,YAAAA,iBACK;AACP,SAASC,yBAAyB;AAGlC,SAA+CC,eAAeC,uBAAuB;AACrF,SAASC,UAAU;;;AChBnB,OAAOC,SAASC,eAA2EC,kBAAkB;AAE7G,SAASC,aAAa;AACtB,SAASC,0BAA0B;AAqBnC,IAAMC,eAAeC,8BAAgCC,MAAAA;AAM9C,IAAMC,uBAAuB,CAAC,EACnCC,UACAC,MACAC,QAAQC,SACRC,OAAOC,QACPC,aAAaC,cACbC,UAAUC,UAAS,MACO;AAC1B,QAAM,CAACP,QAAQQ,SAAAA,IAAaC,mBAAmBR,OAAAA;AAC/C,QAAM,CAACC,OAAOQ,QAAAA,IAAYD,mBAAmBN,MAAAA;AAC7C,QAAM,CAACC,aAAaO,cAAAA,IAAkBF,mBAA0BJ,YAAAA;AAChE,QAAM,CAACC,UAAUM,WAAAA,IAAeH,mBAA2BF,SAAAA;AAE3D,SACE,sBAAA,cAACb,aAAamB,UAAQ;IACpBC,OAAO;MAAEf;MAAMC;MAAQE;MAAOE;MAAaE;MAAUE;MAAWE;MAAUC;MAAgBC;IAAY;KAErGd,QAAAA;AAGP;AAEO,IAAMiB,kBAAkB,MAAA;AAC7B,SAAOC,WAAWtB,YAAAA,KAAiBuB,MAAM,IAAIC,MAAM,sBAAA,CAAA;AACrD;;;ACtDA,YAAYC,SAAQ;AACpB,SAASC,iBAAiB;;;ACD1B,IAAMC,QAAQ;AAEP,IAAMC,QAAQ,CAAWC,OAAAA;AAC9B,QAAMC,QAAQC,KAAKC,IAAG;AACtB,QAAMC,OAAOJ,GAAAA;AACb,QAAMK,IAAIH,KAAKC,IAAG,IAAKF,QAAQ;AAC/B,MAAIH,OAAO;AAETQ,YAAQC,IAAI;MAAEF;MAAGD;IAAK,CAAA;EACxB;AAEA,SAAOA;AACT;;;ACVA,YAAYI,QAAQ;AACpB,OAAOC,YAAY;AAEZ,IAAMC,eACX,CAACC,SACD,CAACC,UAAoBC,YACnBA,QAAQC,IAAI,CAACC,GAAGC,MAAOL,KAAKK,CAAAA,IAAKD,IAAIH,SAASI,CAAAA,CAAE;AAM7C,IAAMC,iBAAiB,CAACC,QAAQC,QAAQC,YAAYC,YAAAA;AACzD,MAAI,CAACA,SAAS;AACZA,cAAU,CAAC;EACb;AAIA,MAAIH,OAAOI,MAAM;AACfJ,aAASA,OAAOI,KAAI;EACtB;AACAJ,WAAYK,UAAOL,MAAAA;AAGnB,QAAMM,UAAUC,qBAAqB;IACnCL;IACAD,QAAQ,CAACO,aAAAA;AACPN,iBAAWO,OAAOD,QAAAA;AAClBP,gBAAUA,OAAAA;IACZ;IACAR,MAAMD,aAAaW,QAAQO,QAAQ;MAAC;MAAM;MAAO;QAAS;MAAC;MAAM;MAAM;KAAK;IAC5EC,OAAOR,QAAQQ;IACfC,MAAMT,QAAQS;IACdC,KAAKV,QAAQU;IACbC,MAAMX,QAAQW;IACdC,QAAQZ,QAAQY;IAChBC,MAAMb,QAAQa;IACdC,MAAMd,QAAQc;EAChB,CAAA;AAEAjB,SAAOkB,KAAQC,QAAI,EAAGC,GAAG,SAASd,QAAQK,KAAK,EAAES,GAAG,QAAQd,QAAQM,IAAI,EAAEQ,GAAG,OAAOd,QAAQO,GAAG,CAAA;AAC/F,SAAOP;AACT;AAQA,IAAMC,uBAAuB,CAACc,QAAAA;AAC5B,QAAMnB,aAAamB,IAAInB;AAEvB,MAAIoB;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AACJ,MAAIC;AAEJ,QAAMrB,UAAUsB,cAAc;IAC5BnC,MAAM4B,IAAI5B;IAEVkB,OAAO,MAAA;AACLW,WAAKO,OAAOC,UAAU5B,WAAW6B,OAAOzB,QAAQ0B,QAAQ,CAAA;AACxDT,WAAKrB,WAAWO,OAAM;AACtBe,WAAKK,OAAON,EAAAA;AACZF,UAAIV,SAASU,IAAIV,MAAK;IACxB;IAEAC,MAAM,MAAA;AACJ,YAAMqB,MAAM/B,WAAWO,OAAOc,EAAAA,EAAIQ,OAAOzB,QAAQ0B,QAAQ;AACzD,UAAIE,MAAMD,IAAI,CAAA,CAAE,GAAG;AACjB;MACF;AACA,YAAME,KAAKN,OAAOC,UAAUG,GAAAA;AAC5B,YAAMG,KAAKP,OAAOQ,SAASb,IAAIK,OAAOS,MAAMhB,IAAIa,EAAAA,CAAAA;AAChD,YAAMI,KAAKV,OAAOrB,SAAS4B,EAAAA;AAC3B,YAAMI,KAAKnB,IAAI5B,KAAK8B,IAAIgB,EAAAA;AACxBlB,UAAIpB,OAAOuC,EAAAA;AACXnB,UAAIT,QAAQS,IAAIT,KAAI;IACtB;IAEAC,KAAK,MAAA;AAEHY,YAAMI,OAAOC,UAAU5B,WAAW6B,OAAOzB,QAAQ0B,SAASpC,IAAI,CAACC,GAAGC,MAAMD,IAAIS,QAAQmC,SAAS3C,CAAAA,IAAK,GAAA,CAAA,CAAA;AAClG6B,YAAME,OAAO3B,WAAWO,OAAM,CAAA;AAC9BiB,YAAMG,OAAOC,UAAU5B,WAAW6B,OAAOzB,QAAQ0B,QAAQ,CAAA;AACzDX,UAAIR,OAAOQ,IAAIR,IAAG;IACpB;IAEAC,MAAMO,IAAIP;IAEVC,QAAQM,IAAIN;IAEZd,QAAQ,CAACyC,MAAAA;AACP,YAAMH,KAAKV,OAAOrB,SAASqB,OAAOQ,SAASV,KAAKE,OAAOS,MAAMb,KAAKC,KAAKgB,IAAI,GAAA,CAAA,CAAA;AAC3E,YAAMF,KAAKnB,IAAI5B,KAAK8B,IAAIgB,EAAAA;AACxBlB,UAAIpB,UAAUoB,IAAIpB,OAAOuC,EAAAA;IAC3B;IAEAxB,MAAMK,IAAIL;EACZ,CAAA;AAEA,SAAOV;AACT;AAEA,SAASsB,cAAcP,KAAG;AACxB,QAAMsB,IAAItB,IAAIL,QAAQ;AACtB,QAAM4B,QAAQ;AACd,QAAMC,IAAI,CAACC,KAAKC,IAAI,IAAI,IAAIH,KAAAA;AAC5B,QAAMtC,UAAU;IACd0B,UAAU;MAAC;MAAG;;IACdS,UAAU;MAAC;MAAG;;IACdO,OAAUA,SAAM,MAAA;IAAO,CAAA;IACvBhC,MAAM;IACN0B,GAAG;IAEH/B,OAAO,SAAUsC,IAAE;AACjB,YAAMjB,WAAW;QAACiB,GAAGC;QAAGD,GAAGE;;AAC3B7C,cAAQ0B,WAAWA;AACnB1B,cAAQmC,WAAW;QAAC;QAAG;;AACvBnC,cAAQ0C,MAAMlC,KAAI;AAClB,WAAKsC,UAAUC,OAAO,SAAA;AACtB,WAAKD,UAAUE,IAAI,UAAA;AACnBjC,UAAIV,SAASU,IAAIV,MAAMO,KAAK,MAAMc,QAAAA;IACpC;IAEApB,MAAM,SAAUqC,IAAE;AAChB,YAAMjB,WAAW;QAACiB,GAAGC;QAAGD,GAAGE;;AAE3B,YAAMnC,OAAOuC,YAAYC,IAAG;AAC5B,YAAMC,YAAYzC,OAAOV,QAAQU;AACjC,YAAM0C,QAAQ,IAAIZ,KAAKa,IAAI,CAACF,YAAY,GAAA;AACxCnD,cAAQmC,WAAWnC,QAAQmC,SAAS7C,IAAI,CAACC,GAAGC,MAAAA;AAC1C,cAAM8D,WAAW5B,SAASlC,CAAAA,IAAKQ,QAAQ0B,SAASlC,CAAAA;AAChD,cAAM2D,aAAYzC,OAAOV,QAAQU;AACjC,eAAQ,OAAS,IAAI0C,SAASE,WAAYH,aAAY5D,IAAI6D;MAC5D,CAAA;AAGApD,cAAQmC,WAAWpB,IAAI5B,KAAK;QAAC;QAAG;SAAIa,QAAQmC,QAAQ;AAEpDnC,cAAQU,OAAOA;AACfV,cAAQ0B,WAAWA;AACnBX,UAAIT,QAAQS,IAAIT,KAAKM,KAAK,MAAMc,QAAAA;IAClC;IAEAnB,KAAK,SAAUoC,IAAE;AACf,WAAKG,UAAUC,OAAO,YAAY,SAAA;AAElC,YAAMQ,IAAIvD,QAAQmC;AAClB,UAAIoB,EAAE,CAAA,IAAKA,EAAE,CAAA,IAAKA,EAAE,CAAA,IAAKA,EAAE,CAAA,IAAK,KAAK;AACnCvD,gBAAQ0C,MAAMlC,KAAI;AAClB,eAAOO,IAAIP,QAAQO,IAAIP,KAAI;MAC7B;AAEA,YAAME,OAAOuC,YAAYC,IAAG;AAC5B,YAAMC,YAAYzC,OAAOV,QAAQU;AAEjC,UAAIK,IAAIJ,SAAS6C,QAAW;AAC1BzC,YAAIJ,OAAO;MACb;AAEA,UAAIwC,aAAapC,IAAIJ,MAAM;AACzBX,gBAAQ0C,MAAMlC,KAAI;AAClB,eAAOO,IAAIP,QAAQO,IAAIP,KAAI;MAC7B;AAEA,WAAKsC,UAAUE,IAAI,SAAA;AACnBjC,UAAIR,OAAOQ,IAAIR,IAAG;AAElB,YAAMkD,OAAO;AACbzD,cAAQ0C,MAAMgB,QAAQ,CAACC,MAAAA;AACrB3D,gBAAQoC,IAAIE,SAAS,IAAIE,KAAKa,IAAK,CAACd,IAAIoB,IAAKtB,CAAAA;AAC7CtB,YAAIpB,UAAUoB,IAAIpB,OAAOK,QAAQoC,CAAC;AAClC,YAAIpC,QAAQoC,IAAI,GAAG;AACjBpC,kBAAQ0C,MAAMlC,KAAI;AAClBiD,eAAKX,UAAUC,OAAO,SAAA;AACtB/C,kBAAQmC,WAAW;YAAC;YAAG;;AACvBnC,kBAAQoC,IAAI;AACZrB,cAAIN,UAAUM,IAAIN,OAAM;QAC1B;MACF,CAAA;IACF;EACF;AAEAT,UAAQ0C,MAAMlC,KAAI;AAClB,SAAOR;AACT;;;AChMA,YAAY4D,SAAQ;AAUb,IAAMC,qBAAqB,CAAC,CAACC,KAAKC,GAAAA,GAAwBC,OAAO,MAAc;EAAC,CAACF;EAAKE,OAAOD;EAAK;;AAElG,IAAME,gBAAgB,CAAC,EAAEF,KAAKD,IAAG,MAAiC;EAACA;EAAKC;;AAExE,IAAMG,WAAW,CAACC,WAA0B;EAAEC,MAAM;EAASC,aAAaJ,cAAcE,KAAAA;AAAO;AAG/F,IAAMG,aAAY,CAAC,EAAEP,KAAKD,IAAG,GAAYS,WAC3CD,cAAS,EAAGC,OAAOA,MAAAA,EAAQC,OAAO;EAACV;EAAKC;CAAI,EAAA;AAE1C,IAAMU,UAAU,CAACC,IAAYC,QAAoC;EACtEP,MAAM;EACNC,aAAa;IACX;MAACK,GAAGZ;MAAKY,GAAGX;;IACZ;MAACY,GAAGb;MAAKa,GAAGZ;;;AAEhB;AAEO,IAAMa,eAAe,CAACC,QAAoBC,WAAAA;AAC/C,MAAID,OAAOE,WAAW,GAAG;AACvB,WAAOD;EACT;AAEA,MAAIF,gBAAeC,OAAO,CAAA;AAC1B,MAAIG,cAAcC,YAAYJ,OAAO,CAAA,GAAIC,MAAAA;AAEzC,aAAWX,SAASU,QAAQ;AAC1B,UAAMK,WAAWD,YAAYd,OAAOW,MAAAA;AACpC,QAAII,WAAWF,aAAa;AAC1BA,oBAAcE;AACdN,MAAAA,gBAAeT;IACjB;EACF;AAEA,SAAOS;AACT;AAEO,IAAMK,cAAc,CAACE,QAAkBC,WAAAA;AAC5C,QAAMC,KAAKF,OAAO,CAAA,IAAKC,OAAO,CAAA;AAC9B,QAAME,KAAKH,OAAO,CAAA,IAAKC,OAAO,CAAA;AAC9B,SAAOG,KAAKC,KAAKH,KAAKA,KAAKC,KAAKA,EAAAA;AAClC;;;ACnDA,YAAYG,SAAQ;AAEpB,YAAYC,cAAc;AAkCnB,IAAMC,eAAe,CAACC,UAAoBC,UAAoBC,WAAAA;AACnE,QAAMC,SAAkB,CAAA;AAExB,MAAID,OAAOE,OAAO;AAChBD,WAAOE,KAAK;MACVH,QAAQA,OAAOE;MACfE,MAAM;QACJC,MAAM;MACR;IACF,CAAA;EACF;AAEA,MAAIL,OAAOM,WAAW;AACpBL,WAAOE,KAAK;MACVH,QAAQA,OAAOM;MACfF,MAASG,iBAAY,EAAGC,KAAK;QAAC;QAAG;OAAE,EAAA;IACrC,CAAA;EACF;AAMA,MAAIV,UAAU;AACZ,QAAIA,SAASW,QAAQC,QAAQV,OAAOU,MAAM;AACxCT,aAAOE,KAAK;QACVH,QAAQA,OAAOU;QACfN,MAAeO,iBAAQb,UAAUA,SAASW,QAAQC,IAAI;MACxD,CAAA;IACF;AAEA,QAAIZ,SAASW,QAAQG,aAAaZ,OAAOa,QAAQ;AAC/CZ,aAAOE,KAAK;QACVH,QAAQA,OAAOa;QACfT,MAAeU,cAAKhB,UAAUA,SAASW,QAAQG,WAAW,CAACG,GAAQC,MAAWD,MAAMC,CAAAA;MACtF,CAAA;IACF;AAEA,QAAIlB,SAASW,QAAQQ,QAAQjB,OAAOiB,MAAM;AACxChB,aAAOE,KAAK;QACVH,QAAQA,OAAOiB;QACfb,MAAMN,SAASW,QAAQQ;MACzB,CAAA;IACF;EACF;AAMA,MAAIlB,UAAU;AACZ,UAAM,EAAEmB,QAAQC,MAAK,IAAKpB;AAE1B,QAAImB,UAAUlB,OAAOoB,OAAO;AAC1BnB,aAAOE,KAAK;QACVH,QAAQA,OAAOoB;QACfhB,MAAM;UACJC,MAAM;UACNgB,YAAYH,OAAOI,IAAI,CAACF,UAAUG,SAASH,KAAAA,CAAAA;QAC7C;MACF,CAAA;IACF;AAEA,QAAID,SAASnB,OAAOwB,MAAM;AACxBvB,aAAOE,KAAK;QACVH,QAAQA,OAAOwB;QACfpB,MAAM;UACJC,MAAM;UACNgB,YAAYF,MAAMG,IAAI,CAAC,EAAEG,QAAQC,OAAM,MAAOC,QAAQF,QAAQC,MAAAA,CAAAA;QAChE;MACF,CAAA;IACF;EACF;AAEA,SAAOzB;AACT;AAKO,IAAM2B,eAAe,CAACC,WAAoB5B,SAAkB,CAAA,GAAI6B,OAAe9B,WAAAA;AACpF,QAAM+B,UAAoCF,UAAUE,QAAO;AAC3D,QAAM,EACJC,QAAQ,EAAEC,OAAOC,OAAM,EAAE,IACvBH;AACJA,UAAQI,MAAK;AAGb,MAAInC,OAAOoC,YAAY;AACrBL,YAAQM,YAAYrC,OAAOoC,WAAWC;AACtCN,YAAQO,SAAS,GAAG,GAAGL,OAAOC,MAAAA;EAChC,OAAO;AACLH,YAAQQ,UAAU,GAAG,GAAGN,OAAOC,MAAAA;EACjC;AAIAjC,SAAOuC,QAAQ,CAAC,EAAEpC,MAAMJ,QAAAA,QAAM,MAAE;AAC9B+B,YAAQU,KAAI;AACZ,QAAIC,OAAO;AACX,QAAIC,SAAS;AACb,QAAI3C,SAAQ;AACV4C,aAAOC,QAAQ7C,OAAAA,EAAQwC,QAAQ,CAAC,CAACM,KAAKC,KAAAA,MAAM;AAC1C,YAAID,QAAQ,eAAe;AACzBjB,oBAAUmB,YAAYD,QAAQjB,KAAAA;QAChC,OAAO;AACLC,kBAAQe,GAAAA,IAAOC;AACfL,mBAASI,QAAQ;AACjBH,qBAAWG,QAAQ;QACrB;MACF,CAAA;IACF;AAEAf,YAAQkB,UAAS;AAEjBpB,cAAUzB,IAAAA;AACVsC,YAAQX,QAAQW,KAAI;AACpBC,cAAUZ,QAAQY,OAAM;AACxBZ,YAAQmB,QAAO;EACjB,CAAA;AAEA,SAAOnB;AACT;;;AJzIO,IAAMoB,UAAU,CAACC,YAAqCC,UAAuB,CAAC,MAAC;AACpFC,YAAU,MAAA;AACR,UAAMC,SAASH,YAAYG;AAC3B,QAAI,CAACA,UAAUF,QAAQG,UAAU;AAC/B;IACF;AAEAC,mBACKC,WAAOH,MAAAA,GACV,MAAA;AACEH,iBAAWO,YAAYP,WAAWQ,WAAWC,OAAM,CAAA;AACnDR,cAAQS,WAAW;QAAEC,MAAM;QAAQX;MAAW,CAAA;IAChD,GACAA,WAAWQ,YACX;MACEI,OAAOX,QAAQW;MACfC,MAAM;MACNC,OAAO,MAAMb,QAAQS,WAAW;QAAEC,MAAM;QAASX;MAAW,CAAA;MAC5De,QAAQ,MAAMd,QAAQS,WAAW;QAAEC,MAAM;QAAOX;MAAW,CAAA;IAC7D,CAAA;AAIF,WAAO,MAAA;AACLgB,iBAAcV,WAAOH,MAAAA,CAAAA;IACvB;EACF,GAAG;IAACH;IAAYiB,KAAKC,UAAUjB,OAAAA;GAAS;AAC1C;AAEA,IAAMe,aAAa,CAACG,SAASA,KAAKC,GAAG,SAAS,IAAA;;;AKlD9C,SAASC,mBAAmB;AAIrB,IAAMC,sBAAsB,CAACC,eAAAA;AAClC,SAAOC,YACL,CAACC,UAAAA;AACC,QAAI,CAACF,YAAY;AACf;IACF;AAEA,YAAQE,OAAAA;MACN,KAAK,WAAW;AACdF,mBAAWG,SAAS,CAACC,UAAUA,QAAQ,GAAA;AACvC;MACF;MACA,KAAK,YAAY;AACfJ,mBAAWG,SAAS,CAACC,UAAUA,QAAQ,GAAA;AACvC;MACF;IACF;EACF,GACA;IAACJ;GAAW;AAEhB;;;ACxBA,SAASK,eAAAA,oBAAmB;AAIrB,IAAMC,oBAAoB,CAACC,eAAAA;AAChC,SAAOC,aACL,CAACC,UAAAA;AACC,QAAI,CAACF,YAAY;AACf;IACF;AAEA,YAAQE,OAAAA;MACN,KAAK,WAAW;AACdF,mBAAWG,QAAQ,CAACC,UAAUA,QAAQ,CAAA;AACtC;MACF;MACA,KAAK,YAAY;AACfJ,mBAAWG,QAAQ,CAACC,UAAUA,QAAQ,CAAA;AACtC;MACF;IACF;EACF,GACA;IAACJ;GAAW;AAEhB;;;ACxBA,YAAYK,SAAQ;AAEpB,SAASC,aAAAA,YAAWC,gBAAgB;AAa7B,IAAMC,aAAa,CAACC,YAAqCC,UAA0B,CAAC,MAAC;AAC1F,QAAM,CAACC,SAASC,UAAAA,IAAcC,SAAS,KAAA;AACvCC,EAAAA,WAAU,MAAA;AACR,QAAIC;AAEJ,UAAMC,QAAQ,MAAA;AACZ,YAAMC,QAAgBP,QAAQO,SAAS;QAAC;QAAO;QAAG;;AAElD,UAAIC,IAAI;AACR,UAAIC,eAAeV,WAAWW,WAAWC,OAAM;AAC/CN,MAAAA,SAAWA,UAAM,CAACO,YAAAA;AAChB,cAAMC,KAAKD,UAAUJ;AACrBA,YAAII;AAEJ,cAAME,WAAmB;UACvBL,aAAa,CAAA,IAAKF,MAAM,CAAA,IAAKM;UAC7BJ,aAAa,CAAA,IAAKF,MAAM,CAAA,IAAKM;UAC7BJ,aAAa,CAAA,IAAKF,MAAM,CAAA,IAAKM;;AAG/BJ,uBAAeK;AACff,mBAAWgB,YAAYD,QAAAA;MACzB,CAAA;IACF;AAEA,UAAME,OAAO,MAAA;AACX,UAAIX,QAAO;AACTA,QAAAA,OAAMW,KAAI;AACVX,QAAAA,SAAQY;MACV;IACF;AAEA,QAAIlB,cAAcE,SAAS;AACzBK,YAAAA;IACF,OAAO;AACLU,WAAAA;IACF;AAEA,WAAO,MAAMA,KAAAA;EACf,GAAG;IAACjB;IAAYE;GAAQ;AAExB,SAAO;IACL,MAAA;AACE,UAAI,CAACD,QAAQkB,UAAU;AACrBhB,mBAAW,IAAA;MACb;IACF;IACA,MAAMA,WAAW,KAAA;;AAErB;;;AChEA,YAAYiB,SAAQ;AACpB,SAA6CC,aAAAA,YAAWC,YAAAA,iBAAgB;AACxE,OAAOC,aAAY;AAEnB,SAASC,WAAW;;AAKpB,IAAMC,kBAAkB;AAExB,IAAMC,kBAAkB;AAgBjB,IAAMC,UAAU,CACrBC,YACAC,QACAC,UAAuB,CAAC,MAAC;AAEzB,QAAMC,aAAeA,cAAS;AAC9B,QAAM,CAACC,SAASC,UAAAA,IAAcC,UAASJ,QAAQE,WAAW,KAAA;AAC1DG,EAAAA,WAAU,MAAA;AACR,QAAI,CAACH,SAAS;AACZD,MAAAA,WAAUK,UAAUX,eAAAA;AACpB;IACF;AAEA,QAAIY;AACJ,QAAIT,cAAcI,SAAS;AACzBK,UAAIC,WAAW,YAAA;AACb,cAAM,EAAEC,QAAQC,YAAYC,YAAW,IAAKb;AAC5C,cAAMc,UAAUH,OAAOI,WAAW,MAAM;UAAEC,OAAO;QAAM,CAAA;AACvD,cAAMC,OAAUC,YAAQN,YAAYE,OAAAA,EAASK,YAAY,CAAA;AAEzD,cAAMC,OAAOlB,QAAQkB,QAAQ;AAC7B,YAAIC;AACJ,YAAI;AACF,gBAAMC,IAAI;eAAIrB;;AACd,cAAIC,QAAQqB,MAAM;AAChBD,cAAEE,KAAKF,EAAE,CAAA,CAAE;UACb;AAEA,qBAAWG,QAAQH,GAAG;AACpB,gBAAI,CAAClB,SAAS;AACZ;YACF;AAGA,kBAAMsB,KAAKL,OAAOM,cAAcN,IAAAA,IAAQO;AACxC,kBAAMC,KAAKF,cAAcF,IAAAA;AACzB,kBAAMK,KAAQC,mBAAeL,MAAMG,IAAIA,EAAAA;AACvC,kBAAMG,WAAcC,gBAAYP,MAAMG,IAAIA,EAAAA;AAG1C,kBAAMK,KAAKR,KAAKS,mBAAmBT,IAAIN,IAAAA,IAAQpB,WAAWY,WAAWwB,OAAM;AAC3E,kBAAMC,KAAKF,mBAAmBN,IAAIT,IAAAA;AAClC,kBAAMkB,KAAKC,QAAOC,YAAYN,IAAIG,EAAAA;AAElC,kBAAMI,cAAatC,WAChBsC,WAAW5C,eAAAA,EACX6C,SAASC,KAAKC,IAAI1C,QAAQwC,YAAY5C,iBAAiBkC,WAAW,GAAA,CAAA,EAClEa,MAAM,UAAU,MAAM,CAACpC,OAAAA;AACtB,oBAAMqC,KAAKH,KAAKC,IAAI,GAAGD,KAAKI,IAAI,GAAGtC,KAAI,IAAI,CAAA,CAAA;AAC3C,oBAAMuC,MAAKL,KAAKI,IAAI,GAAGtC,KAAI,CAAA;AAE3BK,sBAAQmC,KAAI;AACZ;AACEnC,wBAAQoC,UAAS;AACjBpC,wBAAQqC,cAAcjD,SAASkD,QAAQC,KAAKF,eAAe;AAC3DrC,wBAAQwC,aAAapD,SAASkD,QAAQC,KAAKC,aAAa,QAAQtD,YAAYuD,SAAS;AACrFzC,wBAAQ0C,YAAYtD,SAASkD,QAAQC,KAAKI,YAAY,CAAA,CAAE;AACxDxC,qBAAK;kBAAEyC,MAAM;kBAAcC,aAAa;oBAAC7B,GAAGgB,EAAAA;oBAAKhB,GAAGkB,GAAAA;;gBAAK,CAAA;AACzDlC,wBAAQ8C,OAAM;AAEd9C,wBAAQoC,UAAS;AACjBpC,wBAAQ+C,YAAY3D,SAASkD,QAAQU,QAAQD,aAAa;AAC1D5C,qBAAKE,aAAajB,SAASkD,QAAQU,QAAQ3C,eAAe,MAAMnB,YAAYuD,SAAS,EAAA;AACrFtC,qBAAK;kBAAEyC,MAAM;kBAASC,aAAa7B,GAAGkB,GAAAA;gBAAI,CAAA;AAC1ClC,wBAAQiD,KAAI;cACd;AACAjD,sBAAQkD,QAAO;AAGf,kBAAI9D,QAAQ+D,YAAY;AACtBrD,2BAAWwB,OAAOE,GAAG7B,EAAAA,CAAAA;AACrBI,4BAAYD,WAAWwB,OAAM,CAAA;cAC/B;YACF,CAAA;AAGF,kBAAMK,YAAWyB,IAAG;AACpB7C,mBAAOI;UACT;QACF,SAAS0C,KAAK;AACZC,cAAIC,MAAMF,KAAAA,QAAAA;;;;;;QACZ,UAAA;AACE9D,qBAAW,KAAA;QACb;MACF,CAAA;AAEA,aAAO,MAAA;AACLiE,qBAAa7D,CAAAA;AACbN,QAAAA,WAAUK,UAAUX,eAAAA;MACtB;IACF;EACF,GAAG;IAACG;IAAYI;IAASmE,KAAKC,UAAUtE,OAAAA;GAAS;AAEjD,SAAO;IAACE;IAASC;;AACnB;;;ACxHA,OAAOoE,YAAW;AAElB,SAASC,YAAkCC,eAAe;AAQnD,IAAMC,mBAAoD;EAC/DC,SAAS;EACTC,UAAU;EACVC,YAAY;EACZC,aAAa;AACf;AAEO,IAAMC,eAAe,CAAC,EAAEC,YAAYC,SAAQ,MAAgB;AACjE,SACE,gBAAAC,OAAA,cAACC,QAAQC,MAAI;IAACJ,YAAY;MAAC;MAASA;;KAClC,gBAAAE,OAAA,cAACG,YAAAA;;IAECC,MAAK;IACLC,OAAM;IACNC,UAAAA;IACAC,MAAM;IACNT,YAAW;IACXU,SAAS,MAAMT,WAAW,SAAA;MAE5B,gBAAAC,OAAA,cAACG,YAAAA;;IAECC,MAAK;IACLC,OAAM;IACNC,UAAAA;IACAC,MAAM;IACNT,YAAW;IACXU,SAAS,MAAMT,WAAW,UAAA;;AAIlC;AAEO,IAAMU,iBAAiB,CAAC,EAAEX,YAAYC,SAAQ,MAAgB;AACnE,SACE,gBAAAC,OAAA,cAACC,QAAQC,MAAI;IAACJ,YAAY;MAAC;MAASA;;KAClC,gBAAAE,OAAA,cAACG,YAAAA;;IAECC,MAAK;IACLC,OAAM;IACNC,UAAAA;IACAC,MAAM;IACNT,YAAW;IACXU,SAAS,MAAMT,WAAW,OAAA;MAE5B,gBAAAC,OAAA,cAACG,YAAAA;;IAECC,MAAK;IACLC,OAAM;IACNC,UAAAA;IACAC,MAAM;IACNT,YAAW;IACXU,SAAS,MAAMT,WAAW,QAAA;;AAIlC;;;AX5BA,IAAMW,gBAA6C;EACjDC,OAAO;IACLC,YAAY;MACVC,WAAW;IACb;IAEAC,OAAO;MACLD,WAAW;IACb;IAEAE,MAAM;MACJF,WAAW;IACb;IAEAG,MAAM;MACJC,aAAa;IACf;IAEAC,OAAO;MACLL,WAAW;MACXI,aAAa;MACbE,aAAa;MACbC,aAAa;IACf;EACF;EACAC,MAAM;IACJT,YAAY;MACVC,WAAW;IACb;IAEAC,OAAO;MACLD,WAAW;IACb;IAEAE,MAAM;MACJF,WAAW;IACb;IAEAG,MAAM;MACJC,aAAa;IACf;IAEAC,OAAO;MACLL,WAAW;MACXI,aAAa;MACbE,aAAa;MACbC,aAAa;IACf;EACF;AACF;AASA,IAAME,gBAA6D;EACjEC,cAAiBC;EACjBC,UAAaC;EACb,uBAA0BC;AAC5B;AAEA,IAAMC,gBAAgB,CAACC,OAAuC,mBAAc;AAC1E,MAAI,OAAOA,SAAS,UAAU;AAC5B,UAAMC,cAAcR,cAAcO,IAAAA,KAAYL;AAC9C,WAAOM,YAAAA;EACT;AAEA,SAAOD,QAAWL,oBAAe;AACnC;AAQA,IAAMO,YAAY,CAAC,EAAEC,YAAYC,UAAU,GAAGC,MAAAA,MAAuB;AACnE,QAAM,EAAEC,KAAKC,OAAOC,OAAM,IAAKC,kBAAAA;AAC/B,SACE,gBAAAC,OAAA,cAACC,OAAAA;IAAIL;IAAUM,WAAWC,GAAG,sCAAsCV,UAAAA;KACjE,gBAAAO,OAAA,cAACI,sBAAAA;IAAqBC,MAAM;MAAER;MAAOC;IAAO;IAAI,GAAGH;KAChDD,QAAAA,CAAAA;AAIT;AAiBA,IAAMY,cAAcC,2BAClB,CAAC,EAAEC,YAAYC,aAAaC,UAAUC,UAAUC,QAAQC,QAAO,GAAIN,gBAAAA;AACjE,QAAM,EAAEO,UAAS,IAAKC,gBAAAA;AACtB,QAAMH,SAASI,QAAQ,MAAMH,WAAW1C,cAAc2C,SAAAA,GAAY;IAACD;IAASC;GAAU;AAGtF,QAAM,CAACG,QAAQC,SAAAA,IAAaC,UAA4B,IAAA;AACxD,QAAMC,YAAY,CAACH,YAA8BC,UAAUD,OAAAA;AAG3D,QAAMT,aAAaQ,QAAQ,MAAM3B,cAAcoB,WAAAA,GAAc;IAACA;GAAY;AAI1E,QAAMY,SAASL,QAAQ,MAAA;AACrB,WAAOM,MAAM,MAAMC,aAAab,UAAsBC,UAAUC,MAAAA,CAAAA;EAClE,GAAG;IAACF;IAAUC;IAAUC;GAAO;AAG/B,QAAM,EAAEP,MAAMmB,QAAQC,OAAOC,aAAaC,UAAUC,WAAWC,UAAUC,gBAAgBC,YAAW,IAClGC,gBAAAA;AAEF,QAAMC,WAAWC,cAAcT,KAAAA;AAG/BU,EAAAA,WAAU,MAAA;AACR,QAAIX,QAAQ;AACVK,eAAS,CAAA;AACTE,kBAAYK,mBAAmBC,cAAcb,MAAAA,CAAAA,CAAAA;IAC/C;EACF,GAAG;IAACA;GAAO;AAGX,QAAMc,UAAUC,OAAO,KAAA;AACvBC,sBACEjC,aACA,MAAA;AACE,WAAO;MACLU;MACAT;MACAgB;MACA,IAAIC,QAAQ;AACV,eAAOQ,SAASQ;MAClB;MACAf;MACAC;MACAC;MACAC,UAAU,CAACa,MAAAA;AACT,YAAI,OAAOA,MAAM,YAAY;AAC3B,gBAAMC,KAAQC,sBAAkBX,SAASQ,SAASC,EAAET,SAASQ,OAAO,CAAA;AAEpEI,UAAGC,eAAU,EACVC,KAAKT,QAAQG,UAAaO,iBAAgBC,cAAU,EACpDC,SAAS,GAAA,EACTC,MAAM,SAAS,MAAM,CAACC,MAAMvB,SAASc,GAAGS,CAAAA,CAAAA,CAAAA,EACxCC,GAAG,OAAO,MAAA;AACTf,oBAAQG,UAAU;UACpB,CAAA;QACJ,OAAO;AACLZ,mBAASa,CAAAA;QACX;MACF;MACAZ;MACAC;IACF;EACF,GACA;IAACd;GAAO;AAKV,QAAMqC,YAAYtC,QAChB,MAAMC,UAAUT,cAAiB+C,YAAQ/C,YAAYS,OAAOuC,WAAW,MAAM;IAAEC,OAAO;EAAM,CAAA,CAAA,GAC5F;IAACxC;IAAQT;GAAW;AAItB2B,EAAAA,WAAU,MAAA;AACR,QAAIlB,UAAUT,YAAY;AACxBc,YAAM,MAAA;AAEJd,mBACGiB,MAAOiC,KAAKC,IAAItD,KAAKR,OAAOQ,KAAKP,MAAM,IAAI,IAAK2B,KAAAA,EAChDmC,UAAU;UAACvD,KAAKR,QAAQ,KAAK6B,aAAamC,KAAK;UAAIxD,KAAKP,SAAS,KAAK4B,aAAaoC,KAAK;SAAG,EAC3FC,OAAOpC,YAAY;UAAC;UAAG;UAAG;SAAE;AAE/BqC,qBAAaV,WAAWjC,QAAQI,OAAOb,MAAAA;MACzC,CAAA;IACF;EACF,GAAG;IAAC0C;IAAWjD;IAAMoB;IAAOC;IAAaC;IAAUN;GAAO;AAE1D,MAAI,CAAChB,KAAKR,SAAS,CAACQ,KAAKP,QAAQ;AAC/B,WAAO;EACT;AAEA,SAAO,gBAAAE,OAAA,cAACiB,UAAAA;IAAOrB,KAAKwB;IAAWvB,OAAOQ,KAAKR;IAAOC,QAAQO,KAAKP;;AACjE,CAAA;AAGF,IAAMmE,aAAa,CAAC,EAAEC,WAAW,UAAS,MAAkC;AAC1E,QAAM,EAAE7D,MAAMoB,OAAOC,aAAaC,SAAQ,IAAKK,gBAAAA;AAC/C,SACE,gBAAAhC,OAAA,cAACC,OAAAA;IACCC,WAAWC,GACT,0EACAgE,iBAAiBD,QAAAA,CAAS;KAG5B,gBAAAlE,OAAA,cAACoE,OAAAA;IAAIlE,WAAU;KACZmE,KAAKC,UAAU;IAAEjE;IAAMoB;IAAOC;IAAaC;EAAS,GAAG,MAAM,CAAA,CAAA,CAAA;AAItE;AAEA,IAAM4C,aAAa,CAAC,EAClBL,UACAzE,YACAC,SAAQ,MAC4D;AACpE,SAAO,gBAAAM,OAAA,cAACC,OAAAA;IAAIC,WAAWC,GAAG,iCAAiCgE,iBAAiBD,QAAAA,GAAWzE,UAAAA;KAAcC,QAAAA;AACvG;AAEA,IAAM8E,gBAAgB,CAAC,EAAEN,UAAUxE,SAAQ,MAAoD;AAC7F,SAAO,gBAAAM,OAAA,cAACC,OAAAA;IAAIC,WAAWC,GAAG,iCAAiCgE,iBAAiBD,QAAAA,CAAS;KAAIxE,QAAAA;AAC3F;AAIO,IAAM+E,QAAQ;EACnBC,MAAMlF;EACNmF,QAAQrE;EACRsE,MAAM,CAAC,EAAEC,UAAUX,WAAW,cAAc,GAAGvE,MAAAA,MAC7C,gBAAAK,OAAA,cAACwE,eAAAA;IAAcN;IAAqB,GAAGvE;KACrC,gBAAAK,OAAA,cAAC8E,cAAAA;IAAaD;;EAGlBE,QAAQ,CAAC,EAAEF,UAAUX,WAAW,eAAe,GAAGvE,MAAAA,MAChD,gBAAAK,OAAA,cAACwE,eAAAA;IAAcN;IAAqB,GAAGvE;KACrC,gBAAAK,OAAA,cAACgF,gBAAAA;IAAeH;;EAGpBI,OAAOhB;EACPiB,OAAOX;AACT;;;AY9RA,OAAO;AAEP,OAAOY,KAAKC,SAASC,UAAUC,SAASC,oBAAiE;AACzG,OAAOC,UAASC,cAAAA,aAAYC,aAAAA,YAAWC,uBAAAA,4BAAmD;AAC1F,SAASC,kBAAkB;AAE3B,SAASC,cAAcC,QAAQC,OAAOC,WAAWC,cAAc;AAC/D,SAASC,qBAAAA,0BAAyB;AAElC,SAASC,gBAAgB;AACzB,SAASC,eAAeC,eAAqC;AAC7D,SAASC,WAAWC,MAAAA,WAAU;AAQ9B,IAAMC,WAAW;;EAEfC,QAAQ;IAAEC,KAAK;IAAIC,KAAK;EAAE;EAC1BC,MAAM;AACR;AASA,IAAMC,UAAU,CAAC,EAAEC,YAAYL,SAASD,SAASC,QAAQG,OAAOJ,SAASI,MAAM,GAAGG,MAAAA,MAAqB;AACrG,SACE,gBAAAC,OAAA,cAACC,cAAAA;IACCC,WAAWC,IAAG,mDAAmDL,UAAAA;IACjEM,oBAAoB;;IAEpBC,iBAAiB;IACjBC,aAAa;IACbb;IACAG;IACC,GAAGG;;AAGV;AAYA,IAAMQ,YAAYC,gBAAAA,YAA0C,CAAC,EAAEC,SAAShB,QAAQG,MAAMc,SAAQ,GAAIC,iBAAAA;AAChG,QAAM,EAAEC,KAAKC,OAAOC,OAAM,IAAKC,mBAAkB;IAAEC,aAAa;EAAI,CAAA;AACpE,QAAMC,MAAMC,OAAAA;AAEZC,EAAAA,qBACER,cACA,OAAO;IACLS,WAAW,CAAC3B,SAA0BG,UAAAA;AACpCqB,UAAII,QAAQ5B,SAAQG,KAAAA;IACtB;IACA0B,SAAS,CAACC,OAAAA;AACRN,UAAIK,QAAQC,GAAGN,IAAIO,QAAO,CAAA,CAAA;IAC5B;EACF,IACA;IAACP;GAAI;AAIPQ,EAAAA,WAAU,MAAA;AACR,QAAIZ,SAASC,QAAQ;AACnBG,UAAIS,eAAc;IACpB;EACF,GAAG;IAACb;IAAOC;GAAO;AAGlBW,EAAAA,WAAU,MAAA;AACR,QAAIhC,QAAQ;AACVwB,UAAII,QAAQ5B,QAAQG,IAAAA;IACtB,WAAWA,SAAS+B,QAAW;AAC7BV,UAAIK,QAAQ1B,IAAAA;IACd;EACF,GAAG;IAACH;IAAQG;GAAK;AAGjB6B,EAAAA,WAAU,MAAA;AACR,UAAMG,UAAUC,SAAS,MAAA;AACvBnB,iBAAW;QAAEjB,QAAQwB,IAAIa,UAAS;QAAIlC,MAAMqB,IAAIO,QAAO;MAAG,CAAA;IAC5D,GAAG,GAAA;AACHP,QAAIc,GAAG,QAAQH,OAAAA;AACfX,QAAIc,GAAG,QAAQH,OAAAA;AACf,WAAO,MAAA;AACLX,UAAIe,IAAI,QAAQJ,OAAAA;AAChBX,UAAIe,IAAI,QAAQJ,OAAAA;IAClB;EACF,GAAG;IAACX;IAAKP;GAAS;AAGlBe,EAAAA,WAAU,MAAA;AACR,QAAIhB,QAAQwB,SAAS,GAAG;AACtB,YAAMC,SAASC,aAAa1B,QAAQQ,IAAI,CAACmB,WAAWA,OAAOC,QAAQ,CAAA;AACnEpB,UAAIqB,UAAUJ,MAAAA;IAChB,OAAO;AACLjB,UAAII,QAAQ7B,SAASC,QAAQD,SAASI,IAAI;IAC5C;EACF,GAAG;IAACa;GAAQ;AAEZ,SACE,gBAAAT,OAAA,cAACuC,OAAAA;IAAI3B;IAAUV,WAAU;KAEvB,gBAAAF,OAAA,cAACwC,WAAAA;IACCtC,WAAU;IACVuC,KAAI;MAILhC,SAASQ,IAAI,CAAC,EAAEyB,IAAIC,OAAON,UAAU,EAAE3C,KAAKC,IAAG,EAAE,MAAE;AAClD,WACE,gBAAAK,OAAA,cAAC4C,QAAAA;MACCC,KAAKH;MACLI,UAAU;QAAEpD;QAAKC;MAAI;MACrBoD;;QAEE,IAAIC,EAAEC,KAAK;UACTC,SAAS;UACTC,eAAe;UACfC,WAAW;UACXC,UAAU;YAAC;YAAI;;UACfC,YAAY;YAAC;YAAI;;UACjBC,aAAa;YAAC;YAAG;;UACjBC,YAAY;YAAC;YAAI;;QACnB,CAAA;;OAGDb,SAAS,gBAAA3C,OAAA,cAACyD,OAAAA,MAAOd,KAAAA,CAAAA;EAGxB,CAAA,CAAA;AAGN,CAAA;AAOA,IAAMe,iBAAgB,CAAC,EACrBZ,UACAa,SAAQ,MAGR;AACA,QAAM1C,MAAMC,OAAAA;AAEZO,EAAAA,WAAU,MAAA;AACR,UAAMmC,UAAU,IAAIC,QAAQ;MAAEf;IAAS,CAAA;AACvCc,YAAQE,QAAQ,MAAA;AACd,YAAMC,YAAYC,QAAQC,OAAO,OAAO9D,IAAG,QAAQ+D,iBAAiBpB,QAAAA,CAAS,CAAA;AAC7EqB,eAASC,wBAAwBL,SAAAA;AACjCI,eAASE,yBAAyBN,SAAAA;AAElC,YAAMO,OAAOC,WAAWR,SAAAA;AACxBO,WAAKE,OACH,gBAAAxE,OAAA,cAACyE,eAAAA;QAAcC,IAAIC;SACjB,gBAAA3E,OAAA,cAAC4E,QAAQC,UAAQ,MAAElB,QAAAA,CAAAA,CAAAA;AAIvB,aAAOI;IACT;AAEAH,YAAQkB,MAAM7D,GAAAA;AACd,WAAO,MAAA;AACL2C,cAAQmB,OAAM;IAChB;EACF,GAAG;IAAC9D;IAAK6B;IAAUa;GAAS;AAE5B,SAAO;AACT;AAQO,IAAMqB,MAAM;EACjBC,MAAMpF;EACNqF,QAAQ3E;EACR4E,MAAM,CAAC,EAAEC,UAAUtC,WAAW,cAAc,GAAG/C,MAAAA,MAC7C,gBAAAC,OAAA,cAAC0D,gBAAAA;IAAcZ;IAAqB,GAAG/C;KACrC,gBAAAC,OAAA,cAACqF,cAAAA;IAAaD;;EAGlBE,QAAQ,CAAC,EAAEF,UAAUtC,WAAW,eAAe,GAAG/C,MAAAA,MAChD,gBAAAC,OAAA,cAAC0D,gBAAAA;IAAcZ;IAAqB,GAAG/C;KACrC,gBAAAC,OAAA,cAACuF,gBAAAA;IAAeH;;AAGtB;",
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
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/ui/react-ui-geo/data/countries-110m.ts":{"bytes":1352295,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/data.ts":{"bytes":914,"imports":[{"path":"packages/ui/react-ui-geo/data/countries-110m.ts","kind":"dynamic-import","original":"../data/countries-110m.ts"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/types.ts":{"bytes":951,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/context.tsx":{"bytes":5204,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/util/debug.ts":{"bytes":1506,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/util/inertia.ts":{"bytes":21992,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/util/path.ts":{"bytes":5846,"imports":[{"path":"d3","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/util/render.ts":{"bytes":12455,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"topojson-client","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/util/path.ts","kind":"import-statement","original":"./path"}],"format":"esm"},"packages/ui/react-ui-geo/src/util/index.ts":{"bytes":747,"imports":[{"path":"packages/ui/react-ui-geo/src/util/debug.ts","kind":"import-statement","original":"./debug"},{"path":"packages/ui/react-ui-geo/src/util/inertia.ts","kind":"import-statement","original":"./inertia"},{"path":"packages/ui/react-ui-geo/src/util/path.ts","kind":"import-statement","original":"./path"},{"path":"packages/ui/react-ui-geo/src/util/render.ts","kind":"import-statement","original":"./render"}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useDrag.ts":{"bytes":4603,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useGlobeZoomHandler.ts":{"bytes":2396,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useMapZoomHandler.ts":{"bytes":2362,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useSpinner.ts":{"bytes":5331,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useTour.ts":{"bytes":14072,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/index.ts":{"bytes":997,"imports":[{"path":"packages/ui/react-ui-geo/src/hooks/context.tsx","kind":"import-statement","original":"./context"},{"path":"packages/ui/react-ui-geo/src/hooks/useDrag.ts","kind":"import-statement","original":"./useDrag"},{"path":"packages/ui/react-ui-geo/src/hooks/useGlobeZoomHandler.ts","kind":"import-statement","original":"./useGlobeZoomHandler"},{"path":"packages/ui/react-ui-geo/src/hooks/useMapZoomHandler.ts","kind":"import-statement","original":"./useMapZoomHandler"},{"path":"packages/ui/react-ui-geo/src/hooks/useSpinner.ts","kind":"import-statement","original":"./useSpinner"},{"path":"packages/ui/react-ui-geo/src/hooks/useTour.ts","kind":"import-statement","original":"./useTour"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Toolbar/Controls.tsx":{"bytes":5932,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Toolbar/index.ts":{"bytes":515,"imports":[{"path":"packages/ui/react-ui-geo/src/components/Toolbar/Controls.tsx","kind":"import-statement","original":"./Controls"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Globe/Globe.tsx":{"bytes":26472,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/hooks/index.ts","kind":"import-statement","original":"../../hooks"},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"../../util"},{"path":"packages/ui/react-ui-geo/src/components/Toolbar/index.ts","kind":"import-statement","original":"../Toolbar"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Globe/index.ts":{"bytes":506,"imports":[{"path":"packages/ui/react-ui-geo/src/components/Globe/Globe.tsx","kind":"import-statement","original":"./Globe"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Map/Map.tsx":{"bytes":20960,"imports":[{"path":"leaflet/dist/leaflet.css","kind":"import-statement","external":true},{"path":"leaflet","kind":"import-statement","external":true},{"path":"leaflet","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-dom/client","kind":"import-statement","external":true},{"path":"react-leaflet","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/components/Toolbar/index.ts","kind":"import-statement","original":"../Toolbar"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Map/index.ts":{"bytes":498,"imports":[{"path":"packages/ui/react-ui-geo/src/components/Map/Map.tsx","kind":"import-statement","original":"./Map"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/index.ts":{"bytes":751,"imports":[{"path":"packages/ui/react-ui-geo/src/components/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/react-ui-geo/src/components/Globe/index.ts","kind":"import-statement","original":"./Globe"},{"path":"packages/ui/react-ui-geo/src/components/Map/index.ts","kind":"import-statement","original":"./Map"},{"path":"packages/ui/react-ui-geo/src/components/Toolbar/index.ts","kind":"import-statement","original":"./Toolbar"}],"format":"esm"},"packages/ui/react-ui-geo/src/types.ts":{"bytes":624,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/index.ts":{"bytes":824,"imports":[{"path":"packages/ui/react-ui-geo/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-geo/src/data.ts","kind":"import-statement","original":"./data"},{"path":"packages/ui/react-ui-geo/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/ui/react-ui-geo/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-geo/dist/lib/browser/data.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/ui/react-ui-geo/dist/lib/browser/data.mjs":{"imports":[{"path":"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs","kind":"import-statement"}],"exports":["loadTopology"],"entryPoint":"packages/ui/react-ui-geo/src/data.ts","inputs":{},"bytes":116},"packages/ui/react-ui-geo/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":64953},"packages/ui/react-ui-geo/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs","kind":"import-statement"},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"topojson-client","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"leaflet/dist/leaflet.css","kind":"import-statement","external":true},{"path":"leaflet","kind":"import-statement","external":true},{"path":"leaflet","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-dom/client","kind":"import-statement","external":true},{"path":"react-leaflet","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["ActionControls","Globe","GlobeContextProvider","Map","ZoomControls","closestPoint","controlPositions","createLayers","geoCircle","geoInertiaDrag","geoLine","geoPoint","geoToPosition","getDistance","loadTopology","positionToRotation","renderLayers","restrictAxis","timer","useDrag","useGlobeContext","useGlobeZoomHandler","useMapZoomHandler","useSpinner","useTour"],"entryPoint":"packages/ui/react-ui-geo/src/index.ts","inputs":{"packages/ui/react-ui-geo/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/components/Globe/Globe.tsx":{"bytesInOutput":5742},"packages/ui/react-ui-geo/src/hooks/context.tsx":{"bytesInOutput":960},"packages/ui/react-ui-geo/src/hooks/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/hooks/useDrag.ts":{"bytesInOutput":839},"packages/ui/react-ui-geo/src/util/debug.ts":{"bytesInOutput":211},"packages/ui/react-ui-geo/src/util/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/util/inertia.ts":{"bytesInOutput":4544},"packages/ui/react-ui-geo/src/util/path.ts":{"bytesInOutput":1051},"packages/ui/react-ui-geo/src/util/render.ts":{"bytesInOutput":2479},"packages/ui/react-ui-geo/src/hooks/useGlobeZoomHandler.ts":{"bytesInOutput":417},"packages/ui/react-ui-geo/src/hooks/useMapZoomHandler.ts":{"bytesInOutput":426},"packages/ui/react-ui-geo/src/hooks/useSpinner.ts":{"bytesInOutput":1141},"packages/ui/react-ui-geo/src/hooks/useTour.ts":{"bytesInOutput":3137},"packages/ui/react-ui-geo/src/components/Toolbar/Controls.tsx":{"bytesInOutput":1521},"packages/ui/react-ui-geo/src/components/Toolbar/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/components/Globe/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/components/Map/Map.tsx":{"bytesInOutput":4863},"packages/ui/react-ui-geo/src/components/Map/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/index.ts":{"bytesInOutput":0}},"bytes":28643},"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":430},"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs":{"imports":[{"path":"packages/ui/react-ui-geo/dist/lib/browser/countries-110m-WI4PCLDF.mjs","kind":"dynamic-import"}],"exports":["loadTopology"],"inputs":{"packages/ui/react-ui-geo/src/data.ts":{"bytesInOutput":102}},"bytes":214},"packages/ui/react-ui-geo/dist/lib/browser/countries-110m-WI4PCLDF.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":352619},"packages/ui/react-ui-geo/dist/lib/browser/countries-110m-WI4PCLDF.mjs":{"imports":[],"exports":["default"],"entryPoint":"packages/ui/react-ui-geo/data/countries-110m.ts","inputs":{"packages/ui/react-ui-geo/data/countries-110m.ts":{"bytesInOutput":420420}},"bytes":420572}}}
1
+ {"inputs":{"packages/ui/react-ui-geo/data/countries-110m.ts":{"bytes":1352295,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/data.ts":{"bytes":914,"imports":[{"path":"packages/ui/react-ui-geo/data/countries-110m.ts","kind":"dynamic-import","original":"../data/countries-110m.ts"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/types.ts":{"bytes":983,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/context.tsx":{"bytes":5204,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/util/debug.ts":{"bytes":1506,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/util/inertia.ts":{"bytes":21992,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/util/path.ts":{"bytes":5846,"imports":[{"path":"d3","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/util/render.ts":{"bytes":12455,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"topojson-client","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/util/path.ts","kind":"import-statement","original":"./path"}],"format":"esm"},"packages/ui/react-ui-geo/src/util/index.ts":{"bytes":747,"imports":[{"path":"packages/ui/react-ui-geo/src/util/debug.ts","kind":"import-statement","original":"./debug"},{"path":"packages/ui/react-ui-geo/src/util/inertia.ts","kind":"import-statement","original":"./inertia"},{"path":"packages/ui/react-ui-geo/src/util/path.ts","kind":"import-statement","original":"./path"},{"path":"packages/ui/react-ui-geo/src/util/render.ts","kind":"import-statement","original":"./render"}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useDrag.ts":{"bytes":4691,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useGlobeZoomHandler.ts":{"bytes":2396,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useMapZoomHandler.ts":{"bytes":2362,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useSpinner.ts":{"bytes":5331,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/useTour.ts":{"bytes":15403,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/ui/react-ui-geo/src/hooks/index.ts":{"bytes":997,"imports":[{"path":"packages/ui/react-ui-geo/src/hooks/context.tsx","kind":"import-statement","original":"./context"},{"path":"packages/ui/react-ui-geo/src/hooks/useDrag.ts","kind":"import-statement","original":"./useDrag"},{"path":"packages/ui/react-ui-geo/src/hooks/useGlobeZoomHandler.ts","kind":"import-statement","original":"./useGlobeZoomHandler"},{"path":"packages/ui/react-ui-geo/src/hooks/useMapZoomHandler.ts","kind":"import-statement","original":"./useMapZoomHandler"},{"path":"packages/ui/react-ui-geo/src/hooks/useSpinner.ts","kind":"import-statement","original":"./useSpinner"},{"path":"packages/ui/react-ui-geo/src/hooks/useTour.ts","kind":"import-statement","original":"./useTour"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Toolbar/Controls.tsx":{"bytes":5932,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Toolbar/index.ts":{"bytes":515,"imports":[{"path":"packages/ui/react-ui-geo/src/components/Toolbar/Controls.tsx","kind":"import-statement","original":"./Controls"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Globe/Globe.tsx":{"bytes":26472,"imports":[{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/hooks/index.ts","kind":"import-statement","original":"../../hooks"},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"../../util"},{"path":"packages/ui/react-ui-geo/src/components/Toolbar/index.ts","kind":"import-statement","original":"../Toolbar"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Globe/index.ts":{"bytes":506,"imports":[{"path":"packages/ui/react-ui-geo/src/components/Globe/Globe.tsx","kind":"import-statement","original":"./Globe"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Map/Map.tsx":{"bytes":20610,"imports":[{"path":"leaflet/dist/leaflet.css","kind":"import-statement","external":true},{"path":"leaflet","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-dom/client","kind":"import-statement","external":true},{"path":"react-leaflet","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-geo/src/components/Toolbar/index.ts","kind":"import-statement","original":"../Toolbar"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/Map/index.ts":{"bytes":498,"imports":[{"path":"packages/ui/react-ui-geo/src/components/Map/Map.tsx","kind":"import-statement","original":"./Map"}],"format":"esm"},"packages/ui/react-ui-geo/src/components/index.ts":{"bytes":751,"imports":[{"path":"packages/ui/react-ui-geo/src/components/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/react-ui-geo/src/components/Globe/index.ts","kind":"import-statement","original":"./Globe"},{"path":"packages/ui/react-ui-geo/src/components/Map/index.ts","kind":"import-statement","original":"./Map"},{"path":"packages/ui/react-ui-geo/src/components/Toolbar/index.ts","kind":"import-statement","original":"./Toolbar"}],"format":"esm"},"packages/ui/react-ui-geo/src/types.ts":{"bytes":624,"imports":[],"format":"esm"},"packages/ui/react-ui-geo/src/index.ts":{"bytes":824,"imports":[{"path":"packages/ui/react-ui-geo/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-geo/src/data.ts","kind":"import-statement","original":"./data"},{"path":"packages/ui/react-ui-geo/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/ui/react-ui-geo/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/react-ui-geo/src/util/index.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-geo/dist/lib/browser/data.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/ui/react-ui-geo/dist/lib/browser/data.mjs":{"imports":[{"path":"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs","kind":"import-statement"}],"exports":["loadTopology"],"entryPoint":"packages/ui/react-ui-geo/src/data.ts","inputs":{},"bytes":116},"packages/ui/react-ui-geo/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":65338},"packages/ui/react-ui-geo/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs","kind":"import-statement"},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"topojson-client","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"d3","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"versor","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"leaflet/dist/leaflet.css","kind":"import-statement","external":true},{"path":"leaflet","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-dom/client","kind":"import-statement","external":true},{"path":"react-leaflet","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["ActionControls","Globe","GlobeContextProvider","Map","ZoomControls","closestPoint","controlPositions","createLayers","geoCircle","geoInertiaDrag","geoLine","geoPoint","geoToPosition","getDistance","loadTopology","positionToRotation","renderLayers","restrictAxis","timer","useDrag","useGlobeContext","useGlobeZoomHandler","useMapZoomHandler","useSpinner","useTour"],"entryPoint":"packages/ui/react-ui-geo/src/index.ts","inputs":{"packages/ui/react-ui-geo/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/components/Globe/Globe.tsx":{"bytesInOutput":5742},"packages/ui/react-ui-geo/src/hooks/context.tsx":{"bytesInOutput":960},"packages/ui/react-ui-geo/src/hooks/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/hooks/useDrag.ts":{"bytesInOutput":855},"packages/ui/react-ui-geo/src/util/debug.ts":{"bytesInOutput":211},"packages/ui/react-ui-geo/src/util/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/util/inertia.ts":{"bytesInOutput":4544},"packages/ui/react-ui-geo/src/util/path.ts":{"bytesInOutput":1051},"packages/ui/react-ui-geo/src/util/render.ts":{"bytesInOutput":2479},"packages/ui/react-ui-geo/src/hooks/useGlobeZoomHandler.ts":{"bytesInOutput":417},"packages/ui/react-ui-geo/src/hooks/useMapZoomHandler.ts":{"bytesInOutput":426},"packages/ui/react-ui-geo/src/hooks/useSpinner.ts":{"bytesInOutput":1141},"packages/ui/react-ui-geo/src/hooks/useTour.ts":{"bytesInOutput":3589},"packages/ui/react-ui-geo/src/components/Toolbar/Controls.tsx":{"bytesInOutput":1521},"packages/ui/react-ui-geo/src/components/Toolbar/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/components/Globe/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/components/Map/Map.tsx":{"bytesInOutput":4837},"packages/ui/react-ui-geo/src/components/Map/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-geo/src/index.ts":{"bytesInOutput":0}},"bytes":29085},"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":430},"packages/ui/react-ui-geo/dist/lib/browser/chunk-ENCWOTYX.mjs":{"imports":[{"path":"packages/ui/react-ui-geo/dist/lib/browser/countries-110m-WI4PCLDF.mjs","kind":"dynamic-import"}],"exports":["loadTopology"],"inputs":{"packages/ui/react-ui-geo/src/data.ts":{"bytesInOutput":102}},"bytes":214},"packages/ui/react-ui-geo/dist/lib/browser/countries-110m-WI4PCLDF.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":352619},"packages/ui/react-ui-geo/dist/lib/browser/countries-110m-WI4PCLDF.mjs":{"imports":[],"exports":["default"],"entryPoint":"packages/ui/react-ui-geo/data/countries-110m.ts","inputs":{"packages/ui/react-ui-geo/data/countries-110m.ts":{"bytesInOutput":420420}},"bytes":420572}}}